From 911cb1fa768614732d08ece70cbeab5158ecec15 Mon Sep 17 00:00:00 2001 From: Felipe Leme Date: Thu, 16 May 2019 14:18:42 -0700 Subject: [PATCH 001/620] DO NOT MERGE - Re-add ContentCapture support from standard SDK toolkit. This reverts commit ef1c0b36ab402c9f936220dd4f64f4ac96f52e37. Test: atest CtsContentCaptureServiceTestCases Test: m update-api Bug: 130726495 Change-Id: Iecda9df96722ac8a3184710796032b6c01bd8ea3 --- api/test-current.txt | 9 + .../contentcapture/ContentCaptureService.java | 4 +- core/java/android/view/View.java | 559 ++++++++++++++++++ core/java/android/view/ViewGroup.java | 60 +- core/java/android/view/ViewRootImpl.java | 157 +++++ core/java/android/webkit/WebView.java | 9 + core/java/android/widget/AdapterView.java | 3 +- core/java/android/widget/TextView.java | 39 +- 8 files changed, 824 insertions(+), 16 deletions(-) diff --git a/api/test-current.txt b/api/test-current.txt index 0de0d7503391..78bfa90a7b26 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -3170,9 +3170,12 @@ package android.view { } @UiThread public class View implements android.view.accessibility.AccessibilityEventSource android.graphics.drawable.Drawable.Callback android.view.KeyEvent.Callback { + method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, to="auto"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_YES, to="yes"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_NO, to="no"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS, to="yesExcludeDescendants"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS, to="noExcludeDescendants")}) public int getImportantForContentCapture(); method public android.view.View getTooltipView(); method public static boolean isDefaultFocusHighlightEnabled(); method public boolean isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable); + method public final boolean isImportantForContentCapture(); + method public void onProvideContentCaptureStructure(@NonNull android.view.ViewStructure, int); method protected void resetResolvedDrawables(); method public void resetResolvedLayoutDirection(); method public void resetResolvedPadding(); @@ -3183,7 +3186,13 @@ package android.view { method public boolean restoreFocusNotInCluster(); method public void setAutofilled(boolean); method public final void setFocusedInCluster(); + method public void setImportantForContentCapture(int); method public void setIsRootNamespace(boolean); + field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_AUTO = 0; // 0x0 + field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_NO = 2; // 0x2 + field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS = 8; // 0x8 + field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_YES = 1; // 0x1 + field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS = 4; // 0x4 } public class ViewConfiguration { diff --git a/core/java/android/service/contentcapture/ContentCaptureService.java b/core/java/android/service/contentcapture/ContentCaptureService.java index 02ce87324a4f..4fe6c2c945e2 100644 --- a/core/java/android/service/contentcapture/ContentCaptureService.java +++ b/core/java/android/service/contentcapture/ContentCaptureService.java @@ -157,7 +157,7 @@ public abstract class ContentCaptureService extends Service { @Override public void onDataRemovalRequest(DataRemovalRequest request) { mHandler.sendMessage( - obtainMessage(ContentCaptureService::handleOnUserDataRemovalRequest, + obtainMessage(ContentCaptureService::handleOnDataRemovalRequest, ContentCaptureService.this, request)); } @@ -466,7 +466,7 @@ public abstract class ContentCaptureService extends Service { onDestroyContentCaptureSession(new ContentCaptureSessionId(sessionId)); } - private void handleOnUserDataRemovalRequest(@NonNull DataRemovalRequest request) { + private void handleOnDataRemovalRequest(@NonNull DataRemovalRequest request) { onDataRemovalRequest(request); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 921294a78e5e..628451d7ac28 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -1377,6 +1377,74 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ public static final int AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x1; + /** @hide */ + @IntDef(prefix = { "IMPORTANT_FOR_CONTENT_CAPTURE_" }, value = { + IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, + IMPORTANT_FOR_CONTENT_CAPTURE_YES, + IMPORTANT_FOR_CONTENT_CAPTURE_NO, + IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS, + IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS + }) + @Retention(RetentionPolicy.SOURCE) + public @interface ContentCaptureImportance {} + + /** + * Automatically determine whether a view is important for content capture. + * + * @see #isImportantForContentCapture() + * @see #setImportantForContentCapture(int) + * + * @hide + */ + @TestApi + public static final int IMPORTANT_FOR_CONTENT_CAPTURE_AUTO = 0x0; + + /** + * The view is important for content capture, and its children (if any) will be traversed. + * + * @see #isImportantForContentCapture() + * @see #setImportantForContentCapture(int) + * + * @hide + */ + @TestApi + public static final int IMPORTANT_FOR_CONTENT_CAPTURE_YES = 0x1; + + /** + * The view is not important for content capture, but its children (if any) will be traversed. + * + * @see #isImportantForContentCapture() + * @see #setImportantForContentCapture(int) + * + * @hide + */ + @TestApi + public static final int IMPORTANT_FOR_CONTENT_CAPTURE_NO = 0x2; + + /** + * The view is important for content capture, but its children (if any) will not be traversed. + * + * @see #isImportantForContentCapture() + * @see #setImportantForContentCapture(int) + * + * @hide + */ + @TestApi + public static final int IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS = 0x4; + + /** + * The view is not important for content capture, and its children (if any) will not be + * traversed. + * + * @see #isImportantForContentCapture() + * @see #setImportantForContentCapture(int) + * + * @hide + */ + @TestApi + public static final int IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS = 0x8; + + /** * This view is enabled. Interpretation varies by subclass. * Use with ENABLED_MASK when calling setFlags. @@ -3349,6 +3417,55 @@ public class View implements Drawable.Callback, KeyEvent.Callback, /* End of masks for mPrivateFlags3 */ + /* + * Masks for mPrivateFlags4, as generated by dumpFlags(): + * + * |-------|-------|-------|-------| + * 1111 PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK + * 1 PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED + * 1 PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED + * 1 PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED + * 1 PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE + * 11 PFLAG4_CONTENT_CAPTURE_IMPORTANCE_MASK + * |-------|-------|-------|-------| + */ + + /** + * Mask for obtaining the bits which specify how to determine + * whether a view is important for autofill. + * + *

NOTE: the important for content capture values were the first flags added and are set in + * the rightmost position, so we don't need to shift them + */ + private static final int PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK = + IMPORTANT_FOR_CONTENT_CAPTURE_AUTO | IMPORTANT_FOR_CONTENT_CAPTURE_YES + | IMPORTANT_FOR_CONTENT_CAPTURE_NO + | IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS + | IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS; + + /* + * Variables used to control when the IntelligenceManager.notifyNodeAdded()/removed() methods + * should be called. + * + * The idea is to call notifyAppeared() after the view is layout and visible, then call + * notifyDisappeared() when it's gone (without known when it was removed from the parent). + */ + private static final int PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED = 0x10; + private static final int PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED = 0x20; + + /* + * Flags used to cache the value returned by isImportantForContentCapture while the view + * hierarchy is being traversed. + */ + private static final int PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED = 0x40; + private static final int PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE = 0x80; + + private static final int PFLAG4_CONTENT_CAPTURE_IMPORTANCE_MASK = + PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED + | PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE; + + /* End of masks for mPrivateFlags4 */ + /** @hide */ protected static final int VIEW_STRUCTURE_FOR_ASSIST = 0; /** @hide */ @@ -3972,6 +4089,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 129147060) int mPrivateFlags3; + private int mPrivateFlags4; + /** * This view's request for the visibility of the status bar. * @hide @@ -8427,6 +8546,65 @@ public class View implements Drawable.Callback, KeyEvent.Callback, onProvideStructure(structure, VIEW_STRUCTURE_FOR_AUTOFILL, flags); } + /** + * Populates a {@link ViewStructure} for content capture. + * + *

This method is called after a view is that is eligible for content capture + * (for example, if it {@link #isImportantForAutofill()}, an intelligence service is enabled for + * the user, and the activity rendering the view is enabled for content capture) is laid out and + * is visible. + * + *

The populated structure is then passed to the service through + * {@link ContentCaptureSession#notifyViewAppeared(ViewStructure)}. + * + *

Note: views that manage a virtual structure under this view must populate just + * the node representing this view and return right away, then asynchronously report (not + * necessarily in the UI thread) when the children nodes appear, disappear or have their text + * changed by calling + * {@link ContentCaptureSession#notifyViewAppeared(ViewStructure)}, + * {@link ContentCaptureSession#notifyViewDisappeared(AutofillId)}, and + * {@link ContentCaptureSession#notifyViewTextChanged(AutofillId, CharSequence)} + * respectively. The structure for the a child must be created using + * {@link ContentCaptureSession#newVirtualViewStructure(AutofillId, long)}, and the + * {@code autofillId} for a child can be obtained either through + * {@code childStructure.getAutofillId()} or + * {@link ContentCaptureSession#newAutofillId(AutofillId, long)}. + * + *

When the virtual view hierarchy represents a web page, you should also: + * + *

+ * + *

Note: the following methods of the {@code structure} will be ignored: + *

+ * + * @hide + */ + @TestApi + public void onProvideContentCaptureStructure(@NonNull ViewStructure structure, int flags) { + onProvideStructure(structure, VIEW_STRUCTURE_FOR_CONTENT_CAPTURE, flags); + } + /** @hide */ protected void onProvideStructure(@NonNull ViewStructure structure, @ViewStructureType int viewFor, int flags) { @@ -9063,6 +9241,274 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return false; } + /** + * Gets the mode for determining whether this view is important for content capture. + * + *

See {@link #setImportantForContentCapture(int)} and + * {@link #isImportantForContentCapture()} for more info about this mode. + * + * @return {@link #IMPORTANT_FOR_CONTENT_CAPTURE_AUTO} by default, or value passed to + * {@link #setImportantForContentCapture(int)}. + * + * @attr ref android.R.styleable#View_importantForContentCapture + * + * @hide + */ + @ViewDebug.ExportedProperty(mapping = { + @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, to = "auto"), + @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_YES, to = "yes"), + @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_NO, to = "no"), + @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS, + to = "yesExcludeDescendants"), + @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS, + to = "noExcludeDescendants")}) +// @InspectableProperty(enumMapping = { +// @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, name = "auto"), +// @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_YES, name = "yes"), +// @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_NO, name = "no"), +// @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS, +// name = "yesExcludeDescendants"), +// @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS, +// name = "noExcludeDescendants"), +// }) + @TestApi + public @ContentCaptureImportance int getImportantForContentCapture() { + // NOTE: the important for content capture values were the first flags added and are set in + // the rightmost position, so we don't need to shift them + return mPrivateFlags4 & PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK; + } + + /** + * Sets the mode for determining whether this view is considered important for content capture. + * + *

The platform determines the importance for autofill automatically but you + * can use this method to customize the behavior. Typically, a view that provides text should + * be marked as {@link #IMPORTANT_FOR_CONTENT_CAPTURE_YES}. + * + * @param mode {@link #IMPORTANT_FOR_CONTENT_CAPTURE_AUTO}, + * {@link #IMPORTANT_FOR_CONTENT_CAPTURE_YES}, {@link #IMPORTANT_FOR_CONTENT_CAPTURE_NO}, + * {@link #IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS}, + * or {@link #IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS}. + * + * @attr ref android.R.styleable#View_importantForContentCapture + * + * @hide + */ + @TestApi + public void setImportantForContentCapture(@ContentCaptureImportance int mode) { + // Reset first + mPrivateFlags4 &= ~PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK; + // Then set again + // NOTE: the important for content capture values were the first flags added and are set in + // the rightmost position, so we don't need to shift them + mPrivateFlags4 |= (mode & PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK); + } + + /** + * Hints the Android System whether this view is considered important for content capture, based + * on the value explicitly set by {@link #setImportantForContentCapture(int)} and heuristics + * when it's {@link #IMPORTANT_FOR_CONTENT_CAPTURE_AUTO}. + * + *

See {@link ContentCaptureManager} for more info about content capture. + * + * @return whether the view is considered important for content capture. + * + * @see #setImportantForContentCapture(int) + * @see #IMPORTANT_FOR_CONTENT_CAPTURE_AUTO + * @see #IMPORTANT_FOR_CONTENT_CAPTURE_YES + * @see #IMPORTANT_FOR_CONTENT_CAPTURE_NO + * @see #IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS + * @see #IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS + * + * @hide + */ + @TestApi + public final boolean isImportantForContentCapture() { + boolean isImportant; + if ((mPrivateFlags4 & PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED) != 0) { + isImportant = (mPrivateFlags4 & PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE) != 0; + return isImportant; + } + + isImportant = calculateIsImportantForContentCapture(); + + mPrivateFlags4 &= ~PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE; + if (isImportant) { + mPrivateFlags4 |= PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE; + } + mPrivateFlags4 |= PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED; + return isImportant; + } + + /** + * Calculates whether the flag is important for content capture so it can be used by + * {@link #isImportantForContentCapture()} while the tree is traversed. + */ + private boolean calculateIsImportantForContentCapture() { + // Check parent mode to ensure we're important + ViewParent parent = mParent; + while (parent instanceof View) { + final int parentImportance = ((View) parent).getImportantForContentCapture(); + if (parentImportance == IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS + || parentImportance == IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS) { + if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.VERBOSE)) { + Log.v(CONTENT_CAPTURE_LOG_TAG, "View (" + this + ") is not important for " + + "content capture because parent " + parent + "'s importance is " + + parentImportance); + } + return false; + } + parent = parent.getParent(); + } + + final int importance = getImportantForContentCapture(); + + // First, check the explicit states. + if (importance == IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS + || importance == IMPORTANT_FOR_CONTENT_CAPTURE_YES) { + return true; + } + if (importance == IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS + || importance == IMPORTANT_FOR_CONTENT_CAPTURE_NO) { + if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.VERBOSE)) { + Log.v(CONTENT_CAPTURE_LOG_TAG, "View (" + this + ") is not important for content " + + "capture because its importance is " + importance); + } + return false; + } + + // Then use some heuristics to handle AUTO. + if (importance != IMPORTANT_FOR_CONTENT_CAPTURE_AUTO) { + Log.w(CONTENT_CAPTURE_LOG_TAG, "invalid content capture importance (" + importance + + " on view " + this); + return false; + } + + // View group is important if at least one children also is + if (this instanceof ViewGroup) { + final ViewGroup group = (ViewGroup) this; + for (int i = 0; i < group.getChildCount(); i++) { + final View child = group.getChildAt(i); + if (child.isImportantForContentCapture()) { + return true; + } + } + } + + // If the app developer explicitly set hints or autofill hintsfor it, it's important. + if (getAutofillHints() != null) { + return true; + } + + // Otherwise, assume it's not important... + return false; + } + + /** + * Helper used to notify the {@link ContentCaptureManager} when the view is removed or + * added, based on whether it's laid out and visible, and without knowing if the parent removed + * it from the view hierarchy. + * + *

This method is called from many places (visibility changed, view laid out, view attached + * or detached to/from window, etc...) and hence must contain the logic to call the manager, as + * described below: + * + *

    + *
  1. It should only be called when content capture is enabled for the view. + *
  2. It must call viewAppeared() before viewDisappeared() + *
  3. viewAppearead() can only be called when the view is visible and laidout + *
  4. It should not call the same event twice. + *
+ */ + private void notifyAppearedOrDisappearedForContentCaptureIfNeeded(boolean appeared) { + AttachInfo ai = mAttachInfo; + // Skip it while the view is being laided out for the first time + if (ai != null && !ai.mReadyForContentCaptureUpdates) return; + + if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { + Trace.traceBegin(Trace.TRACE_TAG_VIEW, + "notifyContentCapture(" + appeared + ") for " + getClass().getSimpleName()); + } + try { + notifyAppearedOrDisappearedForContentCaptureIfNeededNoTrace(appeared); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } + } + + private void notifyAppearedOrDisappearedForContentCaptureIfNeededNoTrace(boolean appeared) { + AttachInfo ai = mAttachInfo; + + // First check if context has client, so it saves a service lookup when it doesn't + if (mContext.getContentCaptureOptions() == null) return; + + // Then check if it's enabled in the context... + final ContentCaptureManager ccm = ai != null ? ai.getContentCaptureManager(mContext) + : mContext.getSystemService(ContentCaptureManager.class); + if (ccm == null || !ccm.isContentCaptureEnabled()) return; + + // ... and finally at the view level + // NOTE: isImportantForContentCapture() is more expensive than cm.isContentCaptureEnabled() + if (!isImportantForContentCapture()) return; + + ContentCaptureSession session = getContentCaptureSession(); + if (session == null) return; + + if (appeared) { + if (!isLaidOut() || getVisibility() != VISIBLE + || (mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0) { + if (DEBUG_CONTENT_CAPTURE) { + Log.v(CONTENT_CAPTURE_LOG_TAG, "Ignoring 'appeared' on " + this + ": laid=" + + isLaidOut() + ", visibleToUser=" + isVisibleToUser() + + ", visible=" + (getVisibility() == VISIBLE) + + ": alreadyNotifiedAppeared=" + ((mPrivateFlags4 + & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0) + + ", alreadyNotifiedDisappeared=" + ((mPrivateFlags4 + & PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED) != 0)); + } + return; + } + setNotifiedContentCaptureAppeared(); + + if (ai != null) { + ai.delayNotifyContentCaptureEvent(session, this, appeared); + } else { + if (DEBUG_CONTENT_CAPTURE) { + Log.w(CONTENT_CAPTURE_LOG_TAG, "no AttachInfo on appeared for " + this); + } + } + } else { + if ((mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) == 0 + || (mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED) != 0) { + if (DEBUG_CONTENT_CAPTURE) { + Log.v(CONTENT_CAPTURE_LOG_TAG, "Ignoring 'disappeared' on " + this + ": laid=" + + isLaidOut() + ", visibleToUser=" + isVisibleToUser() + + ", visible=" + (getVisibility() == VISIBLE) + + ": alreadyNotifiedAppeared=" + ((mPrivateFlags4 + & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0) + + ", alreadyNotifiedDisappeared=" + ((mPrivateFlags4 + & PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED) != 0)); + } + return; + } + mPrivateFlags4 |= PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED; + mPrivateFlags4 &= ~PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED; + + if (ai != null) { + ai.delayNotifyContentCaptureEvent(session, this, appeared); + } else { + if (DEBUG_CONTENT_CAPTURE) { + Log.v(CONTENT_CAPTURE_LOG_TAG, "no AttachInfo on disappeared for " + this); + } + } + } + } + + private void setNotifiedContentCaptureAppeared() { + mPrivateFlags4 |= PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED; + mPrivateFlags4 &= ~PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED; + } + /** * Sets the (optional) {@link ContentCaptureSession} associated with this view. * @@ -9318,6 +9764,68 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } } + /** + * Dispatches the initial content capture events for a view structure. + * + * @hide + */ + public void dispatchInitialProvideContentCaptureStructure() { + AttachInfo ai = mAttachInfo; + if (ai == null) { + Log.w(CONTENT_CAPTURE_LOG_TAG, + "dispatchProvideContentCaptureStructure(): no AttachInfo for " + this); + return; + } + ContentCaptureManager ccm = ai.mContentCaptureManager; + if (ccm == null) { + Log.w(CONTENT_CAPTURE_LOG_TAG, "dispatchProvideContentCaptureStructure(): " + + "no ContentCaptureManager for " + this); + return; + } + + // We must set it before checkign if the view itself is important, because it might + // initially not be (for example, if it's empty), although that might change later (for + // example, if important views are added) + ai.mReadyForContentCaptureUpdates = true; + + if (!isImportantForContentCapture()) { + if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.DEBUG)) { + Log.d(CONTENT_CAPTURE_LOG_TAG, + "dispatchProvideContentCaptureStructure(): decorView is not important"); + } + return; + } + + ai.mContentCaptureManager = ccm; + + ContentCaptureSession session = getContentCaptureSession(); + if (session == null) { + if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.DEBUG)) { + Log.d(CONTENT_CAPTURE_LOG_TAG, + "dispatchProvideContentCaptureStructure(): no session for " + this); + } + return; + } + + session.internalNotifyViewTreeEvent(/* started= */ true); + try { + dispatchProvideContentCaptureStructure(); + } finally { + session.internalNotifyViewTreeEvent(/* started= */ false); + } + } + + /** @hide */ + void dispatchProvideContentCaptureStructure() { + ContentCaptureSession session = getContentCaptureSession(); + if (session != null) { + ViewStructure structure = session.newViewStructure(this); + onProvideContentCaptureStructure(structure, /* flags= */ 0); + setNotifiedContentCaptureAppeared(); + session.notifyViewAppeared(structure); + } + } + /** * @see #onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo) * @@ -13268,6 +13776,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, public void dispatchStartTemporaryDetach() { mPrivateFlags3 |= PFLAG3_TEMPORARY_DETACH; notifyEnterOrExitForAutoFillIfNeeded(false); + notifyAppearedOrDisappearedForContentCaptureIfNeeded(false); onStartTemporaryDetach(); } @@ -13294,6 +13803,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, notifyFocusChangeToInputMethodManager(true /* hasFocus */); } notifyEnterOrExitForAutoFillIfNeeded(true); + notifyAppearedOrDisappearedForContentCaptureIfNeeded(true); } /** @@ -13885,6 +14395,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, : AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_DISAPPEARED); } } + + notifyAppearedOrDisappearedForContentCaptureIfNeeded(isVisible); } /** @@ -17580,6 +18092,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } // Reset content capture caches + mPrivateFlags4 &= ~PFLAG4_CONTENT_CAPTURE_IMPORTANCE_MASK; mCachedContentCaptureSession = null; if ((mPrivateFlags & (PFLAG_DRAWN | PFLAG_HAS_BOUNDS)) == (PFLAG_DRAWN | PFLAG_HAS_BOUNDS) @@ -19589,6 +20102,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, needGlobalAttributesUpdate(false); notifyEnterOrExitForAutoFillIfNeeded(true); + notifyAppearedOrDisappearedForContentCaptureIfNeeded(true); } @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) @@ -19638,6 +20152,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } notifyEnterOrExitForAutoFillIfNeeded(false); + notifyAppearedOrDisappearedForContentCaptureIfNeeded(false); } /** @@ -21950,6 +22465,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mPrivateFlags3 &= ~PFLAG3_NOTIFY_AUTOFILL_ENTER_ON_LAYOUT; notifyEnterOrExitForAutoFillIfNeeded(true); } + + notifyAppearedOrDisappearedForContentCaptureIfNeeded(true); } private boolean hasParentWantsFocus() { @@ -28145,6 +28662,23 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ View mTooltipHost; + /** + * The initial structure has been reported so the view is ready to report updates. + */ + boolean mReadyForContentCaptureUpdates; + + /** + * Map(keyed by session) of content capture events that need to be notified after the view + * hierarchy is traversed: value is either the view itself for appearead events, or its + * autofill id for disappeared. + */ + SparseArray> mContentCaptureEvents; + + /** + * Cached reference to the {@link ContentCaptureManager}. + */ + ContentCaptureManager mContentCaptureManager; + /** * Creates a new set of attachment information with the specified * events handler and thread. @@ -28163,6 +28697,31 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mRootCallbacks = effectPlayer; mTreeObserver = new ViewTreeObserver(context); } + + private void delayNotifyContentCaptureEvent(@NonNull ContentCaptureSession session, + @NonNull View view, boolean appeared) { + if (mContentCaptureEvents == null) { + // Most of the time there will be just one session, so intial capacity is 1 + mContentCaptureEvents = new SparseArray<>(1); + } + int sessionId = session.getId(); + // TODO: life would be much easier if we provided a MultiMap implementation somwhere... + ArrayList events = mContentCaptureEvents.get(sessionId); + if (events == null) { + events = new ArrayList<>(); + mContentCaptureEvents.put(sessionId, events); + } + events.add(appeared ? view : view.getAutofillId()); + } + + @Nullable + ContentCaptureManager getContentCaptureManager(@NonNull Context context) { + if (mContentCaptureManager != null) { + return mContentCaptureManager; + } + mContentCaptureManager = context.getSystemService(ContentCaptureManager.class); + return mContentCaptureManager; + } } /** diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index d362024ed525..937bd1b34e61 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -3606,7 +3606,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager return; } - final ChildListForAutofill children = getChildrenForAutofill(flags); + final ChildListForAutoFillOrContentCapture children = getChildrenForAutofill(flags); final int childrenCount = children.size(); structure.setChildCount(childrenCount); for (int i = 0; i < childrenCount; i++) { @@ -3617,14 +3617,30 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager children.recycle(); } + /** @hide */ + @Override + public void dispatchProvideContentCaptureStructure() { + super.dispatchProvideContentCaptureStructure(); + + if (!isLaidOut()) return; + + final ChildListForAutoFillOrContentCapture children = getChildrenForContentCapture(); + final int childrenCount = children.size(); + for (int i = 0; i < childrenCount; i++) { + final View child = children.get(i); + child.dispatchProvideContentCaptureStructure(); + } + children.recycle(); + } + /** * Gets the children for autofill. Children for autofill are the first * level descendants that are important for autofill. The returned * child list object is pooled and the caller must recycle it once done. * @hide */ - private @NonNull ChildListForAutofill getChildrenForAutofill( + private @NonNull ChildListForAutoFillOrContentCapture getChildrenForAutofill( @AutofillFlags int flags) { - final ChildListForAutofill children = ChildListForAutofill + final ChildListForAutoFillOrContentCapture children = ChildListForAutoFillOrContentCapture .obtain(); populateChildrenForAutofill(children, flags); return children; @@ -3652,6 +3668,34 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } } + private @NonNull ChildListForAutoFillOrContentCapture getChildrenForContentCapture() { + final ChildListForAutoFillOrContentCapture children = ChildListForAutoFillOrContentCapture + .obtain(); + populateChildrenForContentCapture(children); + return children; + } + + /** @hide */ + private void populateChildrenForContentCapture(ArrayList list) { + final int childrenCount = mChildrenCount; + if (childrenCount <= 0) { + return; + } + final ArrayList preorderedList = buildOrderedChildList(); + final boolean customOrder = preorderedList == null + && isChildrenDrawingOrderEnabled(); + for (int i = 0; i < childrenCount; i++) { + final int childIndex = getAndVerifyPreorderedIndex(childrenCount, i, customOrder); + final View child = (preorderedList == null) + ? mChildren[childIndex] : preorderedList.get(childIndex); + if (child.isImportantForContentCapture()) { + list.add(child); + } else if (child instanceof ViewGroup) { + ((ViewGroup) child).populateChildrenForContentCapture(list); + } + } + } + private static View getAndVerifyPreorderedView(ArrayList preorderedList, View[] children, int childIndex) { final View child; @@ -8634,16 +8678,16 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager /** * Pooled class that to hold the children for autifill. */ - private static class ChildListForAutofill extends ArrayList { + private static class ChildListForAutoFillOrContentCapture extends ArrayList { private static final int MAX_POOL_SIZE = 32; - private static final Pools.SimplePool sPool = + private static final Pools.SimplePool sPool = new Pools.SimplePool<>(MAX_POOL_SIZE); - public static ChildListForAutofill obtain() { - ChildListForAutofill list = sPool.acquire(); + public static ChildListForAutoFillOrContentCapture obtain() { + ChildListForAutoFillOrContentCapture list = sPool.acquire(); if (list == null) { - list = new ChildListForAutofill(); + list = new ChildListForAutoFillOrContentCapture(); } return list; } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index e8356752f807..b1c5b49f1207 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -105,7 +105,11 @@ import android.view.accessibility.IAccessibilityInteractionConnection; import android.view.accessibility.IAccessibilityInteractionConnectionCallback; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.Interpolator; +import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; +import android.view.contentcapture.ContentCaptureManager; +import android.view.contentcapture.ContentCaptureSession; +import android.view.contentcapture.MainContentCaptureSession; import android.view.inputmethod.InputMethodManager; import android.widget.Scroller; @@ -220,6 +224,21 @@ public final class ViewRootImpl implements ViewParent, */ static final int MAX_TRACKBALL_DELAY = 250; + /** + * Initial value for {@link #mContentCaptureEnabled}. + */ + private static final int CONTENT_CAPTURE_ENABLED_NOT_CHECKED = 0; + + /** + * Value for {@link #mContentCaptureEnabled} when it was checked and set to {@code true}. + */ + private static final int CONTENT_CAPTURE_ENABLED_TRUE = 1; + + /** + * Value for {@link #mContentCaptureEnabled} when it was checked and set to {@code false}. + */ + private static final int CONTENT_CAPTURE_ENABLED_FALSE = 2; + @UnsupportedAppUsage static final ThreadLocal sRunQueues = new ThreadLocal(); @@ -410,6 +429,10 @@ public final class ViewRootImpl implements ViewParent, boolean mLayoutRequested; boolean mFirst; + @Nullable + int mContentCaptureEnabled = CONTENT_CAPTURE_ENABLED_NOT_CHECKED; + boolean mPerformContentCapture; + boolean mReportNextDraw; boolean mFullRedrawNeeded; boolean mNewSurfaceNeeded; @@ -607,6 +630,7 @@ public final class ViewRootImpl implements ViewParent, mTransparentRegion = new Region(); mPreviousTransparentRegion = new Region(); mFirst = true; // true for the first time the view is added + mPerformContentCapture = true; // also true for the first time the view is added mAdded = false; mAttachInfo = new View.AttachInfo(mWindowSession, mWindow, display, this, mHandler, this, context); @@ -2756,9 +2780,55 @@ public final class ViewRootImpl implements ViewParent, } } + if (mAttachInfo.mContentCaptureEvents != null) { + notifyContentCatpureEvents(); + } + mIsInTraversal = false; } + private void notifyContentCatpureEvents() { + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "notifyContentCaptureEvents"); + try { + MainContentCaptureSession mainSession = mAttachInfo.mContentCaptureManager + .getMainContentCaptureSession(); + for (int i = 0; i < mAttachInfo.mContentCaptureEvents.size(); i++) { + int sessionId = mAttachInfo.mContentCaptureEvents.keyAt(i); + mainSession.notifyViewTreeEvent(sessionId, /* started= */ true); + ArrayList events = mAttachInfo.mContentCaptureEvents + .valueAt(i); + for_each_event: for (int j = 0; j < events.size(); j++) { + Object event = events.get(j); + if (event instanceof AutofillId) { + mainSession.notifyViewDisappeared(sessionId, (AutofillId) event); + } else if (event instanceof View) { + View view = (View) event; + ContentCaptureSession session = view.getContentCaptureSession(); + if (session == null) { + Log.w(mTag, "no content capture session on view: " + view); + continue for_each_event; + } + int actualId = session.getId(); + if (actualId != sessionId) { + Log.w(mTag, "content capture session mismatch for view (" + view + + "): was " + sessionId + " before, it's " + actualId + " now"); + continue for_each_event; + } + ViewStructure structure = session.newViewStructure(view); + view.onProvideContentCaptureStructure(structure, /* flags= */ 0); + session.notifyViewAppeared(structure); + } else { + Log.w(mTag, "invalid content capture event: " + event); + } + } + mainSession.notifyViewTreeEvent(sessionId, /* started= */ false); + } + mAttachInfo.mContentCaptureEvents = null; + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } + } + private void notifySurfaceDestroyed() { mSurfaceHolder.ungetCallbacks(); SurfaceHolder.Callback[] callbacks = mSurfaceHolder.getCallbacks(); @@ -2893,6 +2963,13 @@ public final class ViewRootImpl implements ViewParent, } } mFirstInputStage.onWindowFocusChanged(hasWindowFocus); + + // NOTE: there's no view visibility (appeared / disapparead) events when the windows focus + // is lost, so we don't need to to force a flush - there might be other events such as + // text changes, but these should be flushed independently. + if (hasWindowFocus) { + handleContentCaptureFlush(); + } } private void fireAccessibilityFocusEventIfHasFocusedNode() { @@ -3459,6 +3536,86 @@ public final class ViewRootImpl implements ViewParent, pendingDrawFinished(); } } + if (mPerformContentCapture) { + performContentCaptureInitialReport(); + } + } + + /** + * Checks (and caches) if content capture is enabled for this context. + */ + private boolean isContentCaptureEnabled() { + switch (mContentCaptureEnabled) { + case CONTENT_CAPTURE_ENABLED_TRUE: + return true; + case CONTENT_CAPTURE_ENABLED_FALSE: + return false; + case CONTENT_CAPTURE_ENABLED_NOT_CHECKED: + final boolean reallyEnabled = isContentCaptureReallyEnabled(); + mContentCaptureEnabled = reallyEnabled ? CONTENT_CAPTURE_ENABLED_TRUE + : CONTENT_CAPTURE_ENABLED_FALSE; + return reallyEnabled; + default: + Log.w(TAG, "isContentCaptureEnabled(): invalid state " + mContentCaptureEnabled); + return false; + } + + } + + /** + * Checks (without caching) if content capture is enabled for this context. + */ + private boolean isContentCaptureReallyEnabled() { + // First check if context supports it, so it saves a service lookup when it doesn't + if (mContext.getContentCaptureOptions() == null) return false; + + final ContentCaptureManager ccm = mAttachInfo.getContentCaptureManager(mContext); + // Then check if it's enabled in the contex itself. + if (ccm == null || !ccm.isContentCaptureEnabled()) return false; + + return true; + } + + private void performContentCaptureInitialReport() { + mPerformContentCapture = false; // One-time offer! + final View rootView = mView; + if (DEBUG_CONTENT_CAPTURE) { + Log.v(mTag, "performContentCaptureInitialReport() on " + rootView); + } + if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "dispatchContentCapture() for " + + getClass().getSimpleName()); + } + try { + if (!isContentCaptureEnabled()) return; + + // Content capture is a go! + rootView.dispatchInitialProvideContentCaptureStructure(); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } + } + + private void handleContentCaptureFlush() { + if (DEBUG_CONTENT_CAPTURE) { + Log.v(mTag, "handleContentCaptureFlush()"); + } + if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "flushContentCapture for " + + getClass().getSimpleName()); + } + try { + if (!isContentCaptureEnabled()) return; + + final ContentCaptureManager ccm = mAttachInfo.mContentCaptureManager; + if (ccm == null) { + Log.w(TAG, "No ContentCapture on AttachInfo"); + return; + } + ccm.flush(ContentCaptureSession.FLUSH_REASON_VIEW_ROOT_ENTERED); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } } private boolean draw(boolean fullRedrawNeeded) { diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 137b67c6e63e..9dc66d77ea44 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -413,6 +413,9 @@ public class WebView extends AbsoluteLayout if (getImportantForAutofill() == IMPORTANT_FOR_AUTOFILL_AUTO) { setImportantForAutofill(IMPORTANT_FOR_AUTOFILL_YES); } + if (getImportantForContentCapture() == IMPORTANT_FOR_CONTENT_CAPTURE_AUTO) { + setImportantForContentCapture(IMPORTANT_FOR_CONTENT_CAPTURE_YES); + } if (context == null) { throw new IllegalArgumentException("Invalid context argument"); @@ -2795,6 +2798,12 @@ public class WebView extends AbsoluteLayout mProvider.getViewDelegate().onProvideAutofillVirtualStructure(structure, flags); } + /** @hide */ + @Override + public void onProvideContentCaptureStructure(ViewStructure structure, int flags) { + mProvider.getViewDelegate().onProvideContentCaptureStructure(structure, flags); + } + @Override public void autofill(SparseArrayvalues) { mProvider.getViewDelegate().autofill(values); diff --git a/core/java/android/widget/AdapterView.java b/core/java/android/widget/AdapterView.java index c3bb9a0201d0..c55f7d654548 100644 --- a/core/java/android/widget/AdapterView.java +++ b/core/java/android/widget/AdapterView.java @@ -1318,7 +1318,8 @@ public abstract class AdapterView extends ViewGroup { @ViewStructureType int viewFor, int flags) { super.onProvideStructure(structure, viewFor, flags); - if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) { + if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL + || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { final Adapter adapter = getAdapter(); if (adapter == null) return; diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 17c56c3f216a..cf7d09de8b3c 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -162,6 +162,8 @@ import android.view.accessibility.AccessibilityNodeInfo; import android.view.animation.AnimationUtils; import android.view.autofill.AutofillManager; import android.view.autofill.AutofillValue; +import android.view.contentcapture.ContentCaptureManager; +import android.view.contentcapture.ContentCaptureSession; import android.view.inputmethod.BaseInputConnection; import android.view.inputmethod.CompletionInfo; import android.view.inputmethod.CorrectionInfo; @@ -977,6 +979,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (getImportantForAutofill() == IMPORTANT_FOR_AUTOFILL_AUTO) { setImportantForAutofill(IMPORTANT_FOR_AUTOFILL_YES); } + if (getImportantForContentCapture() == IMPORTANT_FOR_CONTENT_CAPTURE_AUTO) { + setImportantForContentCapture(IMPORTANT_FOR_CONTENT_CAPTURE_YES); + } setTextInternal(""); @@ -10550,7 +10555,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } /** - * Notify managers (such as {@link AutofillManager}) that are interested in text changes. + * Notify managers (such as {@link AutofillManager} and {@link ContentCaptureManager}) that are + * interested on text changes. */ private void notifyListeningManagersAfterTextChanged() { @@ -10566,6 +10572,22 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener afm.notifyValueChanged(TextView.this); } } + + // TODO(b/121045053): should use a flag / boolean to keep status of SHOWN / HIDDEN instead + // of using isLaidout(), so it's not called in cases where it's laid out but a + // notifyAppeared was not sent. + + // ContentCapture + if (isLaidOut() && isImportantForContentCapture() && isTextEditable()) { + final ContentCaptureManager cm = mContext.getSystemService(ContentCaptureManager.class); + if (cm != null && cm.isContentCaptureEnabled()) { + final ContentCaptureSession session = getContentCaptureSession(); + if (session != null) { + // TODO(b/111276913): pass flags when edited by user / add CTS test + session.notifyViewTextChanged(getAutofillId(), getText()); + } + } + } } private boolean isAutofillable() { @@ -11399,7 +11421,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final boolean isPassword = hasPasswordTransformationMethod() || isPasswordInputType(getInputType()); - if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) { + if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL + || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) { structure.setDataIsSensitive(!mTextSetFromXmlOrResourceId); } @@ -11415,8 +11438,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } - if (!isPassword || viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) { + if (!isPassword || viewFor == VIEW_STRUCTURE_FOR_AUTOFILL + || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { if (mLayout == null) { + if (viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { + Log.w(LOG_TAG, "onProvideContentCaptureStructure(): calling assumeLayout()"); + } assumeLayout(); } Layout layout = mLayout; @@ -11504,7 +11531,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } - if (viewFor == VIEW_STRUCTURE_FOR_ASSIST) { + if (viewFor == VIEW_STRUCTURE_FOR_ASSIST + || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { // Extract style information that applies to the TextView as a whole. int style = 0; int typefaceStyle = getTypefaceStyle(); @@ -11532,7 +11560,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener structure.setTextStyle(getTextSize(), getCurrentTextColor(), AssistStructure.ViewNode.TEXT_COLOR_UNDEFINED /* bgColor */, style); } - if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) { + if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL + || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { structure.setMinTextEms(getMinEms()); structure.setMaxTextEms(getMaxEms()); int maxLength = -1; -- GitLab From 51996bbc0384a7f4d70e96255cf33e42136be87a Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Thu, 16 May 2019 17:56:43 -0700 Subject: [PATCH 002/620] Face auth messaging cleanup Do not show timeout message, and ask user to swipe up to retry when auth fails. Fixes: 132465944 Test: biometric error on bouncer and LS Test: wait for face timeout Change-Id: Iec757f25d5f09b05ac02811e2eeef6ac98f63f16 --- .../keyguard/KeyguardAbsKeyInputView.java | 4 ++- .../android/keyguard/KeyguardPatternView.java | 4 ++- .../keyguard/KeyguardSecurityContainer.java | 4 ++- .../keyguard/KeyguardUpdateMonitor.java | 14 ++++++++-- .../KeyguardIndicationController.java | 28 ++++++++++++++++++- 5 files changed, 48 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java index 2ff7266baecf..a4b6958498c8 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java @@ -310,7 +310,9 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout @Override public void showMessage(CharSequence message, ColorStateList colorState) { - mSecurityMessageDisplay.setNextMessageColor(colorState); + if (colorState != null) { + mSecurityMessageDisplay.setNextMessageColor(colorState); + } mSecurityMessageDisplay.setMessage(message); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java index 0e91e4109ec0..f3baf8d3fd99 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java @@ -438,7 +438,9 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit @Override public void showMessage(CharSequence message, ColorStateList colorState) { - mSecurityMessageDisplay.setNextMessageColor(colorState); + if (colorState != null) { + mSecurityMessageDisplay.setNextMessageColor(colorState); + } mSecurityMessageDisplay.setMessage(message); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 0914fb8330be..72592325c511 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -229,8 +229,10 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe } if (action == MotionEvent.ACTION_UP) { if (-getTranslationY() > TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, - MIN_DRAG_SIZE, getResources().getDisplayMetrics())) { + MIN_DRAG_SIZE, getResources().getDisplayMetrics()) + && !mUpdateMonitor.isFaceDetectionRunning()) { mUpdateMonitor.requestFaceAuth(); + showMessage(null, null); } } return true; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index ea8565e8d301..21b9ad9485d7 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -168,6 +168,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { */ private static final int BIOMETRIC_STATE_CANCELLING_RESTARTING = 3; + private static final int BIOMETRIC_HELP_FINGERPRINT_NOT_RECOGNIZED = -1; + public static final int BIOMETRIC_HELP_FACE_NOT_RECOGNIZED = -2; + private static final int DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT = 5000000; private static final ComponentName FALLBACK_HOME_COMPONENT = new ComponentName( @@ -570,7 +573,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { cb.onBiometricAuthFailed(BiometricSourceType.FINGERPRINT); } } - handleFingerprintHelp(-1, mContext.getString(R.string.kg_fingerprint_not_recognized)); + handleFingerprintHelp(BIOMETRIC_HELP_FINGERPRINT_NOT_RECOGNIZED, + mContext.getString(R.string.kg_fingerprint_not_recognized)); } private void handleFingerprintAcquired(int acquireInfo) { @@ -722,7 +726,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { cb.onBiometricAuthFailed(BiometricSourceType.FACE); } } - handleFaceHelp(-1, mContext.getString(R.string.kg_face_not_recognized)); + handleFaceHelp(BIOMETRIC_HELP_FACE_NOT_RECOGNIZED, + mContext.getString(R.string.kg_face_not_recognized)); } private void handleFaceAcquired(int acquireInfo) { @@ -803,6 +808,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { getCurrentUser()); } + // The face timeout message is not very actionable, let's ask the user to + // manually retry. + if (msgId == FaceManager.FACE_ERROR_TIMEOUT) { + errString = mContext.getString(R.string.keyguard_unlock); + } for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index fd76a79eab2e..25bde3bbe2fa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -78,6 +78,7 @@ public class KeyguardIndicationController implements StateListener, private static final int MSG_HIDE_TRANSIENT = 1; private static final int MSG_CLEAR_BIOMETRIC_MSG = 2; + private static final int MSG_SWIPE_UP_TO_UNLOCK = 3; private static final long TRANSIENT_BIOMETRIC_ERROR_TIMEOUT = 1300; private final Context mContext; @@ -318,6 +319,7 @@ public class KeyguardIndicationController implements StateListener, mTransientIndication = transientIndication; mTransientTextColorState = textColorState; mHandler.removeMessages(MSG_HIDE_TRANSIENT); + mHandler.removeMessages(MSG_SWIPE_UP_TO_UNLOCK); if (mDozing && !TextUtils.isEmpty(mTransientIndication)) { // Make sure this doesn't get stuck and burns in. Acquire wakelock until its cleared. mWakeLock.setAcquired(true); @@ -536,10 +538,26 @@ public class KeyguardIndicationController implements StateListener, hideTransientIndication(); } else if (msg.what == MSG_CLEAR_BIOMETRIC_MSG) { mLockIcon.setTransientBiometricsError(false); + } else if (msg.what == MSG_SWIPE_UP_TO_UNLOCK) { + showSwipeUpToUnlock(); } } }; + private void showSwipeUpToUnlock() { + if (mDozing) { + return; + } + + String message = mContext.getString(R.string.keyguard_unlock); + if (mStatusBarKeyguardViewManager.isBouncerShowing()) { + mStatusBarKeyguardViewManager.showBouncerMessage(message, mInitialTextColorState); + } else if (mKeyguardUpdateMonitor.isScreenOn()) { + showTransientIndication(message); + hideTransientIndicationDelayed(BaseKeyguardCallback.HIDE_DELAY_MS); + } + } + public void setDozing(boolean dozing) { if (mDozing == dozing) { return; @@ -620,12 +638,20 @@ public class KeyguardIndicationController implements StateListener, return; } animatePadlockError(); + boolean showSwipeToUnlock = + msgId == KeyguardUpdateMonitor.BIOMETRIC_HELP_FACE_NOT_RECOGNIZED; if (mStatusBarKeyguardViewManager.isBouncerShowing()) { mStatusBarKeyguardViewManager.showBouncerMessage(helpString, mInitialTextColorState); } else if (updateMonitor.isScreenOn()) { showTransientIndication(helpString); - hideTransientIndicationDelayed(TRANSIENT_BIOMETRIC_ERROR_TIMEOUT); + if (!showSwipeToUnlock) { + hideTransientIndicationDelayed(TRANSIENT_BIOMETRIC_ERROR_TIMEOUT); + } + } + if (showSwipeToUnlock) { + mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SWIPE_UP_TO_UNLOCK), + TRANSIENT_BIOMETRIC_ERROR_TIMEOUT); } } -- GitLab From 75cee037ac0f403a510884e9b6795f178a5a7b85 Mon Sep 17 00:00:00 2001 From: Santiago Etchebehere Date: Fri, 17 May 2019 14:18:20 -0700 Subject: [PATCH 003/620] Add 80 percent battery icon for previews Add battery icon at 80 percent so we can use it to preview the icon when no overlay is applied. Bug: 130758661 Test: visual Change-Id: Ibf47e1debf5834b539fa43616f89a8c78697a20c --- core/res/res/drawable/ic_battery_80_24dp.xml | 28 ++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 core/res/res/drawable/ic_battery_80_24dp.xml diff --git a/core/res/res/drawable/ic_battery_80_24dp.xml b/core/res/res/drawable/ic_battery_80_24dp.xml new file mode 100644 index 000000000000..2513d0d6d615 --- /dev/null +++ b/core/res/res/drawable/ic_battery_80_24dp.xml @@ -0,0 +1,28 @@ + + + + + + \ No newline at end of file -- GitLab From 35cd1082e89521bb8b62c84e3a07cc65032023eb Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Mon, 20 May 2019 14:03:46 -0700 Subject: [PATCH 004/620] Update strings Bug: 132787143 Test: Builds Change-Id: I0451ac77830f2903223519d8b67483245f6967fb --- core/res/res/values/strings.xml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 37678dd42512..b08277915b24 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1499,16 +1499,16 @@ Fingerprint icon - manage face authentication hardware + manage face unlock hardware Allows the app to invoke methods to add and delete facial templates for use. - use face authentication hardware + use face unlock hardware - Allows the app to use face authentication hardware for authentication + Allows the app to use face unlock hardware for authentication - Face Authentication + Face unlock Re-enroll your face @@ -1561,23 +1561,23 @@ Can\u2019t verify face. Hardware not available. - Try face authentication again. + Try face unlock again. Can\u2019t store new face data. Delete an old one first. - Face operation canceled - - Face authentication canceled by user + Face operation canceled. + + Face unlock canceled by user. Too many attempts. Try again later. - Too many attempts. Face authentication disabled. + Too many attempts. Face unlock disabled. Can\u2019t verify face. Try again. - You haven\u2019t set up face authentication - - Face authentication is not supported on this device + You haven\u2019t set up face unlock. + + Face unlock is not supported on this device. Face %d -- GitLab From cac2a50465da090ca629f415d62e5173995bffba Mon Sep 17 00:00:00 2001 From: Issei Suzuki Date: Tue, 16 Apr 2019 16:52:50 +0200 Subject: [PATCH 005/620] Synchronize bubble activity rendering status and its visibility change. - Add an API ITaskStackListener.onSingleTaskDisplayDrawn() to notifity contents are drawn for the first time on a display which can only contain one task. - BubbleController updates contents visibility (actually alpha value) of the Surface in a ActivityView. Bug: 130442248 Test: atest WmTests:TaskStackChangedListenerTest Change-Id: Ie5aed373996419b059935889b564ca91c2e3cf23 --- core/java/android/app/ActivityView.java | 11 ++++ core/java/android/app/ITaskStackListener.aidl | 8 +++ core/java/android/app/TaskStackListener.java | 4 ++ core/java/android/view/SurfaceView.java | 42 ++++++++++++ core/java/android/view/WindowManager.java | 10 ++- .../system/TaskStackChangeListener.java | 8 +++ .../system/TaskStackChangeListeners.java | 16 ++++- .../com/android/systemui/bubbles/Bubble.java | 23 +++++++ .../systemui/bubbles/BubbleController.java | 26 ++++++-- .../systemui/bubbles/BubbleExpandedView.java | 22 ++++++- .../systemui/bubbles/BubbleStackView.java | 16 +++-- .../com/android/server/wm/ActivityStack.java | 3 + .../wm/ActivityTaskManagerInternal.java | 8 ++- .../server/wm/ActivityTaskManagerService.java | 8 ++- .../com/android/server/wm/AppTransition.java | 4 ++ .../server/wm/AppTransitionController.java | 7 ++ .../server/wm/RootActivityContainer.java | 10 +++ .../wm/TaskChangeNotificationController.java | 18 +++++ services/tests/wmtests/AndroidManifest.xml | 3 + .../wm/TaskStackChangedListenerTest.java | 65 +++++++++++++++++++ 20 files changed, 297 insertions(+), 15 deletions(-) diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java index 4771f9f6ad04..3bf659b663b0 100644 --- a/core/java/android/app/ActivityView.java +++ b/core/java/android/app/ActivityView.java @@ -120,6 +120,7 @@ public class ActivityView extends ViewGroup { mActivityTaskManager = ActivityTaskManager.getService(); mSurfaceView = new SurfaceView(context); + mSurfaceView.setAlpha(0f); mSurfaceCallback = new SurfaceCallback(); mSurfaceView.getHolder().addCallback(mSurfaceCallback); addView(mSurfaceView); @@ -346,6 +347,16 @@ public class ActivityView extends ViewGroup { mSurfaceView.layout(0 /* left */, 0 /* top */, r - l /* right */, b - t /* bottom */); } + @Override + public void setAlpha(float alpha) { + mSurfaceView.setAlpha(alpha); + } + + @Override + public float getAlpha() { + return mSurfaceView.getAlpha(); + } + @Override public boolean gatherTransparentRegion(Region region) { // The tap exclude region may be affected by any view on top of it, so we detect the diff --git a/core/java/android/app/ITaskStackListener.aidl b/core/java/android/app/ITaskStackListener.aidl index 1fdc8ca5b291..3f6880fc2625 100644 --- a/core/java/android/app/ITaskStackListener.aidl +++ b/core/java/android/app/ITaskStackListener.aidl @@ -169,4 +169,12 @@ oneway interface ITaskStackListener { * @param taskInfo info about the task which received the back press */ void onBackPressedOnTaskRoot(in ActivityManager.RunningTaskInfo taskInfo); + + /* + * Called when contents are drawn for the first time on a display which can only contain one + * task. + * + * @param displayId the id of the display on which contents are drawn. + */ + void onSingleTaskDisplayDrawn(int displayId); } diff --git a/core/java/android/app/TaskStackListener.java b/core/java/android/app/TaskStackListener.java index 00f3ad58afa6..36daf32234db 100644 --- a/core/java/android/app/TaskStackListener.java +++ b/core/java/android/app/TaskStackListener.java @@ -173,4 +173,8 @@ public abstract class TaskStackListener extends ITaskStackListener.Stub { public void onBackPressedOnTaskRoot(ActivityManager.RunningTaskInfo taskInfo) throws RemoteException { } + + @Override + public void onSingleTaskDisplayDrawn(int displayId) throws RemoteException { + } } diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 254d04e8715d..add7376b8531 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -27,6 +27,7 @@ import android.content.res.Configuration; import android.graphics.BlendMode; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.HardwareRenderer; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.PorterDuff; @@ -201,6 +202,29 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb private SurfaceControl.Transaction mRtTransaction = new SurfaceControl.Transaction(); + /** + * A callback which reflects an alpha value of this view onto the underlying surfaces. + * + *

Note: This doesn't have to be defined as a member variable, + * but can be defined as an inline lambda when calling ViewRootImpl#registerRtFrameCallback(). + * However when we do so, the callback is triggered only for a few times and stops working for + * some reason. It's suspected that there is a problem around garbage collection, and until + * the cause is fixed, we will keep this callback in a member variable.

+ */ + private HardwareRenderer.FrameDrawingCallback mSetSurfaceAlphaCallback = frame -> { + final ViewRootImpl viewRoot = getViewRootImpl(); + if (viewRoot == null || viewRoot.mSurface == null || !viewRoot.mSurface.isValid()) { + // In this case, the alpha value is reflected on the screen in #updateSurface() later. + return; + } + + final SurfaceControl.Transaction t = new SurfaceControl.Transaction(); + t.setAlpha(mSurfaceControl, getAlpha()); + t.deferTransactionUntilSurface(mSurfaceControl, viewRoot.mSurface, frame); + t.setEarlyWakeup(); + t.apply(); + }; + public SurfaceView(Context context) { this(context, null); } @@ -288,6 +312,17 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb updateSurface(); } + @Override + public void setAlpha(float alpha) { + super.setAlpha(alpha); + final ViewRootImpl viewRoot = getViewRootImpl(); + if (viewRoot == null) { + return; + } + viewRoot.registerRtFrameCallback(mSetSurfaceAlphaCallback); + invalidate(); + } + private void performDrawFinished() { if (mPendingReportDraws > 0) { mDrawFinished = true; @@ -647,6 +682,13 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb } updateBackgroundVisibilityInTransaction(viewRoot.getSurfaceControl()); + // Alpha value change is handled in setAlpha() directly using a local + // transaction. However it can happen that setAlpha() is called while + // local transactions cannot be applied, so the value is stored in a View + // but not yet reflected on the Surface. + mSurfaceControl.setAlpha(getAlpha()); + mBackgroundControl.setAlpha(getAlpha()); + // While creating the surface, we will set it's initial // geometry. Outside of that though, we should generally // leave it to the RenderThread. diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index a25f2eede905..1f89de861111 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -260,6 +260,13 @@ public interface WindowManager extends ViewManager { */ int TRANSIT_TASK_CHANGE_WINDOWING_MODE = 27; + /** + * A display which can only contain one task is being shown because the first activity is + * started or it's being turned on. + * @hide + */ + int TRANSIT_SHOW_SINGLE_TASK_DISPLAY = 28; + /** * @hide */ @@ -287,7 +294,8 @@ public interface WindowManager extends ViewManager { TRANSIT_TRANSLUCENT_ACTIVITY_OPEN, TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE, TRANSIT_CRASHING_ACTIVITY_CLOSE, - TRANSIT_TASK_CHANGE_WINDOWING_MODE + TRANSIT_TASK_CHANGE_WINDOWING_MODE, + TRANSIT_SHOW_SINGLE_TASK_DISPLAY }) @Retention(RetentionPolicy.SOURCE) @interface TransitionType {} diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java index 21b3a0082319..bd2b19c0ddfe 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java @@ -64,6 +64,14 @@ public abstract class TaskStackChangeListener { onActivityLaunchOnSecondaryDisplayRerouted(); } + /** + * Called when contents are drawn for the first time on a display which can only contain one + * task. + * + * @param displayId the id of the display on which contents are drawn. + */ + public void onSingleTaskDisplayDrawn(int displayId) { } + public void onTaskProfileLocked(int taskId, int userId) { } public void onTaskCreated(int taskId, ComponentName componentName) { } public void onTaskRemoved(int taskId) { } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java index 06ae399a5e4e..c89f2ab7f172 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java @@ -196,11 +196,18 @@ public class TaskStackChangeListeners extends TaskStackListener { } @Override - public void onSizeCompatModeActivityChanged(int displayId, IBinder activityToken) { + public void onSizeCompatModeActivityChanged(int displayId, IBinder activityToken) + throws RemoteException { mHandler.obtainMessage(H.ON_SIZE_COMPAT_MODE_ACTIVITY_CHANGED, displayId, 0 /* unused */, activityToken).sendToTarget(); } + @Override + public void onSingleTaskDisplayDrawn(int displayId) throws RemoteException { + mHandler.obtainMessage(H.ON_SINGLE_TASK_DISPLAY_DRAWN, displayId, + 0 /* unused */).sendToTarget(); + } + private final class H extends Handler { private static final int ON_TASK_STACK_CHANGED = 1; private static final int ON_TASK_SNAPSHOT_CHANGED = 2; @@ -220,6 +227,7 @@ public class TaskStackChangeListeners extends TaskStackListener { private static final int ON_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED = 16; private static final int ON_SIZE_COMPAT_MODE_ACTIVITY_CHANGED = 17; private static final int ON_BACK_PRESSED_ON_TASK_ROOT = 18; + private static final int ON_SINGLE_TASK_DISPLAY_DRAWN = 19; public H(Looper looper) { @@ -356,6 +364,12 @@ public class TaskStackChangeListeners extends TaskStackListener { } break; } + case ON_SINGLE_TASK_DISPLAY_DRAWN: { + for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) { + mTaskStackListeners.get(i).onSingleTaskDisplayDrawn(msg.arg1); + } + break; + } } } } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java index f60e95e32600..5c6c39722900 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java @@ -16,6 +16,8 @@ package com.android.systemui.bubbles; +import static android.view.Display.INVALID_DISPLAY; + import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE; import android.content.Context; @@ -129,6 +131,20 @@ class Bubble { mInflated = true; } + /** + * Set visibility of bubble in the expanded state. + * + * @param visibility {@code true} if the expanded bubble should be visible on the screen. + * + * Note that this contents visibility doesn't affect visibility at {@link android.view.View}, + * and setting {@code false} actually means rendering the expanded view in transparent. + */ + void setContentVisibility(boolean visibility) { + if (expandedView != null) { + expandedView.setContentVisibility(visibility); + } + } + void setDismissed() { entry.setBubbleDismissed(true); // TODO: move this somewhere where it can be guaranteed not to run until safe from flicker @@ -167,6 +183,13 @@ class Bubble { return mLastAccessed; } + /** + * @return the display id of the virtual display on which bubble contents is drawn. + */ + int getDisplayId() { + return expandedView != null ? expandedView.getVirtualDisplayId() : INVALID_DISPLAY; + } + /** * Should be invoked whenever a Bubble is accessed (selected while expanded). */ diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java index dcc0419ab0cf..c2f4cfffdc6a 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java @@ -603,17 +603,23 @@ public class BubbleController implements ConfigurationController.ConfigurationLi * status bar, otherwise returns {@link Display#INVALID_DISPLAY}. */ public int getExpandedDisplayId(Context context) { + final Bubble bubble = getExpandedBubble(context); + return bubble != null ? bubble.getDisplayId() : INVALID_DISPLAY; + } + + @Nullable + private Bubble getExpandedBubble(Context context) { if (mStackView == null) { - return INVALID_DISPLAY; + return null; } - boolean defaultDisplay = context.getDisplay() != null + final boolean defaultDisplay = context.getDisplay() != null && context.getDisplay().getDisplayId() == DEFAULT_DISPLAY; - Bubble b = mStackView.getExpandedBubble(); - if (defaultDisplay && b != null && isStackExpanded() + final Bubble expandedBubble = mStackView.getExpandedBubble(); + if (defaultDisplay && expandedBubble != null && isStackExpanded() && !mStatusBarWindowController.getPanelExpanded()) { - return b.expandedView.getVirtualDisplayId(); + return expandedBubble; } - return INVALID_DISPLAY; + return null; } @VisibleForTesting @@ -730,6 +736,14 @@ public class BubbleController implements ConfigurationController.ConfigurationLi mBubbleData.setExpanded(false); } } + + @Override + public void onSingleTaskDisplayDrawn(int displayId) { + final Bubble expandedBubble = getExpandedBubble(mContext); + if (expandedBubble != null && expandedBubble.getDisplayId() == displayId) { + expandedBubble.setContentVisibility(true); + } + } } private static boolean shouldAutoBubbleMessages(Context context) { diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java index e7948b5149a0..a4a2d9e772a5 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java @@ -185,6 +185,8 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList mActivityView = new ActivityView(mContext, null /* attrs */, 0 /* defStyle */, true /* singleTaskInstance */); + + setContentVisibility(false); addView(mActivityView); // Expanded stack layout, top to bottom: @@ -238,6 +240,22 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList } } + /** + * Set visibility of contents in the expanded state. + * + * @param visibility {@code true} if the contents should be visible on the screen. + * + * Note that this contents visibility doesn't affect visibility at {@link android.view.View}, + * and setting {@code false} actually means rendering the contents in transparent. + */ + void setContentVisibility(boolean visibility) { + final float alpha = visibility ? 1f : 0f; + mPointerView.setAlpha(alpha); + if (mActivityView != null) { + mActivityView.setAlpha(alpha); + } + } + /** * Called by {@link BubbleStackView} when the insets for the expanded state should be updated. * This should be done post-move and post-animation. @@ -310,6 +328,7 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList parent.removeView(mNotifRow); } addView(mNotifRow, 1 /* index */); + mPointerView.setAlpha(1f); } } @@ -336,12 +355,12 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList removeView(mNotifRow); mNotifRow = null; } + setContentVisibility(false); mActivityView.setVisibility(VISIBLE); } else { // Hide activity view if we had it previously mActivityView.setVisibility(GONE); mNotifRow = mEntry.getRow(); - } updateView(); } @@ -440,6 +459,7 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList mActivityView.onLocationChanged(); } else if (mNotifRow != null) { applyRowState(mNotifRow); + mPointerView.setAlpha(1f); } updateHeight(); } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index bec90d2edad1..14d8f3786f70 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -740,12 +740,16 @@ public class BubbleStackView extends FrameLayout { } final Bubble previouslySelected = mExpandedBubble; mExpandedBubble = bubbleToSelect; + if (mIsExpanded) { // Make the container of the expanded view transparent before removing the expanded view // from it. Otherwise a punch hole created by {@link android.view.SurfaceView} in the // expanded view becomes visible on the screen. See b/126856255 mExpandedViewContainer.setAlpha(0.0f); mSurfaceSynchronizer.syncSurfaceAndRun(() -> { + if (previouslySelected != null) { + previouslySelected.setContentVisibility(false); + } updateExpandedBubble(); updatePointerPosition(); requestUpdate(); @@ -774,6 +778,14 @@ public class BubbleStackView extends FrameLayout { } if (wasExpanded) { // Collapse the stack + mExpandedViewContainer.setAlpha(0.0f); + // TODO: In order to prevent flicker, code below should be executed after the alpha + // value set on the mExpandedViewContainer is reflected on the screen. However, we + // cannot just postpone the execution like #setSelectedBubble(), since some of member + // variables referred by the code are overridden before the execution. + if (mExpandedBubble != null) { + mExpandedBubble.setContentVisibility(false); + } animateExpansion(false /* expand */); logBubbleEvent(mExpandedBubble, StatsLog.BUBBLE_UICHANGED__ACTION__COLLAPSED); } else { @@ -931,14 +943,10 @@ public class BubbleStackView extends FrameLayout { if (shouldExpand) { mExpandedViewContainer.setTranslationX(xStart); mExpandedViewContainer.setTranslationY(yStart); - mExpandedViewContainer.setAlpha(0f); } mExpandedViewXAnim.animateToFinalPosition(shouldExpand ? 0f : xStart); mExpandedViewYAnim.animateToFinalPosition(shouldExpand ? yDest : yStart); - mExpandedViewContainer.animate() - .setDuration(100) - .alpha(shouldExpand ? 1f : 0f); } } diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 3d59e66d13ef..b3b6efed1a37 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -40,6 +40,7 @@ import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE; import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN; import static android.view.WindowManager.TRANSIT_CRASHING_ACTIVITY_CLOSE; import static android.view.WindowManager.TRANSIT_NONE; +import static android.view.WindowManager.TRANSIT_SHOW_SINGLE_TASK_DISPLAY; import static android.view.WindowManager.TRANSIT_TASK_CLOSE; import static android.view.WindowManager.TRANSIT_TASK_OPEN; import static android.view.WindowManager.TRANSIT_TASK_OPEN_BEHIND; @@ -3194,6 +3195,8 @@ class ActivityStack extends ConfigurationContainer { if (newTask) { if (r.mLaunchTaskBehind) { transit = TRANSIT_TASK_OPEN_BEHIND; + } else if (getDisplay().isSingleTaskInstance()) { + transit = TRANSIT_SHOW_SINGLE_TASK_DISPLAY; } else { // If a new task is being launched, then mark the existing top activity as // supporting picture-in-picture while pausing only if the starting activity diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java index ed56501f4351..dbc530d38684 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java @@ -34,7 +34,6 @@ import android.os.IBinder; import android.os.RemoteException; import android.os.SystemClock; import android.service.voice.IVoiceInteractionSession; -import android.util.Pair; import android.util.SparseIntArray; import android.util.proto.ProtoOutputStream; @@ -188,6 +187,13 @@ public abstract class ActivityTaskManagerInternal { */ public abstract void notifyDockedStackMinimizedChanged(boolean minimized); + /** + * Notify listeners that contents are drawn for the first time on a single task display. + * + * @param displayId An ID of the display on which contents are drawn. + */ + public abstract void notifySingleTaskDisplayDrawn(int displayId); + /** * Start activity {@code intents} as if {@code packageName} on user {@code userId} did it. * diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 772e5e646825..e9a266cfb924 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -6087,13 +6087,19 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } @Override - public void notifyAppTransitionStarting(SparseIntArray reasons, long timestamp) { + public void notifyAppTransitionStarting(SparseIntArray reasons, + long timestamp) { synchronized (mGlobalLock) { mStackSupervisor.getActivityMetricsLogger().notifyTransitionStarting( reasons, timestamp); } } + @Override + public void notifySingleTaskDisplayDrawn(int displayId) { + mTaskChangeNotificationController.notifySingleTaskDisplayDrawn(displayId); + } + @Override public void notifyAppTransitionFinished() { synchronized (mGlobalLock) { diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index ddd5c0aa7dc0..19ccc62527e9 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -29,6 +29,7 @@ import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPE import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE; import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE; import static android.view.WindowManager.TRANSIT_NONE; +import static android.view.WindowManager.TRANSIT_SHOW_SINGLE_TASK_DISPLAY; import static android.view.WindowManager.TRANSIT_TASK_CHANGE_WINDOWING_MODE; import static android.view.WindowManager.TRANSIT_TASK_CLOSE; import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE; @@ -2052,6 +2053,9 @@ public class AppTransition implements Dump { case TRANSIT_CRASHING_ACTIVITY_CLOSE: { return "TRANSIT_CRASHING_ACTIVITY_CLOSE"; } + case TRANSIT_SHOW_SINGLE_TASK_DISPLAY: { + return "TRANSIT_SHOW_SINGLE_TASK_DISPLAY"; + } default: { return ""; } diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java index d4c4e6a93fa6..6c5ef5259285 100644 --- a/services/core/java/com/android/server/wm/AppTransitionController.java +++ b/services/core/java/com/android/server/wm/AppTransitionController.java @@ -28,6 +28,7 @@ import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_W import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY; import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER; import static android.view.WindowManager.TRANSIT_NONE; +import static android.view.WindowManager.TRANSIT_SHOW_SINGLE_TASK_DISPLAY; import static android.view.WindowManager.TRANSIT_TASK_CLOSE; import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE; import static android.view.WindowManager.TRANSIT_TASK_OPEN; @@ -211,6 +212,12 @@ public class AppTransitionController { mService.mAtmInternal.notifyAppTransitionStarting(mTempTransitionReasons.clone(), SystemClock.uptimeMillis()); + if (transit == TRANSIT_SHOW_SINGLE_TASK_DISPLAY) { + mService.mAnimator.addAfterPrepareSurfacesRunnable(() -> { + mService.mAtmInternal.notifySingleTaskDisplayDrawn(mDisplayContent.getDisplayId()); + }); + } + Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); mDisplayContent.pendingLayoutChanges |= diff --git a/services/core/java/com/android/server/wm/RootActivityContainer.java b/services/core/java/com/android/server/wm/RootActivityContainer.java index 3ec461d065ff..d58c61368f9a 100644 --- a/services/core/java/com/android/server/wm/RootActivityContainer.java +++ b/services/core/java/com/android/server/wm/RootActivityContainer.java @@ -35,6 +35,7 @@ import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK; import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.INVALID_DISPLAY; +import static android.view.WindowManager.TRANSIT_SHOW_SINGLE_TASK_DISPLAY; import static com.android.server.am.ActivityStackSupervisorProto.CONFIGURATION_CONTAINER; import static com.android.server.am.ActivityStackSupervisorProto.DISPLAYS; @@ -1217,6 +1218,15 @@ class RootActivityContainer extends ConfigurationContainer if (displayShouldSleep) { stack.goToSleepIfPossible(false /* shuttingDown */); } else { + // When the display which can only contain one task turns on, start a special + // transition. {@link AppTransitionController#handleAppTransitionReady} later + // picks up the transition, and schedules + // {@link ITaskStackListener#onSingleTaskDisplayDrawn} callback which is + // triggered after contents are drawn on the display. + if (display.isSingleTaskInstance()) { + display.mDisplayContent.prepareAppTransition( + TRANSIT_SHOW_SINGLE_TASK_DISPLAY, false); + } stack.awakeFromSleepingLocked(); if (stack.isFocusedStackOnDisplay() && !mStackSupervisor.getKeyguardController() diff --git a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java index 66200e39938b..27175c706812 100644 --- a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java +++ b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java @@ -54,6 +54,7 @@ class TaskChangeNotificationController { private static final int NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED_MSG = 19; private static final int NOTIFY_SIZE_COMPAT_MODE_ACTIVITY_CHANGED_MSG = 20; private static final int NOTIFY_BACK_PRESSED_ON_TASK_ROOT = 21; + private static final int NOTIFY_SINGLE_TASK_DISPLAY_DRAWN = 22; // Delay in notifying task stack change listeners (in millis) private static final int NOTIFY_TASK_STACK_CHANGE_LISTENERS_DELAY = 100; @@ -154,6 +155,10 @@ class TaskChangeNotificationController { l.onSizeCompatModeActivityChanged(m.arg1, (IBinder) m.obj); }; + private final TaskStackConsumer mNotifySingleTaskDisplayDrawn = (l, m) -> { + l.onSingleTaskDisplayDrawn(m.arg1); + }; + @FunctionalInterface public interface TaskStackConsumer { void accept(ITaskStackListener t, Message m) throws RemoteException; @@ -233,6 +238,9 @@ class TaskChangeNotificationController { case NOTIFY_BACK_PRESSED_ON_TASK_ROOT: forAllRemoteListeners(mNotifyBackPressedOnTaskRoot, msg); break; + case NOTIFY_SINGLE_TASK_DISPLAY_DRAWN: + forAllRemoteListeners(mNotifySingleTaskDisplayDrawn, msg); + break; } } } @@ -477,4 +485,14 @@ class TaskChangeNotificationController { forAllLocalListeners(mNotifyBackPressedOnTaskRoot, msg); msg.sendToTarget(); } + + /** + * Notify listeners that contents are drawn for the first time on a single task display. + */ + void notifySingleTaskDisplayDrawn(int displayId) { + final Message msg = mHandler.obtainMessage(NOTIFY_SINGLE_TASK_DISPLAY_DRAWN, + displayId, 0 /* unused */); + forAllLocalListeners(mNotifySingleTaskDisplayDrawn, msg); + msg.sendToTarget(); + } } diff --git a/services/tests/wmtests/AndroidManifest.xml b/services/tests/wmtests/AndroidManifest.xml index 5136705ffbc2..4c27a3ce0bf3 100644 --- a/services/tests/wmtests/AndroidManifest.xml +++ b/services/tests/wmtests/AndroidManifest.xml @@ -49,6 +49,9 @@ + + diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java index 62247d889485..19fd93fee5f0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java @@ -16,6 +16,8 @@ package com.android.server.wm; +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; + import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; import static org.junit.Assert.assertEquals; @@ -26,18 +28,22 @@ import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.TaskDescription; import android.app.ActivityTaskManager; +import android.app.ActivityView; import android.app.IActivityManager; import android.app.ITaskStackListener; +import android.app.Instrumentation; import android.app.Instrumentation.ActivityMonitor; import android.app.TaskStackListener; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; +import android.os.Bundle; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.support.test.uiautomator.UiDevice; import android.text.TextUtils; +import android.view.ViewGroup; import androidx.test.filters.FlakyTest; import androidx.test.filters.MediumTest; @@ -231,6 +237,40 @@ public class TaskStackChangedListenerTest { assertTrue(activity.mOnDetachedFromWindowCalled); } + @Test + public void testTaskOnSingleTaskDisplayDrawn() throws Exception { + final Instrumentation instrumentation = getInstrumentation(); + + final CountDownLatch activityViewReadyLatch = new CountDownLatch(1); + final CountDownLatch singleTaskDisplayDrawnLatch = new CountDownLatch(1); + registerTaskStackChangedListener(new TaskStackListener() { + @Override + public void onSingleTaskDisplayDrawn(int displayId) throws RemoteException { + singleTaskDisplayDrawnLatch.countDown(); + } + }); + final ActivityViewTestActivity activity = + (ActivityViewTestActivity) startTestActivity(ActivityViewTestActivity.class); + final ActivityView activityView = activity.getActivityView(); + activityView.setCallback(new ActivityView.StateCallback() { + @Override + public void onActivityViewReady(ActivityView view) { + activityViewReadyLatch.countDown(); + } + + @Override + public void onActivityViewDestroyed(ActivityView view) { + } + }); + waitForCallback(activityViewReadyLatch); + + final Context context = instrumentation.getContext(); + Intent intent = new Intent(context, ActivityInActivityView.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + activityView.startActivity(intent); + waitForCallback(singleTaskDisplayDrawnLatch); + } + /** * Starts the provided activity and returns the started instance. */ @@ -369,4 +409,29 @@ public class TaskStackChangedListenerTest { mOnDetachedFromWindowCountDownLatch = countDownLatch; } } + + public static class ActivityViewTestActivity extends TestActivity { + private ActivityView mActivityView; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + mActivityView = new ActivityView(this, null /* attrs */, 0 /* defStyle */, + true /* singleTaskInstance */); + setContentView(mActivityView); + + ViewGroup.LayoutParams layoutParams = mActivityView.getLayoutParams(); + layoutParams.width = MATCH_PARENT; + layoutParams.height = MATCH_PARENT; + mActivityView.requestLayout(); + } + + ActivityView getActivityView() { + return mActivityView; + } + } + + // Activity that has {@link android.R.attr#resizeableActivity} attribute set to {@code true} + public static class ActivityInActivityView extends TestActivity {} } -- GitLab From 1e3b5a559faab780cb4b47ae07b5492f7e8f6996 Mon Sep 17 00:00:00 2001 From: James O'Leary Date: Mon, 20 May 2019 23:21:54 -0400 Subject: [PATCH 006/620] Fix NPE with live wallpaper Test: Verify WAI Fixes: 133130262, 133194773, 133168135, 133160573 Change-Id: Ib38947326839a5c4806b909ead2484efd5a535a1 (cherry picked from commit 35cb43b811206def4929128911d658ed415673b3) --- .../src/com/android/systemui/assist/PhoneStateMonitor.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java b/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java index 8c070835f69e..ea08c335b31d 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java @@ -136,7 +136,11 @@ final class PhoneStateMonitor { } private boolean isLauncherShowing(ActivityManager.RunningTaskInfo runningTaskInfo) { - return runningTaskInfo.topActivity.equals(mDefaultHome); + if (runningTaskInfo == null) { + return false; + } else { + return runningTaskInfo.topActivity.equals(mDefaultHome); + } } private boolean isAppImmersive() { -- GitLab From d5c4ca2e914c0243f517af6114adb1d97055534c Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Wed, 22 May 2019 13:04:12 -0700 Subject: [PATCH 007/620] Temporarily disable retry on bouncer when pattern Bug: 132687980 Test: manual Change-Id: I40c1e6201a6ce2b7bc644a2977f7afe383dd2e35 --- .../src/com/android/keyguard/KeyguardSecurityContainer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 0914fb8330be..dc71b275a43f 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -265,7 +265,8 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe mSwipeUpToRetry = mUpdateMonitor.isUnlockWithFacePossible(userId) && securityMode != SecurityMode.SimPin && securityMode != SecurityMode.SimPuk - && securityMode != SecurityMode.None; + && securityMode != SecurityMode.None + && securityMode != SecurityMode.Pattern; } public CharSequence getTitle() { -- GitLab From 7e378bc588f913ca53f1e9f2d433b3cc72a67fda Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Wed, 22 May 2019 13:04:12 -0700 Subject: [PATCH 008/620] Temporarily disable retry on bouncer when pattern Bug: 132687980 Test: manual Change-Id: I40c1e6201a6ce2b7bc644a2977f7afe383dd2e35 (cherry picked from commit d5c4ca2e914c0243f517af6114adb1d97055534c) --- .../src/com/android/keyguard/KeyguardSecurityContainer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 906ace78148e..eef61dbb0949 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -269,7 +269,8 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe mSwipeUpToRetry = mUpdateMonitor.isUnlockWithFacePossible(userId) && securityMode != SecurityMode.SimPin && securityMode != SecurityMode.SimPuk - && securityMode != SecurityMode.None; + && securityMode != SecurityMode.None + && securityMode != SecurityMode.Pattern; } public CharSequence getTitle() { -- GitLab From c43a0a65208a1c62c5ec13c519a9ffc3788122fe Mon Sep 17 00:00:00 2001 From: Jackal Guo Date: Tue, 23 Apr 2019 09:15:14 +0800 Subject: [PATCH 009/620] A11y support for windows in a re-parented display Currently, accessibility only supports windows in default display. The windows in other displays aren't recongnized by accessibility even they're re-parented to default display. Besides, we need to offset the bound after re-parented since the original is from its own display. Bug: 129098348 Test: atest WindowStateTests Test: atest DisplayContentTests Test: a11y CTS & unit tests Change-Id: I41a84a4c02e3c1be1dab4bd420d504b85787c4fb --- .../AccessibilityInteractionController.java | 28 +++++++ core/java/android/view/IWindow.aidl | 7 ++ core/java/android/view/View.java | 6 ++ core/java/android/view/ViewRootImpl.java | 32 ++++++++ .../android/internal/view/BaseIWindow.java | 5 ++ .../server/wm/AccessibilityController.java | 54 +++++++++--- .../com/android/server/wm/DisplayContent.java | 34 +++++++- .../server/wm/TapExcludeRegionHolder.java | 7 ++ .../server/wm/WindowManagerService.java | 7 +- .../com/android/server/wm/WindowState.java | 82 +++++++++++++++++-- .../com/android/server/wm/TestIWindow.java | 5 ++ 11 files changed, 244 insertions(+), 23 deletions(-) diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java index bbd44c8b85af..4b929683fd6d 100644 --- a/core/java/android/view/AccessibilityInteractionController.java +++ b/core/java/android/view/AccessibilityInteractionController.java @@ -830,6 +830,32 @@ public final class AccessibilityInteractionController { return false; } + private void adjustBoundsInScreenIfNeeded(List infos) { + if (infos == null || shouldBypassAdjustBoundsInScreen()) { + return; + } + final int infoCount = infos.size(); + for (int i = 0; i < infoCount; i++) { + final AccessibilityNodeInfo info = infos.get(i); + adjustBoundsInScreenIfNeeded(info); + } + } + + private void adjustBoundsInScreenIfNeeded(AccessibilityNodeInfo info) { + if (info == null || shouldBypassAdjustBoundsInScreen()) { + return; + } + final Rect boundsInScreen = mTempRect; + info.getBoundsInScreen(boundsInScreen); + boundsInScreen.offset(mViewRootImpl.mAttachInfo.mLocationInParentDisplay.x, + mViewRootImpl.mAttachInfo.mLocationInParentDisplay.y); + info.setBoundsInScreen(boundsInScreen); + } + + private boolean shouldBypassAdjustBoundsInScreen() { + return mViewRootImpl.mAttachInfo.mLocationInParentDisplay.equals(0, 0); + } + private void applyAppScaleAndMagnificationSpecIfNeeded(AccessibilityNodeInfo info, MagnificationSpec spec) { if (info == null) { @@ -921,6 +947,7 @@ public final class AccessibilityInteractionController { MagnificationSpec spec, Region interactiveRegion) { try { mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0; + adjustBoundsInScreenIfNeeded(infos); applyAppScaleAndMagnificationSpecIfNeeded(infos, spec); adjustIsVisibleToUserIfNeeded(infos, interactiveRegion); callback.setFindAccessibilityNodeInfosResult(infos, interactionId); @@ -939,6 +966,7 @@ public final class AccessibilityInteractionController { MagnificationSpec spec, Region interactiveRegion) { try { mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0; + adjustBoundsInScreenIfNeeded(info); applyAppScaleAndMagnificationSpecIfNeeded(info, spec); adjustIsVisibleToUserIfNeeded(info, interactiveRegion); callback.setFindAccessibilityNodeInfoResult(info, interactionId); diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl index 699e795be980..f34f9e6d5ce8 100644 --- a/core/java/android/view/IWindow.aidl +++ b/core/java/android/view/IWindow.aidl @@ -17,6 +17,7 @@ package android.view; +import android.graphics.Point; import android.graphics.Rect; import android.os.Bundle; import android.os.ParcelFileDescriptor; @@ -56,6 +57,12 @@ oneway interface IWindow { boolean forceLayout, boolean alwaysConsumeSystemBars, int displayId, in DisplayCutout.ParcelableWrapper displayCutout); + /** + * Called when the window location in parent display has changed. The offset will only be a + * nonzero value if the window is on an embedded display that is re-parented to another window. + */ + void locationInParentDisplayChanged(in Point offset); + /** * Called when the window insets configuration has changed. */ diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 85580aad7b4e..5dfba14970f7 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -28014,6 +28014,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ boolean mHandlingPointerEvent; + /** + * The offset of this view's window when it's on an embedded display that is re-parented + * to another window. + */ + final Point mLocationInParentDisplay = new Point(); + /** * Global to the view hierarchy used as a temporary for dealing with * x/y points in the transparent region computations. diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index e8356752f807..caaf8e17fbb6 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -3825,6 +3825,13 @@ public final class ViewRootImpl implements ViewParent, } } + void updateLocationInParentDisplay(int x, int y) { + if (mAttachInfo != null + && !mAttachInfo.mLocationInParentDisplay.equals(x, y)) { + mAttachInfo.mLocationInParentDisplay.set(x, y); + } + } + /** * Set the root-level system gesture exclusion rects. These are added to those provided by * the root's view hierarchy. @@ -4329,6 +4336,7 @@ public final class ViewRootImpl implements ViewParent, private static final int MSG_INSETS_CHANGED = 30; private static final int MSG_INSETS_CONTROL_CHANGED = 31; private static final int MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED = 32; + private static final int MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED = 33; final class ViewRootHandler extends Handler { @Override @@ -4390,6 +4398,8 @@ public final class ViewRootImpl implements ViewParent, return "MSG_INSETS_CONTROL_CHANGED"; case MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED: return "MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED"; + case MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED: + return "MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED"; } return super.getMessageName(message); } @@ -4623,6 +4633,9 @@ public final class ViewRootImpl implements ViewParent, case MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED: { systemGestureExclusionChanged(); } break; + case MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED: { + updateLocationInParentDisplay(msg.arg1, msg.arg2); + } break; } } } @@ -7829,6 +7842,17 @@ public final class ViewRootImpl implements ViewParent, mHandler.sendMessage(msg); } + /** + * Dispatch the offset changed. + * + * @param offset the offset of this view in the parent window. + */ + public void dispatchLocationInParentDisplayChanged(Point offset) { + Message msg = + mHandler.obtainMessage(MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED, offset.x, offset.y); + mHandler.sendMessage(msg); + } + public void windowFocusChanged(boolean hasFocus, boolean inTouchMode) { synchronized (this) { mWindowFocusChanged = true; @@ -8355,6 +8379,14 @@ public final class ViewRootImpl implements ViewParent, } } + @Override + public void locationInParentDisplayChanged(Point offset) { + final ViewRootImpl viewAncestor = mViewAncestor.get(); + if (viewAncestor != null) { + viewAncestor.dispatchLocationInParentDisplayChanged(offset); + } + } + @Override public void insetsChanged(InsetsState insetsState) { final ViewRootImpl viewAncestor = mViewAncestor.get(); diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java index fb9ff15c79ac..f9cdf3d0be61 100644 --- a/core/java/com/android/internal/view/BaseIWindow.java +++ b/core/java/com/android/internal/view/BaseIWindow.java @@ -16,6 +16,7 @@ package com.android.internal.view; +import android.graphics.Point; import android.graphics.Rect; import android.hardware.input.InputManager; import android.os.Bundle; @@ -54,6 +55,10 @@ public class BaseIWindow extends IWindow.Stub { } } + @Override + public void locationInParentDisplayChanged(Point offset) { + } + @Override public void insetsChanged(InsetsState insetsState) { } diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java index b6a5be807fb6..4cfc1d1df2ae 100644 --- a/services/core/java/com/android/server/wm/AccessibilityController.java +++ b/services/core/java/com/android/server/wm/AccessibilityController.java @@ -1065,8 +1065,6 @@ final class AccessibilityController { private final long mRecurringAccessibilityEventsIntervalMillis; - private int mTempLayer = 0; - public WindowsForAccessibilityObserver(WindowManagerService windowManagerService, WindowsForAccessibilityCallback callback) { mContext = windowManagerService.mContext; @@ -1091,7 +1089,7 @@ final class AccessibilityController { } /** - * Check if windows have changed, and send them to the accessibilty subsystem if they have. + * Check if windows have changed, and send them to the accessibility subsystem if they have. * * @param forceSend Send the windows the accessibility even if they haven't changed. */ @@ -1108,8 +1106,7 @@ final class AccessibilityController { // the window manager is still looking for where to put it. // We will do the work when we get a focus change callback. // TODO(b/112273690): Support multiple displays - // TODO(b/129098348): Support embedded displays - if (mService.getDefaultDisplayContentLocked().mCurrentFocus == null) { + if (!isCurrentFocusWindowOnDefaultDisplay()) { return; } @@ -1395,21 +1392,35 @@ final class AccessibilityController { } private void populateVisibleWindowsOnScreenLocked(SparseArray outWindows) { + final List tempWindowStatesList = new ArrayList<>(); final DisplayContent dc = mService.getDefaultDisplayContentLocked(); - mTempLayer = 0; dc.forAllWindows((w) -> { if (w.isVisibleLw()) { - outWindows.put(mTempLayer++, w); + tempWindowStatesList.add(w); } }, false /* traverseTopToBottom */); + // Insert the re-parented windows in another display on top of their parents in + // default display. mService.mRoot.forAllWindows(w -> { - final WindowState win = findRootDisplayParentWindow(w); - if (win != null && win.getDisplayContent().isDefaultDisplay && w.isVisibleLw()) { - // TODO(b/129098348): insert windows on child displays into outWindows based on - // root-display-parent window. - outWindows.put(mTempLayer++, w); + final WindowState parentWindow = findRootDisplayParentWindow(w); + if (parentWindow == null) { + return; } - }, false /* traverseTopToBottom */); + + // TODO: Use Region instead to get rid of this complicated logic. + // Check the tap exclude region of the parent window. If the tap exclude region + // is empty, it means there is another can-receive-pointer-event view on top of + // the region. Hence, we don't count the window as visible. + if (w.isVisibleLw() && parentWindow.getDisplayContent().isDefaultDisplay + && parentWindow.hasTapExcludeRegion() + && tempWindowStatesList.contains(parentWindow)) { + tempWindowStatesList.add( + tempWindowStatesList.lastIndexOf(parentWindow) + 1, w); + } + }, true /* traverseTopToBottom */); + for (int i = 0; i < tempWindowStatesList.size(); i++) { + outWindows.put(i, tempWindowStatesList.get(i)); + } } private WindowState findRootDisplayParentWindow(WindowState win) { @@ -1425,6 +1436,23 @@ final class AccessibilityController { return displayParentWindow; } + private boolean isCurrentFocusWindowOnDefaultDisplay() { + final WindowState focusedWindow = + mService.mRoot.getTopFocusedDisplayContent().mCurrentFocus; + if (focusedWindow == null) { + return false; + } + + final WindowState rootDisplayParentWindow = findRootDisplayParentWindow(focusedWindow); + if (!focusedWindow.isDefaultDisplay() + && (rootDisplayParentWindow == null + || !rootDisplayParentWindow.isDefaultDisplay())) { + return false; + } + + return true; + } + private class MyHandler extends Handler { public static final int MESSAGE_COMPUTE_CHANGED_WINDOWS = 1; diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 82ea4fe42799..13cbb6e24921 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -2540,6 +2540,9 @@ class DisplayContent extends WindowContainer { + w.updateLocationInParentDisplayIfNeeded(); + }, false /* traverseTopToBottom */); + } + @VisibleForTesting SurfaceControl getWindowingLayer() { return mWindowingLayer; diff --git a/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java b/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java index 22f529b28b8e..8f72cdad8dce 100644 --- a/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java +++ b/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java @@ -52,4 +52,11 @@ class TapExcludeRegionHolder { region.op(r, Region.Op.UNION); } } + + /** + * Return true if tap exclude region is empty. + */ + boolean isEmpty() { + return mTapExcludeRegions.size() == 0; + } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 47df83923700..82054320b025 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -4541,8 +4541,11 @@ public class WindowManagerService extends IWindowManager.Stub AccessibilityController accessibilityController = null; synchronized (mGlobalLock) { - // TODO(multidisplay): Accessibility supported only of default desiplay. - if (mAccessibilityController != null && displayContent.isDefaultDisplay) { + // TODO(multidisplay): Accessibility supported only of default display and + // embedded displays. + if (mAccessibilityController != null + && (displayContent.isDefaultDisplay + || displayContent.getParentWindow() != null)) { accessibilityController = mAccessibilityController; } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 5ef184adc52f..89fd33bba261 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -167,6 +167,7 @@ import android.os.UserHandle; import android.os.WorkSource; import android.provider.Settings; import android.text.TextUtils; +import android.util.ArraySet; import android.util.DisplayMetrics; import android.util.MergedConfiguration; import android.util.Slog; @@ -316,6 +317,9 @@ class WindowState extends WindowContainer implements WindowManagerP int mLayoutSeq = -1; + /** @see #addEmbeddedDisplayContent(DisplayContent dc) */ + private final ArraySet mEmbeddedDisplayContents = new ArraySet<>(); + /** * Used to store last reported to client configuration and check if we have newer available. * We'll send configuration to client only if it is different from the last applied one and @@ -535,6 +539,12 @@ class WindowState extends WindowContainer implements WindowManagerP private final Rect mTmpRect = new Rect(); private final Point mTmpPoint = new Point(); + /** + * If a window is on a display which has been re-parented to a view in another window, + * use this offset to indicate the correct location. + */ + private final Point mLastReportedDisplayOffset = new Point(); + /** * Whether the window was resized by us while it was gone for layout. */ @@ -1777,11 +1787,13 @@ class WindowState extends WindowContainer implements WindowManagerP startMoveAnimation(left, top); } - //TODO (multidisplay): Accessibility supported only for the default display. - if (mWmService.mAccessibilityController != null - && getDisplayContent().getDisplayId() == DEFAULT_DISPLAY) { + // TODO (multidisplay): Accessibility supported only for the default display and + // embedded displays + if (mWmService.mAccessibilityController != null && (getDisplayId() == DEFAULT_DISPLAY + || getDisplayContent().getParentWindow() != null)) { mWmService.mAccessibilityController.onSomeWindowResizedOrMovedLocked(); } + updateLocationInParentDisplayIfNeeded(); try { mClient.moved(left, top); @@ -3143,11 +3155,13 @@ class WindowState extends WindowContainer implements WindowManagerP displayCutout); } - //TODO (multidisplay): Accessibility supported only for the default display. + // TODO (multidisplay): Accessibility supported only for the default display and + // embedded displays if (mWmService.mAccessibilityController != null && (getDisplayId() == DEFAULT_DISPLAY || getDisplayContent().getParentWindow() != null)) { mWmService.mAccessibilityController.onSomeWindowResizedOrMovedLocked(); } + updateLocationInParentDisplayIfNeeded(); mWindowFrames.resetInsetsChanged(); mWinAnimator.mSurfaceResized = false; @@ -3165,6 +3179,36 @@ class WindowState extends WindowContainer implements WindowManagerP Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); } + void updateLocationInParentDisplayIfNeeded() { + final int embeddedDisplayContentsSize = mEmbeddedDisplayContents.size(); + // If there is any embedded display which is re-parented to this window, we need to + // notify all windows in the embedded display about the location change. + if (embeddedDisplayContentsSize != 0) { + for (int i = embeddedDisplayContentsSize - 1; i >= 0; i--) { + final DisplayContent edc = mEmbeddedDisplayContents.valueAt(i); + edc.notifyLocationInParentDisplayChanged(); + } + } + // If this window is in a embedded display which is re-parented to another window, + // we may need to update its correct on-screen location. + final DisplayContent dc = getDisplayContent(); + if (dc.getParentWindow() == null) { + return; + } + + final Point offset = dc.getLocationInParentDisplay(); + if (mLastReportedDisplayOffset.equals(offset)) { + return; + } + + mLastReportedDisplayOffset.set(offset.x, offset.y); + try { + mClient.locationInParentDisplayChanged(mLastReportedDisplayOffset); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to update offset from DisplayContent", e); + } + } + /** * Called when the insets state changed. */ @@ -3584,6 +3628,7 @@ class WindowState extends WindowContainer implements WindowManagerP } pw.println(prefix + "isOnScreen=" + isOnScreen()); pw.println(prefix + "isVisible=" + isVisible()); + pw.println(prefix + "mEmbeddedDisplayContents=" + mEmbeddedDisplayContents); } @Override @@ -4209,7 +4254,8 @@ class WindowState extends WindowContainer implements WindowManagerP return; } - //TODO (multidisplay): Accessibility is supported only for the default display. + // TODO (multidisplay): Accessibility supported only for the default display and + // embedded displays if (mWmService.mAccessibilityController != null && (getDisplayId() == DEFAULT_DISPLAY || getDisplayContent().getParentWindow() != null)) { mWmService.mAccessibilityController.onSomeWindowResizedOrMovedLocked(); @@ -4580,6 +4626,28 @@ class WindowState extends WindowContainer implements WindowManagerP return mLayoutSeq != -1; } + /** + * Add the DisplayContent of the embedded display which is re-parented to this window to + * the list of embedded displays. + * + * @param dc DisplayContent of the re-parented embedded display. + * @return {@code true} if the giving DisplayContent is added, {@code false} otherwise. + */ + boolean addEmbeddedDisplayContent(DisplayContent dc) { + return mEmbeddedDisplayContents.add(dc); + } + + /** + * Remove the DisplayContent of the embedded display which is re-parented to this window from + * the list of embedded displays. + * + * @param dc DisplayContent of the re-parented embedded display. + * @return {@code true} if the giving DisplayContent is removed, {@code false} otherwise. + */ + boolean removeEmbeddedDisplayContent(DisplayContent dc) { + return mEmbeddedDisplayContents.remove(dc); + } + /** * Updates the last inset values to the current ones. */ @@ -5002,6 +5070,10 @@ class WindowState extends WindowContainer implements WindowManagerP tempRegion.recycle(); } + boolean hasTapExcludeRegion() { + return mTapExcludeRegionHolder != null && !mTapExcludeRegionHolder.isEmpty(); + } + @Override public boolean isInputMethodTarget() { return getDisplayContent().mInputMethodTarget == this; diff --git a/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java b/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java index 83aa620b9573..a7586810a824 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import android.graphics.Point; import android.graphics.Rect; import android.os.Bundle; import android.os.ParcelFileDescriptor; @@ -42,6 +43,10 @@ public class TestIWindow extends IWindow.Stub { DisplayCutout.ParcelableWrapper displayCutout) throws RemoteException { } + @Override + public void locationInParentDisplayChanged(Point offset) throws RemoteException { + } + @Override public void insetsChanged(InsetsState insetsState) throws RemoteException { } -- GitLab From 4c16eb501216996e54e6feb3d84e186748f71270 Mon Sep 17 00:00:00 2001 From: Amin Shaikh Date: Tue, 21 May 2019 17:02:27 -0400 Subject: [PATCH 010/620] For 1 sim devices, hide signal empty state For multi sim device, continue to show all mobile cell indicators in the status bar. Fixes: 133402064 Test: mp sysuig; demo mode Change-Id: Iddac804488028388c9d4f8eedbfe14b424473d98 --- .../android/settingslib/graph/SignalDrawable.java | 15 +++++++++++---- .../statusbar/phone/StatusBarSignalPolicy.java | 11 +++++++++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java index 98eb57300f0b..7ce713b2f296 100644 --- a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java +++ b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java @@ -60,6 +60,7 @@ public class SignalDrawable extends DrawableWrapper { private static final int NUM_LEVEL_MASK = 0xff << NUM_LEVEL_SHIFT; private static final int STATE_SHIFT = 16; private static final int STATE_MASK = 0xff << STATE_SHIFT; + private static final int STATE_EMPTY = 1; private static final int STATE_CUT = 2; private static final int STATE_CARRIER_CHANGE = 3; @@ -203,7 +204,7 @@ public class SignalDrawable extends DrawableWrapper { drawDotAndPadding(x - dotSpacing * 2, y, dotPadding, dotSize, 0); canvas.drawPath(mCutoutPath, mTransparentPaint); canvas.drawPath(mForegroundPath, mForegroundPaint); - } else if (isInState(STATE_CUT)) { + } else if (isInState(STATE_CUT) || isInState(STATE_EMPTY)) { float cut = (CUT_OUT * width); mCutoutPath.moveTo(width - padding, height - padding); mCutoutPath.rLineTo(-cut, 0); @@ -268,13 +269,14 @@ public class SignalDrawable extends DrawableWrapper { /** * Returns whether this drawable is in the specified state. * - * @param state must be one of {@link #STATE_CARRIER_CHANGE} or {@link #STATE_CUT} + * @param state must be one of {@link #STATE_CARRIER_CHANGE}, {@link #STATE_CUT}, + * or {@link #STATE_EMPTY}. */ private boolean isInState(int state) { return getState(getLevel()) == state; } - public static int getState(int fullState) { + private static int getState(int fullState) { return (fullState & STATE_MASK) >> STATE_SHIFT; } @@ -286,7 +288,12 @@ public class SignalDrawable extends DrawableWrapper { /** Returns the state representing empty mobile signal with the given number of levels. */ public static int getEmptyState(int numLevels) { - return getState(0, numLevels, true); + return (STATE_EMPTY << STATE_SHIFT) | (numLevels << NUM_LEVEL_SHIFT); + } + + /** Returns whether fullState corresponds to the empty state. */ + public static boolean isEmptyState(int fullState) { + return getState(fullState) == STATE_EMPTY; } /** Returns the state representing carrier change with the given number of levels. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java index 8286d26e9999..2558d77bbb48 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java @@ -22,6 +22,7 @@ import android.telephony.SubscriptionInfo; import android.util.ArraySet; import android.util.Log; +import com.android.settingslib.graph.SignalDrawable; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.statusbar.policy.NetworkController; @@ -186,8 +187,8 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba // Visibility of the data type indicator changed boolean typeChanged = statusType != state.typeId && (statusType == 0 || state.typeId == 0); - - state.visible = statusIcon.visible && !mBlockMobile; + state.visible = statusIcon.visible && !mBlockMobile + && !isInEmptyStateOnSingleSimDevice(subId, statusIcon.icon); state.strengthId = statusIcon.icon; state.typeId = statusType; state.contentDescription = statusIcon.contentDescription; @@ -209,6 +210,12 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba } } + private boolean isInEmptyStateOnSingleSimDevice(int subId, int icon) { + return mMobileStates.size() == 1 + && mMobileStates.get(0).subId == subId + && SignalDrawable.isEmptyState(icon); + } + private MobileIconState getState(int subId) { for (MobileIconState state : mMobileStates) { if (state.subId == subId) { -- GitLab From c6dfd6c8b298cea5499ea25bb0a9c51988b23408 Mon Sep 17 00:00:00 2001 From: Robert Snoeberger Date: Thu, 23 May 2019 14:56:46 -0400 Subject: [PATCH 011/620] Adjust bubble clock to be easier to read - lines thicker by 1 dp - same color extraction as analog clock face Fixes: 133188865 Test: visual Change-Id: Ic44546bbc76d945ba3dc307c6cea25af27fac3db --- .../SystemUI/res-keyguard/drawable/bubble_hour_hand.xml | 2 +- .../SystemUI/res-keyguard/drawable/bubble_minute_hand.xml | 2 +- .../com/android/keyguard/clock/BubbleClockController.java | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml b/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml index 65f7a0e29843..8c611f61dc23 100644 --- a/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml +++ b/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml @@ -6,5 +6,5 @@ + android:strokeWidth="3"/> diff --git a/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml b/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml index 95b4b1ad0b9b..27bc43638f06 100644 --- a/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml +++ b/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml @@ -6,5 +6,5 @@ + android:strokeWidth="3"/> diff --git a/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java index 61a6952cacac..bd1e64a5f1c6 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java @@ -170,9 +170,10 @@ public class BubbleClockController implements ClockPlugin { return; } final int length = colorPalette.length; - final int color = colorPalette[Math.max(0, length - 3)]; - mLockClock.setTextColor(color); - mAnalogClock.setClockColors(color, color); + final int primaryColor = colorPalette[Math.max(0, length - 2)]; + final int secondaryColor = colorPalette[Math.max(0, length - 5)]; + mLockClock.setTextColor(primaryColor); + mAnalogClock.setClockColors(secondaryColor, primaryColor); } @Override -- GitLab From e1651c5df2e88b69184d2f35f6e65d4032cc6d25 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Thu, 23 May 2019 12:57:29 -0700 Subject: [PATCH 012/620] Polish dynamic privacy wake-up Fixes: 132828641 Test: power button multiple time with dynamic privacy Change-Id: Ibf257eb0bd11d6fec9ec46d297d60d70265f6a66 --- .../systemui/statusbar/phone/NotificationPanelView.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 9da75b64acdf..e03767f2cdf2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -3081,6 +3081,11 @@ public class NotificationPanelView extends PanelView implements @Override public void onDynamicPrivacyChanged() { + // Do not request animation when pulsing or waking up, otherwise the clock wiill be out + // of sync with the notification panel. + if (mLinearDarkAmount != 0) { + return; + } mAnimateNextPositionUpdate = true; } -- GitLab From 2cda9f6b96a867546556f033eb8afae93ab3582c Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Thu, 23 May 2019 15:36:11 -0700 Subject: [PATCH 013/620] Adb command to authenticate earlier Test: adb shell setprop persist.sysui.wake_performs_auth 1 Fixes: 133447404 Change-Id: I89a5a97c1b5dc7664f65241c535cc18ee6264e65 --- .../src/com/android/systemui/statusbar/phone/StatusBar.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 4e8f58413303..e4c946bd0c0c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -3890,6 +3890,8 @@ public class StatusBar extends SystemUI implements DemoMode, private boolean mAnimateWakeup; private boolean mAnimateScreenOff; private boolean mIgnoreTouchWhilePulsing; + private boolean mWakeLockScreenPerformsAuth = SystemProperties.getBoolean( + "persist.sysui.wake_performs_auth", false); @Override public String toString() { @@ -3945,7 +3947,9 @@ public class StatusBar extends SystemUI implements DemoMode, mStatusBarWindow.suppressWakeUpGesture(true); } - boolean passiveAuthInterrupt = reason == DozeLog.PULSE_REASON_NOTIFICATION; + boolean passiveAuthInterrupt = reason == DozeLog.PULSE_REASON_NOTIFICATION || ( + reason == DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN + && mWakeLockScreenPerformsAuth); // Set the state to pulsing, so ScrimController will know what to do once we ask it to // execute the transition. The pulse callback will then be invoked when the scrims // are black, indicating that StatusBar is ready to present the rest of the UI. -- GitLab From 5877c020e5d7653c39c9e2f11ccbc7048564e474 Mon Sep 17 00:00:00 2001 From: Amin Shaikh Date: Fri, 24 May 2019 10:26:05 -0400 Subject: [PATCH 014/620] Update lockscreen animations for all themes. Resource overlays cannot reference resources that only exist within the overlay package, so using resources with aapt tags is not possible. Breaking up these resources to not use appt tags is fairly error prone, so instead we're including lockscreen animations for all themes in SystemUI and selecting them at runtime. Fixes: 118757654 Test: make; change themes and view animations Change-Id: I4b489bbe94dbb4b351470e7d00bf4be6a5da5280 --- core/res/res/values/symbols.xml | 5 - .../SystemUI}/res/anim/lock_in.xml | 0 .../SystemUI/res/anim/lock_in_circular.xml | 327 +++++++++++ packages/SystemUI/res/anim/lock_in_filled.xml | 190 +++++++ .../SystemUI/res/anim/lock_in_rounded.xml | 336 +++++++++++ .../SystemUI}/res/anim/lock_lock.xml | 29 +- .../SystemUI/res/anim/lock_lock_circular.xml | 320 +++++++++++ .../SystemUI/res/anim/lock_lock_filled.xml | 215 +++++++ .../SystemUI/res/anim/lock_lock_rounded.xml | 314 ++++++++++ .../SystemUI}/res/anim/lock_scanning.xml | 0 .../res/anim/lock_scanning_circular.xml | 537 ++++++++++++++++++ .../res/anim/lock_scanning_filled.xml | 339 +++++++++++ .../res/anim/lock_scanning_rounded.xml | 531 +++++++++++++++++ .../SystemUI}/res/anim/lock_to_error.xml | 0 .../res/anim/lock_to_error_circular.xml | 276 +++++++++ .../res/anim/lock_to_error_filled.xml | 188 ++++++ .../res/anim/lock_to_error_rounded.xml | 270 +++++++++ .../SystemUI}/res/anim/lock_unlock.xml | 0 .../res/anim/lock_unlock_circular.xml | 298 ++++++++++ .../SystemUI/res/anim/lock_unlock_filled.xml | 204 +++++++ .../SystemUI/res/anim/lock_unlock_rounded.xml | 292 ++++++++++ .../systemui/statusbar/phone/LockIcon.java | 81 ++- 22 files changed, 4720 insertions(+), 32 deletions(-) rename {core/res => packages/SystemUI}/res/anim/lock_in.xml (100%) create mode 100644 packages/SystemUI/res/anim/lock_in_circular.xml create mode 100644 packages/SystemUI/res/anim/lock_in_filled.xml create mode 100644 packages/SystemUI/res/anim/lock_in_rounded.xml rename {core/res => packages/SystemUI}/res/anim/lock_lock.xml (95%) create mode 100644 packages/SystemUI/res/anim/lock_lock_circular.xml create mode 100644 packages/SystemUI/res/anim/lock_lock_filled.xml create mode 100644 packages/SystemUI/res/anim/lock_lock_rounded.xml rename {core/res => packages/SystemUI}/res/anim/lock_scanning.xml (100%) create mode 100644 packages/SystemUI/res/anim/lock_scanning_circular.xml create mode 100644 packages/SystemUI/res/anim/lock_scanning_filled.xml create mode 100644 packages/SystemUI/res/anim/lock_scanning_rounded.xml rename {core/res => packages/SystemUI}/res/anim/lock_to_error.xml (100%) create mode 100644 packages/SystemUI/res/anim/lock_to_error_circular.xml create mode 100644 packages/SystemUI/res/anim/lock_to_error_filled.xml create mode 100644 packages/SystemUI/res/anim/lock_to_error_rounded.xml rename {core/res => packages/SystemUI}/res/anim/lock_unlock.xml (100%) create mode 100644 packages/SystemUI/res/anim/lock_unlock_circular.xml create mode 100644 packages/SystemUI/res/anim/lock_unlock_filled.xml create mode 100644 packages/SystemUI/res/anim/lock_unlock_rounded.xml diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 3a348f05de48..b9e707fb7d25 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2271,11 +2271,6 @@ - - - - - diff --git a/core/res/res/anim/lock_in.xml b/packages/SystemUI/res/anim/lock_in.xml similarity index 100% rename from core/res/res/anim/lock_in.xml rename to packages/SystemUI/res/anim/lock_in.xml diff --git a/packages/SystemUI/res/anim/lock_in_circular.xml b/packages/SystemUI/res/anim/lock_in_circular.xml new file mode 100644 index 000000000000..d1e98db6e0e3 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_in_circular.xml @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/anim/lock_in_filled.xml b/packages/SystemUI/res/anim/lock_in_filled.xml new file mode 100644 index 000000000000..4cde38d4f0dc --- /dev/null +++ b/packages/SystemUI/res/anim/lock_in_filled.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/anim/lock_in_rounded.xml b/packages/SystemUI/res/anim/lock_in_rounded.xml new file mode 100644 index 000000000000..7c8cf9d7b525 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_in_rounded.xml @@ -0,0 +1,336 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/res/res/anim/lock_lock.xml b/packages/SystemUI/res/anim/lock_lock.xml similarity index 95% rename from core/res/res/anim/lock_lock.xml rename to packages/SystemUI/res/anim/lock_lock.xml index 3b8c4855fc8f..3167e7cd616d 100644 --- a/core/res/res/anim/lock_lock.xml +++ b/packages/SystemUI/res/anim/lock_lock.xml @@ -1,17 +1,18 @@ - + diff --git a/packages/SystemUI/res/anim/lock_lock_circular.xml b/packages/SystemUI/res/anim/lock_lock_circular.xml new file mode 100644 index 000000000000..81694407b640 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_lock_circular.xml @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/anim/lock_lock_filled.xml b/packages/SystemUI/res/anim/lock_lock_filled.xml new file mode 100644 index 000000000000..017c3299c3b2 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_lock_filled.xml @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/anim/lock_lock_rounded.xml b/packages/SystemUI/res/anim/lock_lock_rounded.xml new file mode 100644 index 000000000000..fc4545c4323d --- /dev/null +++ b/packages/SystemUI/res/anim/lock_lock_rounded.xml @@ -0,0 +1,314 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/res/res/anim/lock_scanning.xml b/packages/SystemUI/res/anim/lock_scanning.xml similarity index 100% rename from core/res/res/anim/lock_scanning.xml rename to packages/SystemUI/res/anim/lock_scanning.xml diff --git a/packages/SystemUI/res/anim/lock_scanning_circular.xml b/packages/SystemUI/res/anim/lock_scanning_circular.xml new file mode 100644 index 000000000000..9468213562f4 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_scanning_circular.xml @@ -0,0 +1,537 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/anim/lock_scanning_filled.xml b/packages/SystemUI/res/anim/lock_scanning_filled.xml new file mode 100644 index 000000000000..83ac8ad205f7 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_scanning_filled.xml @@ -0,0 +1,339 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/anim/lock_scanning_rounded.xml b/packages/SystemUI/res/anim/lock_scanning_rounded.xml new file mode 100644 index 000000000000..983549230b54 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_scanning_rounded.xml @@ -0,0 +1,531 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/res/res/anim/lock_to_error.xml b/packages/SystemUI/res/anim/lock_to_error.xml similarity index 100% rename from core/res/res/anim/lock_to_error.xml rename to packages/SystemUI/res/anim/lock_to_error.xml diff --git a/packages/SystemUI/res/anim/lock_to_error_circular.xml b/packages/SystemUI/res/anim/lock_to_error_circular.xml new file mode 100644 index 000000000000..9a847232d80b --- /dev/null +++ b/packages/SystemUI/res/anim/lock_to_error_circular.xml @@ -0,0 +1,276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/anim/lock_to_error_filled.xml b/packages/SystemUI/res/anim/lock_to_error_filled.xml new file mode 100644 index 000000000000..6eb7425d9002 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_to_error_filled.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/anim/lock_to_error_rounded.xml b/packages/SystemUI/res/anim/lock_to_error_rounded.xml new file mode 100644 index 000000000000..46043caf8862 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_to_error_rounded.xml @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/res/res/anim/lock_unlock.xml b/packages/SystemUI/res/anim/lock_unlock.xml similarity index 100% rename from core/res/res/anim/lock_unlock.xml rename to packages/SystemUI/res/anim/lock_unlock.xml diff --git a/packages/SystemUI/res/anim/lock_unlock_circular.xml b/packages/SystemUI/res/anim/lock_unlock_circular.xml new file mode 100644 index 000000000000..5fc8576e6687 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_unlock_circular.xml @@ -0,0 +1,298 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/anim/lock_unlock_filled.xml b/packages/SystemUI/res/anim/lock_unlock_filled.xml new file mode 100644 index 000000000000..2bf2d89e5c12 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_unlock_filled.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/anim/lock_unlock_rounded.xml b/packages/SystemUI/res/anim/lock_unlock_rounded.xml new file mode 100644 index 000000000000..7c558513c7f9 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_unlock_rounded.xml @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index 61a394092761..c7f778d37914 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.phone; import static com.android.systemui.Dependency.MAIN_HANDLER_NAME; import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT; +import android.annotation.IntDef; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Configuration; @@ -30,6 +31,8 @@ import android.graphics.drawable.Drawable; import android.hardware.biometrics.BiometricSourceType; import android.os.Handler; import android.os.Trace; +import android.provider.Settings; +import android.text.TextUtils; import android.util.AttributeSet; import android.view.ViewGroup; import android.view.accessibility.AccessibilityNodeInfo; @@ -50,6 +53,9 @@ import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardMonitor; import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + import javax.inject.Inject; import javax.inject.Named; @@ -247,11 +253,11 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange mIsFaceUnlockState = state == STATE_SCANNING_FACE; if (state != mLastState || mLastDozing != mDozing || mLastPulsing != mPulsing || mLastScreenOn != mScreenOn || mLastBouncerVisible != mBouncerVisible || force) { - int iconAnimRes = getAnimationResForTransition(mLastState, state, mLastPulsing, - mPulsing, mLastDozing, mDozing, mBouncerVisible); - boolean isAnim = iconAnimRes != -1; + @LockAnimIndex final int lockAnimIndex = getAnimationIndexForTransition(mLastState, + state, mLastPulsing, mPulsing, mLastDozing, mDozing, mBouncerVisible); + boolean isAnim = lockAnimIndex != -1; - int iconRes = isAnim ? iconAnimRes : getIconForState(state); + int iconRes = isAnim ? getThemedAnimationResId(lockAnimIndex) : getIconForState(state); if (iconRes != mIconRes) { mIconRes = iconRes; @@ -272,7 +278,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange @Override public void onAnimationEnd(Drawable drawable) { if (getDrawable() == animation && state == getState() - && doesAnimationLoop(iconAnimRes)) { + && doesAnimationLoop(lockAnimIndex)) { animation.start(); } else { Trace.endAsyncSection("LockIcon#Animation", state); @@ -360,11 +366,11 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange return iconRes; } - private boolean doesAnimationLoop(int resourceId) { - return resourceId == com.android.internal.R.anim.lock_scanning; + private boolean doesAnimationLoop(@LockAnimIndex int lockAnimIndex) { + return lockAnimIndex == SCANNING; } - private int getAnimationResForTransition(int oldState, int newState, + private int getAnimationIndexForTransition(int oldState, int newState, boolean wasPulsing, boolean pulsing, boolean wasDozing, boolean dozing, boolean bouncerVisible) { @@ -380,19 +386,68 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange boolean turningOn = wasDozing && !dozing && !mWasPulsingOnThisFrame; if (isError) { - return com.android.internal.R.anim.lock_to_error; + return ERROR; } else if (justUnlocked) { - return com.android.internal.R.anim.lock_unlock; + return UNLOCK; } else if (justLocked) { - return com.android.internal.R.anim.lock_lock; + return LOCK; } else if (newState == STATE_SCANNING_FACE && bouncerVisible) { - return com.android.internal.R.anim.lock_scanning; + return SCANNING; } else if ((nowPulsing || turningOn) && newState != STATE_LOCK_OPEN) { - return com.android.internal.R.anim.lock_in; + return LOCK_IN; } return -1; } + @Retention(RetentionPolicy.SOURCE) + @IntDef({ERROR, UNLOCK, LOCK, SCANNING, LOCK_IN}) + @interface LockAnimIndex {} + private static final int ERROR = 0, UNLOCK = 1, LOCK = 2, SCANNING = 3, LOCK_IN = 4; + private static final int[][] LOCK_ANIM_RES_IDS = new int[][] { + { + R.anim.lock_to_error, + R.anim.lock_unlock, + R.anim.lock_lock, + R.anim.lock_scanning, + R.anim.lock_in, + }, + { + R.anim.lock_to_error_circular, + R.anim.lock_unlock_circular, + R.anim.lock_lock_circular, + R.anim.lock_scanning_circular, + R.anim.lock_in_circular, + }, + { + R.anim.lock_to_error_filled, + R.anim.lock_unlock_filled, + R.anim.lock_lock_filled, + R.anim.lock_scanning_filled, + R.anim.lock_in_filled, + }, + { + R.anim.lock_to_error_rounded, + R.anim.lock_unlock_rounded, + R.anim.lock_lock_rounded, + R.anim.lock_scanning_rounded, + R.anim.lock_in_rounded, + }, + }; + + private int getThemedAnimationResId(@LockAnimIndex int lockAnimIndex) { + final String setting = TextUtils.emptyIfNull( + Settings.Secure.getString(getContext().getContentResolver(), + Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES)); + if (setting.contains("com.android.theme.icon_pack.circular.android")) { + return LOCK_ANIM_RES_IDS[1][lockAnimIndex]; + } else if (setting.contains("com.android.theme.icon_pack.filled.android")) { + return LOCK_ANIM_RES_IDS[2][lockAnimIndex]; + } else if (setting.contains("com.android.theme.icon_pack.rounded.android")) { + return LOCK_ANIM_RES_IDS[3][lockAnimIndex]; + } + return LOCK_ANIM_RES_IDS[0][lockAnimIndex]; + } + private int getState() { KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext); if (mTransientBiometricsError) { -- GitLab From 2c890ee61bafb786bb9a5db43d97a0a993ce42f7 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Mon, 20 May 2019 19:16:43 -0700 Subject: [PATCH 015/620] Introduced KeyguardBypassController Since we will need to use bypass in various locations, we consolidated the bypass controller into a reusable singleton controller Bug: 130327302 Test: atest SystemUITests Change-Id: Ifa737869a99e53e7b6a1a1fb3ef96411fabfea79 --- .../phone/BiometricUnlockController.java | 38 +++--------- .../phone/KeyguardBypassController.kt | 59 +++++++++++++++++++ .../systemui/statusbar/phone/StatusBar.java | 4 +- .../phone/BiometricsUnlockControllerTest.java | 7 +-- 4 files changed, 71 insertions(+), 37 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 4d4818d51414..6159f6ca7d1e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -39,7 +39,6 @@ import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.statusbar.NotificationMediaManager; -import com.android.systemui.tuner.TunerService; import java.io.PrintWriter; @@ -102,20 +101,10 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { */ private static final float BIOMETRIC_COLLAPSE_SPEEDUP_FACTOR = 1.1f; - /** - * If face unlock dismisses the lock screen or keeps user on keyguard by default on this device. - */ - private final boolean mFaceDismissesKeyguardByDefault; - - /** - * If face unlock dismisses the lock screen or keeps user on keyguard for the current user. - */ - @VisibleForTesting - protected boolean mFaceDismissesKeyguard; - private final NotificationMediaManager mMediaManager; private final PowerManager mPowerManager; private final Handler mHandler; + private final KeyguardBypassController mKeyguardBypassController; private PowerManager.WakeLock mWakeLock; private final KeyguardUpdateMonitor mUpdateMonitor; private final UnlockMethodCache mUnlockMethodCache; @@ -133,16 +122,6 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { private boolean mPendingShowBouncer; private boolean mHasScreenTurnedOnSinceAuthenticating; - private final TunerService.Tunable mFaceDismissedKeyguardTunable = new TunerService.Tunable() { - @Override - public void onTuningChanged(String key, String newValue) { - int defaultValue = mFaceDismissesKeyguardByDefault ? 1 : 0; - mFaceDismissesKeyguard = Settings.Secure.getIntForUser(mContext.getContentResolver(), - Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD, - defaultValue, KeyguardUpdateMonitor.getCurrentUser()) != 0; - } - }; - private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class); public BiometricUnlockController(Context context, @@ -152,12 +131,12 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { StatusBar statusBar, UnlockMethodCache unlockMethodCache, Handler handler, KeyguardUpdateMonitor keyguardUpdateMonitor, - TunerService tunerService) { + KeyguardBypassController keyguardBypassController) { this(context, dozeScrimController, keyguardViewMediator, scrimController, statusBar, - unlockMethodCache, handler, keyguardUpdateMonitor, tunerService, + unlockMethodCache, handler, keyguardUpdateMonitor, context.getResources() .getInteger(com.android.internal.R.integer.config_wakeUpDelayDoze), - context.getResources().getBoolean(R.bool.config_faceAuthDismissesKeyguard)); + keyguardBypassController); } @VisibleForTesting @@ -168,9 +147,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { StatusBar statusBar, UnlockMethodCache unlockMethodCache, Handler handler, KeyguardUpdateMonitor keyguardUpdateMonitor, - TunerService tunerService, int wakeUpDelay, - boolean faceDismissesKeyguard) { + KeyguardBypassController keyguardBypassController) { mContext = context; mPowerManager = context.getSystemService(PowerManager.class); mUpdateMonitor = keyguardUpdateMonitor; @@ -186,9 +164,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { mUnlockMethodCache = unlockMethodCache; mHandler = handler; mWakeUpDelay = wakeUpDelay; - mFaceDismissesKeyguardByDefault = faceDismissesKeyguard; - tunerService.addTunable(mFaceDismissedKeyguardTunable, - Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD); + mKeyguardBypassController = keyguardBypassController; } public void setStatusBarKeyguardViewManager( @@ -392,7 +368,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { boolean unlockingAllowed = mUpdateMonitor.isUnlockingWithBiometricAllowed(); boolean deviceDreaming = mUpdateMonitor.isDreaming(); boolean faceStayingOnKeyguard = biometricSourceType == BiometricSourceType.FACE - && !mFaceDismissesKeyguard; + && !mKeyguardBypassController.getBypassEnabled(); if (!mUpdateMonitor.isDeviceInteractive()) { if (!mStatusBarKeyguardViewManager.isShowing()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt new file mode 100644 index 000000000000..5b5eb767e184 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.phone + +import android.content.Context +import android.provider.Settings +import com.android.internal.annotations.VisibleForTesting +import com.android.keyguard.KeyguardUpdateMonitor +import com.android.systemui.R +import com.android.systemui.tuner.TunerService + +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class KeyguardBypassController { + + @Inject + constructor(context: Context, + tunerService: TunerService) { + val dismissByDefault = if (context.getResources().getBoolean( + R.bool.config_faceAuthDismissesKeyguard)) 1 else 0 + tunerService.addTunable( + object : TunerService.Tunable { + override fun onTuningChanged(key: String?, newValue: String?) { + bypassEnabled = Settings.Secure.getIntForUser( + context.contentResolver, + Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD, + dismissByDefault, + KeyguardUpdateMonitor.getCurrentUser()) != 0 + } + }, Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD) + } + + @VisibleForTesting + constructor(bypassEnabled: Boolean) { + this.bypassEnabled = bypassEnabled; + } + + /** + * If face unlock dismisses the lock screen or keeps user on keyguard for the current user. + */ + var bypassEnabled: Boolean = false + private set +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 4e8f58413303..75a820c8cc08 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -386,6 +386,8 @@ public class StatusBar extends SystemUI implements DemoMode, PulseExpansionHandler mPulseExpansionHandler; @Inject NotificationWakeUpCoordinator mWakeUpCoordinator; + @Inject + KeyguardBypassController mKeyguardBypassController; // expanded notifications protected NotificationPanelView mNotificationPanel; // the sliding/resizing panel within the notification window @@ -1229,7 +1231,7 @@ public class StatusBar extends SystemUI implements DemoMode, mBiometricUnlockController = new BiometricUnlockController(mContext, mDozeScrimController, keyguardViewMediator, mScrimController, this, UnlockMethodCache.getInstance(mContext), - new Handler(), mKeyguardUpdateMonitor, Dependency.get(TunerService.class)); + new Handler(), mKeyguardUpdateMonitor, mKeyguardBypassController); mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this, getBouncerContainer(), mNotificationPanel, mBiometricUnlockController, mStatusBarWindow.findViewById(R.id.lock_icon_container)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java index d2d294bf8d37..fdc2cd3483ca 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java @@ -71,8 +71,6 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { @Mock private UnlockMethodCache mUnlockMethodCache; @Mock - private TunerService mTunerService; - @Mock private Handler mHandler; private BiometricUnlockController mBiometricUnlockController; @@ -192,9 +190,8 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { TestableBiometricUnlockController(boolean faceDismissesKeyguard) { super(mContext, mDozeScrimController, mKeyguardViewMediator, mScrimController, mStatusBar, mUnlockMethodCache, - mHandler, mUpdateMonitor, mTunerService, 0 /* wakeUpDelay */, - faceDismissesKeyguard); - mFaceDismissesKeyguard = faceDismissesKeyguard; + mHandler, mUpdateMonitor, 0 /* wakeUpDelay */, + new KeyguardBypassController(faceDismissesKeyguard)); } } } -- GitLab From c7bbf0d6c5b5542617aee991382660c542508f05 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 25 May 2019 22:56:11 -0700 Subject: [PATCH 016/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I4ddafac61524cd495fbbd2a73c19c4a9337bbcaa --- core/res/res/values-af/strings.xml | 32 +++++----- core/res/res/values-am/strings.xml | 42 ++++++++----- core/res/res/values-ar/strings.xml | 44 ++++++++------ core/res/res/values-as/strings.xml | 51 +++++++++------- core/res/res/values-az/strings.xml | 46 +++++++++------ core/res/res/values-b+sr+Latn/strings.xml | 44 ++++++++------ core/res/res/values-be/strings.xml | 50 +++++++++------- core/res/res/values-bg/strings.xml | 42 ++++++++----- core/res/res/values-bn/strings.xml | 54 ++++++++++------- core/res/res/values-bs/strings.xml | 46 +++++++++------ core/res/res/values-ca/strings.xml | 52 +++++++++------- core/res/res/values-cs/strings.xml | 42 ++++++++----- core/res/res/values-da/strings.xml | 46 +++++++++------ core/res/res/values-de/strings.xml | 42 ++++++++----- core/res/res/values-el/strings.xml | 32 +++++----- core/res/res/values-en-rAU/strings.xml | 32 +++++----- core/res/res/values-en-rCA/strings.xml | 32 +++++----- core/res/res/values-en-rGB/strings.xml | 32 +++++----- core/res/res/values-en-rIN/strings.xml | 32 +++++----- core/res/res/values-en-rXC/strings.xml | 32 +++++----- core/res/res/values-es-rUS/strings.xml | 42 ++++++++----- core/res/res/values-es/strings.xml | 46 +++++++++------ core/res/res/values-et/strings.xml | 44 ++++++++------ core/res/res/values-eu/strings.xml | 54 ++++++++++------- core/res/res/values-fa/strings.xml | 54 ++++++++++------- core/res/res/values-fi/strings.xml | 42 ++++++++----- core/res/res/values-fr-rCA/strings.xml | 48 +++++++++------ core/res/res/values-fr/strings.xml | 64 +++++++++++--------- core/res/res/values-gl/strings.xml | 68 ++++++++++++--------- core/res/res/values-gu/strings.xml | 42 ++++++++----- core/res/res/values-hi/strings.xml | 72 +++++++++++++---------- core/res/res/values-hr/strings.xml | 42 ++++++++----- core/res/res/values-hu/strings.xml | 42 ++++++++----- core/res/res/values-hy/strings.xml | 48 +++++++++------ core/res/res/values-in/strings.xml | 34 +++++------ core/res/res/values-is/strings.xml | 42 ++++++++----- core/res/res/values-it/strings.xml | 34 +++++------ core/res/res/values-iw/strings.xml | 51 +++++++++------- core/res/res/values-ja/strings.xml | 46 +++++++++------ core/res/res/values-ka/strings.xml | 42 ++++++++----- core/res/res/values-kk/strings.xml | 44 ++++++++------ core/res/res/values-km/strings.xml | 46 +++++++++------ core/res/res/values-kn/strings.xml | 32 +++++----- core/res/res/values-ko/strings.xml | 42 ++++++++----- core/res/res/values-ky/strings.xml | 48 +++++++++------ core/res/res/values-lo/strings.xml | 44 ++++++++------ core/res/res/values-lt/strings.xml | 42 ++++++++----- core/res/res/values-lv/strings.xml | 42 ++++++++----- core/res/res/values-mk/strings.xml | 46 +++++++++------ core/res/res/values-ml/strings.xml | 53 +++++++++-------- core/res/res/values-mn/strings.xml | 42 ++++++++----- core/res/res/values-mr/strings.xml | 55 +++++++++-------- core/res/res/values-ms/strings.xml | 42 ++++++++----- core/res/res/values-my/strings.xml | 42 ++++++------- core/res/res/values-nb/strings.xml | 42 ++++++++----- core/res/res/values-ne/strings.xml | 44 ++++++++------ core/res/res/values-nl/strings.xml | 48 +++++++++------ core/res/res/values-or/strings.xml | 53 +++++++++-------- core/res/res/values-pa/strings.xml | 42 ++++++++----- core/res/res/values-pl/strings.xml | 44 ++++++++------ core/res/res/values-pt-rBR/strings.xml | 48 +++++++++------ core/res/res/values-pt-rPT/strings.xml | 42 ++++++++----- core/res/res/values-pt/strings.xml | 48 +++++++++------ core/res/res/values-ro/strings.xml | 42 ++++++++----- core/res/res/values-ru/strings.xml | 48 +++++++++------ core/res/res/values-si/strings.xml | 32 +++++----- core/res/res/values-sk/strings.xml | 42 ++++++++----- core/res/res/values-sl/strings.xml | 44 ++++++++------ core/res/res/values-sq/strings.xml | 44 ++++++++------ core/res/res/values-sr/strings.xml | 44 ++++++++------ core/res/res/values-sv/strings.xml | 44 ++++++++------ core/res/res/values-sw/strings.xml | 52 +++++++++------- core/res/res/values-ta/strings.xml | 67 +++++++++++---------- core/res/res/values-te/strings.xml | 61 ++++++++++--------- core/res/res/values-th/strings.xml | 50 +++++++++------- core/res/res/values-tl/strings.xml | 50 +++++++++------- core/res/res/values-tr/strings.xml | 42 ++++++++----- core/res/res/values-uk/strings.xml | 52 +++++++++------- core/res/res/values-ur/strings.xml | 53 +++++++++-------- core/res/res/values-uz/strings.xml | 44 ++++++++------ core/res/res/values-vi/strings.xml | 48 +++++++++------ core/res/res/values-zh-rCN/strings.xml | 44 ++++++++------ core/res/res/values-zh-rHK/strings.xml | 44 ++++++++------ core/res/res/values-zh-rTW/strings.xml | 58 ++++++++++-------- core/res/res/values-zu/strings.xml | 32 +++++----- 85 files changed, 2272 insertions(+), 1578 deletions(-) diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 2bd7c8a847e2..a38c784e94ca 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -261,7 +261,7 @@ "Netwerkwaarskuwings" "Netwerk is beskikbaar" "VPN-status" - "Toesteladministrasie" + "Opletberigte van jou IT-admin af" "Opletberigte" "Kleinhandeldemonstrasie" "USB-verbinding" @@ -549,11 +549,11 @@ "Vingerafdrukikoon" - "bestuur gesigstawinghardeware" + "bestuur gesigslothardeware" "Laat program toe om metodes te benut om gesigtemplate vir gebruik by te voeg en uit te vee." - "gebruik gesigstawinghardeware" - "Laat die program toe om gesigstawinghardeware vir stawing te gebruik" - "Gesigstawing" + "gebruik gesigslothardeware" + "Laat die program toe om gesigslothardeware vir stawing te gebruik" + "Gesigslot" "Skryf jou gesig weer in" "Skryf asseblief jou gesig weer in om herkenning te verbeter" "Kon nie gesigdata akkuraat vasvang nie. Probeer weer." @@ -565,7 +565,7 @@ "Beweeg foon laer af." "Beweeg foon na links." "Beweeg foon na regs." - "Kyk na die skerm met jou oë oop." + "Kyk asseblief meer reguit na jou toestel." "Kan nie jou gesig sien nie Kyk na die foon." "Te veel beweging. Hou foon stil." "Skryf jou gesig asseblief weer in." @@ -579,15 +579,15 @@ "Kan nie gesig verifieer nie. Hardeware nie beskikbaar nie." - "Gesiguittelling is bereik. Probeer weer." + "Probeer gesigslot weer." "Kan nie nuwe gesigdata berg nie. Vee eers \'n ou een uit." - "Gesighandeling is gekanselleer" - "Gesigstawing is deur gebruiker gekanselleer" + "Gesighandeling is gekanselleer." + "Gebruiker het gesigslot gekanselleer." "Te veel pogings. Probeer later weer." - "Te veel pogings. Gesigstawing is gedeaktiveer." + "Te veel pogings. Gesigslot is gedeaktiveer." "Kan nie gesig verifieer nie. Probeer weer." - "Jy het nie gesigstawing opgestel nie" - "Gesigstawing word nie op hierdie toestel gesteun nie" + "Jy het nie gesigslot opgestel nie." + "Gesigslot word nie op hierdie toestel gesteun nie." "Gesig %d" @@ -648,6 +648,8 @@ "Laat die houer toe om aan diensverskafferdienste te verbind. Behoort nooit vir normale programme nodig te wees nie." "verkry toegang tot Moenie Steur Nie" "Laat die program toe om Moenie Steur Nie-opstelling te lees en skryf." + "begin kyk van toestemminggebruik" + "Laat die houer toe om die toestemminggebruik vir \'n program te begin. Behoort nooit vir normale programme nodig te wees nie." "Stel wagwoordreëls" "Beheer die lengte en die karakters wat in skermslotwagwoorde en -PIN\'e toegelaat word." "Monitor pogings om skerm te ontsluit" @@ -1355,7 +1357,7 @@ "Voer \'n fabriekterugstelling uit om Toetsraamwerkmodus te deaktiveer." "Vloeistof of vuilgoed in USB-poort" "USB-poort is outomaties gedeaktiveer. Tik om meer te wete te kom." - "Veilig om USB-poort te gebruik" + "OK om USB-poort te gebruik" "Foon bespeur nie meer vloeistowwe of vuilgoed nie." "Neem tans foutverslag …" "Deel foutverslag?" @@ -1898,9 +1900,7 @@ "Kyk vir opdatering" "Jy het nuwe boodskappe" "Maak SMS-program oop om te bekyk" - "Sommige funksies kan beperk wees" - "Tik om te ontsluit" - "Gebruikerdata is gesluit" + "Sommige funksies kan beperk wees" "Werkprofiel is gesluit" "Tik om werkprofiel te ontsluit" "Gekoppel aan %1$s" diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 44b58cfdbbf3..78b46ef1a86a 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -261,7 +261,7 @@ "የአውታረ መረብ ማንቂያዎች" "አውታረ መረብ ይገኛል" "የቪፒኤን ሁኔታ" - "የመሣሪያ አስተዳደር" + "ከእርስዎ አይቲ አስተዳዳሪ የመጡ ማንቂያዎች" "ማንቂያዎች" "የችርቻሮ ማሳያ" "የዩኤስቢ ግንኙነት" @@ -549,11 +549,15 @@ "የጣት አሻራ አዶ" - "የማረጋገጫ ሃርድዌር ፊትን ያስተዳድሩ" + + "መተግበሪያው ጥቅም ላይ እንዲውሉ የፊት ቅንብር ደንቦችን ለማከል እና ለመሰረዝ የሚያስችሉ ስልቶችን እንዲያስጀምር ያስችለዋል።" - "የፊት ማረጋገጫ ሃርድዌር ይጠቀሙ" - "መተግበሪያው የማረጋገጫ ሃርድዌር ለማረጋገጥ ሥራ እንዲጠቀም ያስችለዋል" - "በመልክ ማረጋገጥ" + + + + + + "የእርስዎን ፊት ዳግመኛ ያስመዝግቡ" "ማንነትን ለይቶ ማወቅን ለማሻሻል፣ እባክዎ የእርስዎን ፊት ዳግም ያስመዝግቡ" "ትክክለኛ የፊት ውሂብ ማንሳት አልተቻለም። እንደገና ይሞክሩ።" @@ -565,7 +569,7 @@ "ስልክን ወደ ታች ዝቅ ያድርጉ።" "ስልክን ወደ ግራ ያንቀሳቅሱ።" "ስልክን ወደ ቀኝ ያንቀሳቅሱ።" - "ዓይኖችዎ እንደተከፈቱ ማያ ገጹን ይመልከቱ።" + "እባክዎ መሣሪያዎን ይበልጥ በቀጥታ ይመልከቱ።" "የእርስዎን ፊት መመልከት አይችልም። ስልኩ ላይ ይመልከቱ።" "ከልክ በላይ ብዙ እንቅስቃሴ። ስልኩን ቀጥ አድርገው ይያዙት።" "እባክዎ ፊትዎን እንደገና ያስመዝግቡ" @@ -579,15 +583,20 @@ "መልክን ማረጋገጥ አይቻልም። ሃርድዌር የለም።" - "የፊት ማብቂያ ጊዜ ደርሷል። እንደገና ይሞክሩ።" + + "አዲስ የመልክ ውውሂብ ማስቀመጥ አልተቻለም። መጀመሪያ የድሮውን ይሰርዙት።" - "የመልክ ክወና ተሰርዟል" - "መልክን ማረጋገጥ በተጠቃሚ ተሰርዟል" + "የፊት ሥርዓተ ክወና ተሰርዟል።" + + "ከልክ በላይ ብዙ ሙከራዎች። በኋላ ላይ እንደገና ይሞክሩ።" - "በጣም ብዙ ሙከራዎች። የመልክ ማረጋገጫ ተሰናክሏል።" + + "ፊትን ማረጋገጥ አይቻልም። እንደገና ይሞክሩ።" - "የመልክ ማረጋገጫን አላቀናበሩም" - "የመልክ ማረጋገጫ መስጫ በዚህ መሣሪያ ላይ አይደገፍም።" + + + + "ፊት %d" @@ -648,6 +657,8 @@ "ያዢው የአገልግሎት አቅራቢ አገልግሎቶችን እንዲያስር ይፈቅድለታል። ለመደበኛ መተግበሪያዎች በጭራሽ ሊያስፈልግ አይገባም።" "አትረብሽን ድረስበት" "መተግበሪያው የአትረብሽ ውቅረትን እንዲያነብብ እና እንዲጸፍ ይፈቅዳል።" + "የእይታ ፈቃድ መጠቀምን መጀመር" + "ያዢው ለአንድ መተግበሪያ የፈቃድ አጠቃቀሙን እንዲያስጀምር ያስችለዋል። ለመደበኛ መተግበሪያዎች በጭራሽ ሊያስፈልግ አይገባም።" "የይለፍ ቃል ደንቦች አዘጋጅ" "በማያ ገጽ መቆለፊያ የይለፍ ቃሎች እና ፒኖች ውስጥ የሚፈቀዱ ቁምፊዎችን እና ርዝመታቸውን ተቆጣጠር።" "የማሳያ-ክፈት ሙከራዎችን ክትትል ያድርጉባቸው" @@ -1355,7 +1366,8 @@ "የመሞከሪያ ጥቅል ሁነታን ለማሰናከል የፋብሪካ ዳግም ቅንብርን ይሞክሩ።" "በዩኤስቢ ወደብ ውስጥ ፈሳሽ ወይም ፍርስራሽ" "የዩኤስቢ ወደብ በራስ-ሰር ተሰናክሏል። የበለጠ ለመረዳት መታ ያድርጉ።" - "የዩኤስቢ ወደቡን መጠቀም አደጋ የለውም" + + "ስልክ ከእንግዲህ ፈሳሽ ወይም ፍርስራሽ አላገኘም።" "የሳንካ ሪፖርትን በመውሰድ ላይ…" "የሳንካ ሪፖርት ይጋራ?" @@ -1898,9 +1910,7 @@ "ዝማኔ ካለ አረጋግጥ" "አዲስ መልዕክቶች አለዎት" "ለመመልከት የኤስኤምኤስ መተግበሪያ ይክፈቱ" - "አንዳንድ ተግባሮች የተገደቡ ሊሆኑ ይችላሉ" - "ለመክፈት መታ ያድርጉ" - "የተጠቃሚ ውሂብ ተቆልፏል" + "አንዳንድ ተግባሮች የተገደቡ ሊሆኑ ይችላሉ" "የስራ መገለጫ ተቆልፏል" "የስራ መገለጫውን እገዳ ለማንሳት መታ ያድርጉ" "ከ%1$s ጋር ተገናኝቷል" diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 8b409ca1db97..dfc316cbf4fe 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -273,7 +273,7 @@ "تنبيهات الشبكة" "الشبكة متوفرة" "حالة الشبكة الافتراضية الخاصة" - "إدارة الجهاز" + "التنبيهات من مشرف تكنولوجيا المعلومات" "التنبيهات" "عرض توضيحي لبائع التجزئة" "‏اتصال USB" @@ -561,11 +561,15 @@ "رمز بصمة الإصبع" - "إدارة أجهزة مصادقة الوجه" + + "السماح للتطبيق باستدعاء طرق لإضافة نماذج من الوجوه وحذفها" - "استخدام أجهزة مصادقة الوجه" - "السماح للتطبيق باستخدام أجهزة مصادقة الوجه" - "المصادقة بالوجه" + + + + + + "إعادة تسجيل وجهك" "لتحسين قدرة الجهاز على معرفة وجهك، يُرجى إعادة تسجيل الوجه." "تعذّر تسجيل بيانات دقيقة للوجه. حاول مرة أخرى." @@ -577,7 +581,7 @@ "يُرجى خفض الهاتف للأسفل." "يُرجى نقل الهاتف إلى اليمين." "يُرجى نقل الهاتف إلى اليسار." - "يُرجى النظر إلى الشاشة مع فتح عينيك." + "يُرجى النظر إلى جهازك مباشرة أكثر." "يتعذّر رؤية وجهك. يُرجى النظر إلى الهاتف." "حركة أكثر من اللازم يُرجى حمل بدون حركة." "يُرجى إعادة تسجيل وجهك." @@ -591,15 +595,20 @@ "يتعذّر التحقُّق من الوجه. الجهاز غير مُتاح." - "انتهت مهلة التعرُّف على الوجه. حاول مرة أخرى." + + "يتعذَّر تخزين بيانات الوجه الجديد. احذف الوجه القديم أولاً." - "تم إلغاء عملية مصادقة الوجه." - "ألغَى المستخدم مصادقة الوجه." + "تمّ إلغاء عملية مصادقة الوجه." + + "تمّ إجراء محاولات كثيرة. أعِد المحاولة لاحقًا." - "محاولات كثيرة جدًا. تم إيقاف مصادقة الوجه." + + "يتعذّر التحقق من الوجه. حاول مرة أخرى." - "لم يسبق لك إعداد مصادقة الوجه." - "لا تتوفّر إمكانية مصادقة الوجه على هذا الجهاز." + + + + "الوجه %d" @@ -660,6 +669,8 @@ "للسماح للمالك بالالتزام بخدمات مشغل شبكة الجوال. لن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية." "الوصول إلى إعداد \"عدم الإزعاج\"" "للسماح للتطبيق بقراءة تهيئة \"عدم الإزعاج\" وكتابتها." + "بدء استخدام إذن العرض" + "للسماح للمالك ببدء استخدام الإذن لأحد التطبيقات. ولن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية." "تعيين قواعد كلمة المرور" "للتحكم في الطول والأحرف المسموح بها في كلمات المرور وأرقام التعريف الشخصي في قفل الشاشة." "مراقبة محاولات إلغاء قفل الشاشة" @@ -1443,7 +1454,8 @@ "يمكنك إجراء إعادة ضبط على إعدادات المصنع لإيقاف وضع \"مفعِّل اختبار\"." "‏السوائل والشوائب في منفذ USB" "‏تمّ إيقاف منفذ USB تلقائيًا. انقُر لمعرفة المزيد من المعلومات." - "‏الأمان في استخدام منفذ USB" + + "لم يَعُد الهاتف يكتشف سوائل أو شوائب." "جارٍ الحصول على تقرير الخطأ…" "هل تريد مشاركة تقرير الخطأ؟" @@ -2010,7 +2022,7 @@ تم تحديد %1$d عناصر تم تحديد %1$d عنصرًا تم تحديد %1$d من العناصر - تم تحديد %1$d عنصر + تم تحديد عنصر واحد (%1$d) "غير مصنفة" "لقد عيَّنت أهمية هذه الإشعارات." @@ -2034,9 +2046,7 @@ "البحث عن تحديث" "لديك رسائل جديدة" "‏فتح تطبيق الرسائل القصيرة SMS للعرض" - "ربما تكون بعض الوظائف مُقيّدة." - "انقر لإلغاء القفل." - "تم قفل بيانات المستخدم." + "ربما تكون بعض الوظائف مُقيّدة." "تم قفل الملف الشخصي للعمل." "انقر لإلغاء قفل الملف الشخصي للعمل" "تم الاتصال بـ %1$s" diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index cf3745f66710..f9717034f7b5 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -261,7 +261,7 @@ "নেটৱৰ্ক সম্পৰ্কীয় সতৰ্কবাণী" "নেটৱৰ্ক উপলব্ধ" "ভিপিএনৰ স্থিতি" - "ডিভাইচৰ প্ৰশাসন" + "আপোনাৰ আইটি প্ৰশাসকৰ পৰা অহা সতৰ্কবাণী" "সতৰ্কবাণীসমূহ" "খুচুৰা ডেম\'" "ইউএছবি সংযোগ" @@ -549,11 +549,15 @@ "ফিংগাৰপ্ৰিণ্ট আইকন" - "মুখমণ্ডল সত্যাপন হাৰ্ডৱেৰ পৰিচালনা কৰক" + + "মুখমণ্ডলৰ টেম্প্লেট যোগ কৰাৰ বা মচাৰ পদ্ধতি কামত লগাবলৈ আহ্বান কৰিবলৈ এপটোক অনুমতি দিয়ে।" - "মুখমণ্ডল সত্যাপন হাৰ্ডৱেৰ ব্যৱহাৰ কৰক" - "বিশ্বাসযোগ্য়তা প্ৰমাণীকৰণৰ বাবে এপক মুখমণ্ডল সত্যাপন হাৰ্ডৱেৰ ব্য়ৱহাৰ কৰিবলৈ অনুমতি দিয়ে" - "মুখমণ্ডলৰ বিশ্বাসযোগ্যতাৰ প্ৰমাণীকৰণ" + + + + + + "আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ণ কৰক" "চিনাক্তকৰণৰ সুবিধাটো উন্নত কৰিবলৈ, অনুগ্ৰহ কৰি আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ন কৰক" "সঠিক মুখমণ্ডলৰ ডেটা কেপচাৰ নহ’ল। আকৌ চেষ্টা কৰক।" @@ -565,7 +569,7 @@ "ফ’নটো তললৈ নিয়ক" "ফ’নটো বাওঁফালে নিয়ক।" "ফ’নটো সোঁফালে নিয়ক।" - "আপোনাৰ চকু খোলা ৰাখি স্ক্ৰীণলৈ চাওক।" + "আপোনাৰ ডিভাইচটোলৈ অধিক পোনে পোনে চাওক।" "আপোনাৰ মুখমণ্ডল দেখা নাই। ফ’নটোলৈ চাওক।" "বেছি লৰচৰ কৰি আছে। ফ’নটো স্থিৰকৈ ধৰক।" "আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ন কৰক।" @@ -573,24 +577,26 @@ "একে ধৰণৰ হৈছে, অনুগ্ৰহ কৰি আপোনাৰ প’জটো সলনি কৰক।" "আপোনাৰ মূৰটো সামান্য কমকৈ ঘূৰাওক।" "আপোনাৰ মূৰটো সামান্য কমকৈ ঘূৰাওক।" - - - - - - + "আপোনাৰ মূৰটো সামান্য কমকৈ ঘূৰাওক।" + "আপোনাৰ মুখখন ঢাকি ৰখা বস্তুবোৰ আঁতৰাওক।" + "স্ক্ৰীণৰ একেবাৰে ওপৰৰ কাষত থকা ছেন্সৰটো চাফা কৰক।" "মুখমণ্ডল সত্যাপন কৰিব পৰা নগ’ল। হাৰ্ডৱেৰ নাই।" - "মুখমণ্ডল গ্ৰহণৰ সময়সীমা উকলি গৈছে। আকৌ চেষ্টা কৰক।" + + "নতুন মুখমণ্ডলৰ ডেটা জমা কৰিব পৰা নাই। প্ৰথমে পুৰণি এখন মচক।" - "মুখমণ্ডলৰ প্ৰক্ৰিয়া বাতিল কৰা হ’ল" - "ব্যৱহাৰকাৰীয়ে মুখমণ্ডল প্ৰমাণীকৰণ বাতিল কৰিছে" + "মুখমণ্ডলৰ প্ৰক্ৰিয়া বাতিল কৰা হ’ল।" + + "অত্যধিক ভুল প্ৰয়াস। কিছুসময়ৰ পাছত আকৌ চেষ্টা কৰক।" - "অতি বেছি প্ৰয়াস। মুখমণ্ডল প্ৰমাণীকৰণ অক্ষম কৰা হ’ল।" + + "মুখমণ্ডল সত্যাপন কৰিব পৰা নগ’ল। আকৌ চেষ্টা কৰক।" - "আপুনি মুখমণ্ডল প্ৰমাণীকৰণ ছেট আপ কৰা নাই" - "এই ডিভাইচটোত মুখমণ্ডল প্ৰমাণীকৰণ ব্যৱহাৰ কৰিব নোৱাৰি" + + + + "মুখমণ্ডল %d" @@ -651,6 +657,8 @@ "বাহক সেৱাৰ সৈতে সংযুক্ত হ\'বলৈ ধাৰকক অনুমতি দিয়ে। সাধাৰণ এপসমূহৰ বাবে সাধাৰণতে প্ৰয়োজন হ\'ব নালাগে।" "অসুবিধা নিদিব চাব পাৰে" "অসুবিধা নিদিবৰ কনফিগাৰেশ্বনক পঢ়িবলৈ আৰু সালসলনি কৰিবলৈ এপটোক অনুমতি দিয়ে।" + "চোৱাৰ অনুমতিৰ ব্যৱহাৰ আৰম্ভ কৰক" + "ধাৰকক কোনো এপৰ বাবে অনুমতিৰ ব্যৱহাৰ আৰম্ভ কৰিবলৈ দিয়ে। সাধাৰণ এপ্‌সমূহৰ বাবে কেতিয়াও প্ৰয়োজন হ’ব নালাগে।" "পাছৱর্ডৰ নিয়ম ছেট কৰক" "স্ক্ৰীণ লক পাছৱৰ্ড আৰু পিনৰ দৈর্ঘ্য আৰু কি কি আখৰ ব্যৱহাৰ কৰিব পাৰে তাক নিয়ন্ত্ৰণ কৰক।" "স্ক্ৰীণ আনলক কৰা প্ৰয়াসবোৰ পৰ্যবেক্ষণ কৰিব পাৰে" @@ -1358,7 +1366,8 @@ "টেষ্ট হাৰনেছ ম’ড অক্ষম কৰিবলৈ ফেক্টৰী ৰিছেট কৰক।" "ইউএছবি প’ৰ্টত তৰল বা ধূলি-মাকতি আছে" "ইউএছবি প’ৰ্ট স্বয়ংক্ৰিয়ভাৱে অক্ষম কৰা হয়। অধিক জানিবৰ বাবে টিপক।" - "ইউএছবি প’ৰ্ট ব্যৱহাৰ কৰিব পৰাকৈ নিৰাপদ" + + "ফ’নটোৱে তৰল বা ধূলি-মাকতি আৰু চিনাক্ত নকৰে।" "বাগ সম্পর্কীয় অভিযোগ গ্ৰহণ কৰি থকা হৈছে…" "বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিবনে?" @@ -1901,9 +1910,7 @@ "আপডে’ট আছে নেকি চাওক" "আপুনি নতুন বার্তা লাভ কৰিছে" "চাবলৈ এছএমএছ এপ্ খোলক" - "কিছুমান কৰ্মক্ষমতা সীমিত হ\'ব পাৰে" - "আনলক কৰিবলৈ টিপক" - "ব্য়ৱহাৰকাৰীৰ ডেটা লক হৈ আছে" + "কিছুমান কাৰ্যকাৰিতা সীমিত হ’ব পাৰে" "কৰ্মস্থানৰ প্ৰ’ফাইল লক হৈ আছে" "কৰ্মস্থানৰ প্ৰ’ফাইল আনলক কৰিবলৈ টিপক" "%1$sৰ সৈতে সংযুক্ত হৈ আছে" diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 29e453ffe452..6eac6fef15e8 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -261,7 +261,7 @@ "Şəbəkə siqnalları" "Şəbəkə əlçatandır" "VPN statusu" - "Cihaz administrasiyası" + "IT adminindən xəbərdarlıqlar" "Siqnallar" "Pərakəndə demo" "USB əlaqə" @@ -290,7 +290,7 @@ "SMS" "göndərin və SMS mesajlarına baxın" "<b>%1$s</b> tətbiqinə SMS mesajları göndərmək və onlara baxmaq icazəsi verilsin?" - "Depo" + "Yaddaş" "cihazınızda foto, media və fayllara daxil olun" "<b>%1$s</b> tətbiqinə cihazdakı foto, media və fayllara daxil olmaq icazəsi verilsin?" "Mikrofon" @@ -549,11 +549,15 @@ "Barmaq izi ikonası" - "üz identifikasiyası proqramını idarə edin" + + "Proqramdan istifadə üçün barmaq izi şablonlarını əlavə etmək və silmək məqsədilə üsullara müraciət etməyə imkan verir." - "üz identifikasiyası proqramından istifadə edin" - "Tətbiqin üz identifikasiyası proqramından identifikasiya zamanı istifadə etməsinə icazə verir" - "Üz identifikasiyası" + + + + + + "Üzünüzü yenidən qeydiyyatdan keçirin" "Tanınmanı təkmilləşdirmək üçün üzünüzü yenidən qeydiyyatdan keçirin" "Dəqiq üz datası əldə edilmədi. Yenidən cəhd edin." @@ -565,7 +569,7 @@ "Telefonu aşağı tutun." "Telefonu sola hərəkət etdirin." "Telefonu sağa hərəkət etdirin." - "Gözləriniz açıq şəkildə ekrana baxın." + "Birbaşa cihaza baxın." "Üzünüz görünmür. Telefona baxın." "Cihaz stabil deyil. Telefonu tərpətməyin." "Üzünüzü yenidən qeydiyyatdan keçirin." @@ -579,15 +583,20 @@ "Üz doğrulanmadı. Avadanlıq əlçatan deyil." - "Üz proqramı taymerinin vaxtı bitdi. Yenə cəhd edin." + + "Yeni üz datası saxlanmadı. Əvvəlcə köhnə olanı silin." - "Üz əməliyyatı ləğv edildi" - "Üz dorğulaması istifadəçi tərəfindən ləğv edildi" + "Üz əməliyyatı ləğv edildi." + + "Həddindən çox cəhd. Sonraya saxlayın." - "Həddindən çox cəhd. Üz doğrulaması deaktiv edildi." + + "Üz doğrulanmadı. Yenidən cəhd edin." - "Üz doğrulaması quraşdırmamısınız" - "Üz doğrulaması bu cihazda dəstəklənmir" + + + + "Üz %d" @@ -648,6 +657,8 @@ "Sahibinə operator xidmətləri ilə əlaqələndirməyə icazə verir. Normal tətbiqlər üçün heç vaxt lazım olmamalıdır." "\"Narahat Etməyin\" funksiyasına daxil olun" "Tətbiqə \"Narahat Etməyin\" konfiqurasiyasını oxumağa və yazmağa icazə verin." + "Baxış icazəsinin istifadəsinə başlayın" + "Sahibinə tətbiqin icazədən istifadəsinə başlamağa imkan verir. Adi tətbiqlər üçün heç vaxt tələb edilmir." "Parol qaydalarını təyin edin" "Ekran kilidinin parolu və PINlərində icazə verilən uzunluq və simvollara nəzarət edin." "Ekranı kiliddən çıxarmaq üçün edilən cəhdlərə nəzarət edin" @@ -1355,7 +1366,8 @@ "Test Rejimini deaktiv etmək üçün fabrika ayarlarına sıfırlayın." "USB portuna maye sızıb və ya qırılıb" "USB portu avtomatik deaktiv edildi. Ətraflı məlumat üçün klikləyin." - "USB portundan istifadə təhlükəsizdir" + + "Telefon artıq maye və ya nasazlığı aşkarlamayacaq." "Baq hesabatı verilir..." "Baq hesabatı paylaşılsın?" @@ -1801,7 +1813,7 @@ "OK" "Enerjiyə qənaət batareya istifadəsini artırmaq üçün arxa fon fəaliyyətini, bəzi vizual effektləri və batareyadan çox istifadə edən digər funksiyalarını deaktiv edir və ya məhdudlaşdırır. ""Ətraflı məlumat" "Enerjiyə qənaət batareya istifadəsini artırmaq üçün arxa fon fəaliyyətini, bəzi vizual effektləri və batareyadan çox istifadə edən digər funksiyalarını deaktiv edir və ya məhdudlaşdırır." - "Data istifadəsini azalatmaq üçün, Data Qanaəti bəzi tətbiqlərin arxafonda data göndərməsini və qəbulunun qarşısını alır. Hazırda istifadə etdiyiniz tətbiq dataya daxil ola bilər, lakin çox az hissəsini tez-tez edə bilər. Bu o deməkdir ki, məsələn, üzərinə tıklamadıqca o şəkillər göstərilməyəcək." + "Data istifadəsini azalatmaq üçün, Data Qanaəti bəzi tətbiqlərin arxafonda data göndərməsini və qəbulunun qarşısını alır. Hazırda istifadə etdiyiniz tətbiq dataya daxil ola bilər, lakin bunu tez-tez edə bilməz. Bu o deməkdir ki, məsələn, Siz üzərinə tıklamadıqca o şəkillər göstərilməyəcək." "Data Qənaəti aktiv edilsin?" "Aktivləşdirin" @@ -1898,9 +1910,7 @@ "Güncəlləməni yoxlayın" "Yeni mesajlarınız var" "Baxmaq üçün SMS tətbiqini açın" - "Bir neçə funksionallıq məhdudlaşdırıla bilər" - "Kilidi açmaq üçün tıklayın" - "İstifadəçi datası kilidlidir" + "Bəzi funksiyalar məhdudlaşdırıla bilər" "İş profili kilidlidir" "İş profilinin kilidini açmaq üçün tıklayın" "%1$s məhsuluna bağlandı" diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index e298556fac33..8f138d4c22aa 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -264,7 +264,7 @@ "Obaveštenja u vezi sa mrežom" "Mreža je dostupna" "Status VPN-a" - "Administriranje uređaja" + "Obaveštenja od IT administratora" "Obaveštenja" "Režim demonstracije za maloprodajne objekte" "USB veza" @@ -552,11 +552,15 @@ "Ikona otiska prsta" - "upravljanje hardv. za potvrdu identiteta pomoću lica" + + "Dozvoljava da aplikacija aktivira metode za dodavanje i brisanje šablona lica radi korišćenja." - "korišćenje hardv. za potvrdu identiteta pomoću lica" - "Dozvoljava da aplikacija koristi hardver za potvrdu identiteta pomoću lica" - "Potvrda identiteta licem" + + + + + + "Ponovo registrujte lice" "Da biste poboljšali prepoznavanje, ponovo registrujte lice" "Snimanje lica nije uspelo. Probajte ponovo." @@ -568,7 +572,7 @@ "Pomerite telefon nadole." "Pomerite telefon ulevo." "Pomerite telefon udesno." - "Pogledajte u ekran sa otvorenim očima." + "Gledajte pravo u uređaj." "Ne vidi se lice. Gledajte u telefon." "Mnogo se pomerate. Držite telefon mirno." "Ponovo registrujte lice." @@ -582,15 +586,20 @@ "Provera lica nije uspela. Hardver nije dostupan." - "Isteklo je vreme za proveru lica. Probajte ponovo." + + "Novi podaci o licu nisu sačuvani. Prvo izbrišete prethodne." - "Obrada lica je otkazana" - "Korisnik je otkazao potvrdu identiteta licem" + "Obrada lica je otkazana." + + "Previše pokušaja. Probajte ponovo kasnije." - "Previše pokušaja. Potvrda identiteta licem je onemogućena." + + "Provera lica nije uspela. Probajte ponovo." - "Niste podesili potvrdu identiteta licem" - "Prepoznavanje lica nije podržano na ovom uređaju" + + + + "Lice %d" @@ -651,6 +660,8 @@ "Dozvoljava vlasniku da se poveže sa uslugama operatera. Nikada ne bi trebalo da bude potrebno za obične aplikacije." "pristupaj podešavanju Ne uznemiravaj" "Dozvoljava aplikaciji da čita i upisuje konfiguraciju podešavanja Ne uznemiravaj." + "početak korišćenja dozvole za pregled" + "Dozvoljava vlasniku da započne korišćenje dozvole za aplikaciju. Nikada ne bi trebalo da bude potrebna za uobičajene aplikacije." "Podešavanje pravila za lozinku" "Kontroliše dužinu i znakove dozvoljene u lozinkama i PIN-ovima za zaključavanje ekrana." "Nadgledajte pokušaje otključavanja ekrana" @@ -1153,7 +1164,7 @@ "Izmenite pomoću" "Izmenite pomoću aplikacije %1$s" "Izmeni" - "Deljenje" + "Delite" "Delite pomoću aplikacije %1$s" "Deli" "Pošaljite pomoću:" @@ -1377,7 +1388,8 @@ "Obavite resetovanje na fabrička podešavanja da biste onemogućili režim probnog korišćenja." "Tečnost ili nečistoća u USB portu" "USB port je automatski isključen. Dodirnite da biste saznali više." - "Korišćenje USB porta je bezbedno" + + "Telefon više ne otkriva tečnost ili nečistoću." "Izveštaj o grešci se generiše…" "Želite li da podelite izveštaj o grešci?" @@ -1932,9 +1944,7 @@ "Potraži ažuriranje" "Imate nove poruke" "Otvorite aplikaciju za SMS da biste pregledali" - "Neke funkcije su možda ograničene" - "Dodirnite da biste otključali" - "Podaci korisnika su zaključani" + "Neke funkcije su možda ograničene" "Profil za Work je zaključan" "Dodirom otklj. profil za Work" "Povezano je sa proizvodom %1$s" diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 7c4060cd651f..e3a55024a5b9 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -159,7 +159,7 @@ "Схема аўтэнтыфікацыі сайта не падтрымліваецца." "Памылка аўтэнтыфікацыі." "Праверка сапраўднасці праз проксі-сервер скончылася няўдала." - "Немагчыма падлучыцца да сервера." + "Немагчыма падключыцца да сервера." "Немагчыма звязацца з серверам. Паўтарыце спробу пазней." "Час чакання злучэння з серверам скончыўся." "Старонка змяшчае зашмат перанакіраванняў сервера." @@ -267,7 +267,7 @@ "Абвесткі сеткі" "Сетка даступная" "Стан VPN" - "Адміністраванне прылады" + "Абвесткі ад IT-адміністратара" "Абвесткi" "Дэманстрацыйны рэжым для пунктаў продажу" "Падключэнне USB" @@ -555,11 +555,15 @@ "Значок адбіткаў пальцаў" - "кіраваць абсталяваннем для распазнавання твару" + + "Праграма зможа дадаваць і выдаляць шаблоны твару." - "карыстацца абсталяваннем для распазнавання твару" - "Праграма зможа выкарыстоўваць абсталяванне распазнавання твару для аўтэнтыфікацыі" - "Распазнаванне твару" + + + + + + "Паўтарыце рэгістрацыю твару" "Каб палепшыць распазнавальнасць, яшчэ раз выканайце рэгістрацыю твару" "Не атрымалася распазнаць твар. Паўтарыце спробу." @@ -571,7 +575,7 @@ "Перамясціце тэлефон ніжэй." "Перамясціце тэлефон улева." "Перамясціце тэлефон управа." - "Глядзіце на экран." + "Глядзіце прама на экран прылады." "Не відаць твару. Глядзіце на тэлефон." "Трымайце прыладу нерухома. Трымайце тэлефон роўна." "Паўтарыце рэгістрацыю твару." @@ -585,15 +589,20 @@ "Твар не спраўджаны. Абсталяванне недаступнае." - "Час чакання твару выйшаў. Паўтарыце спробу." + + "Новыя даныя пра твар не захаваны. Спачатку выдаліце старыя." - "Распазнаванне твару скасавана" - "Распазнаванне твару скасавана карыстальнікам" + "Распазнаванне твару скасавана." + + "Занадта шмат спроб. Паўтарыце спробу пазней." - "Занадта шмат спроб. Распазнаванне твару выключана." + + "Не ўдалося спраўдзіць твар. Паўтарыце спробу." - "Вы не наладзілі распазнаванне твару" - "На гэтай прыладзе распазнаванне твару не падтрымліваецца" + + + + "Твар %d" @@ -654,6 +663,8 @@ "Дазваляе ўладальніку ажыццяўляць прывязку да сэрвісаў аператара. Ніколі не павінна патрабавацца для звычайных праграм." "атрымліваць доступ да рэжыму «Не турбаваць»" "Дазваляе праграме чытаць і выконваць запіс у канфігурацыю рэжыму «Не турбаваць»." + "запусціць выкарыстанне дазволаў на прагляд" + "Дазваляе трымальніку запусціць выкарыстанне дазволаў праграмай. Не патрэбна для звычайных праграм." "Устанавіць правілы паролю" "Кіраваць даўжынёй і сімваламі, дазволенымі пры ўводзе пароляў і PIN-кодаў блакіроўкі экрана." "Сачыць за спробамі разблакіроўкі экрана" @@ -1110,7 +1121,7 @@ "%1$d:%2$02d:%3$02d" "Вылучыць усё" "Выразаць" - "Капіяваць" + "Капіраваць" "Не атрымалася скапіраваць у буфер абмену" "Уставіць" "Уставіць як звычайны тэкст" @@ -1328,7 +1339,7 @@ "Немагчыма падключыцца да Wi-Fi" " дрэннае падключэнне да Інтэрнэту." "Дазволіць падключэнне?" - "Праграма %1$s хоча падлучыцца да сеткі Wi-Fi %2$s" + "Праграма %1$s хоча падключыцца да сеткі Wifi %2$s" "Праграма" "Wi-Fi Direct" "Пачаць работу Wi-Fi Direct. Гэта адключыць кліента або хот-спот Wi-Fi." @@ -1399,7 +1410,8 @@ "Каб выключыць тэставы рэжым, скіньце налады да заводскіх значэнняў." "Вадкасць або смецце ў порце USB" "Порт USB аўтаматычна адключаны. Каб даведацца больш, націсніце тут." - "Можна бяспечна выкарыстоўваць порт USB" + + "Тэлефон выявіў, што вадкасці і смецця больш няма." "Стварэнне справаздачы пра памылку…" "Падзяліцца справаздачай пра памылку?" @@ -1640,7 +1652,7 @@ "Bluetooth-аўдыё" "Бесправадны дысплей" "Перадача" - "Падлучыцца да прылады" + "Падключыцца да прылады" "Трансліраваць экран на прыладу" "Пошук прылад..." "Налады" @@ -1966,9 +1978,7 @@ "Праверыць на наяўнасць абнаўленняў" "У вас ёсць новыя паведамленні" "Праглядзець праз праграму для SMS" - "Частка функц. можа быць абмеж." - "Краніце, каб разблакіраваць" - "Карыст. даныя заблакіраваны" + "Частка функц. можа быць абмеж." "Рабочы профіль заблакіраваны" "Кран., каб разбл. раб. профіль" "Падлучана да %1$s" diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 4663387d7412..0e8555429ada 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -261,7 +261,7 @@ "Сигнали за мрежата" "Налице е мрежа" "Състояние на VPN" - "Администриране на устройство" + "Сигнали от системния ви администратор" "Сигнали" "Демонстрационен режим за магазини" "USB връзка" @@ -549,11 +549,15 @@ "Икона за отпечатък" - "управление на хардуера за удостоверяване с лице" + + "Разрешава на прил. да извиква методи за добавяне и изтриване на лицеви шаблони за ползване" - "използване на хардуера за удостоверяване с лице" - "Разрешава на приложението при необходимост да използва хардуера за удостоверяване с лице" - "Удостоверяване с лице" + + + + + + "Регистрирайте отново лицето си" "С цел подобряване на разпознаването регистрирайте отново лицето си" "Лицето не бе заснето точно. Опитайте отново." @@ -565,7 +569,7 @@ "Преместете телефона по-ниско." "Преместете телефона наляво." "Преместете телефона надясно." - "Гледайте към екрана с отворени очи." + "Моля, гледайте точно към устройството си." "Лицето ви не се вижда. Погледнете към телефона." "Твърде много движение. Дръжте телефона неподвижно." "Моля, регистрирайте лицето си отново." @@ -579,15 +583,20 @@ "Лицето не може да се потвърди. Хардуерът не е налице." - "Времето за изчакване за лице изтече. Опитайте пак." + + "Не може да се запази ново лице. Първо изтрийте старо." - "Операцията с лице е анулирана" - "Удостоверяването с лице е анулирано от потребителя" + "Операцията с лице е анулирана." + + "Твърде много опити. Опитайте отново по-късно." - "Твърде много опити. Удостоверяването с лице е деактивирано." + + "Лицето не може да се потвърди. Опитайте отново." - "Не сте настроили удостоверяването с лице" - "Удостоверяването с лице не се поддържа на това устройство" + + + + "Лице %d" @@ -648,6 +657,8 @@ "Разрешава на собственика да се свързва с услуги на оператор. Нормалните приложения би трябвало никога да не се нуждаят от това." "достъп до „Не безпокойте“" "Предоставя на приложението достъп за четене и запис до конфигурацията на „Не безпокойте“." + "стартиране на прегледа на използваните разрешения" + "Разрешава на притежателя да стартира прегледа на използваните разрешения за дадено приложение. Нормалните приложения би трябвало никога да не се нуждаят от това." "Задаване на правила за паролата" "Контролира дължината и разрешените знаци за паролите и ПИН кодовете за заключване на екрана." "Наблюдаване на опитите за отключване на екрана" @@ -1355,7 +1366,8 @@ "Възстановете фабричните настройки, за да деактивирате режима за тестова среда." "Течност или замърсяване в USB порта" "USB портът е деактивиран автоматично. Докоснете, за да научите повече." - "Безопасно е да използвате USB порта" + + "Телефонът вече не открива течности или замърсяване." "Сигналът за програмна грешка се извлича…" "Да се сподели ли сигналът за програмна грешка?" @@ -1898,9 +1910,7 @@ "Проверка за актуализация" "Имате нови съобщения" "Преглед в приложението за SMS" - "Някои функции може да са огранич." - "Докоснете, за да отключите" - "Потр. данни са заключени" + "Някои функции може да са ограничени" "Служ. потр. профил е заключен" "Докоснете за откл. на служ. потр. профил" "Установена е връзка с %1$s" diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 32bb40bfaece..8f1cf57e4906 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -261,7 +261,7 @@ "নেটওয়ার্ক সক্রান্ত অ্যালার্ট" "নেটওয়ার্ক পাওয়া যাচ্ছে" "VPN এর স্থিতি" - "ডিভাইস প্রশাসন" + "আপনার আইটি অ্যাডমিনের সতর্কতা" "সতর্কতা" "খুচরা বিক্রয়ের ডেমো" "USB সংযোগ" @@ -549,11 +549,15 @@ "আঙ্গুলের ছাপ আইকন" - "ফেস যাচাইকরণ হার্ডওয়্যার পরিচালনা করুন" + + "ব্যবহার করার জন্য ফেস টেম্পলেট যোগ করা এবং মোছার পদ্ধতি গ্রহণ করতে অ্যাপটিকে অনুমতি দেয়৷" - "ফেস যাচাইকরণ হার্ডওয়্যার ব্যবহার করুন" - "প্রমাণীকরণের জন্য ফেস যাচাইকরণ হার্ডওয়্যার ব্যবহার করার অনুমতি অ্যাপটিকে দেয়" - "ফেস যাচাইকরণ" + + + + + + "আপনার ফেস আবার এনরোল করুন" "শনাক্তকরণের উন্নতি করতে আপনার ফেস আবার এনরোল করুন" "মুখের সঠিক ডেটা পাওয়া যায়নি। আবার চেষ্টা করুন।" @@ -565,7 +569,7 @@ "ফোন নিচে নামান।" "ফোনটি বাঁদিকে সরান।" "ফোনটি ডানদিকে সরান।" - "চোখ খুলে স্ক্রিনের দিকে তাকান।" + "সরাসরি ডিভাইসের দিকে তাকান।" "আপনার মুখ দেখা যাচ্ছে না। ফোনের দিকে তাকান।" "খুব বেশি নড়ছে। ফোনটি যাতে না কাঁপে সেইভাবে ধরুন।" "আপনার মুখের ছবি আবার নথিভুক্ত করুন।" @@ -579,15 +583,20 @@ "ফেস যাচাই করা যায়নি। হার্ডওয়্যার উপলভ্য নেই।" - "মুখের ছবি নেওয়ার সময় শেষ। আবার চেষ্টা করুন।" + + "নতুন ফেস ডেটা স্টোর করা যায়নি। প্রথমে পুরনোটি মুছে ফেলুন।" - "ফেস যাচাই করার প্রসেস বাতিল করা হয়েছে" - "ব্যবহারকারী মুখ শনাক্তকরণ প্রক্রিয়া বাতিল করেছেন" + "ফেস অপারেশন বাতিল করা হয়েছে৷" + + "অনেকবার চেষ্টা করা হয়েছে। পরে আবার চেষ্টা করুন।" - "অনেকবার চেষ্টা করেছেন। ফেস যাচাই করার ফিচারটি বন্ধ করা আছে।" + + "আপনার মুখ যাচাই করা যাচ্ছে না। আবার চেষ্টা করুন।" - "ফেস যাচাই করার প্রক্রিয়াটি সেট-আপ করেননি" - "এই ডিভাইসে ফেস যাচাই করা যাবে না" + + + + "%d ফেস" @@ -648,6 +657,8 @@ "কোনো পরিষেবা প্রদানকারীর সাথে যুক্ত হতে ধারককে অনুমতি দিন। সাধারণ অ্যাপ্লিকেশানের জন্য প্র্রয়োজন হয় না।" "\'বিরক্ত করবেন না\' -তে অ্যাক্সেস" "অ্যাপটিকে \'বিরক্ত করবেন না\' কনফিগারেশন পড়া এবং লেখার অনুমতি দেয়।" + "দেখার অনুমতি কাজে লাগানো শুরু করুন" + "কোনও অ্যাপের কোনও নির্দিষ্ট অনুমতির ব্যবহার শুরু করার ক্ষেত্রে হোল্ডারকে সাহায্য করে। সাধারণ অ্যাপের জন্য এটির পরিবর্তন হওয়ার কথা নয়।" "পাসওয়ার্ড নিয়মগুলি সেট করে" "স্ক্রিন লক করার পাসওয়ার্ডগুলিতে অনুমতিপ্রাপ্ত অক্ষর এবং দৈর্ঘ্য নিয়ন্ত্রণ করে৷" "স্ক্রিন আনলক করার প্রচেষ্টাগুলির উপরে নজর রাখুন" @@ -1070,7 +1081,7 @@ "%1$d:%2$02d:%3$02d" "সবগুলি বেছে নিন" "কাটুন" - "অনুলিপি" + "কপি করুন" "ক্লিপবোর্ডে কপি করা যায়নি" "পেস্ট করুন" "প্লেন টেক্সট হিসাবে পেস্ট করুন" @@ -1328,7 +1339,7 @@ "আপনার নতুন সিম কার্ড চালু করতে %1$s অ্যাপটি ডাউনলোড করুন" "অ্যাপ ডাউনলোড করুন" "নতুন সিম ঢোকানো হয়েছে" - "এটিকে সেট আপ করতে আলতো চাপুন" + "এটিকে সেট-আপ করতে আলতো চাপুন" "সময় সেট করুন" "তারিখ সেট করুন" "সেট করুন" @@ -1356,7 +1367,8 @@ "টেস্ট হারনেস মোড বন্ধ করতে ফ্যাক্টরি রিসেট করুন।" "ইউএসবি পোর্টে তরল পদার্থ অথবা ধুলো কণা" "ইউএসবি পোর্ট নিজে থেকে বন্ধ করা হবে। আরও জানতে ট্যাপ করুন।" - "ইউএসবি পোর্ট এখন ব্যবহার করতে পারবেন" + + "ফোন আর তরল পদার্থ এবং ধুলো কণা শনাক্ত করবে না।" "ত্রুটির প্রতিবেদন নেওয়া হচ্ছে..." "ত্রুটির প্রতিবেদন শেয়ার করবেন?" @@ -1385,15 +1397,15 @@ "ঠিক করতে ট্যাপ করুন" "%s ত্রুটিপূর্ণ। মেরামত করতে বেছে নিন।" "%s অসমর্থিত" - "এই ডিভাইসটি %s সমর্থন করে না। কোনো সমর্থিত ফর্ম্যাটে সেট আপ করতে আলতো চাপুন।" - "এই ডিভাইসটি %s সমর্থন করে না। কোনো সমর্থিত ফর্ম্যাটে সেট আপ করতে চাইলে বেছে নিন।" + "এই ডিভাইসটি %s সমর্থন করে না। কোনো সমর্থিত ফর্ম্যাটে সেট-আপ করতে আলতো চাপুন।" + "এই ডিভাইসটি %s সমর্থন করে না। কোনো সমর্থিত ফর্ম্যাটে সেট-আপ করতে চাইলে বেছে নিন।" "%s অপ্রত্যাশিতভাবে মুছে ফেলা হয়েছে" "মিডিয়া সরিয়ে নেওয়ার আগে সেটি সিস্টেম থেকে ইজেক্ট করুন, নাহলে কন্টেন্ট সেভ নাও হতে পারে" "%s সরানো হয়েছে" "কিছু ক্রিয়াকলাপ সঠিকভাবে কাজ নাও করতে পারে। নতুন স্টোরেজ লাগান।" "%s ইজেক্ট করা হচ্ছে" "সরাবেন না" - "সেট আপ করুন" + "সেট-আপ করুন" "বের করে নিন" "ঘুরে দেখুন" "আউটপুট পাল্টান" @@ -1472,7 +1484,7 @@ "ড্রাইভিং অ্যাপ চালু আছে" "ড্রাইভিং অ্যাপ বন্ধ করতে ট্যাপ করুন।" "টিথারিং বা হটস্পট সক্রিয় আছে" - "সেট আপ করার জন্য আলতো চাপুন৷" + "সেট-আপ করার জন্য আলতো চাপুন৷" "টিথারিং অক্ষম করা আছে" "বিশদ বিবরণের জন্য প্রশাসকের সাথে যোগাযোগ করুন" "ফিরুন" @@ -1899,9 +1911,7 @@ "আপডেট পাওয়া যাচ্ছে কিনা দেখুন" "আপনার নতুন মেসেজ আছে" "দেখার জন্য SMS অ্যাপ্লিকেশান খুলুন" - "কিছু ক্রিয়াকলাপ সীমিত হতে পারে" - "আনলক করতে আলতো চাপ দিন" - "ব্যবহারকারির ডেটা লক করা হয়েছে" + "কিছু ফাংশন হয়ত কাজ করবে না" "কর্মস্থলের প্রোফাইল লক করা আছে" "কর্মস্থলের প্রোফাইল আনলক করতে আলতো চাপ দিন" "%1$s এর সাথে সংযুক্ত হয়েছে" diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 9f653302baab..5ef243c53027 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -155,7 +155,7 @@ "Uredu" "Došlo je do greške na mreži." "Pronalaženje URL-a nije uspjelo." - "Shema za autentifikaciju stranice nije podržana." + "Šema za autentifikaciju stranice nije podržana." "Došlo je do greške prilikom autentifikacije." "Došlo je do greške prilikom autentifikacije preko proksi servera." "Povezivanje sa serverom nije uspjelo." @@ -169,7 +169,7 @@ "Pronalaženje traženog fajla nije uspjelo." "Trenutno se obrađuje previše zahtjeva. Pokušajte ponovo kasnije." "Greška u prijavi za račun %1$s" - "Sinhroniziranje" + "Sinhronizacija" "Nije moguće sinhronizirati" "Pokušali ste izbrisati previše sadržaja iz kategorije %s." "Pohrana tableta je puna. Izbrišite fajlove kako biste oslobodili prostor." @@ -264,7 +264,7 @@ "Mrežna upozorenja" "Mreža je dostupna" "Status VPN-a" - "Administracija uređaja" + "Upozorenja od IT administratora" "Upozorenja" "Prodajna demonstracija" "USB veza" @@ -552,11 +552,15 @@ "Ikona za otisak prsta" - "upravljanje hardverom za autentifikaciju licem" + + "Omogućava aplikaciji korištenje metoda za dodavanje i brisanje šablona lica za upotrebu." - "upotreba hardvera za autentifikaciju licem" - "Omogućava aplikaciji da za autentifikaciju koristi hardver za autentifikaciju licem" - "Autentifikacija licem" + + + + + + "Ponovo registrirajte lice" "Ponovo registrirajte lice da poboljšate prepoznavanje" "Lice nije snimljeno precizno. Pokušajte ponovo." @@ -568,7 +572,7 @@ "Spustite telefon." "Pomjerite telefon ulijevo." "Pomjerite telefon udesno." - "Gledajte u ekran i otvorite oči." + "Gledajte direktno u uređaj." "Ne vidi se lice. Gledajte u telefon." "Previše pokreta. Držite telefon mirno." "Ponovo registrirajte lice." @@ -582,15 +586,20 @@ "Nije moguće potvrditi lice. Hardver nije dostupan." - "Vrijeme za prepoznavanje je isteklo. Ponovite." + + "Nije moguće sačuvati nove podatke o licu. Prvo izbrišite stare." - "Prepoznavanje lica je otkazano" - "Korisnik je otkazao provjeru lica" + "Prepoznavanje lica je otkazano." + + "Previše pokušaja. Pokušajte ponovo kasnije." - "Previše pokušaja. Autentifikacija licem je onemogućena." + + "Nije moguće potvrditi lice. Pokušajte ponovo." - "Niste postavili autentifikaciju pomoću lica" - "Autentifikacija pomoću lica nije podržana na ovom uređaju" + + + + "Lice %d" @@ -651,6 +660,8 @@ "Omogućava vlasniku povezivanje sa uslugama operatera. Obično nije potrebno za obične aplikacije." "pristup načinu rada Ne ometaj" "Omogućava aplikaciji da čita i upisuje konfiguraciju načina rada Ne ometaj." + "pokrenuti korištenje odobrenja za pregled" + "Dozvoljava vlasniku da pokrene korištenje odobrenja za aplikaciju. Ne bi trebalo biti potrebno za obične aplikacije." "Postavljanje pravila za lozinke" "Kontrolira dužinu i znakove koji su dozvoljeni u lozinkama za zaključavanje ekrana i PIN-ovima." "Prati pokušaje otključavanja ekrana" @@ -1379,7 +1390,8 @@ "Izvršite vraćanje na fabričke postavke da onemogućite način rada okvira za testiranje." "Tečnost ili nečistoće u USB priključku" "USB priključak je automatski onemogućen. Dodirnite da saznate više." - "USB priključak je sada sigurno koristiti" + + "Telefon više ne detektira tečnost ili nečistoće." "Prijem izvještaja o grešci..." "Podijeliti izvještaj o grešci?" @@ -1934,9 +1946,7 @@ "Provjeri je li dostupno ažuriranje" "Imate nove poruke" "Otvorite SMS aplikaciju da biste pregledali poruke" - "Neke funkcije mogu biti ograničene" - "Dodirnite da biste otključali" - "Podaci korisnika su zaključani" + "Neke funkcije mogu biti ograničene" "Radni profil je zaključan" "Dodirnite da biste otključali radni profil" "Povezan na uređaj %1$s" diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 8fe0cbc54d02..2050de30a49d 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -261,7 +261,7 @@ "Alertes de xarxa" "Hi ha una xarxa disponible" "Estat de la VPN" - "Administració del dispositiu" + "Alertes de l\'administrador de TI" "Alertes" "Demostració per a botigues" "Connexió USB" @@ -549,11 +549,15 @@ "Icona d\'empremta digital" - "gestiona el maquinari d\'autenticació facial" + + "Permet que l\'aplicació afegeixi i suprimeixi plantilles de cares que es puguin fer servir." - "utilitza el maquinari d\'autenticació facial" - "Permet que l\'aplicació faci servir maquinari d\'autenticació facial" - "Autenticació facial" + + + + + + "Torna a registrar la cara" "Per millorar el reconeixement, torna a registrar la cara" "No es reconeix la teva cara. Torna-ho a provar." @@ -565,7 +569,7 @@ "Mou el telèfon més avall." "Mou el telèfon cap a l\'esquerra." "Mou el telèfon cap a la dreta." - "Mira la pantalla amb els ulls oberts." + "Mira més directament cap al dispositiu." "No se\'t veu la cara. Mira el telèfon." "Massa moviment. Subjecta bé el telèfon." "Torna a registrar la teva cara." @@ -579,15 +583,20 @@ "No es pot verificar la cara. Maquinari no disponible." - "S\'ha esgotat el temps d\'espera. Torna-ho a provar." + + "No es poden desar dades facials noves. Suprimeix-ne d\'antigues." - "S\'ha cancel·lat el reconeixement facial" - "L\'usuari ha cancel·lat l\'autenticació facial" + "S\'ha cancel·lat el reconeixement facial." + + "Massa intents. Torna-ho a provar més tard." - "Massa intents. S\'ha desactivat l\'autenticació facial." + + "No es pot verificar la cara. Torna-ho a provar." - "No has configurat l\'autenticació facial" - "L\'autenticació facial no és compatible amb el dispositiu." + + + + "Cara %d" @@ -633,11 +642,11 @@ "invoca l\'aplicació de configuració proporcionada per l\'operador" "Permet que el titular invoqui l\'aplicació de configuració proporcionada per l\'operador. No s\'hauria de necessitar mai per a les aplicacions normals." "conèixer les observacions sobre les condicions de la xarxa" - "Permet que una aplicació conegui les observacions sobre les condicions de la xarxa. No s\'ha de necessitar mai per a aplicacions normals." + "Permet que una aplicació conegui les observacions sobre les condicions de la xarxa. No s\'hauria de necessitar mai per a les aplicacions normals." "canviar el calibratge del dispositiu d\'entrada" - "Permet que l\'aplicació modifiqui els paràmetres de calibratge de la pantalla tàctil. No ha de ser mai necessari per a aplicacions normals." + "Permet que l\'aplicació modifiqui els paràmetres de calibratge de la pantalla tàctil. No s\'hauria de necessitar mai per a les aplicacions normals." "accedir als certificats de DRM" - "Permet que una aplicació proporcioni i utilitzi certificats DRM. No ha de ser mai necessari per a aplicacions normals." + "Permet que una aplicació proporcioni i utilitzi certificats DRM. No s\'hauria de necessitar mai per a les aplicacions normals." "rebre l\'estat de la transferència d\'Android Beam" "Permet que aquesta aplicació rebi informació sobre les transferències d\'Android Beam actuals." "suprimir els certificats DRM" @@ -648,6 +657,8 @@ "Permet que el propietari la vinculi a serveis de l\'operador de telefonia mòbil. No s\'hauria de necessitar mai per a les aplicacions normals." "accedir a No molestis" "Permet que l\'aplicació llegeixi la configuració No molestis i hi escrigui." + "comença a utilitzar el permís de visualització" + "Permet que un propietari comenci a utilitzar el permís amb una aplicació. No s\'hauria de necessitar mai per a les aplicacions normals." "Definir les normes de contrasenya" "Permet controlar la longitud i el nombre de caràcters permesos a les contrasenyes i als PIN del bloqueig de pantalla." "Supervisar els intents de desbloqueig de la pantalla" @@ -1355,7 +1366,8 @@ "Si vols desactivar el mode Agent de prova, restableix les dades de fàbrica." "Hi ha líquid o pols al port USB" "El port USB es desactiva automàticament. Toca per obtenir més informació." - "És segur utilitzar el port USB" + + "El telèfon ja no detecta líquids ni pols." "S\'està creant l\'informe d\'errors…" "Vols compartir l\'informe d\'errors?" @@ -1801,7 +1813,7 @@ "D\'acord" "Per tal de prolongar la durada de la bateria, el mode Estalvi de bateria desactiva o restringeix les activitats en segon pla, alguns efectes visuals i altres funcions que consumeixen molta energia. ""Més informació" "Per tal de prolongar la durada de la bateria, el mode Estalvi de bateria desactiva o restringeix les activitats en segon pla, alguns efectes visuals i altres funcions que consumeixen molta energia." - "Per reduir l\'ús de dades, la funció Economitzador de dades evita que determinades aplicacions enviïn o rebin dades en segon pla. L\'aplicació que estiguis fent servir podrà accedir a dades, però potser ho farà menys sovint. Això vol dir, per exemple, que les imatges no es mostraran fins que no les toquis." + "Per reduir l\'ús de dades, la funció Economitzador de dades evita que determinades aplicacions enviïn o rebin dades en segon pla. L\'aplicació que estiguis fent servir podrà accedir a les dades, però menys sovint. Això vol dir, per exemple, que les imatges no es mostraran fins que no les toquis." "Activar Economitzador de dades?" "Activa" @@ -1898,9 +1910,7 @@ "Cerca actualitzacions" "Tens missatges nous" "Obre l\'aplicació d\'SMS per veure\'ls" - "Algunes funcions es limitaran" - "Toca per desbloquejar" - "Dades d\'usuari bloquejades" + "Algunes funcions poden limitar-se" "Perfil professional bloquejat" "Toca per desbloquejar el perfil" "S\'ha connectat a %1$s" @@ -2026,6 +2036,6 @@ %s i %d fitxers més %s i %d fitxer més - "No es pot compartir directament" + "La compartició directa no està disponible" "Llista d\'aplicacions" diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index bd014f8b45ef..6feb718f42f5 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -267,7 +267,7 @@ "Síťová upozornění" "K dispozici je síť" "Stav sítě VPN" - "Administrace zařízení" + "Upozornění od vašeho administrátora IT" "Upozornění" "Prodejní ukázka" "Připojení USB" @@ -555,11 +555,15 @@ "Ikona otisku prstů" - "správa hardwaru k ověření obličeje" + + "Umožňuje aplikaci volat metody k přidání a smazání šablon obličeje, které budou použity." - "použití hardwaru k ověření obličeje" - "Umožňuje aplikaci provést ověření pomocí hardwaru k ověření obličeje" - "Ověřování obličejem" + + + + + + "Zaznamenejte obličej znovu" "Chcete-li rozpoznání zdokonalit, zaznamenejte obličej znovu" "Obličej se nepodařilo zachytit. Zkuste to znovu." @@ -571,7 +575,7 @@ "Umístěte telefon níž." "Přesuňte telefon vlevo." "Přesuňte telefon vpravo." - "Dívejte se na obrazovku s otevřenýma očima." + "Dívejte se přímo na zařízení." "Obličej není vidět. Podívejte se na telefon." "Příliš mnoho pohybu. Držte telefon nehybně." "Zaznamenejte obličej znovu." @@ -585,15 +589,20 @@ "Obličej nelze ověřit. Hardware není dostupný." - "Limit ověření obličeje vypršel. Zkuste to znovu." + + "Údaje o novém obličeji nelze uložit. Nejdřív vymažte starý." - "Operace snímání obličeje byla zrušena" - "Ověření obličejem zrušil uživatel" + "Operace snímání obličeje byla zrušena." + + "Příliš mnoho pokusů. Zkuste to později." - "Příliš mnoho pokusů. Ověření obličejem je vypnuto." + + "Obličej se nepodařilo ověřit. Zkuste to znovu." - "Ověření obličejem nemáte nastavené" - "Ověření obličejem na tomto zařízení není podporováno" + + + + "Obličej %d" @@ -654,6 +663,8 @@ "Umožňuje držiteli oprávnění navázat se na služby operátora. Běžné aplikace by toto oprávnění neměly nikdy požadovat." "přístup k režimu Nerušit" "Umožňuje aplikaci číst a zapisovat konfiguraci režimu Nerušit." + "zahájení zobrazení využití oprávnění" + "Umožňuje přístup zahájit využití oprávnění jiné aplikace. Běžné aplikace by toto oprávnění neměly nikdy požadovat." "Nastavit pravidla pro heslo" "Ovládání délky a znaků povolených v heslech a kódech PIN zámku obrazovky." "Sledovat pokusy o odemknutí obrazovky" @@ -1399,7 +1410,8 @@ "Chcete-li deaktivovat režim správce testů, restartujte zařízení do továrního nastavení." "Kapalina nebo nečistota v portu USB" "Port USB byl automaticky deaktivován. Klepnutím zobrazíte další informace." - "Port USB lze bezpečně použít" + + "Telefon již nedetekuje kapaliny ani nečistoty." "Vytváření zprávy o chybě…" "Sdílet zprávu o chybě?" @@ -1966,9 +1978,7 @@ "Zkontrolovat aktualizace" "Máte nové zprávy" "Zobrazíte je v aplikaci pro SMS" - "Funkce mohou být omezeny" - "Klepnutím je odemknete" - "Uživatelská data jsou uzamčena" + "Některé funkce mohou být omezeny" "Pracovní profil je uzamčen" "Klepnutím jej odemknete" "Připojeno k zařízení %1$s" diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 230067e745b2..ffa382b8849d 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -22,7 +22,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "b" "kB" - "Mb" + "MB" "GB" "Tb" "Pb" @@ -261,7 +261,7 @@ "Netværksunderretninger" "Tilgængeligt netværk" "VPN-status" - "Enhedsadministration" + "Underretninger fra din it-administrator" "Underretninger" "Demo til udstilling i butik" "USB-forbindelse" @@ -549,11 +549,15 @@ "Ikon for fingeraftryk" - "administrer hardware til ansigtsgenkendelse" + + "Tillader, at appen kan bruge metoder til at tilføje og slette ansigtsskabeloner." - "brug hardware til ansigtsgenkendelse" - "Tillader, at appen bruger ansigtsgenkendelseshardware til godkendelse" - "Ansigtsgodkendelse" + + + + + + "Registrer dit ansigt igen" "Registrer dit ansigt igen for at forbedre genkendelsen af det" "Der blev ikke registreret ansigtsdata. Prøv igen." @@ -565,7 +569,7 @@ "Sænk telefonen." "Flyt telefonen til venstre." "Flyt telefonen til højre." - "Kig på skærmen med åbne øjne." + "Kig mere direkte på din enhed." "Dit ansigt kan ikke registreres. Kig på telefonen." "Der er for meget bevægelse. Hold telefonen stille." "Registrer dit ansigt igen." @@ -579,15 +583,20 @@ "Ansigt ikke bekræftet. Hardware ikke tilgængelig." - "Ansigtsgenkendelse fik timeout. Prøv igen." + + "Der kan ikke gemmes flere nye ansigter. Slet et gammelt." - "Ansigtshandlingen blev annulleret" - "Ansigtsgodkendelsen blev annulleret af brugeren" + "Ansigtshandlingen blev annulleret." + + "Du har prøvet for mange gange. Prøv igen senere." - "For mange forsøg. Ansigtsgodkendelse er deaktiveret." + + "Ansigtet kan ikke genkendes. Prøv igen." - "Du har ikke konfigureret ansigtsgodkendelse" - "Ansigtsgodkendelse understøttes ikke på denne enhed" + + + + "Ansigt %d" @@ -648,6 +657,8 @@ "Tillader, at brugeren knytter sig til tjenester fra mobilselskabet. Dette bør aldrig være nødvendigt for almindelige apps." "have adgang til Forstyr ikke" "Giver appen tilladelse til at læse og redigere konfigurationen af Forstyr ikke." + "start brugen at tilladelsesvisning" + "Tillader, at brugeren kan bruge en tilladelse for en app. Dette bør aldrig være nødvendigt for almindelige apps." "Angiv regler for adgangskoder" "Tjek længden samt tilladte tegn i adgangskoder og pinkoder til skærmlåsen." "Overvåg forsøg på oplåsning af skærm" @@ -1355,7 +1366,8 @@ "Gendan fabriksindstillingerne for at deaktivere tilstanden Testsele." "Væske eller snavs i USB-porten" "USB-porten deaktiveres automatisk. Tryk for at få flere oplysninger." - "Det er sikkert at bruge USB-porten" + + "Telefonen registrerer ikke længere væske og snavs." "Opretter fejlrapport…" "Vil du dele fejlrapporten?" @@ -1665,7 +1677,7 @@ "Genvejen til hjælpefunktioner deaktiverede %1$s" "Hold begge lydstyrkeknapper nede i tre sekunder for at bruge %1$s" "Vælg, hvilken funktion du vil bruge, når du trykker på knappen Hjælpefunktioner:" - "Tryk på knappen Hjælpefunktioner, og hold fingeren nede for at skifte funktioner." + "Tryk på knappen Hjælpefunktioner, og hold fingeren nede for at skifte funktion." "Forstørrelse" "Nuværende bruger %1$s." "Skifter til %1$s…" @@ -1898,9 +1910,7 @@ "Søg efter opdatering" "Du har nye beskeder" "Åbn sms-appen for at se beskeden" - "Nogle funktioner er begrænsede" - "Tryk for at låse op" - "Brugerdataene er låst" + "Nogle funktioner er begrænsede" "Arbejdsprofilen er låst" "Tryk for at låse profilen op" "Tilsluttet %1$s" diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 1a94f73f5ed1..5e0ccd058d48 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -261,7 +261,7 @@ "Netzwerkwarnungen" "Netzwerk verfügbar" "VPN-Status" - "Geräteverwaltung" + "Benachrichtigungen zu wichtigen Updates von deinem IT-Administrator" "Warnmeldungen" "Demo für Einzelhandel" "USB-Verbindung" @@ -549,11 +549,15 @@ "Fingerabdruck-Symbol" - "Gesichtserkennungshardware verwalten" + + "Ermöglicht der App, Gesichtsvorlagen hinzuzufügen oder zu entfernen." - "Gesichtserkennungshardware verwenden" - "Ermöglicht der App, für die Authentifizierung Gesichtserkennungshardware zu verwenden" - "Gesichtserkennung" + + + + + + "Gesicht neu scannen lassen" "Für bessere Erkennung Gesicht neu scannen lassen" "Gesichtsdaten nicht gut erfasst. Erneut versuchen." @@ -565,7 +569,7 @@ "Beweg das Smartphone nach unten." "Beweg das Smartphone nach links." "Beweg das Smartphone nach rechts." - "Blick mit offenen Augen auf das Display." + "Bitte sieh direkt auf dein Gerät." "Gesicht wurde nicht erkannt. Blicke aufs Telefon." "Zu viel Unruhe. Halte das Smartphone ruhig." "Bitte registriere dein Gesicht noch einmal." @@ -579,15 +583,20 @@ "Gesicht nicht erkannt. Hardware nicht verfügbar." - "Erkennungszeit überschritten. Noch mal versuchen." + + "Kein Speicherplatz frei. Bitte erst ein Gesicht löschen." - "Gesichtserkennung abgebrochen" - "Gesichtserkennung vom Nutzer abgebrochen" + "Gesichtserkennung abgebrochen." + + "Zu viele Versuche, bitte später noch einmal versuchen" - "Zu viele Versuche. Die Gesichtserkennung wurde deaktiviert." + + "Gesichtsprüfung nicht möglich. Noch mal versuchen." - "Die Gesichtserkennung ist nicht eingerichtet" - "Gesichtserkennung wird auf diesem Gerät nicht unterstützt" + + + + "Gesicht %d" @@ -648,6 +657,8 @@ "Ermöglicht dem Inhaber die Bindung an Mobilfunkanbieter-Dienste. Für normale Apps sollte dies nicht erforderlich sein." "Auf \"Bitte nicht stören\" zugreifen" "Ermöglicht der App Lese- und Schreibzugriff auf die \"Bitte nicht stören\"-Konfiguration" + "Mit der Verwendung der Anzeigeberechtigung beginnen" + "Ermöglicht dem Inhaber, die Berechtigungsnutzung für eine App zu beginnen. Sollte für normale Apps nie benötigt werden." "Passwortregeln festlegen" "Zulässige Länge und Zeichen für Passwörter für die Displaysperre festlegen" "Versuche zum Entsperren des Displays überwachen" @@ -1355,7 +1366,8 @@ "Setz das Gerät auf die Werkseinstellungen zurück, um den Test-Harnischmodus zu deaktivieren." "Flüssigkeiten oder Fremdkörper im USB-Port" "Der USB-Port wird automatisch deaktiviert. Für weitere Informationen tippen." - "USB-Port kann wieder sicher verwendet werden" + + "Das Smartphone erkennt keine Flüssigkeiten oder Fremdkörper mehr." "Fehlerbericht wird abgerufen…" "Fehlerbericht teilen?" @@ -1898,9 +1910,7 @@ "Auf Updates prüfen" "Du hast neue Nachrichten" "Zum Ansehen SMS-App öffnen" - "Einige Funktionen sind evtl. eingeschränkt" - "Zum Entsperren tippen" - "Nutzerdaten gesperrt" + "Funktionen sind evtl. eingeschränkt" "Arbeitsprofil gesperrt" "Zum Entsperren des Arbeitsprofils tippen" "Verbunden mit %1$s" diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index fac3a6237924..192388dd5690 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -261,7 +261,7 @@ "Ειδοποιήσεις δικτύου" "Το δίκτυο είναι διαθέσιμο" "Κατάσταση VPN" - "Διαχείριση συσκευής" + "Ειδοποιήσεις από τον διαχειριστή IT" "Ειδοποιήσεις" "Επίδειξη λιανικής" "Σύνδεση USB" @@ -549,11 +549,11 @@ "Εικονίδιο δακτυλικών αποτυπωμάτων" - "διαχείριση υλικολογισμ. ελέγχου ταυτότ. προσώπου" + "διαχείριση εξοπλισμού Face Unlock" "Επιτρέπει στην εφαρμογή να επικαλείται μεθόδους προσθήκης/διαγραφής προτύπων για χρήση." - "χρήση υλικολογισμικού ελέγχου ταυτότητας προσώπου" - "Επιτρέπει στην εφαρμογή να χρησιμοποιεί υλικολογισμικό για έλεγχο ταυτότητας" - "Έλεγχος ταυτότητας προσώπου" + "χρήση εξοπλισμού Face Unlock" + "Επιτρέπει στην εφαρμογή να χρησιμοποιεί εξοπλισμό Face Unlock για έλεγχο ταυτότητας" + "Face Unlock" "Εγγράψτε ξανά το πρόσωπό σας" "Για να βελτιώσετε την αναγνώριση, εγγράψτε ξανά το πρόσωπό σας" "Αδύνατη λήψη ακριβών δεδομ. προσώπου. Επανάληψη." @@ -565,7 +565,7 @@ "Μετακινήστε πιο χαμηλά το τηλέφωνο." "Μετακινήστε το τηλέφωνο στα αριστερά." "Μετακινήστε το τηλέφωνο στα δεξιά." - "Κοιτάξτε την οθόνη με ανοικτά τα μάτια σας." + "Κοιτάξτε απευθείας τη συσκευή σας." "Δεν εντοπίστηκε το πρόσωπό σας. Δείτε το τηλέφωνο." "Πάρα πολλή κίνηση. Κρατήστε σταθερό το τηλέφωνο." "Καταχωρίστε ξανά το πρόσωπό σας." @@ -579,15 +579,15 @@ "Αδύν. επαλήθ. προσώπου. Μη διαθέσιμος εξοπλισμός." - "Λήξη χρονικού ορίου προσώπου. Δοκιμάστε ξανά." + "Δοκιμάστε ξανά το Face Unlock." "Η αποθήκ. νέων δεδομ. προσώπ. είναι αδύν. Διαγρ. ένα παλιό." - "Η λειτουργία προσώπου ακυρώθηκε" - "Ο έλεγχ. ταυτότ. προσώπου ακυρώθηκε από τον χρήστη" + "Η ενέργεια προσώπου ακυρώθηκε." + "Το Face Unlock ακυρώθηκε από τον χρήστη." "Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά αργότερα." - "Υπερβ. πολλές προσπάθειες. Ο έλεγχ. ταυτ. προσώπου απενεργ." + "Υπερβολικά πολλές προσπάθειες. Το Face Unlock απενεργοποιήθηκε." "Αδύνατη επαλήθευση του προσώπου. Επανάληψη." - "Δεν έχετε ρυθμίσει τον έλεγχο ταυτότητας προσώπου" - "Ο έλεγχος ταυτότητας προσώπου δεν υποστηρίζεται στη συσκευή" + "Δεν έχετε ρυθμίσει το Face Unlock." + "Το Face Unlock δεν υποστηρίζεται σε αυτήν τη συσκευή." "Πρόσωπο %d" @@ -648,6 +648,8 @@ "Δίνει στον κάτοχο τη δυνατότητα δέσμευσης σε υπηρεσίες εταιρείας κινητής τηλεφωνίας. Δεν απαιτείται ποτέ για κανονικές εφαρμογές." "έχει πρόσβαση στη λειτουργία \"Μην ενοχλείτε\"" "Επιτρέπει στην εφαρμογή την εγγραφή και τη σύνταξη διαμόρφωσης για τη λειτουργία \"Μην ενοχλείτε\"." + "έναρξη χρήσης άδειας προβολής" + "Επιτρέπει στον κάτοχο να ξεκινήσει τη χρήση της άδειας για μια εφαρμογή. Δεν απαιτείται ποτέ για κανονικές εφαρμογές." "Ορισμός κανόνων κωδικού πρόσβασης" "Ελέγξτε την έκταση και τους επιτρεπόμενους χαρακτήρες σε κωδικούς πρόσβασης κλειδώματος οθόνης και PIN." "Παρακολούθηση προσπαθειών ξεκλειδώματος οθόνης" @@ -1355,7 +1357,7 @@ "Εκτελέστε επαναφορά εργοστασιακών ρυθμίσεων για να απενεργοποιήσετε τη λειτουργία περιβάλλοντος δοκιμών." "Υγρασία ή ακαθαρσίες στη θύρα USB" "Η θύρα USB απενεργοποιείται αυτόματα. Πατήστε για να μάθετε περισσότερα." - "Μπορείτε να χρησιμοποιήσετε με ασφάλεια τη θύρα USB" + "Αποδεκτή η χρήση της θύρας USB" "Το τηλέφωνο δεν εντοπίζει πλέον υγρασία ή ακαθαρσίες." "Λήψη αναφοράς σφάλματος…" "Κοινή χρήση αναφοράς σφάλματος;" @@ -1898,9 +1900,7 @@ "Έλεγχος για ενημέρωση" "Έχετε νέα μηνύματα" "Άνοιγμα της εφαρμογής SMS για προβολή" - "Μερ. λειτ. ίσως είναι περιορ." - "Πατήστε για ξεκλείδωμα" - "Τα δεδομένα χρήστη κλειδώθηκαν" + "Ορισμ. λειτ. ίσως είναι περιορισμ." "Το προφίλ εργασίας κλειδώθηκε" "Πατήστε για ξεκλ. προφίλ εργ." "Συνδέθηκε με το %1$s" diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index ef92758c24ab..84f1fafa49be 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -261,7 +261,7 @@ "Network alerts" "Network available" "VPN status" - "Device administration" + "Alerts from your IT admin" "Alerts" "Retail demo" "USB connection" @@ -549,11 +549,11 @@ "Fingerprint icon" - "manage face authentication hardware" + "manage Face Unlock hardware" "Allows the app to invoke methods to add and delete facial templates for use." - "use face authentication hardware" - "Allows the app to use face authentication hardware for authentication" - "Face Authentication" + "use Face Unlock hardware" + "Allows the app to use Face Unlock hardware for authentication" + "Face unlock" "Re-enrol your face" "To improve recognition, please re-enrol your face" "Couldn’t capture accurate face data. Try again." @@ -565,7 +565,7 @@ "Move phone lower." "Move phone to the left." "Move phone to the right." - "Look at the screen with your eyes open." + "Please look more directly at your device." "Can’t see your face. Look at the phone." "Too much motion. Hold phone steady." "Please re-enroll your face." @@ -579,15 +579,15 @@ "Can’t verify face. Hardware not available." - "Face timeout reached. Try again." + "Try Face Unlock again." "Can’t store new face data. Delete an old one first." - "Face operation cancelled" - "Face authentication cancelled by user" + "Face operation cancelled." + "Face Unlock cancelled by user." "Too many attempts. Try again later." - "Too many attempts. Face authentication disabled." + "Too many attempts. Face Unlock disabled." "Can’t verify face. Try again." - "You haven’t set up face authentication" - "Face authentication is not supported on this device" + "You haven’t set up Face Unlock." + "Face Unlock is not supported on this device." "Face %d" @@ -648,6 +648,8 @@ "Allows the holder to bind to operator services. Should never be needed for normal apps." "access Do Not Disturb" "Allows the app to read and write Do Not Disturb configuration." + "start view permission usage" + "Allows the holder to start the permission usage for an app. Should never be needed for normal apps." "Set password rules" "Control the length and the characters allowed in screen lock passwords and PINs." "Monitor screen unlock attempts" @@ -1355,7 +1357,7 @@ "Perform a factory reset to disable Test Harness Mode." "Liquid or debris in USB port" "USB port is automatically disabled. Tap to learn more." - "Safe to use USB port" + "OK to use USB port" "Phone no longer detects liquid or debris." "Taking bug report…" "Share bug report?" @@ -1898,9 +1900,7 @@ "Check for update" "You have new messages" "Open SMS app to view" - "Some functionality may be limited" - "Tap to unlock" - "User data locked" + "Some functionality may be limited" "Work profile locked" "Tap to unlock work profile" "Connected to %1$s" diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index eb2b01256df7..19b64c82d693 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -261,7 +261,7 @@ "Network alerts" "Network available" "VPN status" - "Device administration" + "Alerts from your IT admin" "Alerts" "Retail demo" "USB connection" @@ -549,11 +549,11 @@ "Fingerprint icon" - "manage face authentication hardware" + "manage Face Unlock hardware" "Allows the app to invoke methods to add and delete facial templates for use." - "use face authentication hardware" - "Allows the app to use face authentication hardware for authentication" - "Face Authentication" + "use Face Unlock hardware" + "Allows the app to use Face Unlock hardware for authentication" + "Face unlock" "Re-enrol your face" "To improve recognition, please re-enrol your face" "Couldn’t capture accurate face data. Try again." @@ -565,7 +565,7 @@ "Move phone lower." "Move phone to the left." "Move phone to the right." - "Look at the screen with your eyes open." + "Please look more directly at your device." "Can’t see your face. Look at the phone." "Too much motion. Hold phone steady." "Please re-enroll your face." @@ -579,15 +579,15 @@ "Can’t verify face. Hardware not available." - "Face timeout reached. Try again." + "Try Face Unlock again." "Can’t store new face data. Delete an old one first." - "Face operation cancelled" - "Face authentication cancelled by user" + "Face operation cancelled." + "Face Unlock cancelled by user." "Too many attempts. Try again later." - "Too many attempts. Face authentication disabled." + "Too many attempts. Face Unlock disabled." "Can’t verify face. Try again." - "You haven’t set up face authentication" - "Face authentication is not supported on this device" + "You haven’t set up Face Unlock." + "Face Unlock is not supported on this device." "Face %d" @@ -648,6 +648,8 @@ "Allows the holder to bind to operator services. Should never be needed for normal apps." "access Do Not Disturb" "Allows the app to read and write Do Not Disturb configuration." + "start view permission usage" + "Allows the holder to start the permission usage for an app. Should never be needed for normal apps." "Set password rules" "Control the length and the characters allowed in screen lock passwords and PINs." "Monitor screen unlock attempts" @@ -1355,7 +1357,7 @@ "Perform a factory reset to disable Test Harness Mode." "Liquid or debris in USB port" "USB port is automatically disabled. Tap to learn more." - "Safe to use USB port" + "OK to use USB port" "Phone no longer detects liquid or debris." "Taking bug report…" "Share bug report?" @@ -1898,9 +1900,7 @@ "Check for update" "You have new messages" "Open SMS app to view" - "Some functionality may be limited" - "Tap to unlock" - "User data locked" + "Some functionality may be limited" "Work profile locked" "Tap to unlock work profile" "Connected to %1$s" diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index ef92758c24ab..84f1fafa49be 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -261,7 +261,7 @@ "Network alerts" "Network available" "VPN status" - "Device administration" + "Alerts from your IT admin" "Alerts" "Retail demo" "USB connection" @@ -549,11 +549,11 @@ "Fingerprint icon" - "manage face authentication hardware" + "manage Face Unlock hardware" "Allows the app to invoke methods to add and delete facial templates for use." - "use face authentication hardware" - "Allows the app to use face authentication hardware for authentication" - "Face Authentication" + "use Face Unlock hardware" + "Allows the app to use Face Unlock hardware for authentication" + "Face unlock" "Re-enrol your face" "To improve recognition, please re-enrol your face" "Couldn’t capture accurate face data. Try again." @@ -565,7 +565,7 @@ "Move phone lower." "Move phone to the left." "Move phone to the right." - "Look at the screen with your eyes open." + "Please look more directly at your device." "Can’t see your face. Look at the phone." "Too much motion. Hold phone steady." "Please re-enroll your face." @@ -579,15 +579,15 @@ "Can’t verify face. Hardware not available." - "Face timeout reached. Try again." + "Try Face Unlock again." "Can’t store new face data. Delete an old one first." - "Face operation cancelled" - "Face authentication cancelled by user" + "Face operation cancelled." + "Face Unlock cancelled by user." "Too many attempts. Try again later." - "Too many attempts. Face authentication disabled." + "Too many attempts. Face Unlock disabled." "Can’t verify face. Try again." - "You haven’t set up face authentication" - "Face authentication is not supported on this device" + "You haven’t set up Face Unlock." + "Face Unlock is not supported on this device." "Face %d" @@ -648,6 +648,8 @@ "Allows the holder to bind to operator services. Should never be needed for normal apps." "access Do Not Disturb" "Allows the app to read and write Do Not Disturb configuration." + "start view permission usage" + "Allows the holder to start the permission usage for an app. Should never be needed for normal apps." "Set password rules" "Control the length and the characters allowed in screen lock passwords and PINs." "Monitor screen unlock attempts" @@ -1355,7 +1357,7 @@ "Perform a factory reset to disable Test Harness Mode." "Liquid or debris in USB port" "USB port is automatically disabled. Tap to learn more." - "Safe to use USB port" + "OK to use USB port" "Phone no longer detects liquid or debris." "Taking bug report…" "Share bug report?" @@ -1898,9 +1900,7 @@ "Check for update" "You have new messages" "Open SMS app to view" - "Some functionality may be limited" - "Tap to unlock" - "User data locked" + "Some functionality may be limited" "Work profile locked" "Tap to unlock work profile" "Connected to %1$s" diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index ef92758c24ab..84f1fafa49be 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -261,7 +261,7 @@ "Network alerts" "Network available" "VPN status" - "Device administration" + "Alerts from your IT admin" "Alerts" "Retail demo" "USB connection" @@ -549,11 +549,11 @@ "Fingerprint icon" - "manage face authentication hardware" + "manage Face Unlock hardware" "Allows the app to invoke methods to add and delete facial templates for use." - "use face authentication hardware" - "Allows the app to use face authentication hardware for authentication" - "Face Authentication" + "use Face Unlock hardware" + "Allows the app to use Face Unlock hardware for authentication" + "Face unlock" "Re-enrol your face" "To improve recognition, please re-enrol your face" "Couldn’t capture accurate face data. Try again." @@ -565,7 +565,7 @@ "Move phone lower." "Move phone to the left." "Move phone to the right." - "Look at the screen with your eyes open." + "Please look more directly at your device." "Can’t see your face. Look at the phone." "Too much motion. Hold phone steady." "Please re-enroll your face." @@ -579,15 +579,15 @@ "Can’t verify face. Hardware not available." - "Face timeout reached. Try again." + "Try Face Unlock again." "Can’t store new face data. Delete an old one first." - "Face operation cancelled" - "Face authentication cancelled by user" + "Face operation cancelled." + "Face Unlock cancelled by user." "Too many attempts. Try again later." - "Too many attempts. Face authentication disabled." + "Too many attempts. Face Unlock disabled." "Can’t verify face. Try again." - "You haven’t set up face authentication" - "Face authentication is not supported on this device" + "You haven’t set up Face Unlock." + "Face Unlock is not supported on this device." "Face %d" @@ -648,6 +648,8 @@ "Allows the holder to bind to operator services. Should never be needed for normal apps." "access Do Not Disturb" "Allows the app to read and write Do Not Disturb configuration." + "start view permission usage" + "Allows the holder to start the permission usage for an app. Should never be needed for normal apps." "Set password rules" "Control the length and the characters allowed in screen lock passwords and PINs." "Monitor screen unlock attempts" @@ -1355,7 +1357,7 @@ "Perform a factory reset to disable Test Harness Mode." "Liquid or debris in USB port" "USB port is automatically disabled. Tap to learn more." - "Safe to use USB port" + "OK to use USB port" "Phone no longer detects liquid or debris." "Taking bug report…" "Share bug report?" @@ -1898,9 +1900,7 @@ "Check for update" "You have new messages" "Open SMS app to view" - "Some functionality may be limited" - "Tap to unlock" - "User data locked" + "Some functionality may be limited" "Work profile locked" "Tap to unlock work profile" "Connected to %1$s" diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 53b3c2caccbc..0002e13f1183 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -261,7 +261,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‎‏‏‎‏‏‎‎‏‏‎‏‏‏‎‎‏‏‎‏‎‎‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‏‎‏‎Network alerts‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‏‏‎‏‏‎‎‏‏‏‎‎‏‏‏‏‎‏‎‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎Network available‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‏‏‏‏‏‎‎‎‏‏‏‎‎‏‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‎‎‎‏‎‏‎‎VPN status‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‎‏‎Device administration‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‏‏‏‎‎‎‏‎‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‎‎‏‏‏‏‏‏‎‏‎‏‎Alerts from your IT admin‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‎‏‏‎‎‏‎‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‎‎‏‏‏‏‏‏‎‏‎Alerts‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‎‎‎‎‎‎‎‏‏‎‎‎‏‎‎‎‏‎‏‏‏‏‏‏‎‎‏‎‏‏‏‎‎‏‎‎‎‎‏‏‏‎‎‏‏‏‏‏‏‏‎‏‏‎Retail demo‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‎‏‏‎‎‏‎‎‏‎‏‏‏‎‏‏‏‎‎‎‎‏‎‎‏‏‏‏‎‏‏‎‎‎‎‎‎‏‎‎‏‎USB connection‎‏‎‎‏‎" @@ -549,11 +549,11 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‎‎‎Fingerprint icon‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‎‎‏‎‎‏‎‎‎‏‏‎‎‏‏‏‎‎‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‎‏‎manage face authentication hardware‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‏‎‎‏‎‎‎‏‎‎‏‎‎‎‏‏‎‎‎‎‎‎‏‎‎‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‎‎‎‎‏‎manage face unlock hardware‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‏‏‏‎‏‎‏‎‏‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‏‏‏‎‎‏‎‎Allows the app to invoke methods to add and delete facial templates for use.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‎‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‏‎‏‏‎‎‎‏‎‎‎‏‎‏‎‏‏‏‎‏‎‏‏‎‎‏‏‎‏‏‏‎use face authentication hardware‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‎‏‎‏‏‎‎‎‏‎‎‎‏‏‏‏‎‏‏‎‏‏‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‏‎‎‎‎‎‎‎‎‏‎Allows the app to use face authentication hardware for authentication‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‏‏‎‏‏‎‏‏‏‎‎‏‏‏‎‏‎‏‎‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‏‎‎Face Authentication‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‎‏‏‎‏‏‎‏‎‎‎‎‎‏‏‎‏‎‎‎‎‏‏‏‎‎‎‎‏‏‎‏‎‎‎‎‎‏‏‏‎‎‎‏‏‏‏‎‎‎‎‏‎‎‎use face unlock hardware‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‎‎‏‏‏‏‏‎‎‎‎‎‏‎‎‏‏‎‎‎‏‏‏‏‎‎‎‎‏‏‎‎‎‎‏‎‎‎‎‏‎‏‏‎‏‏‎‏‎‏‎‏‎‎Allows the app to use face unlock hardware for authentication‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‎‏‏‏‏‏‎‏‏‏‏‎‏‎‎‏‏‏‎‎‎‎‏‏‎‎‏‏‏‎‏‏‎‏‎‏‏‎‏‏‎‏‎‎‎‎‎‎Face unlock‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‏‏‎‏‎‎‎‏‎‎‏‎‎‏‏‎‎‏‎‏‏‏‏‎‎‏‎‎‎‎‏‏‎‏‎‏‎‎‎‎‎‎‏‏‏‎‏‏‎‎‏‎‏‎Re-enroll your face‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‎‎‏‎‏‏‏‎‏‎‏‏‏‏‏‎‎‏‎‏‎‎‎‏‎‏‏‎‎‎‎‏‎‏‏‏‎‏‏‎To improve recognition, please re-enroll your face‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‏‎‎‏‏‏‏‎‎‎‏‎‎‎‎‏‎‎‏‏‏‎‎‎‎‎‏‎‏‎‎‎‏‏‎‎‏‎‏‎‏‎‎‎‎‎‎‎‏‏‏‏‏‎‎Couldn’t capture accurate face data. Try again.‎‏‎‎‏‎" @@ -565,7 +565,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‏‏‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‎‏‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‏‎‎‎‎‎‎‎Move phone lower.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‎‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‎‎‎‏‎‏‏‎‏‏‎‏‏‎‏‎‏‎‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎Move phone to the left.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‏‎‎‎‎‏‏‎‎‏‏‏‎‎‏‎‎‏‎‏‏‏‎‏‎‏‎‎‏‏‎‎‏‎‎‎‏‎‎‎‏‎‏‎‏‎‏‎‎‎‎‎‎‎Move phone to the right.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‎‏‎‏‏‎‎‎‏‎‏‎‎‎‎‎‎‏‏‏‎‎‎‏‏‎‏‎‏‎‏‏‎‎‎‎‏‎‎‏‏‏‎Look at the screen with your eyes open.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‎‏‏‏‎‎‎‏‏‎‏‏‏‎‏‎‎‏‎‎‎‏‎‎‎‏‎‎‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‎‏‎Please look more directly at your device.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎‏‎‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎‎‎‏‎‏‏‎‏‎‎‏‎Can’t see your face. Look at the phone.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‏‎‏‎‎‏‎‏‎‏‏‎‎‏‏‏‎‏‏‎‎‎‏‏‏‏‎‏‎‎‏‎‎‎‎‎‎‎‎‏‏‏‏‎‎‏‎‏‏‎‎‏‏‎Too much motion. Hold phone steady.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‎‏‎‏‎‏‎‎‏‎‎‎‏‎‎‎‏‏‎‎‎‏‎‏‎‎‏‏‎‎‎‎‏‎‏‏‏‎‏‎‎‎‏‎‎‎‏‎‎‏‏‎Please re-enroll your face.‎‏‎‎‏‎" @@ -579,15 +579,15 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‎‎‎‎‎‏‎‎‎‎‎‎‎‏‏‏‎‎‎‎‏‎‎‏‎‏‏‎‎‏‏‎‎‎‏‎‎‏‏‎‎‎‏‎‏‏‎‎‏‎‎‎‏‎‎‎Can’t verify face. Hardware not available.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‏‎‏‎‎‏‎‎‏‏‎‏‏‎‏‎‏‎‎‎‏‏‏‎‏‎‎‎‎‎‎‏‏‏‎‎‏‏‎‎‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎Face timeout reached. Try again.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‏‎‎‎‎‏‎‎‎‎‎‎‎‏‎‏‏‏‏‎‎‎‎‎‏‎‎‎‎‎‎‎‎‎‎‎‏‏‎‏‎‏‎‏‏‏‎‎‏‎Try face unlock again.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎‎‎‏‏‎‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‎‎‎‎‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‎‎‎‏‏‎‏‎‎‎‎‏‎Can’t store new face data. Delete an old one first.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‏‎‏‎‏‎‎‏‏‎‏‏‏‎‏‏‎‎‏‎‎‎‏‎‎‎‏‏‎‎‎‏‏‎‏‎‎‏‎‎‎‏‎‏‎‎‎‏‏‏‎‏‏‎‎Face operation canceled‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎‏‎‎‏‎‏‎‎‏‏‎‎‏‎‎‎‎‎‏‎‏‏‎‏‏‎‏‏‏‎‎‎‏‎‎‎‎‏‎‎‏‎‎‏‎‎‎‏‏‎Face authentication canceled by user‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‏‏‎‏‏‎‏‏‏‎‎‎‏‏‎‎‏‎‏‏‏‎‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‏‎Face operation canceled.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎‎‏‎‎‏‏‏‏‎‎‎‏‎‏‎‏‎‏‏‏‎‎‎‎‏‎‎‏‎‎‏‏‏‏‎‎‎‏‎‏‏‎‏‏‎‎‏‎‏‎‎‏‎‎Face unlock canceled by user.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‏‏‏‎‎‏‏‎‎‎‏‎‏‎‎‎‎‏‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‎‎‏‎‏‏‎‎‎‎Too many attempts. Try again later.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‎‎‎‎‎‎‎‏‎‏‏‏‏‎‎‎‎‏‏‏‎‏‎‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‏‎‏‎Too many attempts. Face authentication disabled.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‏‏‎‏‏‎‎‏‎‏‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‏‏‎‎‎‎‏‎‎‎‏‎‎‎‏‏‏‎Too many attempts. Face unlock disabled.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‎‎‎‏‏‏‎‎‎‎‏‏‎‎‏‏‏‏‏‎‏‎‎‏‎‎‎‏‎‎‎‎‏‏‏‎‎‏‎‏‏‏‏‎‏‏‎‏‎‎‏‏‎Can’t verify face. Try again.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎You haven’t set up face authentication‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‏‎‎‏‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‏‏‎‎‏‎‏‎‎‎Face authentication is not supported on this device‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‎‎‏‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‏‏‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎You haven’t set up face unlock.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‏‎‏‎‏‎‎‎‎‏‏‏‎‎‏‎‎‎‏‎‏‎‏‏‎‎‏‏‎‏‏‏‎‏‏‏‎‏‎‎Face unlock is not supported on this device.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‎‏‎‏‎‎‏‏‎‏‎‎‎‎‏‎‏‎‎‎‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‎‎Face ‎‏‎‎‏‏‎%d‎‏‎‎‏‏‏‎‎‏‎‎‏‎" @@ -648,6 +648,8 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎‎‏‏‏‏‏‏‎‎‏‎‎‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‎‏‎‏‎‏‎‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎‎‎‎‎‎Allows the holder to bind to carrier services. Should never be needed for normal apps.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‎‏‎‎‏‎‏‏‎‏‎‎‎‏‎‎‎‏‏‎‎‏‎‏‏‎‏‏‎‏‏‎‎‏‎‎‏‎‏‏‏‎access Do Not Disturb‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‎‎‎‎‎‎‏‎‏‏‎‎‏‏‏‎‎‏‎‎‏‏‏‏‏‏‎‎‎‎‏‏‏‎‏‎‏‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‎‎Allows the app to read and write Do Not Disturb configuration.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‏‏‏‎‏‏‎‏‎‏‎‏‏‏‎‎‏‏‎‎‎‎‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‏‎‏‎‏‎‎‏‏‏‏‎‎‎‎start view permission usage‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‏‏‏‎‏‎‏‎‏‎‏‏‎‏‎‎‎‏‏‎‎‏‏‎‏‏‏‎‏‏‏‎‎‎‏‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‎‎‎Allows the holder to start the permission usage for an app. Should never be needed for normal apps.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‎‏‎‏‎‎‎‎‎‏‏‎‎‎‏‎‏‎‎‏‏‎‎‎‏‎‏‎‏‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‎‎‏‏‏‏‏‏‏‎Set password rules‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‏‏‎‎‎‏‏‏‏‎‏‏‏‎‏‎‎‎‎‏‎‎‏‏‏‏‎‏‏‏‎‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎‎‎‏‏‎‎‎‎Control the length and the characters allowed in screen lock passwords and PINs.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎‏‎‎‎‏‎‎‏‏‏‏‎‎‎‎‎‎‏‎‎‎‎‏‎‎‏‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎Monitor screen unlock attempts‎‏‎‎‏‎" @@ -1355,7 +1357,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‏‏‎Perform a factory reset to disable Test Harness Mode.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‎‎‏‏‎‎‏‎‏‏‎‏‎‎‏‎‎‎‎‏‏‏‎‏‎‏‎‏‏‎‎‏‏‎‏‏‎‎‎‏‏‎‏‏‏‏‎‏‏‎‏‎Liquid or debris in USB port‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‎‎‎‏‏‎‏‎‎‎‎‏‏‏‎‎‎‏‎‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‏‎‏‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎‏‎‎USB port is automatically disabled. Tap to learn more.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‎‎‎‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‏‏‏‎‎‏‏‎‏‏‎‏‎‎‎‏‎‎‎‎‏‏‎‏‏‏‏‏‎‎‏‏‎‎Safe to use USB port‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‏‎‎‏‎‏‎‏‎‎‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎‏‏‎‎‎‏‎‎‏‏‏‏‎‏‎‎‎‎‏‎‎‎‏‎‏‎‏‎OK to use USB port‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎‏‏‏‎‏‏‏‎‏‎‏‏‏‎‏‎‏‎‎‎‏‏‎‏‎‏‎‏‏‎‎‎‏‎‎‏‏‎‎‎‎‏‏‎‎‎Phone no longer detects liquid or debris.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‏‎‎‎‎‏‏‏‎‎‏‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‏‎‏‎‎‎‎‎‏‎‏‎‎‎‏‏‎‎‎‏‏‎‎Taking bug report…‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‏‎‏‎‏‏‎‏‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‎‎‎‏‎Share bug report?‎‏‎‎‏‎" @@ -1898,9 +1900,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‎‏‎‏‏‎‎‏‏‏‎‏‏‏‎‎‎‎‎‏‎‏‏‏‎‎‏‎‎‏‎‏‎‎‎‏‏‎‏‎‎‏‎‎‎‏‏‏‏‎‎‏‎‏‎Check for update‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‎‏‎‏‏‏‎‏‎‎‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‏‏‎‎‏‎‏‏‏‎‏‎‎‏‏‎‏‏‏‎‎‎‏‎‎‏‎You have new messages‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‏‏‏‏‎‏‏‎‏‏‏‏‏‎‏‏‏‏‏‎‎‎‎‏‎‏‏‏‎‏‏‎‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‏‏‏‎Open SMS app to view‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‎‏‏‏‎‏‎‏‎‏‎‎‎‏‎‏‏‏‏‎‎‎‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‏‏‏‎‎‎‏‎‎‏‎‎Some functionality may be limited‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‏‎‎‏‏‎‎‎‎‏‏‎‎‏‎‎‎‏‎‏‎‎‎‎‎‎‎‎‏‎‏‏‏‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‏‏‎Tap to unlock‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‏‎‎‏‎‏‏‎‎‎‏‏‏‎‎‎‎‏‏‎‏‏‎‎‏‎‏‏‎‏‏‎‏‎‎‎‎User data locked‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‎‎‎‎‎‎‏‏‎‎‎‏‏‎‎‏‎‎‎‏‎‏‎‏‎‎‎‎‎‏‏‎‎‎‏‎‏‏‏‎‏‏‏‎‏‎‎‏‏‏‎‎Some functionality may be limited‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎‏‏‏‎‎‎‏‏‏‏‎‎‎‏‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‎‏‏‏‏‎‎Work profile locked‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‏‎‎‎‏‎‏‎‎‎‎‏‎‏‎‏‏‎‏‎‎‎‏‎‎‏‏‏‎‏‏‏‏‏‏‎‎‏‏‎‎‏‏‎‏‎‏‎‎‎‏‎‎Tap to unlock work profile‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‎‎‏‎‎‎‏‏‎‎‎‏‎‏‎‎‎‏‎‎‏‎‎‎Connected to ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index ead403facc43..07cae0a9b7af 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -261,7 +261,7 @@ "Alertas de red" "Red disponible" "Estado de VPN" - "Administración del dispositivo" + "Alertas de tu administrador de TI" "Alertas" "Demo para punto de venta" "Conexión USB" @@ -549,11 +549,15 @@ "Ícono de huella digital" - "administrar el hardware de autenticación facial" + + "Permite que la app emplee métodos para agregar y borrar plantillas de rostros para su uso." - "usar el hardware de autenticación facial" - "Permite que la app use el hardware de autenticación facial para reconocerte" - "Autenticación facial" + + + + + + "Vuelve a registrar tu rostro" "Para mejorar el reconocimiento, vuelve a registrar tu rostro" "Datos faciales imprecisos. Vuelve a intentarlo." @@ -565,7 +569,7 @@ "Mueve el teléfono hacia abajo." "Mueve el teléfono hacia la izquierda." "Mueve el teléfono hacia la derecha." - "Mira la pantalla con los ojos abiertos." + "Mira directamente al dispositivo." "No se ve tu cara. Mira el teléfono." "Te estás moviendo demasiado. No muevas el teléfono" "Vuelve a registrar tu cara." @@ -579,15 +583,20 @@ "No se verificó el rostro. Hardware no disponible." - "Finalizó el tiempo de espera. Vuelve a intentarlo." + + "No hay espacio para datos faciales nuevos. Borra uno viejo." - "Se canceló el reconocimiento facial" - "El usuario canceló la autenticación facial" + "Se canceló el reconocimiento facial." + + "Demasiados intentos. Inténtalo de nuevo más tarde." - "Demasiados intentos. Se inhabilitó la autenticación facial." + + "No se pudo verificar la cara. Vuelve a intentarlo." - "No configuraste la autenticación facial" - "No se admite la autenticación facial en este dispositivo" + + + + "Rostro %d" @@ -648,6 +657,8 @@ "Permite al propietario vincular con servicios de proveedores. Las aplicaciones normales no deberían necesitar este permiso." "Acceso a la función No interrumpir" "Permite que la aplicación lea y modifique la configuración de la función No interrumpir." + "iniciar uso de permiso de vista" + "Permite que el propietario inicie el uso de permisos para una app. No debería requerirse para apps normales." "Establecer reglas de contraseña" "Controlar la longitud y los caracteres permitidos en las contraseñas y los PIN para el bloqueo de pantalla." "Supervisa los intentos para desbloquear la pantalla" @@ -1355,7 +1366,8 @@ "Restablece la configuración de fábrica para inhabilitar el modo de agente de prueba." "Hay líquido o suciedad en el puerto USB" "El puerto USB se inhabilitó automáticamente. Presiona para obtener más información." - "Es seguro usar el puerto USB" + + "El teléfono ya no detecta líquidos o suciedad." "Realizando un informe de errores…" "¿Compartir informe de errores?" @@ -1898,9 +1910,7 @@ "Buscar actualización" "Tienes mensajes nuevos" "Abrir app de SMS para ver el mensaje" - "Funciones limitadas" - "Presiona para desbloquear" - "Datos del usuario bloqueados" + "Podrían limitarse algunas funciones" "Perfil de trabajo bloqueado" "Presiona para desbloquear" "Conectado a %1$s" diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 17e7c4a2b1a1..7261eb012b26 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -261,7 +261,7 @@ "Alertas de la red" "Red disponible" "Estado de la VPN" - "Administración de dispositivos" + "Alertas de tu administrador de TI" "Alertas" "Demo para tiendas" "Conexión USB" @@ -549,11 +549,15 @@ "Icono de huella digital" - "gestionar el hardware de autenticación facial" + + "Permite que la app use métodos para añadir y suprimir plantillas de caras para su uso." - "usar el hardware de autenticación facial" - "Permite que la aplicación utilice el hardware de autenticación facial para autenticarte" - "Autenticación facial" + + + + + + "Volver a registrar la cara" "Para mejorar el reconocimiento, vuelve a registrar tu cara" "Datos faciales no reconocidos. Vuelve a intentarlo." @@ -565,7 +569,7 @@ "Baja el teléfono." "Mueve el teléfono hacia la izquierda." "Mueve el teléfono hacia la derecha." - "Mira a la pantalla con los ojos abiertos." + "Mira de forma más directa al dispositivo." "No se detecta tu cara. Mira al teléfono." "El teléfono se mueve demasiado. Mantenlo quieto." "Vuelve a registrar tu cara." @@ -574,20 +578,25 @@ "Gira la cabeza un poco menos." "Gira la cabeza un poco menos." "No gires tanto la cabeza." - "Retira cualquier objeto que no deje ver tu cara." + "Retira cualquier objeto que te tape la cara." "Limpia el sensor situado en la parte superior." "No se puede verificar. Hardware no disponible." - "Has sobrepasado el tiempo. Vuelve a intentarlo." + + "Para guardar nuevos datos faciales, borra otros antiguos." - "Se ha cancelado el reconocimiento facial" - "El usuario ha cancelado la autenticación facial" + "Se ha cancelado el reconocimiento facial." + + "Demasiados intentos. Inténtalo de nuevo más tarde." - "Muchos intentos. Se ha inhabilitado la autenticación facial." + + "No se ha verificado tu cara. Vuelve a intentarlo." - "No has configurado la autenticación facial" - "Autenticación facial no disponible en este dispositivo" + + + + "Cara %d" @@ -648,6 +657,8 @@ "Permite vincular con servicios de operador. Las aplicaciones normales no deberían necesitar este permiso." "acceso a No molestar" "Permite que la aplicación lea y modifique la configuración de No molestar." + "iniciar uso de permiso de visualización" + "Permite que el titular inicie el uso de permisos de una aplicación. Las aplicaciones normales no deberían necesitar nunca este permiso." "Establecimiento de reglas de contraseña" "Controla la longitud y los caracteres permitidos en los PIN y en las contraseñas de bloqueo de pantalla." "Supervisar los intentos de desbloqueo de pantalla" @@ -1355,7 +1366,8 @@ "Restablece los ajustes de fábrica para inhabilitar el modo de agente de prueba." "Se ha detectado líquido o suciedad en el puerto USB" "El puerto USB se ha inhabilitado automáticamente. Toca para obtener más información." - "Ya puedes usar el puerto USB" + + "El teléfono ya no detecta líquidos ni suciedad." "Creando informe de errores…" "¿Compartir informe de errores?" @@ -1898,14 +1910,12 @@ "Comprobar actualizaciones" "Tienes mensajes nuevos" "Abre la aplicación de SMS para ver el mensaje" - "Algunas funciones limitadas" - "Toca para desbloquear" - "Datos de usuario bloqueados" + "Algunas funciones limitadas" "Perfil de trabajo bloqueado" "Toca para desbloquear" "Conectado a %1$s" "Toca para ver archivos" - "Información de la aplicación" + "Acerca de la aplicación" "−%1$s" "Iniciando demostración…" "Restableciendo dispositivo…" diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 84500af90f45..42ce4ef4917f 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -261,7 +261,7 @@ "Võrguteavitused" "Võrk on saadaval" "VPN-i olek" - "Seadme haldamine" + "Teie IT-administraatori teatised" "Teatised" "Poedemo" "USB-ühendus" @@ -549,11 +549,15 @@ "Sõrmejälje ikoon" - "hallata näo autentimise riistvara" + + "Lubab rakendusel tühistada meetodid kasutatavate näomallide lisamiseks ja kustutamiseks." - "kasutada näo autentimise riistvara" - "Võimaldab rakendusel autentimiseks kasutada näo autentimise riistvara" - "Näo autentimine" + + + + + + "Registreerige oma nägu uuesti" "Tuvastamise parandamiseks registreerige oma nägu uuesti" "Näoandmeid ei saanud jäädvustada. Proovige uuesti." @@ -565,7 +569,7 @@ "Liigutage telefoni allapoole." "Liigutage telefoni vasakule." "Liigutage telefoni paremale." - "Vaadake ekraani avatud silmadega." + "Vaadake otse oma seadmesse." "Teie nägu ei ole näha. Vaadake telefoni poole." "Liiga palju liikumist. Hoidke telefoni paigal." "Registreerige oma nägu uuesti." @@ -579,15 +583,20 @@ "Nägu ei saa kinnitada. Riistvara pole saadaval." - "Näotuvastuse taimeri ajalõpp. Proovige uuesti." + + "Uue näo andmeid ei saa salvestada. Kustutage enne vanad." - "Näo autentimise toiming tühistati" - "Kasutaja tühistas näo autentimise" + "Näotuvastuse toiming tühistati." + + "Liiga palju katseid. Proovige hiljem uuesti." - "Liiga palju katseid. Näo autentimine on keelatud." + + "Nägu ei saa kinnitada. Proovige uuesti." - "Näo autentimist ei ole seadistatud." - "Seade ei toeta näo autentimist" + + + + "Nägu %d" @@ -648,6 +657,8 @@ "Lubab omanikul siduda operaatoriteenustega. Seda ei tohiks tavarakenduste puhul kunagi tarvis minna." "juurdepääs funktsioonile Mitte segada" "Võimaldab rakendusel lugeda ja kirjutada funktsiooni Mitte segada seadistusi." + "vaatamisloa kasutamise alustamine" + "Võimaldab omanikul rakenduse puhul alustada loa kasutamist. Tavarakenduste puhul ei peaks seda kunagi vaja minema." "Parooli reeglite määramine" "Juhitakse ekraaniluku paroolide ja PIN-koodide pikkusi ning lubatud tähemärkide seadeid." "Ekraani avamiskatsete jälgimine" @@ -1355,7 +1366,8 @@ "Testrakendirežiimi keelamiseks taastage tehaseseaded." "USB-pordis on vedelik või mustus" "USB-port on automaatselt keelatud. Puudutage lisateabe saamiseks." - "USB-porti on ohutu kasutada" + + "Telefon ei tuvasta enam vedelikku ega mustust." "Veaaruande võtmine …" "Kas jagada veaaruannet?" @@ -1491,7 +1503,7 @@ "Leia järgmine" "Leia eelmine" "Asukohapäring kasutajalt %s" - "Asukohapäring" + "Asukohataotlus" "Taotleja: %1$s (%2$s)" "Jah" "Ei" @@ -1898,9 +1910,7 @@ "Otsi värskendust" "Teile on uusi sõnumeid" "Avage vaatamiseks SMS-rakendus" - "Funktsioon võib olla piiratud" - "Avamiseks puudutage" - "Kasutaja andmed on lukustatud" + "Mõned funkts. võivad olla piiratud" "Tööprofiil on lukustatud" "Puudut. tööprofiili avamiseks" "Ühendatud seadmega %1$s" diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 8b6a5f896838..00e9de9ee3b3 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -261,7 +261,7 @@ "Sarearen alertak" "Sare bat erabilgarri dago" "VPN egoera" - "Gailuen administrazioa" + "IKT saileko administratzaileak bidalitako alertak" "Alertak" "Saltzaileentzako demoa" "USB konexioa" @@ -519,7 +519,7 @@ "Argazki-bilduma aldatzeko baimena ematen die aplikazioei." "multimedia-edukien bildumako kokapena irakurri" "Multimedia-edukien bildumako kokapena irakurtzeko baimena ematen die aplikazioei." - "Egiaztatu zeu zarela" + "Egiaztatu zu zarela" "Hardware biometrikoa ez dago erabilgarri" "Utzi da autentifikazioa" "Ez da ezagutu" @@ -537,7 +537,7 @@ "Autentifikatu da aurpegia; sakatu Berretsi" "Hatz-markaren hardwarea ez dago erabilgarri." "Ezin da gorde hatz-marka digitala. Kendu lehendik gordeta duzunetako bat." - "Hatz-marka digitalak prozesatzeko denbora-muga gainditu da. Saiatu berriro." + "Hatz-markak prozesatzeko denbora-muga gainditu da. Saiatu berriro." "Hatz-markaren eragiketa bertan behera utzi da." "Erabiltzaileak bertan behera utzi du hatz-marka bidezko eragiketa." "Saiakera gehiegi egin dituzu. Saiatu berriro geroago." @@ -549,11 +549,15 @@ "Hatz-markaren ikonoa" - "kudeatu aurpegi bidez autentifikatzeko hardwarea" + + "Aurpegi-txantiloiak gehitu eta ezabatzeko metodoei dei egitea baimentzen dio aplikazioari." - "erabili aurpegi bidez autentifikatzeko hardwarea" - "Aurpegi bidez autentifikatzeko hardwarea erabiltzea baimentzen dio aplikazioari" - "Aurpegi bidezko autentifikazioa" + + + + + + "Erregistratu aurpegia berriro" "Ezagutzea hobetzeko, erregistratu aurpegia berriro" "Ezin izan dira bildu argazkiaren datu zehatzak. Saiatu berriro." @@ -565,7 +569,7 @@ "Beheratu telefonoa." "Mugitu telefonoa ezkerretara." "Mugitu telefonoa eskuinetara." - "Begiratu pantailari begiak irekita dituzula." + "Begiratu zuzenago gailuari." "Ez da agertzen aurpegia. Begiratu telefonoari." "Mugimendu gehiegi dago. Eutsi tinko telefonoari." "Erregistratu berriro aurpegia." @@ -579,15 +583,20 @@ "Ezin da egiaztatu aurpegia. Hardwarea ez dago erabilgarri." - "Hautemateko denbora gainditu da. Saiatu berriro." + + "Ezin dira gorde aurpegiaren datu berriak. Ezabatu zaharrak." - "Utzi da aurpegi bidezko eragiketa" - "Erabiltzaileak utzi du aurpegi bidezko autentifikazioa" + "Utzi da aurpegiaren bidezko eragiketa." + + "Saiakera gehiegi egin dituzu. Saiatu berriro geroago." - "Saiakera gehiegi egin dira. Desgaitu da aurpegi bidezko autentifikazioa." + + "Ezin da egiaztatu aurpegia. Saiatu berriro." - "Ez duzu konfiguratu aurpegi bidezko autentifikazioa" - "Gailu honek ez du onartzen aurpegi bidezko autentifikazioa" + + + + "%d aurpegia" @@ -648,6 +657,8 @@ "Operadorearen zerbitzuei lotzea baimentzen die titularrei. Aplikazio normalek ez dute baimen hau behar." "atzitu \"Ez molestatu\" egoera" "\"Ez molestatu\" konfigurazioa irakurtzeko eta bertan idazteko baimena ematen die aplikazioei." + "hasi ikusteko baimena erabiltzen" + "Aplikazioaren baimena erabiltzen hasteko baimena ematen die titularrei. Aplikazio normalek ez lukete beharko." "Ezarri pasahitzen arauak" "Kontrolatu pantaila blokeoaren pasahitzen eta PINen luzera eta onartutako karaktereak." "Gainbegiratu pantaila desblokeatzeko saiakerak" @@ -1356,7 +1367,8 @@ "Proba-materialaren modua desgaitzeko, berrezarri jatorrizko datuak." "Likidoa edo zikinkeriak daude USB atakan" "USB ataka automatikoki desgaitu da. Informazio gehiago lortzeko, sakatu hau." - "Segurtasunez erabil daiteke USB ataka" + + "Telefonoak ez du hautematen likidorik edo zikinkeriarik." "Akatsen txostena sortzen…" "Akatsen txostena partekatu nahi duzu?" @@ -1800,9 +1812,9 @@ "Administratzaileak eguneratu du" "Administratzaileak ezabatu du" "Ados" - "Bateria-aurrezlea desaktibatu egiten da edo murriztu egiten dira atzeko planoko jarduerak, zenbait efektu bisual eta bateria asko darabilten bestelako eginbideak bateriak gehiago iraun dezan. ""Lortu informazio gehiago" - "Bateria-aurrezlea desaktibatu egiten da edo murriztu egiten dira atzeko planoko jarduerak, zenbait efektu bisual eta bateria asko darabilten bestelako eginbideak bateriak gehiago iraun dezan." - "Datuen erabilera murrizteko, atzeko planoan datuak bidaltzea eta jasotzea galarazten die datu-aurrezleak aplikazio batzuei. Unean erabiltzen ari zaren aplikazioak atzitu egin ahal izango datuak, baina baliteke maiztasun txikiagoarekin atzitzea. Horrela, adibidez, baliteke irudiak ez erakustea haiek sakatu arte." + "Bateria-aurrezlea desaktibatzen da, edo atzeko planoko jarduerak, zenbait efektu bisual eta bateria asko darabilten bestelako eginbideak murrizten dira, bateriak gehiago iraun dezan. ""Lortu informazio gehiago" + "Bateria-aurrezlea desaktibatzen da, edo atzeko planoko jarduerak, zenbait efektu bisual eta bateria asko darabilten bestelako eginbideak murrizten dira, bateriak gehiago iraun dezan." + "Datuen erabilera murrizteko, atzeko planoan datuak bidaltzea eta jasotzea galarazten die datu-aurrezleak aplikazio batzuei. Unean erabiltzen ari zaren aplikazioak atzitu egin ahal izango ditu datuak, baina baliteke maiztasun txikiagoarekin atzitzea. Horrela, adibidez, baliteke irudiak ez erakustea haiek sakatu arte." "Datu-aurrezlea aktibatu?" "Aktibatu" @@ -1899,9 +1911,7 @@ "Bilatu eguneratzeak" "Mezu berriak dituzu" "Mezuak ikusteko, ireki SMS mezuen aplikazioa" - "Funtzioak mugatuta egon litezke" - "Sakatu desblokeatzeko" - "Blokeatuta daude datuak" + "Baliteke funtzio batzuk mugatuta egotea" "Blokeatuta dago laneko profila" "Sakatu profila desblokeatzeko" "%1$s zerbitzura konektatuta" @@ -2005,7 +2015,7 @@ "Desaktibatu egin da bateria-aurrezlea. Jada ez dago eginbiderik murriztuta." "Desaktibatu egin da bateria-aurrezlea. Jada ez dago eginbiderik murriztuta." "Karpeta" - "Android aplikazioa" + "Android-erako aplikazioa" "Fitxategia" "%1$s fitxategia" "Audioa" diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 3c14011ccb69..d8582ffa3fd4 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -261,7 +261,7 @@ "هشدارهای شبکه" "شبکه دردسترس است" "‏وضعیت VPN" - "سرپرست دستگاه" + "هشدارهایی از سرپرست فناوری اطلاعات" "هشدارها" "نمونه برای خرده‌فروشان" "‏اتصال USB" @@ -292,7 +292,7 @@ "‏به <b>%1$s<b> اجازه داده شود پیامک‌ها را ارسال و مشاهده کند؟" "حافظه" "دسترسی به عکس‌ها، رسانه‌ها و فایل‌های روی دستگاهتان" - "‏به <b>%1$s<b> اجازه داده شود به عکس‌ها، رسانه و فایل‌های موجود در دستگاهتان دسترسی پیدا کند؟" + "‏به برنامه <b>%1$s<b> اجازه داده شود به عکس‌ها، رسانه، و فایل‌های موجود در دستگاهتان دسترسی داشته باشد؟" "میکروفن" "ضبط صدا" "‏به </b>%1$s</b> اجازه داده شود صدا ضبط کند؟" @@ -549,11 +549,15 @@ "نماد اثر انگشت" - "مدیریت سخت‌افزار احراز هویت با چهره" + + "به برنامه امکان می‌دهد روش‌هایی را برای افزودن و حذف الگوهای چهره جهت استفاده فرابخواند." - "استفاده از سخت‌افزار احراز هویت با چهره" - "به برنامه امکان می‌دهد از سخت‌افزار احراز هویت با چهره برای احراز هویت استفاده کند" - "احراز هویت با چهره" + + + + + + "ثبت مجدد چهره" "برای بهبود تشخیص، لطفاً چهره‌تان را دوباره ثبت کنید" "داده‌های دقیق چهره ضبط نشد. دوباره امتحان کنید." @@ -565,7 +569,7 @@ "تلفن را پایین‌تر بیاورید." "تلفن را به‌سمت چپ حرکت دهید." "تلفن را به سمت راست حرکت دهید." - "با چشمان باز به صفحه نگاه کنید." + "لطفاً مستقیم به دستگاه نگه کنید." "چهره‌تان دیده نمی‌شود. به تلفن نگاه کنید." "حرکت خیلی زیاد است. تلفن را ثابت نگه‌دارید." "لطفاً چهره‌تان را مجدداً ثبت کنید." @@ -579,15 +583,20 @@ "چهره تأیید نشد. سخت‌افزار در دسترس نیست." - "مهلت شناسایی چهره تمام شد. دوباره امتحان کنید." + + "داده‌ چهره جدید ذخیره نشد. اول داده‌ چهره قدیمی را حذف کنید." - "عملیات شناسایی چهره لغو شد" - "احراز هویت چهره توسط کاربر لغو شد" + "عملیات شناسایی چهره لغو شد." + + "تعداد زیادی تلاش ناموفق. بعداً دوباره امتحان کنید." - "تعداد تلاش‌ها بیش‌ازحد مجاز است. احرازهویت چهره غیرفعال شد." + + "چهره تأیید نشد. دوباره امتحان کنید." - "احراز هویت چهره راه‌اندازی نشده است" - "احراز هویت چهره در این دستگاه پشتیبانی نمی‌شود." + + + + "چهره %d" @@ -648,6 +657,8 @@ "به دارنده امکان می‌دهد به سرویس‌های شرکت مخابراتی متصل شود. هرگز نباید برای برنامه‌های عادی مورد نیاز باشد." "دسترسی به حالت «مزاحم نشوید»" "به برنامه امکان می‌دهد پیکربندی «مزاحم نشوید» را بخواند و بنویسد." + "شروع مشاهده استفاده از مجوز" + "به دارنده اجازه شروع استفاده از مجوز را برای برنامه می‌دهد. هرگز برای برنامه‌های معمول نیاز نیست." "تنظیم قوانین گذرواژه" "کنترل طول و نوع نویسه‌هایی که در گذرواژه و پین قفل صفحه مجاز است." "پایش تلاش‌های باز کردن قفل صفحه" @@ -935,8 +946,8 @@ "به برنامه اجازه می‌دهد سابقه مرورگر یا نشانک‌های ذخیره‌شده در رایانهٔ لوحی شما را تغییر دهد. این ممکن است به برنامه اجازه دهد داده‌های مرورگر را حذف کند یا تغییر دهد. توجه: این مجوز ممکن است توسط مرورگرهای شخص ثالث یا سایر برنامه‌های دارای قابلیت مرور وب قابل اجرا نباشد." "به برنامه اجازه می‌دهد تا سابقه یا نشانک‌های ذخیره شده مرورگر در تلویزیون شما را تغییر دهد. شاید به برنامه اجازه دهد تا داده‌های «مرورگر» را پاک کند یا تغییر دهد. توجه: این مجوز شاید توسط مرورگرهای شخص ثالث یا سایر برنامه‌ها با قابلیت‌های مرور وب اجرا شود." "به برنامه اجازه می‌دهد سابقه مرورگر یا نشانک‌های ذخیره‌شده در تلفن شما را تغییر دهد. این ممکن است به برنامه اجازه دهد داده‌های مرورگر را حذف کند یا تغییر دهد. توجه: این مجوز ممکن است توسط مرورگرهای شخص ثالث یا سایر برنامه‌های دارای قابلیت مرور وب قابل اجرا نباشد." - "تنظیم یک هشدار" - "‏به برنامه اجازه می‎دهد تا هشداری را در برنامه ساعت زنگدار نصب شده تنظیم کند. برخی از برنامه‎های ساعت زنگدار نمی‌‎توانند این ویژگی را اعمال کنند." + "تنظیم زنگ" + "‏به برنامه اجازه می‎دهد تا زنگی را در برنامه ساعت زنگدار نصب‌شده تنظیم کند. برخی از برنامه‎های ساعت زنگدار نمی‌‎توانند این ویژگی را اعمال کنند." "افزودن پست صوتی" "به برنامه اجازه می‌دهد تا پیام‌ها را به صندوق ورودی پست صوتی شما اضافه کند." "تغییر مجوزهای مکان جغرافیایی مرورگر" @@ -1218,7 +1229,7 @@ "آهنگ زنگ روی بی‌صدا تنظیم شد" "صدا حینِ تماس" "میزان صدای تماس بلوتوث" - "میزان صدای هشدار" + "میزان صدای زنگ" "میزان صدای اعلان" "میزان صدا" "میزان صدای بلوتوث" @@ -1230,7 +1241,7 @@ "پیش‌فرض (%1$s)" "هیچ‌کدام" "آهنگ‌های زنگ" - "صداهای زنگ هشدار" + "صداهای زنگ" "صداهای اعلان" "نامشخص" @@ -1355,7 +1366,8 @@ "برای غیرفعال کردن «حالت مجموعه داده‌های تست»، بازنشانی کارخانه‌ای کنید." "‏مایعات یا خاکروبه در درگاه USB" "‏درگاه USB به‌طور خودکار غیرفعال شده است. برای اطلاعات بیشتر، ضربه بزنید." - "‏ایمن برای استفاده از درگاه USB" + + "تلفن دیگر وجود مایعات یا خاکروبه را تشخیص نمی‌دهد." "درحال گرفتن گزارش اشکال…" "گزارش اشکال به اشتراک گذاشته شود؟" @@ -1837,7 +1849,7 @@ ‏برای %d ساعت "تا %1$s" - "تا %1$s (هشدار بعدی)" + "تا %1$s (زنگ بعدی)" "تا زمانی‌که آن را خاموش کنید" "تا زمانی که «مزاحم نشوید» را خاموش کنید" "%1$s /‏ %2$s" @@ -1898,9 +1910,7 @@ "بررسی وجود به‌روزرسانی" "پیام‌های جدیدی دارید" "برای مشاهده، برنامه پیامک را باز کنید" - "ممکن است برخی از عملکردها محدود باشند" - "برای باز کردن قفل، ضربه بزنید" - "داده‌های کاربر قفل هستند" + "برخی از عملکردها ممکن است محدود باشند" "نمایه کاری قفل است" "برای باز کردن قفل ضربه بزنید" "به %1$s متصل شد" diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 1ce4792a69c5..921788fcb649 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -261,7 +261,7 @@ "Verkkoilmoitukset" "Verkko käytettävissä" "VPN-tila" - "Laitteen järjestelmänvalvonta" + "Ilmoitukset IT-järjestelmänvalvojalta" "Ilmoitukset" "Esittelytila" "USB-yhteys" @@ -549,11 +549,15 @@ "Sormenjälkikuvake" - "hallinnoida kasvojentodennuslaitteistoa" + + "Sallii sovelluksen käyttää menetelmiä, joilla voidaan lisätä tai poistaa kasvomalleja." - "käyttää kasvojentodennuslaitteistoa" - "Sallii sovelluksen käyttää todennuslaitteistoa todennukseen" - "Kasvojentunnistus" + + + + + + "Lisää kasvot uudelleen" "Lisää kasvosi uudelleen tunnistamisen parantamiseksi" "Tarkan kasvodatan tallennus epäonnistui. Yritä uudelleen." @@ -565,7 +569,7 @@ "Siirrä puhelinta alemmas." "Siirrä puhelinta vasemmalle." "Siirrä puhelinta oikealle." - "Katso näyttöä silmät auki." + "Katso suoremmin laitteeseen." "Kasvojasi ei näy. Katso puhelinta." "Laite liikkui liikaa. Pidä puhelin vakaana." "Rekisteröi kasvot uudelleen." @@ -579,15 +583,20 @@ "Kasvoja ei voi vahvistaa. Laitteisto ei käytettäv." - "Kasvojen aikaraja saavutettu. Yritä uudelleen." + + "Uutta kasvodataa ei voi tallentaa. Poista ensin vanhaa." - "Kasvotoiminto peruutettu" - "Käyttäjä peruutti kasvojentunnistuksen" + "Kasvotoiminto peruutettu" + + "Liian monta yritystä. Yritä myöhemmin uudelleen." - "Liian monta yritystä. Kasvojentunnistus poistettu käytöstä." + + "Kasvoja ei voi vahvistaa. Yritä uudelleen." - "Et ole määrittänyt kasvojentunnistusta" - "Tämä laite ei tue kasvojentunnistusta." + + + + "Kasvot %d" @@ -648,6 +657,8 @@ "Antaa sovelluksen luoda sidoksen operaattorin palveluun. Ei tavallisten sovelluksien käyttöön." "Älä häiritse -tilan käyttöoikeus" "Sallii sovelluksen lukea ja muokata Älä häiritse -tilan asetuksia." + "aloita katseluoikeuksien käyttö" + "Antaa luvanhaltijan käynnistää sovelluksen käyttöoikeuksien käytön. Ei tavallisten sovelluksien käyttöön." "Asentaa salasanasäännöt" "Hallinnoida ruudun lukituksen salasanoissa ja PIN-koodeissa sallittuja merkkejä ja niiden pituutta." "Tarkkailla näytön avaamisyrityksiä" @@ -1355,7 +1366,8 @@ "Palauta tehdasasetukset, niin voit poistaa testikehystilan käytöstä." "Nestettä tai likaa USB-portissa" "USB-portti poistetaan käytöstä automaattisesti. Napauta nähdäksesi lisätietoja." - "USB-portin käyttö on turvallista" + + "Puhelin ei enää havaitse nesteitä eikä likaa." "Luodaan virheraporttia…" "Jaetaanko virheraportti?" @@ -1898,9 +1910,7 @@ "Tarkista päivitykset" "Sinulle on uusia viestejä" "Katso avaamalla tekstiviestisovellus." - "Toimintorajoitus mahdollinen" - "Avaa napauttamalla." - "Käyttäjän tiedot on lukittu." + "Osaa toiminnoista voidaan rajoittaa" "Työprofiili on lukittu." "Avaa profiili koskettamalla." "%1$s yhdistetty" diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index b5b613058660..8f99e3de0f15 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -261,7 +261,7 @@ "Alertes réseau" "Réseau accessible" "État du RPV" - "Gestion de l\'appareil" + "Alertes de votre administrateur informatique" "Alertes" "Démo en magasin" "Connexion USB" @@ -295,7 +295,7 @@ "Autoriser <b>%1$s</b> à accéder aux photos, aux médias et aux fichiers de votre appareil?" "Microphone" "enregistrer des fichiers audio" - "Autoriser <b>%1$s</b&gt à enregistrer l\'audio?" + "Autoriser <b>%1$s</b> à enregistrer l\'audio?" "données d\'activité physique" "accéder à vos activités physiques" "Autoriser « %1$s » à accéder à vos activités physiques?" @@ -526,7 +526,7 @@ "Authentification annulée" "Aucun NIP, schéma ou mot de passe défini" "Empreinte digitale partielle détectée. Veuillez essayer de nouveau." - "Impossible de traiter les empreintes digitales. Veuillez essayer de nouveau." + "Impossible de reconnaître l\'empreinte digitale. Veuillez réessayer." "Le capteur d\'empreintes digitales est sale. Veuillez le nettoyer et essayer de nouveau." "Vous avez déplacé votre doigt trop rapidement. Veuillez réessayer." "Vous avez déplacé votre doigt trop lentement. Veuillez réessayer." @@ -549,11 +549,15 @@ "Icône d\'empreinte digitale" - "gérer le matériel d\'authentification de visage" + + "Permet à l\'appli d\'employer des méthodes d\'aj. et de suppr. de modèles de reconn. visage." - "utiliser le matériel d\'authentification de visage" - "Permet à l\'appli d\'utiliser du matériel de reconnaissance du visage pour l\'authentification" - "Authentification du visage" + + + + + + "Inscrivez votre visage à nouveau" "Pour améliorer la reconnaissance, veuillez enregistrer à nouveau votre visage" "Imposs. capt. données visage précises. Réessayez." @@ -565,7 +569,7 @@ "Déplacez le téléphone plus bas." "Déplacez le téléphone vers la gauche." "Déplacez le téléphone vers la droite." - "Regardez l\'écran avec les yeux ouverts." + "Veuillez regarder plus directement votre appareil." "Impossible de voir votre visage. Regardez le tél." "Trop de mouvement. Tenez le téléphone immobile." "Veuillez inscrire votre visage à nouveau." @@ -579,15 +583,20 @@ "Imposs. de vérif. visage. Matériel non accessible." - "Temps de reconn. visage écoulé. Veuillez réessayer." + + "Impossible de stocker de nouveaux visages. Supprimez-en un." - "Opération de reconnaissance du visage annulée" - "Authentification du visage annulée par l\'utilisateur" + "Opération de reconnaissance du visage annulée." + + "Trop de tentatives. Veuillez réessayer plus tard." - "Trop de tentatives. Authentification du visage désactivée." + + "Impossible de vérifier le visage. Réessayez." - "Vous n\'avez pas configuré l\'authentific. du visage" - "Cet appareil ne prend pas en charge l\'authentific. du visage" + + + + "Visage %d" @@ -648,6 +657,8 @@ "Permet à l\'application autorisée de s\'associer aux services d\'un fournisseur. Ne devrait pas être nécessaire pour les applications standards." "accéder au mode Ne pas déranger" "Permet à l\'application de consulter et de modifier la configuration du mode Ne pas déranger." + "démarrer l\'affichage de l\'usage des autorisations" + "Permet au détenteur de démarrer l\'usage des autorisations pour une application. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards." "Définir les règles du mot de passe" "Gérer le nombre et le type de caractères autorisés dans les mots de passe et les NIP de verrouillage de l\'écran." "Gérer les tentatives de déverrouillage de l\'écran" @@ -1355,7 +1366,8 @@ "Effectuez une réinitialisation pour désactiver le mode Logiciel de test." "Liquide ou débris dans le port USB" "Le port USB est désactivé automatiquement. Touchez ici pour en savoir plus." - "Vous pouvez maintenant utiliser le port USB" + + "Le téléphone ne détecte plus les liquides ni les débris." "Création d\'un rapport de bogue en cours..." "Partager le rapport de bogue?" @@ -1898,9 +1910,7 @@ "Vérifier la présence de mises à jour" "Vous avez de nouveaux messages" "Ouvrez l\'application de messagerie texte pour l\'afficher" - "Certaines fonct. sont limitées" - "Touchez pour déverrouiller" - "Données utilisat. verrouillées" + "Certaines fonctionnal. sont limitées" "Profil professionnel verrouillé" "Touch. pr déver. profil profess." "Connecté à %1$s" @@ -2026,6 +2036,6 @@ %s + %d fichier %s + %d fichiers - "Le partage direct n\'est pas accessible" + "Le partage direct n\'est pas disponible" "Liste des applications" diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 965feb08c655..b55f2972770f 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -101,7 +101,7 @@ "Mode TTY demandé par l\'interlocuteur : DÉSACTIVÉ" "Voix" "Données" - "Télécopie" + "Fax" "SMS" "Asynchrones" "Synchrones" @@ -261,7 +261,7 @@ "Alertes réseau" "Réseau disponible" "État du VPN" - "Gestion de l\'appareil" + "Alertes de votre administrateur informatique" "Alertes" "Démonstration en magasin" "Connexion USB" @@ -296,7 +296,7 @@ "Microphone" "enregistrer des fichiers audio" "Autoriser l\'appli <b>%1$s</b> à enregistrer des contenus audio ?" - "données d\'activité physique" + "Activité physique" "accéder aux données d\'activité physique" "Autoriser %1$s à accéder aux données relatives à votre activité physique ?" "Appareil photo" @@ -549,11 +549,15 @@ "Icône d\'empreinte digitale" - "gérer le matériel d\'authentification faciale" + + "Autorise l\'appli à invoquer des méthodes pour ajouter et supprimer des modèles de visages." - "utiliser le matériel d\'authentification faciale" - "Autorise l\'appli à utiliser le matériel d\'authentification faciale pour l\'authentification" - "Authentification faciale" + + + + + + "Enregistrer à nouveau votre visage" "Pour améliorer la reconnaissance, veuillez enregistrer à nouveau votre visage" "Capture du visage impossible. Réessayez." @@ -565,7 +569,7 @@ "Baissez le téléphone." "Déplacez le téléphone vers la gauche." "Déplacez le téléphone vers la droite." - "Regardez l\'écran et gardez les yeux ouverts." + "Veuillez regarder plus directement l\'appareil." "Visage non détecté. Regardez le téléphone." "Trop de mouvement. Ne bougez pas le téléphone." "Veuillez enregistrer à nouveau votre visage." @@ -579,15 +583,20 @@ "Imposs. valider visage. Matériel non disponible." - "Délai de détection du visage expiré. Réessayez." + + "Impossible stocker nouv. visages. Veuillez en supprimer un." - "Opération de reconnaissance faciale annulée" - "Authentification faciale annulée par l\'utilisateur" + "Opération de reconnaissance faciale annulée." + + "Trop de tentatives. Réessayez plus tard." - "Trop de tentatives. Authentification faciale désactivée." + + "Impossible de valider votre visage. Réessayez." - "L\'authentification faciale n\'est pas configurée" - "Appareil incompatible avec l\'authentification faciale" + + + + "Visage %d" @@ -648,6 +657,8 @@ "Permet à l\'application autorisée de s\'associer aux services d\'un opérateur. Ne devrait pas être nécessaire pour les applications standards." "accéder au mode Ne pas déranger" "Permet à l\'application de consulter et de modifier la configuration du mode Ne pas déranger." + "activer l\'utilisation de l\'autorisation d\'affichage" + "Permet à l\'application autorisée d\'activer l\'utilisation de l\'autorisation pour une application. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards." "Définir les règles du mot de passe" "Gérer le nombre et le type de caractères autorisés dans les mots de passe et les codes d\'accès de verrouillage de l\'écran" "Gérer les tentatives de déverrouillage de l\'écran" @@ -683,8 +694,8 @@ "Domicile" "Mobile" "Bureau" - "Télécopie bureau" - "Télécopie domicile" + "Fax travail" + "Fax domicile" "Bipeur" "Autre" "Personnalisé" @@ -726,8 +737,8 @@ "Domicile" "Mobile" "Bureau" - "Télécopie bureau" - "Télécopie domicile" + "Fax travail" + "Fax domicile" "Bipeur" "Autre" "Rappel" @@ -735,7 +746,7 @@ "Entreprise (principal)" "RNIS" "Principal" - "Autre télécopie" + "Autre fax" "Radio" "Télex" "TTY/TTD" @@ -1298,7 +1309,7 @@ "De :" "À :" "Saisissez le code PIN requis :" - "Code PIN :" + "Code :" "La tablette sera déconnectée du réseau Wi-Fi tant qu\'elle sera connectée à l\'appareil \"%1$s\"." "Le téléviseur se déconnectera temporairement du Wi-Fi lors de sa connexion à l\'appareil %1$s." "Le téléphone sera déconnecté du réseau Wi-Fi tant qu\'il sera connecté à l\'appareil %1$s." @@ -1355,7 +1366,8 @@ "Rétablissez la configuration d\'usine pour désactiver le mode Atelier de test." "Présence de liquide ou de saletés dans le port USB" "Le port USB est désactivé automatiquement. Appuyez sur cette notification pour en savoir plus." - "Possibilité d\'utiliser le port USB en toute sécurité" + + "Le téléphone ne détecte plus les liquides ni les saletés." "Création du rapport de bug…" "Partager le rapport de bug ?" @@ -1664,8 +1676,8 @@ "Le raccourci d\'accessibilité a activé %1$s" "Le raccourci d\'accessibilité a désactivé %1$s" "Appuyez de manière prolongée sur les deux touches de volume pendant trois secondes pour utiliser %1$s" - "Choisissez une fonctionnalité à utiliser lorsque vous appuyez sur le bouton d\'accessibilité :" - "Pour changer des fonctionnalités, appuyez de manière prolongée sur le bouton d\'accessibilité." + "Choisissez une fonctionnalité à utiliser lorsque vous appuyez sur le bouton Accessibilité :" + "Pour changer de fonctionnalités, appuyez de manière prolongée sur le bouton Accessibilité." "Agrandissement" "Utilisateur actuel : %1$s" "Chargement du profil de %1$s..." @@ -1792,7 +1804,7 @@ "%1$s (travail)" "2e %1$s professionnelle" "3e %1$s professionnelle" - "Demander le code PIN avant d\'annuler l\'épinglage" + "Demander le code avant d\'annuler l\'épinglage" "Demander le schéma de déverrouillage avant d\'annuler l\'épinglage" "Demander le mot de passe avant d\'annuler l\'épinglage" "Installé par votre administrateur" @@ -1898,9 +1910,7 @@ "Rechercher une mise à jour" "Vous avez de nouveaux messages" "Ouvrir l\'application de SMS pour afficher le message" - "Des fonctionnalités peuvent être limitées" - "Appuyer pour déverrouiller" - "Infos sur utilis. verrouillées" + "Fonctionnalités peuvent être limitées" "Profil professionnel verrouillé" "Appuyez pour déverrouiller profil pro" "Connecté à %1$s" diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index dcaaebf60e00..5e497a0895f1 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -261,7 +261,7 @@ "Alertas de rede" "A rede está dispoñible" "Estado da VPN" - "Administración de dispositivos" + "Alertas do teu administrador de TI" "Alertas" "Demostración comercial" "conexión USB" @@ -333,7 +333,7 @@ "Permite a unha aplicación engadir atallos na pantalla de inicio sen intervención do usuario." "desinstalar atallos" "Permite á aplicación eliminar atallos da pantalla de inicio sen a intervención do usuario." - "redireccionar as chamadas saíntes" + "redirixir as chamadas saíntes" "Permite á aplicación ver o número que se está marcando durante unha chamada saínte coa opción de redirixir a chamada a un número diferente ou abortar a chamada." "responder chamadas telefónicas" "Permite que a aplicación responda a unha chamada telefónica entrante." @@ -549,11 +549,15 @@ "Icona de impresión dixital" - "xestionar hardware de autenticación facial" + + "Permite que a aplicación invoque métodos para engadir e eliminar modelos faciais de uso." - "usar hardware de autenticación facial" - "Permite que a aplicación utilice hardware facial para a autenticación" - "Autenticación facial" + + + + + + "Volve inscribir a túa cara" "Para mellorar o recoñecemento, inscribe de novo a túa cara" "Sen datos faciais exactos. Téntao de novo." @@ -565,7 +569,7 @@ "Baixa o teléfono." "Move o teléfono cara á esquerda." "Move o teléfono cara á dereita." - "Mira a pantalla cos ollos abertos." + "Mira o dispositivo de forma máis directa." "Non se pode ver a túa cara. Mira o teléfono." "Demasiado movemento. Non movas o teléfono." "Volve rexistrar a túa cara." @@ -579,15 +583,20 @@ "Sen verificar a cara. Hardware non dispoñible." - "Esgotouse o tempo de espera. Téntao de novo." + + "Para gardar novos datos faciais, elimina os antigos." - "Cancelouse a operación relacionada coa cara" - "O usuario cancelou a autenticación facial" + "Cancelouse a operación relacionada coa cara" + + "Demasiados intentos. Téntao de novo máis tarde." - "Demasiados intentos. Desactivouse a autenticación facial." + + "Non se puido verificar a cara. Téntao de novo." - "Non configuraches a autenticación facial" - "Este dispositivo non é compatible coa autenticación facial" + + + + "Cara %d" @@ -648,6 +657,8 @@ "Permite ao titular vincularse aos servizos do operador. As aplicacións normais non deberían necesitar este permiso." "acceso ao modo Non molestar" "Permite á aplicación ler e escribir a configuración do modo Non molestar." + "iniciar uso de permiso de vista" + "Permite ao propietario iniciar o uso de permisos dunha aplicación. As aplicacións normais non deberían precisalo nunca." "Establecer as normas de contrasinal" "Controla a lonxitude e os caracteres permitidos nos contrasinais e nos PIN de bloqueo da pantalla." "Controlar os intentos de desbloqueo da pantalla" @@ -680,7 +691,7 @@ "Desactivar algunhas funcións de bloqueo da pantalla" "Impide o uso dalgunhas funcións de bloqueo da pantalla." - "Casa" + "Particular" "Móbil" "Traballo" "Fax do traballo" @@ -690,19 +701,19 @@ "Personalizado" - "Casa" + "Particular" "Traballo" "Outros" "Personalizado" - "Casa" + "Particular" "Traballo" "Outro" "Personalizado" - "Casa" + "Particular" "Traballo" "Outros" "Personalizado" @@ -723,7 +734,7 @@ "Jabber" "Personalizado" - "Casa" + "Particular" "Móbil" "Traballo" "Fax do traballo" @@ -748,16 +759,16 @@ "Aniversario" "Outros" "Personalizado" - "Casa" + "Particular" "Traballo" "Outro" "Móbil" "Personalizado" - "Casa" + "Particular" "Traballo" "Outro" "Personalizado" - "Casa" + "Particular" "Traballo" "Outro" "Personalizado" @@ -789,7 +800,7 @@ "Irmá" "Cónxuxe" "Personalizado" - "Casa" + "Particular" "Traballo" "Outro" "Non se atopou ningunha aplicación para ver este contacto." @@ -947,7 +958,7 @@ "Nunca" "Non tes permiso para abrir esta páxina." "O texto copiouse no portapapeis." - "Contido copiado" + "Copiuse" "Máis" "Menú+" "Meta +" @@ -1356,7 +1367,8 @@ "Restablece a configuración de fábrica para desactivar o modo de axente de proba." "Hai líquido ou residuos no porto USB" "O porto USB desactivouse automaticamente. Toca para obter máis información." - "É seguro usar o porto USB" + + "O teléfono xa non detecta líquidos nin residuos." "Creando informe de erros…" "Queres compartir o informe de erros?" @@ -1844,7 +1856,7 @@ "%1$s/%2$s" "Contraer" "Non molestar" - "Tempo de inactividade" + "Tempo de descanso" "Noite da semana" "Fin de semana" "Evento" @@ -1899,9 +1911,7 @@ "Buscar actualización" "Tes mensaxes novas" "Abre a aplicación de SMS para ver as mensaxes" - "Pode haber funcións limitadas" - "Toca para desbloquear" - "Datos do usuario bloqueados" + "Pode haber funcións limitadas" "Perfil de traballo bloqueado" "Toca para desbloquear o perfil" "Conectado a %1$s" @@ -2027,6 +2037,6 @@ %s + %d ficheiros %s + %d ficheiro - "A función de compartir directamente non está dispoñible" + "Non está dispoñible a función de compartir directamente" "Lista de aplicacións" diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 5456a466fe51..c03db766d292 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -261,7 +261,7 @@ "નેટવર્ક ચેતવણીઓ" "નેટવર્ક ઉપલબ્ધ છે" "VPN સ્થિતિ" - "ઉપકરણ વ્યવસ્થાપન" + "તમારા IT વ્યવસ્થાપક તરફથી અલર્ટ" "ચેતવણીઓ" "રિટેલ ડેમો" "USB કનેક્શન" @@ -549,11 +549,15 @@ "ફિંગરપ્રિન્ટ આયકન" - "ચહેરા પ્રમાણીકરણના હાર્ડવેરને મેનેજ કરો" + + "ઍપને ઉપયોગ માટે ચહેરાના નમૂના ઉમેરવા અને ડિલીટ કરવાની પદ્ધતિને રદ કરવાની મંજૂરી આપે છે." - "ચહેરા પ્રમાણીકરણના હાર્ડવેરનો ઉપયોગ કરો" - "ઍપને પ્રમાણીકરણ માટે ચહેરા પ્રમાણીકરણના હાર્ડવેરનો ઉપયોગ કરવાની મંજૂરી આપે છે" - "ચહેરાનું પ્રમાણીકરણ" + + + + + + "તમારા ચહેરાની ફરી નોંધણી કરાવો" "ઓળખવાની પ્રક્રિયાને બહેતર બનાવવા માટે કૃપા કરીને તમારા ચહેરાની ફરી નોંધણી કરાવો" "ચહેરાનો સચોટ ડેટા કૅપ્ચર ન થયો. ફરી પ્રયાસ કરો." @@ -565,7 +569,7 @@ "ફોનને થોડો નીચે ખસેડો." "ફોનને ડાબી બાજુ ખસેડો." "ફોનને જમણી બાજુ ખસેડો." - "તમારી આંખો ખુલ્લી રાખીને સ્ક્રીનની સામે જુઓ." + "કૃપા કરીને તમારા ડિવાઇસ તરફ સીધું જુઓ." "તમારો ચહેરો દેખાતો નથી. ફોનની સામે જુઓ." "ડિવાઇસ અસ્થિર છે. ફોનને સ્થિર રાખો." "કૃપા કરીને તમારા ચહેરાની ફરી નોંધણી કરાવો." @@ -579,15 +583,20 @@ "ચહેરો ચકાસી શકાતો નથી. હાર્ડવેર ઉપલબ્ધ નથી." - "ચહેરા માટેનો સમય સમાપ્ત થયો. ફરી પ્રયાસ કરો." + + "ચહેરાનો નવો ડેટા સ્ટોર કરી શકતાં નથી. પહેલા જૂનો ડિલીટ કરો." - "ચહેરા સંબંધિત પ્રક્રિયા રદ કરવામાં આવી છે" - "વપરાશકર્તાએ ચહેરાનું પ્રમાણીકરણ રદ કર્યુ" + "ચહેરા સંબંધિત કાર્યવાહી રદ કરવામાં આવી છે." + + "ઘણા બધા પ્રયત્નો. થોડા સમય પછી ફરી પ્રયાસ કરો." - "ઘણા બધા પ્રયાસો. ચહેરાનું પ્રમાણીકરણ બંધ કરવામાં આવ્યું છે." + + "ચહેરો ચકાસી શકાતો નથી. ફરી પ્રયાસ કરો." - "તમે ચહેરાના પ્રમાણીકરણનું સેટઅપ કર્યું નથી" - "આ ડિવાઇસ પર ચહેરાનું પ્રમાણીકરણ કરવાની સુવિધા નથી" + + + + "ચહેરાનું %d" @@ -648,6 +657,8 @@ "ધારકને કેરીઅર સેવાઓ સાથે પ્રતિબદ્ધ થવાની મંજૂરી આપે છે. સામાન્ય ઍપ્લિકેશનો માટે ક્યારેય જરૂરી હોતું નથી." "ખલેલ પાડશો નહીં ઍક્સેસ કરો" "એપ્લિકેશનને ખલેલ પાડશો નહીં ગોઠવણી વાંચવા અને લખવાની મંજૂરી આપે છે." + "પરવાનગી વપરાશ જુઓને શરૂ કરો" + "કોઈ ઍપ માટે પરવાનગી વપરાશ શરૂ કરવાની ધારકને મંજૂરી આપે છે. સામાન્ય ઍપ માટે ક્યારેય જરૂર પડી ન શકે." "પાસવર્ડ નિયમો સેટ કરો" "સ્ક્રીન લૉક પાસવર્ડ અને પિનમાં મંજૂર લંબાઈ અને અક્ષરોને નિયંત્રિત કરો." "સ્ક્રીનને અનલૉક કરવાના પ્રયત્નોનું નિયમન કરો" @@ -1356,7 +1367,8 @@ "ટેસ્ટ હાર્નેસ મોડ બંધ કરવા માટે ફૅક્ટરી રીસેટ કરો." "USB પોર્ટમાં પ્રવાહી કે ધૂળ" "USB પોર્ટ ઑટોમૅટિક રીતે બંધ કરવામાં આવ્યો છે. વધુ જાણવા માટે ટૅપ કરો." - "USB પોર્ટનો ઉપયોગ કરવો સુરક્ષિત છે" + + "ફોનને હવે કોઈ પ્રવાહી કે ધૂળ હોવાનું જણાયું નથી." "બગ રિપોર્ટ લઈ રહ્યાં છે…" "બગ રિપોર્ટ શેર કરીએ?" @@ -1899,9 +1911,7 @@ "અપડેટ માટે તપાસો" "તમારી પાસે નવા સંદેશા છે" "જોવા માટે SMS ઍપ્લિકેશન ખોલો" - "કેટલીક કાર્યક્ષમતા મર્યાદિત હોઈ શકે છે" - "અનલૉક કરવા માટે ટૅપ કરો" - "વપરાશકર્તા ડેટા લૉક કર્યો" + "કેટલીક કાર્યક્ષમતા મર્યાદિત હોઈ શકે છે" "કાર્યાલયની પ્રોફાઇલ લૉક કરી" "કાર્યાલયની પ્રોફાઇલ અનલૉક કરવા ટૅપ કરો" "%1$s થી કનેક્ટ કરેલું છે" diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 65d87eb8d4d1..4eeb661e782e 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -41,7 +41,7 @@ "पंजीकरण सफल था." "मिटाना सफल था." "गलत पासवर्ड" - "MMI पूर्ण." + "MMI पूरा हुआ." " लिखा गया पुराना पिन सही नहीं है." " लिखा गया PUK सही नहीं है." "आपने जो पिन लिखे हैं उसका मिलान नहीं होता." @@ -116,8 +116,8 @@ "रोमिंग - उपलब्‍ध सिस्‍टम" "रोमिंग - गठबंधन सहयोगी" "रोमिंग - प्रीमियम सहयोगी" - "रोमिंग - पूर्ण सेवा कार्यक्षमता" - "रोमिंग - आंशिक सेवा कार्यक्षमता" + "रोमिंग - पूर्ण सेवा काम की क्षमता" + "रोमिंग - आंशिक सेवा काम की क्षमता" "रोमिंग बैनर चालू" "रोमिंग बैनर बंद" "नेटवर्क खोज रहा है" @@ -149,7 +149,7 @@ "{0}: {1} {2} सेकंड के बाद" "{0}: अग्रेषित नहीं किया गया" "{0}: अग्रेषित नहीं किया गया" - "सुविधा कोड पूर्ण." + "सुविधा कोड पूरा हुआ." "कनेक्‍शन समस्‍या या अमान्‍य सुविधा कोड." "ठीक है" "कोई नेटवर्क गड़बड़ी हुई थी." @@ -232,7 +232,7 @@ "इससे ईमेल भेजने के लिए, आपके डिवाइस की मौजूदा स्थिति से जुड़ी जानकारी इकट्ठा की जाएगी. गड़बड़ी की रिपोर्ट बनना शुरू होने से लेकर भेजने के लिए तैयार होने तक कुछ समय लगेगा; कृपया इंतज़ार करें." "सहभागी रिपोर्ट" "ज़्यादातर परिस्थितियों में इसका उपयोग करें. यह आपको रिपोर्ट की प्रगति ट्रैक करने देता है, समस्या के बारे में ज़्यादा विवरण डालने देता है और स्क्रीनशॉट लेने देता है. यह आपको ऐसे कम उपयोग किए गए अनुभाग मिटाने दे सकता है जिनकी रिपोर्ट करने में ज़्यादा समय लगता है." - "पूर्ण रिपोर्ट" + "पूरी रिपोर्ट" "जब आपका डिवाइस ठीक से काम नहीं कर रहा हो या बहुत धीमा हो या जब आपको रिपोर्ट के सभी भागों की ज़रूरत हो, तो सिस्टम से कम से कम रोक-टोक के लिए इस विकल्प का इस्तेमाल करें. यह आपको ज़्यादा जानकारी डालने या अतिरिक्त स्क्रीनशॉट लेने नहीं देता." गड़बड़ी की रिपोर्ट के लिए %d सेकंड में स्‍क्रीनशॉट लिया जा रहा है. @@ -261,7 +261,7 @@ "नेटवर्क संबंधी सूचनाएं" "नेटवर्क उपलब्ध है" "VPN की स्थिति" - "डिवाइस का व्‍यवस्‍थापन" + "आपके आईटी एडमिन से मिली चेतावनियां" "सूचनाएं" "खुदरा डेमो" "USB कनेक्शन" @@ -358,7 +358,7 @@ "प्रोफ़ाइल और डिवाइस स्‍वामियों को प्रबंधित करें" "ऐप्‍स को प्रोफ़ाइल स्‍वामी और डिवाइस स्‍वामी सेट करने दें." "चल रहे ऐप्स फिर से क्रमित करें" - "ऐप्स को कार्यों को अग्रभूमि और पृष्‍ठभूमि पर ले जाने देता है. ऐप्स आपके इनपुट के बिना यह कर सकता है." + "ऐप्स को काम को अग्रभूमि और पृष्‍ठभूमि पर ले जाने देता है. ऐप्स आपके इनपुट के बिना यह कर सकता है." "कार मोड चालू करें" "ऐप्स को कार मोड सक्षम करने देता है." "अन्‍य ऐप्स बंद करें" @@ -380,7 +380,7 @@ "सिस्‍टम सेटिंग बदलें" "ऐप्लिकेशन को सिस्टम सेटिंग डेटा में बदलाव करने देता है. नुकसान पहुंचाने वाले ऐप्लिकेशन आपके सिस्टम के कॉन्फ़िगरेशन को खराब सकते हैं." "प्रारंभ होने पर चलाएं" - "ऐप्स को सिस्टम द्वारा बूटिंग पूर्ण करते ही अपने आप आरंभ करने देता है. इससे टैबलेट को आरंभ होने में ज़्यादा समय लग सकता है और ऐप्स को निरंतर चलाकर संपूर्ण टैबलेट को धीमा करने देता है." + "ऐप्लिकेशन को सिस्टम से बूटिंग पूरी करते ही अपने आप शुरू करने देता है. इससे टैबलेट को शुरू होने में ज़्यादा समय लग सकता है और ऐप्लिकेशन निरंतर चलाकर संपूर्ण टैबलेट को धीमा करने देता है." "सिस्‍टम के चालू होते ही ऐप को अपने आप शुरू होने देती है. इससे टीवी को चालू होने में ज़्यादा समय लग सकता है और ऐप के लगातार चलते रहने से पूरा टैबलेट धीमा हो सकता है." "सिस्‍टम के चालू होते ही ऐप को अपने आप शुरू होने देती है. इससे फ़ोन को चालू होने में ज़्यादा समय लग सकता है और ऐप के लगातार चलते रहने से पूरा फ़ोन धीमा हो सकता है." "स्टिकी प्रसारण भेजें" @@ -549,11 +549,15 @@ "फ़िंगरप्रिंट आइकॉन" - "चेहरे की पुष्टि करने वाला हार्डवेयर प्रबंधित करें" + + "ऐप्लिकेशन को चेहरे के टेम्पलेट इस्तेमाल के तरीके जोड़ने और मिटाने की मंज़ूरी मिलती है." - "चेहरे की पुष्टि करने वाला हार्डवेयर इस्तेमाल करें" - "ऐप्लिकेशन को चेहरे की पुष्टि करने वाले हार्डवेयर का इस्तेमाल करने की मंज़ूरी मिलती है" - "चेहरे की पहचान" + + + + + + "अपना चेहरा फिर से दर्ज करें" "कृपया अपना चेहरा फिर से दर्ज करें ताकि आपको बेहतर तरीके से पहचाना जा सके" "चेहरे से जुड़ा सटीक डेटा कैप्चर नहीं किया जा सका. फिर से कोशिश करें." @@ -565,7 +569,7 @@ "फ़ोन को थोड़ा नीचे ले जाएं." "फ़ोन को बाईं ओर घुमाएं." "फ़ोन को दाईं ओर घुमाएं." - "खुली आंखों से स्क्रीन देखें." + "कृपया अपने डिवाइस की तरफ़ सीधे देखें." "आपका चेहरा नहीं दिखाई दे रहा. फ़ोन की तरफ़ देखें." "डिवाइस बहुत ज़्यादा हिल रहा है. फ़ोन को बिना हिलाएं पकड़ें." "कृपया फिर से अपने चेहरे की पहचान कराएं." @@ -573,21 +577,26 @@ "चेहरा काफ़ी मिलता-जुलता है, कृपया अपना पोज़ बदलें." "अपना सिर थोड़ा कम घुमाएं." "अपना सिर थोड़ा कम घुमाएं." - "अपना सिर थोड़ा कम घुमाएं" - "आपके चेहरे को छिपाने वाली सभी चीज़ों को हटाएं" + "अपना सिर थोड़ा कम घुमाएं." + "आपके चेहरे को छिपाने वाली सभी चीज़ों को हटाएं." "स्क्रीन के ऊपरी किनारे पर मौजूद सेंसर को साफ करें." "चेहरा नहीं पहचान पा रहे. हार्डवेयर उपलब्ध नहीं है." - "चेहरे की पहचान का समय खत्म हुआ. फिर से कोशिश करें." + + "चेहरे का नया डेटा सेव नहीं हो सकता. कोई पुराना डेटा मिटाएं." - "चेहरा पहचानने की कार्रवाई रद्द की गई" - "उपयोगकर्ता ने \'चेहरे की पहचान\' रद्द कर दी." + "चेहरा पहचानने की कार्रवाई रद्द की गई." + + "कई बार कोशिश की गई. बाद में कोशिश करें." - "कई बार कोशिश की जा चुकी है. \'चेहरे की पहचान\' बंद कर दी गई." + + "चेहरा नहीं पहचान पा रहे. फिर से कोशिश करें." - "आपने डिवाइस पर \'चेहरे की पहचान\' सेट नहीं की है." - "इस डिवाइस पर \'चेहरे की पहचान\' सुविधा काम नहीं करती." + + + + "चेहरा %d" @@ -648,6 +657,8 @@ "उपयोगकर्ता को किसी मोबाइल और इंटरनेट सेवा देने वाली कंपनी से जोड़ता है. सामान्‍य ऐप के लिए इसकी कभी ज़रूरत नहीं होती." "\'परेशान न करें\' को ऐक्सेस करें" "ऐप को परेशान न करें कॉन्फ़िगरेशन पढ़ने और लिखने देती है." + "देखने की अनुमतियां चालू करें" + "इस्तेमाल करने वाले को किसी ऐप्लिकेशन के लिए अनुमतियों का इस्तेमाल शुरू करने देता है. सामान्य ऐप्लिकेशन के लिए इसकी ज़रूरत कभी नहीं पड़ती." "पासवर्ड नियम सेट करना" "स्‍क्रीन लॉक पासवर्ड और पिन की लंबाई और उनमें स्वीकृत वर्णों को नियंत्रित करना." "स्‍क्रीन अनलॉक करने के की कोशिशों पर नज़र रखना" @@ -1122,8 +1133,8 @@ "ऑन" "बंद" "इसका इस्तेमाल करके कार्रवाई को पूरा करें" - "%1$s का उपयोग करके कार्रवाई पूर्ण करें" - "कार्रवाई पूर्ण करें" + "%1$s का उपयोग करके कार्रवाई पूरी करें" + "कार्रवाई पूरी करें" "इसमें खोलें" "%1$s में खोलें" "खोलें" @@ -1355,7 +1366,8 @@ "टेस्ट हार्नेस मोड बंद करने के लिए फ़ैक्ट्री रीसेट करें." "यूएसबी पोर्ट में तरल चीज़ या कचरा है" "यूएसबी पोर्ट अपने आप बंद हो गया है. ज़्यादा जानने के लिए टैप करें." - "यूएसबी पोर्ट का इस्तेमाल करना सुरक्षित है" + + "फ़ोन अब तरल चीज़ों या कचरे की पहचान नहीं करता." "गड़बड़ी की रिपोर्ट ली जा रही है…" "गड़बड़ी की रिपोर्ट शेयर करें?" @@ -1549,7 +1561,7 @@ "डेटा खर्च की चेतावनी" "अाप %s डेटा इस्तेमाल कर चुके हैं" "मोबाइल डेटा की सीमा पार हो गई है" - "Wi-Fi डेटा की सीमा पूर्ण हो गई" + "Wi-Fi डेटा की सीमा पूरी हो गई" "आपकी मौजूदा बिलिंग साइकिल के बाकी दिनों के लिए डेटा का इस्तेमाल राेक दिया गया है" "माेबाइल डेटा की सीमा से ज़्यादा" "वाई-फ़ाई की सीमा से ज़्यादा डेटा खर्च" @@ -1790,8 +1802,8 @@ "वर्ष चुनें" "%1$s को हटा दिया गया" "दफ़्तर का %1$s" - "दूसरा कार्य %1$s" - "तीसरा कार्य %1$s" + "दूसरा काम %1$s" + "तीसरा काम %1$s" "अनपिन करने से पहले पिन के लिए पूछें" "अनपिन करने से पहले लॉक खोलने के पैटर्न के लिए पूछें" "अनपिन करने से पहले पासवर्ड के लिए पूछें" @@ -1898,11 +1910,9 @@ "देखें कि अपडेट मौजूद है या नहीं" "आपके पास नए संदेश हैं" "देखने के लिए मैसेज (एसएमएस) ऐप खोलें" - "कुछ कार्य क्षमताएं सीमित हो सकती हैं" - "अनलॉक करने के लिए टैप करें" - "उपयोगकर्ता डेटा लॉक किया गया" + "शायद कुछ सुविधाएं काम न करें" "वर्क प्रोफ़ाइल लॉक है" - "कार्य प्रोफाइल अनलॉक करने के लिए टैप करें" + "वर्क प्रोफाइल अनलॉक करने के लिए टैप करें" "%1$s से कनेक्ट किया गया" "फ़ाइलें देखने के लिए टैप करें" "ऐप्लिकेशन की जानकारी" diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 01b223973965..eb091047f4ff 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -264,7 +264,7 @@ "Mrežna upozorenja" "Mreža je dostupna" "Status VPN-a" - "Administracija uređaja" + "Upozorenja IT administratora" "Upozorenja" "Prodajni demo-način" "USB veza" @@ -552,11 +552,15 @@ "Ikona otiska prsta" - "upravljati hardverom za autentifikaciju lica" + + "Aplikaciji omogućuje pozivanje načina za dodavanje i brisanje predložaka lica za upotrebu." - "upotrebljavati hardver za autentifikaciju lica" - "Aplikaciji omogućuje upotrebu hardvera za autentifikaciju lica radi autentifikacije" - "Autentifikacija licem" + + + + + + "Ponovo registrirajte svoje lice" "Za poboljšanje prepoznavanja ponovo registrirajte svoje lice" "Podaci o licu nisu točni. Pokušajte ponovo." @@ -568,7 +572,7 @@ "Pomaknite telefon niže." "Pomaknite telefon ulijevo." "Pomaknite telefon udesno." - "Pogledajte zaslon s otvorenim očima." + "Gledajte izravnije prema uređaju." "Vaše se lice ne vidi. Pogledajte telefon." "Previše kretanja. Držite telefon mirno." "Ponovo registrirajte svoje lice." @@ -582,15 +586,20 @@ "Lice nije potvrđeno. Hardver nije dostupan." - "Isteklo je vrijeme čekanja lica. Pokušajte ponovo." + + "Podaci o novom licu nisu pohranjeni. Izbrišite neko staro." - "Otkazana je radnja s licem" - "Autentifikaciju lica otkazao je korisnik" + "Otkazana je radnja s licem." + + "Previše pokušaja. Pokušajte ponovo kasnije." - "Previše pokušaja. Autentifikacija lica onemogućena." + + "Lice nije potvrđeno. Pokušajte ponovo." - "Niste postavili autentifikaciju lica" - "Autentifikacija lica nije podržana na ovom uređaju" + + + + "Lice %d" @@ -651,6 +660,8 @@ "Nositelju omogućuje povezivanje s uslugama mobilnog operatera. Ne bi trebalo biti potrebno za uobičajene aplikacije." "pristupi opciji Ne ometaj" "Omogućuje aplikaciji čitanje i pisanje konfiguracije opcije Ne ometaj." + "pokrenuti upotrebu dopuštenja za pregled" + "Dopušta nositelju pokretanje upotrebe dopuštenja za aplikaciju. Ne bi smjelo biti potrebno za uobičajene aplikacije." "Postavi pravila zaporke" "Upravlja duljinom i znakovima koji su dopušteni u zaporkama i PIN-ovima zaključavanja zaslona." "Nadziri pokušaje otključavanja zaslona" @@ -1377,7 +1388,8 @@ "Vratite na tvorničke postavke da biste onemogućili način testnog okvira." "Tekućina ili prljavština u USB priključku" "USB priključak automatski je onemogućen. Dodirnite da biste saznali više." - "Upotreba USB priključka ponovo je sigurna" + + "Telefon više ne otkriva tekućinu ili prljavštinu." "Izrada izvješća o programskoj pogrešci…" "Želite li podijeliti izvješće o programskoj pogrešci?" @@ -1932,9 +1944,7 @@ "Provjeri ažuriranja" "Imate nove poruke" "Otvorite SMS aplikaciju da biste pregledali poruke" - "Funkcije mogu biti ograničene" - "Dodirnite za otključavanje" - "Korisnički podaci zaključani" + "Funkcije mogu biti ograničene" "Radni je profil zaključan" "Dodirnite za otključavanje" "%1$s – veza je uspostavljena" diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index c790311abc2a..608a1217172e 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -261,7 +261,7 @@ "Hálózati értesítések" "Van elérhető hálózat" "VPN-állapot" - "Eszközfelügyelet" + "Rendszergazda általi értesítések" "Értesítések" "Kiskereskedelmi bemutató" "USB-kapcsolat" @@ -549,11 +549,15 @@ "Ujjlenyomat ikon" - "arcfelismerő hardver kezelése" + + "Engedélyezi, hogy az alkalmazás arcsablon-hozzáadási és -törlési metódusokat hívjon." - "arcfelismerő hardver használata" - "Engedélyezi, hogy az alkalmazás hitelesítésre használja az arcfelismerő hardvert" - "Arcfelismerés" + + + + + + "Rögzítsen újra képet az arcáról" "A felismerés javítása érdekében rögzítsen újra az arcáról készített képet" "Sikertelen az arc pontos rögzítése. Próbálja újra." @@ -565,7 +569,7 @@ "Tartsa alacsonyabban a telefont." "Mozgassa a telefont balra." "Mozgassa a telefont jobbra." - "Nyitott szemmel forduljon a telefon irányába." + "Szemből nézzen az eszközre." "Nem látszik az arca. Nézzen a telefonra." "Túl sok a mozgás. Tartsa stabilan a telefont." "Rögzítsen újra képet az arcáról." @@ -579,15 +583,20 @@ "Sikertelen arcellenőrzés. A hardver nem érhető el." - "Időtúllépés az arcbeolvasásnál. Próbálja újra." + + "Nem tárolhatók újabb arcadatok. Törölje valamelyik arcot." - "Az arccal kapcsolatos művelet megszakítva" - "Az arc hitelesítését megszakította a felhasználó" + "Az arccal kapcsolatos művelet törölve." + + "Túl sok próbálkozás. Próbálja újra később." - "Túl sokszor próbálkozott. Arcfelismerés letiltva." + + "Nem sikerült ellenőrizni az arcát. Próbálja újra." - "Nem állította be az arcfelismerést" - "Az eszköz nem támogatja az arcfelismerést" + + + + "%d arc" @@ -648,6 +657,8 @@ "Lehetővé teszi a tulajdonos számára a szolgáltatókhoz való kapcsolódást. A normál alkalmazások esetében erre nincs szükség." "hozzáférés a „Ne zavarjanak” funkcióhoz" "Az alkalmazás olvashatja és szerkesztheti a „Ne zavarjanak” funkció beállításait." + "engedélyhasználat megtekintésének elindítása" + "Lehetővé teszi a felhasználó számára, hogy elindítsa az alkalmazás engedélyhasználatát. A normál alkalmazásoknak erre soha nincs szükségük." "Jelszavakkal kapcsolatos szabályok beállítása" "A képernyőzár jelszavaiban és PIN kódjaiban engedélyezett karakterek és hosszúság vezérlése." "Képernyőzár-feloldási kísérletek figyelése" @@ -1355,7 +1366,8 @@ "A Tesztelési alapkörnyezet mód kikapcsolásához állítsa vissza a gyári beállításokat." "Folyadék vagy szennyeződés az USB-portban" "USB-port automatikusan letiltva. Koppintson, ha további információra van szüksége." - "Az USB-port biztonságosan használható" + + "A telefon már nem észlel folyadékot vagy szennyeződést." "Hibajelentés készítése…" "Megosztja a hibajelentést?" @@ -1898,9 +1910,7 @@ "Frissítés keresése" "Új üzenetei érkeztek" "SMS-alkalmazás megnyitása a megtekintéshez" - "Egyes funkciók korlátozva lehetnek" - "Koppintson a feloldáshoz" - "Felhasználói adatok zárolva" + "Egyes funkciók korlátozva lehetnek" "Munkahelyi profil zárolva" "A feloldáshoz koppintson rá" "Csatlakoztatva a(z) %1$s eszközhöz" diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 4c27f218a273..d99afcb9e9d9 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -261,7 +261,7 @@ "Ցանցային զգուշացումներ" "Ցանցը հասանելի է" "VPN կարգավիճակ" - "Սարքի կառավարում" + "Ծանուցումներ ձեր ՏՏ ադմինիստրատորից" "Ծանուցումներ" "Խանութի ցուցադրական ռեժիմ" "USB կապակցում" @@ -549,11 +549,15 @@ "Մատնահետքի պատկերակ" - "կառավարել դեմքի ճանաչման սարքը" + + "Հավելվածին թույլ է տալիս ավելացնել և հեռացնել դեմքի նմուշներ:" - "օգտագործել դեմքի ճանաչման սարքը" - "Հավելվածին թույլ է տալիս օգտագործել նույնականացման համար նախատեսված սարքը" - "Նույնականացում դեմքի միջոցով" + + + + + + "Նորից գրանցեք ձեր դեմքը" "Ճանաչումը լավացնելու համար նորից գրանցեք ձեր դեմքը" "Չհաջողվեց գրանցել դեմքի ճշգրիտ տվյալները։ Կրկնեք։" @@ -565,7 +569,7 @@ "Իջեցրեք հեռախոսը։" "Տեղափոխեք հեռախոսը ձախ:" "Տեղափոխեք հեռախոսը աջ:" - "Աչքերը բաց նայեք էկրանին։" + "Նայեք ուղիղ էկրանին։" "Ձեր դեմքը չի երևում։ Նայեք հեռախոսին։" "Շատ եք շարժում։ Հեռախոսն անշարժ պահեք։" "Նորից փորձեք։" @@ -579,15 +583,20 @@ "Չհաջողվեց հաստատել դեմքը։ Սարքն անհասանելի է:" - "Ժամանակը սպառվել է: Նորից փորձեք:" + + "Չհաջողվեց պահել նոր դեմքը։ Ջնջեք հին տարբերակը։" - "Դեմքի ճանաչումը չեղարկվել է" - "Դեմքի ճանաչումը չեղարկվել է օգտատիրոջ կողմից" + "Դեմքի ճանաչումը չեղարկվել է։" + + "Չափից շատ փորձեր եք կատարել: Փորձեք ավելի ուշ:" - "Չափազանց շատ փորձեր են արվել։ Դեմքի ճանաչումն անջատված է։" + + "Չհաջողվեց հաստատել դեմքը։ Նորից փորձեք։" - "Դուք չեք կարգավորել դեմքի ճանաչումը" - "Դեմքի ճանաչումն այս սարքում չի աջակցվում" + + + + "Դեմք %d" @@ -648,6 +657,8 @@ "Թույլ է տալիս սեփականատիրոջը կապվել օպերատորի ծառայություններին: Սովորական հավելվածների դեպքում չի պահանջվում:" "հասանելիություն «Չանհանգստացնել» գործառույթին" "Թույլ է տալիս հավելվածին փոփոխել «Չանհանգստացնել» գործառույթի կազմաձևումը:" + "թույլտվությունների մասին տվյալների հասանելիություն" + "Հավելվածին հասանելի կդառնան թույլտվությունների մասին տվյալները։ Այս թույլտվությունն անհրաժեշտ չէ սովորական հավելվածներին։" "Սահմանել գաղտնաբառի կանոնները" "Կառավարել էկրանի ապակողպման գաղտնաբառերի և PIN կոդերի թույլատրելի երկարությունն ու գրանշանները:" "Վերահսկել էկրանի ապակողպման փորձերը" @@ -1135,7 +1146,7 @@ "Փոփոխել" "Կիսվել" "Կիսվել %1$s-ի միջոցով" - "Տրամադրել" + "Կիսվել" "Ուղարկել այս հավելվածով" "Ուղարկել %1$s հավելվածով" "Ուղարկել" @@ -1347,7 +1358,7 @@ "Հպեք՝ լրացուցիչ ընտրանքների համար:" "Միացված սարքի լիցքավորում: Հպեք՝ ավելի շատ ընտրանքների համար:" "Հայտնաբերված է անալոգային աուդիո լրասարք" - "Միացված սարքը համատեղելի չէ այս հեռախոսի հետ: Հպեք` ավելին իմանալու համար:" + "Կցված սարքը համատեղելի չէ այս հեռախոսի հետ: Հպեք` ավելին իմանալու համար:" "USB վրիպազերծումը միացված է" "Հպեք՝ USB-ի վրիպազերծումն անջատելու համար" "Ընտրել` USB կարգաբերումը կասեցնելու համար:" @@ -1355,7 +1366,8 @@ "Թեստային ռեժիմն անջատելու համար զրոյացրեք կարգավորումները։" "USB միացքում ջուր կամ աղտ է հայտնաբերվել" "USB միացքն ավտոմատ անջատվել է: Հպեք՝ ավելին իմանալու համար:" - "USB միացքը կարող է օգտագործվել" + + "Հեռախոսում ջուր կամ աղտ չի հայտնաբերվել:" "Վրիպակի զեկույցի ստեղծում…" "Տրամադրե՞լ վրիպակի զեկույցը:" @@ -1898,9 +1910,7 @@ "Ստուգել նոր տարբերակի առկայությունը" "Դուք ունեք նոր հաղորդագրություններ" "Դիտելու համար բացել SMS հավելվածը" - "Որոշ գործառույթներ կարող են սահմանափակված լինել" - "Հպեք՝ ապակողպելու համար" - "Օգտատիրոջ տվյալները կողպված են" + "Որոշ գործառույթներ կարող են չգործել" "Աշխատանքային պրոֆիլը կողպված է" "Հպեք՝ այն ապակողպելու համար" "Միացված է %1$s-ին" @@ -1952,7 +1962,7 @@ "հասցե" "վարկային քարտ" "օգտանուն" - "էլփոստի հասցե" + "էլ․ հասցե" "Պահպանեք հանգստությունը և մոտակայքում ապաստարան փնտրեք:" "Ափամերձ և գետափնյա տարածքներից անմիջապես էվակուացվեք դեպի ավելի ապահով վայրեր (օրինակ՝ բարձրադիր գոտիներ):" "Պահպանեք հանգստությունը և մոտակայքում ապաստարան փնտրեք:" diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 8c9393db1896..a3cc65277774 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -261,7 +261,7 @@ "Notifikasi jaringan" "Jaringan tersedia" "Status VPN" - "Administrasi perangkat" + "Notifikasi dari admin IT" "Notifikasi" "Demo promo" "Sambungan USB" @@ -549,11 +549,11 @@ "Ikon sidik jari" - "kelola hardware autentikasi wajah" + "kelola hardware face unlock" "Mengizinkan apl memicu metode untuk menambah & menghapus template wajah untuk digunakan." - "gunakan hardware autentikasi wajah" - "Mengizinkan aplikasi untuk menggunakan hardware autentikasi wajah untuk autentikasi" - "Autentikasi Wajah" + "gunakan hardware face unlock" + "Mengizinkan aplikasi untuk menggunakan hardware face unlock untuk autentikasi" + "Face unlock" "Daftarkan kembali wajah Anda" "Untuk menyempurnakan pengenalan wajah, daftarkan kembali wajah Anda" "Tidak bisa mengambil data wajah akurat. Coba lagi." @@ -565,7 +565,7 @@ "Gerakkan ponsel ke bawah." "Gerakkan ponsel ke kiri." "Gerakkan ponsel ke kanan." - "Lihat ke layar dengan kedua mata terbuka." + "Lihat langsung ke perangkat." "Tidak dapat melihat wajah Anda. Lihat ke ponsel." "Terlalu banyak gerakan. Stabilkan ponsel." "Daftarkan ulang wajah Anda." @@ -579,15 +579,15 @@ "Tidak dapat memverifikasi wajah. Hardware tidak tersedia." - "Waktu tunggu wajah habis. Harap coba lagi." + "Coba face unlock lagi." "Tidak dapat menyimpan data wajah. Hapus dahulu data lama." - "Pemrosesan wajah dibatalkan" - "Autentikasi wajah dibatalkan oleh pengguna" + "Pemrosesan wajah dibatalkan." + "Face unlock dibatalkan oleh pengguna." "Terlalu banyak percobaan. Coba lagi nanti." - "Terlalu banyak percobaan. Autentikasi wajah dinonaktifkan." + "Terlalu banyak percobaan. Face unlock dinonaktifkan." "Tidak dapat memverifikasi wajah. Coba lagi." - "Anda belum menyiapkan autentikasi wajah" - "Autentikasi wajah tidak didukung di perangkat ini" + "Anda belum menyiapkan face unlock." + "Face unlock tidak didukung di perangkat ini." "%d wajah" @@ -648,6 +648,8 @@ "Memungkinkan pemegang untuk mengikat ke layanan operator. Tidak pernah dibutuhkan untuk aplikasi normal." "Akses status Jangan Ganggu" "Mengizinkan aplikasi membaca dan menulis konfigurasi status Jangan Ganggu." + "mulai melihat penggunaan izin" + "Memungkinkan pemegang memulai penggunaan izin untuk aplikasi. Tidak diperlukan untuk aplikasi normal." "Setel aturan sandi" "Mengontrol panjang dan karakter yang diizinkan dalam sandi dan PIN kunci layar." "Pantau upaya pembukaan kunci layar" @@ -1355,7 +1357,7 @@ "Lakukan reset ke setelan pabrik untuk menonaktifkan Mode Tes Otomatis." "Cairan atau kotoran di port USB" "Port USB otomatis dinonaktifkan. Tap untuk mempelajari lebih lanjut." - "Port USB aman digunakan" + "Boleh menggunakan port USB" "Ponsel tidak lagi mendeteksi adanya cairan atau kotoran." "Mengambil laporan bug…" "Bagikan laporan bug?" @@ -1898,9 +1900,7 @@ "Periksa apakah ada update" "Ada pesan baru" "Buka aplikasi SMS untuk melihat" - "Beberapa fungsi mungkin terbatas" - "Tap untuk membuka kunci" - "Data pengguna dikunci" + "Beberapa fungsi mungkin terbatas" "Profil kerja terkunci" "Tap untuk membuka kunci profil kerja" "Tersambung ke %1$s" @@ -1926,7 +1926,7 @@ "menit" "Setel waktu" "Masukkan waktu yang valid" - "Ketik waktu" + "Ketikkan waktu" "Beralih ke mode masukan teks untuk masukan waktu." "Beralih ke mode jam untuk masukan waktu." "Opsi IsiOtomatis" diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index a2e058d65f76..00637a4e54c4 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -261,7 +261,7 @@ "Viðvaranir netkerfis" "Net í boði" "Staða VPN" - "Stjórnun tækis" + "Tilkynningar frá kerfisstjóra" "Tilkynningar" "Kynningarútgáfa fyrir verslanir" "USB-tenging" @@ -549,11 +549,15 @@ "Fingrafaratákn" - "stjórna vélbúnaði andlitsgreiningar" + + "Leyfir forritinu að beita aðferðum til að bæta við og eyða andlitssniðmátum til notkunar." - "nota vélbúnað andlitsgreiningar" - "Leyfir forritinu að nota andlitsgreiningarvélbúnað til auðkenningar" - "Andlitsgreining" + + + + + + "Skráðu andlitið þitt aftur" "Skráðu andlitið þitt til að bæta kennsl" "Nákvæm andlitsgögn fengust ekki. Reyndu aftur." @@ -565,7 +569,7 @@ "Færðu símann neðar." "Færðu símann til vinstri." "Færðu símann til hægri." - "Horfðu á skjáinn með opin augu." + "Horfðu beint á tækið." "Sé ekki andlit þitt. Horfðu á símann." "Of mikil hreyfing. Haltu símanum stöðugum." "Skráðu nafnið þitt aftur." @@ -579,15 +583,20 @@ "Andlit ekki staðfest. Vélbúnaður er ekki tiltækur." - "Tímamörk runnu út fyrir andlit. Reyndu aftur." + + "Ekki er hægt að vista ný andlitsgögn. Eyddu gömlu fyrst." - "Hætt við andlitsgreiningu" - "Notandi hætti við andlitsgreiningu" + "Hætt við andlitsgreiningu." + + "Of margar tilraunir. Reyndu aftur síðar." - "Of margar tilraunir. Slökkt á andlitsgreiningu." + + "Ekki tókst að staðfesta andlit. Reyndu aftur." - "Þú hefur ekki sett upp andlitsgreiningu" - "Andlitsgreining er ekki studd í þessu tæki." + + + + "Andlit %d" @@ -648,6 +657,8 @@ "Leyfir handhafa að bindast þjónustu símafyrirtækis. Ætti aldrei að vera nauðsynlegt fyrir venjuleg forrit." "aðgangur að „Ónáðið ekki“" "Leyfir forriti að lesa og skrifa í grunnstillingu „Ónáðið ekki“." + "heimildanotkun upphafsyfirlits" + "Leyfir handhafa að byrja heimildanotkun fyrir forrit. Ætti aldrei að þurfa fyrir venjuleg forrit." "Setja reglur um aðgangsorð" "Stjórna lengd og fjölda stafa í aðgangsorðum og PIN-númerum skjáláss." "Fylgjast með tilraunum til að taka skjáinn úr lás" @@ -1356,7 +1367,8 @@ "Núllstilltu til að slökkva á stillingu prófunarvangs." "Vökvi eða óhreinindi í USB-tengi" "USB-tengi er gert óvirkt sjálfkrafa. Ýttu til að fá frekari upplýsingar." - "Óhætt að nota USB-tengi" + + "Síminn greinir ekki lengur vökva eða óhreinindi" "Tekur við villutilkynningu…" "Deila villutilkynningu?" @@ -1899,9 +1911,7 @@ "Leita að uppfærslu" "Þú ert með ný skilaboð" "Opnaðu SMS-forritið til að skoða" - "Sum virkni kann að vera takmörkuð" - "Ýttu til að opna" - "Notendagögn læst" + "Sum virkni kann að vera takmörkuð" "Vinnusnið læst" "Ýttu til að opna vinnusnið" "Tengt við %1$s" diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 623c0440e4fe..96d44c6c454c 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -261,7 +261,7 @@ "Avvisi di rete" "Rete disponibile" "Stato della VPN" - "Amministrazione dispositivo" + "Avvisi dall\'amministratore IT" "Avvisi" "Demo retail" "Connessione USB" @@ -549,11 +549,11 @@ "Icona dell\'impronta digitale" - "gestisci l\'hardware per l\'autenticazione dei volti" + "gestisci l\'hardware per Sblocco col sorriso" "Consente all\'app di richiamare i metodi per aggiungere e rimuovere i modelli di volti." - "utilizza l\'hardware per l\'autenticazione dei volti" - "Consente all\'app di utilizzare hardware per l\'autenticazione dei volti" - "Autenticazione volti" + "utilizza l\'hardware per Sblocco col sorriso" + "Consente all\'app di utilizzare hardware per l\'autenticazione con Sblocco col sorriso" + "Sblocco col sorriso" "Registra di nuovo il volto" "Per migliorare il riconoscimento, registra di nuovo il tuo volto" "Impossibile acquisire dati viso accurati. Riprova." @@ -565,7 +565,7 @@ "Sposta il telefono più in basso." "Sposta il telefono verso sinistra." "Sposta il telefono verso destra." - "Guarda lo schermo con gli occhi aperti." + "Guarda più direttamente verso il dispositivo." "Impossibile vedere il volto. Guarda il telefono." "Troppo movimento. Tieni fermo il telefono." "Ripeti l\'acquisizione del volto." @@ -579,15 +579,15 @@ "Imposs. verificare volto. Hardware non disponibile." - "Timeout operazione associata al volto. Riprova." + "Riprova lo Sblocco col sorriso." "Imposs. salvare dati nuovi volti. Elimina un volto vecchio." - "Operazione associata al volto annullata" - "Autenticazione volti annullata dall\'utente" + "Operazione associata al volto annullata." + "Sblocco col sorriso annullato dall\'utente." "Troppi tentativi. Riprova più tardi." - "Troppi tentativi. Autenticazione volti disattivata." + "Troppi tentativi. Sblocco col sorriso disattivato" "Impossibile verificare il volto. Riprova." - "Non hai configurato l\'autenticazione volti" - "Autenticazione volti non supportata su questo dispositivo" + "Non hai configurato lo Sblocco col sorriso." + "Sblocco col sorriso non supportato su questo dispositivo." "Volto %d" @@ -648,6 +648,8 @@ "Consente al titolare di collegarsi a servizi dell\'operatore. Non dovrebbe mai essere necessaria per le normali app." "accesso alla funzione Non disturbare" "Consente all\'app di leggere e modificare la configurazione della funzione Non disturbare." + "avvio dell\'uso dell\'autorizzazione di visualizzazione" + "Consente al titolare di avviare l\'uso delle autorizzazioni per un\'app. Non dovrebbe essere mai necessaria per le normali applicazioni." "Impostare regole per le password" "Controlla la lunghezza e i caratteri ammessi nelle password e nei PIN del blocco schermo." "Monitorare tentativi di sblocco dello schermo" @@ -1355,7 +1357,7 @@ "Ripristina le impostazioni di fabbrica per disattivare la modalità test harness." "Liquidi o detriti nella porta USB" "La porta USB viene disattivata automaticamente. Tocca per avere ulteriori informazioni." - "Puoi usare la porta USB in sicurezza" + "Utilizzo porta USB consentito" "Il telefono non rileva più liquidi o detriti." "Recupero della segnalazione di bug…" "Condividere la segnalazione di bug?" @@ -1898,9 +1900,7 @@ "Verifica la presenza di aggiornamenti" "Hai nuovi messaggi" "Apri l\'app SMS per la visualizzazione" - "Funzioni potenzial. limitate" - "Tocca per sbloccare" - "Dati utente bloccati" + "Funzionalità potenzialmente limitate" "Profilo di lavoro bloccato" "Tocca per sbloc. prof. di lav." "Connesso a %1$s" @@ -2026,6 +2026,6 @@ %s + %d file %s + %d file - "Condivisione diretta non attiva" + "Condivisione diretta non disponibile" "Elenco di app" diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index fe481a47cea2..78085c72591e 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -267,7 +267,7 @@ "התראות רשת" "יש רשת זמינה" "‏סטטוס ה-VPN" - "ניהול מכשירים" + "‏התראות ממנהל ה-IT" "התראות" "הדגמה לקמעונאים" "‏חיבור USB" @@ -555,11 +555,15 @@ "סמל טביעת אצבע" - "ניהול של חומרה של זיהוי פנים לצורך אימות" + + "מאפשרת לאפליקציה להפעיל שיטות להוספה ומחיקה של תבניות פנים שבהן ייעשה שימוש." - "שימוש בחומרה של זיהוי פנים לצורך אימות" - "מאפשרת לאפליקציה להשתמש בחומרה של זיהוי פנים לצורך אימות" - "אימות פנים" + + + + + + "יש לבצע רישום מחדש של הפנים שלך" "לשיפור הזיהוי יש לבצע רישום מחדש של הפנים שלך" "לא ניתן היה לקלוט את הפנים במדויק. יש לנסות שוב." @@ -571,7 +575,7 @@ "צריך להוריד את הטלפון." "צריך להזיז את הטלפון שמאלה." "צריך להזיז את הטלפון ימינה." - "צריך להביט במסך בעיניים פקוחות." + "יש להביט ישירות אל המכשיר." "אי אפשר לראות את הפנים שלך. צריך להביט אל הטלפון." "יותר מדי תנועה. יש להחזיק את הטלפון בצורה יציבה." "יש לרשום מחדש את הפנים." @@ -579,24 +583,26 @@ "דומה מדי, יש לשנות תנוחה." "עליך ליישר קצת את הראש." "עליך ליישר קצת את הראש." - - - - - - + "עליך ליישר קצת את הראש." + "יש להסיר כל דבר שמסתיר את הפנים." + "יש לנקות את החיישן שבקצה העליון של המסך." "לא ניתן לאמת את הפנים. החומרה לא זמינה." - "חלף הזמן הקצוב לזיהוי הפנים. יש לנסות שוב." + + "לא ניתן לאחסן נתוני פנים. תחילה יש למחוק פנים ישנים." - "פעולת הפנים בוטלה" - "זיהוי הפנים בוטל על ידי המשתמש" + "פעולת הפנים בוטלה." + + "יותר מדי ניסיונות. יש לנסות שוב מאוחר יותר." - "יותר מדי ניסיונות. אימות פנים הושבת." + + "לא ניתן לאמת את הפנים. יש לנסות שוב." - "לא הגדרת אימות פנים" - "המכשיר הזה לא תומך באימות פנים" + + + + "פנים %d" @@ -657,6 +663,8 @@ "מאפשר לבעלים לאגד לשירות ספק. לעולם לא אמור להיות נחוץ לאפליקציות רגילות." "גישה אל \'נא לא להפריע\'" "מאפשר לאפליקציה לקרוא ולכתוב את התצורה של \'נא לא להפריע\'." + "התחלת צפייה בהרשאות השימוש" + "מאפשרת לבעלים להפעיל את השימוש בהרשאות עבור אפליקציה מסוימת. הרשאה זו אף פעם לא נדרשת עבור אפליקציות רגילות." "הגדר כללי סיסמה" "קביעת האורך הנדרש והתווים המותרים בסיסמאות ובקודי הגישה של מסך הנעילה." "מעקב אחר ניסיונות לביטול של נעילת המסך" @@ -1402,7 +1410,8 @@ "כדי להשבית את מצב מסגרת בדיקה צריך לאפס להגדרות היצרן." "‏יש נוזלים או חלקיקים ביציאת ה-USB" "‏יציאת ה-USB הושבתה באופן אוטומטי. יש להקיש לקבלת מידע נוסף." - "‏יציאת ה-USB בטוחה לשימוש" + + "הטלפון לא מזהה יותר נוזלים וחלקיקים." "עיבוד דוח על באג..." "האם לשתף דוח על באג?" @@ -1969,9 +1978,7 @@ "האם יש עדכון חדש?" "יש לך הודעות חדשות" "‏פתח את אפליקציית ה-SMS כדי להציג" - "ייתכן שחלק מהפונקציונליות תהיה מוגבלת" - "הקש כדי לבטל את הנעילה" - "נתוני משתמש נעולים" + "ייתכן שחלק מהפונקציונליות תהיה מוגבלת" "פרופיל העבודה נעול" "הקש לביטול נעילת פרופיל העבודה" "מחובר אל %1$s" diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 532f1cbe2fb7..e71bc0a30172 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -261,7 +261,7 @@ "ネットワーク通知" "ネットワークを利用できます" "VPN のステータス" - "デバイス管理" + "IT 管理者からの通知" "通知" "販売店デモ" "USB 接続" @@ -549,11 +549,15 @@ "指紋アイコン" - "顔認証ハードウェアの管理" + + "使用する顔テンプレートの追加や削除を行うメソッドの呼び出しをアプリに許可します。" - "顔認証ハードウェアの使用" - "顔認証ハードウェアを認証に使用することをアプリに許可します" - "顔認証" + + + + + + "顔の再登録" "認識を改善するには、顔を再登録してください" "顔を認識できませんでした。もう一度お試しください。" @@ -565,7 +569,7 @@ "スマートフォンをもっと低い位置に下げてください。" "スマートフォンを左に動かしてください。" "スマートフォンを右に動かしてください。" - "画面に顔を向けて目を閉じないようにしてください。" + "もっとまっすぐデバイスに顔を向けてください。" "顔を確認できません。スマートフォンを見てください。" "あまり動かさないでください。安定させてください。" "顔を登録し直してください。" @@ -579,15 +583,20 @@ "顔を確認できません。ハードウェアを利用できません。" - "顔認証のタイムアウトです。もう一度お試しください。" + + "新しい顔データを保存できません。古いデータを削除してください。" - "顔の操作をキャンセルしました" - "顔の認証がユーザーによりキャンセルされました" + "顔の操作をキャンセルしました。" + + "試行回数の上限です。後でもう一度お試しください。" - "入力回数が上限を超えました。顔認証が無効になりました。" + + "顔を確認できません。もう一度お試しください。" - "顔認証を設定していません" - "顔認証はこのデバイスではご利用いただけません" + + + + "顔 %d" @@ -648,6 +657,8 @@ "携帯通信会社のサービスにバインドすることを所有者に許可します。通常のアプリでは不要です。" "サイレント モードへのアクセス" "サイレント モード設定の読み取りと書き込みをアプリに許可します。" + "表示権限の使用の開始" + "アプリの権限使用の開始を所有者に許可します。通常のアプリでは不要です。" "パスワードルールの設定" "画面ロックのパスワードとPINの長さと使用できる文字を制御します。" "画面ロック解除試行の監視" @@ -1355,7 +1366,8 @@ "出荷時設定にリセットしてテストハーネス モードを無効にしてください。" "USB ポート内の液体やゴミ" "USB ポートが自動的に無効になりました。タップして詳細をご確認ください。" - "USB ポートを安全に使用できます" + + "液体やゴミは検出されなくなりました。" "バグレポートを取得しています…" "バグレポートを共有しますか?" @@ -1664,8 +1676,8 @@ "ユーザー補助機能のショートカットにより %1$s は ON になっています" "ユーザー補助機能のショートカットにより %1$s は OFF になっています" "%1$s を使用するには、音量大と音量小の両方のボタンを 3 秒間長押ししてください" - "[ユーザー補助] ボタンをタップした場合に使用する機能を選択してください。" - "機能を変更するには、[ユーザー補助] ボタンを押し続けてください。" + "ユーザー補助機能ボタンをタップした場合に使用する機能を選択してください。" + "機能を変更するには、ユーザー補助機能ボタンを長押ししてください。" "拡大" "現在のユーザーは%1$sです。" "%1$sに切り替えています…" @@ -1898,9 +1910,7 @@ "アップデートを確認" "新着メッセージがあります" "表示するには SMS アプリを開きます" - "一部機能が制限されている可能性" - "ロック解除するにはタップします" - "ユーザーデータはロック状態です" + "一部の機能が制限されることがあります" "仕事用プロファイル: ロック" "タップしてプロファイルをロック解除" "%1$s に接続しました" diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index a610af36e840..d9ae8ead5d43 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -261,7 +261,7 @@ "ქსელის გაფრთხილებები" "ქსელი ხელმისაწვდომია" "VPN-ის სტატუსი" - "მოწყობილობის ადმინისტრირება" + "გაფრთხილებები თქვენი IT ადმინისტრატორისგან" "გაფრთხილებები" "დემო-რეჟიმი საცალო მოვაჭრეებისთვის" "USB კავშირი" @@ -549,11 +549,15 @@ "თითის ანაბეჭდის ხატულა" - "სახის ამოცნობის აპარატურის მართვა" + + "საშუალებას აძლევს აპს, დაამატოს და წაშალოს სახეების შაბლონები." - "სახის ამოცნობის აპარატურის გამოყენება" - "საშუალებას აძლევს აპს, ავტორიზაციისთვის გამოიყენოს სახის ამოცნობის აპარატურა" - "სახის ამოცნობა" + + + + + + "დაარეგისტრირეთ თქვენი სახე ხელახლა" "ამოცნობის გასაუმჯობესებლად, გთხოვთ, ხელახლა დაარეგისტრიროთ თქვენი სახე" "სახის ზუსტი მონაცემები არ აღიბეჭდა. ცადეთ ხელახლა." @@ -565,7 +569,7 @@ "გადაანაცვლეთ ტელეფონი ქვემოთ." "გადაანაცვლეთ ტელეფონი მარცხნივ." "გადაანაცვლეთ ტელეფონი მარჯვნივ." - "შეხედეთ ეკრანს გახელილი თვალებით." + "გთხოვთ, უფრო პირდაპირ შეხედოთ თქვენს მოწყობილობას." "თქვენი სახე არ ჩანს. შეხედეთ ტელეფონს." "მეტისმეტად მოძრაობთ. მყარად დაიჭირეთ ტელეფონი." "გთხოვთ, ხელახლა დაარეგისტრიროთ თქვენი სახე." @@ -579,15 +583,20 @@ "სახე ვერ დასტურდება. აპარატი მიუწვდომელია." - "სახის ამოცნობის დრო ამოიწურა. ცადეთ ხელახლა." + + "სახის ახალი მონაცემები ვერ ინახება. ჯერ ძველი წაშალეთ." - "სახის ოპერაცია გაუქმდა." - "სახის ავთენტიფიკაცია გაუქმდა მომხმარებლის მიერ" + "სახის ამოცნობა გაუქმდა." + + "დაფიქსირდა ბევრი მცდელობა. ცადეთ მოგვიანებით." - "მეტისმეტად ბევრი მცდელობა იყო. სახის ამოცნობა გათიშულია." + + "სახის დადასტურება ვერ ხერხდება. ცადეთ ხელახლა." - "თქვენ არ დაგიყენებიათ სახის ავთენტიფიკაცია" - "სახის ავთენტიფიკაცია ამ მოწყობილობაზე მხარდაჭერილი არ არის" + + + + "სახე %d" @@ -648,6 +657,8 @@ "მფლობელს აძლევს ოპერატორის სერვისებთან დაკავშირების საშუალებას. ჩვეულებრივი აპებისთვის არასოდეს იქნება საჭირო." "ფუნქციაზე „არ შემაწუხოთ“ წვდომა" "საშუალებას აძლევს აპს, წაიკითხოს და დაწეროს კონფიგურაცია „არ შემაწუხოთ“." + "ნახვის ნებართვის გამოყენების დაწყება" + "მფლობელს საშუალებას აძლევს, დაიწყოს აპის ნებართვის გამოყენება. ჩვეულებრივი აპებისთვის არასოდეს უნდა იყოს საჭირო." "პაროლის წესების დაყენება" "აკონტროლეთ ეკრანის ბლოკირების პაროლებისა და PIN-ების სიმბოლოების სიგრძე." "ეკრანის განბლოკვის მცდელობების მონიტორინგი" @@ -1355,7 +1366,8 @@ "დააბრუნეთ ქარხნული პარამეტრები „გარემო ტესტირებისთვის“ რეჟიმის გასათიშად." "USB პორტში აღმოჩენილია სითხე ან ჭუჭყი" "USB პორტი ავტომატურად გათიშულია. შეეხეთ დამატებითი ინფორმაციისთვის." - "USB პორტის გამოყენება ახლა უსაფრთხოა" + + "ტელეფონი აღარ აღმოაჩენს სითხეს ან ჭუჭყს." "მიმდინარეობს ხარვეზის შესახებ ანგარიშის შექმნა…" "გსურთ ხარვეზის შესახებ ანგარიშის გაზიარება?" @@ -1898,9 +1910,7 @@ "განახლების შემოწმება" "თქვენ ახალი შეტყობინებები გაქვთ" "სანახავად, გახსენით SMS აპი" - "ზოგიერთი ფუნქცია შეიძლება შეიზღუდოს" - "შეეხეთ განსაბლოკად" - "მომხმ.-ის მონაცემები ჩაკეტილია" + "ზოგიერთი ფუნქცია შეიძლება შეიზღუდოს" "სამსახურის პროფილი ჩაკეტილია" "შეეხეთ პროფილის განსაბლოკად" "დაკავშირებულია %1$s-თან" diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 085b5d85b585..cb43ba04a85b 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -261,7 +261,7 @@ "Желі дабылдары" "Желі қолжетімді" "VPN күйі" - "Құрылғыны басқару" + "АТ әкімшісі жіберген ескертулер" "Дабылдар" "Бөлшек саудаға арналған демо нұсқасы" "USB байланысы" @@ -549,11 +549,15 @@ "Саусақ ізі белгішесі" - "бетті тану жабдығын басқару" + + "Қолданбаға пайдаланатын бет үлгілерін енгізу және жою әдістерін шақыруға мүмкіндік береді." - "бетті тану жабдығын пайдалану" - "Қолданбаға бетті тану жабдығын қолдануға рұқсат етеді" - "Бетті тану" + + + + + + "Бетті қайта тіркеу" "Құрылғы жүзіңізді жақсырақ тануы үшін, бетіңізді қайта тіркеңіз." "Бет деректері дұрыс алынбады. Әрекетті қайталаңыз." @@ -565,7 +569,7 @@ "Телефонды төменірек ұстаңыз." "Телефонды солға жылжытыңыз." "Телефонды оңға жылжытыңыз." - "Экранға көзіңізді ашып қараңыз." + "Құрылғының камерасына тура қараңыз." "Бетіңіз көрінбейді. Телефонға қараңыз." "Қозғалыс тым көп. Телефонды қозғалтпаңыз." "Қайта тіркеліңіз." @@ -579,15 +583,20 @@ "Бетті тану мүмкін емес. Жабдық қолжетімді емес." - "Бетті тану уақыты бітті. Әрекетті қайталаңыз." + + "Жаңа бетті сақтау мүмкін емес. Алдымен ескісін жойыңыз." - "Бетті танудан бас тартылды." - "Пайдаланушы бетті тану әрекетінен бас тартты." + "Бетті танудан бас тартылды." + + "Тым көп әрекет жасалды. Кейінірек қайталаңыз." - "Тым көп әрекет жасалды. Бетті тану функциясы өшірілді." + + "Бетті тану мүмкін емес. Әрекетті қайталаңыз." - "Бетті тану функциясы реттелмеген." - "Бетті тану функциясын бұл құрылғы қолдамайды." + + + + "%d беті" @@ -648,6 +657,8 @@ "Иесіне оператор қызметтеріне қосылуға мүмкіндік береді. Қалыпты қолданбалар үшін қажет болмайды." "\"Мазаламау\" режиміне кіру" "Қолданбаға «Мазаламау» конфигурациясын оқу және жазу мүмкіндігін береді." + "рұқсаттарды пайдалану туралы деректерді көру" + "Пайдаланушы қолданбаға берілетін рұқсаттарды басқара алады. Ондай рұқсаттар әдеттегі қолданбаларға керек емес." "Құпия сөз ережелерін тағайындау" "Экран бекітпесінің құпия сөздерінің және PIN кодтарының ұзындығын және оларда рұқсат етілген таңбаларды басқару." "Экран құлпын ашу әркеттерін бақылау" @@ -1356,7 +1367,8 @@ "Сынақ бағдарламасы режимін өшіру үшін зауыттық күйіне қайтарыңыз." "USB портына сұйықтық немесе қоқыс кірді" "USB порты автоматты түрде өшірілді. Толығырақ ақпарат алу үшін түртіңіз." - "USB портын пайдалана беруге болады" + + "Телефон бұдан былай сұйықтықты немесе қоқысты анықтамайды." "Қате туралы есеп алынуда…" "Қате туралы есепті бөлісу керек пе?" @@ -1666,7 +1678,7 @@ "Арнайы мүмкіндіктер таңбашасы %1$s қызметін өшірді" "%1$s қызметін пайдалану үшін дыбыс деңгейін реттейтін екі түймені де 3 секунд басып тұрыңыз" "\"Арнайы мүмкіндіктер\" түймесін түрткенде пайдаланатын мүмкіндікті таңдаңыз:" - "Мүмкіндіктерді өзгерту үшін \"Арнайы мүмкіндіктер\" түймесін түртіп, ұстап тұрыңыз." + "Мүмкіндіктерді өзгерту үшін \"Арнайы мүмкіндіктер\" түймесін басып тұрыңыз." "Ұлғайту" "Ағымдағы пайдаланушы %1$s." "%1$s ауысу орындалуда…" @@ -1899,9 +1911,7 @@ "Жаңартылған нұсқаны тексеру" "Сізде жаңа хабарлар бар" "Көру үшін SMS қолданбасын ашыңыз" - "Кейбір функциялар істемеуі мүмкін" - "Құлыпты ашу үшін түртіңіз" - "Пайдаланушы деректері құлыптаулы" + "Кейбір функциялар істемеуі мүмкін." "Жұмыс профилі құлыптаулы" "Жұмыс профилінің құлпын ашу үшін түртіңіз" "%1$s қосылу орындалды" diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 3ef1bf08c6d5..f1a573eeef95 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -261,7 +261,7 @@ "ការ​ជូនដំណឹង​អំពី​បណ្តាញ" "មានបណ្តាញ" "ស្ថានភាព VPN" - "ការ​គ្រប់គ្រង​ឧបករណ៍" + "ការជូនដំណឹង​ពី​អ្នកគ្រប់គ្រង​ផ្នែកព័ត៌មានវិទ្យា​របស់អ្នក" "ការ​ជូនដំណឹង" "របៀបដាក់បង្ហាញក្នុងហាង" "ការ​តភ្ជាប់ USB" @@ -549,11 +549,15 @@ "រូបតំណាងស្នាមម្រាមដៃ" - "គ្រប់គ្រង​ផ្នែករឹង​ផ្ទៀងផ្ទាត់​ផ្ទៃ​មុខ" + + "អនុញ្ញាតឱ្យកម្មវិធីប្រើវិធីសាស្ត្រដើម្បី​បញ្ចូល និងលុបទម្រង់​គំរូ​ផ្ទៃមុខសម្រាប់ប្រើប្រាស់។" - "ប្រើ​ផ្នែករឹង​ផ្ទៀងផ្ទាត់​ផ្ទៃ​មុខ" - "អនុញ្ញាត​ឱ្យ​កម្មវិធី​ប្រើ​ផ្នែករឹង​ផ្ទៀងផ្ទាត់​ផ្ទៃមុខ​សម្រាប់​ការផ្ទៀងផ្ទាត់" - "ការផ្ទៀងផ្ទាត់មុខ" + + + + + + "ស្កេន​បញ្ចូល​មុខរបស់អ្នក​ម្ដងទៀត" "ដើម្បី​ធ្វើឱ្យ​ការសម្គាល់មុខ​ប្រសើរជាងមុន សូមស្កេន​បញ្ចូល​មុខរបស់អ្នក​ម្ដងទៀត" "មិនអាច​ថត​ទិន្នន័យទម្រង់មុខ​បាន​ត្រឹមត្រូវទេ។ សូមព្យាយាមម្ដងទៀត។" @@ -565,7 +569,7 @@ "ផ្លាស់ទីទូរសព្ទឱ្យទាបជាងមុន។" "ផ្លាស់ទី​ទូរសព្ទទៅខាងឆ្វេង។" "ផ្លាស់ទីទូរសព្ទទៅខាងស្ដាំ។" - "បើកភ្នែក ហើយមើលអេក្រង់។" + "សូមមើល​ឱ្យចំ​ឧបករណ៍​របស់អ្នក​ជាងមុន។" "មើលមិនឃើញ​មុខងារ​របស់អ្នកទេ។ សូមសម្លឹងមើល​ទូរសព្ទ។" "មាន​ចលនា​ខ្លាំងពេក។ សូមកាន់​ទូរសព្ទ​ឱ្យនឹង។" "សូម​​ស្កេន​បញ្ចូល​មុខរបស់អ្នក​ម្ដងទៀត។" @@ -579,15 +583,20 @@ "មិនអាច​ផ្ទៀងផ្ទាត់​មុខបានទេ។ មិនមាន​ហាតវែរទេ។" - "ការសម្គាល់​មុខ​បាន​អស់ម៉ោង។ សូមព្យាយាមម្ដងទៀត។" + + "មិនអាច​ផ្ទុកទិន្នន័យទម្រង់​មុខថ្មី​បានទេ។ សូមលុបទិន្នន័យទម្រង់​មុខចាស់ជាមុនសិន។" - "បាន​បោះបង់​ប្រតិបត្តិការចាប់​ទម្រង់មុខ" - "ការផ្ទៀងផ្ទាត់មុខ​ត្រូវបានបោះបង់​ដោយអ្នកប្រើប្រាស់" + "បាន​បោះបង់​ប្រតិបត្តិការចាប់​ផ្ទៃមុខ។" + + "ព្យាយាមចូលច្រើនពេកហើយ។ សូមព្យាយាមម្តងទៀតពេលក្រោយ។" - "ព្យាយាមចូលច្រើនពេក។ បានបិទ​ការផ្ទៀងផ្ទាត់មុខ។" + + "មិន​អាច​ផ្ទៀងផ្ទាត់​មុខ​បាន​ទេ។ សូមព្យាយាមម្ដងទៀត។" - "អ្នក​មិនទាន់​រៀបចំ​ការផ្ទៀងផ្ទាត់​មុខនៅឡើយទេ" - "មិន​អាច​ប្រើ​ការផ្ទៀងផ្ទាត់​មុខ​នៅលើ​ឧបករណ៍​នេះ​បានទេ" + + + + "ផ្ទៃមុខទី %d" @@ -648,6 +657,8 @@ "អនុញ្ញាតឲ្យម្ចាស់ភ្ជាប់ទៅសេវាកម្មក្រុមហ៊ុនផ្តល់សេវាកម្ម។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។" "ចូលដំណើរការ កុំរំខាន" "អនុញ្ញាតឲ្យកម្មវិធីអាន និងសរសេរការកំណត់រចនាសម្ព័ន្ធមុខងារ កុំរំខាន។" + "ចាប់ផ្ដើម​មើល​ការប្រើប្រាស់​ការអនុញ្ញាត" + "អនុញ្ញាត​ឱ្យម្ចាស់​ចាប់ផ្ដើម​ការប្រើប្រាស់​ការអនុញ្ញាត​សម្រាប់កម្មវិធី។ មិនគួរ​ចាំបាច់​សម្រាប់​កម្មវិធី​ធម្មតា​ទេ។" "កំណត់​ក្បួន​ពាក្យ​សម្ងាត់" "គ្រប់គ្រងប្រវែង និងតួអក្សរដែលអនុញ្ញាតឲ្យប្រើក្នុងពាក្យសម្ងាត់ និងលេខសម្ងាត់ចាក់សោអេក្រង់។" "តាមដាន​ការ​ព្យាយាម​ដោះ​សោ​អេក្រង់" @@ -705,7 +716,7 @@ "ផ្ទះ" "កន្លែង​ធ្វើការ" "ផ្សេងៗ" - "តាម​តម្រូវការ" + "ផ្ទាល់ខ្លួន" "កន្លែង​ធ្វើការ" @@ -722,7 +733,7 @@ "ICQ" "Jabber" - "តាម​បំណង" + "ផ្ទាល់ខ្លួន" "ផ្ទះ" "​ចល័ត" "កន្លែង​ធ្វើការ" @@ -1357,7 +1368,8 @@ "ធ្វើការកំណត់ដូចដើមឡើងវិញ ដើម្បី​បិទ​មុខងារប្រមូលធ្វើតេស្ត។" "មានទឹក ឬ​កម្ទេចផ្សេងៗ​នៅក្នុងរន្ធ USB" "រន្ធ USB ត្រូវបាន​បិទ​ដោយ​ស្វ័យប្រវត្តិ។ សូមចុច​ដើម្បី​ស្វែងយល់​បន្ថែម។" - "អាច​ប្រើរន្ធ USB បានដោយ​សុវត្ថិភាព" + + "ទូរសព្ទ​រកមិនឃើញ​ទឹក ឬ​កម្ទេចផ្សេងៗ​ទេ។" "កំពុងទទួលយករបាយការណ៍កំហុស…" "ចែករំលែករបាយការណ៍កំហុសឬ?" @@ -1900,9 +1912,7 @@ "រក​មើល​កំណែ​ថ្មី" "អ្នកមានសារថ្មី" "បើកកម្មវិធីសារ SMS ដើម្បីមើល" - "លទ្ធភាពប្រើមុខងារមួយចំនួនអាចត្រូវបាកម្រិត" - "ប៉ះដើម្បីដោះសោ" - "ទិន្នន័យអ្នកប្រើជាប់សោ" + "មុខងារ​មួយចំនួន​អាច​ត្រូវ​បាន​កម្រិត" "ប្រវត្តិរូបការងារត្រូវជាប់សោ" "ប៉ះដើម្បីដោះសោប្រវត្តិរូបការងារ" "បានភ្ជាប់ទៅ %1$s" diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index dab10df3c1ef..fa42a603ce89 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -261,7 +261,7 @@ "ನೆಟ್‌ವರ್ಕ್ ಎಚ್ಚರಿಕೆಗಳು" "ನೆಟ್‌ವರ್ಕ್ ಲಭ್ಯವಿದೆ" "VPN ಸ್ಥಿತಿ" - "ಸಾಧನ ನಿರ್ವಹಣೆ" + "ನಿಮ್ಮ IT ವಿಭಾಗದ ನಿರ್ವಾಹಕರಿಂದ ಎಚ್ಚರಿಕೆಗಳು" "ಎಚ್ಚರಿಕೆಗಳು" "ರಿಟೇಲ್ ಡೆಮೋ" "USB ಸಂಪರ್ಕ" @@ -549,11 +549,11 @@ "ಬೆರಳಚ್ಚು ಐಕಾನ್" - "ಮುಖ ದೃಢೀಕರಣ ಹಾರ್ಡ್‌ವೇರ್‌ ಅನ್ನು ನಿರ್ವಹಿಸಿ" + "ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಹಾರ್ಡ್‌ವೇರ್ ಅನ್ನು ನಿರ್ವಹಿಸಿ" "ಬಳಕೆಗೆ ಮುಖದ ಟೆಂಪ್ಲೇಟ್‌ಗಳನ್ನು ಸೇರಿಸಲು ಮತ್ತು ಅಳಿಸಲು ವಿಧಾನಗಳನ್ನು ಮನವಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ." - "ಮುಖ ದೃಢೀಕರಣ ಹಾರ್ಡ್‌ವೇರ್‌ ಅನ್ನು ಬಳಸಿ" - "ಧೃಡೀಕರಣಕ್ಕಾಗಿ ಮುಖದ ಹಾರ್ಡ್‌ವೇರ್ ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ" - "ಮುಖ ಗುರುತಿಸುವಿಕೆ" + "ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಹಾರ್ಡ್‌ವೇರ್ ಬಳಸಿ" + "ಪ್ರಮಾಣೀಕರಣಕ್ಕಾಗಿ ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಹಾರ್ಡ್‌ವೇರ್ ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ" + "ಫೇಸ್ ಅನ್‌ಲಾಕ್" "ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ" "ಗುರುತಿಸುವಿಕೆಯನ್ನು ಹೆಚ್ಚಿಸಲು ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ" "ಸರಿಯಾಗಿ ಮುಖ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಲಾಗಲಿಲ್ಲ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ." @@ -565,7 +565,7 @@ "ಫೋನ್ ಅನ್ನು ಕೆಳಗೆ ಸರಿಸಿ." "ಫೋನ್ ಅನ್ನು ಎಡಕ್ಕೆ ಸರಿಸಿ." "ಫೋನ್ ಅನ್ನು ಬಲಕ್ಕೆ ಸರಿಸಿ." - "ನಿಮ್ಮ ತೆರೆದ ಕಣ್ಣುಗಳಿಂದ ಸ್ಕ್ರೀನ್ ಕಡೆಗೆ ನೋಡಿ." + "ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಹೆಚ್ಚಿನದ್ದನ್ನು ನೇರವಾಗಿ ನೋಡಿ." "ನಿಮ್ಮ ಮುಖ ಕಾಣಿಸುತ್ತಿಲ್ಲ. ಫೋನ್ ಕಡೆಗೆ ನೋಡಿ." "ತುಂಬಾ ಅಲುಗಾಡುತ್ತಿದೆ ಫೋನ್ ಅನ್ನು ಸ್ಥಿರವಾಗಿ ಹಿಡಿಯಿರಿ." "ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ." @@ -579,15 +579,15 @@ "ಮುಖ ದೃಢೀಕರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಹಾರ್ಡ್‌ವೇರ್ ಲಭ್ಯವಿಲ್ಲ." - "ಮುಖ ಗುರುತಿಸುವಿಕೆಯ ಅವಧಿ ಮೀರಿದೆ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ." + "ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಅನ್ನು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ." "ಹೊಸ ಮುಖ ಡೇಟಾ ಸಂಗ್ರಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಮೊದಲು ಹಳೆಯದನ್ನು ಅಳಿಸಿ" - "ಮುಖದ ಕಾರ್ಯಚರಣೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ" - "ಮುಖ ಗುರುತಿಸುವಿಕೆಯನ್ನು ಬಳಕೆದಾರರು ರದ್ದುಗೊಳಿಸಿದ್ದಾರೆ" + "ಮುಖದ ಕಾರ್ಯಚರಣೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ." + "ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಅನ್ನು ಬಳಕೆದಾರರು ರದ್ದುಗೊಳಿಸಿದ್ದಾರೆ." "ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ." - "ಹಲವಾರು ಪ್ರಯತ್ನಗಳು. ಮುಖ ಗುರುತಿಸುವಿಕೆ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ." + "ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ." "ಮುಖವನ್ನು ದೃಢೀಕರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ." - "ಮುಖ ಗುರುತಿಸುವಿಕೆಯನ್ನು ನೀವು ಸೆಟಪ್ ಮಾಡಿಲ್ಲ" - "ಈ ಸಾಧನದಲ್ಲಿ ಮುಖ ಗುರುತಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯವು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + "ನೀವು ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡಿಲ್ಲ." + "ಈ ಸಾಧನದಲ್ಲಿ ಫೇಸ್ ಅನ್‌ಲಾಕ್ ವೈಶಿಷ್ಟ್ಯವು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ." "ಮುಖದ %d" @@ -648,6 +648,8 @@ "ವಾಹಕ ಸೇವೆಗಳನ್ನು ಪ್ರತಿಬಂಧಿಸಲು ಹೊಂದಿರುವವರಿಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಸಾಮಾನ್ಯ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ." "ಅಡಚಣೆ ಮಾಡಬೇಡಿಯನ್ನು ಪ್ರವೇಶಿಸಿ" "ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಓದಲು ಮತ್ತು ಬರೆಯಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ." + "ವೀಕ್ಷಣಾ ಅನುಮತಿಯ ಬಳಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಿ" + "ಆ್ಯಪ್‌ಗಾಗಿ ಅನುಮತಿ ಬಳಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಲು ಹೊಂದಿರುವವರಿಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಸಾಮಾನ್ಯ ಆ್ಯಪ್‌ಗಳಿಗೆ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ." "ಪಾಸ್‌ವರ್ಡ್ ನಿಮಯಗಳನ್ನು ಹೊಂದಿಸಿ" "ಪರದೆ ಲಾಕ್‌ನಲ್ಲಿನ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಮತ್ತು ಪಿನ್‌ಗಳ ಅನುಮತಿಸಲಾದ ಅಕ್ಷರಗಳ ಪ್ರಮಾಣವನ್ನು ನಿಯಂತ್ರಿಸಿ." "ಪರದೆಯ ಅನ್‌ಲಾಕ್ ಪ್ರಯತ್ನಗಳನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಿ" @@ -1356,7 +1358,7 @@ "ಸ್ವಯಂ ಪರೀಕ್ಷೆಯಾಗುವಿಕೆ ಮೋಡ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಫ್ಯಾಕ್ಟರಿ ರಿಸೆಟ್ ಮಾಡಬೇಕು." "USB ಪೋರ್ಟ್‌ನಲ್ಲಿ ದ್ರವ ಅಥವಾ ಧೂಳಿನ ಕಣಗಳಿವೆ" "USB ಪೋರ್ಟ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ. ಇನ್ನಷ್ಟು ತಿಳಿಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ" - "USB ಪೋರ್ಟ್ ಬಳಸಲು ಸುರಕ್ಷಿತವಾಗಿದೆ" + "USB ಪೋರ್ಟ್ ಬಳಸಲು ಸರಿ ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿ" "ಫೋನ್, ದ್ರವ ಅಥವಾ ಧೂಳಿನ ಕಣಗಳನ್ನು ಇನ್ನು ಮುಂದೆ ಪತ್ತೆಹಚ್ಚುವುದಿಲ್ಲ." "ದೋಷದ ವರದಿಯನ್ನು ತೆಗೆದುಕೊಳ್ಳಲಾಗುತ್ತಿದೆ…" "ಬಗ್ ವರದಿಯನ್ನು ಹಂಚುವುದೇ?" @@ -1899,9 +1901,7 @@ "ಅಪ್‌ಡೇಟ್‌ಗಾಗಿ ಪರಿಶೀಲಿಸಿ" "ನೀವು ಹೊಸ ಸಂದೇಶಗಳನ್ನು ಹೊಂದಿರುವಿರಿ" "ವೀಕ್ಷಿಸಲು SMS ಅಪ್ಲಿಕೇಶನ್ ತೆರೆಯಿರಿ" - "ಕೆಲವು ಕಾರ್ಯನಿರ್ವಹಣೆಗಳು ಸೀಮಿತವಾಗಿರಬಹುದು" - "ಅನ್‌ಲಾಕ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ" - "ಬಳಕೆದಾರರ ಡೇಟಾವನ್ನು ಲಾಕ್ ಮಾಡಲಾಗಿದೆ" + "ಕೆಲವು ಕಾರ್ಯನಿರ್ವಹಣೆ ಸೀಮಿತವಾಗಿರಬಹುದು" "ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ" "ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್‌ಲಾಕ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ" "%1$s ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ" diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 9a76aa2898bb..8bdb19d0dcb3 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -261,7 +261,7 @@ "네트워크 알림" "네트워크 사용 가능" "VPN 상태" - "기기 관리" + "IT 관리자가 보낸 알림" "알림" "소매 데모" "USB 연결" @@ -549,11 +549,15 @@ "지문 아이콘" - "얼굴 인증 하드웨어 관리" + + "사용할 얼굴 템플릿의 추가 및 삭제 메서드를 앱에서 호출하도록 허용합니다." - "얼굴 인증 하드웨어 사용" - "앱에서 얼굴 인증 하드웨어를 인증에 사용하도록 허용합니다." - "얼굴 인증" + + + + + + "얼굴 재등록 필요" "인식률을 개선하려면 얼굴을 다시 등록하세요." "정확한 얼굴 데이터를 캡처하지 못했습니다. 다시 시도하세요." @@ -565,7 +569,7 @@ "휴대전화를 아래쪽으로 이동하세요." "휴대전화를 왼쪽으로 이동하세요." "휴대전화를 오른쪽으로 이동하세요." - "눈을 뜨고 화면을 바라보세요." + "기기에서 더 똑바로 바라보세요." "얼굴이 보이지 않습니다. 휴대전화를 바라보세요." "너무 많이 움직였습니다. 휴대전화를 흔들리지 않게 잡으세요." "얼굴을 다시 등록해 주세요." @@ -579,15 +583,20 @@ "얼굴을 확인할 수 없습니다. 하드웨어를 사용할 수 없습니다." - "얼굴 인식 제한시간에 도달했습니다. 다시 시도하세요." + + "새 얼굴 데이터를 저장할 수 없습니다. 먼저 기존 얼굴 데이터를 삭제하세요." - "얼굴 인식 작업이 취소되었습니다." - "사용자가 얼굴 인증을 취소했습니다." + "얼굴 인식 작업이 취소되었습니다." + + "시도 횟수가 너무 많습니다. 나중에 다시 시도하세요." - "시도 횟수가 너무 많습니다. 얼굴 인증이 사용 중지되었습니다." + + "얼굴을 확인할 수 없습니다. 다시 시도하세요." - "얼굴 인증을 설정하지 않았습니다." - "이 기기에서는 얼굴 인증이 지원되지 않습니다." + + + + "얼굴 %d" @@ -648,6 +657,8 @@ "권한을 가진 애플리케이션에서 이동통신사 서비스를 사용하도록 허용합니다. 일반 앱에는 필요하지 않습니다." "방해 금지 모드에 접근" "앱에서 방해 금지 모드 설정을 읽고 작성하도록 허용합니다." + "권한 사용 보기 시작" + "앱의 권한 사용을 시작하려면 보유자를 허용하세요. 일반 앱에는 필요하지 않습니다." "비밀번호 규칙 설정" "화면 잠금 비밀번호와 PIN에 허용되는 길이와 문자 수를 제어합니다." "화면 잠금 해제 시도 모니터링" @@ -1355,7 +1366,8 @@ "테스트 하네스 모드를 사용 중지하려면 초기화하세요." "USB 포트에서 액체 또는 이물질 감지됨" "USB 포트가 자동으로 사용 중지되었습니다. 자세한 내용을 보려면 탭하세요." - "USB 포트를 사용해도 좋음" + + "휴대전화에서 액체나 이물질이 더 이상 감지되지 않습니다." "버그 보고서 가져오는 중..." "버그 보고서를 공유하시겠습니까?" @@ -1898,9 +1910,7 @@ "업데이트 확인" "새 메시지 있음" "SMS 앱을 열고 확인" - "일부 기능이 제한될 수 있습니다." - "잠금 해제하려면 탭하세요." - "사용자 데이터 잠김" + "일부 기능이 제한될 수 있음" "직장 프로필 잠김" "탭하여 직장 프로필 잠금 해제" "%1$s에 연결됨" diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 663e48bd1df5..4d1d0f43a58e 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -261,7 +261,7 @@ "Тармактын эскертүүлөрү" "Жеткиликтүү тармактар" "VPN абалы" - "Түзмөктү администрациялоо" + "IT администраторуңуздан келген билдирүүлөр" "Шашылыш билдирүүлөр" "Чекене соода дүкөнү үчүн демо режим" "USB аркылуу туташуу" @@ -549,11 +549,15 @@ "Манжа изинин сүрөтчөсү" - "жүздүн аныктыгын текшерүүчү аппараттык камсыздоону башкаруу" + + "Колдонмого пайдалануу үчүн жүздүн үлгүлөрүн кошуу жана жок кылуу мүмкүндүгүн берет." - "жүздүн аныктыгын текшерүүчү аппараттык камсыздоону колдонуу" - "Колдонмого аныктыгын текшерүү үчүн жүздүн аныктыгын текшерүүчү аппараттык камсыздоону пайдалануу мүмкүндүгүн берет" - "Жүздүн аныктыгын текшерүү" + + + + + + "Жүзүңүздү кайра таанытыңыз." "Мыкты таануу үчүн, жүзүңүздү кайра таанытыңыз" "Жүзүңүз жакшы тартылган жок. Кайра аракет кылыңыз." @@ -565,7 +569,7 @@ "Телефонду ылдый жылдырыңыз." "Телефонду солго жылдырыңыз." "Телефонду оңго жылдырыңыз." - "Экранды көзүңүздү ачып караңыз." + "Түзмөгүңүзгө түз караңыз." "Жүзүңүз көрүнбөй жатат. Телефонду караңыз." "Кыймылдап жибердиңиз. Телефонду түз кармаңыз." "Жүзүңүздү кайра таанытыңыз." @@ -579,15 +583,20 @@ "Жүз ырасталбай жатат. Аппараттык камсыздоо жеткиликсиз." - "Жүздүн таймаутуна жетти. Кайра аракет кылыңыз." + + "Жаңы жүздү сактоо мүмкүн эмес. Адегенде эскисин өчүрүңүз." - "Жүздүн аныктыгын текшерүү жокко чыгарылды" - "Жүздүн аныктыгын текшерүү колдонуучу аркылуу жокко чыгарылды" + "Жүздүн аныктыгын текшерүү жокко чыгарылды." + + "Өтө көп жолу аракет жасадыңыз. Кийинчерээк кайра аракет кылыңыз." - "Өтө көп аракеттер аткарылды. Жүздүн аныктыгын текшерүү өчүк." + + "Жүз ырасталбай жатат. Кайра аракет кылыңыз." - "Жүздүн аныктыгын текшерүүнү жөндөй элексиз" - "Жүздүн аныктыгын текшерүү бул түзмөктө колдоого алынбайт" + + + + "Жүз %d" @@ -648,6 +657,8 @@ "Колдонмо байланыш операторлорунун кызматтарына туташа алат. Бул мүмкүнчүлүктү кадимки колдонмолор пайдалана алышпайт." "\"Тынчымды алба\" режимин пайдалануу мүмкүнчүлүгүнө ээ болуу" "Колдонмого \"Тынчымды алба\" режиминин конфигурациясын окуу жана жазуу мүмкүнчүлүгүн берет." + "уруксаттын колдонулушун көрүп баштоо" + "Колдонмонун пайдаланылышына уруксат берүүгө мүмкүнчүлүк берет. Кадимки колдонмолорго эч качан талап кылынбашы керек." "Сырсөз эрежелерин коюу" "Экран кулпусунун сырсөздөрү менен PIN\'дерине уруксат берилген узундук менен белгилерди көзөмөлдөө." "Экран кулпусун ачуу аракеттерин көзөмөлдөө" @@ -1267,8 +1278,8 @@ "Туташты" "%1$s байланышы чектелген" "Баары бир туташуу үчүн таптаңыз" - "Туташуу түйүнүңүздүн жөндөөлөрүнө өзгөртүүлөр киргизилди" - "Туташуу түйүнүңүздүн жыштыгы өзгөрдү." + "Байланыш түйүнүңүздүн жөндөөлөрү өзгөрүлдү" + "Байланыш түйүнүңүздүн жыштыгы өзгөрдү." "Бул түзмөк 5ГГцти гана колдонуу жөндөөсүн колдоого албайт. Анын ордуна, бул түзмөк 5ГГц жыштыгын ал жеткиликтүү болгондо колдонот." "%1$s тармагына которуштурулду" "%2$s тармагы Интернетке туташпай турганда, түзмөгүңүз %1$s тармагын колдонот. Акы алынышы мүмкүн." @@ -1357,7 +1368,8 @@ "Сыноо программасынын режимин өчүрүү үчүн, баштапкы жөндөөлөргө кайтарыңыз." "USB портунда суюктук же урандылар бар" "USB порт автоматтык түрдө өчүрүлдү. Кененирээк маалымат алуу үчүн таптап коюңуз." - "USB портун колдонууга болот" + + "Телефон суюктук менен урандыларды аныктаган жок." "Мүчүлүштүк тууралуу кабар алынууда…" "Мүчүлүштүк тууралуу баяндама бөлүшүлсүнбү?" @@ -1666,7 +1678,7 @@ "Атайын мүмкүнчүлүктөр кыска жолу %1$s кызматын күйгүздү" "Атайын мүмкүнчүлүктөр кыска жолу %1$s кызматын өчүрдү" "%1$s кызматын колдонуу үчүн үнүн чоңойтуп/кичирейтүү баскычтарын үч секунд коё бербей басып туруңуз" - "Атайын мүмкүнчүлүктөр баскычын таптаганыңызда иштетиле турган функцияны тандаңыз:" + "Атайын мүмкүнчүлүктөр баскычын таптаганыңызда иштей турган функцияны тандаңыз:" "Функцияларды өзгөртүү үчүн Атайын мүмкүнчүлүктөр баскычын басып, кармап туруңуз." "Чоңойтуу" "Учурдагы колдонуучу %1$s." @@ -1900,9 +1912,7 @@ "Жаңыртууну издөө" "Сизге жаңы билдирүүлөр келди" "Көрүү үчүн SMS колдонмосун ачыңыз" - "Айрым функциялар чектлши мүмкн" - "Кулпусун ачуу үчүн таптаңыз" - "Колдончнн дайындары кулпуланды" + "Айрым функциялар чектелиши мүмкүн" "Жумуш профили кулпуланган" "Таптап жумуш профилин ачыңыз" "%1$s менен туташты" diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index e3cd3f91c8bc..bfc999e1a1d1 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -261,7 +261,7 @@ "ແຈ້ງເຕືອນເຄືອຂ່າຍ" "ມີເຄືອຂ່າຍທີ່ສາມາດໃຊ້ໄດ້" "ສະຖານະ VPN" - "ການເບິ່ງແຍງອຸປະກອນ" + "ການເຕືອນຈາກຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານ" "ການເຕືອນ" "ເດໂມສຳລັບຮ້ານຂາຍ" "ການເຊື່ອມຕໍ່ USB" @@ -549,11 +549,15 @@ "ໄອຄອນລາຍນິ້ວມື" - "ຈັດການຮາດແວການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າ" + + "ອະນຸຍາດໃຫ້ແອັບເປີດວິທີການຕ່າງໆເພື່ອເພີ່ມ ແລະ ລຶບແມ່ແບບໃບໜ້າສຳລັບການນຳໃຊ້." - "ໃຊ້ຮາດແວການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າ" - "ອະນຸຍາດໃຫ້ແອັບໃຊ້ຮາດແວການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າສຳລັບການກວດສອບຄວາມຖືກຕ້ອງ" - "ການພິສູດຢືນຢັນດ້ວຍໃບໜ້າ" + + + + + + "ລົງທະບຽນໃບໜ້າຂອງທ່ານຄືນໃໝ່" "ເພື່ອປັບປຸງການຈຳແນກ, ກະລຸນາລົງທະບຽນໃບໜ້າຂອງທ່ານຄືນໃໝ່." "ບໍ່ສາມາດບັນທຶກຂໍ້ມູນໃບໜ້າທີ່ຖືກຕ້ອງໄດ້. ກະລຸນາລອງໃໝ່." @@ -565,7 +569,7 @@ "ເລື່ອນໂທລະສັບຕ່ຳລົງ." "ຍ້າຍໂທລະສັບໄປທາງຊ້າຍ." "ຍ້າຍໂທລະສັບໄປທາງຂວາ." - "ກະລຸນາເບິ່ງໜ້າຈໍພ້ອມກັບເປີດຕາທ່ານ." + "ກະລຸນາເບິ່ງອຸປະກອນຂອງທ່ານໃຫ້ຊື່ໆ." "ບໍ່ສາມາດເບິ່ງເຫັນໜ້າຂອງທ່ານໄດ້. ກະລຸນາເບິ່ງໂທລະສັບ." "ເຄື່ອນໄຫວຫຼາຍເກີນໄປ. ກະລຸນາຖືໂທລະສັບໄວ້ຊື່ໆ." "ກະລຸນາລົງທະບຽນອຸປະກອນຂອງທ່ານອີກເທື່ອໜຶ່ງ." @@ -579,15 +583,20 @@ "ບໍ່ສາມາດຢັ້ງຢືນໃບໜ້າໄດ້. ບໍ່ມີຮາດແວໃຫ້ໃຊ້." - "ໝົດເວລາກວດໃບໜ້າແລ້ວ. ກະລຸນາລອງໃໝ່." + + "ບໍ່ສາມາດບັນທຶກຂໍ້ມູນໃບໜ້າໃໝ່ໄດ້. ກະລຸນາລຶບຂໍ້ມູນເກົ່າອອກກ່ອນ." - "ຍົກເລີກການດຳເນີນການກັບໃບໜ້າແລ້ວ" - "ຜູ້ໃຊ້ຍົກເລີກການພິສູດຢືນຢັນໃບໜ້າແລ້ວ" + "ຍົກເລີກການດຳເນີນການກັບໃບໜ້າແລ້ວ." + + "ມີຄວາມພະຍາຍາມຫຼາຍຄັ້ງເກີນໄປ. ກະລຸນາລອງໃໝ່ໃນພາຍຫຼັງ." - "ພະຍາຍາມຫຼາຍເທື່ອເກີນໄປ. ປິດການພິສູດຢືນຢັນດ້ວຍໃບໜ້າແລ້ວ." + + "ບໍ່ສາມາດຢັ້ງຢືນໃບໜ້າໄດ້. ກະລຸນາລອງໃໝ່." - "ທ່ານຍັງບໍ່ໄດ້ຕັ້ງຄ່າການພິສູດຢືນຢັນດ້ວຍໃບໜ້າເທື່ອ" - "ບໍ່ຮອງຮັບການພິສູດຢືນຢັນໃບໜ້າຢູ່ອຸປະກອນນີ້" + + + + "ໃບໜ້າ %d" @@ -648,6 +657,8 @@ "ອະ​ນຸ​ຍາດ​ໃຫ້​ເຈົ້າ​ຂອງ​ປະ​ຕິ​ບັດ​ຕາມ​ການ​ບໍ​ລິ​ການ​​ຂອງ​ບໍ​ລິ​ສັດ​ເຄືອ​ຂ່າຍ​ມື​ຖື. ບໍ່​ຄວນ​ຈະໃຊ້​ໃນ​ແອັບ​ທົ່ວ​ໄປ." "​ເຂົ້າ​ເຖິງ ບໍ່​ລົບ​ກວນ" "ອະນຸຍາດ​​ໃຫ້​ແອັບ​ອ່ານ​ ​ແລະ​ຂຽນການກນຳ​ດຄ່າ ບໍ່​ລົບ​ກວນ." + "ເລີ່ມການໃຊ້ສິດອະນຸຍາດການເບິ່ງ" + "ອະນຸຍາດໃຫ້ຜູ້ຖືເລີ່ມການໃຊ້ສິດອະນຸຍາດສຳລັບແອັບໃດໜຶ່ງໄດ້. ແອັບປົກກະຕິບໍ່ຄວນຕ້ອງໃຊ້." "ຕັ້ງຄ່າກົດຂອງລະຫັດຜ່ານ" "ຄວບຄຸມຄວາມຍາວ ແລະຕົວອັກສອນທີ່ອະ​ນຸ​ຍາດ​ໃຫ້​ຢູ່​ໃນລະ​ຫັດລັອກໜ້າຈໍ ແລະ PIN." "ຕິດຕາມການພະຍາຍາມປົດລັອກໜ້າຈໍ" @@ -1355,7 +1366,8 @@ "ດຳເນີນການຣີເຊັດເປັນຄ່າຈາກໂຮງງານເພື່ອປິດການນຳໃຊ້ໂໝດ Test Harness." "ມີຂອງແຫລວ ຫຼື ເສດດິນໃນຜອດ USB" "ປິດຜອດ USB ໂດຍອັດຕະໂນມັດແລ້ວ. ແຕະເພື່ອສຶກສາເພີ່ມເຕີມ." - "ປອດໄພທີ່ຈະໃຊ້ຜອດ USB ແລ້ວ" + + "ໂທລະສັບຈະບໍ່ກວດຫາຂອງແຫລວ ຫຼື ເສດດິນອີກຕໍ່ໄປ." "ກຳລັງຂໍລາຍງານຂໍ້ຜິດພາດ…" "ແບ່ງປັນລາຍງານບັນຫາບໍ?" @@ -1801,7 +1813,7 @@ "ຕົກລົງ" "ຕົວປະຢັດແບັດເຕີຣີຈະປິດ ຫຼື ຈຳກັດການເຄື່ອນໄຫວໃນພື້ນຫຼັງ, ເອັບເຟັກທາງພາບບາງຢ່າງ ແລະ ຄຸນສົມບັດທີ່ໃຊ້ພະລັງງານຫຼາຍອື່ນໆເພື່ອຂະຫຍາຍອາຍຸແບັດເຕີຣີ. ""ສຶກສາເພີ່ມເຕີມ" "ຕົວປະຢັດແບັດເຕີຣີຈະປິດ ຫຼື ຈຳກັດການເຄື່ອນໄຫວໃນພື້ນຫຼັງ, ເອັບເຟັກທາງພາບບາງຢ່າງ ແລະ ຄຸນສົມບັດທີ່ໃຊ້ພະລັງງານຫຼາຍອື່ນໆເພື່ອຂະຫຍາຍອາຍຸແບັດເຕີຣີ." - "ເພື່ອຊ່ວຍຫຼຸດຜ່ອນການນຳໃຊ້ຂໍ້ມູນ, ຕົວປະຢັດຂໍ້ມູນຈະປ້ອງກັນບໍ່ໃຫ້ບາງແອັບສົ່ງ ຫຼື ຮັບຂໍ້ມູນໃນພື້ນຫຼັງ. ແອັບໃດໜຶ່ງທີ່ທ່ານກຳລັງໃຊ້ຢູ່ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນໄດ້ ແຕ່ອາດເຂົ້າເຖິງໄດ້ຖີ່ໜ້ອຍລົງ. ນີ້ອາດໝາຍຄວາມວ່າ ຮູບພາບຕ່າງໆອາດບໍ່ສະແດງຈົນກວ່າທ່ານຈະແຕະໃສ່ກ່ອນ." + "ເພື່ອຊ່ວຍຫຼຸດຜ່ອນການນຳໃຊ້ຂໍ້ມູນ, ຕົວປະຢັດອິນເຕີເນັດຈະປ້ອງກັນບໍ່ໃຫ້ບາງແອັບສົ່ງ ຫຼື ຮັບຂໍ້ມູນໃນພື້ນຫຼັງ. ແອັບໃດໜຶ່ງທີ່ທ່ານກຳລັງໃຊ້ຢູ່ຈະສາມາດເຂົ້າເຖິງຂໍ້ມູນໄດ້ ແຕ່ອາດເຂົ້າເຖິງໄດ້ຖີ່ໜ້ອຍລົງ. ນີ້ອາດໝາຍຄວາມວ່າ ຮູບພາບຕ່າງໆອາດບໍ່ສະແດງຈົນກວ່າທ່ານຈະແຕະໃສ່ກ່ອນ." "ເປີດຕົວປະຢັດອິນເຕີເນັດບໍ?" "ເປີດໃຊ້" @@ -1898,9 +1910,7 @@ "ກວດເບິ່ງອັບເດດ" "ທ່ານມີຂໍ້ຄວາມໃໝ່" "ເປີດແອັບ SMS ເພື່ອເບິ່ງ" - "ບາງຄວາມສາມາດນຳໃຊ້ອາດຈະຖືກຈຳກັດ" - "ແຕະເພື່ອປົດລັອກ" - "ລັອກຂໍ້ມູນຜູ້ໃຊ້ແລ້ວ" + "ຄຸນສົມບັດບາງຢ່າງອາດຖືກຈຳກັດໄວ້" "ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຖືກລັອກ" "ແຕະເພື່ອປົດລັອກໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ" "ເຊື່ອມຕໍ່ກັບ %1$s ແລ້ວ" diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index f03a2c857c73..3deae1387b0e 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -267,7 +267,7 @@ "Tinklo įspėjimai" "Tinklas pasiekiamas" "VPN būsena" - "Įrenginio administravimas" + "IT administratoriaus įspėjimai" "Įspėjimai" "Demonstracinė versija mažmenininkams" "USB jungtis" @@ -555,11 +555,15 @@ "Piršto antspaudo piktograma" - "tvarkyti veido autentifikavimo aparatinę įrangą" + + "Programai leidžiama aktyv. metodus, norint pridėti ir ištrinti naudojamus veidų šablonus." - "naudoti veido autentifikavimo aparatinę įrangą" - "Programai leidžiama naudoti veido autentifikavimo aparatinę įrangą tapatybei nustatyti" - "Veido autentifikavimas" + + + + + + "Pakartotinis veido registravimas" "Kad patobulintumėte atpažinimą, iš naujo užregistruokite veidą" "Neužfiks. tikslūs veido duom. Bandykite dar kartą." @@ -571,7 +575,7 @@ "Laikykite telefoną žemiau." "Pasukite telefoną kairėn." "Pasukite telefoną dešinėn." - "Žiūrėkite į ekraną atsimerkę." + "Žiūrėkite tiesiai į įrenginį." "Nematau jūsų veido. Žiūrėkite į telefoną." "Įrenginys per daug judinamas. Nejudink. telefono." "Užregistruokite veidą iš naujo." @@ -585,15 +589,20 @@ "Nepavyko patv. veido. Aparatinė įranga negalima." - "Baigėsi veido atpaž. skirt. laik. Band. dar kartą." + + "Nepavyko išs. naujų veido duomenų. Pirm. ištrinkite senus." - "Veido atpažinimo operacija atšaukta" - "Veido autentifikavimą atšaukė naudotojas" + "Veido atpažinimo operacija atšaukta." + + "Per daug bandymų. Vėliau bandykite dar kartą." - "Per daug bandymų. Veido autentifikavimas išjungtas." + + "Nepavyko patvirtinti veido. Bandykite dar kartą." - "Nenustatėte veido autentifikavimo" - "Veido autentifikavimo funkcija šiame įrenginyje nepalaikoma" + + + + "%d veidas" @@ -654,6 +663,8 @@ "Savininkui leidžiama susisaistyti su operatoriaus paslaugomis. To niekada neturėtų prireikti naudojant įprastas programas." "pasiekti „Do Not Disturb“" "Leidžiama programai skaityti ir rašyti „Do Not Disturb“ konfigūraciją." + "pradėti peržiūrėti leidimo naudojimą" + "Leidžia savininkui pradėti naudoti programos leidimą. Įprastoms programoms to neturėtų prireikti." "Nustatyti slaptažodžio taisykles" "Valdykite, kokio ilgio ekrano užrakto slaptažodžius ir PIN kodus galima naudoti." "Stebėti bandymus atrakinti ekraną" @@ -1399,7 +1410,8 @@ "Atkurkite gamyklinius duomenis, kad išjungtumėte testavimo sistemos režimą." "USB prievade yra skysčių ar smulkių dalelių" "USB prievadas automatiškai išjungtas. Palieskite, kad sužinotumėte daugiau." - "Saugu naudoti USB prievadą" + + "Telefonas nebeaptinka skysčių ar smulkių dalelių." "Pateikiamas pranešimas apie riktą…" "Bendrinti pranešimą apie riktą?" @@ -1966,9 +1978,7 @@ "Tikrinti, ar yra naujinių" "Turite naujų pranešimų" "Atidaryti SMS programą, norint peržiūrėti" - "Kai kurios funkcijos gali būti ribojamos" - "Palieskite, kad atrakintumėte" - "Naudotojo duomenys užrakinti" + "Kai kurios funkcijos ribojamos" "Darbo profilis užrakintas" "Paliesk., kad atr. darbo prof." "Prisijungta prie „%1$s“" diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 8e7ec0853e09..77ce8558dd3f 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -264,7 +264,7 @@ "Tīkla brīdinājumi" "Tīkls ir pieejams" "VPN statuss" - "Ierīces administrēšana" + "Brīdinājumi no jūsu IT administratora" "Brīdinājumi" "Demonstrācijas versija veikaliem" "USB savienojums" @@ -552,11 +552,15 @@ "Pirksta nospieduma ikona" - "pārvaldīt sejas autentifikācijas aparatūru" + + "Atļauj lietotnei izsaukt metodes izmantojamo sejas veidņu pievienošanai un dzēšanai." - "izmantot sejas autentifikācijas aparatūru" - "Atļauj lietotnei izmantot sejas autentifikācijas aparatūru autentificēšanai" - "Sejas autentificēšana" + + + + + + "Atkārtoti reģistrējiet seju" "Lai uzlabotu atpazīšanu, lūdzu, atkārtoti reģistrējiet savu seju" "Neizdevās tvert sejas datus. Mēģiniet vēlreiz." @@ -568,7 +572,7 @@ "Nolaidiet tālruni zemāk" "Pārvietojiet tālruni pa kreisi." "Pārvietojiet tālruni pa labi." - "Paskatieties uz ekrānu, turot acis atvērtas." + "Lūdzu, tiešāk skatieties uz savu ierīci." "Jūsu seja nav redzama. Paskatieties uz tālruni." "Pārāk daudz kustību. Nekustīgi turiet tālruni." "Lūdzu, atkārtoti reģistrējiet savu seju." @@ -582,15 +586,20 @@ "Nevar verificēt seju. Aparatūra nav pieejama." - "Sejas datu nolasīšanas noildze. Mēģiniet vēlreiz." + + "Nevar saglabāt jaunās sejas datus. Dzēsiet kādu no vecajām." - "Darbība ar sejas datiem atcelta" - "Lietotājs atcēla sejas autentificēšanu" + "Darbība ar sejas datiem atcelta." + + "Pārāk daudz mēģinājumu. Vēlāk mēģiniet vēlreiz." - "Pārāk daudz mēģinājumu. Sejas autentificēšana ir atspējota." + + "Nevar verificēt seju. Mēģiniet vēlreiz." - "Sejas autentifikācija nav iestatīta" - "Sejas autentificēšana šajā ierīcē netiek atbalstīta" + + + + "Seja %d" @@ -651,6 +660,8 @@ "Atļauj īpašniekam izveidot savienojumu ar mobilo sakaru operatoru pakalpojumiem. Parastām lietotnēm šīs atļauja nekad nav nepieciešama." "piekļūt režīmam “Netraucēt”" "Ļauj lietotnei lasīt un rakstīt režīma “Netraucēt” konfigurāciju." + "Datu skatīšana par izmantojamajām atļaujām" + "Ļauj atļaujas īpašniekam sākt lietotnes atļauju izmantošanu. Parastām lietotnēm tas nekad nav nepieciešams." "Paroles kārtulu iestatīšana" "Kontrolēt ekrāna bloķēšanas paroļu un PIN garumu un tajos atļautās rakstzīmes." "Ekrāna atbloķēšanas mēģinājumu pārraudzīšana" @@ -1377,7 +1388,8 @@ "Lai atspējotu drošības pārbaudes režīmu, veiciet rūpnīcas datu atiestatīšanu." "USB pieslēgvietā ir šķidrums vai daļiņas" "USB pieslēgvieta ir automātiski atspējota. Pieskarieties, lai uzzinātu vairāk." - "USB pieslēgvietas izmantošana ir droša" + + "Tālrunī vairs netiek konstatēts šķidrums vai gruži." "Notiek kļūdas pārskata izveide…" "Vai kopīgot kļūdas pārskatu?" @@ -1932,9 +1944,7 @@ "Meklēt atjauninājumu" "Jums ir jaunas īsziņas." "Lai skatītu, atveriet īsziņu lietotni." - "Funkcijas var būt ierobežotas" - "Pieskarieties, lai atbloķētu." - "Lietotāja dati ir bloķēti." + "Funkcijas var būt ierobežotas" "Darba profils ir bloķēts." "Pieskarieties, lai atbloķētu." "Izveidots savienojums ar: %1$s" diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index dd8c6c2f7c0e..0d085c8295d3 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -261,7 +261,7 @@ "Известувања на мрежа" "Има достапна мрежа" "VPN-статус" - "Управување со уред" + "Предупредувања од администраторот за интернет" "Предупредувања" "Демонстрација за малопродажба" "USB-врска" @@ -549,11 +549,15 @@ "Икона за отпечатоци" - "управува со хардвер за проверка на лице" + + "Дозволува апликац. да повика начини за додавање и бришење шаблони на лице за користење." - "користи хардвер за проверка на лице" - "Дозволува апликацијата да користи хардвер за лице за проверка" - "Проверка на лик" + + + + + + "Повторно регистрирајте го ликот" "За да се подобри препознавањето, повторно регистрирајте го ликот" "Не се сними прецизна слика. Обидете се повторно." @@ -565,7 +569,7 @@ "Снижете го телефонот." "Поместете го телефонот налево." "Поместете го телефонот надесно." - "Гледајте во екранот со отворени очи." + "Погледнете подиректно во уредот." "Не ви се гледа ликот. Гледајте во телефонот." "Премногу движење. Држете го телефонот стабилно." "Повторно регистрирајте го лицето." @@ -579,15 +583,20 @@ "Ликот не може да се потврди. Хардвер - недостапен." - "Истече времето за проверка на ликот. Пробајте пак." + + "Не зачувува податоци за нов лик. Прво избришете стар." - "Операцијата со лик се откажа" - "Проверката на ликот е откажана од корисникот" + "Операцијата со лице се откажа." + + "Премногу обиди. Обидете се повторно подоцна." - "Премногу обиди. Проверката на лик е оневозможена." + + "Ликот не може да се потврди. Обидете се повторно." - "Не сте поставиле проверка на лик" - "Проверката на лик не е поддржана на уредов" + + + + "Лице %d" @@ -648,6 +657,8 @@ "Дозволува сопственикот да се поврзе со услуги на операторот. Не треба да се користи за стандардни апликации." "пристапи до Не вознемирувај" "Дозволува апликацијата да чита и пишува конфигурација Не вознемирувај." + "започнете со користење на дозволата за приказ" + "Дозволува сопственикот да почне со користење на дозволата за апликација. Не треба да се користи за стандардни апликации." "Постави правила за лозинката" "Контролирај ги должината и знаците што се дозволени за лозинки и PIN-броеви за отклучување екран." "Следи ги обидите за отклучување на екранот" @@ -1356,7 +1367,8 @@ "Извршете фабричко ресетирање за да го оневозможите режимот на рамка за тестирање." "Течност или нечистотија во USB-портата" "USB-портата е автоматски оневозможена. Допрете за да дознаете повеќе." - "Безбедно е да се користи USB-портата" + + "Телефонот веќе не открива течност или нечистотија." "Се зема извештајот за грешки…" "Да се сподели извештајот за грешки?" @@ -1795,7 +1807,7 @@ "Работа %1$s" "Втора деловна %1$s" "Трета деловна %1$s" - "Прашај за PIN пред откачување" + "Побарај PIN пред откачување" "Побарај шема за откл. пред откачување" "Прашај за лозинка пред откачување" "Инсталирано од администраторот" @@ -1901,9 +1913,7 @@ "Проверка за ажурирање" "Имате нови пораки" "Отворете ја апликацијата за SMS за приказ" - "Некои функции се ограничени" - "Допрете за да отклучите" - "Кориснички податоци, заклучени" + "Некои функции се ограничени" "Работниот профил е заклучен" "Допрете за да го отклучите" "Поврзан на %1$s" @@ -2029,6 +2039,6 @@ %s + %d датотека %s + %d датотеки - "Директно споделување не е достапно" + "Не е достапно директно споделување" "Список со апликации" diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 10e16cad4991..c5d8d4e65a3f 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -261,7 +261,7 @@ "നെറ്റ്‌വർക്ക് അലേർട്ടുകൾ" "നെറ്റ്‌വർക്ക് ‌ലഭ്യമല്ല" "VPN നില" - "ഉപകരണ അഡ്മിനിസ്ട്രേഷൻ" + "നിങ്ങളുടെ ഐടി അഡ്‌മിനിൽ നിന്നുള്ള മുന്നറിയിപ്പുകൾ" "അലേർട്ടുകൾ" "റീട്ടെയിൽ ഡെമോ" "USB കണക്ഷൻ" @@ -549,11 +549,15 @@ "വിരലടയാള ഐക്കൺ" - "മുഖം തിരിച്ചറിയൽ ഹാർഡ്‌വെയർ മാനേജ് ചെയ്യുക" + + "ഉപയോഗിക്കാനായി, മുഖത്തിന്റെ ടെംപ്ലേറ്റുകൾ ചേർക്കാനും ഇല്ലാതാക്കാനുമുള്ള രീതികൾ അഭ്യർത്ഥിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു." - "മുഖം തിരിച്ചറിയൽ ഹാർഡ്‌വെയർ ഉപയോഗിക്കുക" - "പരിശോധിച്ചുറപ്പിക്കലിനായി മുഖം തിരിച്ചറിയൽ ഹാർഡ്‌വെയർ ഉപയോഗിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു" - "മുഖം പരിശോധിച്ചുറപ്പിക്കൽ" + + + + + + "നിങ്ങളുടെ മുഖം വീണ്ടും എൻറോൾ ചെയ്യൂ" "തിരിച്ചറിയൽ മെച്ചപ്പെടുത്താൻ, നിങ്ങളുടെ മുഖം ദയവായി വീണ്ടും എൻറോൾ ചെയ്യൂ" "കൃത്യ മുഖ ഡാറ്റ എടുക്കാനായില്ല. വീണ്ടും ശ്രമിക്കൂ." @@ -565,7 +569,7 @@ "ഫോൺ കൂടുതൽ താഴേക്ക് നീക്കുക." "ഫോൺ ഇടത്തോട്ട് നീക്കുക." "ഫോൺ വലത്തോട്ട് നീക്കുക." - "തുറന്ന കണ്ണുകളുമായി സ്‌ക്രീനിലേക്ക് നോക്കുക." + "നിങ്ങളുടെ ഉപകരണത്തിന് നേരെ കൂടുതൽ നന്നായി നോക്കുക." "നിങ്ങളുടെ മുഖം കാണാനാവുന്നില്ല. ഫോണിലേക്ക് നോക്കൂ." "വളരെയധികം ചലനം. ഫോൺ അനക്കാതെ നേരെ പിടിക്കുക." "നിങ്ങളുടെ മുഖം വീണ്ടും എൻറോൾ ചെയ്യുക." @@ -573,24 +577,26 @@ "വളരെയധികം സമാനത, നിങ്ങളുടെ പോസ് മാറ്റുക." "നിങ്ങളുടെ തല ഇത്ര തിരിക്കേണ്ട." "നിങ്ങളുടെ തല ഇത്ര തിരിക്കേണ്ട." - - - - - - + "നിങ്ങളുടെ തല ഇത്ര തിരിക്കേണ്ട." + "നിങ്ങളുടെ മുഖം മറയ്‌ക്കുന്നത് എല്ലാം നീക്കം ചെയ്യൂ." + "സ്‌ക്രീനിന്റെ മുകളിലെ സെൻസർ വൃത്തിയാക്കുക." "മുഖം പരിശോധിക്കാൻ കഴിയില്ല. ഹാർഡ്‌വെയർ ലഭ്യമല്ല." - "മുഖത്തിന്റെ സമയപരിധി കഴിഞ്ഞു. വീണ്ടും ശ്രമിക്കുക." + + "പുതിയ മുഖ ഡാറ്റ സംഭരിക്കാനാകില്ല. ആദ്യം പഴയത് ഇല്ലാതാക്കുക." - "മുഖം തിരിച്ചറിയൽ പ്രവർത്തനം റദ്ദാക്കി" - "മുഖം പരിശോധിച്ചുറപ്പിക്കൽ ഉപയോക്താവ് റദ്ദാക്കി" + "മുഖത്തിന്റെ പ്രവർത്തനം റദ്ദാക്കി." + + "നിരവധി തവണ ശ്രമിച്ചു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക." - "വളരെയധികം ശ്രമങ്ങൾ. മുഖം തിരിച്ചറിയൽ പ്രവർത്തനരഹിതമാക്കി." + + "മുഖം പരിശോധിക്കാൻ കഴിയില്ല. വീണ്ടും ശ്രമിക്കൂ." - "നിങ്ങൾ മുഖം പരിശോധിച്ചുറപ്പിക്കൽ സജ്ജീകരിച്ചില്ല" - "ഈ ഉപകരണം മുഖം പരിശോധിച്ചുറപ്പിക്കൽ പിന്തുണയ്ക്കുന്നില്ല" + + + + "മുഖം %d" @@ -651,6 +657,8 @@ "കാരിയർ സേവനങ്ങളെ ബന്ധിപ്പിക്കാൻ ഉടമയെ അനുവദിക്കുന്നു. സാധാരണ ആപ്പ്‌സിന് ഒരിക്കലും ആവശ്യമില്ല." "\'ശല്യപ്പെടുത്തരുത്\' ആക്സസ് ചെയ്യുക" "\'ശല്യപ്പെടുത്തരുത്\' കോൺഫിഗറേഷൻ വായിക്കുന്നതിനും എഴുതുന്നതിനും ആപ്പിനെ അനുവദിക്കുന്നു." + "അനുമതി ഉപയോഗം കാണാൻ ആരംഭിക്കുക" + "ഒരു ആപ്പിനുള്ള അനുമതി ഉപയോഗം ആരംഭിക്കാൻ ഹോൾഡറിനെ അനുവദിക്കുന്നു. സാധാരണ ആപ്പുകൾക്ക് ഒരിക്കലും ആവശ്യമില്ല." "പാസ്‌വേഡ് നിയമങ്ങൾ സജ്ജീകരിക്കുക" "സ്‌ക്രീൻ ലോക്ക് പാസ്‌വേഡുകളിലും PIN-കളിലും അനുവദിച്ചിരിക്കുന്ന ദൈർഘ്യവും പ്രതീകങ്ങളും നിയന്ത്രിക്കുക." "സ്‌ക്രീൻ അൺലോക്ക് ശ്രമങ്ങൾ നിരീക്ഷിക്കുക" @@ -1359,7 +1367,8 @@ "പരിശോധനാ സംവിധാന മോഡ് പ്രവർത്തനരഹിതമാക്കാൻ ഫാക്‌ടറി പുനഃക്രമീകരണം നിർവഹിക്കുക." "USB പോർട്ടിൽ ദ്രാവകമോ പൊടിയോ കണ്ടെത്തി" "USB പോർട്ടർ സ്വയമേവ പ്രവർത്തനരഹിതമായി. കൂടുതലറിയാൻ ടാപ്പ് ചെയ്യുക." - "USB പോർട്ട് ഇപ്പോൾ സുരക്ഷിതമായി ഉപയോഗിക്കാം" + + "നിലവിൽ ദ്രാവകമോ പൊടിയോ ഉള്ളതായി ഫോൺ കണ്ടെത്തുന്നില്ല." "ബഗ് റിപ്പോർട്ട് എടുക്കുന്നു…" "ബഗ് റിപ്പോർട്ട് പങ്കിടണോ?" @@ -1668,7 +1677,7 @@ "ഉപയോഗസഹായിക്കുള്ള കുറുക്കുവഴി %1$s ഓൺ ചെയ്തിരിക്കുന്നു" "ഉപയോഗസഹായിക്കുള്ള കുറുക്കുവഴി %1$s ഓഫ് ചെയ്തിരിക്കുന്നു" "%1$s ഉപയോഗിക്കാൻ, രണ്ട് വോളിയം കീകളും മൂന്ന് സെക്കൻഡ് അമർത്തിപ്പിടിക്കുക" - "നിങ്ങൾ ഉപയോഗസഹായി ബട്ടൺ ടാപ്പുചെയ്യുമ്പോൾ ഉപയോഗിക്കുന്നതിന് ഒരു ഫീച്ചർ തിരഞ്ഞെടുക്കുക:" + "നിങ്ങൾ ഉപയോഗസഹായി ബട്ടൺ ടാപ്പ് ചെയ്യുമ്പോൾ ഉപയോഗിക്കുന്നതിന് ഒരു ഫീച്ചർ തിരഞ്ഞെടുക്കുക:" "ഫീച്ചറുകൾ മാറ്റുന്നതിന് ഉപയോഗസഹായി ബട്ടൺ സ്‌പർശിച്ചുപിടിക്കുക." "മാഗ്നിഫിക്കേഷൻ" "നിലവിലെ ഉപയോക്താവ് %1$s ആണ്." @@ -1902,9 +1911,7 @@ "അപ്‌ഡേറ്റിനായി പരിശോധിക്കുക" "നിങ്ങൾക്ക് പുതിയ സന്ദേശങ്ങൾ ഉണ്ട്" "കാണുന്നതിന് SMS ആപ്പ് തുറക്കുക" - "ചില പ്രവർത്തനക്ഷമതകൾ പരിമിതപ്പെടാം" - "അൺലോക്കുചെയ്യാൻ ടാപ്പുചെയ്യുക" - "ഉപയോക്തൃ ഡാറ്റ ലോക്കുചെയ്തു" + "ചില പ്രവർത്തനം പരിമിതപ്പെടാം" "ഔദ്യോഗിക പ്രൊഫൈൽ ലോക്കുചെയ്തു" "ഔദ്യോഗിക പ്രൊഫൈൽ അൺലോക്കുചെയ്യാൻ ടാപ്പുചെയ്യുക" "%1$s എന്നതിലേക്ക് കണക്റ്റുചെയ്തു" diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 70e46b4c4f8a..13417f2846ae 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -261,7 +261,7 @@ "Сүлжээний сануулга" "Сүлжээ боломжтой" "VPN төлөв" - "Төхөөрөмжийн удирдлага" + "Таны IT админаас илгээсэн сэрэмжлүүлэг" "Сануулга" "Жижиглэнгийн жишээ" "USB холболт" @@ -549,11 +549,15 @@ "Хурууны хээний дүрс" - "царай танилтын техник хангамжийг удирдах" + + "Аппад царайны загварыг ашиглахын тулд нэмэх эсвэл устгах аргыг идэвхжүүлэхийг зөвшөөрдөг." - "царай танилтын техник хангамжийг ашиглах" - "Аппад царай танилтын техник хангамжийг баталгаажуулалтад ашиглахыг зөвшөөрдөг" - "Царайн нотолгоо" + + + + + + "Царайгаа дахин бүртгүүлнэ үү" "Танилтыг сайжруулахын тулд царайгаа дахин бүртгүүлнэ үү" "Царайн өгөгдлийг зөв авч чадсангүй. Дахин оролдоно уу." @@ -565,7 +569,7 @@ "Утсаа доошлуулна уу." "Утсаа зүүн тийш болгоно уу." "Утсаа баруун тийш болгоно уу." - "Нүдээ нээгээд дэлгэц рүү харна уу." + "Төхөөрөмж рүүгээ аль болох эгц харна уу." "Таны царайг харахгүй байна. Утас руу харна уу." "Хэт их хөдөлгөөнтэй байна. Утсаа хөдөлгөөнгүй барина уу." "Нүүрээ дахин бүртгүүлнэ үү." @@ -579,15 +583,20 @@ "Царайг бататгаж чадсангүй. Техник хангамж боломжгүй байна." - "Царай таниулах хугацаа дууслаа. Дахин оролдоно уу." + + "Царайн шинэ өгөгдлийг хадгалж чадсангүй. Эхлээд хуучин өгөгдлийг устгана уу." - "Царайн үйл ажиллагааг цуцаллаа" - "Хэрэглэгч царайн нотолгоог цуцалсан байна" + "Царайны үйл ажиллагааг цуцаллаа." + + "Хэт олон удаа оролдлоо. Дараа дахин оролдоно уу." - "Хэт олон удаа оролдлоо. Царайн нотолгоог идэвхгүй болголоо." + + "Царайг бататгаж чадсангүй. Дахин оролдоно уу." - "Та царайн нотолгоог тохируулаагүй байна" - "Царайн нотолгоог энэ төхөөрөмж дээр дэмждэггүй" + + + + "Царай %d" @@ -648,6 +657,8 @@ "Аливаа эзэмшигчийг үүрэн холбооны үйлчилгээ үзүүлэгчтэй холбодог. Энгийн аппд шаардлагагүй." "Бүү саад бол тохируулгад хандалт хийх" "Апп-д Бүү саад бол тохируулгыг уншиж, бичихийг зөвшөөрөх" + "зөвшөөрлийн ашиглалтыг харж эхлэх" + "Эзэмшигчид аппын зөвшөөрлөө ашиглаж эхлэхийг зөвшөөрдөг. Энгийн аппуудад шаардлагагүй." "Нууц үгний дүрмийг тохируулах" "Дэлгэц түгжих нууц үг болон ПИН кодны урт болон нийт тэмдэгтийн уртыг хянах." "Дэлгэцийн түгжээг тайлах оролдлогыг хянах" @@ -1355,7 +1366,8 @@ "Туршилтын цогц горимыг идэвхгүй болгохын тулд үйлдвэрийн төлөвт шинэчилнэ үү." "USB порт дээрх шингэн зүйл эсвэл бохирдол" "USB портыг автоматаар идэвхгүй болгосон байна. Дэлгэрэнгүй мэдээлэл авахын тулд товшино уу." - "USB портыг ашиглахад аюулгүй байна" + + "Утас шингэн зүйл эсвэл бохирдлыг илрүүлсэнгүй." "Алдааны тайланг авч байна..." "Алдааны тайланг хуваалцах уу?" @@ -1898,9 +1910,7 @@ "Шинэчлэлтийг шалгах" "Танд шинэ зурвасууд байна" "Үзэхийн тулд SMS аппыг нээх" - "Зарим үйлдэл хязгаарлалттай байж болно" - "Түгжээг тайлахын тулд дар" - "Хэрэглэгчийн мэдээлэл түгжигдсэн" + "Зарим функцийг хязгаарласан байж болзошгүй" "Ажлын профайлыг түгжсэн" "Ажлын профайлын түгжээг тайлахын тулд дарна уу" "%1$s-д холбогдсон" diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 9a4630ce7326..f4ef749382c8 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -261,7 +261,7 @@ "नेटवर्क सूचना" "नेटवर्क उपलब्ध" "VPN स्थिती" - "डिव्हाइस प्रशासन" + "तुमच्या IT ॲडमिनकडून आलेल्या सूचना" "सूचना" "रीटेल डेमो" "USB कनेक्‍शन" @@ -292,7 +292,7 @@ "<b>%1$s</b> ला एसएमएस पाठवू आणि पाहू द्यायचे?" "स्टोरेज" "तुमच्या डिव्हाइस वरील फोटो, मीडिया आणि फायलींमध्‍ये अॅक्सेस" - "<b>%1$s</b> ला तुमच्या डिव्हाइसवरील फोटो, मीडिया आणि फायली अॅक्सेस करू द्यायचे?" + "<b>%1$s</b> ला तुमच्या डिव्हाइसवरील फोटो, मीडिया आणि फायली अ‍ॅक्सेस करू द्यायचे?" "मायक्रोफोन" "ऑडिओ रेकॉर्ड" "<b>%1$s</b> ला ऑडिओ रेकॉर्ड करू द्यायचा?" @@ -549,11 +549,15 @@ "फिंगरप्रिंट आयकन" - "चेहरा ऑथेंटिकेशन हार्डवेअर व्यवस्थापित करा" + + "अॅपला वापरासाठी चेहरा टेम्पलेट जोडण्याच्या आणि हटवण्याच्या पद्धती जारी करू देते." - "चेहरा ऑथेंटिकेशन हार्डवेअर वापरा" - "अॅपला चेहरा ऑथेंटिकेशनसाठी ऑथेंटिकेशन हार्डवेअर वापरू देते" - "फेस ऑथेंटिकेशन" + + + + + + "तुमच्या चेहऱ्याची पुन्हा नोंदणी करा" "ओळखण्यामध्ये सुधारणा करण्यासाठी, कृपया तुमच्या चेहऱ्याची पुन्हा नोंदणी करा" "अचूक फेस डेटा कॅप्चर करता आला नाही. पुन्हा करा." @@ -565,7 +569,7 @@ "फोन आणखी खाली हलवा." "फोन डावीकडे हलवा." "फोन उजवीकडे हलवा." - "तुमचे डोळे उघडे ठेवून स्क्रीनकडे पहा." + "कृपया तुमच्या डिव्हाइसकडे थेट पाहा" "तुमचा चेहरा दिसत नाही. फोनकडे पहा." "खूप हलत आहे. फोन स्थिर धरून ठेवा." "कृपया तुमच्या चेहऱ्याची पुन्हा नोंदणी करा." @@ -573,24 +577,26 @@ "एकाच प्रकारची पोझ देत आहात कृपया तुमची पोझ बदला." "तुमचे डोके थोडे कमी फिरवा." "तुमचे डोके थोडे कमी फिरवा." - - - - - - + "तुमचे डोके थोडे कमी फिरवा." + "तुमचा चहेरा लपवणारे काहीही काढून टाका." + "स्क्रीनच्या वरील उजव्या कडेवरील सेन्सर साफ करा." "चेहरा पडताळू शकत नाही. हार्डवेअर उपलब्ध नाही." - "चेहरा टाइमआउट झाला. पुन्हा प्रयत्न करा." + + "नवीन फेस डेटा स्टोअर करू शकत नाही. आधी जुना हटवा." - "फेस ऑपरेशन रद्द केले आहे" - "वापरकर्त्याने फेस ऑथेंटिकेशन रद्द केले आहे" + "चेहरा ऑपरेशन रद्द केले गेले." + + "खूप जास्त प्रयत्न केले. नंतर पुन्हा प्रयत्न करा." - "बरेच प्रयत्न. फेस ऑथेंटिकेशन बंद केले आहे." + + "चेहरा पडताळणी करू शकत नाही. पुन्हा प्रयत्न करा." - "तुम्ही फेस ऑथेंटिकेशन सेट केले नाही" - "या डिव्हाइसवर फेस ऑथेंटिकेशन ला सपोर्ट होत नाही" + + + + "चेहरा %d" @@ -651,6 +657,8 @@ "वाहक सेवांवर प्रतिबद्ध करण्यासाठी होल्डरला अनुमती देते. सामान्य अॅप्ससाठी कधीही आवश्यकता नसावी." "व्यत्यय आणू नका अॅक्सेस करा" "व्यत्यय आणू नका कॉन्फिगरेशन वाचण्यासाठी आणि लिहिण्यासाठी अॅपला अनुमती देते." + "व्ह्यू परवानगी वापर सुरू करा" + "धारकास अ‍ॅपसाठी परवानगी वापरणे सुरू करण्याची अनुमती देते. सामान्य अ‍ॅप्ससाठी कधीही आवश्यकता नसते." "पासवर्ड नियम सेट करा" "स्क्रीन लॉक पासवर्ड आणि पिन मध्ये अनुमती दिलेले लांबी आणि वर्ण नियंत्रित करा." "स्क्रीन अनलॉक प्रयत्नांचे परीक्षण करा" @@ -1359,7 +1367,8 @@ "टेस्ट हार्नेस मोड बंद करण्यासाठी फॅक्टरी रीसेट करा." "USB पोर्ट मध्ये ओलावा किंवा धूळ आहे" "USB पोर्ट आपोआप बंद होईल. अधिक जाणून घेण्यासाठी टॅप करा." - "USB फोर्ट वापरण्यासाठी सुरक्षित आहे" + + "फोनला धूळ किंवा ओलावा आढळला नाही." "बग रीपोर्ट घेत आहे..." "बग अहवाल शेअर करायचा?" @@ -1796,7 +1805,7 @@ "कार्य %1$s" "2 रे कार्य %1$s" "3 रे कार्य %1$s" - "अनपिन करण्‍यापूर्वी पिन साठी विचारा" + "अनपिन करण्‍यापूर्वी पिन विचारा" "अनपिन करण्‍यापूर्वी अनलॉक नमुन्यासाठी विचारा" "अनपिन करण्‍यापूर्वी संकेतशब्दासाठी विचारा" "आपल्या प्रशासकाने इंस्टॉल केले" @@ -1902,9 +1911,7 @@ "अपडेट आहे का ते तपासा" "आपल्याकडे नवीन मेसेज आहेत" "पाहण्‍यासाठी SMS अ‍ॅप उघडा" - "काही कार्यक्षमता मर्यादित असू शकतात" - "अनलॉक करण्यासाठी टॅप करा" - "वापरकर्ता डेटा लॉक केला" + "काही कार्यक्षमता मर्यादित असू शकतात" "कार्य प्रोफाईल लॉक केले" "कार्य प्रोफाईल अनलॉक करण्यासाठी टॅप करा" "%1$s शी कनेक्ट केलेले" diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 65e243139123..2961f379899a 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -261,7 +261,7 @@ "Makluman rangkaian" "Rangkaian tersedia" "Status VPN" - "Pentadbiran peranti" + "Makluman daripada pentadbir IT anda" "Makluman" "Tunjuk cara runcit" "Sambungan USB" @@ -549,11 +549,15 @@ "Ikon cap jari" - "urus perkakasan pengesahan wajah" + + "Membenarkan apl menggunakan kaedah untuk menambahkan dan memadamkan templat wajah untuk digunakan." - "gunakan perkakasan pengesahan wajah" - "Membenarkan apl menggunakan perkakasan pengesahan wajah untuk pengesahan" - "Pengesahan Wajah" + + + + + + "Daftarkan semula wajah anda" "Untuk meningkatkan pengecaman, sila daftarkan semula wajah anda" "Gagal menangkap data wajah dgn tepat. Cuba lagi." @@ -565,7 +569,7 @@ "Rendahkan lagi telefon." "Alihkan telefon ke kiri." "Alihkan telefon ke kanan." - "Lihat pada skrin dengan mata terbuka." + "Sila lihat terus pada peranti anda." "Gagal mengesan wajah anda. Lihat telefon." "Terlalu bnyk gerakan. Pegang telefon dgn stabil." "Sila daftarkan semula wajah anda." @@ -579,15 +583,20 @@ "Tdk dpt sahkan wajah. Perkakasan tidak tersedia." - "Tamat masa wajah dicapai. Cuba lagi." + + "Tdk dpt menyimpan data wajah baharu. Padamkan yg lama dahulu." - "Pengendalian wajah dibatalkan" - "Pengesahan wajah dibatalkan oleh pengguna" + "Pengendalian wajah dibatalkan." + + "Terlalu banyak percubaan. Cuba sebentar lagi." - "Terlalu banyak percubaan. Pengesahan wajah dilumpuhkan." + + "Tidak dapat mengesahkan wajah. Cuba lagi." - "Anda belum menyediakan pengesahan wajah" - "Pengesahan wajah tidak disokong pada peranti ini" + + + + "Wajah %d" @@ -648,6 +657,8 @@ "Membenarkan pemegang terikat kepada perkhidmatan pembawa. Tidak sekali-kali diperlukan untuk apl biasa." "akses Jangan ganggu" "Membenarkan apl membaca dan menulis konfigurasi Jangan Ganggu." + "mulakan lihat penggunaan kebenaran" + "Membenarkan pemegang memulakan penggunaan kebenaran untuk apl. Tidak sekali-kali diperlukan untuk apl biasa." "Tetapkan peraturan kata laluan" "Mengawal panjang dan aksara yang dibenarkan dalam kata laluan dan PIN kunci skrin." "Pantau percubaan buka kunci skrin" @@ -1355,7 +1366,8 @@ "Laksanakan tetapan semula kilang untuk melumpuhkan Mod Abah-abah Ujian." "Cecair atau serpihan dalam port USB" "Port USB dilumpuhkan secara automatik. Ketik untuk mengetahui lebih lanjut." - "Selamat untuk menggunakan port USB" + + "Telefon tidak lagi mengesan cecair atau serpihan." "Mengambil laporan pepijat…" "Kongsi laporan pepijat?" @@ -1898,9 +1910,7 @@ "Semak kemas kini" "Anda mempunyai mesej baharu" "Buka apl SMS untuk melihat" - "Sesetengah fungsi mungkin terhad" - "Ketik untuk membuka kunci" - "Data pengguna dikunci" + "Sesetengah fungsi mungkin terhad" "Profil kerja dikunci" "Ketik utk membuka profil kerja" "Disambungkan ke %1$s" diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index f3f077b70dda..f59301af883a 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -29,7 +29,7 @@ "%1$s %2$s" "<ခေါင်းစဉ်မဲ့>" "(ဖုန်းနံပါတ်မရှိပါ)" - "မသိရ" + "မသိ" "အသံမေးလ်" "MSISDN1" "ဆက်သွယ်မှုဆိုင်ရာပြသနာ သို့မဟုတ် မမှန်ကန်သောMMIကုတ်" @@ -261,7 +261,7 @@ "ကွန်ရက် သတိပေးချက်များ" "ကွန်ရက်ချိတ်ဆက်မှု ရရှိနိုင်ပါသည်" "VPN အခြေအနေ" - "စက်ပစ္စည်း စီမံခန့်ခွဲမှု" + "သင်၏ IT စီမံခန့်ခွဲသူထံမှ သတိပေးချက်များ" "သတိပေးချက်များ" "လက်လီအရောင်းဆိုင် သရုပ်ပြမှု" "USB ချိတ်ဆက်မှု" @@ -522,11 +522,11 @@ "သင်ဖြစ်ကြောင်း အတည်ပြုပါ" "ဇီဝအချက်အလက်သုံး ကွန်ပျူတာစက်ပစ္စည်း မရရှိနိုင်ပါ" "အထောက်အထားစိစစ်ခြင်းကို ပယ်ဖျက်လိုက်သည်" - "မသိပါ" + "မသိ" "အထောက်အထားစိစစ်ခြင်းကို ပယ်ဖျက်လိုက်သည်" "ပင်နံပါတ်၊ လော့ခ်ပုံစံ သို့မဟုတ် စကားဝှက် သတ်မှတ်မထားပါ" "လက်ဗွေရဦ တစ်ပိုင်းတစ်စ တွေ့ရှိသည်။ ကျေးဇူးပြု၍ ထပ်မံကြိုးစားပါ။" - "လက်ဗွေရာယူခြင်း မဆောင်ရွက်နိုင်ပါ။ ထပ်မံကြိုးစားပါ။" + "လက်ဗွေရာယူခြင်း မဆောင်ရွက်နိုင်ပါ။ ထပ်စမ်းကြည့်ပါ။" "လက်ဗွေဖတ်ကိရိယာ ညစ်ပေနေသည်။ ကျေးဇူးပြု၍ သန့်ရှင်းလိုက်ပြီး ပြန်စမ်းကြည့်ပါ။" "လက်ညှိုး အလွန်မြန်ဆန်စွာ ရွေ့ခဲ့သည်။ ထပ်မံ ကြိုးစားပါ။" "လက်ညှိုးအလွန်နှေးကွေးစွာ ရွေ့ခဲ့သည်။ ကျေးဇူးပြု၍ ထပ်မံကြိုးစားပါ။" @@ -549,11 +549,11 @@ "လက်ဗွေ အိုင်ကွန်" - "မျက်နှာအထောက်အထားစိစစ်ခြင်း စက်ပစ္စည်းကို စီမံပါ" + "မျက်နှာမှတ် သော့ဖွင့်ခြင်း စက်ပစ္စည်းကို စီမံခြင်း" "အသုံးပြုရန်အတွက် မျက်နှာပုံစံထည့်ရန် (သို့) ဖျက်ရန်နည်းလမ်းကို အက်ပ်အား သုံးခွင့်ပြုသည်။" - "မျက်နှာအထောက်အထားစိစစ်ခြင်း စက်ပစ္စည်းကို သုံးပါ" - "အထောက်အထားစိစစ်ရန်အတွက် ဤအက်ပ်အား မျက်နှာအထောက်အထားစိစစ်ခြင်း စက်ပစ္စည်းကိုသုံးခွင့်ပြုသည်" - "မျက်နှာ စိစစ်ခြင်း" + "မျက်နှာမှတ် သော့ဖွင့်ခြင်း စက်ပစ္စည်းကို သုံးပါ" + "အထောက်အထားစိစစ်ရန်အတွက် ဤအက်ပ်အား မျက်နှာမှတ်သော့ဖွင့်ခြင်း စက်ပစ္စည်းကိုသုံးခွင့်ပြုသည်" + "မျက်နှာမှတ် သော့ဖွင့်ခြင်း" "သင့်မျက်နှာကို စာရင်းပြန်သွင်းပါ" "ပိုမှတ်မိစေရန် သင့်မျက်နှာကို စာရင်းပြန်သွင်းပါ" "မျက်နှာဒေတာ အမှန် မရိုက်ယူနိုင်ပါ၊ ထပ်စမ်းကြည့်ပါ။" @@ -565,7 +565,7 @@ "ဖုန်းကို အောက်ပိုနှိမ့်ပါ။" "ဖုန်းကို ဘယ်ဘက်သို့ရွှေ့ပါ။" "ဖုန်းကို ညာဘက်သို့ ရွှေ့ပါ။" - "မျက်လုံးဖွင့်ထားပြီး ဖန်သားပြင်ကို ကြည့်ပါ။" + "သင့်စက်ပစ္စည်းကို တည့်တည့်ကြည့်ပါ။" "သင့်မျက်နှာကို မမြင်ရပါ။ ဖုန်းကိုကြည့်ပါ။" "လှုပ်လွန်းသည်။ ဖုန်းကို ငြိမ်ငြိမ်ကိုင်ပါ။" "သင့်မျက်နှာကို ပြန်စာရင်းသွင်းပါ။" @@ -579,15 +579,15 @@ "မျက်နှာကို အတည်ပြု၍ မရပါ။ ဟာ့ဒ်ဝဲ မရနိုင်ပါ။" - "မျက်နှာအတွက် ခဏရပ်ချိန် ပြည့်သွားပြီ။ ထပ်စမ်းပါ။" + "မျက်နှာမှတ် သော့ဖွင့်ခြင်းကို ထပ်စမ်းကြည့်ပါ။" "မျက်နှာဒေတာအသစ် သိမ်း၍မရပါ။ အဟောင်းကို အရင်ဖျက်ပါ။" - "မျက်နှာဆိုင်ရာ ဆောင်ရွက်မှုကို ပယ်ဖျက်လိုက်ပါပြီ" - "အသုံးပြုသူက မျက်နှာအထောက်အထားစိစစ်မှု မလုပ်တော့ပါ" + "မျက်နှာ ဆောင်ရွက်ခြင်းကို ပယ်ဖျက်လိုက်ပါပြီ။" + "မှတ်နှာမှတ် သော့ဖွင့်ခြင်းကို အသုံးပြုသူက မလုပ်တော့ပါ။" "အကြိမ်များစွာ စမ်းပြီးပါပြီ။ နောက်မှထပ်စမ်းပါ။" - "စမ်းသပ်ကြိမ် များနေပြီ။ မျက်နှာစိစစ်ခြင်း ပိတ်လိုက်သည်။" + "စမ်းသပ်ကြိမ် များနေပြီ။ မျက်နှာမှတ် သော့ဖွင့်ခြင်းကို ပိတ်လိုက်ပါပြီ။" "မျက်နှာကို အတည်ပြု၍ မရပါ။ ထပ်စမ်းကြည့်ပါ။" - "မျက်နှာ အထောက်အထားစိစစ်ခြင်းကို ထည့်သွင်းမထားပါ" - "ဤစက်ပစ္စည်းတွင် မျက်နှာအထောက်အထား စိစစ်ခြင်းကို သုံး၍မရပါ" + "မျက်နှာမှတ် သော့ဖွင့်ခြင်းကို ထည့်သွင်းမထားပါ" + "ဤစက်ပစ္စည်းတွင် မျက်နှာမှတ် သော့ဖွင့်ခြင်းကို သုံး၍မရပါ။" "မျက်နှာ %d" @@ -648,6 +648,8 @@ "မိုဘိုင်းဖုန်းဝန်ဆောင်မှုစနစ်တစ်ခုအား ပူးပေါင်းခွင့်ပြုရန် ကိုင်ဆောင်ထားသူအား ခွင့်ပြုပါ။ သာမန် အက်ပ်များ အတွက် ဘယ်တော့မှ မလိုအပ်ပါ။" "မနှောင့်ယှက်ရန်ကို အသုံးပြုမည်" "မနှောင့်ယှက်ရန် ချိန်ညှိမှုကို အပ်ဖ်များ ဖတ်ခြင်း ပြင်ခြင်းပြုလုပ်နိုင်ရန် ခွင့်ပြုမည်။" + "အစမြင်ကွင်း ခွင့်ပြုချက် အသုံးပြုမှု" + "အက်ပ်တစ်ခုအတွက် ခွင့်ပြုချက်စတင်အသုံးပြုမှုကို ကိုင်ဆောင်သူအား ခွင့်ပြုသည်။ ပုံမှန်အက်ပ်များအတွက် ဘယ်သောအခါမျှ မလိုအပ်ပါ။" "စကားဝှက်စည်းမျဥ်းကိုသတ်မှတ်ရန်" "မျက်နှာပြင်သော့ခတ်သည့် စကားဝှက်များနှင့် PINများရှိ ခွင့်ပြုထားသည့် စာလုံးအရေအတွက်နှင့် အက္ခရာများအား ထိန်းချုပ်ရန်။" "မျက်နှာပြင်လော့ခ်ဖွင့်ရန် ကြိုးပမ်းမှုများကို စောင့်ကြည့်ပါ" @@ -1356,7 +1358,7 @@ "\'စမ်းသပ်ခြင်းစနစ် မုဒ်\' ကိုပိတ်ရန် စက်ရုံထုတ်အတိုင်း ပြင်ဆင်သတ်မှတ်ပါ။" "USB ပို့တ်တွင် အရည် သို့မဟုတ် အမှိုက်စ ရှိနေသည်" "USB ပို့တ်ကို အလိုအလျောက် ပိတ်ထားသည်။ ပိုမိုလေ့လာရန် တို့ပါ။" - "USB ပို့တ်ကို စိတ်ချစွာ သုံးနိုင်ပါပြီ" + "USB ပို့တ်ကို အသုံးပြုနိုင်သည်" "ဖုန်းသည် အရည် သို့မဟုတ် အမှိုက်စတို့ကို အာရုံခံသိရှိနိုင်တော့မည် မဟုတ်ပါ။" "ချွတ်ယွင်းချက် အစီရင်ခံစာပြုစုနေသည်..." "ချွတ်ယွင်းချက် အစီရင်ခံစာကို မျှဝေမလား။" @@ -1757,11 +1759,11 @@ "ကဟူ" "ကဟူ၂" "ယူ၄" - "ထောင်လိုက် အရွယ်မသိ" + "ဒေါင်လိုက် အရွယ်မသိ" "အလျားလိုက် အရွယ်မသိ" "ဖျက်သိမ်းလိုက်ပြီး" "အချက်အလက်များ ရိုက်ကူးစဉ် အမှားပေါ်နေ" - "မသိပါ" + "မသိ" "စာထုတ်သောဆားဗစ်အားဖွင့်မထားပါ" "%s ဆားဗစ် ထည့်သွင်းပြီး" "ထိတို့ခြင်းဖြင့် ဖွင့်ပါ" @@ -1899,9 +1901,7 @@ "အပ်ဒိတ်စစ်ရန်" "သင့်ထံတွင် စာအသစ်များရောက်နေသည်" "ကြည့်ရှုရန် SMS အက်ပ်ကိုဖွင့်ပါ" - "အချို့လုပ်ဆောင်ချက်များ ကန့်သတ်ချက်ရှိနိုင်သည်" - "သော့ဖွင့်ရန် တို့ပါ" - "အသုံးပြုသူဒေတာအား သော့ခတ်ထားသည်" + "လုပ်ဆောင်ချက် ကန့်သတ်မှုရှိနိုင်သည်" "အလုပ်ပရိုဖိုင် သော့ခတ်ထားသည်" "သင့်အလုပ်ပရိုဖိုင်ကို သော့ဖွင့်ရန် တို့ပါ" "%1$s ချိတ်ဆက်ထားသည်" diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 5ca5d942ff41..11cc95fda2a4 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -261,7 +261,7 @@ "Nettverksvarsler" "Nettverk er tilgjengelig" "VPN-status" - "Enhetsadministrasjon" + "Varsler fra IT-administratoren din" "Varsler" "Butikkdemo" "USB-tilkobling" @@ -549,11 +549,15 @@ "Ikon for fingeravtrykk" - "administrere maskinvare for ansiktsautentisering" + + "Lar appen bruke metoder for å legge til og slette ansiktmaler for bruk." - "bruke maskinvare for ansiktsautentisering" - "Lar appen bruke maskinvare for ansiktsautentisering til autentisering" - "Ansiktsautentisering" + + + + + + "Registrer ansiktet ditt på nytt" "For å forbedre gjenkjennelse, registrer ansiktet ditt på nytt" "Kunne ikke ta opp nøyaktige ansiktsdata Prøv igjen" @@ -565,7 +569,7 @@ "Flytt telefonen lavere." "Flytt telefonen til venstre." "Flytt telefonen til høyre." - "Se på skjermen med åpne øyne." + "Se mer direkte på enheten din." "Kan ikke se ansiktet ditt. Se på telefonen." "For mye bevegelse. Hold telefonen stødig." "Registrer ansiktet ditt på nytt." @@ -579,15 +583,20 @@ "Kan ikke bekrefte ansikt. Utilgjengelig maskinvare." - "Tidsavbrudd for ansikt er nådd. Prøv igjen." + + "Kan ikke lagre nye ansiktsdata. Slett gamle data først." - "Ansiktsoperasjonen ble avbrutt" - "Ansiktsautentiseringen ble avbrutt av brukeren" + "Ansikt-operasjonen ble avbrutt." + + "For mange forsøk. Prøv igjen senere." - "For mange forsøk. Ansiktsautentisering er slått av." + + "Kan ikke bekrefte ansiktet. Prøv igjen." - "Du har ikke konfigurert ansiktsautentisering" - "Ansiktsautentisering støttes ikke på denne enheten" + + + + "Ansikt %d" @@ -648,6 +657,8 @@ "Lar innehaveren binde seg til operatørtjenester. Det skal aldri være nødvendig for vanlige apper." "tilgang til Ikke forstyrr" "Lar appen lese og skrive konfigurasjon av Ikke forstyrr." + "start visning av bruk av tillatelser" + "Lar innehaveren starte bruk av tillatelser for en app. Dette skal aldri være nødvendig for vanlige apper." "Angi passordregler" "Kontrollerer tillatt lengde og tillatte tegn i passord og PIN-koder for opplåsing av skjermen." "Overvåk forsøk på å låse opp skjermen" @@ -1355,7 +1366,8 @@ "Tilbakestill enheten til fabrikkstandard for å slå av Testrammeverk-modus." "Væske eller rusk i USB-porten" "USB-porten deaktiveres automatisk. Trykk for å finne ut mer." - "Trygt å bruke USB-porten" + + "Telefonen oppdager ikke væsker eller rusk lenger." "Kjører feilrapport …" "Vil du dele feilrapporten?" @@ -1898,9 +1910,7 @@ "Se etter oppdatering" "Du har nye meldinger" "Åpne SMS-appen for å se" - "Enkelte funksjoner kan være begrenset" - "Trykk for å låse opp" - "Brukerdataene er låst" + "Enkelte funksjoner kan begrenses" "Jobbprofilen er låst" "Trykk for å låse opp jobbprofilen" "Koblet til %1$s" diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index aa996108203d..db9ca870b02e 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -261,7 +261,7 @@ "नेटवर्कका अलर्टहरू" "नेटवर्क उपलब्ध छ" "VPN को स्थिति" - "यन्त्रको प्रशासन" + "तपाईंको IT प्रशासकबाट प्राप्त सतर्कताहरू" "अलर्टहरू" "खुद्रा बिक्री सम्बन्धी डेमो" "USB जडान" @@ -549,11 +549,15 @@ "फिंगरप्रिन्ट आइकन" - "अनुहार प्रमाणिकरण हार्डवेयर व्यवस्थापन गर्नुहोस्" + + "अनुप्रयोगलाई प्रयोगका लागि अनुहार टेम्प्लेट थप्न र मेटाउने तरिका आह्वान गर्न अनुमति दिन्छ।" - "अनुहार प्रमाणिकरण हार्डवेयर प्रयोग गर्नुहोस्" - "अनुप्रयोगलाई प्रमाणीकरणका लागि अनुहार प्रमाणीकरण हार्डवेयर प्रयोग गर्न अनुमति दिन्छ" - "अनुहार प्रमाणीकरण" + + + + + + "आफ्नो अनुहार पुनः दर्ता गर्नुहोस्" "अनुहार पहिचानको गुणस्तर सुधार गर्न कृपया आफ्नो अनुहार पुनः दर्ता गर्नुहोस्" "अनुहारको सटीक डेटा खिच्न सकिएन। फेरि प्रयास गर्नुहोस्।" @@ -565,7 +569,7 @@ "फोन अझै तल सार्नुहोस्।" "फोन बायाँतिर सार्नुहोस्।" "फोन दायाँतिर सार्नुहोस्।" - "आफ्ना आँखा पूरै खोलेर स्क्रिनमा हेर्नुहोस्।" + "कृपया अझ सीधा गरी आफ्नो स्क्रिनमा हेर्नुहोस्।" "तपाईंको अनुहार देखिएन। फोनमा हेर्नुहोस्।" "अत्यधिक हल्लियो। फोन स्थिर राख्नुहोस्।" "कृपया आफ्नो अनुहार पुनः दर्ता गर्नुहोस्।" @@ -579,15 +583,20 @@ "अनुहार पुष्टि गर्न सकिएन। हार्डवेयर उपलब्ध छैन।" - "अनुहार चिन्ने समय सकियो। फेरि प्रयास गर्नुहोस्‌।" + + "अनुहारसम्बन्धी नयाँ डेटा भण्डारण गर्न सकिएन। पहिले कुनै पुरानो डेटा मेटाउनुहोस्।" - "अनुहार पहिचान गर्ने सुविधा रद्द गरियो" - "प्रयोगकर्ताले अनुहार प्रमाणीकरण सेवा रद्द गर्नुभयो" + "अनुहार पहिचान रद्द गरियो।" + + "धेरैपटक प्रयासहरू भए। पछि फेरि प्रयास गर्नुहोस्‌।" - "अत्यधिक प्रयासहरू भए। अनुहार प्रमाणीकरण गर्ने सुविधा असक्षम पारियो।" + + "अनुहार पुष्टि गर्न सकिएन। फेरि प्रयास गर्नुहोस्।" - "तपाईंले अनुहार प्रमाणीकरण गर्ने सुविधा सेट अप गर्नुभएको छैन" - "यस यन्त्रमा अनुहार प्रमाणीकरण गर्ने सुविधा प्रयोग गर्न मिल्दैन" + + + + "अनुहार %d" @@ -648,6 +657,8 @@ "होल्डरलाई वाहक सेवाहरु बाँध्न अनुमति दिनुहोस्। सामान्य अनुप्रयोगहरूको लागि यो कहिल्यै आवश्यक पर्दैन।" "बाधा नपुर्याउँनुहोस् पहुँच गर्नुहोस्" "बाधा नपुर्याउँनुहोस् कन्फिगरेसन पढ्न र लेख्‍नको लागि अनुप्रयोगलाई अनुमति दिनुहोस्।" + "हेर्ने अनुमतिको प्रयोग सुरु गर्नुहोस्" + "वाहकलाई कुनै अनुप्रयोगसम्बन्धी अनुमतिको प्रयोग सुरु गर्न दिन्छ। साधारण अनुप्रयोगहरूलाई कहिल्यै आवश्यक नपर्नु पर्ने हो।" "पासवर्ड नियमहरू मिलाउनुहोस्" "स्क्रिन लक पासवर्ड र PIN हरूमा अनुमति दिइएको लम्बाइ र वर्णहरूको नियन्त्रण गर्नुहोस्।" "मनिटरको स्क्रिन अनलक गर्ने प्रयासहरू" @@ -1078,7 +1089,7 @@ "मेट्नुहोस्" "URL को प्रतिलिप गर्नुहोस्" "पाठ चयन गर्नुहोस्" - "अनडू गर्नुहोस्" + "अन्डू गर्नुहोस्" "रिडू गर्नुहोस्" "स्वतः भरण" "पाठ चयनता" @@ -1361,7 +1372,8 @@ "परीक्षण प्याकेज मोड असक्षम पार्न फ्याक्ट्री रिसेट गर्नुहोस्।" "USB पोर्टमा तरल पदार्थ वा धुलो भएको कुरा पत्ता लाग्यो" "USB पोर्ट स्वतः असक्षम पारियो। थप जान्न ट्याप गर्नुहोस्।" - "USB पोर्ट प्रयोग गर्न सुरक्षित छ" + + "फोनले अब उप्रान्त तरल पदार्थ वा धुलो नभएको पत्ता लगायो" "बग रिपोर्ट लिँदै..." "बग रिपोर्टलाई साझेदारी गर्ने हो?" @@ -1904,9 +1916,7 @@ "अद्यावधिक उपलब्ध छ वा छैन भनी जाँच गर्नुहोस्" "तपाईंलाई नयाँ सन्देश आएको छ" "हेर्नका लागि SMS अनुप्रयोग खोल्नुहोस्" - "केही कार्य सीमित हुनसक्छ" - "अनलक गर्न ट्याप गर्नुहोस्" - "प्रयोगकर्ताको डेटा लक गरियो" + "केही सुविधा राम्ररी नचल्न सक्छन्" "कार्य प्रोफाइल लक भयो" "कार्य प्रोफाइल अनलक गर्न ट्याप गर्नुहोस्" "%1$s मा जडान गरिएको छ" diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 61ffafc878a3..b583c73c3974 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -261,7 +261,7 @@ "Netwerkmeldingen" "Netwerk beschikbaar" "VPN-status" - "Apparaatbeheer" + "Meldingen van je IT-team" "Meldingen" "Demo voor de detailhandel" "USB-verbinding" @@ -549,11 +549,15 @@ "Vingerafdruk-pictogram" - "hardware voor gezichtsherkenning beheren" + + "Hiermee kan de app methoden aanroepen om gezichtstemplates toe te voegen en te verwijderen voor gebruik." - "hardware voor gezichtsherkenning gebruiken" - "Hiermee kan de app hardware voor gezichtsherkenning gebruiken voor verificatie" - "Gezichtsherkenning" + + + + + + "Je gezicht opnieuw registreren" "Registreer je gezicht opnieuw om de herkenning te verbeteren" "Geen accurate gegevens. Probeer het nog eens." @@ -565,7 +569,7 @@ "Houd de telefoon lager." "Beweeg je telefoon meer naar links." "Beweeg je telefoon meer naar rechts." - "Kijk met beide ogen open naar het scherm." + "Kijk rechter naar je apparaat." "Je gezicht is niet te zien. Kijk naar de telefoon." "Te veel beweging. Houd je telefoon stil." "Registreer je gezicht opnieuw." @@ -579,15 +583,20 @@ "Kan gezicht niet verifiëren. Hardware niet beschikbaar." - "Time-out voor gezicht bereikt. Probeer opnieuw." + + "Kan nieuwe gezichten niet opslaan. Verwijder eerst een oude." - "Gezichtsbewerking geannuleerd" - "Gezichtsverificatie geannuleerd door gebruiker" + "Bewerking voor gezichtsherkenning geannuleerd." + + "Te veel pogingen. Probeer het later opnieuw." - "Te veel pogingen. Gezichtsherkenning uitgeschakeld." + + "Kan gezicht niet verifiëren. Probeer het nog eens." - "Je hebt gezichtsverificatie niet ingesteld" - "Gezichtsverificatie wordt niet ondersteund op dit apparaat" + + + + "Gezicht %d" @@ -648,6 +657,8 @@ "Hiermee kan de houder binden aan providerservices. Nooit gebruikt voor normale apps." "toegang tot \'Niet storen\'" "Hiermee kan de app configuratie voor Niet storen lezen en schrijven." + "rechtengebruik starten" + "Hiermee kan de houder het rechtengebruik voor een app starten. Nooit vereist voor normale apps." "Wachtwoordregels instellen" "De lengte en het aantal tekens beheren die zijn toegestaan in wachtwoorden en pincodes voor schermvergrendeling." "Pogingen voor schermontgrendeling bijhouden" @@ -1212,17 +1223,17 @@ "Het proces %1$s overschrijdt de geheugenlimiet van %2$s. Er is een heap dump beschikbaar die je kunt delen. Let op: Deze heap dump kan gevoelige persoonlijke informatie bevatten waartoe het proces toegang heeft. Dit omvat mogelijk wat je hebt getypt." "Er is een heap dump beschikbaar van het proces van %1$s. Deze kun je delen. Let op: Deze heap dump bevat mogelijk gevoelige persoonlijke informatie waartoe het proces toegang heeft. Dit omvat mogelijk wat je hebt getypt." "Een actie voor tekst selecteren" - "Beltoonvolume" + "Ringtonevolume" "Mediavolume" "Afspelen via Bluetooth" - "Stille beltoon ingesteld" + "Stille ringtone ingesteld" "Volume inkomend gesprek" "Volume tijdens gesprek in Bluetooth-modus" "Wekkervolume" "Meldingsvolume" "Volume" "Bluetooth-volume" - "Beltoonvolume" + "Ringtonevolume" "Gespreksvolume" "Mediavolume" "Meldingsvolume" @@ -1355,7 +1366,8 @@ "Reset de fabrieksinstellingen om de test harness-modus uit te schakelen." "Vloeistof of vuil in USB-poort" "USB-poort is automatisch uitgeschakeld. Tik voor meer informatie." - "Veilig om USB-poort te gebruiken" + + "De telefoon detecteert geen vloeistof of vuil meer." "Bugrapport genereren…" "Bugrapport delen?" @@ -1898,9 +1910,7 @@ "Controleren op update" "Je hebt nieuwe berichten" "Open je sms-app om ze te bekijken" - "Bepaalde functionaliteit kan zijn beperkt" - "Tik om te ontgrendelen" - "Gebruikersgegevens vergrendeld" + "Functionaliteit kan zijn beperkt" "Werkprofiel vergrendeld" "Ontgrendel werkprofiel met tik" "Verbonden met %1$s" diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 731f2d081677..112f974f0156 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -261,7 +261,7 @@ "ନେଟୱର୍କ ଅଲର୍ଟ" "ନେଟ୍‌ୱର୍କ ଉପଲବ୍ଧ ଅଛି" "VPN ସ୍ଥିତି" - "ଡିଭାଇସ୍‌ ଆଡମିନିଷ୍ଟ୍ରେସନ୍‍" + "ଆପଣଙ୍କର ଆଇଟି ଆଡ୍‌ମିନ୍‌ଙ୍କ ଠାରୁ ଆଲର୍ଟ" "ଆଲର୍ଟ" "ରିଟେଲ୍‌ ଡେମୋ" "USB ସଂଯୋଗ" @@ -549,11 +549,15 @@ "ଆଙ୍ଗୁଠି ଚିହ୍ନ ଆଇକନ୍" - "ଫେସ୍‍ ପ୍ରମାଣୀକରଣ ହାର୍ଡୱେର୍‌ର ପରିଚାଳନା କରନ୍ତୁ" + + "ବ୍ୟବହାର ପାଇଁ ଆପ୍‍କୁ ଫେସିଆଲ୍‍ ଟେମ୍ପଲେଟ୍‍ ଯୋଡିବା ଓ ଡିଲିଟ୍‍ ର ପଦ୍ଧତି ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।" - "ଫେସ୍‍ ପ୍ରମାଣୀକରଣ ହାର୍ଡୱେର୍‌ ବ୍ୟବହାର କରନ୍ତୁ" - "ଫେସ୍‍ ପ୍ରମାଣୀକରଣ ହାର୍ଡୱେର୍‌ର ପ୍ରମାଣ ପାଇଁ ଆପ୍‍କୁ ଅନୁମତି ଦିଅନ୍ତୁ।" - "ମୁହଁ ପ୍ରାମାଣିକତା" + + + + + + "ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍‍ରୋଲ୍ କରନ୍ତୁ" "ଚିହ୍ନଟକରଣକୁ ଉନ୍ନତ କରିବା ପାଇଁ, ଦୟାକରି ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍‍ରୋଲ୍ କରନ୍ତୁ।" "ମୁହଁର ଡାଟା କ୍ୟାପଚର୍ ହେଲାନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।" @@ -565,7 +569,7 @@ "ଫୋନ୍‌କୁ ତଳକୁ ନିଅନ୍ତୁ।" "ବାମ ପଟକୁ ଫୋନ୍ ଘୁଞ୍ଚାନ୍ତୁ।" "ଡାହାଣ ପଟକୁ ଫୋନ୍ ଘୁଞ୍ଚାନ୍ତୁ।" - "ଆପଣଙ୍କ ଆଖି ଖୋଲା ଥିବା ସମୟରେ ସ୍କ୍ରିନ୍‌କୁ ଦେଖନ୍ତୁ।" + "ଦୟାକରି ଆପଣଙ୍କ ଡିଭାଇସ୍‌କୁ ସିଧାସଳଖ ଦେଖନ୍ତୁ।" "ଆପଣଙ୍କର ମୁହଁ ଦେଖି ପାରୁନାହିଁ। ଫୋନ୍‌କୁ ଦେଖନ୍ତୁ।" "ଅତ୍ୟଧିକ ଅସ୍ଥିର। ଫୋନ୍‍କୁ ସ୍ଥିର ଭାବେ ଧରନ୍ତୁ।" "ଦୟାକରି ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍‍ରୋଲ୍ କରନ୍ତୁ।" @@ -573,24 +577,26 @@ "ଅତ୍ୟନ୍ତ ସମପରି, ଦୟାକରି ଆପଣଙ୍କର ପୋଜ୍ ବଦଳାନ୍ତୁ।" "ଆପଣଙ୍କର ମୁଣ୍ଡକୁ ଟିକିଏ ବୁଲାନ୍ତୁ।" "ଆପଣଙ୍କର ମୁଣ୍ଡକୁ ଟିକିଏ ବୁଲାନ୍ତୁ।" - - - - - - + "ଆପଣଙ୍କର ମୁଣ୍ଡକୁ ଟିକିଏ ବୁଲାନ୍ତୁ।" + "ଆପଣଙ୍କର ମୁହଁ ଲୁଚାଉଥିବା ଜିନିଷକୁ କାଢ଼ି ଦିଅନ୍ତୁ।" + "ସ୍କ୍ରିନ୍‍ର ଉପର ପ୍ରାନ୍ତରେ ଥିବା ସେନ୍ସର୍‍କୁ ଖାଲି କରନ୍ତୁ।" "ମୁହଁ ଚିହ୍ନଟ କରିପାରିଲା ନାହିଁ। ହାର୍ଡୱେୟାର୍ ଉପଲବ୍ଧ ନାହିଁ।" - "ମୁହଁ ଡାଟା ଗ୍ରହଣର ସମୟସୀମା ଶେଷ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।" + + "ନୂଆ ମୁହଁ ଡାଟା ଷ୍ଟୋର୍ ହେବ ନାହିଁ। ପ୍ରଥମେ ପୁରୁଣାକୁ ଡିଲିଟ୍ କରନ୍ତୁ।" - "ମୁହଁ ପ୍ରମାଣିକିକରଣ ପ୍ରକ୍ରିୟା ବାତିଲ୍ ହୋଇଛି" - "ଉପଯୋଗକର୍ତ୍ତା ମୁହଁ ପ୍ରମାଣିକିକରଣ ବାତିଲ୍‌ କରିଛନ୍ତି" + "ଫେସ୍‍ର ଅପରେଶନ୍‍ କ୍ୟାନ୍ସଲ୍‍ ହୋ‍ଇଗଲା" + + "ବାରମ୍ବାର ଚେଷ୍ଟା। ପରେ ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।" - "ଅତ୍ୟଧିକ ପ୍ରଚେଷ୍ଟା. ମୁହଁ ପ୍ରମାଣିକିକରଣ ଅକ୍ଷମ ହୋଇଛି।" + + "ମୁହଁ ଚିହ୍ନଟ କରିପାରିଲା ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।" - "ଆପଣ ମୁହଁ ପ୍ରମାଣିକିକରଣ ସେଟ୍ ଅପ୍ କରିନାହାଁନ୍ତି" - "ଏହି ଡିଭାଇସ୍‌ରେ ମୁହଁ ପ୍ରମାଣିକିକରଣ ସମର୍ଥିତ ନୁହେଁ" + + + + "%dଙ୍କ ଫେସ୍‍" @@ -651,6 +657,8 @@ "କେରିଅର୍‌ ସେବାଗୁଡ଼ିକ ସହିତ ଧାରକଙ୍କୁ ଯୋଡ଼ିଥାଏ। ସାମାନ୍ୟ ଆପ୍‍ ପାଇଁ କଦାପି ଆବଶ୍ୟକ ହୁଏନାହିଁ।" "\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଆକ୍ସେସ୍‍ କରନ୍ତୁ" "\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" କନଫିଗରେଶନ୍‍ ପଢ଼ିବା ତଥା ଲେଖିବା ପାଇଁ ଆପକୁ ଅନୁମତି ଦେଇଥାଏ।" + "ଅନୁମତି ବ୍ୟବହାର ଦେଖିବା ଆରମ୍ଭ କରନ୍ତୁ" + "ଏକ ଆପ୍ ପାଇଁ ଅନୁମତିର ବ୍ୟବହାର ଆରମ୍ଭ କରିବାକୁ ଧାରକକୁ ଅନୁମତି ଦେଇଥାଏ। ସାଧାରଣ ଆପ୍‌ଗୁଡ଼ିକ ପାଇଁ ଏହା ଆବଶ୍ୟକ ନୁହେଁ।" "ପାସ୍‌ୱର୍ଡ ନିୟମାବଳୀ ସେଟ୍ କରନ୍ତୁ" "ଲକ୍‍ ସ୍କ୍ରୀନ୍‍ ପାସ୍‌ୱର୍ଡ ଓ PINରେ ଅନୁମୋଦିତ ଦୀର୍ଘତା ଓ ବର୍ଣ୍ଣ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ।" "ସ୍କ୍ରୀନ୍-ଅନଲକ୍ କରିବା ଉଦ୍ୟମ ନୀରିକ୍ଷଣ କରନ୍ତୁ" @@ -1233,7 +1241,7 @@ "ଡିଫଲ୍ଟ (%1$s)" "କିଛିନୁହେଁ" "ରିଙ୍ଗଟୋନ୍‌" - "ଆଲାର୍ମ ଶବ୍ଦ" + "ଆଲାରାମ୍ ଶବ୍ଦ" "ବିଜ୍ଞପ୍ତି ଶବ୍ଦ" "ଅଜଣା" @@ -1358,7 +1366,8 @@ "ଟେଷ୍ଟ ହାର୍‌ନେସ୍ ମୋଡ୍ ଅକ୍ଷମ କରିବାକୁ ଏକ ଫ୍ୟାକ୍ଟରୀ ରିସେଟ୍ କରନ୍ତୁ।" "USB ପୋର୍ଟରେ ତରଳ ପଦାର୍ଥ ବା ଧୂଳି" "USB ପୋର୍ଟ ସ୍ୱଚାଳିତ ଭାବେ ଅକ୍ଷମ ହୋଇଛି। ଅଧିକ ଜାଣିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।" - "USB ପୋର୍ଟ ବ୍ୟବହାର କରିବା ପାଇଁ ସୁରକ୍ଷିତ ଅଟେ" + + "ଫୋନ୍ ଆଉ ତରଳ ପଦାର୍ଥ କିମ୍ବା ଧୂଳିର ଚିହ୍ନଟ କରୁନାହିଁ।" "ବଗ୍ ରିପୋର୍ଟ ନିଆଯାଉଛି…" "ବଗ୍‍ ରିପୋର୍ଟ ସେୟାର୍‌ କରିବେ?" @@ -1901,9 +1910,7 @@ "ଅପଡେଟ୍‌ ପାଇଁ ଯାଞ୍ଚ କରନ୍ତୁ" "ଆପଣଙ୍କ ପାଖରେ ନୂଆ ମେସେଜ୍‍ ରହିଛି" "ଦେଖିବା ପାଇଁ SMS ଆପ୍‍ ଖୋଲନ୍ତୁ" - "କିଛି ବିଶେଷତା କାମ କରିନପାରେ" - "ଅନଲକ୍‍ କରିବାକୁ ଟାପ୍‍ କରନ୍ତୁ" - "ୟୁଜର୍‌ଙ୍କ ଡାଟା ଲକ୍‍ ହେଲା" + "ହୁଏତ କିଛି ପ୍ରକାର୍ଯ୍ୟ ସୀମିତ ହୋଇପାରେ" "ୱର୍କ ପ୍ରୋଫାଇଲ୍‍ ଲକ୍‍ ଅଛି" "ୱର୍କ ପ୍ରୋଫାଇଲ୍‍ ଅନଲକ୍‍ କରିବାକୁ ଟାପ୍‍ କରନ୍ତୁ" "%1$s ସହ କନେକ୍ଟ କରାଗଲା" diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 9ed1040f18f2..fcdc90045b22 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -261,7 +261,7 @@ "ਨੈੱਟਵਰਕ ਸੁਚੇਤਨਾਵਾਂ" "ਨੈੱਟਵਰਕ ਉਪਲਬਧ ਹੈ" "VPN ਅਵਸਥਾ" - "ਡੀਵਾਈਸ ਪ੍ਰਸ਼ਾਸਨ" + "ਤੁਹਾਡੇ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਸੁਚੇਤਨਾਵਾਂ" "ਸੁਚੇਤਨਾਵਾਂ" "ਪ੍ਰਚੂਨ ਸਟੋਰਾਂ ਲਈ ਡੈਮੋ" "USB ਕਨੈਕਸ਼ਨ" @@ -549,11 +549,15 @@ "ਫਿੰਗਰਪ੍ਰਿੰਟ ਪ੍ਰਤੀਕ" - "ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਹਾਰਡਵੇਅਰ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ" + + "ਐਪ ਨੂੰ ਵਰਤਣ ਲਈ ਚਿਹਰਾ ਟੈਮਪਲੇਟ ਸ਼ਾਮਲ ਕਰਨ ਜਾਂ ਮਿਟਾਉਣ ਦੀਆਂ ਵਿਧੀਆਂ ਦੀ ਬੇਨਤੀ ਕਰਨ ਦਿੰਦੀ ਹੈ।" - "ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਹਾਰਡਵੇਅਰ ਵਰਤੋ" - "ਐਪ ਨੂੰ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਹਾਰਡਵੇਅਰ ਵਰਤਣ ਦਿੰਦੀ ਹੈ" - "ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ" + + + + + + "ਆਪਣਾ ਚਿਹਰਾ ਮੁੜ-ਦਰਜ ਕਰੋ" "ਪਛਾਣ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਚਿਹਰੇ ਨੂੰ ਮੁੜ-ਦਰਜ ਕਰੋ" "ਸਟੀਕ ਚਿਹਰਾ ਡਾਟਾ ਕੈਪਚਰ ਨਹੀਂ ਹੋਇਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" @@ -565,7 +569,7 @@ "ਫ਼ੋਨ ਨੂੰ ਥੋੜ੍ਹਾ ਹੇਠਾਂ ਵੱਲ ਕਰੋ।" "ਫ਼ੋਨ ਨੂੰ ਖੱਬੇ ਪਾਸੇ ਲਿਜਾਓ।" "ਫ਼ੋਨ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਲਿਜਾਓ।" - "ਧਿਆਨ ਨਾਲ ਸਕ੍ਰੀਨ ਵੱਲ ਦੇਖੋ।" + "ਕਿਰਪਾ ਕਰਕੇ ਸਿੱਧਾ ਆਪਣੇ ਡੀਵਾਈਸ ਵੱਲ ਦੇਖੋ।" "ਤੁਹਾਡਾ ਚਿਹਰਾ ਨਹੀਂ ਦਿਸ ਰਿਹਾ। ਫ਼ੋਨ ਵੱਲ ਦੇਖੋ।" "ਬਹੁਤ ਜ਼ਿਆਦਾ ਹਿਲਜੁਲ। ਫ਼ੋਨ ਨੂੰ ਸਥਿਰ ਰੱਖੋ।" "ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਚਿਹਰਾ ਦੁਬਾਰਾ ਦਰਜ ਕਰੋ।" @@ -579,15 +583,20 @@ "ਚਿਹਰੇ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਹੋ ਸਕੀ। ਹਾਰਡਵੇਅਰ ਉਪਲਬਧ ਨਹੀਂ।" - "ਚਿਹਰਾ ਪਛਾਣਨ ਦਾ ਸਮਾਂ ਸਮਾਪਤ ਹੋਇਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" + + "ਨਵਾਂ ਚਿਹਰਾ ਡਾਟਾ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਪਹਿਲਾਂ ਪੁਰਾਣਾ ਹਟਾਓ।" - "ਚਿਹਰਾ ਪਛਾਣਨ ਦੀ ਪ੍ਰਕਿਰਿਆ ਰੱਦ ਕੀਤੀ ਗਈ" - "ਵਰਤੋਂਕਾਰ ਵੱਲੋਂ ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਨੂੰ ਰੱਦ ਕੀਤਾ ਗਿਆ" + "ਚਿਹਰਾ ਪਛਾਣਨ ਦੀ ਪ੍ਰਕਿਰਿਆ ਰੱਦ ਕੀਤੀ ਗਈ।" + + "ਹੱਦੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" - "ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ। ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਬੰਦ ਕੀਤਾ ਗਿਆ।" + + "ਚਿਹਰੇ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" - "ਤੁਸੀਂ ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਸੈੱਟਅੱਪ ਨਹੀਂ ਕੀਤਾ ਹੈ" - "ਇਸ ਡੀਵਾਈਸ \'ਤੇ ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਦੀ ਸੁਵਿਧਾ ਨਹੀਂ ਹੈ" + + + + "ਚਿਹਰਾ %d" @@ -648,6 +657,8 @@ "ਹੋਲਡਰ ਨੂੰ ਕੈਰੀਅਰ ਸੇਵਾਵਾਂ ਨਾਲ ਜੋੜਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਸਧਾਰਨ ਐਪਸ ਲਈ ਕਦੇ ਵੀ ਲੁੜੀਂਦਾ ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।" "ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਤੱਕ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰੋ" "ਐਪ ਨੂੰ ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਕੌਂਫਿਗਰੇਸ਼ਨ ਨੂੰ ਪੜ੍ਹਨ ਅਤੇ ਲਿਖਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।" + "ਇਜਾਜ਼ਤ ਵਰਤੋਂ ਦੇਖਣਾ ਸ਼ੁਰੂ ਕਰੋ" + "ਧਾਰਕ ਨੂੰ ਕਿਸੇ ਹੋਰ ਐਪ ਲਈ ਇਜਾਜ਼ਤ ਵਰਤੋਂ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਦਿੰਦਾ ਹੈ। ਸਧਾਰਨ ਐਪਾਂ ਲਈ ਕਦੇ ਵੀ ਲੋੜੀਂਦਾ ਨਹੀਂ ਹੋਵੇਗਾ।" "ਪਾਸਵਰਡ ਨਿਯਮ ਸੈੱਟ ਕਰੋ" "ਸਕ੍ਰੀਨ ਲਾਕ ਪਾਸਵਰਡਾਂ ਅਤੇ ਪਿੰਨ ਵਿੱਚ ਆਗਿਆ ਦਿੱਤੀ ਲੰਮਾਈ ਅਤੇ ਅੱਖਰਾਂ ਤੇ ਨਿਯੰਤਰਣ ਪਾਓ।" "ਸਕ੍ਰੀਨ ਅਣਲਾਕ ਕਰਨ ਦੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ \'ਤੇ ਨਿਗਰਾਨੀ ਰੱਖੋ" @@ -1356,7 +1367,8 @@ "ਟੈਸਟ ਹਾਰਨੈੱਸ ਮੋਡ ਬੰਦ ਕਰਨ ਲਈ ਫੈਕਟਰੀ ਰੀਸੈੱਟ ਕਰੋ।" "USB ਪੋਰਟ ਵਿੱਚ ਪਾਣੀ ਜਾਂ ਧੂੜ-ਮਿੱਟੀ" "USB ਪੋਰਟ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਬੰਦ ਕੀਤਾ ਗਿਆ। ਹੋਰ ਜਾਣਨ ਲਈ ਟੈਪ ਕਰੋ।" - "USB ਪੋਰਟ ਵਰਤਣਾ ਸੁਰੱਖਿਅਤ ਹੈ" + + "ਫ਼ੋਨ ਹੁਣ ਪਾਣੀ ਜਾਂ ਧੂੜ-ਮਿੱਟੀ ਦਾ ਪਤਾ ਨਹੀਂ ਲਗਾਉਂਦਾ ਹੈ।" "ਬੱਗ ਰਿਪਰੋਟ ਪ੍ਰਾਪਤ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..." "ਕੀ ਬੱਗ ਰਿਪੋਰਟ ਸਾਂਝੀ ਕਰਨੀ ਹੈ?" @@ -1899,9 +1911,7 @@ "ਅੱਪਡੇਟ ਦੀ ਜਾਂਚ ਕਰੋ" "ਤੁਹਾਨੂੰ ਨਵੇਂ ਸੁਨੇਹੇ ਪ੍ਰਾਪਤ ਹੋਏ ਹਨ" "ਦੇਖਣ ਲਈ SMS ਐਪ ਖੋਲ੍ਹੋ" - "ਕੁਝ ਪ੍ਰਕਾਰਜਾਤਮਕਤਾ ਸੀਮਿਤ ਹੋ ਸਕਦੀ ਹੈ" - "ਅਣਲਾਕ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ" - "ਵਰਤੋਂਕਾਰ ਡਾਟਾ ਲਾਕ ਕੀਤਾ ਗਿਆ" + "ਕੁਝ ਪ੍ਰਕਾਰਜਾਤਮਕਤਾ ਸੀਮਤ ਹੋ ਸਕਦੀ ਹੈ" "ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਲਾਕ ਕੀਤੀ ਗਈ" "ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ" "%1$s ਨਾਲ ਕਨੈਕਟ ਹੋਈ" diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 75bfc859d4dc..120d2568811b 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -267,7 +267,7 @@ "Alerty dotyczące sieci" "Sieć dostępna" "Stan sieci VPN" - "Administracja urządzeniem" + "Alerty od administratora IT" "Alerty" "Tryb demo dla sklepów" "Połączenie USB" @@ -555,11 +555,15 @@ "Ikona odcisku palca" - "zarządzanie sprzętem do uwierzytelniania za pomocą twarzy" + + "Zezwala na aktywowanie przez aplikację metody dodawania i usuwania szablonów twarzy." - "używanie sprzętu do uwierzytelniania za pomocą twarzy" - "Zezwala na używanie przez aplikację sprzętu do analizy twarzy na potrzeby uwierzytelniania" - "Uwierzytelnianie twarzą" + + + + + + "Zarejestruj swoją twarz ponownie" "Aby poprawić rozpoznawanie, ponownie zarejestruj swoją twarz" "Nie udało się zarejestrować danych twarzy. Spróbuj ponownie." @@ -571,7 +575,7 @@ "Obniż telefon." "Przesuń telefon w lewo." "Przesuń telefon w prawo." - "Patrz na ekran, mając otwarte oczy." + "Patrz prosto na urządzenie." "Nie widzę Twojej twarzy. Spójrz na telefon." "Telefon się porusza. Trzymaj go nieruchomo." "Zarejestruj swoją twarz ponownie." @@ -585,15 +589,20 @@ "Nie można zweryfikować twarzy. Sprzęt niedostępny." - "Minął limit czasu analizy. Spróbuj ponownie." + + "Nie można przechowywać nowych danych twarzy. Usuń stare." - "Analiza twarzy została anulowana" - "Użytkownik anulował uwierzytelnianie twarzą" + "Analiza twarzy została anulowana." + + "Zbyt wiele prób. Spróbuj ponownie później." - "Zbyt wiele prób. Uwierzytelnianie twarzą zostało wyłączone." + + "Nie można zweryfikować twarzy. Spróbuj ponownie." - "Uwierzytelnianie twarzą nie jest skonfigurowane" - "To urządzenie nie obsługuje uwierzytelniania twarzą" + + + + "Twarz %d" @@ -654,6 +663,8 @@ "Umożliwia właścicielowi powiązanie z usługami operatora. Nie powinno być nigdy potrzebne w normalnych aplikacjach." "dostęp do trybu Nie przeszkadzać" "Pozwala aplikacji na odczyt i zmianę konfiguracji trybu Nie przeszkadzać." + "rozpocząć wyświetlanie użycia uprawnień" + "Umożliwia rozpoczęcie korzystania z uprawnienia dotyczącego danej aplikacji jego posiadaczowi. Zwykłe aplikacje nie powinny potrzebować tego uprawnienia." "Określ reguły hasła" "Kontrolowanie długości haseł blokady ekranu i kodów PIN oraz dozwolonych w nich znaków." "Monitorowanie prób odblokowania ekranu" @@ -1399,7 +1410,8 @@ "Przywróć ustawienia fabryczne, by wyłączyć tryb jarzma testowego." "Wilgoć lub brud w porcie USB" "Port USB został automatycznie wyłączony. Kliknij, by dowiedzieć się więcej." - "Możesz bezpiecznie korzystać z portu USB" + + "Telefon nie wykrywa już wilgoci ani zanieczyszczeń." "Zgłaszam błąd…" "Udostępnić raport o błędzie?" @@ -1851,7 +1863,7 @@ "OK" "Aby wydłużyć czas pracy na baterii, Oszczędzanie baterii wyłącza lub ogranicza aktywność w tle, niektóre efekty wizualne oraz inne funkcje intensywnie zużywające energię. ""Więcej informacji" "Aby wydłużyć czas pracy na baterii, Oszczędzanie baterii wyłącza lub ogranicza aktywność w tle, niektóre efekty wizualne oraz inne funkcje intensywnie zużywające energię." - "Oszczędzanie danych uniemożliwia niektórym aplikacjom wysyłanie i odbieranie danych w tle, zmniejszając w ten sposób ich użycie. Aplikacja, z której w tej chwili korzystasz, może uzyskiwać dostęp do danych, ale rzadziej. Może to powodować, że obrazy będą się wyświetlać dopiero po kliknięciu." + "Oszczędzanie danych uniemożliwia niektórym aplikacjom wysyłanie i odbieranie danych w tle, zmniejszając w ten sposób ich użycie. Aplikacja, z której w tej chwili korzystasz, może uzyskiwać dostęp do danych, ale rzadziej. Może to powodować, że obrazy będą się wyświetlać dopiero po kliknięciu." "Włączyć Oszczędzanie danych?" "Włącz" @@ -1966,9 +1978,7 @@ "Sprawdź dostępność aktualizacji" "Masz nowe wiadomości" "Otwórz aplikację do SMS-ów, by wyświetlić wiadomość" - "Niektóre funkcje mogą być niedostępne" - "Kliknij, by odblokować" - "Dane użytkownika zablokowane" + "Część funkcji może być niedostępnych" "Profil służbowy zablokowany" "Kliknij, by odblokować profil" "Połączono z: %1$s" diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 87c9e1656904..4dedb69fcfc1 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -261,7 +261,7 @@ "Alertas de rede" "Rede disponível" "Status de VPN" - "Administração do dispositivo" + "Alertas do administrador de TI" "Alertas" "Demonstração na loja" "Conexão USB" @@ -549,11 +549,15 @@ "Ícone de impressão digital" - "gerenciar hardware de autenticação facial" + + "Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso." - "usar hardware de autenticação facial" - "Permite que o app use o hardware de autenticação facial para autenticação" - "Autenticação facial" + + + + + + "Registre seu rosto novamente" "Para melhorar o reconhecimento, registre seu rosto novamente" "Dados precisos não capturados. Tente novamente." @@ -565,7 +569,7 @@ "Mova o smartphone para baixo." "Mova o smartphone para a esquerda." "Mova o smartphone para a direita." - "Olhe para a tela com os olhos abertos." + "Olhe mais diretamente para o dispositivo." "Não é possível ver o rosto. Olhe para o telefone." "Muito movimento. Não mova o smartphone." "Registre seu rosto novamente." @@ -579,15 +583,20 @@ "Impossível verificar rosto. Hardware indisponível." - "Tempo limite atingido. Tente novamente." + + "Não é possível salvar dados faciais. Exclua dados antigos." - "Operação facial cancelada" - "Autenticação facial cancelada pelo usuário" + "Operação facial cancelada." + + "Excesso de tentativas. Tente novamente mais tarde." - "Muitas tentativas. Autenticação facial desativada." + + "Não é possível verificar o rosto. Tente novamente." - "Autenticação facial não configurada" - "A autenticação facial não é permitida neste dispositivo" + + + + "Rosto %d" @@ -648,6 +657,8 @@ "Permite que o proprietário use serviços de operadora. Não deve ser necessário para apps comuns." "acessar \"Não perturbe\"" "Permitir que o app leia e grave a configuração \"Não perturbe\"." + "iniciar uso da permissão para visualização" + "Permite que o sistema inicie o uso de permissão para um app. Não deve ser necessário para apps comuns." "Definir regras para senha" "Controla o tamanho e os caracteres permitidos nos PINs e nas senhas do bloqueio de tela." "Monitorar tentativas de desbloqueio de tela" @@ -1100,8 +1111,8 @@ "Adicionar aos contatos" "Ver" "Ver horário selecionado na agenda" - "Programar" - "Programar evento para a hora selecionada" + "Agendar" + "Agendar evento no horário selecionado" "Rastrear" "Rastrear voo selecionado" "Traduzir" @@ -1355,7 +1366,8 @@ "Realize uma redefinição para configuração original para desativar o modo Arcabouço de testes." "Líquido ou detrito na porta USB" "A porta USB é desativada automaticamente. Toque para saber mais." - "É seguro usar a porta USB" + + "Não há mais líquidos ou detritos detectados no smartphone." "Gerando relatório do bug..." "Compartilhar relatório do bug?" @@ -1664,7 +1676,7 @@ "O atalho de acessibilidade ativou o %1$s" "O atalho de acessibilidade desativou o %1$s" "Toque nos dois botões de volume e os mantenha pressionados por três segundo para usar o %1$s" - "Escolha um recurso a ser usado ao tocar no botão Acessibilidade:" + "Escolha um recurso a ser usado quando você toca no botão Acessibilidade:" "Para alterar os recursos, mantenha o botão Acessibilidade pressionado." "Ampliação" "Usuário atual %1$s." @@ -1898,9 +1910,7 @@ "Procurar atualizações" "Você tem mensagens novas" "Abra o app de SMS para ver" - "Algumas funcionalidades são limitadas" - "Toque para desbloquear" - "Dados do usuário bloqueados" + "Algumas funções são limitadas" "Perfil de trabalho bloqueado" "Toque p/ desbl. perfil de trab." "Conectado a %1$s" diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 18728691cdf1..7283db2d208f 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -261,7 +261,7 @@ "Alertas da rede" "Rede disponível" "Estado da VPN" - "Administração do dispositivo" + "Alertas do seu administrador de TI" "Alertas" "Demonstração para retalho" "Ligação USB" @@ -549,11 +549,15 @@ "Ícone de impressão digital" - "gerir hardware de autenticação facial" + + "Permite à aplicação invocar métodos para adicionar e eliminar modelos faciais para uso." - "utilizar hardware de autenticação facial" - "Permite que a aplicação utilize hardware de autenticação facial para autenticação." - "Autenticação facial" + + + + + + "Volte a inscrever o seu rosto" "Para melhorar o reconhecimento, volte a inscrever o seu rosto." "Imp. capt. dados rosto precisos. Tente novamente." @@ -565,7 +569,7 @@ "Mova o telemóvel mais para baixo." "Mova o telemóvel para a esquerda." "Mova o telemóvel para a direita." - "Olhe para o ecrã com os olhos abertos." + "Olhe mais diretamente para o dispositivo." "Não é possível ver o seu rosto. Olhe p/ telemóvel." "Demasiado movimento. Mantenha o telemóvel firme." "Volte a inscrever o rosto." @@ -579,15 +583,20 @@ "Não pode validar o rosto. Hardware não disponível." - "Limite de tempo de rosto atingido. Tente de novo." + + "Não pode guardar novos dados de rostos. Elimine um antigo." - "Operação de rosto cancelada." - "Autenticação facial cancelada pelo utilizador." + "Operação de rosto cancelada." + + "Demasiadas tentativas. Tente novamente mais tarde." - "Demasiadas tentativas. Autenticação facial desativada." + + "Não é possível validar o rosto. Tente novamente." - "Não configurou a autenticação facial." - "A autenticação facial não é suportada neste dispositivo." + + + + "Rosto %d" @@ -648,6 +657,8 @@ "Permite ao titular vincular-se a serviços do operador. Nunca deverá ser necessário nas aplicações normais." "aceder a Não incomodar" "Permite à aplicação ler e alterar a configuração de Não incomodar" + "iniciar utilização da autorização de visualização" + "Permite que o titular inicie a utilização de autorizações para uma aplicação. Nunca deverá ser necessário para aplicações normais." "Definir regras de palavra-passe" "Controlar o comprimento e os carateres permitidos nos PINs e nas palavras-passe do bloqueio de ecrã." "Monitorizar tentativas de desbloqueio do ecrã" @@ -1355,7 +1366,8 @@ "Efetue uma reposição de dados de fábrica para desativar o Modo de estrutura de teste." "Líquido ou resíduos na porta USB" "A porta USB é automaticamente desativada. Toque para saber mais." - "É seguro utilizar a porta USB" + + "O telemóvel já não deteta líquidos nem resíduos." "A criar relatório de erro…" "Pretende partilhar o relatório de erro?" @@ -1898,9 +1910,7 @@ "Verificar se existem atualizações" "Tem mensagens novas" "Abra a aplicação de SMS para ver" - "Algumas funcionalid. limitadas" - "Toque para desbloquear" - "Dados do utilizador bloqueados" + "Algumas funcionalidades limitadas" "Perfil de trabalho bloqueado" "Toque p/ desb. perfil trabalho" "Ligado a %1$s" diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 87c9e1656904..4dedb69fcfc1 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -261,7 +261,7 @@ "Alertas de rede" "Rede disponível" "Status de VPN" - "Administração do dispositivo" + "Alertas do administrador de TI" "Alertas" "Demonstração na loja" "Conexão USB" @@ -549,11 +549,15 @@ "Ícone de impressão digital" - "gerenciar hardware de autenticação facial" + + "Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso." - "usar hardware de autenticação facial" - "Permite que o app use o hardware de autenticação facial para autenticação" - "Autenticação facial" + + + + + + "Registre seu rosto novamente" "Para melhorar o reconhecimento, registre seu rosto novamente" "Dados precisos não capturados. Tente novamente." @@ -565,7 +569,7 @@ "Mova o smartphone para baixo." "Mova o smartphone para a esquerda." "Mova o smartphone para a direita." - "Olhe para a tela com os olhos abertos." + "Olhe mais diretamente para o dispositivo." "Não é possível ver o rosto. Olhe para o telefone." "Muito movimento. Não mova o smartphone." "Registre seu rosto novamente." @@ -579,15 +583,20 @@ "Impossível verificar rosto. Hardware indisponível." - "Tempo limite atingido. Tente novamente." + + "Não é possível salvar dados faciais. Exclua dados antigos." - "Operação facial cancelada" - "Autenticação facial cancelada pelo usuário" + "Operação facial cancelada." + + "Excesso de tentativas. Tente novamente mais tarde." - "Muitas tentativas. Autenticação facial desativada." + + "Não é possível verificar o rosto. Tente novamente." - "Autenticação facial não configurada" - "A autenticação facial não é permitida neste dispositivo" + + + + "Rosto %d" @@ -648,6 +657,8 @@ "Permite que o proprietário use serviços de operadora. Não deve ser necessário para apps comuns." "acessar \"Não perturbe\"" "Permitir que o app leia e grave a configuração \"Não perturbe\"." + "iniciar uso da permissão para visualização" + "Permite que o sistema inicie o uso de permissão para um app. Não deve ser necessário para apps comuns." "Definir regras para senha" "Controla o tamanho e os caracteres permitidos nos PINs e nas senhas do bloqueio de tela." "Monitorar tentativas de desbloqueio de tela" @@ -1100,8 +1111,8 @@ "Adicionar aos contatos" "Ver" "Ver horário selecionado na agenda" - "Programar" - "Programar evento para a hora selecionada" + "Agendar" + "Agendar evento no horário selecionado" "Rastrear" "Rastrear voo selecionado" "Traduzir" @@ -1355,7 +1366,8 @@ "Realize uma redefinição para configuração original para desativar o modo Arcabouço de testes." "Líquido ou detrito na porta USB" "A porta USB é desativada automaticamente. Toque para saber mais." - "É seguro usar a porta USB" + + "Não há mais líquidos ou detritos detectados no smartphone." "Gerando relatório do bug..." "Compartilhar relatório do bug?" @@ -1664,7 +1676,7 @@ "O atalho de acessibilidade ativou o %1$s" "O atalho de acessibilidade desativou o %1$s" "Toque nos dois botões de volume e os mantenha pressionados por três segundo para usar o %1$s" - "Escolha um recurso a ser usado ao tocar no botão Acessibilidade:" + "Escolha um recurso a ser usado quando você toca no botão Acessibilidade:" "Para alterar os recursos, mantenha o botão Acessibilidade pressionado." "Ampliação" "Usuário atual %1$s." @@ -1898,9 +1910,7 @@ "Procurar atualizações" "Você tem mensagens novas" "Abra o app de SMS para ver" - "Algumas funcionalidades são limitadas" - "Toque para desbloquear" - "Dados do usuário bloqueados" + "Algumas funções são limitadas" "Perfil de trabalho bloqueado" "Toque p/ desbl. perfil de trab." "Conectado a %1$s" diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 69c2fe8dfb23..3c2e03effae0 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -264,7 +264,7 @@ "Alerte privind rețeaua" "Rețea disponibilă" "Stare VPN" - "Administrarea dispozitivului" + "Alerte de la administratorul IT" "Alerte" "Demonstrație comercială" "Conexiune USB" @@ -552,11 +552,15 @@ "Pictograma amprentă" - "să gestioneze hardware-ul de autentificare facială" + + "Permite aplicației să invoce metode pentru a adăuga și a șterge șabloane faciale pentru utilizare." - "să folosească hardware de autentificare facială" - "Permite aplicației să folosească hardware de autentificare facială pentru autentificare" - "Autentificare facială" + + + + + + "Reînregistrați-vă chipul" "Pentru a îmbunătăți recunoașterea, reînregistrați-vă chipul" "Nu s-a putut fotografia fața cu precizie. Încercați din nou." @@ -568,7 +572,7 @@ "Mutați telefonul mai jos." "Mutați telefonul spre stânga." "Mutați telefonul spre dreapta." - "Uitați-vă spre ecran cu ochii deschiși." + "Priviți mai direct spre dispozitiv." "Nu vi se vede fața. Uitați-vă la telefon." "Prea multă mișcare. Țineți telefonul nemișcat." "Reînregistrați-vă chipul." @@ -582,15 +586,20 @@ "Nu se poate confirma fața. Hardware-ul nu este disponibil." - "Timpul limită pentru recunoașterea facială a trecut. Încercați din nou." + + "Nu se pot stoca date faciale noi. Ștergeți întâi unele vechi." - "Operațiunea privind fața a fost anulată" - "Autentificarea chipului este anulată de utilizator" + "Operațiunea privind chipul a fost anulată." + + "Prea multe încercări. Reîncercați mai târziu." - "Prea multe încercări. Autentificarea facială este dezactivată" + + "Nu se poate confirma fața. Încercați din nou." - "Nu ați configurat autentificarea facială" - "Autentificarea facială nu este acceptată pe dispozitiv" + + + + "Chip %d" @@ -651,6 +660,8 @@ "Permite aplicației să se conecteze la serviciile operatorului. Nu ar trebui să fie niciodată necesară pentru aplicațiile obișnuite." "accesează Nu deranja" "Permite aplicației să citească și să scrie configurația Nu deranja." + "porniți folosirea permisiunii de vizualizare" + "Permite proprietarului să pornească folosirea permisiunii pentru o aplicație. Nu ar trebui să fie necesară pentru aplicațiile obișnuite." "Să seteze reguli pentru parolă" "Stabiliți lungimea și tipul de caractere permise pentru parolele și codurile PIN de blocare a ecranului." "Să monitorizeze încercările de deblocare a ecranului" @@ -1377,7 +1388,8 @@ "Reveniți la setările din fabrică pentru a dezactiva modul Set de testare." "Lichide sau reziduuri în portul USB" "Portul USB este dezactivat automat. Atingeți ca să aflați mai multe." - "Portul USB poate fi folosit în siguranță" + + "Telefonul nu mai detectează lichide sau reziduuri." "Se creează un raport de eroare…" "Trimiteți raportul de eroare?" @@ -1932,9 +1944,7 @@ "Căutați actualizări" "Aveți mesaje noi" "Deschideți aplicația pentru SMS-uri ca să vizualizați" - "Unele funcții ar putea fi limitate" - "Atingeți pentru a debloca" - "Datele utilizatorului: blocate" + "Unele funcții ar putea fi limitate" "Profil de serviciu blocat" "Atingeți ca să deblocați" "Conectat la %1$s" diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index f45b9fb0cbb1..936f463f7c42 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -267,7 +267,7 @@ "Оповещения сети" "Сеть доступна" "Статус VPN" - "Управление устройством" + "Уведомления от вашего администратора" "Уведомления" "Деморежим для магазина" "USB-подключение" @@ -555,11 +555,15 @@ "Значок отпечатка пальца" - "Управлять оборудованием для распознавания лиц" + + "Приложение сможет добавлять и удалять шаблоны лиц." - "Использовать оборудование для распознавания лиц" - "Приложение сможет использовать распознающее оборудование для аутентификации." - "Распознавание лица" + + + + + + "Зарегистрируйте лицо ещё раз" "Чтобы улучшить распознавание лица, зарегистрируйте его ещё раз" "Не удалось собрать данные. Повторите попытку." @@ -571,7 +575,7 @@ "Переместите телефон ниже." "Переместите телефон влево." "Переместите телефон вправо." - "Смотрите в экран и не закрывайте глаза." + "Смотрите прямо на устройство." "Вашего лица не видно. Смотрите на телефон." "Не перемещайте устройство. Держите его неподвижно." "Повторите попытку." @@ -585,15 +589,20 @@ "Не удалось распознать лицо. Сканер недоступен." - "Превышено время ожидания. Повторите попытку." + + "Недостаточно места. Удалите старые данные для распознавания." - "Распознавание отменено." - "Распознавание лица отменено пользователем." + "Распознавание отменено" + + "Слишком много попыток. Повторите позже." - "Слишком много попыток. Распознавание лица отключено." + + "Не удалось распознать лицо. Повторите попытку." - "Вы не настроили распознавание лица." - "Это устройство не поддерживает распознавание лица." + + + + "Лицо %d" @@ -654,6 +663,8 @@ "Приложение сможет подключаться к сервисам оператора связи. Это разрешение не используется обычными приложениями." "Доступ к режиму \"Не беспокоить\"" "Открывает приложению доступ к настройкам режима \"Не беспокоить\" и позволяет изменять их." + "Просмотр данных об используемых разрешениях" + "Приложение получит доступ к данным об используемых разрешениях. Это разрешение не требуется обычным приложениям." "Настройка правил для паролей" "Контролировать длину и символы при вводе пароля и PIN-кода." "Отслеживание попыток разблокировать экран" @@ -1399,7 +1410,8 @@ "Чтобы отключить тестовый режим, сбросьте настройки до заводских." "В USB-порт попала вода или грязь" "USB-порт был автоматически отключен. Нажмите, чтобы узнать подробности." - "Можно использовать USB-порт" + + "Вода или грязь внутри не обнаружена." "Подготовка отчета об ошибке" "Разрешить доступ к информации об ошибке?" @@ -1842,9 +1854,9 @@ "Рабочий %1$s" "Задача 2: %1$s" "Задача 3: %1$s" - "PIN-код для отключения" - "Запрашивать графический ключ для отключения блокировки" - "Запрашивать пароль для отключения блокировки" + "Запрашивать PIN-код" + "Запрашивать графический ключ" + "Запрашивать пароль" "Установлено администратором" "Обновлено администратором" "Удалено администратором" @@ -1966,9 +1978,7 @@ "Проверить обновления" "Новые сообщения" "Чтобы просмотреть, откройте приложение для обмена SMS" - "Некоторые функции недоступны" - "Нажмите для разблокировки" - "Пользов. данные заблокированы" + "Некоторые функции могут не работать" "Рабочий профиль заблокирован" "Нажмите, чтобы разблокировать раб. профиль" "Подключено к %1$s" diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 29a2dd233a67..fc7f3ea978eb 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -261,7 +261,7 @@ "ජාල ඇඟවීම්" "ජාලය ලබා ගැනීමට හැකිය" "VPN තත්ත්වය" - "උපාංග පරිපාලනය" + "ඔබේ තොරතුරු තාක්‍ෂණ පරිපාලක වෙතින් ඇඟවීම්" "ඇඟවීම්" "සිල්ලර ආදර්ශනය" "USB සම්බන්ධතාවය" @@ -549,11 +549,11 @@ "ඇඟිලි සලකුණු නිරූපකය" - "මුහුණු සත්‍යාපක දෘඪාංග කළමනාකරණය කරන්න" + "මුහුණු අඟුලු ඇරීමේ දෘඪාංග කළමනා කරන්න" "මුහුණු අච්චු එකතු කිරීමට සහ ඉවත් කිරීමට අදාළ ක්‍රම භාවිතය සඳහා මෙම යෙදුමට ඉඩ දෙයි." - "මුහුණු සත්‍යාපක දෘඪාංග භාවිතා කරන්න" - "සත්‍යාපනය සඳහා සත්‍යාපක දෘඪාංග භාවිත කිරීමට යෙදුමට ඉඩ දෙයි" - "මුහුණු සත්‍යාපනය" + "මුහුණු අඟුලු ඇරීමේ දෘඪාංග භෘවිත කරන්න" + "සත්‍යාපනය සඳහා මුහුණු අඟුලු ඇරීමේ දෘඪාංග භාවිත කිරීමට යෙදුමට ඉඩ දෙයි" + "මුහුණු අඟුලු ඇරීම" "ඔබේ මුහුණ යළි ලියාපදිංචි කරන්න" "හඳුනා ගැනීම වැඩිදියුණු කිරීමට, ඔබේ මුහුණ යළි-ලියාපදිංචි කරන්න" "නිරවද්‍ය මුහුණු දත්ත ගත නොහැකි විය. නැවත උත්සාහ කරන්න." @@ -565,7 +565,7 @@ "දුරකථනය පහළට ගෙන යන්න." "දුරකථනය වමට ගෙන යන්න." "දුරකථනය දකුණට ගෙන යන්න." - "ඔබේ ඇස් ඇරගෙන තිරය වෙත බලන්න." + "ඔබේ උපාංගය වෙත තවත් ඍජුව බලන්න." "ඔබේ මුහුණ දැකිය නොහැක. දුරකථනය වෙත බලන්න." "චලනය ඉතා වැඩියි. දුරකථනය ස්ථිරව අල්ලා සිටින්න." "ඔබේ මුහුණ යළි ලියාපදිංචි කරන්න." @@ -579,15 +579,15 @@ "මුහුණ සත්‍යාපනය කළ නොහැක. දෘඩාංගය නොමැත." - "මුහුණු කාල නිමාව ළඟා විය. නැවත උත්සාහ කරන්න." + "නැවතත් මුහුණු අඟුලු ඇරීම උත්සාහ කරන්න." "නව මුහුණු දත්ත ගබඩා කළ නොහැක. පළමුව පැරණි එකක් මකන්න." - "මුහුණු මෙහෙයුම අවලංගුයි" - "පරිශීලකයා විසින් මුහුණ සත්‍යාපනය අවලංගු කර ඇත" + "මුහුණු මෙහෙයුම අවලංගු කරන ලදී." + "පරිශීලකයා මුහුණු අඟුලු ඇරීම අවලංගු කර ඇත." "උත්සාහයන් ඉතා වැඩි ගණනකි. පසුව නැවත උත්සාහ කරන්න." - "ප්‍රයත්නයන් බොහෝමයකි. මුහුණු සත්‍යාපනය අබලයි." + "ප්‍රයත්න ගණන වැඩියි. මුහුණු අඟුලු ඇරීම අබලයි." "මුහුණ සත්‍යාපන කළ නොහැක. නැවත උත්සාහ කරන්න." - "ඔබ මුහුණු සත්‍යාපනය පිහිටුවා නැත" - "මෙම උපාංගයෙහි මුහුණු සත්‍යාපනයට සහාය නොදක්වයි" + "ඔබ මුහුණු අඟුලු ඇරීම සකසා නැත" + "මෙම උපාංගයෙහි මුහුණු අඟුලු ඇරීමට සහය නොදැක්වේ" "මුහුණු %d" @@ -648,6 +648,8 @@ "වාහක සේවා වෙත සම්බන්ධ කිරීමට ධාරකයාට අවසර දේ. සාමාන්‍ය යෙදුම් සඳහා කිසිදා අවශ්‍ය නොවිය යුතුය." "බාධා නොකරන්න ප්‍රවේශ වන්න" "බාධා නොකරන්න වින්‍යාස කිරීම කියවීමට සහ ලිවීමට යෙදුමට ඉඩ දෙයි." + "අවසර භාවිතය බැලීමට ආරම්භ කරන්න" + "තබා සිටින්නාට යෙදුමක් සඳහා අවසර භාවිතය ආරම්භ කිරීමට ඉඩ දෙයි. සාමාන්‍ය යෙදුම් සඳහා කිසි විටෙක අවශ්‍ය නොවිය යුතු ය." "මුරපද නීති සකස් කිරීම" "තිර අගුලු මුරපද සහ PIN තුළ ඉඩ දෙන දිග සහ අනුලකුණු පාලනය කිරීම." "තිරය අගුළු ඇරීමේ උත්සාහයන් නිරීක්ෂණය කරන්න" @@ -1357,7 +1359,7 @@ "පුරක පරීක්‍ෂා ප්‍රකාරය අබල කිරීමට කර්මාන්තශාලා යළි සැකසීමක් ඉටු කරන්න." "USB තොට තුළ ද්‍රව හෝ කුණු" "USB තොට ස්වයංක්‍රීයව අබල කෙරේ. තවත් දැන ගැනීමට තට්ටු කරන්න." - "USB තොට භාවිත කිරීම ආරක්‍ෂිතයි" + "USB තොට භාවිත කළාට කමක් නැත" "දුරකථනය තවදුරටත් ද්‍රව හෝ කුණු අනාවරණ නොකරයි." "දෝෂ වාර්තාවක් ගනිමින්…" "දෝෂ වාර්තාව බෙදා ගන්නද?" @@ -1900,9 +1902,7 @@ "යාවත්කාලීන සඳහා පරික්ෂා කරන්න" "ඔබට නව පණිවිඩ තිබේ" "බැලීමට විවෘත SMS යෙදුම විවෘත කරන්න" - "ඇතැම් ක්‍රියාකාරිත්ව සීමිත විය හැකිය" - "අගුලු හැරීමට තට්ටු කරන්න" - "පරිශීලක දත්ත අගුලු දමා ඇත" + "ඇතැම් ක්‍රියාකාරිත්ව සීමිත විය හැක" "කාර්යාල පැතිකඩ අගුලු දමා ඇත" "කාර්යාල පැතිකඩ අගුලු හැරීමට තට්ටු කරන්න" "%1$s වෙත සම්බන්ධ විය" diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 33dc6f4d8b37..3a8136de91af 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -267,7 +267,7 @@ "Upozornenia týkajúce sa siete" "Sieť je k dispozícii" "Stav pripojenia VPN" - "Správa zariadenia" + "Upozornenia od vášho správcu IT" "Upozornenia" "Predajná ukážka" "Pripojenie USB" @@ -555,11 +555,15 @@ "Ikona odtlačku prsta" - "správa hardvéru na overenie tváre" + + "Umožňuje aplikácii vyvolať metódy, ktoré pridávajú a odstraňujú šablóny tvárí." - "používanie hardvéru na overenie tváre" - "Umožňuje aplikácii používať na overenie totožnosti hardvér na overenie tváre" - "Overenie tváre" + + + + + + "Znova zaregistrujte svoju tvár" "Znova zaregistrujte svoju tvár, aby sa zlepšilo rozpoznávanie" "Nepodarilo sa nasnímať presné údaje o tvári. Skúste to znova." @@ -571,7 +575,7 @@ "Posuňte telefón nižšie." "Posuňte telefón doľava." "Posuňte telefón doprava." - "Pozrite sa na obrazovku s otvorenými očami." + "Pozrite sa priamejšie na zariadenie." "Nie je vidieť vašu tvár. Pozrite sa na telefón." "Priveľa pohybu. Nehýbte telefónom." "Znova zaregistrujte svoju tvár." @@ -585,15 +589,20 @@ "Tvár sa nedá overiť. Hardvér nie je k dispozícii." - "Vypršal časový limit tváre. Skúste to znova." + + "Nové údaje o tvári sa nedajú uložiť. Najprv odstráňte jeden zo starých záznamov." - "Operácia týkajúca sa tváre bola zrušená" - "Overenie tváre bolo zrušené používateľom" + "Operácia týkajúca sa tváre bola zrušená" + + "Príliš veľa pokusov. Skúste to znova neskôr." - "Príliš veľa pokusov. Overenie tváre bolo deaktivované." + + "Nedá sa overiť tvár. Skúste to znova." - "Overenie tváre ste nenastavili" - "Toto zariadenie nepodporuje overenie tváre" + + + + "Tvár %d" @@ -654,6 +663,8 @@ "Umožňuje držiteľovi povolenia naviazať sa na služby operátora. Bežné aplikácie by toto povolenie nemali nikdy nepotrebovať." "prístup k režimu bez vyrušení" "Umožňuje aplikácii čítať a zapisovať konfiguráciu režimu bez vyrušení." + "spustenie používania povolenia na zobrazenie" + "Umožňuje držiteľovi spustiť používanie povolenia aplikáciou. Bežné aplikácie by toto povolenie nemali nikdy potrebovať." "Nastaviť pravidlá pre heslo" "Nastavte dĺžku hesiel na odomknutie obrazovky aj kódov PIN a v nich používané znaky." "Sledovanie pokusov o odomknutie obrazovky" @@ -1399,7 +1410,8 @@ "Ak chcete zakázať režim správcu testov, obnovte výrobné nastavenia." "Tekutina alebo nečistoty v porte USB" "Port USB je automaticky deaktivovaný. Ďalšie informácie zobrazíte klepnutím." - "Port USB môžete bezpečne používať" + + "Telefón už nerozpoznáva tekutinu ani nečistoty." "Preberá sa hlásenie chyby…" "Chcete zdieľať hlásenie chyby?" @@ -1966,9 +1978,7 @@ "Skontrolovať dostupnosť aktualizácie" "Máte nové správy." "Otvorte aplikáciu pre SMS a zobrazte správu" - "Niektoré funkcie môžu byť obmedzené" - "Odomknite klepnutím" - "Údaje používateľa sú uzamknuté" + "Niektoré funkcie môžu byť obmedzené" "Pracovný profil je uzamknutý" "Profil odomknete klepnutím" "Pripojené k zariadeniu %1$s" diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 7bd13fc4eb04..84e63ccf3d87 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -267,7 +267,7 @@ "Opozorila omrežja" "Omrežje je na voljo" "Stanje omrežja VPN" - "Skrbništvo naprave" + "Opozorila skrbnika za IT" "Opozorila" "Predstavitev za maloprodajo" "Povezava USB" @@ -555,11 +555,15 @@ "Ikona prstnih odtisov" - "upravljanje strojne opreme za preverjanje pristnosti obraza" + + "Aplikaciji omogoča sprožanje načinov za dodajanje in brisanje predlog z obrazi za uporabo." - "uporaba strojne opreme za preverjanje pristnosti obraza" - "Aplikaciji omogoča uporabo strojne opreme za preverjanje pristnosti obraza" - "Preverjanje pristnosti z obrazom" + + + + + + "Znova prijavite obraz" "Za izboljšanje prepoznavanja znova prijavite svoj obraz" "Točnih podatkov o obrazu ni bilo mogoče zajeti. Poskusite znova." @@ -571,7 +575,7 @@ "Telefon premaknite nižje." "Telefon premaknite v levo." "Telefon premaknite v desno." - "Z odprtimi očmi glejte v zaslon." + "Glejte bolj naravnost v napravo." "Obraz ni viden. Poglejte v telefon." "Preveč se premikate. Držite telefon pri miru." "Znova prijavite svoj obraz." @@ -585,15 +589,20 @@ "Obraza ni mogoče preveriti. Str. opr. ni na voljo." - "Potek časa za preverjanje obraza. Poskusite znova." + + "Novega obraza ni mogoče shraniti. Najprej izbrišite starega." - "Dejanje z obrazom je bilo preklicano" - "Preverjanje pristnosti obraza preklical uporabnik" + "Dejanje z obrazom je bilo preklicano." + + "Preveč poskusov. Poskusite znova pozneje." - "Preveč poskusov. Preverjanje pristnosti obraza onemogočeno." + + "Obraza ni mogoče preveriti. Poskusite znova." - "Preverjanje pristnosti obraza ni nastavljeno" - "Ta naprava ne podpira preverjanja pristnosti obraza" + + + + "Obraz %d" @@ -654,6 +663,8 @@ "Imetniku omogoča povezovanje z operaterjevimi storitvami. Tega ni treba nikoli uporabiti za navadne aplikacije." "dostop do načina »ne moti«" "Aplikaciji omogoča branje in pisanje konfiguracije načina »ne moti«." + "začetek uporabe dovoljenja za ogledovanje" + "Imetniku omogoča začetek uporabe dovoljenj za aplikacijo. Nikoli ni potrebno za navadne aplikacije." "Nastavitev pravil za geslo" "Nadzor nad dolžino in znaki, ki so dovoljeni v geslih in kodah PIN za odklepanje zaslona." "Nadzor nad poskusi odklepanja zaslona" @@ -985,7 +996,7 @@ "Pretekli mesec" "Starejše" - "vsak %s" + "%s" "ob %s" "leta %s" "dan" @@ -1399,7 +1410,8 @@ "Če želite onemogočiti način preizkusnega ogrodja, ponastavite napravo na tovarniške nastavitve." "V vratih USB je tekočina ali umazanija" "Vrata USB so samodejno onemogočena. Dotaknite se, če želite izvedeti več." - "Vrata USB so varna za uporabo" + + "Telefon ne zaznava več tekočine ali umazanije." "Zajemanje poročila o napakah …" "Želite poslati poročilo o napakah?" @@ -1966,9 +1978,7 @@ "Preveri, ali je na voljo posodobitev" "Imate nova sporočila." "Za ogled odprite aplikacijo za SMS-je" - "Nekatere funkcije bodo omejene" - "Dotaknite se, da odklenete" - "Uporabniški podatki zaklenjeni" + "Nekatere funkcije bodo morda omejene" "Delovni profil je zaklenjen" "Dotaknite se za odkl. del. pr." "Vzpostavljena povezava z napravo %1$s" diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 5c7b014de227..202d0900a3a4 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -261,7 +261,7 @@ "Sinjalizimet e rrjetit" "Ka rrjet të disponueshëm" "Statusi i VPN-së" - "Administrimi i pajisjes" + "Sinjalizimet nga administratori i teknologjisë së informacionit" "Sinjalizimet" "Demonstrimi i shitjes me pakicë" "Lidhja USB" @@ -549,11 +549,15 @@ "Ikona e gjurmës së gishtit" - "menaxho harduerin për vërtetimin e fytyrës" + + "Lejon aplikacionin të aktivizojë mënyra për shtim e fshirje të shablloneve të përdorura." - "përdor harduerin për vërtetimin e fytyrës" - "Lejon aplikacionin të përdorë harduer vërtetimi të fytyrës për procesin e vërtetimit" - "Vërtetimi me fytyrë" + + + + + + "Regjistro përsëri fytyrën tënde" "Për të përmirësuar njohjen, regjistro përsëri fytyrën tënde" "S\'mund të regjistroheshin të dhëna të sakta të fytyrës. Provo përsëri." @@ -565,7 +569,7 @@ "Ule telefonin më poshtë." "Lëvize telefonin majtas." "Lëvize telefonin djathtas" - "Shiko tek ekrani me sytë të hapur." + "Shiko më drejt në pajisjen tënde." "Fytyra jote nuk shfaqet. Shiko te telefoni." "Ka shumë lëvizje. Mbaje telefonin të palëvizur." "Regjistroje përsëri fytyrën tënde." @@ -579,15 +583,20 @@ "Fytyra s\'mund të verifikohet. Hardueri nuk ofrohet." - "Koha e pritjes për fytyrën skadoi. Provo përsëri." + + "S\'mund të ruhen të dhëna të reja fytyre. Fshi një të vjetër në fillim." - "Veprimi me fytyrën u anulua" - "Vërtetimi me fytyrë u anulua nga përdoruesi" + "Veprimi me fytyrën u anulua." + + "Shumë përpjekje. Provo sërish më vonë." - "Shumë përpjekje. Vërtetimi me fytyrë u çaktivizua." + + "Fytyra nuk mund të verifikohet. Provo përsëri." - "Nuk e ke konfiguruar vërtetimin me fytyrë." - "Vërtetimi me fytyrë nuk mbështetet në këtë pajisje" + + + + "Fytyra %d" @@ -648,6 +657,8 @@ "Lejon që mbajtësi të lidhet me shërbimet e operatorit celular. Nuk nevojitet për aplikacionet normale." "qasje te \"Mos shqetëso\"" "Lejon aplikacionin të lexojë dhe shkruajë konfigurimin e \"Mos shqetëso\"." + "nis përdorimin e lejes për shikimin" + "Lejon që mbajtësi të nisë përdorimin e lejeve për një aplikacion. Nuk duhet të nevojitet asnjëherë për aplikacionet normale." "Cakto rregullat e fjalëkalimit" "Kontrollo gjatësinë dhe karakteret e lejuara në fjalëkalimet dhe kodet PIN të kyçjes së ekranit." "Monitoro tentativat e shkyçjes së ekranit" @@ -977,7 +988,7 @@ "Muajin e fundit" "Më të vjetra" - "në %s" + "më %s" "në %s" "në %s" "ditë" @@ -1356,7 +1367,8 @@ "Kryej një rivendosje në cilësimet e fabrikës për të çaktivizuar \"Modalitetin e lidhjes së testimit\"." "Lëngje ose papastërti në portën e USB-së" "Porta e USB-së është çaktivizuar automatikisht. Trokit për të mësuar më shumë." - "Nuk ka rrezik të përdoret porta e USB-së" + + "Telefoni nuk i dallon më lëngjet apo papastërtitë." "Po merret raporti i defekteve në kod…" "Të ndahet raporti i defektit në kod?" @@ -1899,9 +1911,7 @@ "Kliko për përditësim" "Ke mesazhe të reja" "Hap aplikacionin SMS për ta parë" - "Disa funksione mund të jenë të kufizuara" - "Trokit për të shkyçur" - "Të dhënat e përdoruesit të kyçura" + "Disa funksione mund të jenë të kufizuara" "Profili i punës është i kyçur" "Trokit për ta shkyçur profilin e punës" "U lidh me %1$s" diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 52bfbe2440b5..812af0257fd8 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -264,7 +264,7 @@ "Обавештења у вези са мрежом" "Мрежа је доступна" "Статус VPN-а" - "Администрирање уређаја" + "Обавештења од ИТ администратора" "Обавештења" "Режим демонстрације за малопродајне објекте" "USB веза" @@ -552,11 +552,15 @@ "Икона отиска прста" - "управљање хардв. за потврду идентитета помоћу лица" + + "Дозвољава да апликација активира методе за додавање и брисање шаблона лица ради коришћења." - "коришћење хардв. за потврду идентитета помоћу лица" - "Дозвољава да апликација користи хардвер за потврду идентитета помоћу лица" - "Потврда идентитета лицем" + + + + + + "Поново региструјте лице" "Да бисте побољшали препознавање, поново региструјте лице" "Снимање лица није успело. Пробајте поново." @@ -568,7 +572,7 @@ "Померите телефон надоле." "Померите телефон улево." "Померите телефон удесно." - "Погледајте у екран са отвореним очима." + "Гледајте право у уређај." "Не види се лице. Гледајте у телефон." "Много се померате. Држите телефон мирно." "Поново региструјте лице." @@ -582,15 +586,20 @@ "Провера лица није успела. Хардвер није доступан." - "Истекло је време за проверу лица. Пробајте поново." + + "Нови подаци о лицу нису сачувани. Прво избришете претходне." - "Обрада лица је отказана" - "Корисник је отказао потврду идентитета лицем" + "Обрада лица је отказана." + + "Превише покушаја. Пробајте поново касније." - "Превише покушаја. Потврда идентитета лицем је онемогућена." + + "Провера лица није успела. Пробајте поново." - "Нисте подесили потврду идентитета лицем" - "Препознавање лица није подржано на овом уређају" + + + + "Лице %d" @@ -651,6 +660,8 @@ "Дозвољава власнику да се повеже са услугама оператера. Никада не би требало да буде потребно за обичне апликације." "приступај подешавању Не узнемиравај" "Дозвољава апликацији да чита и уписује конфигурацију подешавања Не узнемиравај." + "почетак коришћења дозволе за преглед" + "Дозвољава власнику да започне коришћење дозволе за апликацију. Никада не би требало да буде потребна за уобичајене апликације." "Подешавање правила за лозинку" "Контролише дужину и знакове дозвољене у лозинкама и PIN-овима за закључавање екрана." "Надгледајте покушаје откључавања екрана" @@ -1153,7 +1164,7 @@ "Измените помоћу" "Измените помоћу апликације %1$s" "Измени" - "Дељење" + "Делите" "Делите помоћу апликације %1$s" "Дели" "Пошаљите помоћу:" @@ -1377,7 +1388,8 @@ "Обавите ресетовање на фабричка подешавања да бисте онемогућили режим пробног коришћења." "Течност или нечистоћа у USB порту" "USB порт је аутоматски искључен. Додирните да бисте сазнали више." - "Коришћење USB порта је безбедно" + + "Телефон више не открива течност или нечистоћу." "Извештај о грешци се генерише…" "Желите ли да поделите извештај о грешци?" @@ -1932,9 +1944,7 @@ "Потражи ажурирање" "Имате нове поруке" "Отворите апликацију за SMS да бисте прегледали" - "Неке функције су можда ограничене" - "Додирните да бисте откључали" - "Подаци корисника су закључани" + "Неке функције су можда ограничене" "Профил за Work је закључан" "Додиром откљ. профил за Work" "Повезано је са производом %1$s" diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 52c532d96aa9..b3e95f9d11ae 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -261,7 +261,7 @@ "Nätverksvarningar" "Nätverk tillgängligt" "VPN-status" - "Enhetsadministration" + "Aviseringar från IT-administratören" "Varningar" "Demo för återförsäljare" "USB-anslutning" @@ -295,7 +295,7 @@ "Vill du ge <b>%1$s</b> åtkomst till foton, mediefiler och andra filer på enheten?" "Mikrofon" "spela in ljud" - "Vill du ge <b>%1$s</b> behörighet att spela in ljud?" + "Vill du ge <b>%1$sn</b> behörighet att spela in ljud?" "Fysiska aktivitet" "åtkomst till data om fysisk aktivitet" "Vill du ge <b>%1$s</b> to åtkomst till data om fysisk aktivitet?" @@ -549,11 +549,15 @@ "Ikon för fingeravtryck" - "hantera maskinvara för ansiktsautentisering" + + "Tillåter att appen anropar metoder för att lägga till och radera ansiktsmallar." - "använda maskinvara för ansiktsautentisering" - "Tillåter att appen använder maskinvara för ansiktsigenkänning vid autentisering" - "Ansiktsautentisering" + + + + + + "Registrera ansiktet på nytt" "Gör om registreringen av ansiktet så att ansiktsigenkänningen ska fungera bättre" "Det gick inte att fånga ansiktsdata. Försök igen." @@ -565,7 +569,7 @@ "Sänk mobilen." "Flytta mobilen åt vänster." "Flytta mobilen åt höger." - "Titta rakt på skärmen." + "Titta rakt på enheten." "Ansiktet syns inte. Titta på mobilen." "För mycket rörelse. Håll mobilen stilla." "Registrera ansiktet på nytt." @@ -579,15 +583,20 @@ "Ansiktsverifiering går ej. Otillgänglig maskinvara." - "Tidsgränsen för ansikte har nåtts. Försök igen." + + "Kan inte lagra ny ansiktsdata. Radera först gammal data." - "Ansiktsåtgärden har avbrutits" - "Autentiseringen av ansiktet avbröts av användaren" + "Ansiktsåtgärden har avbrutits." + + "Du har gjort för många försök. Försök igen senare." - "För många försök. Ansiktsautentisering har inaktiverats." + + "Det gick inte att verifiera ansiktet. Försök igen." - "Du har inte konfigurerat ansiktsautentisering" - "Ansiktsautentisering stöds inte på den här enheten" + + + + "Ansikte %d" @@ -648,6 +657,8 @@ "Tillåter att innehavaren binder till leverantörstjänster. Det här ska inte behövas för vanliga appar." "åtkomst till Stör ej" "Ger appen läs- och skrivbehörighet till konfigurationen för Stör ej." + "börja visa behörighetsanvändningen" + "Gör att innehavaren kan öppna behörighetsanvändning för en app. Ska inte behövas för vanliga appar." "Ange lösenordsregler" "Styr tillåten längd och tillåtna tecken i lösenord och pinkoder för skärmlåset." "Övervaka försök att låsa upp skärmen" @@ -1355,7 +1366,8 @@ "Inaktivera testverktygsläget genom att göra en återställning till standardinställningarna." "Vätska eller smuts i USB-porten" "USB-porten har inaktiverats automatiskt. Tryck för att läsa mer." - "Nu kan du använda USB-porten igen" + + "Mobilen känner inte längre av någon vätska eller smuts." "Felrapporten överförs …" "Vill du dela felrapporten?" @@ -1898,9 +1910,7 @@ "Sök efter uppdateringar" "Du har nya meddelanden" "Öppna sms-appen och visa meddelandet" - "Vissa funktioner är begränsade" - "Tryck för att låsa upp" - "Användaruppgifterna är låsta" + "Vissa funktioner är begränsade" "Jobbprofilen är låst" "Tryck och lås upp jobbprofilen" "Ansluten till %1$s" diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 1fa17dc76836..b18543eb12c5 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -261,7 +261,7 @@ "Arifa za mtandao" "Mtandao unapatikana" "Hali ya VPN" - "Udhibiti wa kifaa" + "Arifa kutoka kwa Msimamizi wako wa TEHAMA" "Arifa" "Onyesho la duka la rejareja" "Muunganisho wa USB" @@ -295,7 +295,7 @@ "Ungependa <b>%1$s</b> ifikie picha, maudhui na faili kwenye kifaa chako?" "Kipokea sauti" "irekodi sauti" - "Ungependa kuiruhusu <b>%1$s</b> irekodi sauti?" + "Ungependa kuruhusu <b>%1$s</b> kurekodi sauti?" "Shughuli za kimwili" "ifikie shughuli zako za kimwili" "Ungependa kuruhusu <b>%1$s</b> ifikie shughuli zako za kimwili?" @@ -545,15 +545,19 @@ "Jaribu tena." "Hakuna alama za vidole zilizojumuishwa." "Kifaa hiki hakina kitambua alama ya kidole." - "Kitambulisho %d" + "Kidole cha %d" "Aikoni ya kitambulisho" - "dhibiti maunzi ya kuthibitisha uso" + + "Huruhusu programu iombe njia za kuongeza na kufuta violezo vya uso vitakavyotumiwa." - "tumia maunzi ya kuthibistiha uso" - "Huruhusu programu ithibitishe uso kwa kutumia maunzi ya kuthibitisha" - "Utambuzi wa Uso" + + + + + + "Sajili uso wako tena" "Ili kuimarisha utambuzi, tafadhali sajili uso wako tena" "Imeshindwa kunasa data sahihi ya uso. Jaribu tena." @@ -565,7 +569,7 @@ "Sogeza simu chini." "Sogeza simu upande wa kushoto." "Sogeza simu upande wa kulia." - "Angalia skrini ukiwa umefungua macho yako." + "Tafadhali angalia kifaa chako moja kwa moja." "Imeshindwa kuona uso wako. Angalia simu." "Inatikisika sana. Ishike simu iwe thabiti." "Tafadhali sajili uso wako tena." @@ -579,15 +583,20 @@ "Imeshindwa kuthibitisha uso. Maunzi hayapatikani." - "Muda wa kutambua uso umekwisha. Jaribu tena." + + "Imeshindwa kuhifadhi data ya uso mpya. Futa wa kale kwanza." - "Utendaji wa kitambulisho umeghairiwa" - "Mtumiaji ameghairi uthibitishaji wa uso" + "Utendaji wa kitambulisho umeghairiwa." + + "Umejaribu mara nyingi mno. Jaribu tena baadaye." - "Umejaribu mara nyingi mno. Uthibitishaji wa uso umezimwa." + + "Imeshindwa kuthibitisha uso. Jaribu tena." - "Hujaweka mipangilio ya uthibitishaji wa uso" - "Uthibitishaji wa uso hautumiki kwenye kifaa hiki" + + + + "Uso wa %d" @@ -648,6 +657,8 @@ "Huruhusu mmiliki kubandika kwenye huduma ya mtoa huduma. Haipaswi kuhitajika kwa programu za kawaida." "fikia kipengee cha Usinisumbue" "Inaruhusu programu kusoma na kuandika usanidi wa kipengee cha Usinisumbue." + "anzisha kipengele cha kuona matumizi ya ruhusa" + "Huruhusu kishikiliaji kuanzisha matumizi ya ruhusa ya programu. Haipaswi kuhitajika kwa ajili ya programu za kawaida." "Kuweka kanuni za nenosiri" "Dhibiti urefu na maandishi yanayokubalika katika nenosiri la kufunga skrini na PIN." "Kuhesabu mara ambazo skrini inajaribu kufunguliwa" @@ -1070,7 +1081,7 @@ "%1$d:%2$02d:%3$02d" "Chagua zote" "Kata" - "Nakala" + "Nakili" "Imeshindwa kunakili kwenye ubao wa kunakili" "Bandika" "Bandika kama maandishi dhahiri" @@ -1355,7 +1366,8 @@ "Rejesha mipangilio iliyotoka nayo kiwandani ili uzime hali ya Muunganisho wa Majaribio." "Unyevu au uchafu katika mlango wa USB" "Mlango wa USB umezimwa kiotomatiki. Gusa ili upate maelezo zaidi." - "Ni salama kutumia mlango wa USB" + + "Simu haitambui tena unyevu au uchafu." "Inatayarisha ripoti ya hitilafu…" "Ungependa kushiriki ripoti ya hitilafu?" @@ -1664,8 +1676,8 @@ "Njia ya mkato ya zana za walio na matatizo ya kuona au kusikia imewasha %1$s" "Njia ya mkato ya zana za walio na matatizo ya kuona au kusikia imezima %1$s" "Bonyeza na ushikilie vitufe vyote viwili vya sauti kwa sekunde tatu ili utumie %1$s" - "Chagua kipengele utakachotumia, ukigonga Kitufe cha zana za walio na matatizo ya kuona au kusikia." - "Ili kubadilisha vipengele, gusa na ushikile Kitufe cha zana za walio na matatizo ya kuona au kusikia." + "Chagua kipengele utakachotumia, ukigusa kitufe cha Ufikivu:" + "Ili kubadilisha vipengele, gusa na ushikilie kitufe cha Ufikivu." "Ukuzaji" "Mtumiaji wa sasa %1$s." "Inabadili kwenda %1$s…" @@ -1898,9 +1910,7 @@ "Angalia masasisho" "Una ujumbe mpya" "Fungua programu ya SMS ili uweze kuangalia" - "Huenda baadhi ya vipengele havifanyi kazi" - "Gusa ili ufungue" - "Data ya mtumiaji imefungwa" + "Huenda ikadhibiti baadhi ya vipengele" "Wasifu wa kazini umefungwa" "Gusa ili ufungue wasifu wa kazini" "Imeunganishwa na %1$s" diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 9d9f28066541..3215fec520e3 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -261,7 +261,7 @@ "நெட்வொர்க் விழிப்பூட்டல்கள்" "நெட்வொர்க் உள்ளது" "VPN நிலை" - "சாதன நிர்வாகம்" + "IT நிர்வாகியிடம் இருந்து வரும் விழிப்பூட்டல்கள்" "விழிப்பூட்டல்கள்" "விற்பனையாளர் டெமோ" "USB இணைப்பு" @@ -549,11 +549,15 @@ "கைரேகை ஐகான்" - "முக அங்கீகாரத்திற்கான வன்பொருளை நிர்வகித்தல்" + + "உபயோகிப்பதற்காக முக டெம்ப்ளேட்டுகளை சேர்க்கும்/நீக்கும் முறைகளை இயக்க, ஆப்ஸை அனுமதிக்கும்." - "முக அங்கீகாரத்திற்கான வன்பொருளைப் பயன்படுத்துதல்" - "அடையாளம் காண்பதற்கு, முக அங்கீகார வன்பொருளைப் பயன்படுத்த ஆப்ஸை அனுமதிக்கிறது" - "முக அங்கீகாரம்" + + + + + + "முகத்தை மீண்டும் பதிவுசெய்யவும்" "அடையாளத்தை மேம்படுத்த முகத்தை மீண்டும் பதிவுசெய்யவும்" "முகம் தெளிவாகப் பதிவாகவில்லை. மீண்டும் முயலவும்." @@ -565,34 +569,34 @@ "மொபைலைக் கீழே நகர்த்தவும்." "மொபைலை இடப்புறம் நகர்த்தவும்." "மொபைலை வலப்புறம் நகர்த்தவும்." - "திறந்த கண்களோடு திரையைப் பார்க்கவும்." + "முழுமுகம் தெரியுமாறு நேராகப் பார்க்கவும்." "முகம் சரியாகத் தெரியவில்லை. மொபைலைப் பார்க்கவும்." "அதிகமாக அசைகிறது. மொபைலை அசைக்காமல் பிடிக்கவும்." "உங்கள் முகத்தை மீண்டும் பதிவுசெய்யுங்கள்." "முகத்தைக் கண்டறிய இயலவில்லை. மீண்டும் முயலவும்." "மீண்டும் அதே போஸ் தருகிறீர்கள், வேறு முயலுங்கள்." - - - - - - - - - - + "தலையை லேசாகத் திருப்பவும்." + "தலையை லேசாகத் திருப்பவும்." + "உங்கள் தலையைச் சற்றுத் திருப்பவும்." + "உங்கள் முகத்தை மறைக்கும் அனைத்தையும் நீக்குக." + "திரையின் மேல்முனையிலுள்ள சென்சாரைச் சுத்தம் செய்க." "முகத்தைச் சரிபார்க்க இயலவில்லை. வன்பொருள் இல்லை." - "முகப் பதிவிற்கான நேரம் முடிந்தது. மீண்டும் முயல்க." + + "புதிய முகங்களைச் சேர்க்க இயலவில்லை. பழையது ஒன்றை நீக்கவும்." - "முக அங்கீகாரச் செயல்பாடு ரத்துசெய்யப்பட்டது" - "முக அங்கீகாரம் பயனரால் ரத்துசெய்யப்பட்டது" + "முக அங்கீகாரச் செயல்பாடு ரத்துசெய்யப்பட்டது." + + "பலமுறை முயன்றுவிட்டீர்கள். பிறகு முயலவும்." - "பலமுறை முயன்றுவிட்டீர்கள். முக அங்கீகாரம் முடக்கப்பட்டது." + + "முகத்தைச் சரிபார்க்க இயலவில்லை. மீண்டும் முயலவும்." - "முக அங்கீகாரத்தை இன்னும் நீங்கள் அமைக்கவில்லை" - "இந்தச் சாதனத்தில் முக அங்கீகாரம் ஆதரிக்கப்படவில்லை" + + + + "முகம் %d" @@ -622,7 +626,7 @@ "அழைப்பின் பயனர் அனுபவத்தை வழங்குதல்" "அழைப்பின் பயனர் அனுபவத்தை வழங்க ஆப்ஸை அனுமதிக்கிறது." "பிணைய பயன்பாட்டு வரலாற்றைப் படித்தல்" - "குறிப்பிட்ட நெட்வொர்க்குகள் மற்றும் பயன்பாடுகளுக்கான நெட்வொர்க் பயன்பாட்டின் வரலாற்றைப் படிக்க, ஆப்ஸை அனுமதிக்கிறது." + "குறிப்பிட்ட நெட்வொர்க்குகள் மற்றும் பயன்பாடுகளுக்கான நெட்வொர்க் ஆப்ஸின் வரலாற்றைப் படிக்க, ஆப்ஸை அனுமதிக்கிறது." "பிணைய கொள்கையை நிர்வகித்தல்" "நெட்வொர்க் கொள்கைகளை நிர்வகிக்க மற்றும் ஆப்ஸ் சார்ந்த விதிகளை வரையறுக்க, ஆப்ஸை அனுமதிக்கிறது." "பிணைய பயன்பாட்டு கணக்கிடுதலை மாற்றுதல்" @@ -653,6 +657,8 @@ "மொபைல் நிறுவன சேவைகளுடன் இணைக்க, ஹோல்டரை அனுமதிக்கும். சாதாரணப் பயன்பாடுகளுக்கு எப்போதுமே தேவைப்படாது." "தொந்தரவு செய்ய வேண்டாம் அம்சத்தை அணுகுதல்" "தொந்தரவு செய்ய வேண்டாம் உள்ளமைவைப் படிக்கவும் எழுதவும், ஆப்ஸை அனுமதிக்கிறது." + "அனுமதி உபயோகத்தை அணுகுதல்" + "ஆப்ஸிற்கான அனுமதி உபயோகத்தை ஹோல்டருக்கு வழங்கும். இயல்பான ஆப்ஸிற்கு இது எப்போதுமே தேவைப்படாது." "கடவுச்சொல் விதிகளை அமைக்கவும்" "திரைப் பூட்டின் கடவுச்சொற்கள் மற்றும் பின்களில் அனுமதிக்கப்படும் நீளத்தையும் எழுத்துக்குறிகளையும் கட்டுப்படுத்தும்." "திரையைத் திறப்பதற்கான முயற்சிகளைக் கண்காணி" @@ -1183,7 +1189,7 @@ "சிஸ்டம் அமைப்பு > பயன்பாடுகள் > பதிவிறக்கம் என்பதில் இதை மீண்டும் இயக்கவும்." "தற்போதைய திரை அளவு அமைப்பை %1$s ஆதரிக்காததால், அது வழக்கத்திற்கு மாறாகச் செயல்படக்கூடும்." "எப்போதும் காட்டு" - "%1$s பயன்பாடானது, இந்தச் சாதனத்தின் Android OSக்கு இணக்கமற்ற பதிப்பிற்காக உருவாக்கப்பட்டதால், இதில் சரியாகச் செயல்படாது. இந்தப் பயன்பாட்டின் புதுப்பிக்கப்பட்ட பதிப்பானது தற்போது கிடைக்கக்கூடும்." + "%1$s பயன்பாடானது, இந்தச் சாதனத்தின் Android OSக்கு இணக்கமற்ற பதிப்பிற்காக உருவாக்கப்பட்டதால், இதில் சரியாகச் செயல்படாது. இந்த ஆப்ஸின் புதுப்பிக்கப்பட்ட பதிப்பானது தற்போது கிடைக்கக்கூடும்." "எப்போதும் காட்டு" "புதுப்பிப்பு உள்ளதா எனப் பார்" "%1$s ஆப்ஸ் (செயல்முறை %2$s), தனது சுய-செயலாக்க StrictMode கொள்கையை மீறியது." @@ -1361,7 +1367,8 @@ "’தன்னியக்க சோதனைப்\' பயன்முறையை முடக்க ஆரம்பநிலைக்கு மீட்டமைக்கவும்." "USB போர்ட்டில் சேதம் உள்ளது" "USB போர்ட் தானாகவே முடக்கப்பட்டது மேலும் அறிய, தட்டவும்." - "USB போர்ட்டைப் பாதுகாப்பாகப் பயன்படுத்தலாம்" + + "மொபைலில் எந்தச் சேதாரமும் கண்டறியப்படவில்லை." "பிழை அறிக்கையை எடுக்கிறது…" "பிழை அறிக்கையைப் பகிரவா?" @@ -1670,8 +1677,8 @@ "அணுகல்தன்மை ஷார்ட்கட்டானது %1$sஐ இயக்கியது" "அணுகல்தன்மை ஷார்ட்கட்டானது %1$sஐ முடக்கியது" "%1$sஐப் பயன்படுத்த 3 விநாடிகளுக்கு இரண்டு ஒலியளவு பட்டன்களையும் அழுத்திப் பிடிக்கவும்" - "அணுகல்தன்மைப் பொத்தானைத் தட்டி, பயன்படுத்துவதற்கான அம்சத்தைத் தேர்ந்தெடுக்கவும்:" - "அம்சங்களை மாற்ற, அணுகல்தன்மைப் பொத்தானைத் தொட்டுப் பிடித்திருக்கவும்." + "அணுகல்தன்மை பட்டனைத் தட்டி, பயன்படுத்துவதற்கான அம்சத்தைத் தேர்ந்தெடுக்கவும்:" + "அம்சங்களை மாற்ற, அணுகல்தன்மை பட்டனைத் தொட்டுப் பிடித்திருக்கவும்." "பெரிதாக்கல்" "நடப்பு பயனர் %1$s." "%1$sக்கு மாறுகிறது…" @@ -1904,9 +1911,7 @@ "புதுப்பிப்பு உள்ளதா எனப் பார்" "புதிய செய்திகள் வந்துள்ளன" "பார்க்க, SMS பயன்பாட்டைத் திறக்கவும்" - "சில செயல்பாடு வரம்பிடப்பட்டிருக்கலாம்" - "திறக்க, தட்டவும்" - "பயனர் தரவு பூட்டப்பட்டது" + "சில செயலுக்கு கட்டுப்பாடு இருக்கலாம்" "பணிக் கணக்கு பூட்டியுள்ளது" "பணிக் கணக்கை திறக்க, தட்டுக" "%1$s உடன் இணைக்கப்பட்டது" @@ -1983,7 +1988,7 @@ "நிறுவல் நீக்கு" "பரவாயில்லை, திற" "தீங்கிழைக்கும் ஆப்ஸ் உள்ளது" - "%2$s பயன்பாட்டின் விழிப்பூட்டல்களைக் காண்பிக்க, %1$s அனுமதி கேட்கிறது" + "%2$s ஆப்ஸின் விழிப்பூட்டல்களைக் காண்பிக்க, %1$s அனுமதி கேட்கிறது" "திருத்து" "அழைப்புகள் மற்றும் அறிவிப்புகளுக்கு அதிரும்" "அழைப்புகள் மற்றும் அறிவிப்புகளுக்கு ஒலியை முடக்கும்" diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index cc6583f4a5b5..908f10d9c746 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -261,7 +261,7 @@ "నెట్‌వర్క్ హెచ్చరికలు" "నెట్‌వర్క్ అందుబాటులో ఉంది" "VPN స్థితి" - "పరికర నిర్వాహణ" + "మీ IT నిర్వాహకులు నుండి వచ్చే హెచ్చరికలు" "హెచ్చరికలు" "రిటైల్ డెమో" "USB కనెక్షన్" @@ -292,7 +292,7 @@ "SMS సందేశాలు పంపడానికి మరియు వీక్షించడానికి <b>%1$s</b>ని అనుమతించాలా?" "నిల్వ" "మీ పరికరంలోని ఫోటోలు, మీడియా మరియు ఫైల్‌లను యాక్సెస్ చేయడానికి" - "మీ పరికరంలోని ఫోటోలు, మీడియా మరియు ఫైల్‌లను యాక్సెస్ చేయడానికి <b>%1$s</b>ని అనుమతించాలా?" + "మీ పరికరంలోని ఫోటోలు, మీడియా మరియు ఫైల్‌లను యాక్సెస్ చేయడానికి <b>%1$s</b>ను అనుమతించాలా?" "మైక్రోఫోన్" "ఆడియోను రికార్డ్ చేయడానికి" "ఆడియోని రికార్డ్ చేయడానికి <b>%1$s</b>ని అనుమతించాలా?" @@ -549,11 +549,15 @@ "వేలిముద్ర చిహ్నం" - "ముఖ ప్రమాణీకరణ హార్డ్‌వేర్‌ను నిర్వహించండి" + + "వినియోగం కోసం ముఖ టెంప్లేట్‌లను జోడించే మరియు తొలగించే పద్ధతులను అమలు చేయడానికి యాప్‌ను అనుమతిస్తుంది." - "ముఖ ప్రమాణీకరణ హార్డ్‌వేర్‌ను వాడండి" - "ప్రమాణీకరణ కోసం ముఖ ప్రామాణీకరణ హార్డ్‌వేర్‌ను ఉపయోగించడానికి యాప్‌ని అనుమతిస్తుంది" - "ముఖ ప్రామాణీకరణ" + + + + + + "మీ ముఖాన్ని తిరిగి నమోదు చేయండి" "గుర్తింపును మెరుగుపరచడానికి, దయచేసి మీ ముఖంను తిరిగి నమోదు చేసుకోండి" "ముఖం డేటా సరిగ్గా రాలేదు. మళ్లీ ప్రయత్నించండి." @@ -565,7 +569,7 @@ "ఫోన్‌ను కిందికి దించండి." "ఫోన్‌ను ఎడమవైపునకు జరపండి." "ఫోన్‌ను కుడివైపునకు జరపండి." - "మీ కళ్లు తెరిచి ఉంచి, స్క్రీన్ వైపు చూడండి." + "దయచేసి మీ పరికరం వైపు మరింత నేరుగా చూడండి." "మీ ముఖం కనిపించడం లేదు. ఫోన్ వైపు చూడండి." "బాగా కదుపుతున్నారు. ఫోన్‌ను స్థిరంగా పట్టుకోండి" "దయచేసి మీ ముఖాన్ని మళ్లీ నమోదు చేయండి." @@ -573,24 +577,26 @@ "ఒకే మాదిరిగా ఉంది, దయచేసి భంగిమను మార్చండి." "మీ తలను ఇంకాస్త తక్కువ తిప్పండి." "మీ తలను ఇంకాస్త తక్కువ తిప్పండి." - - - - - - + "మీ తలను ఎడమ/కుడి వైపుగా ఇంకాస్త తిప్పండి." + "మీ ముఖానికి అడ్డుగా ఉన్నవాటిని తీసివేస్తుంది." + "స్క్రీన్ ఎగువన ఉన్న సెన్సార్‌ను శుభ్రం చేస్తుంది." "ముఖం ధృవీకరించలేరు. హార్డ్‌వేర్ అందుబాటులో లేదు." - "ముఖ గడువు సమయం ముగిసింది. మళ్లీ ప్రయత్నించండి." + + "కొత్త ముఖం డేటాను నిల్వ చేయడం కాదు. మొదట పాతది తొలిగించండి." - "ముఖ కార్యకలాపం రద్దయింది" - "వినియోగదారు ద్వారా ముఖ ప్రామాణీకరణ రద్దు చేయబడింది" + "ముఖ కార్యకలాపం రద్దయింది." + + "చాలా ఎక్కువ ప్రయత్నాలు చేసారు. తర్వాత మళ్లీ ప్రయత్నించండి." - "అనేకసార్లు ప్రయత్నించారు. ముఖ ప్రమాణీకరణ నిలిపివేయబడింది." + + "ముఖం ధృవీకరించలేకపోయింది. మళ్లీ ప్రయత్నించండి." - "మీరు ముఖ ప్రామాణీకరణను సెటప్ చేయలేదు" - "ఈ పరికరంలో ముఖ ప్రమాణీకరణకు మద్దతు లేదు" + + + + "ముఖ %d" @@ -651,6 +657,8 @@ "క్యారియర్ సేవలకు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." "అంతరాయం కలిగించవద్దును యాక్సెస్ చేయడం" "అంతరాయం కలిగించవద్దు ఎంపిక కాన్ఫిగరేషన్ చదవడానికి మరియు వ్రాయడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "వీక్షణ అనుమతి వినియోగాన్ని ప్రారంభించండి" + "యాప్‌నకు అనుమతి వినియోగాన్ని ప్రారంభించడానికి హోల్డర్‌‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ ఇటువంటి అనుమతి అవసరం ఉండదు." "పాస్‌వర్డ్ నియమాలను సెట్ చేయండి" "స్క్రీన్ లాక్ పాస్‌వర్డ్‌లు మరియు PINల్లో అనుమతించబడిన పొడవు మరియు అక్షరాలను నియంత్రిస్తుంది." "స్క్రీన్ అన్‌లాక్ ప్రయత్నాలను పర్యవేక్షించండి" @@ -1138,7 +1146,7 @@ "సవరించు" "షేర్ చేయి" "%1$sతో భాగస్వామ్యం చేయి" - "భాగస్వామ్యం చేయి" + "షేర్ చేయి" "దీన్ని ఉపయోగించి పంపండి" "%1$sని ఉపయోగించి పంపండి" "పంపు" @@ -1359,13 +1367,14 @@ "పరీక్ష నియంత్రణ మోడ్‌ను నిలిపివేయడానికి ఫ్యాక్టరీ రీసెట్‍‌ను అమలు చేయండి." "USB పోర్ట్‌లో ద్రవ లేదా వ్యర్థ పదార్థాలు ఉన్నాయి" "USB పోర్ట్ ఆటోమేటిక్‌గా నిలిపివేయబడింది. మరింత తెలుసుకోవడానికి నొక్కండి." - "ఇప్పుడు సురక్షితంగా USB పోర్ట్‌ని ఉపయోగించుకోవచ్చు" + + "ఫోన్ ఇకపై ద్రవ లేదా వ్యర్థ పదార్థాలను గుర్తించదు." "బగ్ నివేదికను తీస్తోంది…" "బగ్ నివేదికను భాగస్వామ్యం చేయాలా?" "బగ్ నివేదికను భాగస్వామ్యం చేస్తోంది..." "మీ నిర్వాహకులు ఈ పరికరం సమస్యకు పరిష్కారాన్ని కనుగొనడంలో సహాయం కోసం బగ్ నివేదికను అభ్యర్థించారు. అనువర్తనాలు మరియు డేటా భాగస్వామ్యం చేయబడవచ్చు." - "భాగస్వామ్యం చేయి" + "షేర్ చేయి" "తిరస్కరిస్తున్నాను" "ఇన్‌పుట్ పద్ధతిని ఎంచుకోండి" "దీన్ని భౌతిక కీబోర్డ్ సక్రియంగా ఉన్నప్పుడు స్క్రీన్‌పై ఉంచుతుంది" @@ -1803,8 +1812,8 @@ "మీ నిర్వాహకులు నవీకరించారు" "మీ నిర్వాహకులు తొలగించారు" "సరే" - "బ్యాటరీ జీవిత కాలాన్ని మరింత పొడిగించేందుకు, బ్యాటరీ సేవర్ నేపథ్య కార్యకలాపం, కొన్ని దృశ్య ప్రభావాలు, అలాగే అధిక శక్తిని వినియోగించే ఇతర ఫీచర్‌లను ఆఫ్ చేస్తుంది లేదా పరిమితం చేస్తుంది. ""మరింత తెలుసుకోండి" - "బ్యాటరీ జీవిత కాలాన్ని మరింత పొడిగించేందుకు, బ్యాటరీ సేవర్ నేపథ్య కార్యకలాపం, కొన్ని దృశ్య ప్రభావాలు, అలాగే అధిక శక్తిని వినియోగించే ఇతర ఫీచర్‌లను ఆఫ్ చేస్తుంది లేదా పరిమితం చేస్తుంది." + "బ్యాటరీ జీవిత కాలాన్ని మరింత పొడిగించేందుకు, నేపథ్య కార్యకలాపం, కొన్ని దృశ్య ప్రభావాలు, అలాగే అధిక శక్తిని వినియోగించే ఇతర ఫీచర్‌లను బ్యాటరీ సేవర్ ఆఫ్ చేస్తుంది లేదా పరిమితం చేస్తుంది. ""మరింత తెలుసుకోండి" + "బ్యాటరీ జీవిత కాలాన్ని మరింత పొడిగించేందుకు, నేపథ్య కార్యకలాపం, కొన్ని దృశ్య ప్రభావాలు, అలాగే అధిక శక్తిని వినియోగించే ఇతర ఫీచర్‌లను బ్యాటరీ సేవర్ ఆఫ్ చేస్తుంది లేదా పరిమితం చేస్తుంది." "డేటా వినియోగాన్ని తగ్గించడంలో డేటా సేవర్ సహాయకరంగా ఉంటుంది. బ్యాక్‌గ్రౌండ్‌లో కొన్ని యాప్‌లు డేటాను పంపకుండా లేదా స్వీకరించకుండా నిరోధిస్తుంది. మీరు ప్రస్తుతం ఉపయోగిస్తోన్న యాప్‌ డేటాను యాక్సెస్ చేయగలదు. కానీ అలా అరుదుగా చేయవచ్చు. ఉదాహరణకు, మీరు చిత్రాలను నొక్కే వరకు అవి ప్రదర్శించబడవు." "డేటా సేవర్‌ను ఆన్ చేయాలా?" "ఆన్ చేయి" @@ -1902,9 +1911,7 @@ "అప్‌డేట్ కోసం తనిఖీ చేయండి" "మీకు కొత్త సందేశాలు ఉన్నాయి" "వీక్షించడానికి SMS అనువర్తనాన్ని తెరవండి" - "కొంత పనితనం పరిమితం కావచ్చు" - "అన్‌లాక్ చేయడానికి నొక్కండి" - "వినియోగదారు డేటా లాక్ అయ్యింది" + "కొంత ఫంక్షనాలిటీ పరిమితం కావచ్చు" "కార్యాలయ ప్రొఫైల్ లాక్ అయింది" "కార్యాలయ ప్రొఫైల్ అన్‌లాక్ చేయుటకు నొక్కండి" "%1$sకి కనెక్ట్ చేయబడింది" diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 226c5fe575be..fb00ceef249f 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -261,7 +261,7 @@ "การแจ้งเตือนเครือข่าย" "มีเครือข่ายพร้อมใช้งาน" "สถานะ VPN" - "การดูแลระบบอุปกรณ์" + "การแจ้งเตือนจากผู้ดูแลระบบไอทีของคุณ" "การแจ้งเตือน" "การสาธิตสำหรับผู้ค้าปลีก" "การเชื่อมต่อ USB" @@ -549,11 +549,15 @@ "ไอคอนลายนิ้วมือ" - "จัดการฮาร์ดแวร์ตรวจสอบสิทธิ์ด้วยใบหน้า" + + "อนุญาตให้แอปเรียกใช้วิธีเพิ่มและลบเทมเพลตใบหน้าสำหรับการใช้งาน" - "ใช้ฮาร์ดแวร์ตรวจสอบสิทธิ์ด้วยใบหน้า" - "อนุญาตให้แอปใช้ฮาร์ดแวร์ตรวจสอบสิทธิ์ด้วยใบหน้าเพื่อตรวจสอบสิทธิ์" - "การตรวจสอบสิทธิ์ด้วยใบหน้า" + + + + + + "ลงทะเบียนใบหน้าอีกครั้ง" "โปรดลงทะเบียนใบหน้าอีกครั้งเพื่อปรับปรุงการจดจำ" "บันทึกข้อมูลใบหน้าที่ถูกต้องไม่ได้ ลองอีกครั้ง" @@ -565,7 +569,7 @@ "ถือโทรศัพท์ให้ต่ำลง" "เลื่อนโทรศัพท์ไปทางซ้าย" "เลื่อนโทรศัพท์ไปทางขวา" - "มองที่หน้าจอและลืมตา" + "โปรดมองตรงมาที่อุปกรณ์" "ไม่เห็นหน้า มองที่โทรศัพท์" "มีการเคลื่อนไหวมากเกินไป ถือโทรศัพท์นิ่งๆ" "โปรดลงทะเบียนใบหน้าอีกครั้ง" @@ -579,15 +583,20 @@ "ยืนยันใบหน้าไม่ได้ ฮาร์ดแวร์ไม่พร้อมใช้งาน" - "ถึงระยะหมดเวลาตรวจจับใบหน้า ลองอีกครั้ง" + + "จัดเก็บข้อมูลใบหน้าใหม่ไม่ได้ ลบข้อมูลเก่าออกไปก่อน" - "ยกเลิกการดำเนินการด้วยใบหน้าแล้ว" - "ผู้ใช้ยกเลิกการตรวจสอบสิทธิ์ด้วยใบหน้า" + "ยกเลิกการดำเนินการกับใบหน้าแล้ว" + + "ดำเนินการหลายครั้งเกินไป ลองอีกครั้งในภายหลัง" - "ลองหลายครั้งเกินไป การตรวจสอบสิทธิ์ด้วยใบหน้าถูกปิดใช้" + + "ยืนยันใบหน้าไม่ได้ ลองอีกครั้ง" - "คุณยังไม่ได้ตั้งค่าการตรวจสอบสิทธิ์ด้วยใบหน้า" - "อุปกรณ์นี้ไม่รองรับการตรวจสอบสิทธิ์ด้วยใบหน้า" + + + + "ใบหน้า %d" @@ -648,6 +657,8 @@ "อนุญาตให้เจ้าของเชื่อมโยงกับบริการของผู้ให้บริการ ไม่ควรต้องใช้สำหรับแอปทั่วไป" "เข้าถึงโหมดห้ามรบกวน" "อนุญาตให้แอปอ่านและเขียนการกำหนดค่าโหมดห้ามรบกวน" + "เริ่มการใช้สิทธิ์การดู" + "อนุญาตให้เจ้าของเริ่มการใช้สิทธิ์ของแอป ไม่จำเป็นสำหรับแอปทั่วไป" "ตั้งค่ากฎรหัสผ่าน" "ควบคุมความยาวและอักขระที่สามารถใช้ในรหัสผ่านของการล็อกหน้าจอและ PIN" "ตรวจสอบความพยายามในการปลดล็อกหน้าจอ" @@ -1355,7 +1366,8 @@ "รีเซ็ตเป็นค่าเริ่มต้นเพื่อปิดใช้โหมดโปรแกรมทดสอบอัตโนมัติ" "มีของเหลวหรือฝุ่นละอองในพอร์ต USB" "พอร์ต USB ปิดใช้โดยอัตโนมัติ แตะเพื่อดูข้อมูลเพิ่มเติม" - "ใช้พอร์ต USB ได้อย่างปลอดภัย" + + "โทรศัพท์ไม่ได้ตรวจจับของเหลวและฝุ่นละอองแล้ว" "กำลังสร้างรายงานข้อบกพร่อง…" "แชร์รายงานข้อบกพร่องไหม" @@ -1655,8 +1667,8 @@ " — " "ลบ" "นี่เป็นการเพิ่มระดับเสียงเกินระดับที่แนะนำ\n\nการฟังเสียงดังเป็นเวลานานอาจทำให้การได้ยินของคุณบกพร่องได้" - "ใช้ทางลัดการเข้าถึงพิเศษไหม" - "เมื่อทางลัดเปิดอยู่ การกดปุ่มปรับระดับเสียงทั้ง 2 ปุ่มเป็นเวลา 3 วินาทีจะเริ่มฟีเจอร์การเข้าถึงพิเศษ\n\n ฟีเจอร์การเข้าถึงพิเศษปัจจุบัน:\n %1$s\n\n คุณสามารถเปลี่ยนฟีเจอร์ในการตั้งค่า > การเข้าถึงพิเศษ" + "ใช้ทางลัดการช่วยเหลือพิเศษไหม" + "เมื่อทางลัดเปิดอยู่ การกดปุ่มปรับระดับเสียงทั้ง 2 ปุ่มเป็นเวลา 3 วินาทีจะเริ่มฟีเจอร์การช่วยเหลือพิเศษ\n\n ฟีเจอร์การช่วยเหลือพิเศษปัจจุบัน:\n %1$s\n\n คุณสามารถเปลี่ยนฟีเจอร์ในการตั้งค่า > การช่วยเหลือพิเศษ" "ปิดทางลัด" "ใช้ทางลัด" "การกลับสี" @@ -1664,8 +1676,8 @@ "ทางลัดการเข้าถึงเปิด %1$s แล้ว" "ทางลัดการเข้าถึงปิด %1$s แล้ว" "กดปุ่มปรับระดับเสียงทั้ง 2 ปุ่มค้างไว้ 3 วินาทีเพื่อใช้ %1$s" - "เลือกฟีเจอร์ที่จะใช้เมื่อคุณแตะปุ่ม \"การเข้าถึงพิเศษ\":" - "หากต้องการเปลี่ยนฟีเจอร์ ให้แตะปุ่ม \"การเข้าถึงพิเศษ\" ค้างไว้" + "เลือกฟีเจอร์ที่จะใช้เมื่อคุณแตะปุ่ม \"การช่วยเหลือพิเศษ\":" + "หากต้องการเปลี่ยนฟีเจอร์ ให้แตะปุ่ม \"การช่วยเหลือพิเศษ\" ค้างไว้" "การขยาย" "ผู้ใช้ปัจจุบัน %1$s" "กำลังเปลี่ยนเป็น %1$s…" @@ -1898,9 +1910,7 @@ "ตรวจสอบอัปเดต" "คุณมีข้อความใหม่" "เปิดแอป SMS เพื่อดู" - "อาจมีข้อจำกัดในบางฟังก์ชัน" - "แตะเพื่อปลดล็อก" - "ล็อกข้อมูลผู้ใช้อยู่" + "อาจมีข้อจำกัดในบางฟังก์ชัน" "โปรไฟล์งานถูกล็อก" "แตะเพื่อปลดล็อกโปรไฟล์งาน" "เชื่อมต่อ %1$s แล้ว" diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 2b0436cb6b53..73439bb9f864 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -261,7 +261,7 @@ "Mga alerto sa network" "Available ang network" "Status ng VPN" - "Pamamahala ng device" + "Mga alerto mula sa iyong IT admin" "Mga Alerto" "Retail demo" "Koneksyon ng USB" @@ -525,11 +525,11 @@ "Hindi nakilala" "Nakansela ang pag-authenticate" "Walang itinakdang pin, pattern, o password" - "Hindi buo ang natukoy na fingerprint. Pakisubukang muli." - "Hindi maproseso ang fingerprint. Pakisubukang muli." + "Hindi buo ang natukoy na fingerprint. Pakisubukan ulit." + "Hindi maproseso ang fingerprint. Pakisubukan ulit." "Marumi ang sensor ng fingerprint. Pakilinis at subukang muli." "Napakabilis ng paggalaw ng daliri. Pakisubukan ulit." - "Masyadong mabagal ang paggalaw ng daliri. Pakisubukang muli." + "Masyadong mabagal ang paggalaw ng daliri. Pakisubukan ulit." "Na-authenticate ang fingerprint" @@ -549,11 +549,15 @@ "Icon ng fingerprint" - "pamahalaan ang hardware sa authentication ng mukha" + + "Pumapayag na mag-invoke ang app ng paraang magdagdag at mag-delete ng template ng mukha." - "gumamit ng hardware sa pag-authenticate ng mukha" - "Pumapayag na gumamit ng face authentication hardware ang app para sa pag-authenticate" - "Pag-authenticate ng Mukha" + + + + + + "I-enroll ulit ang iyong mukha" "Para mapahusay ang pagkilala, paki-enroll ulit ang iyong mukha" "Hindi makakuha ng tamang face data. Subukang muli." @@ -565,7 +569,7 @@ "Ibaba pa ang telepono." "Igalaw ang telepono pakaliwa." "Igalaw ang telepono pakanan." - "Tingnan ang screen nang nakadilat." + "Tumingin nang mas direkta sa iyong device." "Hindi makita ang mukha mo. Tumingin sa telepono." "Masyadong magalaw. Hawakang mabuti ang telepono." "Paki-enroll muli ang iyong mukha." @@ -579,15 +583,20 @@ "Di ma-verify ang mukha. Di available ang hardware." - "Nag-time out ang mukha. Subukang muli." + + "Hindi ma-store ang data ng mukha. Mag-delete muna ng iba." - "Nakansela ang operation kaugnay ng mukha" - "Kinansela ng user ang pag-authenticate ng mukha" + "Nakansela ang operation kaugnay ng mukha." + + "Masyadong maraming pagsubok. Subukang muli mamaya." - "Sumobra ang pagsubok. Na-disable ang face authentication." + + "Hindi ma-verify ang mukha. Subukang muli." - "Hindi pa na-set up ang pag-authenticate ng mukha" - "Hindi sinusuportahan ang pag-authenticate ng mukha sa device" + + + + "Mukha %d" @@ -648,6 +657,8 @@ "Pinapayagan ang may-ari na mag-bind sa mga serbisyo ng carrier. Hindi dapat kailanganin sa mga normal na app." "i-access ang Huwag Istorbohin" "Nagbibigay-daan sa app na basahin at isulat ang configuration ng Huwag Istorbohin." + "simulan ang paggamit sa pahintulot sa pagtingin" + "Binibigyang-daan ang may hawak na simulan ang paggamit ng pahintulot para sa isang app. Hindi dapat kailanganin kailanman para sa mga normal na app." "Magtakda ng mga panuntunan sa password" "Kontrolin ang haba at ang mga character na pinapayagan sa mga password at PIN sa screen lock." "Subaybayan ang mga pagsubok sa pag-unlock ng screen" @@ -1355,7 +1366,8 @@ "Mag-factory reset para i-disable ang Test Harness Mode." "Liquid o debris sa USB port" "Awtomatikong na-disable ang USB port. Mag-tap para matuto pa." - "Ligtas na gamitin ang USB port" + + "Hindi na nakaka-detect ang telepono ng liquid o debris." "Kinukuha ang ulat ng bug…" "Gusto mo bang ibahagi ang ulat ng bug?" @@ -1664,7 +1676,7 @@ "Na-on ng Shortcut sa Accessibility ang %1$s" "Na-off ng Shortcut sa Accessibility ang %1$s" "Pindutin nang matagal ang parehong volume key sa loob ng tatlong segundo para magamit ang %1$s" - "Pumili ng feature na gagamitin kapag na-tap mo ang button ng Pagiging Naa-access:" + "Pumili ng feature na gagamitin kapag na-tap mo ang button ng Pagiging Accessible:" "Upang baguhin ang mga feature, pindutin nang matagal ang button ng Pagiging Naa-access." "Pag-magnify" "Kasalukuyang user %1$s." @@ -1898,9 +1910,7 @@ "Tingnan kung may update" "Mayroon kang mga bagong mensahe" "Buksan ang SMS app upang tingnan" - "Limitado ilang functionality" - "Mag-tap upang ma-unlock" - "Naka-lock ang data ng user" + "Puwedeng limitado ang ilang function" "Profile sa trabaho, naka-lock" "I-unlock ang profile sa trabaho, i-tap" "Nakakonekta sa %1$s" diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 847680ed6c09..e1fa7da5f18d 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -261,7 +261,7 @@ "Ağ uyarıları" "Ağ mevcut" "VPN durumu" - "Cihaz yönetimi" + "IT yöneticinizden uyarılar" "Uyarılar" "Mağaza demo" "USB bağlantısı" @@ -549,11 +549,15 @@ "Parmak izi simgesi" - "yüz kimlik doğrulaması donanımını yönetme" + + "Uygulamanın, kullanılacak yüz şablonlarını ekleme ve silme yöntemlerini başlatmasına izin verir." - "yüz kimlik doğrulaması donanımını kullanma" - "Uygulamanın yüz kimlik doğrulaması donanımı kullanmasına izin verir" - "Yüzle Kimlik Doğrulama" + + + + + + "Yüzünüzü yeniden kaydedin" "Daha iyi tanınmasını sağlamak için lütfen yüzünüzü yeniden kaydedin" "Doğru yüz verileri yakalanamadı. Tekrar deneyin." @@ -565,7 +569,7 @@ "Telefonu aşağı indirin." "Telefonu sola hareket ettirin." "Telefonu sağa hareket ettirin." - "Gözleriniz açık olarak ekrana bakın." + "Lütfen cihazınıza daha doğrudan bakın." "Yüzünüz görülmüyor. Telefona bakın." "Çok fazla hareket ediyorsunuz. Telefonu sabit tutun." "Lütfen yüzünüzü yeniden kaydedin." @@ -579,15 +583,20 @@ "Yüz doğrulanamıyor. Donanım kullanılamıyor." - "Yüz için zaman aşımı oluştu. Tekrar deneyin." + + "Yeni yüz verisi depolanamıyor. Önce eski bir tanesini silin." - "Yüz işlemi iptal edildi" - "Yüz kimlik doğrulama işlemini kullanıcı iptal etti" + "Yüz işlemi iptal edildi." + + "Çok fazla deneme yapıldı. Daha sonra tekrar deneyin." - "Çok fazla deneme yapıldı. Yüz kimlik doğrulaması devre dışı." + + "Yüz doğrulanamıyor. Tekrar deneyin." - "Yüz kimlik doğrulaması ayarlamadınız" - "Bu cihazda yüz kimlik doğrulaması desteklenmiyor" + + + + "Yüz %d" @@ -648,6 +657,8 @@ "İzin sahibinin, operatör hizmetlerine bağlanmasına olanak tanır. Normal uygulamalarda hiçbir zaman gerekmez." "Rahatsız Etmeyin özelliğine erişme" "Uygulamaya, Rahatsız Etmeyin yapılandırmasını okuma ve yazma izni verir." + "izin kullanımı görüntülemeye başlama" + "İzin sahibinin bir uygulama için izin kullanımı başlatmasına olanak tanır. Normal uygulamalar için hiçbir zaman kullanılmamalıdır." "Şifre kuralları ayarla" "Ekran kilidini açma şifrelerinde ve PIN\'lerde izin verilen uzunluğu ve karakterleri denetleyin." "Ekran kilidini açma denemelerini izle" @@ -1355,7 +1366,8 @@ "Test Bandı Modu\'nu devre dışı bırakmak için cihazı fabrika ayarlarına sıfırlayın." "USB bağlantı noktasında sıvı veya toz var" "USB bağlantı noktası otomatik olarak devre dışı bırakıldı. Daha fazla bilgi için dokunun." - "USB bağlantı noktası güvenli bir şekilde kullanılabilir" + + "Telefon artık sıvıları veya tozları algılamıyor." "Hata raporu alınıyor…" "Hata raporu paylaşılsın mı?" @@ -1898,9 +1910,7 @@ "Güncellemeleri denetle" "Yeni mesajlarınız var" "Görüntülemek için SMS uygulamasını açın" - "Bazı işlevler sınırlı olabilir" - "Kilidi açmak için dokunun" - "Kullanıcı verileri kilitlendi" + "Bazı işlevler sınırlı olabilir" "İş profili kilitlendi" "İş profilinin kilidini açmak için dokunun" "%1$s cihazına bağlandı" diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index d3eaff64e8e2..26de58325d8f 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -267,7 +267,7 @@ "Сповіщення мережі" "Мережа доступна" "Статус мережі VPN" - "Адміністрування пристрою" + "Сповіщення від ІТ-адміністратора" "Сповіщення" "Демо-режим для роздрібної торгівлі" "З’єднання USB" @@ -555,11 +555,15 @@ "Значок відбитка пальця" - "керувати обладнанням для автентифікації облич" + + "Додаток може активувати способи додавання й видалення шаблонів облич." - "застосовувати обладнання для автентифікації облич" - "Додаток може застосовувати обладнання для автентифікації облич" - "Автентифікація за обличчям" + + + + + + "Повторно проскануйте обличчя" "Повторно проскануйте обличчя для ефективнішого розпізнавання" "Не вдалося чітко зняти обличчя. Повторіть спробу." @@ -571,7 +575,7 @@ "Тримайте телефон нижче." "Тримайте телефон лівіше." "Тримайте телефон правіше." - "Дивіться на екран і не заплющуйте очі." + "Дивіться просто на пристрій." "Обличчя не видно. Дивіться на телефон." "Забагато рухів. Тримайте телефон нерухомо." "Повторно проскануйте обличчя." @@ -585,15 +589,20 @@ "Не вдається перевірити обличчя. Апаратне забезпечення недоступне." - "Час очікування обличчя минув. Повторіть спробу." + + "Не вдається зберегти нові дані про обличчя. Видаліть старі." - "Дію з обличчям скасовано" - "Користувач скасував автентифікацію за обличчям" + "Дію з обличчям скасовано." + + "Забагато спроб. Повторіть пізніше." - "Забагато спроб. Автентифікацію за обличчям вимкнено." + + "Не вдається перевірити обличчя. Повторіть спробу." - "Ви не налаштували автентифікацію за обличчям" - "На цьому пристрої автентифікація за обличчям не підтримується" + + + + "Обличчя %d" @@ -654,6 +663,8 @@ "Власник може підключатися до служб оператора. Звичайні додатки ніколи не використовують цей дозвіл." "доступ до режиму \"Не турбувати\"" "Додаток зможе переглядати та змінювати конфігурацію режиму \"Не турбувати\"." + "перегляньте дані про використання дозволів" + "Власник зможе використовувати дозволи для цього додатка. Цей дозвіл не потрібен для звичайних додатків." "Устан. правила пароля" "Укажіть максимальну довжину та кількість символів для паролів розблокування екрана та PIN-кодів." "Відстежувати спроби розблокування екрана" @@ -689,8 +700,8 @@ "Дом." "Мобільний" "Роб." - "Роб. факс" - "Дом. факс" + "Робочий факс" + "Домашній факс" "Пейджер" "Інше" "Указати" @@ -732,8 +743,8 @@ "Домашній" "Мобільний" "Робочий" - "Роб. факс" - "Дом. факс" + "Робочий факс" + "Домашній факс" "Пейджер" "Інше" "Звор. викл." @@ -757,7 +768,7 @@ "Особиста" "Робоча" "Інше" - "Мобільний" + "Мобільна" "Указати" "Домашня" "Роб." @@ -1399,7 +1410,8 @@ "Щоб вимкнути режим автоматизованого тестування, відновіть заводські налаштування." "Рідина або сміття в USB-порту" "USB-порт автоматично вимкнено. Торкніться, щоб дізнатися більше." - "Можна безпечно використовувати USB-порт" + + "Телефон уже не виявляє рідини або сміття." "Створюється повідомлення про помилку…" "Надіслати звіт про помилку?" @@ -1966,9 +1978,7 @@ "Шукати оновлення" "У вас є нові повідомлення" "Щоб переглянути, відкрийте додаток для SMS" - "Деякі функції можуть не працювати" - "Торкніться, щоб розблокувати" - "Дані користувача заблоковано" + "Деякі функції може бути обмежено" "Робочий профіль заблоковано" "Торкніться, щоб розблокувати" "Під’єднано до пристрою %1$s" diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index ebf715afd758..78d4a5806124 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -261,7 +261,7 @@ "نیٹ ورک الرٹس" "نیٹ ورک دستیاب ہے" "‏VPN اسٹیٹس" - "آلہ کا نظم و نسق" + "‏آپ کے IT منتظم کی جانب سے الرٹس" "الرٹس" "ریٹیل ڈیمو" "‏USB کنکشن" @@ -549,11 +549,15 @@ "فنگر پرنٹ آئیکن" - "چہرے کی توثیق کے ہارڈویئر کا نظم کریں" + + "ایپ کو چہرے کی تمثیلات شامل اور حذف کرنے کے طریقوں کو کالعدم قرار دینے کی اجازت دیتا ہے۔" - "چہرے کی توثیق کا ہارڈویئر استعمال کریں" - "ایپ کو توثیق کیلئے چہرے کا ہارڈ ویئر استعمال کرنے کی اجازت دیتا ہے" - "چہرے سے تصدیق" + + + + + + "اپنے چہرے کو دوبارہ مندرج کریں" "شناخت کو بہتر بنانے کے لیے براہ کرم اپنے چہرے کو دوبارہ مندرج کریں" "چہرے کا درست ڈيٹا کیپچر نہیں ہو سکا۔ پھر آزمائيں۔" @@ -565,7 +569,7 @@ "فون تھوڑا نیچے کریں۔" "فون کو بائیں جانب لے جائيں۔" "فون کو دائیں جانب لے جائیں۔" - "اسکرین کو بغور دیکھیں۔" + "براہ کرم اپنے آلہ کی طرف چہرے کو سیدھا رکھیں۔" "آپ کا چہرہ دکھائی نہیں دے رہا۔ فون کی طرف دیکھیں۔" "کافی حرکت ہو رہی ہے۔ فون کو مضبوطی سے پکڑیں۔" "براہ کرم اپنے چہرے کو دوبارہ مندرج کریں۔" @@ -573,24 +577,26 @@ "کافی ملتا جلتا ہے، براہ کرم اپنا پوز بدلیں۔" "اپنا سر تھوڑا کم کریں۔" "اپنا سر تھوڑا کم کریں۔" - - - - - - + "اپنا سر تھوڑا کم کریں۔" + "آپ کے چہرہ کو چھپانے والی ہر چیز کو ہٹائیں۔" + "اسکرین کے بالائی کنارے پر سنسر کو صاف کریں۔" "چہرے کی توثیق نہیں کی جا سکی۔ ہارڈ ویئر دستیاب نہیں ہے۔" - "چہرہ پہچاننے کی میعاد ختم ہو گئی۔ پھر کوشش کریں۔" + + "چہرے کا نیا ڈیٹا اسٹور نہیں کر سکتے۔ پہلے پرانا حذف کریں۔" - "چہرے پر آپریشن منسوخ ہو گئی" - "صارف نے چہرے کی تصدیق کو منسوخ کر دیا" + "چہرے پر ہونے والی کارروائی منسوخ ہو گئی۔" + + "کافی زیادہ کوششیں کی گئیں۔ دوبارہ کوشش کریں۔" - "کافی زیادہ کوششیں۔ چہرے سے تصدیق غیر فعال کر دی گئی ہے۔" + + "چہرے کی توثیق نہیں کی جا سکی۔ پھر آزمائيں۔" - "آپ نے چہرے سے تصدیق سیٹ اپ نہیں کیا ہے" - "اس آلہ پر چہرے سے تصدیق تعاون یافتہ نہیں ہے" + + + + "چہرہ %d" @@ -651,6 +657,8 @@ "حامل کو کیریئر سروسز کا پابند کرنے کی اجازت دیتا ہے۔ معمول کی ایپس کیلئے کبھی درکار نہیں ہونا چاہیے۔" "ڈسٹرب نہ کریں تک رسائی حاصل کریں" "ایپ کو ڈسٹرب نہ کریں کنفیگریشن لکھنے اور پڑھنے کے قابل کرتا ہے۔" + "اجازت کی استعمال کا ملاحظہ شروع کریں" + "حامل کو ایپ کی اجازت کے استعمال کو شروع کرنے کی اجازت دیتا ہے۔ عام ایپس کے لیے کبھی بھی درکار نہیں ہونا چاہیے۔" "پاس ورڈ کے اصول سیٹ کریں" "‏اسکرین لاک پاس ورڈز اور PINs میں اجازت یافتہ لمبائی اور حروف کو کنٹرول کریں۔" "اسکرین غیر مقفل کرنے کی کوششیں مانیٹر کریں" @@ -1359,7 +1367,8 @@ "ٹیسٹ ہارنیس موڈ غیر فعال کرنے کے لیے فیکٹری ری سیٹ کریں۔" "‏USB پورٹ میں سیال یا دھول ہے" "‏USB پورٹ خودکار طور پر غیر فعال کر دیا گیا۔ مزید جاننے کیلئے تھپتھپائیں۔" - "‏USB پورٹ کا استعمال محفوظ ہے" + + "فون مزید سیال یا دھول کا پتہ نہیں لگاتا۔" "بگ رپورٹ لی جا رہی ہے…" "بگ رپورٹ کا اشتراک کریں؟" @@ -1663,7 +1672,7 @@ "شارٹ کٹ آن ہونے پر، 3 سیکنڈ تک دونوں والیوم بٹنز کو دبانے سے ایک ایکسیسبیلٹی خصوصیت شروع ہو جائے گی۔\n\n موجودہ ایکسیسبیلٹی خصوصیت:\n %1$s\n\n آپ خصوصیت کو ترتیبات > ایکسیسبیلٹی میں جا کر تبدیل کر سکتے ہیں۔" "شارٹ کٹ آف کریں" "شارٹ کٹ استعمال کریں" - "رنگ میں تبدیلی" + "رنگوں کی تقلیب" "رنگ کی تصحیح" "ایکسیسبیلٹی شارٹ کٹ نے %1$s کو آن کر دیا" "ایکسیسبیلٹی شارٹ کٹ نے %1$s کو آف کر دیا" @@ -1902,9 +1911,7 @@ "اپ ڈیٹ چیک کریں" "آپ کے پاس نئے پیغامات ہیں" "‏دیکھنے کیلئے SMS ایپ کھولیں" - "کچھ فعالیت محدود ہو سکتی ہے" - "غیرمقفل کرنے کیلئے تھپتھپائیں" - "صارف کا ڈیٹا مقفل ہے" + "کچھ فعالیت محدود ہو سکتی ہے" "دفتری پروفائل مقفل ہے" "دفتری پروفائل غیر مقفل کرنے کیلئے تھپتھپائیں" "%1$s سے منسلک" diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 4105b2aa41eb..a192c762377a 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -261,7 +261,7 @@ "Tarmoqqa oid bildirgilar" "Tarmoq mavjud" "VPN holati" - "Qurilma boshqaruvi" + "IT administrator xabarlari" "Ogohlantirishlar" "Demo rejim" "USB orqali ulanish" @@ -549,11 +549,15 @@ "Barmoq izi belgisi" - "yuzni aniqlash qurilmasini boshqarish" + + "Ilova foydalanish uchun yuz namunalarini qo‘shish va o‘chirish usullarini tatbiq qilishi mumkin." - "yuzni aniqlash qurilmasidan foydalanish" - "Haqiqiylikni tekshirish uchun skanerdan foydalanish imkonini beradi" - "Yuz tekshiruvi" + + + + + + "Yuzingizni yana qayd qiling" "Yuzingiz yanada yaxshiroq aniqlanishi uchun uni yana bir marta qayd qiling" "Yuz ravshan suratga olinmadi. Qaytadan urining." @@ -565,7 +569,7 @@ "Telefonni pastroq tushiring." "Telefonni chapga suring." "Telefonni oʻngga suring." - "Ekranga koʻzlaringizni ochib qarang." + "Qurilmaga tik qarang." "Yuzingiz koʻrinmayapti. Telefonga qarang." "Ortiqcha harakatlanmoqda. Qimirlatmasdan ushlang." "Yuzingizni qaytadan qayd qildiring." @@ -574,20 +578,25 @@ "Boshingizni asta buring." "Boshingizni asta buring." "Boshingizni asta buring." - "Yuzingizni berkitayotgan narsalarni olib tahlang." + "Yuzingizni berkitayotgan narsalarni olib tashlang." "Ekranning tepasidagi sensorni tozalang." "Yuzingiz tasdiqlanmadi. Qurilma ishlamayapti." - "Yuzni aniqlash vaqti tugadi. Qaytadan urining." + + "Yuzga oid axborot saqlanmadi. Avval eskilari tozalansin." - "Yuzni aniqlash bekor qilindi" - "Yuz tekshiruvi bekor qilindi." + "Yuzni aniqlash bekor qilindi." + + "Juda ko‘p urinildi. Keyinroq qaytadan urining." - "Juda koʻp urinildi. Yuz tekshiruvi faolsizlantirildi." + + "Yuzingiz tasdiqlanmadi. Qaytadan urining." - "Hali yuz tekshiruvini sozlamagansiz" - "Yuz tekshiruvi bu qurilmada ishlamaydi" + + + + "Yuz %d" @@ -648,6 +657,8 @@ "Aloqa operatori xizmatlariga ulanish imkonini beradi. Oddiy ilovalar uchun talab qilinmaydi." "“Bezovta qilinmasin” rejimidan foydalanish" "“Bezovta qilinmasin” rejimi sozlamalarini ko‘rish va o‘zgartirish." + "foydalaniladigan ruxsatlar axborotini ochish" + "Ilova foydalanadigan ruxsatlar axborotini ishga tushirishga ruxsat beradi. Oddiy ilovalar uchun talab qilinmaydi." "Parol qoidalarini o‘rnatish" "Ekran qulfi paroli va PIN kodlari uchun qo‘yiladigan talablarni (belgilar soni va uzunligi) nazorat qiladi." "Ekranni qulfdan chiqarishga urinishlarni nazorat qilish" @@ -1356,7 +1367,8 @@ "Xavfsizlik sinovi rejimini faolsizlantirish uchun zavod sozlamalariga qaytaring." "USB portda suyuqlik yoki parcha bor" "USB port avtomatik tarzda faolsizlashtirildi. Batafsil axborot olish uchun bosing." - "USB portdan foydalanish xavfsiz" + + "Telefon endi suyuqlik yoki turli parchalarni aniqlay olmaydi." "Xatoliklar hisoboti olinmoqda…" "Xatoliklar hisoboti yuborilsinmi?" @@ -1899,9 +1911,7 @@ "Yangilanish borligini tekshirish" "Sizga yangi SMS keldi" "Ko‘rish uchun SMS ilovasini oching" - "Ba’zi funksiyalar cheklanishi m-n" - "Qulfni ochish uchun bosing" - "Foydalanuvchi ma’lumotlari yopiq" + "Ayrim funksiyalar cheklanishi mumkin" "Ishchi profil yopiq" "Qulfini ochish uchun bosing" "%1$s qurilmasiga ulandi" diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 4aa0722f01e9..b4e1559d5446 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -261,7 +261,7 @@ "Cảnh báo mạng" "Có mạng" "Trạng thái VPN" - "Quản lý thiết bị" + "Thông báo từ quản trị viên CNTT của bạn" "Cảnh báo" "Giới thiệu bán lẻ" "Kết nối USB" @@ -549,11 +549,15 @@ "Biểu tượng vân tay" - "quản lý phần cứng xác thực khuôn mặt" + + "Cho phép ứng dụng gọi ra các phương pháp để thêm và xóa mẫu khuôn mặt sử dụng." - "sử dụng phần cứng xác thực khuôn mặt" - "Cho phép ứng dụng sử dụng phần cứng xác thực khuôn mặt để tiến hành xác thực" - "Xác thực khuôn mặt" + + + + + + "Đăng ký lại khuôn mặt của bạn" "Để cải thiện khả năng nhận dạng, hãy đăng ký lại khuôn mặt của bạn" "Không thể ghi lại đúng dữ liệu mặt. Hãy thử lại." @@ -565,7 +569,7 @@ "Hạ thấp điện thoại xuống." "Đưa điện thoại sang bên trái." "Đưa điện thoại sang bên phải." - "Mở mắt và nhìn vào màn hình." + "Vui lòng nhìn thẳng vào thiết bị." "Không thấy khuôn mặt bạn. Hãy nhìn vào điện thoại." "Thiết bị di chuyển quá nhiều. Giữ yên thiết bị." "Vui lòng đăng ký lại khuôn mặt của bạn." @@ -579,15 +583,20 @@ "Không thể xác minh khuôn mặt. Phần cứng không có sẵn." - "Phần cứng nhận dạng khuôn mặt đã hết thời gian chờ. Hãy thử lại." + + "Không lưu được dữ liệu khuôn mặt mới. Hãy xóa dữ liệu cũ trước." - "Đã hủy thao tác dùng khuôn mặt" - "Người dùng đã hủy thao tác xác thực khuôn mặt" + "Đã hủy thao tác dùng khuôn mặt." + + "Bạn đã thử quá nhiều lần. Hãy thử lại sau." - "Quá nhiều lần thử. Tính năng xác thực khuôn mặt đã tắt." + + "Không thể xác minh khuôn mặt. Hãy thử lại." - "Bạn chưa thiết lập tính năng xác thực khuôn mặt" - "Thiết bị này không hỗ trợ tính năng xác thực khuôn mặt" + + + + "Khuôn mặt %d" @@ -648,6 +657,8 @@ "Cho phép chủ sở hữu liên kết với các dịch vụ của nhà cung cấp. Không bao giờ cần cho các ứng dụng thông thường." "truy cập Không làm phiền" "Cho phép ứng dụng đọc và ghi cấu hình Không làm phiền." + "cấp quyền xem" + "Cho phép chủ sở hữu cấp quyền cho một ứng dụng. Các ứng dụng thông thường sẽ không bao giờ cần quyền này." "Đặt quy tắc mật khẩu" "Kiểm soát độ dài và ký tự được phép trong mật khẩu khóa màn hình và mã PIN." "Giám sát những lần thử mở khóa màn hình" @@ -1355,7 +1366,8 @@ "Khôi phục cài đặt gốc để tắt Chế độ khai thác kiểm thử." "Có chất lỏng hoặc mảnh vỡ trong cổng USB" "Cổng USB đã tự động tắt. Nhấn để tìm hiểu thêm." - "Có thể sử dụng cổng USB một cách an toàn" + + "Điện thoại không còn phát hiện chất lỏng hay mảnh vỡ nữa." "Đang thu thập báo cáo lỗi…" "Chia sẻ báo cáo lỗi?" @@ -1664,8 +1676,8 @@ "Đã bật phím tắt trợ năng %1$s" "Đã tắt phím tắt trợ năng %1$s" "Nhấn và giữ đồng thời cả hai phím âm lượng trong 3 giây để sử dụng %1$s" - "Chọn tính năng sẽ sử dụng khi bạn nhấn nút Trợ năng:" - "Để thay đổi các tính năng, hãy chạm và giữ nút Trợ năng." + "Chọn tính năng sẽ sử dụng khi bạn nhấn nút Hỗ trợ tiếp cận:" + "Để thay đổi các tính năng, hãy chạm và giữ nút Hỗ trợ tiếp cận." "Phóng to" "Người dùng hiện tại %1$s." "Đang chuyển sang %1$s…" @@ -1884,7 +1896,7 @@ "Thêm ngôn ngữ" "Tùy chọn khu vực" "Nhập tên ngôn ngữ" - "Ðược đề xuất" + "Đề xuất" "Tất cả ngôn ngữ" "Tất cả khu vực" "Tìm kiếm" @@ -1898,9 +1910,7 @@ "Kiểm tra bản cập nhật" "Bạn có tin nhắn mới" "Mở ứng dụng SMS để xem" - "Một số chức năng có thể bị hạn chế" - "Nhấn để mở khóa" - "Đã khóa dữ liệu người dùng" + "Một số chức năng có thể bị hạn chế" "Đã khóa hồ sơ công việc" "Nhấn để mở khóa hồ sơ công việc" "Đã kết nối với %1$s" diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 39ad8e26780d..da239b92238d 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -261,7 +261,7 @@ "网络提醒" "有可用的网络" "VPN 状态" - "设备管理" + "您的 IT 管理员发来的提醒" "提醒" "零售演示模式" "USB 连接" @@ -549,11 +549,15 @@ "指纹图标" - "管理人脸身份验证硬件" + + "允许该应用调用方法来添加和删除可用的人脸模板。" - "使用人脸身份验证硬件" - "允许该应用使用人脸身份验证硬件进行身份验证" - "面孔身份验证" + + + + + + "重新注册您的面孔" "要提升识别精确度,请重新注册您的面孔" "无法捕获准确的人脸数据,请重试。" @@ -565,7 +569,7 @@ "请将手机拿低一点。" "请将手机向左移动。" "请将手机向右移动。" - "请直视屏幕并张开双眼。" + "请直视您的设备。" "看不清您的脸部,请直视手机。" "摄像头过于晃动。请将手机拿稳。" "请重新注册您的面孔。" @@ -579,15 +583,20 @@ "无法验证人脸。硬件无法使用。" - "人脸处理操作超时,请重试。" + + "无法存储新的人脸数据。请先删除旧的人脸数据。" - "人脸处理操作已取消" - "用户已取消人脸身份验证" + "面孔处理操作已取消。" + + "尝试次数过多,请稍后重试。" - "尝试次数过多,人脸身份验证已停用。" + + "无法验证人脸,请重试。" - "您尚未设置人脸身份验证" - "此设备不支持人脸身份验证" + + + + "面孔 %d" @@ -648,6 +657,8 @@ "允许应用绑定到运营商服务。普通应用绝不需要此权限。" "“勿扰”模式使用权限" "允许此应用读取和写入“勿扰”模式配置。" + "授权使用“查看权限”" + "允许该应用开始查看应用的权限使用情况(普通应用绝不需要此权限)。" "设置密码规则" "控制锁屏密码和 PIN 码所允许的长度和字符。" "监控屏幕解锁尝试次数" @@ -1355,7 +1366,8 @@ "恢复出厂设置以停用自动化测试框架模式。" "USB 端口中有液体或碎屑" "USB 端口已自动停用。点按即可了解详情。" - "现在可安全使用 USB 端口" + + "手机不再检测到液体或碎屑。" "正在生成错误报告…" "要分享错误报告吗?" @@ -1631,7 +1643,7 @@ "请输入4至8位数的PIN码。" "PUK码应包含8位数字。" "请重新输入正确的PUK码。如果尝试错误次数过多,SIM卡将永久停用。" - "PIN码不匹配" + "PIN 码不匹配" "图案尝试次数过多" "要解锁,请登录您的Google帐号。" "用户名(电子邮件地址)" @@ -1898,9 +1910,7 @@ "检查更新" "您有新消息" "打开短信应用查看" - "部分功能可能会受到限制" - "点按即可解锁" - "用户数据已锁定" + "部分功能可能会受到限制" "工作资料已锁定" "点按即可解锁工作资料" "已连接到%1$s" diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 302fb714c69b..1da26f03c968 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -261,7 +261,7 @@ "網絡通知" "有可用的網絡" "VPN 狀態" - "裝置管理" + "來自 IT 管理員的通知" "通知" "零售示範" "USB 連線" @@ -549,11 +549,15 @@ "指紋圖示" - "管理臉孔驗證硬件" + + "允許應用程式調用方法,以加入和刪除可用的臉孔範本。" - "使用臉孔驗證硬件" - "允許應用程式使用臉孔驗證硬件來驗證" - "臉孔驗證" + + + + + + "重新註冊臉孔" "如要提高識別能力,請重新註冊您的臉孔" "無法擷取準確的臉容資料。請再試一次。" @@ -565,7 +569,7 @@ "請將手機向下移。" "請將手機向左移。" "請將手機向右移。" - "請睜開眼睛並直視螢幕。" + "請以更直視的角度看著裝置。" "看不到您的臉。請看著手機。" "裝置不夠穩定。請拿穩手機。" "請重新註冊臉孔。" @@ -579,15 +583,20 @@ "無法驗證臉孔,硬件無法使用。" - "臉孔操作已逾時,請再試一次。" + + "無法儲存新的臉容資料,請先刪除舊資料。" - "臉孔操作已取消" - "使用者已取消臉孔驗證" + "臉孔操作已取消。" + + "嘗試次數過多,請稍後再試。" - "嘗試次數過多,臉孔驗證已停用。" + + "無法驗證臉孔。請再試一次。" - "您尚未設定臉孔驗證" - "此裝置不支援臉孔驗證" + + + + "臉孔 %d" @@ -648,6 +657,8 @@ "允許擁有者繫結至流動網絡供應商服務 (不建議一般應用程式使用)。" "存取「請勿騷擾」" "允許應用程式讀取和寫入「請勿騷擾」設定。" + "開始查看權限使用情況" + "允許應用程式開始查看應用程式的權限使用情況 (一般應用程式並不需要)。" "設定密碼規則" "控制螢幕鎖定密碼和 PIN 所允許的長度和字元。" "監控螢幕解鎖嘗試次數" @@ -1124,7 +1135,7 @@ "完成操作需使用" "完成操作需使用 %1$s" "完成操作" - "用於開啟的應用程式" + "選擇開啟方式" "使用 %1$s 開啟" "開啟" "授予存取權以透過以下應用程式開啟 %1$s 連結:" @@ -1355,7 +1366,8 @@ "請將裝置回復原廠設定,以停用測試工具模式。" "USB 連接埠中有液體或碎片" "USB 連接埠已自動停用。輕按即可瞭解詳情。" - "USB 連接埠可安全使用" + + "手機不再偵測到液體或碎片。" "正在取得錯誤報告…" "要分享錯誤報告嗎?" @@ -1898,9 +1910,7 @@ "檢查更新" "您有新的訊息" "開啟短訊應用程式查看內容" - "部分功能可能會受到限制" - "輕按即可解鎖" - "使用者資料已上鎖" + "部分功能可能會受到限制" "工作設定檔已上鎖" "輕按即可將工作設定檔解鎖" "已連線至 %1$s" diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 2f5f8a552d08..2e1a697ba357 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -261,7 +261,7 @@ "網路警示" "有可用的網路" "VPN 狀態" - "裝置管理" + "來自 IT 管理員的快訊" "快訊" "零售商示範模式" "USB 連線" @@ -549,11 +549,15 @@ "指紋圖示" - "管理臉孔驗證硬體" + + "允許應用程式呼叫方法來新增及移除可用的臉孔範本。" - "使用臉孔驗證硬體" - "允許應用程式使用臉孔驗證硬體進行驗證" - "臉孔驗證" + + + + + + "請重新註冊你的臉孔" "為提升辨識精準度,請重新註冊你的臉孔" "無法擷取精準臉孔資料,請再試一次。" @@ -565,7 +569,7 @@ "請將手機拿低一點。" "請將手機向左移動。" "請將手機向右移動。" - "請直視螢幕並張開眼睛。" + "請儘可能直視裝置正面。" "無法偵測你的臉孔,請直視手機。" "鏡頭過度晃動,請拿穩手機。" "請重新註冊你的臉孔。" @@ -579,15 +583,20 @@ "相關硬體無法使用,因此無法驗證臉孔。" - "臉孔已逾時,請再試一次。" + + "無法儲存新的臉孔資料,請先刪除舊的資料。" - "臉孔處理作業已取消" - "使用者已取消臉孔驗證作業" + "臉孔處理作業已取消。" + + "嘗試次數過多,請稍後再試。" - "嘗試次數過多,因此系統已停用臉孔驗證。" + + "無法驗證臉孔,請再試一次。" - "你尚未設定臉孔驗證" - "這個裝置不支援臉孔驗證" + + + + "臉孔 %d" @@ -648,6 +657,8 @@ "允許應用程式繫結至電信業者服務 (一般應用程式並不需要)。" "存取「零打擾」模式" "允許應用程式讀取及寫入「零打擾」設定。" + "啟動檢視權限用途" + "允許應用程式開始使用其他應用程式 (一般應用程式並不需要)。" "設定密碼規則" "管理螢幕鎖定密碼和 PIN 碼支援的字元和長度上限。" "監控螢幕解鎖嘗試次數" @@ -1355,7 +1366,8 @@ "恢復原廠設定以停用測試控管工具模式。" "USB 連接埠中有液體或灰塵" "系統已自動停用 USB 連接埠。輕觸即可瞭解詳情。" - "現在可安全使用 USB 連接埠" + + "手機目前無法偵測液體或灰塵。" "正在接收錯誤報告…" "要分享錯誤報告嗎?" @@ -1448,7 +1460,7 @@ "你目前透過工作設定檔使用這個應用程式" "輸入法" "同步處理" - "協助工具" + "無障礙" "桌布" "變更桌布" "通知接聽器" @@ -1655,17 +1667,17 @@ " — " "移除" "要調高音量,比建議的音量更大聲嗎?\n\n長時間聆聽高分貝音量可能會使你的聽力受損。" - "要使用協助工具捷徑嗎?" - "啟用捷徑功能後,只要同時按下兩個音量鍵 3 秒,就能啟動協助工具功能。\n\n 目前設定的協助工具功能為:\n%1$s\n\n 如要變更設定的功能,請依序輕觸 [設定] > [協助工具]。" + "要使用無障礙捷徑嗎?" + "啟用捷徑功能後,只要同時按下兩個音量鍵 3 秒,就能啟動無障礙功能。\n\n 目前設定的無障礙功能為:\n%1$s\n\n 如要變更設定的功能,請依序輕觸 [設定] > [無障礙設定]。" "停用捷徑" "使用捷徑" "色彩反轉" "色彩校正" - "協助工具捷徑啟用了「%1$s」" - "協助工具捷徑停用了「%1$s」" + "無障礙捷徑啟用了「%1$s」" + "無障礙捷徑停用了「%1$s」" "同時按住調低及調高音量鍵三秒即可使用「%1$s」" - "輕觸 [協助工具] 按鈕後,選擇你想使用的功能:" - "如要變更指派的功能,請按住 [協助工具] 按鈕。" + "輕觸 [無障礙設定] 按鈕後,選擇你想使用的功能:" + "如要變更指派的功能,請按住 [無障礙設定] 按鈕。" "放大" "目前的使用者是 %1$s。" "正在切換至%1$s…" @@ -1801,7 +1813,7 @@ "確定" "節約耗電量模式會關閉或限制背景活動、部分視覺效果,以及其他耗電量高的功能,藉此延長電池續航力。""瞭解詳情" "節約耗電量模式會關閉或限制背景活動、部分視覺效果,以及其他耗電量高的功能,藉此延長電池續航力。" - "「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。你目前使用的某個應用程式可以存取資料,但存取頻率可能不如平時高。舉例來說,圖片可能不會自動顯示,而必須由你輕觸後才會顯示。" + "「數據節省模式」可防止部分應用程式在背景收發資料,以節省數據用量。你目前使用的某個應用程式可以存取資料,但存取頻率可能不如平時高。舉例來說,圖片可能不會自動顯示,在你輕觸後才會顯示。" "要開啟數據節省模式嗎?" "開啟" @@ -1898,9 +1910,7 @@ "檢查更新" "你有新訊息" "開啟簡訊應用程式來查看內容" - "部分功能可能受到鎖定" - "輕觸即可解鎖" - "使用者資料已鎖定" + "部分功能可能遭到鎖定" "工作資料夾目前處於鎖定狀態" "輕觸即可將工作資料夾解鎖" "已連線至 %1$s" diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 42056af172c6..ecb1cdcfb025 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -261,7 +261,7 @@ "Izexwayiso zenethiwekhi" "Inethiwekhi iyatholakala" "Isimo se-VPN" - "Ukulawula idivayisi" + "Izxwayiso kusuka kumlawuli wakho we-IT" "Izexwayiso" "Idemo yokuthenga" "Ukuxhumeka kwe-USB" @@ -549,11 +549,11 @@ "Isithonjana sezigxivizo zeminwe" - "phatha izingxenyekazi zekhompuyutha zokufakazela ubuqiniso zobuso" + "phatha izingxenyekazi zekhompuyutha ze-face unlock" "Ivumela uhlelo lokusebenza ukuthi luhoxise izindlela zokungeza nokususa amathempulethi obuso azosetshenziswa." - "sebenzisa izingxenyekazi zekhompuyutha zokufakazela ubuqiniso kobuso" - "Ivumela uhlelo lokusebenza ukuthi lusebenzise ukufakazela ubuqiniso bobuso bezingxenyekazi ukuze kufakazelwe ubuqiniso" - "Ukufakazela ubuqiniso bobuso" + "sebenzisa izingxenyekazi zekhompuyutha ze-face unlock" + "Ivumela uhlelo lokusebenza ukuthi lusebenzise izingxenyekazi zekhompuyutha ze-face unlock ukuze kufakazelwe ubuqiniso" + "I-Face unlock" "Phinda ubhalise ubuso bakho" "Ukuze uthuthukise ukubonwa, sicela uphinde ubhalise ubuso bakho" "Ayikwazanga ukuthwebula idatha enembile yobuso. Zama futhi." @@ -565,7 +565,7 @@ "Hambisa ifoni ngaphansi." "Hambisa ifoni ngakwesokunxele." "Hambisa ifoni ngakwesokudla." - "Bheka isikrini ngamehlo akho avuliwe." + "Sicela ubheke ngokuqondile kakhulu kudivayisi yakho." "Ayikwazi ukubona ubuso bakho. Bheka ifoni" "Ukunyakaza okuningi kakhulu. Bamba ifoni iqine." "Sicela uphinde ubhalise ubuso bakho." @@ -579,15 +579,15 @@ "Ayikwazi ukuqinisekisa ubuso. Izingxenyekazi zekhompyutha azitholakali." - "Kufinyelelwe ekupheleni kwesikhathi kobuso. Zama futhi." + "Zama i-face unlock futhi." "Ayikwazi ukulondoloza idatha yobuso. Susa endala." - "Umsebenzi wobuso ukhanselwe" - "Ukufakazela ubuqiniso kobuso kukhanselwe umsebenzisi" + "Umsebenzi wobuso ukhanselwe." + "I-face unlock ikhanselwe umsebenzisi." "Imizamo eminingi kakhulu. Zama futhi emuva kwesikhathi." - "Imizamo eminingi kakhulu. Ukugunyaza ubuso kukhutshaziwe." + "Imizamo eminingi kakhulu. I-Face unlock ikhutshaziwe." "Ayikwazi ukuqinisekisa ubuso. Zama futhi." - "Awukakasethi ukufakazela ubuqiniso bobuso" - "Ukufakazela ubuqiniso bobuso akusekelwe kule divayisi" + "Awukakasethi i-face unlock." + "I-face unlock ayisekelwe kule divayisi." "Ubuso be-%d" @@ -648,6 +648,8 @@ "Ivumela umbambi ukuthi abophezele kumasevisi wenkampani yenethiwekhi. Akumele idingelwe izinhlelo zokusebenza ezijwayelekile." "finyelela kokuthi Ungaphazamisi" "Ivumela izinhlelo zokusebenza ukufunda nokubhala ukulungiswa kokuthi Ungaphazamisi." + "qala ukusetshenziswa kokubuka imvume" + "Ivumela umphathi ukuthi aqale ukusetshenziswa kwemvume kohlelo lokusebenza. Akumele idingelwe izinhlelo zokusebenza ezijwayelekile." "Misa imithetho yephasiwedi" "Lawula ubude nezinhlamvu ezivunyelwe kumaphasiwedi wokukhiya isikrini nama-PIN." "Qapha imizamo yokuvula isikrini sakho" @@ -1355,7 +1357,7 @@ "Yenza ukusetha kabusha kwasekuqaleni ukuze ukhubaze imodi yokuqina yokuhlola." "Uketshezi noma ama-debris kumbobo ye-USB" "Imbobo ye-USB inqanyulwa ngokuzenzakalela. Thepha ukuze ufunde kabanzi." - "Kuphephile ukusebenzisa imbobo ye-USB" + "KULUNGILE ukusebenzisa imbobo ye-USB" "Ifoni ayisatholi uketshezi noma ama-debris." "Ithatha umbiko wesiphazamisi..." "Yabelana ngombiko wesiphazamisi?" @@ -1898,9 +1900,7 @@ "Hlola izibuyekezo" "Unemilayezo emisha" "Vula uhlelo lokusebenza lwe-SMS ukuze ubuke" - "Okunye ukusebenza kungakhawulelwe" - "Thepha ukuze uvule" - "Idatha yomsebenzisi ikhiyiwe" + "Okunye ukusebenza kungakhawulelwe" "Iphrofayela yomsebenzi ikhiyiwe" "Thepha ukuze uvule iphrofayela yomsebenzi" "Kuxhumekile ku-%1$s" -- GitLab From a32a0d4c95ba8b2b357e08fa56b5831aa2cbdaba Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 26 May 2019 05:06:17 -0700 Subject: [PATCH 017/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I60e80a9265b2d7e39d0911e9f00d815649d30deb --- .../res-keyguard/values-fa/strings.xml | 2 +- .../res-keyguard/values-my/strings.xml | 4 +- .../res-keyguard/values-tl/strings.xml | 2 +- packages/SystemUI/res/values-af/strings.xml | 33 +++++----- packages/SystemUI/res/values-am/strings.xml | 40 +++++++----- packages/SystemUI/res/values-ar/strings.xml | 52 +++++++++------- packages/SystemUI/res/values-as/strings.xml | 38 +++++++----- packages/SystemUI/res/values-az/strings.xml | 40 +++++++----- .../SystemUI/res/values-b+sr+Latn/strings.xml | 40 +++++++----- packages/SystemUI/res/values-be/strings.xml | 40 +++++++----- packages/SystemUI/res/values-bg/strings.xml | 40 +++++++----- packages/SystemUI/res/values-bn/strings.xml | 48 ++++++++------ packages/SystemUI/res/values-bs/strings.xml | 40 +++++++----- packages/SystemUI/res/values-ca/strings.xml | 48 ++++++++------ packages/SystemUI/res/values-cs/strings.xml | 40 +++++++----- packages/SystemUI/res/values-da/strings.xml | 44 ++++++++----- packages/SystemUI/res/values-de/strings.xml | 42 ++++++++----- packages/SystemUI/res/values-el/strings.xml | 33 +++++----- .../SystemUI/res/values-en-rAU/strings.xml | 33 +++++----- .../SystemUI/res/values-en-rCA/strings.xml | 33 +++++----- .../SystemUI/res/values-en-rGB/strings.xml | 33 +++++----- .../SystemUI/res/values-en-rIN/strings.xml | 33 +++++----- .../SystemUI/res/values-en-rXC/strings.xml | 21 ++++--- .../SystemUI/res/values-es-rUS/strings.xml | 48 ++++++++------ packages/SystemUI/res/values-es/strings.xml | 46 ++++++++------ packages/SystemUI/res/values-et/strings.xml | 40 +++++++----- packages/SystemUI/res/values-eu/strings.xml | 44 ++++++++----- packages/SystemUI/res/values-fa/strings.xml | 50 +++++++++------ packages/SystemUI/res/values-fi/strings.xml | 40 +++++++----- .../SystemUI/res/values-fr-rCA/strings.xml | 42 ++++++++----- packages/SystemUI/res/values-fr/strings.xml | 40 +++++++----- packages/SystemUI/res/values-gl/strings.xml | 46 ++++++++------ packages/SystemUI/res/values-gu/strings.xml | 40 +++++++----- packages/SystemUI/res/values-hi/strings.xml | 62 +++++++++++-------- packages/SystemUI/res/values-hr/strings.xml | 40 +++++++----- packages/SystemUI/res/values-hu/strings.xml | 40 +++++++----- packages/SystemUI/res/values-hy/strings.xml | 40 +++++++----- packages/SystemUI/res/values-in/strings.xml | 33 +++++----- packages/SystemUI/res/values-is/strings.xml | 40 +++++++----- packages/SystemUI/res/values-it/strings.xml | 35 ++++++----- packages/SystemUI/res/values-iw/strings.xml | 46 ++++++++------ packages/SystemUI/res/values-ja/strings.xml | 40 +++++++----- packages/SystemUI/res/values-ka/strings.xml | 40 +++++++----- packages/SystemUI/res/values-kk/strings.xml | 40 +++++++----- packages/SystemUI/res/values-km/strings.xml | 40 +++++++----- packages/SystemUI/res/values-kn/strings.xml | 33 +++++----- packages/SystemUI/res/values-ko/strings.xml | 40 +++++++----- packages/SystemUI/res/values-ky/strings.xml | 44 ++++++++----- packages/SystemUI/res/values-lo/strings.xml | 40 +++++++----- packages/SystemUI/res/values-lt/strings.xml | 40 +++++++----- packages/SystemUI/res/values-lv/strings.xml | 40 +++++++----- packages/SystemUI/res/values-mk/strings.xml | 40 +++++++----- packages/SystemUI/res/values-ml/strings.xml | 42 ++++++++----- packages/SystemUI/res/values-mn/strings.xml | 42 ++++++++----- packages/SystemUI/res/values-mr/strings.xml | 38 +++++++----- packages/SystemUI/res/values-ms/strings.xml | 40 +++++++----- packages/SystemUI/res/values-my/strings.xml | 41 ++++++------ packages/SystemUI/res/values-nb/strings.xml | 42 ++++++++----- packages/SystemUI/res/values-ne/strings.xml | 42 ++++++++----- packages/SystemUI/res/values-nl/strings.xml | 40 +++++++----- packages/SystemUI/res/values-or/strings.xml | 44 +++++++------ packages/SystemUI/res/values-pa/strings.xml | 42 ++++++++----- packages/SystemUI/res/values-pl/strings.xml | 40 +++++++----- .../SystemUI/res/values-pt-rBR/strings.xml | 42 ++++++++----- .../SystemUI/res/values-pt-rPT/strings.xml | 44 ++++++++----- packages/SystemUI/res/values-pt/strings.xml | 42 ++++++++----- packages/SystemUI/res/values-ro/strings.xml | 40 +++++++----- packages/SystemUI/res/values-ru/strings.xml | 42 ++++++++----- packages/SystemUI/res/values-si/strings.xml | 33 +++++----- packages/SystemUI/res/values-sk/strings.xml | 40 +++++++----- packages/SystemUI/res/values-sl/strings.xml | 40 +++++++----- packages/SystemUI/res/values-sq/strings.xml | 42 ++++++++----- packages/SystemUI/res/values-sr/strings.xml | 40 +++++++----- packages/SystemUI/res/values-sv/strings.xml | 40 +++++++----- packages/SystemUI/res/values-sw/strings.xml | 40 +++++++----- packages/SystemUI/res/values-ta/strings.xml | 50 ++++++++------- packages/SystemUI/res/values-te/strings.xml | 38 +++++++----- packages/SystemUI/res/values-th/strings.xml | 42 ++++++++----- packages/SystemUI/res/values-tl/strings.xml | 42 ++++++++----- packages/SystemUI/res/values-tr/strings.xml | 40 +++++++----- packages/SystemUI/res/values-uk/strings.xml | 40 +++++++----- packages/SystemUI/res/values-ur/strings.xml | 44 +++++++------ packages/SystemUI/res/values-uz/strings.xml | 40 +++++++----- packages/SystemUI/res/values-vi/strings.xml | 40 +++++++----- .../SystemUI/res/values-zh-rCN/strings.xml | 40 +++++++----- .../SystemUI/res/values-zh-rHK/strings.xml | 40 +++++++----- .../SystemUI/res/values-zh-rTW/strings.xml | 44 ++++++++----- packages/SystemUI/res/values-zu/strings.xml | 33 +++++----- 88 files changed, 2102 insertions(+), 1357 deletions(-) diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml index d963859c3853..1c4387e97a84 100644 --- a/packages/SystemUI/res-keyguard/values-fa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml @@ -55,7 +55,7 @@ "گذرواژه دستگاه" "قسمت پین سیم‌کارت" "‏قسمت PUK سیم‌کارت" - "زنگ ساعت بعدی برای %1$s تنظیم شد" + "زنگ بعدی برای %1$s تنظیم شد" "حذف" "‏غیرفعال کردن eSIM" "سیم‌کارت داخلی غیرفعال نشد" diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml index 76d7890742aa..c816159e7714 100644 --- a/packages/SystemUI/res-keyguard/values-my/strings.xml +++ b/packages/SystemUI/res-keyguard/values-my/strings.xml @@ -141,8 +141,8 @@ စက်ပစ္စည်းကို %d နာရီကြာ လော့ခ်ဖွင့်ခဲ့ခြင်း မရှိပါ။ စကားဝှက်အား အတည်ပြုပါ။ စက်ပစ္စည်းကို %d နာရီကြာ လော့ခ်ဖွင့်ခဲ့ခြင်း မရှိပါ။ စကားဝှက်အား အတည်ပြုပါ။ - "မသိပါ" - "မသိပါ" + "မသိ" + "မသိ" ဆင်းမ်ကဒ် ပင်နံပါတ် ထည့်ပါ။ %d ကြိမ် စမ်းသပ်ခွင့်ရှိပါသေးသည်။ ဆင်းမ်ကဒ် ပင်နံပါတ် ထည့်ပါ။ သင့်စက်ကို လော့ခ်ဖွင့်ပေးရန်အတွက် ဝန်ဆောင်မှုပေးသူသို့ မဆက်သွယ်မီ %d ကြိမ် စမ်းသပ်ခွင့်ရှိပါသေးသည်။ diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml index 53ffb2c44f2c..4f247c3a361d 100644 --- a/packages/SystemUI/res-keyguard/values-tl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml @@ -55,7 +55,7 @@ "Password ng device" "Lugar ng PIN ng SIM" "Lugar ng PUK ng SIM" - "Nakatakda ang susunod na alarm sa %1$s" + "Nakatakda ang susunod na alarm nang %1$s" "I-delete" "I-disable ang eSIM" "Hindi ma-disable ang eSIM" diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index aa545faef921..e6579da55ed8 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -62,9 +62,10 @@ "USB-ontfouting word nie toegelaat nie" "Die gebruiker wat tans by hierdie toestel aangemeld is, kan nie USB-ontfouting aanskakel nie. Skakel na die primêre gebruiker toe oor om hierdie kenmerk te gebruik." "USB-poort is gedeaktiveer" - "Die USB-poort is gedeaktiveer om jou toestel teen vloeistowwe en vuilgoed te beskerm en dit sal nie enige bykomstighede bespeur nie.\n\nJy sal ingelig word wanneer dit veilig is om weer die USB-poort te gebruik." + "Die USB-poort is gedeaktiveer om jou toestel teen vloeistowwe en vuilgoed te beskerm en dit sal nie enige bykomstighede bespeur nie.\n\nJy sal ingelig word wanneer die USB-poort weer gebruik kan word." "USB-poort is geaktiveer om laaiers en bykomstighede te bespeur" "Aktiveer USB" + "Kom meer te wete" "Zoem om skerm te vul" "Strek om skerm te vul" "Skermkiekie" @@ -118,6 +119,11 @@ "Kanselleer" "Bevestig" "Probeer weer" + "Leë gebied; tik om stawing te kanselleer" + "Probeer asseblief weer" + "Soek tans jou gesig" + "Gesig is gestaaf" + "Bevestig" "Raak die vingerafdruksensor" "Vingerafdrukikoon" "Soek tans vir jou …" @@ -369,8 +375,7 @@ "Aan om %s" "Tot %s" "Donker-tema" - - + "Donker-tema\nBatterybespaarder" "NFC" "NFC is gedeaktiveer" "NFC is geaktiveer" @@ -445,13 +450,14 @@ "Batterybespaarder is aan" "Verminder werkverrigting en agtergronddata" "Skakel Batterybespaarder af" - "Terwyl dit opneem of uitsaai, kan %s enige sensitiewe inligting, soos oudio wat jy speel en jou wagwoorde, betaalinligting, foto\'s en boodskappe, vasvang." + "Terwyl dit opneem of uitsaai, kan %s enige sensitiewe inligting vasvang wat op jou skerm gewys word of op jou toestel gespeel word, insluitend sensitiewe inligting soos oudio, wagwoorde, betaalinligting, foto\'s en boodskappe." + "Terwyl dit opneem of uitsaai, kan die diens wat hierdie taak uitvoer enige sensitiewe inligting vasvang wat op jou skerm gewys word of op jou toestel gespeel word, insluitend sensitiewe inligting soos oudio, wagwoorde, betaalinligting, foto\'s en boodskappe." "Maak sensitiewe inligting tydens uitsending/opname openbaar" "Moenie weer wys nie" "Vee alles uit" "Bestuur" - "Ligte kennigewings" - "Vee alle ligte kennisgewings uit" + "Stil kennisgewings" + "Vee alle stil kennisgewings uit" "Kennisgewings onderbreek deur Moenie Steur Nie" "Begin nou" "Geen kennisgewings nie" @@ -635,9 +641,9 @@ "Blokkeer" "Hou aan wys" "Minimeer" - "Saggies" + "Stil" "Bly stil" - "Steurend" + "Waarskuwings" "Hou aan waarsku" "Skakel kennisgewings af" "Hou aan om kennisgewings van hierdie program af te wys?" @@ -651,10 +657,8 @@ "Hierdie kennisgewings kan nie gewysig word nie." "Hierdie groep kennisgewings kan nie hier opgestel word nie" "Instaanbediener-kennisgewing" - - - - + "Alle %1$s-kennisgewings" + "Sien meer" "Hierdie program gebruik tans die kamera." "Hierdie program gebruik tans die mikrofoon." "Hierdie program wys tans bo-oor ander programme op jou skerm." @@ -898,7 +902,7 @@ "Laat toe" "Weier" "Tik om Batterybespaarder te skeduleer" - "Skakel outomaties aan wanneer battery by %d%% is" + "Skakel aan wanneer battery waarskynlik sal leegloop" "Nee, dankie" "Batterybespaarder-skedule is aangeskakel" "Batterybespaarder sal outomaties aanskakel wanneer battery onder %d%% is." @@ -930,6 +934,5 @@ "Beweeg na regs bo" "Beweeg na links onder" "Beweeg na regs onder" - - + "Maak toe" diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index dfe34c73dcfa..47897892f6af 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -62,9 +62,12 @@ "የዩኤስቢ እርማት አይፈቀድም" "አሁን ወደዚህ መሣሪያ የገባው ተጠቃሚ የዩኤስቢ እርማትን ማብራት አይችልም። ይህን ባህሪ ለመጠቀም ወደ ዋና ተጠቃሚ ይቀይሩ።" "የዩኤስቢ ወደብ ተሰናክሏል" - "መሣሪያዎን ከፈሳሽ ወይም ፍርስራሽ ለመጠበቅ ሲባል የዩኤስቢ ወደቡ ተሰናክሏል፣ እና ማናቸውም ተቀጥላዎችን አያገኝም።\n\nየዩኤስቢ ወደቡን እንደገና መጠቀም ችግር በማይኖረው ጊዜ ማሳወቂያ ይደርሰዎታል።" + + "ኃይል መሙያዎችን እና ተጨማሪ መሣሪያዎችን ፈልጎ ለማግኘት የነቃ የዩኤስቢ ወደብ" "ዩኤስቢ አንቃ" + + "ማያ እንዲሞላ አጉላ" "ማያ ለመሙለት ሳብ" "ቅጽበታዊ ገጽ እይታ" @@ -118,6 +121,11 @@ "ይቅር" "አረጋግጥ" "እንደገና ይሞክሩ" + "ባዶ ክልል፣ ፈቃድን ለመሰረዝ መታ ያድርጉ" + "እባክዎ እንደገና ይሞክሩ" + "መልክዎን በመፈለግ ላይ" + "መልክ ተረጋግጧል" + "ተረጋግጧል" "የጣት አሻራ ዳሳሹን ይንኩ" "የጣት አሻራ አዶ" "እርስዎን በመፈለግ ላይ…" @@ -369,8 +377,7 @@ "%s ላይ ይበራል" "እስከ %s ድረስ" "ጨለማ ገጽታ" - - + "ጨለም ያለ ገጽታ\nየባትሪ ቆጣቢ" "ኤንኤፍሲ" "ኤንኤፍሲ ተሰናክሏል" "ኤንኤፍሲ ነቅቷል" @@ -445,13 +452,16 @@ "ባትሪ ቆጣቢ በርቷል" "አፈጻጸምን እና የጀርባ ውሂብ ይቀንሳል" "ባትሪ ቆጣቢን አጥፋ" - "በመቅረጽ ላይ ወይም በመውሰድ ጊዜ፣ %s እርስዎ የሚያጫውቱትን እንደ ኦዲዮ ያለ እና የእርስዎ የይለፍ ቃላት፣ የክፍያ መረጃ፣ እና መልዕክቶች የመሳሰሉ አደጋን ሊያስከትሉ የሚችሉ ማናቸውንም መረጃዎች ሊያዝ ይችላል።" + "እየቀረጸ ወይም cast እያደረገ ሳለ %s እንደ ኦዲዮ፣ የይለፍ ቃላት፣ የክፍያ መረጃ፣ ፎቶዎች እና መልዕክቶች ያለ ሚስጥራዊነት ያለው መረጃ ጨምሮ በማያ ገጽዎ ላይ የሚታይ ወይም ከመሣሪያዎ የተጫወተ ማንኛውም ሚስጥራዊነት ያለው መረጃ ሊይዝ ይችላል።" + "እየቀረጸ ወይም cast እያደረገ ሳለ ይህን ተግባር የሚያቀርበው አገልግሎት እንደ ኦዲዮ፣ የይለፍ ቃላት፣ የክፍያ መረጃ፣ ፎቶዎች እና መልዕክቶች ያለ ሚስጥራዊነት ያለው መረጃ ጨምሮ በማያ ገጽዎ ላይ የሚታይ ወይም ከመሣሪያዎ የተጫወተ ማንኛውም ሚስጥራዊነት ያለው መረጃ ሊይዝ ይችላል።" "በመውሰድ/ ቀረጻ ላይ አደገኛ መረጃን አጋልጦ በመስጠት ላይ" "ዳግመኛ አታሳይ" "ሁሉንም አጽዳ" "ያቀናብሩ" - "ገር ማሳወቂያዎች" - "ረጋ ያሉትን ማሳወቂያዎች በሙሉ ያጽዱ" + + + + "ማሳወቂያዎች በአትረብሽ ባሉበት ቆመዋል" "አሁን ጀምር" "ምንም ማሳወቂያ የለም" @@ -635,9 +645,11 @@ "አግድ" "ማሳየትን ቀጥል" "አሳንስ" - "ረጋ ያለ" + + "ጸጥ እንዳለ ቆይ" - "አቋራጭ" + + "ማንቃቱን ቀጥል" "ማሳወቂያዎችን አጥፋ" "ከዚህ መተግበሪያ ማሳወቂያዎችን ማሳየት ይቀጥል?" @@ -651,10 +663,8 @@ "እነዚህ ማሳወቂያዎች ሊሻሻሉ አይችሉም።" "የማሳወቂያዎች ይህ ቡድን እዚህ ላይ ሊዋቀር አይችልም" "ተኪ ማሳወቂያ" - - - - + "ሁሉም %1$s ማሳወቂያዎች" + "ተጨማሪ ይመልከቱ" "ይህ መተግበሪያ ካሜራውን እየተጠቀመ ነው።" "ይህ መተግበሪያ ማይክሮፎኑን እየተጠቀመ ነው።" "ይህ መተግበሪያ በማያ ገጽዎ ላይ ባሉ ሌሎች መተግበሪያዎች ላይ እያሳየ ነው።" @@ -898,7 +908,8 @@ "ፍቀድ" "ከልክል" "ለባትሪ ቆጣቢ መርሐግብርን ለማስያዝ መታ ያድርጉ" - "ባትሪ %d%% ላይ ሲሆን በራስ-ሰር ያብሩ" + + "አይ፣ አመሰግናለሁ" "የባትሪ ቆጣቢ መርሐግብር በርቷል" "ባትሪ ልክ ከ%d%% በታች ሲሆን ባትሪ ቆጣቢ በራስ-ሰር ይበራል።" @@ -930,6 +941,5 @@ "ወደ ላይኛው ቀኝ አንቀሳቅስ" "የግርጌውን ግራ አንቀሳቅስ" "ታችኛውን ቀኝ ያንቀሳቅሱ" - - + "አሰናብት" diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 87842172a4fd..42879a410b51 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -62,9 +62,12 @@ "‏لا يُسمح بتصحيح أخطاء USB" "‏لا يمكن للمستخدم الذي يسجّل دخوله حاليًا إلى هذا الجهاز تشغيل تصحيح أخطاء USB. لاستخدام هذه الميزة، يمكنك التبديل إلى المستخدم الأساسي." "‏تمّ إيقاف منفذ USB" - "‏لحماية جهازك من السوائل أو الشوائب، سيتمّ إيقاف منفذ USB الذي لن يتمكَّن من اكتشاف أيّ ملحقات.\n\nوسيتمّ إعلامك عندما يتوفّر الأمان لاستخدام منفذ USB مرّةً أخرى." + + "‏تم تفعيل منفذ USB لاكتشاف أجهزة الشحن والملحقات." "‏تفعيل USB" + + "تكبير/تصغير لملء الشاشة" "توسيع بملء الشاشة" "لقطة شاشة" @@ -118,7 +121,12 @@ "إلغاء" "تأكيد" "إعادة المحاولة" - "المس زر استشعار بصمات الإصبع" + "منطقة خالية، يُرجى النقر لإلغاء المصادقة." + "يُرجى إعادة المحاولة." + "جارٍ البحث عن وجهك" + "تمّت مصادقة الوجه." + "تمّ التأكيد." + "المس زر استشعار بصمة الإصبع" "رمز بصمة الإصبع" "جارٍ البحث عن وجهك…" "رمز الوجه" @@ -377,8 +385,7 @@ "تفعيل الإعداد في %s" "حتى %s" "مظهر الألوان الداكنة" - - + "مظهر داكن\nتوفير شحن البطارية" "‏الاتصالات قصيرة المدى (NFC)" "تم إيقاف الاتصال القريب المدى" "تم تفعيل الاتصال القريب المدى" @@ -457,13 +464,16 @@ "تم تفعيل ميزة توفير شحن البطارية" "لخفض مستوى الأداء وبيانات الخلفية" "إيقاف ميزة توفير شحن البطارية" - "أثناء التسجيل أو الإرسال، يمكن للتطبيق %s تسجيل أي معلومات حسّاسة، مثل الصوت الذي تشغّله وكلمات المرور ومعلومات الدفع والصور والرسائل." + "أثناء التسجيل أو الإرسال، يمكن لتطبيق %s تسجيل أي معلومات حساسة يتم عرضها على الشاشة أو تشغيلها من جهازك، بما فيها المعلومات الحساسة مثل الصوت الذي تشغّله وكلمات المرور ومعلومات الدفع والصور والرسائل." + "أثناء التسجيل أو الإرسال، يمكن للخدمة التي تقدّم هذه الوظيفة تسجيل أي معلومات حساسة يتم عرضها على الشاشة أو تشغيلها من جهازك، بما فيها المعلومات الحساسة مثل الصوت الذي تشغّله وكلمات المرور ومعلومات الدفع والصور والرسائل." "عرض معلومات حسّاسة أثناء الإرسال/التسجيل" "عدم الإظهار مرة أخرى" "محو الكل" "إدارة" - "إشعارات بسيطة" - "محو جميع الإشعارات البسيطة" + + + + "تم إيقاف الإشعارات مؤقتًا وفقًا لإعداد \"الرجاء عدم الإزعاج\"" "البدء الآن" "ليس هناك أي اشعارات" @@ -647,26 +657,26 @@ "حظر" "الاستمرار في تلقّي الإشعارات" "تصغير" - "التنبيهات الهادئة" + + "متابعة عرض الإشعارات بدون صوت" - "التنبيهات التقاطعية" + + "متابعة إرسال التنبيهات" "إيقاف الإشعارات" "هل تريد الاستمرار في تلقي إشعارات من هذا التطبيق؟" "الإشعارات الهادئة" - "له الأولوية" + "لها الأولوية" "لمساعدتك على التركيز، يتم عرض هذه الإشعارات ضمن \"مركز الإشعارات\" فقط. كتم الصوت دائمًا." - "يتم عرض هذه الإشعارات أسفل الإشعارات ذات الأولوية. كتم الصوت دائمًا." - "يتم عرض هذه الإشعارات أسفل الإشعارات ذات الأولوية. كتم الصوت دائمًا." - "يتم عرض هذه الإشعارات أسفل الإشعارات ذات الأولوية. كتم الصوت دائمًا." - "تلفت هذه الإشعارات انتباهك وذلك باستخدام الصوت ورمز \"شريط الحالة\". يتم عرض هذه الإشعارات على \"شاشة التأمين\"." + "يتم عرض هذه الإشعارات تحت الإشعارات ذات الأولوية، مع كتم صوتها دائمًا." + "يتم عرض هذه الإشعارات تحت الإشعارات ذات الأولوية، مع كتم صوتها دائمًا." + "يتم عرض هذه الإشعارات تحت الإشعارات ذات الأولوية، مع كتم صوتها دائمًا." + "عند تلقّي هذه الإشعارات، سيظهر رمز في شريط الحالة مع صوت للفت انتباهك. ويتم عرض هذه الإشعارات على شاشة التأمين." "يتعذّر تعديل هذه الإشعارات." "يتعذّر ضبط مجموعة الإشعارات هذه هنا." "إشعار مستند إلى خادم وكيل" - - - - + "جميع إشعارات %1$s" + "عرض المزيد" "يستخدم هذا التطبيق الكاميرا." "يستخدم هذا التطبيق الميكروفون." "يتم عرض هذا التطبيق فوق التطبيقات الأخرى على شاشتك." @@ -918,7 +928,8 @@ "سماح" "رفض" "انقر لجدولة \"توفير شحن البطارية\"." - "يمكنك تفعيل الميزة تلقائيًا عندما تصل نسبة شحن البطارية إلى %d%%." + + "لا، شكرًا" "تم تفعيل جدولة \"توفير شحن البطارية\"." "سيتم تفعيل ميزة \"توفير شحن البطارية\" عندما تنخفض البطارية عن %d%%." @@ -950,6 +961,5 @@ "الانتقال إلى أعلى اليسار" "نقل إلى أسفل يمين الشاشة" "نقل إلى أسفل اليسار" - - + "تجاهل" diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index c2fbda5b7fe1..de2b933d06eb 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -62,9 +62,12 @@ "ইউএছবি ডিবাগিঙৰ অনুমতি নাই" "এই ডিভাইচটোত বর্তমান ছাইন ইন হৈ থকা ব্যৱহাৰকাৰীজনে ইউএছবি ডিবাগিং অন কৰিব নোৱাৰে। এই সুবিধাটো ব্যৱহাৰ কৰিবলৈ হ\'লে মুখ্য ব্যৱহাৰকাৰী হিচাপে ছাইন ইন কৰক।" "ইউএছবি প’ৰ্ট অক্ষম কৰা হ’ল" - "আপোনাৰ ডিভাইচটো তৰল বা ধূলি-মাকতিৰ পৰা ৰক্ষা কৰিবলৈ ইউএছবি প’ৰ্টটো অক্ষম কৰি ৰখা হৈছে ফলত ই কোনো আনুষংগিক সামগ্ৰী ধৰা পেলাব নোৱাৰে।\n\nযেতিয়া ইউএছবি প’ৰ্টটো নিৰাপদভাৱে ব্যৱহাৰ কৰিব পৰা হ’ব তেতিয়া আপোনাক জনোৱা হ’ব।" + + "চাৰ্জাৰ আৰু আনুষংগিক সামগ্ৰী চিনাক্ত কৰিবলৈ USB প’ৰ্ট সক্ষম কৰা হ’ল" "USB সক্ষম কৰক" + + "স্ক্ৰীণ পূর্ণ কৰিবলৈ জুম কৰক" "স্ক্ৰীণ পূর্ণ কৰিবলৈ প্ৰসাৰিত কৰক" "স্ক্ৰীণশ্বট" @@ -118,6 +121,11 @@ "বাতিল কৰক" "নিশ্চিত কৰক" "আকৌ চেষ্টা কৰক" + "এলেকা খালী আছে, বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ বাতিল কৰিবলৈ টিপক" + "অনুগ্ৰহ কৰি আকৌ চেষ্টা কৰক" + "আপোনাৰ মুখমণ্ডল বিচাৰি থকা হৈছে" + "মুখমণ্ডলৰ বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ কৰা হ’ল" + "নিশ্চিত কৰিলে" "ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো স্পৰ্শ কৰক" "ফিংগাৰপ্ৰিণ্ট আইকন" "আপোনাৰ মুখমণ্ডল বিচাৰি আছে…" @@ -369,8 +377,7 @@ "%sত অন কৰক" "%s পৰ্যন্ত" "গাঢ় ৰঙৰ থীম" - - + "গাঢ় ৰঙৰ থীম\nবেটাৰী সঞ্চয়কাৰী" "NFC" "NFC নিষ্ক্ৰিয় হৈ আছে" "NFC সক্ষম হৈ আছে" @@ -445,14 +452,15 @@ "বেটাৰি সঞ্চয়কাৰী অন হৈ আছে" "কাৰ্যদক্ষতা আৰু নেপথ্য ডেটা হ্ৰাস কৰে" "বেটাৰি সঞ্চয়কাৰী অফ কৰক" - "ৰেকৰ্ড বা কাষ্ট কৰি থকাৰ সময়ত %sএ যিকোনো স্পৰ্শকাতৰ তথ্য যেনে আপুনি প্লে’ কৰা অডিঅ’, আপোনাৰ পাছৱৰ্ড, পৰিশোধৰ তথ্য, ফট’ আৰু বাৰ্তাবোৰ কেপচাৰ কৰিব পাৰিব।" + "ৰেকৰ্ড বা কাষ্ট কৰি থাকোঁতে %sএ অডিঅ’, পাছৱৰ্ডসমূহ, পৰিশোধৰ তথ্য, ফট’সমূহ আৰু বাৰ্তাসমূহকে ধৰি আপোনাৰ স্ক্রীণত দেখুওৱা বা আপোনাৰ ডিভাইচৰ পৰা প্লে’ কৰা যিকোনো সংবেনদশীল তথ্য কেপচ্চাৰ কৰিব পাৰে।" + "ৰেকৰ্ড বা কাষ্ট কৰি থাকোঁতে এই কাৰ্যকাৰিতাটো প্ৰদান কৰি থকা সেৱাটোৱে অডিঅ’, পাছৱৰ্ডসমূহ, পৰিশোধৰ তথ্য, ফট’সমূহ আৰু বাৰ্তাসমূহকে ধৰি আপোনাৰ স্ক্রীণত দেখুওৱা বা আপোনাৰ ডিভাইচৰ পৰা প্লে’ কৰা যিকোনো সংবেনদশীল তথ্য কেপচ্চাৰ কৰিব পাৰে।" "কাষ্টিং/ৰেকৰ্ডিঙৰ সময়ত স্পৰ্শকাতৰ তথ্য দেখুওৱা হৈছে" "পুনৰাই নেদেখুৱাব" "সকলো মচক" "পৰিচালনা" - + - + "অসুবিধা নিদিব-ই জাননী পজ কৰিছে" "এতিয়াই আৰম্ভ কৰক" @@ -637,9 +645,11 @@ "অৱৰোধ কৰক" "দেখুওৱাই থাকক" "সৰু কৰক" - "মৃদু" + + "নীৰৱ হৈ থাকক" - "বাধা দিয়া" + + "সতৰ্ক কৰি থাকক" "জাননী অফ কৰক" "এই এপটোৰ জাননী দেখুওৱাই থাকিব লাগিবনে?" @@ -653,10 +663,8 @@ "এই জাননীসমূহ সংশোধন কৰিব নোৱাৰি।" "এই ধৰণৰ জাননীবোৰ ইয়াত কনফিগাৰ কৰিব পৰা নাযায়" "প্ৰক্সি হিচাপে পঠিওৱা জাননী" - - - - + "%1$sৰ সকলো জাননী" + "অধিক চাওক" "এই এপে কেমেৰা ব্য়ৱহাৰ কৰি আছে।" "এই এপে মাইক্ৰ\'ফ\'ন ব্য়ৱহাৰ কৰি আছে।" "এই এপটো আপোনাৰ স্ক্ৰীণত থকা অন্য় এপৰ ওপৰত প্ৰদৰ্শিত হৈ আছে।" @@ -900,7 +908,8 @@ "অনুমতি দিয়ক" "অস্বীকাৰ কৰক" "বেটাৰি সঞ্চয়কাৰীৰ সময়সূচী সক্ৰিয় কৰিবলৈ টিপক" - "বেটাৰিৰ চ্চাৰ্জ স্তৰ %d%% হওঁতে স্বয়ংক্ৰিয়ভাৱে অন কৰক" + + "নালাগে, ধন্যবাদ" "বেটাৰি সঞ্চয়কাৰীৰ সময়সূচী অন কৰা অৱস্থাত আছে" "বেটাৰি চ্চাৰ্জৰ স্তৰ %d%%তকৈ কম হোৱাৰ লগে লগে বেটাৰি সঞ্চয়কাৰী স্বয়ংক্ৰিয়ভাৱে অন হ’ব।" @@ -932,6 +941,5 @@ "শীৰ্ষৰ সোঁফালে নিয়ক" "বুটামটো বাওঁফালে নিয়ক" "তলৰ সোঁফালে নিয়ক" - - + "অগ্ৰাহ্য কৰক" diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 5fab3d679b89..f27bc4b4c8af 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -62,9 +62,12 @@ "USB debaq prosesinə icazə verilmir" "Hazırda bu cihaza daxil olmuş istifadəçi USB sazlama prosesini aktiv edə bilməz. Bu funksiyadan istifadə etmək üçün əsas istifadəçi hesaba daxil olmalıdır." "USB portu deaktiv edildi" - "USB portu cihazı maye və qırılmaqdan qorumaq üçün deaktiv edildiyinə görə heç bir aksesuar tapılmayacaq.\n\nUSB portu yenidən istifadə üçün təhlükəsiz olduqda bildiriş göndəriləcək." + + "Adapter və aksesuarları aşkarlamaq üçün USB portu aktiv edildi" "USB-ni aktiv edin" + + "Ekranı doldurmaq üçün yaxınlaşdır" "Ekranı doldurmaq üçün uzat" "Skrinşot" @@ -118,6 +121,11 @@ "Ləğv et" "Təsdiq" "Yenidən cəhd edin" + "Region boşdur, identifikasiyanı ləğv etmək üçün toxunun" + "Yenidən cəhd edin" + "Üzünüz axtarılır" + "Üz doğrulandı" + "Təsdiqləndi" "Barmaq izi sensoruna klikləyin" "Barmaq izi ikonası" "Siz axtarılırsınız…" @@ -369,8 +377,7 @@ "%s olduqda aktiv ediləcək" "%s vaxtına qədər" "Tünd Tema" - - + "Tünd Tema\nEnerjiyə Qənaət" "NFC" "NFC deaktiv edilib" "NFC aktiv edilib" @@ -445,13 +452,16 @@ "Batareya Qənaəti aktivdir" "Performansı azaldır və arxa fon datasını məhdudlaşdırır" "Batareya Qənaətini deaktiv edin" - "Qeydə alarkən və ya yayımlayarkən %s oxutduğunuz audio, parollar, ödəniş məlumatı, foto və mesajlar kimi mühüm məlumatı əldə edə bilər." + "Qeydə alarkən və ya yayımlayarkən %s audio, parollar, ödəniş məlumatı, foto və mesajlar daxil olmaqla ekranda göstərilən və ya cihazdan oxudulan həssas məlumatıı əldə edə bilər." + "Qeydə alarkən və ya yayımlayarkən bu funksiyanı təmin edən xidmət audio, parollar, ödəniş məlumatı, foto və mesajlar daxil olmaqla ekranda göstərilən və ya cihazdan oxudulan həssas məlumatıı əldə edə bilər." "Yayım/qeydə alma zamanı həssas məlumatın paylaşılması" "Daha göstərmə" "Hamısını silin" "İdarə edin" - "Daha az əhəmiyyətli bildirişlər" - "Az əhəmiyyətli bildirişlərin hamısını silin" + + + + "Bildirişlər \"Narahat Etməyin\" rejimi tərəfindən dayandırıldı" "İndi başlayın" "Heç bir bildiriş yoxdur" @@ -635,9 +645,11 @@ "Blok edin" "Göstərməyə davam edin" "Kiçildin" - "Sakit" + + "Səssiz göstərilsin" - "Narahatedici" + + "Xəbərdarlıq göndərməyə davam edin" "Bildirişləri deaktiv edin" "Bu tətbiqin bildirişləri göstərilməyə davam edilsin?" @@ -651,10 +663,8 @@ "Bu bildirişlər dəyişdirilə bilməz." "Bu bildiriş qrupunu burada konfiqurasiya etmək olmaz" "Proksi bildirişi" - - - - + "Bütün %1$s bildirişləri" + "Ətraflı məlumat" "Bu tətbiq kameradan istifadə edir." "Bu tətbiq mikrofondan istifadə edir." "Bu tətbiqdə ekranda digər tətbiqlərin üzərində göstərilir." @@ -898,7 +908,8 @@ "İcazə verin" "Rədd edin" "Batareya Qənaətini planlaşdırmaq üçün klikləyin" - "Batareya %d%% olduqda avtomatik aktiv edin" + + "Xeyr, təşəkkür" "Batareya Qənaəti aktivdir" "Batareya %d%%-dən aşağı düşdükdə Batareya Qənaəti avtomatik aktiv ediləcək." @@ -930,6 +941,5 @@ "Yuxarıya sağa köçürün" "Aşağıya sola köçürün" "Aşağıya sağa köçürün" - - + "Kənarlaşdırın" diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 421fc7608553..afe84d00a47b 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -62,9 +62,12 @@ "Otklanjanje grešaka na USB-u nije dozvoljeno" "Korisnik koji je trenutno prijavljen na ovaj uređaj ne može da uključi otklanjanje grešaka na USB-u. Da biste koristili ovu funkciju, prebacite na primarnog korisnika." "USB port je onemogućen" - "Da bi se uređaj zaštitio od tečnosti ili nečistoće, USB port je onemogućen i neće otkrivati dodatnu opremu.\n\nObavestićemo vas kada ponovo budete mogli da koristite USB port." + + "USB port je omogućen radi otkrivanja punjača i dodatne opreme" "Omogući USB" + + "Zumiraj na celom ekranu" "Razvuci na ceo ekran" "Snimak ekrana" @@ -118,6 +121,11 @@ "Otkaži" "Potvrdi" "Probaj ponovo" + "Prazna oblast, dodirnite da biste otkazali potvrdu identiteta" + "Probajte ponovo" + "Traži se vaše lice" + "Lice je potvrđeno" + "Potvrđeno" "Dodirnite senzor za otisak prsta" "Ikona otiska prsta" "Tražimo vas…" @@ -371,8 +379,7 @@ "Uključuje se u %s" "Do %s" "Tamna tema" - - + "Tamna tema\nUšteda baterije" "NFC" "NFC je onemogućen" "NFC je omogućen" @@ -448,13 +455,16 @@ "Ušteda baterije je uključena" "Smanjuje performanse i pozadinske podatke" "Isključi Uštedu baterije" - "Kada snimate ili prebacujete, %s može da čuva osetljive informacije, kao što su zvuk koji reprodukujete i lozinke, informacije o plaćanju, slike i poruke." + "Kada snimate ili prebacujete, %s može da čuva osetljive informacije koje se prikazuju na ekranu ili reprodukuju sa uređaja, uključujući osetljive informacije kao što su zvuk, lozinke, informacije o plaćanju, slike i poruke." + "Kada snimate ili prebacujete, usluga koja pruža ovu funkciju može da čuva osetljive informacije koje se prikazuju na ekranu ili reprodukuju sa uređaja, uključujući osetljive informacije kao što su zvuk, lozinke, informacije o plaćanju, slike i poruke." "Otkrivanje osetljivih informacija tokom prebacivanja/snimanja" "Ne prikazuj ponovo" "Obriši sve" "Upravljajte" - "Diskretna obaveštenja" - "Obrišite sva diskretna obaveštenja" + + + + "Obaveštenja su pauzirana režimom Ne uznemiravaj" "Započni odmah" "Nema obaveštenja" @@ -638,9 +648,11 @@ "Blokiraj" "Nastavi da prikazuješ" "Umanji" - "Diskretno" + + "Ne uključuj zvuk" - "Ometajuća" + + "Nastavi sa obaveštenjima" "Isključi obaveštenja" "Želite li da se obaveštenja iz ove aplikacije i dalje prikazuju?" @@ -654,10 +666,8 @@ "Ova obaveštenja ne mogu da se menjaju." "Ova grupa obaveštenja ne može da se konfiguriše ovde" "Obaveštenje preko proksija" - - - - + "Sva obaveštenja aplikacije %1$s" + "Prikaži još" "Ova aplikacija koristi kameru." "Ova aplikacija koristi mikrofon." "Ova aplikacija se prikazuje preko drugih aplikacija na ekranu." @@ -903,7 +913,8 @@ "Dozvoli" "Odbij" "Dodirnite da biste napravili raspored za uštedu baterije" - "Uključuje se automatski kada je baterija na %d%%" + + "Ne, hvala" "Raspored za uštedu baterije je uključen" "Ušteda baterije će se automatski uključivati kada baterija padne ispod %d%%." @@ -935,6 +946,5 @@ "Premesti gore desno" "Premesti dole levo" "Premesti dole desno" - - + "Odbaci" diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 0da78b693b6e..4c459f2d0964 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -62,9 +62,12 @@ "Адладка USB не дапускаецца" "Карыстальнік, які зараз увайшоў у гэту прыладу, не можа ўключыць адладку USB. Каб выкарыстоўваць гэту функцыю, пераключыцеся на асноўнага карыстальніка." "Порт USB адключаны" - "Порт USB адключаны для аховы прылады ад вадкасці і смецця і не будзе выяўляць аксесуары.\n\nКалі можна будзе зноў бяспечна выкарыстоўваць порт USB, вы атрымаеце апавяшчэнне." + + "USB-порту дазволена вызначаць зарадныя прылады і аксесуары" "Уключыць USB" + + "Павял. на ўвесь экран" "Расцягн. на ўвесь экран" "Здымак экрана" @@ -118,6 +121,11 @@ "Скасаваць" "Пацвердзіць" "Паўтарыць спробу" + "Пустая вобласць. Націсніце, каб скасаваць аўтэнтыфікацыю" + "Паўтарыце спробу" + "Ідзе пошук твару" + "Твар распазнаны" + "Пацверджана" "Дакраніцеся да сканера адбіткаў пальцаў" "Значок адбіткаў пальцаў" "Ідзе пошук вашага твару…" @@ -375,8 +383,7 @@ "Уключыць у %s" "Да %s" "Цёмная тэма" - - + "Цёмная тэма\nЭканомія зараду" "NFC" "NFC адключаны" "NFC уключаны" @@ -453,13 +460,16 @@ "Рэжым эканоміі зараду ўключаны" "Памяншае прадукцыйнасць і фонавую перадачу даных" "Адключыць рэжым эканоміі зараду" - "Падчас запісу ці трансляцыі %s можа збіраць канфідэнцыяльную інфармацыю, напрыклад аўдыяданыя, паролі, фота, паведамленні і звесткі пра аплату." + "Падчас запісу ці трансляцыі %s можа збіраць канфідэнцыяльную інфармацыю, адлюстраваную на экране вашай прылады, ці тую, якая прайграецца праз вашу прыладу, напрыклад аўдыяданыя, паролі, фота, паведамленні і звесткі пра аплату." + "Падчас запісу ці трансляцыі служба, якая забяспечвае работу гэтай функцыі, можа збіраць канфідэнцыяльную інфармацыю, адлюстраваную на экране вашай прылады, ці тую, якая прайграецца праз вашу прыладу, напрыклад аўдыяданыя, паролі, фота, паведамленні і звесткі пра аплату." "Выкарыстанне асабістай інфармацыі падчас трансляцыі і запісу" "Не паказваць зноў" "Ачысціць усё" "Кіраваць" - "Апавяшчэнні ў ціхім рэжыме" - "Выдаліць усе апавяшчэнні ў ціхім рэжыме" + + + + "Паказ апавяшчэнняў прыпынены ў рэжыме \"Не турбаваць\"" "Пачаць зараз" "Апавяшчэнняў няма" @@ -643,9 +653,11 @@ "Заблакіраваць" "Працягваць паказваць" "Згарнуць" - "Ціхі рэжым" + + "Не ўключаць гук" - "Рэжым перапынення" + + "Апавяшчаць далей" "Выключыць апавяшчэнні" "Працягваць паказваць апавяшчэнні гэтай праграмы?" @@ -659,10 +671,8 @@ "Гэтыя апавяшчэнні нельга змяніць." "Тут канфігурыраваць гэту групу апавяшчэнняў забаронена" "Праксіраванае апавяшчэнне" - - - - + "Усе апавяшчэнні праграмы \"%1$s\"" + "Разгарнуць" "Гэта праграма выкарыстоўвае камеру." "Гэта праграма выкарыстоўвае мікрафон." "Гэта праграма паказваецца на экране паверх іншых праграм." @@ -910,7 +920,8 @@ "Дазволіць" "Адмовіць" "Націсніце, каб уключыць рэжым эканоміі зараду" - "Уключаць аўтаматычна пры ўзроўні зараду акумулятара %d%%" + + "Не, дзякуй" "Уключаны рэжым эканоміі зараду" "Калі ўзровень зараду акумулятара знізіцца да %d%%, аўтаматычна ўключыцца рэжым эканоміі энергіі." @@ -942,6 +953,5 @@ "Перамясціце правей і вышэй" "Перамясціць лявей і ніжэй" "Перамясціць правей і ніжэй" - - + "Адхіліць" diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 40148d4a8bea..ee07f5dab29a 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -62,9 +62,12 @@ "Отстраняването на грешки през USB не е разрешено" "Потребителят, който понастоящем е влязъл в това устройство, не може да включи функцията за отстраняване на грешки през USB. За да я използвате, превключете към основния потребител." "USB портът е деактивиран" - "С цел защита на устройството ви от течности и замърсяване USB портът ще бъде деактивиран и няма да открива аксесоари.\n\nЩе получите известие, когато е безопасно отново да използвате USB порта." + + "USB портът може да разпознава зарядни устройства и аксесоари" "Активиране на USB" + + "Мащаб – запълва екрана" "Разпъване – запълва екрана" "Екранна снимка" @@ -118,6 +121,11 @@ "Отказ" "Потвърждаване" "Нов опит" + "Празна област. Докоснете, за да анулирате удостоверяването" + "Моля, опитайте отново" + "Лицето ви се търси" + "Лицето е удостоверено" + "Потвърдено" "Докоснете сензора за отпечатъци" "Икона за отпечатък" "Търсим ви…" @@ -369,8 +377,7 @@ "Ще се включи в %s" "До %s" "Тъмна тема" - - + "Тъмна тема\nРежим за запазв. на батерията" "КБП" "КБП е деактивирана" "КБП е активирана" @@ -445,13 +452,16 @@ "Режимът за запазване на батерията е включен" "Намалява ефективността и данните на заден план" "Изключване на режима за запазване на батерията" - "Докато записва или предава, %s може да прихване поверителна информация, като например слушан от вас аудиозапис и вашите пароли, данни за плащане, снимки и съобщения." + "Докато записва или предава, %s може да прихване поверителна информация, която е показана на екрана ви или възпроизвеждана от устройството ви, включително поверителна информация, като например аудиозапис, пароли, данни за плащане, снимки и съобщения." + "Докато записва или предава, услугата, предоставяща тази функция, може да прихване поверителна информация, която е показана на екрана ви или възпроизвеждана от устройството ви, включително поверителна информация, като например аудиозапис, пароли, данни за плащане, снимки и съобщения." "Разкриване на поверителна информация по време на предаване/записване" "Да не се показва отново" "Изчистване на всички" "Управление" - "Ненатрапчиви известия" - "Изчистване на всички ненатрапчиви известия" + + + + "Известията са поставени на пауза от режима „Не безпокойте“" "Стартиране сега" "Няма известия" @@ -635,9 +645,11 @@ "Блокиране" "Да продължат да се показват" "Намаляване" - "Деликатни сигнали" + + "Показване на известията без звук" - "Прекъсващи сигнали" + + "Продължаване на сигнализирането" "Изключване на известията" "Да продължат ли да се показват известията от това приложение?" @@ -651,10 +663,8 @@ "Тези известия не могат да бъдат променяни." "Тази група от известия не може да бъде конфигурирана тук" "Известие, получено чрез делегиране" - - - - + "Всички известия от %1$s" + "Вижте още" "Това приложение използва камерата." "Това приложение използва микрофона." "Това приложение се показва върху други приложения на екрана." @@ -898,7 +908,8 @@ "Разрешаване" "Отказ" "Докоснете, за да активирате автоматичния режим за запазване на батерията" - "Автоматично включване при %d%% заряд на батерията" + + "Не, благодаря" "Включен е автоматичен режим за запазване на батерията" "Режимът за запазване на батерията ще се включи автоматично, след като нивото й премине под %d%%." @@ -930,6 +941,5 @@ "Преместване горе вдясно" "Преместване долу вляво" "Преместване долу вдясно" - - + "Отхвърляне" diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 56bb9e7b6fd5..c04093ae504a 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -44,7 +44,7 @@ "স্বতঃ" "বিজ্ঞপ্তি" "ব্লুটুথ টিথার করা হয়েছে" - "ইনপুট পদ্ধতিগুলি সেট আপ করুন" + "ইনপুট পদ্ধতিগুলি সেট-আপ করুন" "ফিজিক্যাল কীবোর্ড" "%1$s কে %2$s অ্যাক্সেস করতে দেবেন?" "%1$s কে %2$s অ্যাক্সেস করতে দেবেন?" @@ -62,9 +62,12 @@ "USB ডিবাগিং অনুমোদিত নয়" "ব্যবহারকারী এখন এই ডিভাইসে সাইন-ইন করেছেন তাই USB ডিবাগিং চালু করা যাবে না। এই বৈশিষ্ট্যটি ব্যবহার করতে, প্রাথমিক ব্যবহারকারীতে পাল্টে নিন।" "ইউএসবি পোর্ট বন্ধ করা হয়েছে" - "কোনও তরল পদার্থ এবং ধুলো কণা থেকে আপনার ডিভাইসকে সুরক্ষিত করতে, ইউএসবি পোর্ট বন্ধ করা হবে এবং কোনও অ্যাক্সেসরির শনাক্ত করবে না।\n\nযখন ইউএসবি পোর্ট ব্যবহার করা নিরাপদ হবে তখন আপনাকে জানানো হবে।" + + "চার্জার ও আনুষঙ্গিক আইটেম শনাক্ত করার জন্য ইউএসবি চালু করা হয়েছে" "ইউএসবি চালু করুন" + + "স্ক্রীণ পূরণ করতে জুম করুন" "ফুল স্ক্রিন করুন" "স্ক্রিনশট নিন" @@ -118,6 +121,11 @@ "বাতিল করুন" "কনফার্ম করুন" "আবার চেষ্টা করুন" + "জায়গাটি খালি, যাচাইকরণ বাতিল করতে এখানে ট্যাপ করুন" + "আবার চেষ্টা করুন" + "আপনার ফেস খোঁজা হচ্ছে" + "ফেস যাচাই করা হয়েছে" + "কনফার্ম করা হয়েছে" "আঙ্গুলের ছাপের সেন্সর স্পর্শ করুন" "আঙ্গুলের ছাপের আইকন" "আপনার জন্য খোঁজা হচ্ছে…" @@ -369,8 +377,7 @@ "%s এ চালু হবে" "%s পর্যন্ত" "গাঢ় থিম" - - + "গাঢ় থিম\nব্যাটারি সেভার" "NFC" "NFC অক্ষম করা আছে" "NFC সক্ষম করা আছে" @@ -433,7 +440,7 @@ "বর্তমান ব্যবহারকারীকে লগ-আউট করুন" "ব্যবহারকারীকে লগ-আউট করুন" "নতুন ব্যবহারকারীকে যোগ করবেন?" - "আপনি একজন নতুন ব্যবহারকারী যোগ করলে তাকে তার জায়গা সেট আপ করে নিতে হবে৷\n\nযেকোনো ব্যবহারকারী অন্য সব ব্যবহারকারীর জন্য অ্যাপ্লিকেশান আপডেট করতে পারবেন৷" + "আপনি একজন নতুন ব্যবহারকারী যোগ করলে তাকে তার জায়গা সেট-আপ করে নিতে হবে৷\n\nযেকোনো ব্যবহারকারী অন্য সব ব্যবহারকারীর জন্য অ্যাপ্লিকেশান আপডেট করতে পারবেন৷" "আর কোনও প্রোফাইল যোগ করা যাবে না" আপনি %d জন পর্যন্ত ব্যবহারকারীর প্রোফাইল যোগ করতে পারেন। @@ -445,13 +452,16 @@ "ব্যাটারি সেভার চালু আছে" "কার্য-সম্পাদনা ও পশ্চাদপট ডেটাকে কমিয়ে দেয়" "ব্যাটারি সেভার বন্ধ করুন" - "রেকর্ড বা কাস্ট করার সময় আপনি চালাচ্ছেন এমন অডিও, আপনার পাসওয়ার্ড, পেমেন্টের তথ্য, ফটো ও মেসেজের মতো ব্যক্তিগত তথ্য %s ক্যাপচার করতে পারে।" + "রেকর্ডিং বা কাস্টিংয়ের সময়, %s আপনার স্ক্রিনে প্রদর্শিত বা ডিভাইস থেকে অডিও, পাসওয়ার্ড, পেমেন্টের তথ্য, ফটো এবং মেসেজের মতো যেকোনও সংবেদনশীল তথ্য ক্যাপচার করতে পারে।" + "রেকর্ডিং বা কাস্টিংয়ের সময়, এই ফাংশন সরবরাহকারী পরিষেবা আপনার স্ক্রিনে প্রদর্শিত বা ডিভাইস থেকে অডিও, পাসওয়ার্ড, পেমেন্টের তথ্য, ফটো এবং মেসেজের মতো যেকোনও সংবেদনশীল তথ্য ক্যাপচার করতে পারে।" "কাস্ট/রেকর্ড করার সময় সংবেদনশীল তথ্য প্রকাশ করে" "আর দেখাবেন না" "সবকিছু সাফ করুন" "পরিচালনা করুন" - "সাইলেন্ট মোডের বিজ্ঞপ্তি" - "সাইলেন্ট মোডের বিজ্ঞপ্তি মুছুন" + + + + "\'বিরক্ত করবেন না\' দিয়ে বিজ্ঞপ্তি পজ করা হয়েছে" "এখন শুরু করুন" "কোনো বিজ্ঞপ্তি নেই" @@ -503,7 +513,7 @@ " " "বিশ্বস্ত শংসাপত্রগুলি খুলুন" "আপনার প্রশাসক নেটওয়ার্ক লগিং চালু করেছেন, যা আপনার ডিভাইসের ট্রাফিক নিরীক্ষণ করে।\n\nআরও তথ্যের জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন।" - "আপনি VPN সংযোগ সেট আপ করার জন্য একটি অ্যাপ্লিকেশানকে অনুমতি দিন৷\n\nএই অ্যাপ্লিকেশানটি ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার ডিভাইস এবং নেটওয়ার্কের অ্যাক্টিভিটি নিরীক্ষণ করতে পারে।" + "আপনি VPN সংযোগ সেট-আপ করার জন্য একটি অ্যাপ্লিকেশানকে অনুমতি দিন৷\n\nএই অ্যাপ্লিকেশানটি ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার ডিভাইস এবং নেটওয়ার্কের অ্যাক্টিভিটি নিরীক্ষণ করতে পারে।" "আপনার কর্মস্থলের প্রোফাইলটি %1$s দ্বারা পরিচালিত হয়।\n\nআপনার প্রশাসক আপনার ইমেল, অ্যাপ্স ও ওয়েবসাইট সহ কর্মস্থলের নেটওয়ার্ক অ্যাক্টিভিটি নিরীক্ষণ করতে পারেন।\n\nআরও তথ্যের জন্য আপনার প্রশাসকের সঙ্গে যোগাযোগ করুন।\n\nএছাড়া আপনি একটি VPN এর সাথেও সংযুক্ত যা আপনার নেটওয়ার্ক অ্যাক্টিভিটি নিরীক্ষণ করতে পারে।" "VPN" "আপনি %1$s এর সাথে সংযুক্ত রয়েছেন, যেটি ইমেল, অ্যাপ, এবং ওয়েবসাইট সহ আপনার নেটওয়ার্ক কার্যকলাপে নজর রাখতে পারে৷" @@ -516,7 +526,7 @@ "বিজ্ঞপ্তিগুলি আরও দ্রুত পান" "আপনি আনলক করার আগে ওগুলো দেখুন" "না থাক" - "সেট আপ" + "সেট-আপ" "%1$s. %2$s" "এখনই বন্ধ করুন" "সাউন্ড সেটিংস" @@ -635,9 +645,11 @@ "ব্লক করুন" "দেখতে থাকুন" "ছোট করে দিন" - "সাইলেন্ট মোডে" + + "বিজ্ঞপ্তি মিউট করুন" - "বিরক্তিকর" + + "বিজ্ঞপ্তি পান" "বিজ্ঞপ্তি বন্ধ করুন" "এই অ্যাপের বিজ্ঞপ্তি পরেও দেখে যেতে চান?" @@ -651,10 +663,8 @@ "এই বিজ্ঞপ্তিগুলি পরিবর্তন করা যাবে না।" "এই সমস্ত বিজ্ঞপ্তিকে এখানে কনফিগার করা যাবে না" "প্রক্সি করা বিজ্ঞপ্তি" - - - - + "%1$s সংক্রান্ত সমস্ত বিজ্ঞপ্তি" + "আরও দেখুন" "এই অ্যাপটি ক্যামেরা ব্যবহার করছে।" "এই অ্যাপটি মাইক্রোফোন ব্যবহার করছে।" "এই অ্যাপটি স্ক্রিনে অন্যান্য অ্যাপের উপরে দেখানো হচ্ছে।" @@ -898,7 +908,8 @@ "অনুমতি দিন" "খারিজ করুন" "ব্যাটারি সেভার চালু হওয়ার সময় সেট করতে ট্যাপ করুন" - "চার্জ %d%% হয়ে গেলে নিজে থেকে চালু হতে দিন" + + "না থাক" "আগে সেট করা সময় অনুযায়ী ব্যাটারি সেভার চালু হয়েছে" "চার্জ %d%%-এর নিচে চলে গেলে ব্যাটারি সেভার নিজে থেকেই চালু হয়ে যাবে।" @@ -930,6 +941,5 @@ "উপরে ডানদিকে সরান" "নিচে বাঁদিকে সরান" "নিচে ডান দিকে সরান" - - + "খারিজ করুন" diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 443e64766798..e0ef1bd1166b 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -62,9 +62,12 @@ "Otklanjanje grešaka putem uređaja spojenog na USB nije dozvoljeno" "Korisnik koji je trenutno prijavljen na ovaj uređaj ne može uključiti opciju za otklanjanje grešaka koristeći USB. Da koristite tu funkciju, prebacite se na primarnog korisnika." "USB priključak je onemogućen" - "USB priključak je onemogućen kako bi se vaš uređaj zaštitio od tečnosti i nečistoća i neće detektirati priključene uređaje.\n\nDobit ćete obavještenje kada ponovo bude sigurno koristiti USB priključak." + + "USB priključak je omogućen za prepoznavanje punjača i pribora" "Omogući USB" + + "Uvećaj prikaz na ekran" "Razvuci prikaz na ekran" "Snimak ekrana" @@ -118,6 +121,11 @@ "Otkaži" "Potvrdite" "Pokušaj ponovo" + "Područje je prazno. Dodirnite da otkažete autentifikaciju." + "Pokušajte ponovo" + "Traženje vašeg lica" + "Lice je provjereno" + "Potvrđeno" "Dodirnite senzor za otisak prsta" "Ikona za otisak prsta" "Tražimo vas…" @@ -371,8 +379,7 @@ "Uključuje se u %s" "Do %s" "Tamna tema" - - + "Tamna tema\nUšteda baterije" "NFC" "NFC je onemogućen" "NFC je omogućen" @@ -448,13 +455,16 @@ "Uključena je Ušteda baterije" "Minimizira rad i prijenos podataka u pozadini" "Isključi Uštedu baterije" - "Prilikom snimanja ili emitiranja, aplikacija %s može snimiti sve osjetljive podatke, kao što su to zvuk koji reproducirate i vaše lozinke, podaci o plaćanju, fotografije i poruke." + "Prilikom snimanja ili emitiranja aplikacija %s može snimiti sve osjetljive podatke koji se prikazuju na vašem ekranu ili koji se reproduciraju s vašeg uređaja, uključujući i osjetljive podatke kao što su zvuk, lozinke, podaci za plaćanje, fotografije i poruke." + "Prilikom snimanja ili emitiranja usluga koja pruža ovu funkciju može snimati osjetljive podatke koji se prikazuju na vašem ekranu ili koji se reproduciraju s vašeg uređaja, uključujući i osjetljive podatke kao što su zvuk, lozinke, podaci za plaćanje, fotografije i poruke." "Izlaganje osjetljivih podataka za vrijeme emitiranja/snimanja" "Ne prikazuj opet" "Očisti sve" "Upravljaj" - "Diskretna obavještenja" - "Obriši sva diskretna obavještenja" + + + + "Obavještenja su pauzirana načinom rada Ne ometaj" "Započni odmah" "Nema obavještenja" @@ -640,9 +650,11 @@ "Blokiraj" "Nastavi prikazivanje" "Minimiziraj" - "Diskretna" + + "Ostani u nečujnom načinu rada" - "Ometajuća" + + "Nastavi upozoravati" "Isključi obavještenja" "Nastaviti prikazivanje obavještenja iz ove aplikacije?" @@ -656,10 +668,8 @@ "Ta obavještenja se ne mogu izmijeniti." "Ovdje nije moguće konfigurirati ovu grupu obavještenja" "Obavještenje preko proksi servera" - - - - + "Sva obavještenja aplikacije %1$s" + "Prikaži više" "Ova aplikacija koristi kameru." "Ova aplikacija koristi mikrofon." "Ova aplikacija prekriva druge aplikacije na ekranu." @@ -905,7 +915,8 @@ "Dozvoli" "Odbij" "Dodirnite da zakažete Uštedu baterije" - "Automatski se uključuje kada je baterija ispod %d%%" + + "Ne, hvala" "Zakazivanje Uštede baterije je uključeno" "Kada je baterija ispod %d%%, Ušteda baterije se automatski uključuje." @@ -937,6 +948,5 @@ "Pomjerite gore desno" "Pomjeri dolje lijevo" "Pomjerite dolje desno" - - + "Odbaci" diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index a4f6fb4d1996..19be8295d735 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -62,9 +62,12 @@ "No es permet la depuració per USB" "L\'usuari que té iniciada la sessió al dispositiu en aquest moment no pot activar la depuració per USB. Per utilitzar aquesta funció, cal canviar a l\'usuari principal." "El port USB està desactivat" - "Per protegir el teu dispositiu dels líquids o la pols, el port USB s\'ha desactivat i no detectarà cap accessori.\n\nRebràs una notificació quan sigui segur utilitzar-lo." + + "S\'ha activat el port USB per detectar carregadors i accessoris" "Activa l\'USB" + + "Zoom per omplir pantalla" "Estira per omplir pant." "Captura de pantalla" @@ -118,6 +121,11 @@ "Cancel·la" "Confirma" "Torna-ho a provar" + "Zona buida; toca per cancel·lar l\'autenticació" + "Torna-ho a provar" + "S\'està cercant la teva cara" + "Cara autenticada" + "Confirmat" "Toca el sensor d\'empremtes digitals" "Icona d\'empremta digital" "S\'està cercant la teva cara…" @@ -369,8 +377,7 @@ "S\'activarà a les %s" "Fins a les %s" "Tema fosc" - - + "Tema fosc\nEstalvi de bateria" "NFC" "L\'NFC està desactivada" "L\'NFC està activada" @@ -445,13 +452,16 @@ "S\'ha activat l\'estalvi de bateria" "Redueix el rendiment i l\'ús de les dades en segon pla." "Desactiva l\'estalvi de bateria" - "Quan graves o emets vídeos, %s pot capturar informació sensible, com ara l\'àudio que estiguis reproduint, contrasenyes, dades de pagament, fotos i missatges." + "Quan graves o emets contingut, %s pot capturar la informació sensible que es mostri a la pantalla o que reprodueixi el dispositiu, com ara àudio, contrasenyes, informació de pagament, fotos i missatges." + "Quan graves o emets contingut, el servei que ofereix aquesta funció pot capturar informació sensible que es mostri a la pantalla o que reprodueixi el dispositiu, com ara àudio, contrasenyes, informació de pagament, fotos i missatges." "Es mostra informació sensible durant l\'emissió o la gravació" "No ho tornis a mostrar" "Esborra-ho tot" "Gestió" - "Notificacions discretes" - "Esborra totes les notificacions discretes" + + + + "Notificacions pausades pel mode No molestis" "Comença ara" "Cap notificació" @@ -635,26 +645,26 @@ "Bloqueja" "Continua rebent" "Minimitza" - "En silenci" + + "Continua silenciant" - "Emergents" + + "Continua avisant-me" "Desactiva les notificacions" "Vols continuar rebent notificacions d\'aquesta aplicació?" "Discreta" "Prioritàries" "T\'ajuda a concentrar-te perquè les notificacions només es mostren a l\'àrea desplegable. Sempre en silenci." - "Es mostra a sota de les notificacions prioritàries. Sempre en silenci." - "Es mostra a sota de les notificacions prioritàries. Sempre en silenci." - "Es mostra a sota de les notificacions prioritàries. Sempre en silenci." - "Atrau la teva atenció amb un so i una icona a la barra d\'estat. Es mostra a la pantalla de bloqueig." + "Es mostren a sota de les notificacions prioritàries. Sempre silencioses." + "Es mostren a sota de les notificacions prioritàries. Sempre silencioses." + "Es mostren a sota de les notificacions prioritàries. Sempre silencioses." + "Atrauen la teva atenció amb un so i una icona a la barra d\'estat. Es mostren a la pantalla de bloqueig." "Aquestes notificacions no es poden modificar." "Aquest grup de notificacions no es pot configurar aquí" "Notificació mitjançant aplicació intermediària" - - - - + "Totes les notificacions de l\'aplicació %1$s" + "Mostra\'n més" "Aquesta aplicació utilitza la càmera." "Aquesta aplicació utilitza el micròfon." "Aquesta aplicació es mostra sobre altres aplicacions a la pantalla." @@ -898,7 +908,8 @@ "Permet" "Denega" "Toca per programar l\'estalvi de bateria" - "Activa automàticament quan el nivell de bateria sigui del %d%%" + + "No" "S\'ha activat la programació de l\'estalvi de bateria" "L\'estalvi de bateria s\'activarà automàticament quan el nivell de bateria sigui inferior al %d%%." @@ -930,6 +941,5 @@ "Mou a dalt a la dreta" "Mou a baix a l\'esquerra" "Mou a baix a la dreta" - - + "Omet" diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 9b2684fdbc9c..266ba15cec9e 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -62,9 +62,12 @@ "Ladění přes USB není povoleno" "Uživatel aktuálně přihlášený k tomuto zařízení nemůže zapnout ladění přes USB. Chcete-li tuto funkci použít, přepněte na primárního uživatele." "Port USB je deaktivován" - "Kvůli ochraně vašeho zařízení před tekutinami a nečistotami je port USB zakázán a nerozpozná žádné příslušenství.\n\nAž bude opět bezpečné port USB použít, budeme vás informovat." + + "Port USB může zjišťovat nabíječky a příslušenství" "Aktivovat USB" + + "Přiblížit na celou obrazovku" "Na celou obrazovku" "Snímek obrazovky" @@ -118,6 +121,11 @@ "Zrušit" "Potvrdit" "Zkusit znovu" + "Prázdná oblast, klepnutím ověření zrušíte" + "Zkuste to prosím znovu" + "Vyhledávání obličeje" + "Obličej byl ověřen" + "Potvrzeno" "Dotkněte se snímače otisků prstů" "Ikona otisku prstu" "Hledáme vás…" @@ -373,8 +381,7 @@ "Zapnout v %s" "Do %s" "Tmavé téma" - - + "Tmavý motiv\nSpořič baterie" "NFC" "NFC je vypnuto" "NFC je zapnuto" @@ -451,13 +458,16 @@ "Spořič baterie je zapnutý" "Omezuje výkon a data na pozadí" "Vypnout spořič baterie" - "Při nahrávání nebo odesílání může %s zachytit citlivé údaje, např. přehrávanou hudbu, zadávaná hesla a platební údaje, fotky nebo zprávy." + "Při nahrávání nebo odesílání může aplikace %s zachytit citlivé údaje zobrazené na obrazovce nebo přehrávané ze zařízení, např. zvuky, hesla, platební údaje, fotky a zprávy." + "Při nahrávání nebo odesílání může služba poskytující tuto funkci zachytit citlivé údaje zobrazené na obrazovce nebo přehrávané ze zařízení, např. zvuky, hesla, platební údaje, fotky a zprávy." "Zobrazení citlivých údajů při nahrávání/odesílání" "Tuto zprávu příště nezobrazovat" "Smazat vše" "Spravovat" - "Vlídná oznámení" - "Vymazat všechna vlídná oznámení" + + + + "Oznámení jsou pozastavena režimem Nerušit" "Spustit" "Žádná oznámení" @@ -641,9 +651,11 @@ "Blokovat" "Nadále zobrazovat" "Minimalizovat" - "Nenápadná" + + "Nadále bez zvuku" - "Rušivá" + + "Dál upozorňovat" "Vypnout oznámení" "Mají se oznámení z této aplikace nadále zobrazovat?" @@ -657,10 +669,8 @@ "Tato oznámení nelze upravit." "Tuto skupinu oznámení tady nelze nakonfigurovat" "Zprostředkované oznámení" - - - - + "Všechna oznámení aplikace %1$s" + "Zobrazit další" "Tato aplikace využívá fotoaparát." "Tato aplikace využívá mikrofon." "Tato aplikace se zobrazuje přes ostatní aplikace na obrazovce." @@ -908,7 +918,8 @@ "Povolit" "Zamítnout" "Klepnutím naplánujete aktivování spořiče baterie" - "Aktivovat automaticky, když baterie klesne pod %d %%" + + "Ne, díky" "Plánované aktivování spořiče baterie je zapnuté" "Spořič baterie se automaticky aktivuje, jakmile baterie klesne pod %d %%." @@ -940,6 +951,5 @@ "Přesunout vpravo nahoru" "Přesunout vlevo dolů" "Přesunout vpravo dolů" - - + "Zavřít" diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 61b9fff10542..0bf19bec7c25 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -62,9 +62,12 @@ "USB-fejlretning er ikke tilladt" "Den bruger, der i øjeblikket er logget ind på denne enhed, kan ikke aktivere USB-fejlretning. Skift til den primære bruger for at bruge denne funktion." "USB-porten er deaktiveret" - "USB-porten er blevet deaktiveret for at beskytte din enhed mod væske og snavs. Den kan derfor ikke registrere noget tilbehør.\n\nDu får besked, når det er sikkert at bruge USB-porten igen." + + "USB-porten er aktiveret for at registrere opladere og tilbehør" "Aktivér USB" + + "Zoom til fuld skærm" "Stræk til fuld skærm" "Screenshot" @@ -118,6 +121,11 @@ "Annuller" "Bekræft" "Prøv igen" + "Tomt område. Tryk for at annullere godkendelsen." + "Prøv igen" + "Søger efter dit ansigt" + "Ansigtet er godkendt" + "Bekræftet" "Sæt fingeren på fingeraftrykslæseren" "Ikon for fingeraftryk" "Forsøger at finde dig…" @@ -369,8 +377,7 @@ "Tænd kl. %s" "Indtil %s" "Mørkt tema" - - + "Mørkt tema\nBatterisparefunktion" "NFC" "NFC er deaktiveret" "NFC er aktiveret" @@ -445,13 +452,16 @@ "Batterisparefunktion er aktiveret" "Reducerer ydeevne og baggrundsdata" "Deaktiver batterisparefunktion" - "Mens der optages eller castes kan %s registrere alle følsomme oplysninger såsom lyd, som du afspiller, og dine adgangskoder, betalingsoplysninger, billeder og beskeder." - "Følsomme oplysninger vises, mens der castes/optages" + "Mens der optages eller castes, kan %s registrere alle følsomme oplysninger, der vises på din skærm eller afspilles på din enhed, f.eks. lyd, adgangskoder, betalingsoplysninger, billeder og beskeder." + "Mens der optages eller castes, kan den tjeneste, som leverer funktionen, registrere alle følsomme oplysninger, der vises på din skærm eller afspilles på din enhed, f.eks. lyd, adgangskoder, betalingsoplysninger, billeder og beskeder." + "Visning af følsomme oplysninger, mens der castes/optages" "Vis ikke igen" - "Ryd alt" + "Ryd alle" "Administrer" - "Diskrete underretninger" - "Ryd alle diskrete notifikationer" + + + + "Notifikationer er sat på pause af Forstyr ikke" "Start nu" "Ingen notifikationer" @@ -635,9 +645,11 @@ "Bloker" "Fortsæt med at vise notifikationer" "Minimer" - "Diskret" + + "Fortsæt med lydløse notifikationer" - "Forstyrrende" + + "Fortsæt med at underrette" "Deaktiver notifikationer" "Vil du fortsætte med at se notifikationer fra denne app?" @@ -651,10 +663,8 @@ "Disse notifikationer kan ikke redigeres." "Du kan ikke konfigurere denne gruppe notifikationer her" "Proxyforbundet notifikation" - - - - + "Alle %1$s-notifikationer" + "Se mere" "Denne app anvender kameraet." "Denne app anvender mikrofonen." "Denne app vises over andre apps på din skærm." @@ -898,7 +908,8 @@ "Tillad" "Afvis" "Tryk for at fastsætte en tidsplan for batterisparefunktionen" - "Aktivér automatisk, når batteriniveauet er på %d %%" + + "Nej tak" "Tidsplanen for batterisparefunktionen er aktiveret" "Batterisparefunktionen aktiveres automatisk, når batteriniveauet når under %d %%." @@ -930,6 +941,5 @@ "Flyt op til højre" "Flyt ned til venstre" "Flyt ned til højre" - - + "Afvis" diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 604a5760ed93..5c21ea3b9d61 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -62,9 +62,12 @@ "USB-Debugging nicht zulässig" "Der momentan auf diesem Gerät angemeldete Nutzer kann das USB-Debugging nicht aktivieren. Um diese Funktion verwenden zu können, wechsle zum primären Nutzer." "USB-Port deaktiviert" - "Zum Schutz deines Geräts vor Flüssigkeiten oder Fremdkörpern ist der USB-Port deaktiviert und erkennt kein Zubehör.\n\nDu wirst benachrichtigt, wenn der USB-Port wieder sicher verwendet werden kann." + + "Erkennung von Ladegeräten und Zubehör am USB-Port aktiviert" "USB aktivieren" + + "Zoom auf Bildschirmgröße" "Auf Bildschirmgröße anpassen" "Screenshot" @@ -118,6 +121,11 @@ "Abbrechen" "Bestätigen" "Noch einmal versuchen" + "Feld \"Region\" ist leer, zum Abbrechen der Authentifizierung tippen" + "Noch einmal versuchen" + "Nach deinem Gesicht wird gesucht" + "Gesicht authentifiziert" + "Bestätigt" "Berühre den Fingerabdrucksensor" "Fingerabdruck-Symbol" "Wir suchen nach dir…" @@ -373,8 +381,7 @@ "An um %s" "Bis %s" "Dunkles Design" - - + "Dunkles Design\nEnergiesparmodus" "NFC" "NFC ist deaktiviert" "NFC ist aktiviert" @@ -449,13 +456,16 @@ "Energiesparmodus ist aktiviert" "Reduzierung der Leistung und Hintergrunddaten" "Energiesparmodus deaktivieren" - "Beim Aufnehmen oder Streamen kann %s sensible Informationen wie beispielsweise wiedergegebenes Audio oder auch deine Passwörter, Zahlungsinformationen, Fotos und Nachrichten erfassen." - "Beim Streamen/Aufzeichnen werden sensible Daten zugänglich gemacht" + "Beim Aufnehmen oder Streamen kann %s vertrauliche Informationen erfassen, die auf deinem Bildschirm angezeigt oder von deinem Gerät wiedergegeben werden. Das können beispielsweise Audioinhalte, deine Passwörter, deine Zahlungsinformationen sowie Fotos und Nachrichten sein." + "Beim Aufnehmen oder Streamen kann der Dienst, der diese Funktion zur Verfügung stellt, vertrauliche Informationen erfassen, die auf deinem Bildschirm angezeigt oder von deinem Gerät wiedergegeben werden. Das können beispielsweise Audioinhalte, deine Passwörter, deine Zahlungsinformationen sowie Fotos und Nachrichten sein." + "Beim Streamen/Aufzeichnen werden vertrauliche Informationen zugänglich gemacht" "Nicht mehr anzeigen" "Alle löschen" "Verwalten" - "Stumme Benachrichtigungen" - "Alle stummen Benachrichtigungen löschen" + + + + "Benachrichtigungen durch \"Bitte nicht stören\" pausiert" "Jetzt starten" "Keine Benachrichtigungen" @@ -639,9 +649,11 @@ "Blockieren" "Weiterhin anzeigen" "Minimieren" - "Stumm" + + "Weiter lautlos bleiben" - "Pop-up" + + "Weiterhin Benachrichtigungen senden" "Benachrichtigungen deaktivieren" "Benachrichtigungen dieser App weiterhin anzeigen?" @@ -655,10 +667,8 @@ "Diese Benachrichtigungen können nicht geändert werden." "Die Benachrichtigungsgruppe kann hier nicht konfiguriert werden" "Weitergeleitete Benachrichtigung" - - - - + "Alle %1$s-Benachrichtigungen" + "Mehr" "Diese App verwendet die Kamera." "Diese App verwendet das Mikrofon." "Diese App wird über anderen Apps auf dem Bildschirm angezeigt." @@ -902,7 +912,8 @@ "Zulassen" "Ablehnen" "Tippen zum Planen des Energiesparmodus" - "Automatisch aktivieren bei einem Akkustand von %d %%" + + "Nein danke" "Geplanter Energiesparmodus aktiviert" "Der Energiesparmodus wird bei einem Akkustand von %d %% automatisch aktiviert." @@ -934,6 +945,5 @@ "Nach rechts oben verschieben" "Nach unten links verschieben" "Nach unten rechts verschieben" - - + "Schließen" diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 130934fc3c86..775f9b167b8b 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -62,9 +62,10 @@ "Δεν επιτρέπεται ο εντοπισμός σφαλμάτων USB" "Ο χρήστης που είναι συνδεδεμένος αυτήν τη στιγμή σε αυτήν τη συσκευή δεν μπορεί να ενεργοποιήσει τον εντοπισμό σφαλμάτων USB. Για να χρησιμοποιήσετε αυτήν τη λειτουργία, κάντε εναλλαγή στον κύριο χρήστη." "Η θύρα USB απενεργοποιήθηκε" - "Για την προστασία της συσκευής σας από υγρασία ή ακαθαρσίες, η θύρα USB έχει απενεργοποιηθεί και δεν θα εντοπίζει τυχόν αξεσουάρ.\n\nΘα ειδοποιηθείτε όταν μπορείτε να χρησιμοποιήσετε ξανά με ασφάλεια τη θύρα USB." + "Για την προστασία της συσκευής σας από υγρασία ή ακαθαρσίες, η θύρα USB έχει απενεργοποιηθεί και δεν θα εντοπίζει τυχόν αξεσουάρ.\n\nΘα ειδοποιηθείτε όταν θα μπορείτε να χρησιμοποιήσετε ξανά τη θύρα USB." "Η θύρα USB ενεργοποιήθηκε για τον εντοπισμό φορτιστών και αξεσουάρ" "Ενεργοποίηση USB" + "Μάθετε περισσότερα" "Ζουμ σε πλήρη οθόνη" "Προβoλή σε πλήρη οθ." "Στιγμιότυπο οθόνης" @@ -118,6 +119,11 @@ "Ακύρωση" "Επιβεβαίωση" "Δοκιμάστε ξανά" + "Κενή περιοχή, πατήστε για ακύρωση ελέγχου ταυτότητας" + "Δοκιμάστε ξανά" + "Αναζήτηση για το πρόσωπό σας" + "Έγινε έλεγχος ταυτότητας προσώπου" + "Επιβεβαιώθηκε" "Αγγίξτε τον αισθητήρα δακτυλικών αποτυπωμάτων" "Εικονίδιο δακτυλικών αποτυπωμάτων" "Αναζήτηση για εσάς…" @@ -369,8 +375,7 @@ "Ενεργοποίηση στις %s" "Έως τις %s" "Σκούρο θέμα" - - + "Σκούρο θέμα\nΕξοικονόμηση μπαταρίας" "NFC" "Το NFC είναι απενεργοποιημένο" "Το NFC είναι ενεργοποιημένο" @@ -445,13 +450,14 @@ "Η Εξοικονόμηση μπαταρίας είναι ενεργή" "Μειώνει την απόδοση και τα δεδομένα παρασκηνίου" "Απενεργοποίηση Εξοικονόμησης μπαταρίας" - "Κατά την εγγραφή ή τη μετάδοση, η εφαρμογή %s μπορεί να καταγράφει τυχόν ευαίσθητες πληροφορίες, όπως ήχο του οποίου γίνεται αναπαραγωγή και τους κωδικούς πρόσβασής σας, τα στοιχεία πληρωμής, τις φωτογραφίες και τα μηνύματα." + "Κατά την εγγραφή ή τη μετάδοση, η εφαρμογή %s μπορεί να καταγράφει τυχόν ευαίσθητες πληροφορίες που εμφανίζονται στην οθόνη σας ή των οποίων γίνεται αναπαραγωγή από τη συσκευή σας, συμπεριλαμβανομένων ευαίσθητων πληροφοριών όπως ήχος, κωδικοί πρόσβασης, στοιχεία πληρωμής, φωτογραφίες και μηνύματα." + "Κατά την εγγραφή ή τη μετάδοση, η υπηρεσία που παρέχει αυτήν τη λειτουργία μπορεί να καταγράφει τυχόν ευαίσθητες πληροφορίες που εμφανίζονται στην οθόνη σας ή των οποίων γίνεται αναπαραγωγή από τη συσκευή σας, συμπεριλαμβανομένων ευαίσθητων πληροφοριών όπως ήχος, κωδικοί πρόσβασης, στοιχεία πληρωμής, φωτογραφίες και μηνύματα." "Έκθεση ευαίσθητων πληροφοριών κατά τη μετάδοση/εγγραφή" "Να μην εμφανιστεί ξανά" "Διαγραφή όλων" "Διαχείριση" - "Διακριτικές ειδοποιήσεις" - "Καταργήστε όλες τις διακριτικές ειδοποιήσεις" + "Ειδοποιήσεις σε σίγαση" + "Διαγραφή όλων των ειδοποιήσεων σε σίγαση" "Οι ειδοποιήσεις τέθηκαν σε παύση από τη λειτουργία \"Μην ενοχλείτε\"" "Έναρξη τώρα" "Δεν υπάρχουν ειδοποιήσεις" @@ -635,9 +641,9 @@ "Αποκλεισμός" "Συνέχιση εμφάνισης" "Ελαχιστοποίηση" - "Διακριτικές" + "Σίγαση" "Διατήρηση σε σίγαση" - "Παρεμβατικές" + "Ειδοποίηση" "Να συνεχιστούν οι ειδοποιήσεις" "Απενεργοποίηση ειδοποιήσεων" "Να συνεχίσουν να εμφανίζονται ειδοποιήσεις από αυτήν την εφαρμογή;" @@ -651,10 +657,8 @@ "Δεν είναι δυνατή η τροποποίηση αυτών των ειδοποιήσεων" "Δεν είναι δυνατή η διαμόρφωση αυτής της ομάδας ειδοποιήσεων εδώ" "Ειδοποίηση μέσω διακομιστή μεσολάβησης" - - - - + "Και των %1$s ειδοποιήσεων" + "Εμφάνιση περισσότερων" "Αυτή η εφαρμογή χρησιμοποιεί την κάμερα." "Αυτή η εφαρμογή χρησιμοποιεί το μικρόφωνο." "Αυτή η εφαρμογή εμφανίζεται πάνω σε άλλες εφαρμογές στην οθόνη σας." @@ -898,7 +902,7 @@ "Επιτρέπεται" "Δεν επιτρέπεται" "Πατήστε για προγραμματισμό της Εξοικονόμησης μπαταρίας" - "Αυτόματη ενεργοποίηση όταν η στάθμη της μπαταρίας είναι στο %d%%" + "Ενεργοποίηση όταν υπάρχει σημαντική πιθανότητα εξάντλησης της μπαταρίας" "Όχι, ευχαριστώ" "Το πρόγραμμα της Εξοικονόμησης μπαταρίας ενεργοποιήθηκε" "Η Εξοικονόμηση μπαταρίας θα ενεργοποιηθεί αυτόματα μόλις η στάθμη της μπαταρίας φτάσει κάτω από %d%%." @@ -930,6 +934,5 @@ "Μετακίνηση επάνω δεξιά" "Μετακίνηση κάτω αριστερά" "Μετακίνηση κάτω δεξιά" - - + "Παράβλεψη" diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index e047482b57f3..ed2c0a07ebb2 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -62,9 +62,10 @@ "USB debugging not allowed" "The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user." "USB port disabled" - "To protect your device from liquid or debris, the USB port is disabled and won’t detect any accessories.\n\nYou’ll be notified when it’s safe to use the USB port again." + "To protect your device from liquid or debris, the USB port is disabled and won’t detect any accessories.\n\nYou’ll be notified when it’s OK to use the USB port again." "USB port enabled to detect chargers and accessories" "Enable USB" + "Learn more" "Zoom to fill screen" "Stretch to fill screen" "Screenshot" @@ -118,6 +119,11 @@ "Cancel" "Confirm" "Try again" + "Empty region, tap to cancel authentication" + "Please try again" + "Looking for your face" + "Face authenticated" + "Confirmed" "Touch the fingerprint sensor" "Fingerprint icon" "Looking for you…" @@ -369,8 +375,7 @@ "On at %s" "Until %s" "Dark Theme" - - + "Dark theme\nBattery saver" "NFC" "NFC is disabled" "NFC is enabled" @@ -445,13 +450,14 @@ "Battery Saver is on" "Reduces performance and background data" "Turn off Battery Saver" - "While recording or casting, %s can capture any sensitive information, such as audio that you play and your passwords, payment info, photos and messages." + "While recording or casting, %s can capture any sensitive information that is displayed on your screen or played from your device, including sensitive information such as audio, passwords, payment info, photos and messages." + "While recording or casting, the service providing this function can capture any sensitive information that is displayed on your screen or played from your device, including sensitive information such as audio, passwords, payment info, photos and messages." "Exposing sensitive info during casting/recording" "Don\'t show again" "Clear all" "Manage" - "Gentle notifications" - "Clear all gentle notifications" + "Silent notifications" + "Clear all silent notifications" "Notifications paused by Do Not Disturb" "Start now" "No notifications" @@ -635,9 +641,9 @@ "Block" "Keep showing" "Minimise" - "Gentle" + "Silent" "Stay silent" - "Interruptive" + "Alerting" "Keep alerting" "Turn off notifications" "Keep showing notifications from this app?" @@ -651,10 +657,8 @@ "These notifications can\'t be modified." "This group of notifications cannot be configured here" "Proxied notification" - - - - + "All %1$s notifications" + "See more" "This app is using the camera." "This app is using the microphone." "This app is displaying over other apps on your screen." @@ -898,7 +902,7 @@ "Allow" "Deny" "Tap to schedule Battery Saver" - "Turn on automatically when battery is at %d%%" + "Turn on when battery is likely to run out" "No, thanks" "Battery Saver schedule turned on" "Battery Saver will turn on automatically once battery goes below %d%%." @@ -930,6 +934,5 @@ "Move top right" "Move bottom left" "Move bottom right" - - + "Dismiss" diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index a55615fa1137..c67a491c579e 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -62,9 +62,10 @@ "USB debugging not allowed" "The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user." "USB port disabled" - "To protect your device from liquid or debris, the USB port is disabled and won’t detect any accessories.\n\nYou’ll be notified when it’s safe to use the USB port again." + "To protect your device from liquid or debris, the USB port is disabled and won’t detect any accessories.\n\nYou’ll be notified when it’s OK to use the USB port again." "USB port enabled to detect chargers and accessories" "Enable USB" + "Learn more" "Zoom to fill screen" "Stretch to fill screen" "Screenshot" @@ -118,6 +119,11 @@ "Cancel" "Confirm" "Try again" + "Empty region, tap to cancel authentication" + "Please try again" + "Looking for your face" + "Face authenticated" + "Confirmed" "Touch the fingerprint sensor" "Fingerprint icon" "Looking for you…" @@ -369,8 +375,7 @@ "On at %s" "Until %s" "Dark Theme" - - + "Dark theme\nBattery saver" "NFC" "NFC is disabled" "NFC is enabled" @@ -445,13 +450,14 @@ "Battery Saver is on" "Reduces performance and background data" "Turn off Battery Saver" - "While recording or casting, %s can capture any sensitive information, such as audio that you play and your passwords, payment info, photos and messages." + "While recording or casting, %s can capture any sensitive information that is displayed on your screen or played from your device, including sensitive information such as audio, passwords, payment info, photos and messages." + "While recording or casting, the service providing this function can capture any sensitive information that is displayed on your screen or played from your device, including sensitive information such as audio, passwords, payment info, photos and messages." "Exposing sensitive info during casting/recording" "Don\'t show again" "Clear all" "Manage" - "Gentle notifications" - "Clear all gentle notifications" + "Silent notifications" + "Clear all silent notifications" "Notifications paused by Do Not Disturb" "Start now" "No notifications" @@ -635,9 +641,9 @@ "Block" "Keep showing" "Minimise" - "Gentle" + "Silent" "Stay silent" - "Interruptive" + "Alerting" "Keep alerting" "Turn off notifications" "Keep showing notifications from this app?" @@ -651,10 +657,8 @@ "These notifications can\'t be modified." "This group of notifications cannot be configured here" "Proxied notification" - - - - + "All %1$s notifications" + "See more" "This app is using the camera." "This app is using the microphone." "This app is displaying over other apps on your screen." @@ -898,7 +902,7 @@ "Allow" "Deny" "Tap to schedule Battery Saver" - "Turn on automatically when battery is at %d%%" + "Turn on when battery is likely to run out" "No, thanks" "Battery Saver schedule turned on" "Battery Saver will turn on automatically once battery goes below %d%%." @@ -930,6 +934,5 @@ "Move top right" "Move bottom left" "Move bottom right" - - + "Dismiss" diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index e047482b57f3..ed2c0a07ebb2 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -62,9 +62,10 @@ "USB debugging not allowed" "The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user." "USB port disabled" - "To protect your device from liquid or debris, the USB port is disabled and won’t detect any accessories.\n\nYou’ll be notified when it’s safe to use the USB port again." + "To protect your device from liquid or debris, the USB port is disabled and won’t detect any accessories.\n\nYou’ll be notified when it’s OK to use the USB port again." "USB port enabled to detect chargers and accessories" "Enable USB" + "Learn more" "Zoom to fill screen" "Stretch to fill screen" "Screenshot" @@ -118,6 +119,11 @@ "Cancel" "Confirm" "Try again" + "Empty region, tap to cancel authentication" + "Please try again" + "Looking for your face" + "Face authenticated" + "Confirmed" "Touch the fingerprint sensor" "Fingerprint icon" "Looking for you…" @@ -369,8 +375,7 @@ "On at %s" "Until %s" "Dark Theme" - - + "Dark theme\nBattery saver" "NFC" "NFC is disabled" "NFC is enabled" @@ -445,13 +450,14 @@ "Battery Saver is on" "Reduces performance and background data" "Turn off Battery Saver" - "While recording or casting, %s can capture any sensitive information, such as audio that you play and your passwords, payment info, photos and messages." + "While recording or casting, %s can capture any sensitive information that is displayed on your screen or played from your device, including sensitive information such as audio, passwords, payment info, photos and messages." + "While recording or casting, the service providing this function can capture any sensitive information that is displayed on your screen or played from your device, including sensitive information such as audio, passwords, payment info, photos and messages." "Exposing sensitive info during casting/recording" "Don\'t show again" "Clear all" "Manage" - "Gentle notifications" - "Clear all gentle notifications" + "Silent notifications" + "Clear all silent notifications" "Notifications paused by Do Not Disturb" "Start now" "No notifications" @@ -635,9 +641,9 @@ "Block" "Keep showing" "Minimise" - "Gentle" + "Silent" "Stay silent" - "Interruptive" + "Alerting" "Keep alerting" "Turn off notifications" "Keep showing notifications from this app?" @@ -651,10 +657,8 @@ "These notifications can\'t be modified." "This group of notifications cannot be configured here" "Proxied notification" - - - - + "All %1$s notifications" + "See more" "This app is using the camera." "This app is using the microphone." "This app is displaying over other apps on your screen." @@ -898,7 +902,7 @@ "Allow" "Deny" "Tap to schedule Battery Saver" - "Turn on automatically when battery is at %d%%" + "Turn on when battery is likely to run out" "No, thanks" "Battery Saver schedule turned on" "Battery Saver will turn on automatically once battery goes below %d%%." @@ -930,6 +934,5 @@ "Move top right" "Move bottom left" "Move bottom right" - - + "Dismiss" diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index e047482b57f3..ed2c0a07ebb2 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -62,9 +62,10 @@ "USB debugging not allowed" "The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user." "USB port disabled" - "To protect your device from liquid or debris, the USB port is disabled and won’t detect any accessories.\n\nYou’ll be notified when it’s safe to use the USB port again." + "To protect your device from liquid or debris, the USB port is disabled and won’t detect any accessories.\n\nYou’ll be notified when it’s OK to use the USB port again." "USB port enabled to detect chargers and accessories" "Enable USB" + "Learn more" "Zoom to fill screen" "Stretch to fill screen" "Screenshot" @@ -118,6 +119,11 @@ "Cancel" "Confirm" "Try again" + "Empty region, tap to cancel authentication" + "Please try again" + "Looking for your face" + "Face authenticated" + "Confirmed" "Touch the fingerprint sensor" "Fingerprint icon" "Looking for you…" @@ -369,8 +375,7 @@ "On at %s" "Until %s" "Dark Theme" - - + "Dark theme\nBattery saver" "NFC" "NFC is disabled" "NFC is enabled" @@ -445,13 +450,14 @@ "Battery Saver is on" "Reduces performance and background data" "Turn off Battery Saver" - "While recording or casting, %s can capture any sensitive information, such as audio that you play and your passwords, payment info, photos and messages." + "While recording or casting, %s can capture any sensitive information that is displayed on your screen or played from your device, including sensitive information such as audio, passwords, payment info, photos and messages." + "While recording or casting, the service providing this function can capture any sensitive information that is displayed on your screen or played from your device, including sensitive information such as audio, passwords, payment info, photos and messages." "Exposing sensitive info during casting/recording" "Don\'t show again" "Clear all" "Manage" - "Gentle notifications" - "Clear all gentle notifications" + "Silent notifications" + "Clear all silent notifications" "Notifications paused by Do Not Disturb" "Start now" "No notifications" @@ -635,9 +641,9 @@ "Block" "Keep showing" "Minimise" - "Gentle" + "Silent" "Stay silent" - "Interruptive" + "Alerting" "Keep alerting" "Turn off notifications" "Keep showing notifications from this app?" @@ -651,10 +657,8 @@ "These notifications can\'t be modified." "This group of notifications cannot be configured here" "Proxied notification" - - - - + "All %1$s notifications" + "See more" "This app is using the camera." "This app is using the microphone." "This app is displaying over other apps on your screen." @@ -898,7 +902,7 @@ "Allow" "Deny" "Tap to schedule Battery Saver" - "Turn on automatically when battery is at %d%%" + "Turn on when battery is likely to run out" "No, thanks" "Battery Saver schedule turned on" "Battery Saver will turn on automatically once battery goes below %d%%." @@ -930,6 +934,5 @@ "Move top right" "Move bottom left" "Move bottom right" - - + "Dismiss" diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 7aa44bf4d31d..d5c5a44aebf5 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -62,9 +62,10 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‏‎‏‎‏‎‎‎‎‏‏‎‏‎‏‏‏‏‎‎‏‎‏‎‏‏‏‎‏‎‏‏‎‏‏‎‎‏‏‎‏‏‏‎‏‎‎‎‏‎‏‎USB debugging not allowed‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‎‎‎‎‎‎‏‎‎‎‏‎‏‏‎‎‏‎The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‎‎‎‎‏‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‏‎‎USB port disabled‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‎‎‏‎‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‎‎‎‎‏‎‎‎To protect your device from liquid or debris, the USB port is disabled and won’t detect any accessories.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎You’ll be notified when it’s safe to use the USB port again.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‏‎‎‏‏‎‏‏‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‏‏‏‎‎‎‏‏‎‏‏‎‎‎‏‎‏‏‏‎To protect your device from liquid or debris, the USB port is disabled and won’t detect any accessories.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎You’ll be notified when it’s okay to use the USB port again.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‎‎‎‏‎‎‎‎‎‏‏‎‏‎‏‎‏‏‏‎‏‏‏‎‏‏‎‏‎‏‏‏‏‏‎‎‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎USB port enabled to detect chargers and accessories‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‎‏‏‎‎‏‎‏‎‎‏‎‎‏‎‏‎‏‏‏‏‎‎‏‏‎‏‏‎‏‎‎‎‏‎‏‎‎‏‏‏‎‎‎‎‏‏‏‎‏‎‎‎‎‏‎Enable USB‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‏‏‎‎‏‎‏‎‏‏‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‏‎‎‎‏‏‎‎‎‎‎‏‎‎‎‏‏‎‎‏‏‎‏‎‎‎‎‎‏‎Learn more‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‏‎‏‎‏‏‎‎‏‎‏‏‎‏‎‏‏‎‎‎‎‎‎‏‎‎‏‎‎‏‎‏‏‏‎‎‎‎‎‏‎‏‎Zoom to fill screen‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‏‏‎‎‏‎‎‏‏‎‎‎‎‏‏‎‎‏‎‏‎‎‎‏‎‎‎‏‎‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‎‏‎‎Stretch to fill screen‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎‏‏‎‎‎‎‎‎‏‎‏‏‎‏‎‏‎‎‎‎‎‎‎‎‏‎‎‏‏‏‎‎‎‎‏‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎Screenshot‎‏‎‎‏‎" @@ -118,6 +119,11 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‎‏‎‎‎‏‎‎‏‎‎‏‎‏‎‏‏‎‏‎‎‏‎‎‏‎‏‎‏‏‏‏‎‎‎‏‎‏‏‎‏‏‎‎‏‏‎‎‏‏‎‏‎‎Cancel‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‎‏‎‎‏‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎‎‏‎‎‎‎‏‎‎‎‎‎‎‎‎‎‎‎‏‏‏‎‎‎‎‎‏‎‎‎‏‎‎Confirm‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‏‏‎‏‏‎‏‎‎‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‎‏‏‏‏‏‎‎‎‎‏‎Try again‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‏‎‎‏‏‎‎‎‎‏‎‏‎‏‎‎‎‏‎‎‏‎‏‎‏‎‎‎‏‎‎‎‎‏‏‎‏‎‏‎Empty region, tap to cancel authentication‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‎‎‎‎‏‎‏‏‎‎‎‎‎‎‏‏‎‏‏‎‎‏‏‎‏‎‎‎‎‏‎‎‏‏‏‏‎‏‎‏‏‏‎‎‏‏‎‎Please try again‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‏‏‎‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‏‎‏‏‎‎‏‎‏‏‎‎‏‏‏‏‎‎‏‎‎‎‏‎‎‎‎Looking for your face‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‎‎‎‎‏‏‎‎‏‏‎‏‏‏‎‏‎‏‏‏‎‏‏‎‏‏‎‎‏‏‎‏‏‏‎‏‏‎‏‎‏‏‎‏‏‎‎‏‏‎‏‎‏‏‎Face authenticated‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‏‏‎‎‏‎‎‏‎‏‏‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎‏‏‏‏‎‎‏‏‏‎‎‎‎‏‎‏‏‏‎‎‏‏‏‏‎Confirmed‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎‎‏‏‏‏‏‏‎‎‏‏‏‎‏‎‎‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‏‎‎‎‎‎‏‎Touch the fingerprint sensor‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‎‏‎‏‏‎‏‎‎‎‎‏‏‎‏‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‏‎‏‎‏‎‎Fingerprint icon‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‏‎‏‎‎‎‎‎‎‏‏‏‏‎‏‏‎‏‎‏‎‎‏‎‏‎‎‏‎‏‏‏‏‎‏‏‎‎‏‎‏‎‏‏‎‏‏‏‎‎‎‎‏‎Looking for you…‎‏‎‎‏‎" @@ -444,13 +450,14 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‏‏‎‏‎‏‏‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‎‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎Battery Saver is on‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‎‎‎‏‎‎‏‎‏‏‎‏‏‏‎‎‏‎‏‏‏‎‏‏‏‎‎‎‎‏‏‎‏‏‏‏‎‏‎‎‎‎‏‏‏‎‎‏‏‎‏‎‎‎Reduces performance and background data‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‎‏‎‏‎‏‎‏‏‎‎‎‎‏‎‏‎‏‎‏‎‏‏‎‎‏‎‏‎‎‏‎‎‎‏‎‎‏‏‎‎‏‎‎‎‎‏‎‏‎‏‏‎‏‎Turn off Battery Saver‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‎‎‎‏‏‎‏‎‏‏‏‏‎‎‎‏‏‎‎‎‎‎While recording or casting, ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ can capture any sensitive information, such as audio that you play and your passwords, payment info, photos, and messages.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‏‎‏‎‏‎‏‎‎‎‏‎‏‎‏‎‏‎‎‎‏‏‎‎‏‏‎‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎‎‎‏‏‏‏‎While recording or casting, ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ can capture any sensitive information that is displayed on your screen or played from your device, including sensitive information such as audio, passwords, payment info, photos and messages.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‎‏‏‏‎‏‎‎‎‎‏‏‏‎‏‏‎‏‎‏‏‎‎‏‎‎‏‏‏‏‎‎‏‎‎‏‏‏‎‎‎‏‎‎‏‎‏‎‏‎‎‏‎‎While recording or casting, the service providing this function can capture any sensitive information that is displayed on your screen or played from your device, including sensitive information such as audio, passwords, payment info, photos and messages.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‏‏‎‎‎‎‎‎‎‎‏‎‏‏‎‎‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‎‎Exposing sensitive info during casting/recording‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎‎‎‏‏‏‏‎‎‎‏‎‏‎‏‏‎‏‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‎‎‎‎‎Don\'t show again‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‏‏‎‎‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‎‏‎‎‏‎‏‎‏‎‏‏‏‏‎‏‎‎‎‎‏‎‎‎‎‏‎‏‎‏‏‎‎‎Clear all‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‎‏‏‏‏‏‎‏‎‏‏‏‎‎‏‎‎‏‏‎‏‎‎‏‎‏‎‏‏‎‎‏‏‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎Manage‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‎‏‎‏‏‏‎‏‏‏‎‏‎‎‎‏‏‏‎‏‏‎‎‏‎‎‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎Gentle notifications‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‎‎‎‏‏‎‏‏‏‎‏‎‎‎‏‏‏‎‏‎‏‎‏‏‎‎‏‏‎‎‎‎‎‏‏‎‏‎‎‏‎‎‎‏‎‎‏‏‏‎‎‎‎‎Clear all gentle notifications‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‎‏‏‏‎‎‎‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‏‎‎‎‎‏‎‎‏‎‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‏‏‏‏‎‏‎Silent notifications‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‏‏‏‏‎‏‎‏‏‏‏‎‎‏‏‏‎‎‎‎‏‎‎‏‎‏‎‎‏‏‎‎‎‎‏‎‏‎‏‎‎‏‏‏‎‎‏‎‏‏‏‏‏‏‎Clear all silent notifications‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‏‎‏‏‏‎‎‏‏‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‎‎‎‎‎‎‎‎‏‎‎‏‎‏‏‎‏‎‏‎‎‏‎‎‏‎‏‎‏‎Notifications paused by Do Not Disturb‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‏‎‏‎‎‏‎‏‏‎‎‎‎‏‎‏‎‏‏‏‎‎‏‎‏‎‎‎‎‎‎‎‎‎‎‏‏‎‏‎‎‏‏‎‏‎‎‎‏‎‎Start now‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‏‎‏‎‏‏‏‎‏‎‎‏‏‏‎‏‎‎‏‏‎‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‎‏‎‎No notifications‎‏‎‎‏‎" @@ -634,9 +641,9 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‎‏‎‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‏‏‏‏‏‏‎‎‎‎‏‏‎‎‏‎Block‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‎‎‏‎‎‎‏‎‏‏‎‏‎‏‏‎‎‎‎‏‏‏‏‎‏‎‎‏‏‏‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎Keep showing‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‏‎‎‎‏‏‎‎‎‎‎‎‎‎‎‏‎‏‏‏‏‎‏‎‏‏‎‎‎‎‎‏‎‎‏‏‎‏‎‏‏‏‎‎‎‏‏‏‎‎‏‏‎Minimize‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‎‎‏‎‏‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‎‏‏‏‎‎‏‎‎‎‎‎‎‎‏‏‏‎‏‎‏‏‎‏‎‎Gentle‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎‎‎‏‎‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‏‏‏‎‏‎‏‎‏‎‏‎‎‏‏‏‎‏‏‎‎‏‎‏‏‏‎‏‎‏‎‎‏‎Silent‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‎‏‎‏‏‏‏‎‏‎‏‏‎‎‏‏‎‎‏‎‎‏‎‏‏‏‏‎‎‏‏‏‏‎‎‏‎‏‎‎‏‏‎‎‏‏‏‏‏‎‎‎‏‎Stay silent‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‏‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‎‎‏‏‎‎‎‏‎‎‏‎‎‎‎‏‎‏‏‏‏‎‏‏‎‎‏‏‎‏‎‏‎‎‎‏‎‎‏‏‏‎Interruptive‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‎‎‏‎‎‏‎‎‎‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‎‏‎‏‎‏‏‏‎‎‎‏‏‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎Alerting‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‏‎‎‏‎‏‏‏‏‎‎‏‏‎‎‏‏‎‎‎‎‏‏‎‏‎Keep alerting‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‏‏‎‎‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‎‎‎‏‎‎‎‏‎‎‎‎‎‏‎‎‏‎‏‏‏‎‎‏‏‎Turn off notifications‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎‎‏‏‎‏‏‎‎‎‎‎‎‎‏‎‎‎‏‏‎‏‎‎‎‏‎‎‎‎‎‏‎Keep showing notifications from this app?‎‏‎‎‏‎" @@ -895,7 +902,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‏‏‎‏‎‎‎‏‏‏‎‎‎‎‏‎‏‎‏‏‎‏‎‏‏‎‎‎‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‎‎‏‎‎‏‎‏‎‏‎Allow‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‎‏‎‎‎‎‎‏‎‎‎‏‎‎‏‏‎‏‎‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‎‎‏‏‏‎Deny‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‏‏‎‎‏‏‏‎‎‎‏‎‎‎‎‎‎‏‎‏‎‎‏‏‎‎‎‎‏‎‎‏‎‏‏‎‎‎‏‏‏‏‎‏‎‎‏‏‎‎‎‎‏‎‎‎Tap to schedule Battery Saver‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‎‏‎‎‏‎‏‏‎‎‏‎‏‎‎‎‎‏‎‏‎‎‎‎‎‎‎‎‏‎‎‎‎‏‏‎‎‏‎‏‏‎‎‏‎‎‎‎‎‎‎‏‎Turn on automatically when battery is at ‎‏‎‎‏‏‎%d‎‏‎‎‏‏‏‎%%‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‎‏‎‎‏‎‏‎‏‎‎‎‏‎‏‎‏‎‎‎‎‏‏‏‎‎‎‎‎‏‏‏‎‎‎‎‏‎‏‏‎‏‎‎‎‏‏‎‏‎‏‎‎‎‎Turn on when battery is likely to run out‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‎‏‏‏‎‏‎‎‎‎‎‎‎‎‎‏‎‎‎‏‏‏‏‎‏‏‎‏‏‎‎‏‎‎‎‎‏‏‎‏‎‏‎‎‏‏‏‏‎‏‎‎‎No thanks‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‎‎‏‎‎‏‏‏‏‎‎‏‎‏‎‏‎‏‏‏‎‎‏‎‎‏‏‎‎‎‎‎‏‏‎‏‏‎‎‏‏‎‎‎‎‏‏‏‏‏‎‎Battery Saver schedule turned on‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎‎‏‏‏‎‎‏‏‎‎‏‎‎‎‎‏‏‎‎‎‎‎‏‏‎‎‏‎‏‏‎‎‏‎‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‏‎Battery Saver will turn on automatically once battery goes below ‎‏‎‎‏‏‎%d‎‏‎‎‏‏‏‎%%.‎‏‎‎‏‎" diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 95fcbe5e60fd..924e59611b5d 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -62,9 +62,12 @@ "No tienes permitida la depuración por USB" "El usuario al que accediste en este dispositivo no puede activar la depuración por USB. Para usar esta función, debes cambiar al usuario principal." "Puerto USB inhabilitado" - "Para proteger tu dispositivo de líquidos o suciedad, el puerto USB está inhabilitado y no detectará ningún accesorio.\n\nTe avisaremos cuando sea seguro usar el puerto USB de nuevo." + + "Se habilitó el puerto USB para detectar cargadores y accesorios" "Habilitar USB" + + "Zoom para ocupar la pantalla" "Estirar p/ ocupar la pantalla" "Captura de pantalla" @@ -118,6 +121,11 @@ "Cancelar" "Confirmar" "Volver a intentarlo" + "Espacio vacío; presiona para cancelar la autenticación" + "Vuelve a intentarlo" + "Buscando tu rostro" + "Se autenticó el rostro" + "Confirmado" "Toca el sensor de huellas digitales" "Ícono de huella digital" "Autenticando tu rostro…" @@ -184,7 +192,7 @@ "Datos móviles desactivados" "No se configuró para usar datos" "Desactivados" - "Conexión mediante Bluetooth" + "Conexión Bluetooth" "Modo avión" "VPN activada" "Sin tarjeta SIM" @@ -369,8 +377,7 @@ "A la(s) %s" "Hasta %s" "Tema oscuro" - - + "Tema oscuro\nAhorro de batería" "NFC" "La tecnología NFC está inhabilitada" "La tecnología NFC está habilitada" @@ -445,13 +452,16 @@ "El Ahorro de batería está activado" "Reduce el rendimiento y el uso de datos en segundo plano." "Desactivar el Ahorro de batería" - "Durante la grabación o transmisión de contenido, %s puede capturar información sensible, como audio que reproduces y tus contraseñas, información de pago, fotos y mensajes." + "Durante una grabación o una transmisión, %s podrá capturar cualquier información sensible que se muestre en la pantalla o se reproduzca en tu dispositivo, como audio, contraseñas, información de pago, fotos y mensajes." + "Durante una grabación o una transmisión, el servicio que brinda esta función podrá capturar cualquier información sensible que se muestre en la pantalla o se reproduzca en tu dispositivo, como audio, contraseñas, información de pago, fotos y mensajes." "Exposición de información sensible durante la grabación o transmisión" "No volver a mostrar" "Borrar todo" "Administrar" - "Notificaciones discretas" - "Borrar todas las notificaciones discretas" + + + + "Notificaciones pausadas por el modo \"No interrumpir\"" "Comenzar ahora" "No hay notificaciones" @@ -635,26 +645,26 @@ "Bloquear" "Seguir viendo" "Minimizar" - "Silenciosas" + + "Silenciar notificaciones" - "Emergentes" + + "Seguir recibiendo alertas" "Desactivar notificaciones" "¿Quieres seguir viendo las notificaciones de esta app?" - "Silenciosa" - "Prioritaria" + "Discretas" + "Priorizadas" "Te ayuda a concentrarte, ya que las notificaciones se muestran solo como banner desplegable. Siempre en silencio." "Se muestra debajo de las notificaciones de prioridad. Siempre en silencio." "Se muestra debajo de las notificaciones de prioridad. Siempre en silencio." "Se muestra debajo de las notificaciones de prioridad. Siempre en silencio." - "Capta tu atención con un sonido y un ícono en la barra de estado. Se muestra en la pantalla bloqueada." + "Notificaciones que llaman la atención con sonido y un ícono en la barra de estado. Se muestra en la pantalla bloqueada." "No se pueden modificar estas notificaciones." "No se puede configurar aquí este grupo de notificaciones" "Notificación almacenada en proxy" - - - - + "Todas las notificaciones de %1$s" + "Ver más" "Esta app está usando la cámara." "Esta app está usando el micrófono." "Esta app se muestra sobre otras apps en la pantalla." @@ -898,7 +908,8 @@ "Permitir" "Rechazar" "Presiona para programar el Ahorro de batería" - "Activar automáticamente cuando quede %d%% de batería" + + "No, gracias" "Se activó la programación del Ahorro de batería" "El Ahorro de batería se activará automáticamente cuando quede menos de %d%% de batería." @@ -930,6 +941,5 @@ "Ubicar arriba a la derecha" "Ubicar abajo a la izquierda" "Ubicar abajo a la derecha" - - + "Ignorar" diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index a55b4d6265f1..25611bd6e36d 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -62,9 +62,12 @@ "Depuración USB no permitida" "El usuario con el que se ha iniciado sesión en este dispositivo no puede activar la depuración USB. Para utilizar esta función, inicia sesión con la cuenta de usuario principal." "Puerto USB inhabilitado" - "Para proteger tu dispositivo de los líquidos y la suciedad, el puerto USB se ha inhabilitado y no detectará ningún accesorio.\n\nRecibirás una notificación cuando puedas volver a usarlo." + + "Puerto USB habilitado para detectar cargadores y accesorios" "Habilitar USB" + + "Zoom para ajustar" "Expandir para ajustar" "Captura de pantalla" @@ -118,6 +121,11 @@ "Cancelar" "Confirmar" "Reintentar" + "Zona vacía. Toca para cancelar la autenticación." + "Vuelve a intentarlo" + "Buscando tu cara" + "Cara autenticada" + "Confirmada" "Toca el sensor de huellas digitales" "Icono de huella digital" "Buscando tu cara…" @@ -348,7 +356,7 @@ "Compartir conexión" "Zona Wi-Fi" "Activando…" - "Ahorro de datos sí" + "Ahorro de datos: sí" %d dispositivos %d dispositivo @@ -369,8 +377,7 @@ "Hora: %s" "Hasta las %s" "Tema oscuro" - - + "Tema oscuro\nAhorro de batería" "NFC" "La conexión NFC está inhabilitada" "La conexión NFC está habilitada" @@ -445,13 +452,16 @@ "Ahorro de batería activado" "Reduce el rendimiento y los datos en segundo plano" "Desactivar Ahorro de batería" - "Mientras graba o envía contenido, %s puede obtener información sensible, como el audio que reproduces, contraseñas, información de pagos, fotos y mensajes." + "Mientras graba o envía contenido, %s puede obtener información sensible que se muestre en la pantalla o que se reproduzca en el dispositivo, como audio, contraseñas, información de pagos, fotos y mensajes." + "Mientras graba o envía contenido, el servicio que ofrece esta función puede obtener información sensible que se muestre en la pantalla o que se reproduzca en el dispositivo, como audio, contraseñas, información de pagos, fotos y mensajes." "Se muestra información sensible durante el envío y la grabación" "No volver a mostrar" "Borrar todo" "Gestionar" - "Notificaciones discretas" - "Borrar todas las notificaciones discretas" + + + + "Notificaciones pausadas por el modo No molestar" "Iniciar ahora" "No hay notificaciones" @@ -635,9 +645,11 @@ "Bloquear" "Seguir mostrando" "Minimizar" - "En silencio" + + "Silenciar notificaciones" - "Emergentes" + + "Quiero seguir recibiendo alertas" "Desactivar notificaciones" "¿Quieres seguir viendo las notificaciones de esta aplicación?" @@ -647,14 +659,12 @@ "Muestra las notificaciones con prioridad baja. Siempre en silencio." "Muestra las notificaciones con prioridad baja. Siempre en silencio." "Muestra las notificaciones con prioridad baja. Siempre en silencio." - "Atrae tu atención a través del sonido y el icono en la barra de estado. Se muestra en la pantalla de bloqueo." + "Llama tu atención con sonido y un icono en la barra de estado. Se muestra en la pantalla de bloqueo." "Estas notificaciones no se pueden modificar." "Este grupo de notificaciones no se puede configurar aquí" "Notificación mediante proxy" - - - - + "Todas las notificaciones de %1$s" + "Ver más" "Esta aplicación está usando la cámara." "Esta aplicación está usando el micrófono." "Esta aplicación se está mostrando sobre otras aplicaciones en tu pantalla." @@ -871,7 +881,7 @@ "%1$s se está ejecutando" "La aplicación se ha abierto sin instalarse." "La aplicación se ha abierto sin instalarse. Toca para obtener más información." - "Información de la aplicación" + "Acerca de la aplicación" "Ir al navegador" "Datos móviles" "%1$s ‑ %2$s" @@ -898,7 +908,8 @@ "Permitir" "Denegar" "Tocar para programar el modo Ahorro de batería" - "Activar automáticamente cuando quede un %d %% de batería" + + "No, gracias" "Se ha activado la programación del modo Ahorro de batería" "El modo Ahorro de batería se activará automáticamente cuando quede menos de un %d %% de batería." @@ -930,6 +941,5 @@ "Mover arriba a la derecha" "Mover abajo a la izquierda." "Mover abajo a la derecha" - - + "Cerrar" diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index b03fb6b738ac..28641282e645 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -62,9 +62,12 @@ "USB-silumine pole lubatud" "Sellesse seadmesse praegu sisse logitud kasutaja ei saa USB-silumist sisse lülitada. Selle funktsiooni kasutamiseks vahetage peamisele kasutajale." "USB-port on keelatud" - "Selleks et kaitsta teie seadet vedeliku või mustuse eest, on USB-port keelatud ja see ei tuvasta lisatarvikuid.\n\nKui USB-porti on taas ohutu kasutada, saate selle kohta märguande." + + "USB-pordil on lubatud tuvastada laadijaid ja tarvikuid" "Luba USB" + + "Suumi ekraani täitmiseks" "Venita ekraani täitmiseks" "Ekraanipilt" @@ -118,6 +121,11 @@ "Tühista" "Kinnita" "Proovi uuesti" + "Tühi piirkond, puudutage autentimise tühistamiseks" + "Proovige uuesti" + "Teie näo vaatamine" + "Nägu on autenditud" + "Kinnitatud" "Puudutage sõrmejäljeandurit" "Sõrmejälje ikoon" "Otsitakse teid …" @@ -369,8 +377,7 @@ "Sisselülitam. kell %s" "Kuni %s" "Tume teema" - - + "Tume teema\nAkusäästja" "NFC" "NFC on keelatud" "NFC on lubatud" @@ -445,13 +452,16 @@ "Akusäästja on sisse lülitatud" "Vähendab jõudlust ja taustaandmeid" "Akusäästja väljalülitamine" - "%s võib salvestamisel ja ülekandmisel jäädvustada tundlikku teavet, näiteks esitatavat heli ning teie paroole, makseteavet, fotosid ja sõnumeid." + "%s saab salvestamisel või ülekandmisel jäädvustada teie ekraanil kuvatud või teie seadmes esitatud mis tahes tundliku teabe, sh sellise tundliku teabe nagu heli, paroolid, makseteave, fotod ja sõnumid." + "Seda funktsiooni pakkuv teenus saab salvestamisel või ülekandmisel jäädvustada teie ekraanil kuvatud või teie seadmes esitatud mis tahes tundliku teabe, sh sellise tundliku teabe nagu heli, paroolid, makseteave, fotod ja sõnumid." "Ülekandmise/salvestamise ajal kuvatakse tundlikku teavet" "Ära kuva uuesti" "Tühjenda kõik" "Haldamine" - "Leebed märguanded" - "Kustuta kõik leebed märguanded" + + + + "Režiim Mitte segada peatas märguanded" "Alusta kohe" "Märguandeid pole" @@ -635,9 +645,11 @@ "Blokeeri" "Jätka kuvamist" "Minimeeri" - "Rahulik" + + "Kuva helita" - "Segavad" + + "Teavita ka edaspidi" "Lülita märguanded välja" "Kas jätkata selle rakenduse märguannete kuvamist?" @@ -651,10 +663,8 @@ "Neid märguandeid ei saa muuta." "Seda märguannete rühma ei saa siin seadistada" "Puhvriga märguanne" - - - - + "Kõik rakenduse %1$s märguanded" + "Kuva rohkem" "See rakendus kasutab kaamerat." "See rakendus kasutab mikrofoni." "See rakendus kuvatakse teie ekraanil muude rakenduste peal." @@ -898,7 +908,8 @@ "Luba" "Keela" "Puudutage akusäästja ajastamiseks" - "Lülita automaatselt sisse, kui aku tase langeb alla %d%%" + + "Tänan, ei" "Automaatne akusäästja on sisse lülitatud" "Kui aku tase langeb alla %d%%, lülitub akusäästja automaatselt sisse." @@ -930,6 +941,5 @@ "Teisalda üles paremale" "Teisalda alla vasakule" "Teisalda alla paremale" - - + "Loobu" diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 33ab838eb997..1feb1b11615d 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -58,13 +58,16 @@ "USB arazketa onartu?" "Ordenagailuaren RSA gakoaren erreferentzia-gako digitala hau da:\n%1$s" "Eman beti ordenagailu honetatik arazteko baimena" - "Eman baimena" + "Baimendu" "Ez da onartzen USB arazketa" "Gailu honetan saioa hasita duen erabiltzaileak ezin du aktibatu USB arazketa. Eginbide hori erabiltzeko, aldatu erabiltzaile nagusira." "Desgaitu egin da USB ataka" - "USB ataka desgaitu egin da gailua likido edo zikinkeriengandik babesteko, eta ez du hautemango osagarririk.\n\nUSB ataka berriz erabiltzea segurua denean jakinaraziko zaizu." + + "USB ataka gaitu da kargagailuak eta osagarriak hautemateko" "Gaitu USB ataka" + + "Handiagotu pantaila betetzeko" "Luzatu pantaila betetzeko" "Pantaila-argazkia" @@ -81,7 +84,7 @@ "Hasi grabatzen" "Grabatu off ahotsa" "Erakutsi sakatzeak" - "Utzi" + "Gelditu" "Pausatu" "Berrekin" "Utzi" @@ -118,6 +121,11 @@ "Utzi" "Berretsi" "Saiatu berriro" + "Hutsik dago eremua. Sakatu autentifikatzeari uzteko." + "Saiatu berriro" + "Aurpegia bilatzen" + "Autentifikatu da aurpegia" + "Berretsita" "Sakatu hatz-marken sentsorea" "Hatz-markaren ikonoa" "Zure bila…" @@ -369,8 +377,7 @@ "Aktibatze-ordua: %s" "%s arte" "Gai iluna" - - + "Gai iluna\nBateria-aurrezlea" "NFC" "Desgaituta dago NFC" "Gaituta dago NFC" @@ -445,13 +452,16 @@ "Aktibatuta dago bateria-aurrezlea" "Errendimendua eta atzeko planoko datuak murrizten ditu" "Desaktibatu bateria-aurrezlea" - "Edukia grabatzen edo igortzen ari zaren bitartean, %s aplikazioak kontuzko informazioa bil dezake, hala nola erreproduzitzen duzun audioa, pasahitzak, ordainketa-informazioa, argazkiak eta mezuak." + "Edukia grabatzen edo igortzen ari zaren bitartean, %s aplikazioak pantailan bistaratzen den edo gailuan erreproduzitzen den kontuzko informazioa bil dezake, hala nola audioak, pasahitzak, ordainketa-informazioa, argazkiak eta mezuak." + "Edukia grabatzen edo igortzen ari zaren bitartean, funtzio hau eskaintzen duen zerbitzuak pantailan bistaratzen den edo gailuan erreproduzitzen den kontuzko informazioa bil dezake, hala nola audioak, pasahitzak, ordainketa-informazioa, argazkiak eta mezuak." "Kontuzko informazioa erakutsiko da edukia igorri edo grabatzean" "Ez erakutsi berriro" "Garbitu guztiak" "Kudeatu" - "Soinurik gabeko jakinarazpenak" - "Garbitu soinurik gabeko jakinarazpen guztiak" + + + + "\"Ez molestatu\" moduak pausatu egin ditu jakinarazpenak" "Hasi" "Ez dago jakinarazpenik" @@ -635,9 +645,11 @@ "Blokeatu" "Jarraitu erakusten" "Minimizatu" - "Jakinarazi soinurik gabe" + + "Jarraitu isilik" - "Jakinarazi soinu eta guzti" + + "Jarraitu jakinarazpenak bidaltzen" "Desaktibatu jakinarazpenak" "Aplikazio honen jakinarazpenak erakusten jarraitzea nahi duzu?" @@ -651,10 +663,8 @@ "Jakinarazpen horiek ezin dira aldatu." "Jakinarazpen talde hau ezin da konfiguratu hemen" "Proxy bidezko jakinarazpena" - - - - + "%1$s aplikazioaren jakinarazpen guztiak" + "Ikusi gehiago" "Kamera erabiltzen ari da aplikazioa." "Mikrofonoa erabiltzen ari da aplikazioa." "Pantailako beste aplikazioen gainean agertzen da aplikazioa." @@ -898,7 +908,8 @@ "Baimendu" "Ukatu" "Sakatu bateria-aurrezlea noiz aktibatu antolatzeko" - "Aktibatu automatikoki bateriaren %% %d gelditzen denean" + + "Ez" "Bateria-aurrezlea aktibatu da" "Bateria-aurrezlea automatikoki aktibatuko da bateriaren %% %d gelditzen denean." @@ -930,6 +941,5 @@ "Eraman goialdera, eskuinetara" "Eraman behealdera, ezkerretara" "Eraman behealdera, eskuinetara" - - + "Baztertu" diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 70fab45afab3..e161b7732e56 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -62,9 +62,12 @@ "‏اشکال‌زدایی USB مجاز نیست" "‏کاربری که درحال حاضر در این دستگاه وارد سیستم شده است نمی‌تواند اشکال‌زدایی USB را روشن کند. برای استفاده از این قابلیت، به کاربر اصلی تغییر وضعیت دهید." "‏درگاه USB غیرفعال شده است" - "‏برای محافظت از دستگاهتان دربرابر مایعات یا خاکروبه، درگاه USB غیرفعال شده است و هیچ‌کدام از لوازم جانبی را شناسایی نخواهد کرد.\n\nهرزمان که استفاده از درگاه USB ایمن باشد، به شما اطلاع داده می‌شود." + + "‏درگاه USB برای تشخیص شارژرها و لوازم جانبی فعال شد" "‏فعال کردن USB" + + "بزرگ‌نمایی برای پر کردن صفحه" "گسترده کردن برای پر کردن صفحه" "عکس صفحه‌نمایش" @@ -118,6 +121,11 @@ "لغو" "تأیید" "امتحان مجدد" + "برای لغو احراز هویت، در قسمت خالی ضربه بزنید" + "لطفاً دوباره امتحان کنید" + "درحال جستجوی چهره" + "چهره احراز هویت شد" + "تأیید شد" "حسگر اثر انگشت را لمس کنید" "نماد اثر انگشت" "درحال جستجوی شما…" @@ -238,7 +246,7 @@ "گزارش موقعیت مکانی روشن است." "گزارش موقعیت مکانی خاموش شد." "گزارش موقعیت مکانی روشن شد." - "هشدار برای %s تنظیم شد." + "زنگ برای %s تنظیم شد." "پانل را ببندید." "زمان بیشتر." "زمان کمتر." @@ -369,8 +377,7 @@ "ساعت %s روشن می‌شود" "تا %s" "طرح زمینه تیره" - - + "طرح زمینه تیره\nبهینه‌سازی باتری" "NFC" "‏NFC غیرفعال است" "‏NFC فعال است" @@ -445,13 +452,16 @@ "بهینه‌سازی باتری روشن است" "عملکرد و اطلاعات پس‌زمینه را کاهش می‌دهد" "بهینه‌سازی باتری را خاموش کنید" - "درحین ضبط یا ارسال محتوا، %s می‌تواند هرگونه اطلاعات حساسی را، مانند محتواهای صوتی‌ای که پخش می‌کنید و گذرواژه‌هایتان، اطلاعات پرداخت، عکس‌ها، و پیام‌ها را ضبط کند." + "هنگام ضبط یا ارسال محتوا، %s می‌تواند هرگونه اطلاعات حساس را (مانند صوت، گذرواژه، اطلاعات پرداخت، عکس و پیام) که روی صفحه‌تان نشان داده می‌شود یا از دستگاهتان پخش می‌شود ضبط کند." + "هنگام ضبط یا ارسال محتوا، ارائه‌دهنده خدمات این عملکرد می‌تواند هرگونه اطلاعات حساس (مانند صوت، گذرواژه، اطلاعات پرداخت، عکس و پیام) را که روی صفحه‌تان نشان داده می‌شود یا از دستگاهتان پخش می‌شود ضبط کند." "افشای اطلاعات حساس درحین ارسال/ضبط محتوا" "دوباره نشان داده نشود" "پاک کردن همه موارد" "مدیریت" - "اعلان‌های ملایم" - "پاک کردن همه اعلان‌های ملایم" + + + + "اعلان‌ها توسط «مزاحم نشوید» موقتاً متوقف شدند" "اکنون شروع شود" "اعلانی موجود نیست" @@ -501,7 +511,7 @@ " " "‏باز کردن تنظیمات VPN" " " - "باز کردن اعتبارنامه مورداعتماد" + "باز کردن اطلاعات کاربری مورداعتماد" "سرپرست سیستم شما گزارش‌گیری شبکه را (که بر ترافیک دستگاهتان نظارت می‌کند) روشن کرده است.\n\nبرای اطلاعات بیشتر، با سرپرست خود تماس بگیرید." "‏شما به برنامه‌ای برای تنظیم اتصال VPN اجازه دادید.\n\n این برنامه می‌تواند دستگاه و فعالیت شبکه‌تان را کنترل کند، از جمله ایمیل‌، برنامه‌ و وب‌سایت‌ها." "‏نمایه کاری شما توسط %1$s مدیریت می‌شود.\n\nسرپرست سیستم شما می‌تواند بر فعالیت شبکه شما (ازجمله ایمیل‌ها، برنامه‌ها و وب‌سایت‌ها) نظارت داشته باشد.\n\nبرای اطلاعات بیشتر، با سرپرست خود تماس بگیرید.\n\nهمچنین به VPN متصل هستید که می‌تواند بر فعالیت شبکه شما نظارت داشته باشد." @@ -547,7 +557,7 @@ "سیستم" "زنگ زدن" "رسانه" - "زنگ ساعت" + "زنگ" "اعلان" "بلوتوث" "فرکانس دوتایی چند نوایی" @@ -585,7 +595,7 @@ "فعال کردن حالت نمایشی" "نمایش حالت نمایشی" "اترنت" - "هشدار" + "زنگ" "نمایه کاری" "حالت هواپیما" "افزودن کاشی" @@ -635,9 +645,11 @@ "مسدود کردن" "همچنان نشان داده شود" "کوچک کردن" - "آرام" + + "بی‌صدا بماند" - "مزاحم" + + "همچنان اطلاع داده شود" "خاموش کردن اعلان‌ها" "نمایش اعلان از این برنامه ادامه یابد؟" @@ -651,10 +663,8 @@ "این اعلان‌ها قابل اصلاح نیستند." "نمی‌توانید این گروه اعلان‌ها را در اینجا پیکربندی کنید" "اعلان‌های دارای پراکسی" - - - - + "تمام اعلان‌های %1$s" + "مشاهده موارد بیشتر" "این برنامه از دوربین استفاده می‌کند." "این برنامه از میکروفون استفاده می‌کند." "این برنامه روی برنامه‌های دیگر در صفحه‌نمایش نشان داده می‌شود." @@ -883,7 +893,7 @@ "برنامه‌ای (%s) «مزاحم نشوید» را روشن کرد." "برنامه یا قانون خودکاری، «مزاحم نشوید» را روشن کرد." "تا %s" - "حفظ شود" + "حفظ کردن" "جایگزین کردن" "برنامه‌هایی که در پس‌زمینه اجرا می‌شوند" "برای جزئیات مربوط به مصرف باتری و داده، ضربه بزنید" @@ -898,7 +908,8 @@ "مجاز" "رد کردن" "برای زمان‌بندی «بهینه‌سازی باتری» ضربه بزنید" - "وقتی شارژ باتری به %d%% رسید، به‌طور خودکار روشن شود" + + "نه متشکرم" "زمان‌بندی «بهینه‌سازی باتری» روشن شد" "وقتی شارژ باتری به زیر %d%% برسد، «بهینه‌سازی باتری» به‌طور خودکار روشن می‌شود." @@ -930,6 +941,5 @@ "انتقال به بالا سمت چپ" "انتقال به پایین سمت راست" "انتقال به پایین سمت چپ" - - + "رد کردن" diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 5e9ae3047dbb..54d2d938507c 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -62,9 +62,12 @@ "USB-vianetsintää ei sallita" "Laitteelle tällä hetkellä kirjautunut käyttäjä ei voi ottaa USB-vianetsintää käyttöön. Vaihda käyttäjäksi ensisijainen käyttäjä, jotta voit käyttää tätä ominaisuutta." "USB-portti poistettu käytöstä" - "Laitteen suojaamiseksi nesteiltä ja lialta USB-portti on poistettu käytöstä, eikä se havaitse lisävarusteita.\n\nSaat ilmoituksen, kun USB-porttia voi taas käyttää." + + "USB-portti on käytössä ja voi havaita latureita sekä lisävarusteita" "Ota USB käyttöön" + + "Zoomaa koko näyttöön" "Venytä koko näyttöön" "Kuvakaappaus" @@ -118,6 +121,11 @@ "Peruuta" "Vahvista" "Yritä uudelleen" + "Tyhjä alue, napauta sitä peruuttaaksesi tunnistuksen" + "Yritä uudelleen" + "Kasvojasi katsotaan" + "Kasvot tunnistettu" + "Vahvistettu" "Kosketa sormenjälkitunnistinta" "Sormenjälkikuvake" "Etsitään kasvoja…" @@ -369,8 +377,7 @@ "Käyttöön klo %s" "%s saakka" "Tumma teema" - - + "Tumma teema\nVirransäästö" "NFC" "NFC on poistettu käytöstä" "NFC on käytössä" @@ -445,13 +452,16 @@ "Virransäästö on käytössä" "Rajoittaa suorituskykyä ja taustatiedonsiirtoa" "Poista virransäästö käytöstä" - "Tallennuksen tai suoratoiston aikana %s voi tallentaa mitä tahansa arkaluontoisia tietoja, kuten toistettavaa ääntä, salasanoja, maksutietoja, kuvia ja viestejä." + "Tallennuksen tai striimauksen aikana %s voi tallentaa mitä tahansa näytöllä näkyvää tai laitteen toistamaa arkaluontoista tietoa, kuten ääniä, salasanoja, maksutietoja, kuvia ja viestejä." + "Tallennuksen tai striimauksen aikana ominaisuuden tarjoava palvelu voi tallentaa mitä tahansa näytöllä näkyvää tai laitteen toistamaa arkaluontoista tietoa, kuten ääniä, salasanoja, maksutietoja, kuvia ja viestejä." "Arkaluontoiset tiedot saatavilla suoratoiston tai tallennuksen aikana" "Älä näytä uudelleen" "Poista kaikki" "Muuta asetuksia" - "Varovaiset ilmoitukset" - "Tyhjennä kaikki varovaiset ilmoitukset" + + + + "Älä häiritse ‑tila keskeytti ilmoitukset" "Aloita nyt" "Ei ilmoituksia" @@ -635,9 +645,11 @@ "Estä" "Jatka näyttämistä" "Pienennä" - "Hiljainen" + + "Jatka äänettömyyttä" - "Huomattava" + + "Jatka ilmoituksista hälyttämistä" "Poista ilmoitukset käytöstä" "Jatketaanko ilmoitusten näyttämistä tästä sovelluksesta?" @@ -651,10 +663,8 @@ "Näitä ilmoituksia ei voi muokata" "Tätä ilmoitusryhmää ei voi määrittää tässä" "Välitetty ilmoitus" - - - - + "Kaikki %1$s ‑ilmoitukset" + "Lisää" "Tämä sovellus käyttää kameraa." "Tämä sovellus käyttää mikrofonia." "Tämä sovellus näkyy näytöllä muiden sovellusten päällä." @@ -898,7 +908,8 @@ "Salli" "Estä" "Ajoita virransäästö napauttamalla" - "Käynnistä automaattisesti, kun akun lataustaso on %d %%." + + "Ei kiitos" "Virransäästön ajoitus otettu käyttöön" "Virransäästö käynnistyy automaattisesti, kun akun lataustaso on alle %d %%." @@ -930,6 +941,5 @@ "Siirrä oikeaan yläreunaan" "Siirrä vasempaan alareunaan" "Siirrä oikeaan alareunaan" - - + "Ohita" diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 6d5777ae7f39..a904d3068973 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -62,9 +62,12 @@ "Débogage USB non autorisé" "L\'utilisateur actuellement connecté sur cet appareil ne peut pas activer le débogage USB. Pour utiliser cette fonctionnalité, l\'utilisateur principal doit se connecter." "Le port USB a été désactivé" - "Pour protéger votre appareil contre les liquides et les débris, le port USB est désactivé et ne détectera pas les accessoires connectés.\n\nVous recevrez une notification lorsque vous pourrez utiliser le port USB de nouveau." + + "Le port USB a été activé afin de détecté les chargeurs et les accessoires" "Activer l\'USB" + + "Zoomer pour remplir l\'écran" "Étirer pour remplir l\'écran" "Capture d\'écran" @@ -118,6 +121,11 @@ "Annuler" "Confirmer" "Réessayer" + "Région vide, touchez l\'écran pour annuler l\'authentification" + "Veuillez réessayer" + "L\'appareil recherche votre visage…" + "Visage authentifié" + "Confirmé" "Touchez le capteur d\'empreintes digitales" "Icône d\'empreinte digitale" "Recherche de votre visage…" @@ -348,7 +356,7 @@ "Partage de connexion" "Point d\'accès sans fil" "Activation en cours…" - "Écon. données activée" + "Écon. données activé" %d appareil %d appareils @@ -369,8 +377,7 @@ "Actif à %s" "Jusqu\'à %s" "Thème sombre" - - + "Thème sombre\nÉconomiseur de pile" "NFC" "NFC désactivée" "NFC activée" @@ -445,13 +452,16 @@ "La fonction Économie d\'énergie est activée" "Réduire les performances et de fond" "Désactiver la fonction Économie d\'énergie" - "Durant l\'enregistrement ou la diffusion, %s peut capturer de l\'information confidentielle, comme l\'audio que vous faites jouer et vos mots de passe, vos données de paiement, vos photos et vos messages." + "Durant l\'enregistrement ou la diffusion, %s peut capturer de l\'information confidentielle qui s\'affiche sur votre écran ou qui joue sur votre appareil, comme de l\'audio, des mots de passe, des données de paiement, des photos et des messages." + "Durant l\'enregistrement ou la diffusion, le service offrant cette fonction peut capturer de l\'information confidentielle qui s\'affiche sur votre écran ou qui joue sur votre appareil, comme de l\'audio, des mots de passe, des données de paiement, des photos et des messages." "Exposer des renseignements sensibles durant la diffusion ou l\'enregistrement" "Ne plus afficher" "Tout effacer" "Gérer" - "Notifications discrètes" - "Effacer toutes les notifications discrètes" + + + + "Les notifications sont suspendues par le mode Ne pas déranger" "Commencer" "Aucune notification" @@ -635,9 +645,11 @@ "Bloquer" "Continuer à afficher" "Réduire" - "Alertes discrètes" + + "Continuer d\'util. mode silencieux" - "Alertes perturbatrices" + + "Continuer d\'envoyer des alertes" "Désactiver les notifications" "Continuer à afficher les notifications de cette application?" @@ -651,10 +663,8 @@ "Ces notifications ne peuvent pas être modifiées" "Ce groupe de notifications ne peut pas être configuré ici" "Notification par mandataire" - - - - + "Toutes les notifications de %1$s" + "En voir plus" "Cette application utilise l\'appareil photo." "Cette application utilise le microphone." "Cette application superpose du contenu par-dessus d\'autres applications à l\'écran." @@ -898,7 +908,8 @@ "Autoriser" "Refuser" "Toucher pour activer la fonction Économie d\'énergie" - "Activer automatiquement lorsque la pile est à %d %%" + + "Non merci" "La fonction Économie d\'énergie est activée" "La fonction Économie d\'énergie s\'activera automatiquement une fois que la pile sera en dessous de %d %%." @@ -930,6 +941,5 @@ "Déplacer dans coin sup. droit" "Déplacer dans coin inf. gauche" "Déplacer dans coin inf. droit" - - + "Fermer" diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 5d1e86327990..23f601c2178a 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -62,9 +62,12 @@ "Débogage USB non autorisé" "L\'utilisateur actuellement connecté sur cet appareil ne peut pas activer le débogage USB. Pour utiliser cette fonctionnalité, l\'utilisateur principal doit se connecter." "Port USB désactivé" - "Pour protéger votre appareil des liquides et des saletés, le port USB est désactivé et ne détecte plus les accessoires.\n\nVous recevrez une notification lorsque vous pourrez de nouveau utiliser le port USB en toute sécurité." + + "Port USB activé pour détecter les chargeurs et les accessoires" "Activer le port USB" + + "Zoomer pour remplir l\'écran" "Étirer pour remplir l\'écran" "Capture" @@ -118,6 +121,11 @@ "Annuler" "Confirmer" "Réessayer" + "Zone vide : appuyez pour annuler l\'authentification" + "Veuillez réessayer" + "Recherche de votre visage…" + "Visage authentifié" + "Confirmé" "Appuyez sur le lecteur d\'empreinte digitale" "Icône d\'empreinte digitale" "Recherche de votre visage…" @@ -369,8 +377,7 @@ "À partir de %s" "Jusqu\'à %s" "Thème foncé" - - + "Thème foncé\nÉconomiseur de batterie" "NFC" "La technologie NFC est désactivée" "La technologie NFC est activée" @@ -445,13 +452,16 @@ "Économiseur de batterie activé" "Limite les performances et les données en arrière-plan." "Désactiver l\'économiseur de batterie" - "Pendant que vous enregistrez ou castez un contenu, %s peut capturer des informations sensibles, comme le fichier audio que vous écoutez, vos mots de passe, vos informations de paiement, vos photos et vos messages." + "Pendant que vous enregistrez ou diffusez du contenu, %s peut capturer des informations sensibles affichées à l\'écran ou lues par votre appareil, y compris des contenus audio, des mots de passe, des informations de paiement, des photos et des messages." + "Pendant que vous enregistrez ou diffusez du contenu, le service concerné peut capturer des informations sensibles affichées à l\'écran ou lues par votre appareil, y compris des contenus audio, des mots de passe, des informations de paiement, des photos et des messages." "Exposition d\'informations sensibles lors de l\'enregistrement ou de la diffusion de contenu" "Ne plus afficher" "Tout effacer" "Gérer" - "Notifications discrètes" - "Effacer toutes les notifications discrètes" + + + + "Notifications suspendues par le mode Ne pas déranger" "Commencer" "Aucune notification" @@ -635,9 +645,11 @@ "Bloquer" "Continuer d\'afficher les notifications" "Réduire" - "Alertes discrètes" + + "Notifications silencieuses" - "Alertes interruptives" + + "Continuer de m\'avertir" "Désactiver les notifications" "Continuer d\'afficher les notifications de cette application ?" @@ -651,10 +663,8 @@ "Impossible de modifier ces notifications." "Vous ne pouvez pas configurer ce groupe de notifications ici" "Notification de proxy" - - - - + "Toutes les notifications de %1$s" + "Voir plus" "Cette application utilise la caméra." "Cette application utilise le micro." "Cette application se superpose aux autres applications sur l\'écran." @@ -898,7 +908,8 @@ "Autoriser" "Refuser" "Appuyez ici pour programmer l\'économiseur de batterie" - "Activer automatiquement lorsque l\'autonomie de la batterie atteint %d %%" + + "Non, merci" "Programmation de l\'économiseur de batterie activée" "L\'économiseur de batterie s\'active automatiquement lorsque l\'autonomie de la batterie est inférieure à %d %%." @@ -930,6 +941,5 @@ "Déplacer en haut à droite" "Déplacer en bas à gauche" "Déplacer en bas à droite" - - + "Ignorer" diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index f6f87e0ec7ac..fcb82e6b23ad 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -62,9 +62,12 @@ "Non se permite a depuración por USB" "O usuario coa sesión iniciada actualmente neste dispositivo non pode activar a depuración por USB. Para utilizar esta función, cambia ao usuario principal." "O porto USB está desactivado" - "Para protexer o dispositivo de líquidos ou residuos, desactivouse o porto USB e non detectará ningún accesorio.\n\nRecibirás unha notificación cando o poidas usar de novo." + + "Activouse o porto USB para detectar cargadores e accesorios" "Activar USB" + + "Ampliar ata ocupar todo" "Estirar ata ocupar todo" "Capt. pantalla" @@ -118,6 +121,11 @@ "Cancelar" "Confirmar" "Tentar de novo" + "A rexión está baleira; tócaa para cancelar a autenticación" + "Téntao de novo" + "Buscando a túa cara" + "Autenticouse a cara" + "Confirmada" "Toca o sensor de impresión dixital" "Icona de impresión dixital" "Buscándote…" @@ -307,7 +315,7 @@ "Activando…" "Brillo" "Xirar automaticamente" - "Xirar a pantalla automaticamente" + "Xirar pantalla automaticamente" "Modo %s" "Rotación bloqueada" "Vertical" @@ -369,8 +377,7 @@ "Desde: %s" "Ata: %s" "Tema escuro" - - + "Tema escuro\nAforro de batería" "NFC" "A opción NFC está desactivada" "A opción NFC está activada" @@ -445,13 +452,16 @@ "A función Aforro de batería está activada" "Reduce o rendemento e os datos en segundo plano" "Desactivar a función Aforro de batería" - "Mentres graves ou emitas contido, %s pode captar información confidencial, como o audio que reproduzas, os contrasinais, a información de pago, as fotos e as mensaxes." + "Mentres graves ou emitas contido, %s pode captar información confidencial que se mostre na pantalla ou se reproduza no dispositivo, como o audio que reproduzas, os contrasinais, a información de pago, as fotos e as mensaxes." + "Mentres graves ou emitas contido, o servizo que ofrece esta función pode captar información confidencial que se mostre na pantalla ou se reproduza no dispositivo, como o audio que reproduzas, os contrasinais, a información de pago, as fotos e as mensaxes." "Revelar información confidencial durante a emisión ou a gravación" "Non mostrar outra vez" "Eliminar todas" "Xestionar" - "Notificacións discretas" - "Borra todas as notificacións discretas" + + + + "O modo Non molestar puxo en pausa as notificacións" "Iniciar agora" "Non hai notificacións" @@ -635,9 +645,11 @@ "Bloquear" "Continuar mostrando notificacións" "Minimizar" - "En silencio" + + "Notificacións silenciosas" - "Emerxente" + + "Continuar recibindo notificacións" "Desactivar notificacións" "Queres seguir mostrando as notificacións desta aplicación?" @@ -647,14 +659,12 @@ "Mostra as notificacións con prioridade baixa. Sempre en silencio." "Mostra as notificacións con prioridade baixa. Sempre en silencio." "Mostra as notificacións con prioridade baixa. Sempre en silencio." - "Chama a túa atención cun son e cunha icona na barra de estado Móstrase na pantalla de bloqueo." + "Chama a túa atención cun son e cunha icona na barra de estado. Móstrase na pantalla de bloqueo." "Estas notificacións non se poden modificar." "Aquí non se pode configurar este grupo de notificacións" "Notificación mediante proxy" - - - - + "As %1$s notificacións" + "Ver máis" "Esta aplicación está utilizando a cámara." "Esta aplicación está utilizando o micrófono." "Esta aplicación móstrase sobre outras aplicacións da pantalla." @@ -730,7 +740,7 @@ "SMS" "Música" "YouTube" - "Calendario" + "Calendar" "Mostrar cos controis de volume" "Non molestar" "Atallo dos botóns de volume" @@ -898,7 +908,8 @@ "Permitir" "Denegar" "Tocar para programar a función Aforro de batería" - "Actívase automaticamente cando a batería está ao %d %%" + + "Non, grazas" "Activouse o programa da función Aforro de batería" "Activarase automaticamente a función Aforro de batería en canto o nivel de carga sexa inferior ao %d %%." @@ -930,6 +941,5 @@ "Mover á parte superior dereita" "Mover á parte infer. esquerda" "Mover á parte inferior dereita" - - + "Ignorar" diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index e5a742404929..7b2c6d3e03eb 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -62,9 +62,12 @@ "USB ડીબગિંગની મંજૂરી નથી" "હાલમાં આ ઉપકરણમાં સાઇન ઇન થયેલ વપરાશકર્તા USB ડિબગીંગ ચાલુ કરી શકતા નથી. આ સુવિધાનો ઉપયોગ કરવા માટે પ્રાથમિક વપરાશકર્તા પર સ્વિચ કરો." "USB પોર્ટ બંધ કરવામાં આવ્યો છે" - "પ્રવાહી અથવા ધૂળથી તમારા ડિવાઇસનું રક્ષણ કરવા માટે, USB પોર્ટ બંધ કરવામાં આવ્યો છે અને કોઈ ઍક્સેસરી શોધશે નહીં.\n\nફરી USB પોર્ટનો ઉપયોગ કરવાનું સુરક્ષિત હશે ત્યારે તમને નોટિફિકેશન આપવામાં આવશે." + + "ચાર્જર અને ઍક્સેસરીની ઓળખ માટે USB પોર્ટ ચાલુ કર્યું" "USB ચાલુ કરો" + + "સ્ક્રીન ભરવા માટે ઝૂમ કરો" "સ્ક્રીન ભરવા માટે ખેંચો" "સ્ક્રીનશૉટ" @@ -118,6 +121,11 @@ "રદ કરો" "કન્ફર્મ કરો" "ફરી પ્રયાસ કરો" + "ખાલી વિસ્તાર, પ્રમાણીકરણ રદ કરવા માટે ટૅપ કરો" + "કૃપા કરી ફરી પ્રયાસ કરો" + "તમારો ચહેરો શોધી રહ્યાં છીએ" + "ચહેરાનું પ્રમાણીકરણ થયું" + "પુષ્ટિ કરી" "ફિંગરપ્રિન્ટના સેન્સરને સ્પર્શ કરો" "ફિંગરપ્રિન્ટનું આઇકન" "તમારા માટે શોધી રહ્યાં છે..." @@ -369,8 +377,7 @@ "%s વાગ્યે" "%s સુધી" "ઘેરી થીમ" - - + "ઘેરી થીમ\nબૅટરી સેવર" "NFC" "NFC અક્ષમ કરેલ છે" "NFC સક્ષમ કરેલ છે" @@ -445,13 +452,16 @@ "બૅટરી સેવર ચાલુ છે" "પ્રદર્શન અને બૅકગ્રાઉન્ડ ડેટા ઘટાડે છે" "બૅટરી સેવર બંધ કરો" - "રેકોર્ડ અથવા કાસ્ટ કરતી વખતે, %s કોઈ પણ સંવેદનશીલ માહિતી કૅપ્ચર કરી શકે છે, જેમ કે તમે વગાડો તે ઑડિયો અને તમારા પાસવર્ડ, ચુકવણીની માહિતી, ફોટા અને સંદેશા." + "રેકોર્ડ અથવા કાસ્ટ કરતી વખતે, %s ઑડિયો, પાસવર્ડ, ચુકવણીની માહિતી, ફોટા અને સંદેશા સહિતની આવી કોઈપણ સંવેદનશીલ માહિતી જે તમારા સ્ક્રીન પર દેખાતી હોય અથવા તમારા ડિવાઇસ પર ચલાવવામાં આવતી હોય, તેને કૅપ્ચર કરી શકે છે." + "રેકોર્ડ અથવા કાસ્ટ કરતી વખતે, આ સેવા આપતી સુવિધા ઑડિયો, પાસવર્ડ, ચુકવણીની માહિતી, ફોટા અને સંદેશા સહિતની આવી કોઈપણ સંવેદનશીલ માહિતી જે તમારા સ્ક્રીન પર દેખાતી હોય અથવા તમારા ડિવાઇસ પર ચલાવવામાં આવતી હોય, તેને કૅપ્ચર કરી શકે છે." "કાસ્ટિંગ/રેકોર્ડિંગ દરમિયાન સંવેદનશીલ માહિતી દર્શાવવી" "ફરીથી બતાવશો નહીં" "બધુ સાફ કરો" "મેનેજ કરો" - "સામાન્ય નોટિફિકેશન" - "બધા સામાન્ય નોટિફિકેશન સાફ કરો" + + + + "ખલેલ પાડશો નહીં દ્વારા થોભાવેલ નોટિફિકેશન" "હવે પ્રારંભ કરો" "કોઈ સૂચનાઓ નથી" @@ -635,9 +645,11 @@ "બ્લૉક કરો" "બતાવવાનું ચાલુ રાખો" "નાનું કરો" - "સાઇલન્ટ નોટિફિકેશન" + + "સાઇલન્ટ મોડ ચાલુ રાખો" - "વિક્ષેપ કરી શકતા" + + "અલર્ટ કરવાનું ચાલુ રાખો" "નોટિફિકેશન બંધ કરો" "આ ઍપમાંથી નોટિફિકેશન બતાવવાનું ચાલુ રાખીએ?" @@ -651,10 +663,8 @@ "આ નોટિફિકેશનમાં કોઈ ફેરફાર થઈ શકશે નહીં." "નોટિફિકેશનના આ ગ્રૂપની ગોઠવણી અહીં કરી શકાશે નહીં" "પ્રૉક્સી નોટિફિકેશન" - - - - + "%1$sના બધા નોટિફિકેશન" + "વધુ જુઓ" "આ ઍપ કૅમેરાનો ઉપયોગ કરી રહી છે." "આ ઍપ માઇક્રોફોનનો ઉપયોગ કરી રહી છે." "આ ઍપ તમારી સ્ક્રીન પરની અન્ય ઍપની ઉપર પ્રદર્શિત થઈ રહી છે." @@ -898,7 +908,8 @@ "મંજૂરી આપો" "નકારો" "બૅટરી સેવર શેડ્યૂલ કરવા માટે ટૅપ કરો" - "બૅટરીનું સ્તર %d%% પર હોય ત્યારે ઑટોમૅટિક રીતે ચાલુ કરો" + + "ના, આભાર" "બૅટરી સેવર શેડ્યૂલ ચાલુ થયું" "બૅટરીનું સ્તર એકવાર %d%% કરતાં ઓછું થાય તે પછી બૅટરી સેવર ઑટોમૅટિક રીતે ચાલુ થશે." @@ -930,6 +941,5 @@ "ઉપર જમણે ખસેડો" "નીચે ડાબે ખસેડો" "નીચે જમણે ખસેડો" - - + "છોડી દો" diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 17c26810a05f..941ca05be7ff 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -62,9 +62,12 @@ "USB डीबगिंग की अनुमति नहीं है" "अभी इस डिवाइस में जिस उपयोगकर्ता ने साइन इन किया है, वो USB डीबगिंग चालू नहीं कर सकता. इस सुविधा का इस्तेमाल करने के लिए, प्राथमिक उपयोगकर्ता में बदलें." "यूएसबी पोर्ट बंद है" - "तरल चीज़ या कचरे से आपके डिवाइस की सुरक्षा करने के लिए, यूएसबी पोर्ट को बंद कर दिया गया है और वह किसी भी एक्सेसरी की पहचान नहीं करेगा.\n\nयूएसबी पोर्ट का दोबारा इस्तेमाल करना सुरक्षित होने पर आपको सूचित किया जाएगा." + + "चार्जर और एक्सेसरी पहचानने के लिए यूएसबी पोर्ट को चालू कर दिया गया है" "यूएसबी चालू करें" + + "स्‍क्रीन भरने के लिए ज़ूम करें" "स्‍क्रीन भरने के लिए खींचें" "स्क्रीनशॉट" @@ -118,6 +121,11 @@ "रद्द करें" "पुष्टि करें" "फिर से कोशिश करें" + "कोई चेहरा नहीं मिला, टैप करके पुष्टि की प्रक्रिया रद्द करें" + "कृपया फिर से कोशिश करें" + "आपके चेहरे की पुष्टि की जा रही है" + "चेहरे की पुष्टि हो गई" + "पुष्टि हो गई" "फ़िंगरप्रिंट सेंसर को छुएं" "फ़िंगरप्रिंट आइकॉन" "आपको पहचान रहा है…" @@ -130,17 +138,17 @@ "बैटरी एक बार." "बैटरी दो बार." "बैटरी तीन बार." - "बैटरी पूर्ण." + "बैटरी पूरी है." "कोई फ़ोन नहीं." "फ़ोन एक बार." "फ़ोन दो बार." "फोन तीन बार." - "फ़ोन सि‍ग्‍नल पूर्ण." + "फ़ोन सि‍ग्‍नल पूरा." "कोई डेटा नहीं." "डेटा एक बार." "डेटा दो बार." "डेटा तीन बार." - "पूर्ण डेटा सि‍ग्‍नल." + "डेटा सि‍ग्‍नल पूरा." "%s से कनेक्ट किया गया." "%s से कनेक्ट किया गया." "%s से कनेक्ट है." @@ -148,7 +156,7 @@ "WiMAX एक बार." "WiMAX दो बार." "WiMAX तीन बार." - "WiMAX सि‍ग्‍नल पूर्ण." + "WiMAX सि‍ग्‍नल पूरा है." "ईथरनेट डिस्‍कनेक्‍ट किया गया." "ईथरनेट कनेक्‍ट किया गया." "कोई सिग्नल नहीं." @@ -157,7 +165,7 @@ "एकल बार." "दो बार." "तीन बार." - "पूर्ण सिग्नल." + "सिग्नल पूरा है." "चालू." "बंद." "कनेक्ट है." @@ -211,7 +219,7 @@ "लॉक स्क्रीन." "सेटिंग" "खास जानकारी." - "कार्य लॉक स्‍क्रीन" + "वर्क लॉक स्‍क्रीन" "बंद करें" "%1$s." "वाई-फ़ाई को बंद किया गया." @@ -369,8 +377,7 @@ "%s पर चालू की जाएगी" "%s तक" "गहरे रंग वाली थीम" - - + "गहरे रंग वाली थीम\nबैटरी सेवर" "एनएफ़सी" "NFC बंद है" "NFC चालू है" @@ -379,7 +386,7 @@ "खास जानकारी टॉगल करें" "चार्ज हो गई है" "चार्ज हो रही है" - "पूर्ण होने में %s शेष" + "पूरा होने में %s शेष" "चार्ज नहीं हो रही है" "नेटवर्क को\nमॉनीटर किया जा सकता है" "खोजें" @@ -445,13 +452,16 @@ "बैटरी सेवर चालू है" "निष्‍पादन और पृष्ठभूमि डेटा को कम करता है" "बैटरी सेवर बंद करें" - "रिकॉर्ड या कास्ट करते समय, %s आपके चलाए जा रहे ऑडियो, आपके पासवर्ड, भुगतान जानकारी, फ़ोटो और मैसेज जैसी संवेदनशील जानकारी कैप्चर कर सकता है." + "रिकॉर्ड या कास्ट करते समय, %s आपकी स्क्रीन पर दिखाई जा रही या आपके डिवाइस पर चलाई जा रही संवेदनशील जानकारी एक्सेस कर सकता है. इस जानकारी में ऑडियो, पासवर्ड, भुगतान की जानकारी, फ़ोटो और मैसेज शामिल हैं." + "रिकॉर्ड या कास्ट करते समय, यह सेवा देने वाला ऐप्लिकेशन आपकी स्क्रीन पर दिखाई जा रही या आपके डिवाइस पर चलाई जा रही संवेदनशील जानकारी एक्सेस कर सकता है. इस जानकारी में ऑडियो, पासवर्ड, भुगतान की जानकारी, फ़ोटो और मैसेज शामिल हैं." "कास्ट करने/रिकॉर्ड करने के दौरान संवेदनशील जानकारी का सबके सामने आ जाना" "फिर से न दिखाएं" "सभी को हटाएं" "प्रबंधित करें" - "बिना आवाज़ वाली सूचनाएं" - "बिना आवाज़ वाली सभी सूचनाएं हटाएं" + + + + "\'परेशान न करें\' सुविधा के ज़रिए कुछ समय के लिए सूचनाएं दिखाना रोक दिया गया है" "अब शुरू करें" "कोई सूचना नहीं मिली" @@ -635,9 +645,11 @@ "ब्लॉक करें" "दिखाना जारी रखें" "सूचनाएं छोटी करें" - "बिना आवाज़ के" + + "साइलेंट मोड में सूचनाएं पाएं" - "आवाज़ वाली सूचनाएं" + + "सूचना देना जारी रखें" "सूचनाएं बंद करें" "इस ऐप्लिकेशन से जुड़ी सूचनाएं दिखाना जारी रखें?" @@ -651,10 +663,8 @@ "ये सूचनाएं नहीं बदली जा सकती हैं." "सूचनाओं के इस समूह को यहां कॉन्फ़िगर नहीं किया जा सकता" "प्रॉक्सी सूचना" - - - - + "सभी %1$s सूचनाएं" + "ज़्यादा देखें" "यह ऐप्लिकेशन कैमरे का इस्तेमाल कर रहा है." "यह ऐप्लिकेशन माइक्रोफ़ोन का इस्तेमाल कर रहा है." "यह ऐप्लिकेशन आपकी स्क्रीन पर इस्तेमाल हो रहे दूसरे ऐप्लिकेशन के ऊपर दिखाया जा रहा है." @@ -792,16 +802,16 @@ "कम प्राथमिकता वाली सूचना के आइकॉन दिखाएं" "अन्य" "विभाजित स्क्रीन विभाजक" - "बाईं स्क्रीन को पूर्ण स्क्रीन बनाएं" + "बाईं स्क्रीन को फ़ुल स्क्रीन बनाएं" "बाईं स्क्रीन को 70% बनाएं" "बाईं स्क्रीन को 50% बनाएं" "बाईं स्क्रीन को 30% बनाएं" - "दाईं स्क्रीन को पूर्ण स्क्रीन बनाएं" - "ऊपर की स्क्रीन को पूर्ण स्क्रीन बनाएं" + "दाईं स्क्रीन को फ़ुल स्क्रीन बनाएं" + "ऊपर की स्क्रीन को फ़ुल स्क्रीन बनाएं" "ऊपर की स्क्रीन को 70% बनाएं" "ऊपर की स्क्रीन को 50% बनाएं" "ऊपर की स्क्रीन को 30% बनाएं" - "नीचे की स्क्रीन को पूर्ण स्क्रीन बनाएं" + "नीचे की स्क्रीन को फ़ुल स्क्रीन बनाएं" "स्थिति %1$d, %2$s. में बदलाव करने के लिए दो बार छूएं." "%1$s. जोड़ने के लिए दो बार छूएं." "%1$s को ले जाएं" @@ -898,7 +908,8 @@ "मंज़ूरी दें" "नामंज़ूर करें" "बैटरी सेवर शेड्यूल करने के लिए टैप करें" - "बैटरी के %d%% होने पर अपने आप चालू किया जाए" + + "जी नहीं, शुक्रिया" "शेड्यूल किया गया बैटरी सेवर चालू हो गया" "बैटरी के %d%% से कम होने पर बैटरी सेवर अपने आप चालू हो जाएगा." @@ -930,6 +941,5 @@ "सबसे ऊपर दाईं ओर ले जाएं" "बाईं ओर सबसे नीचे ले जाएं" "सबसे नीचे दाईं ओर ले जाएं" - - + "खारिज करें" diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index cea05292fa71..ba0d1fb65613 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -62,9 +62,12 @@ "Otklanjanje pogrešaka putem USB-a nije dopušteno" "Korisnik koji je trenutačno prijavljen na ovaj uređaj ne može uključiti otklanjanje pogrešaka putem USB-a. Da biste upotrebljavali tu značajku, prijeđite na primarnog korisnika." "Onemogućen je USB priključak" - "Radi zaštite uređaja od tekućine ili prljavštine USB priključak onemogućen je i neće otkrivati pribor.\n\nPrimit ćete obavijest kad upotreba USB priključka ponovo bude sigurna." + + "USB priključak omogućen za otkrivanje punjača i opreme" "Omogući USB" + + "Zumiraj i ispuni zaslon" "Rastegni i ispuni zaslon" "Snimka zaslona" @@ -118,6 +121,11 @@ "Odustani" "Potvrdi" "Pokušaj ponovo" + "Prazno područje, dodirnite da biste otkazali autentifikaciju" + "Pokušajte ponovo" + "Traženje lica" + "Lice je autentificirano" + "Potvrđeno" "Dodirnite senzor otiska prsta" "Ikona otiska prsta" "Tražimo vas…" @@ -371,8 +379,7 @@ "Uključuje se u %s" "Do %s" "Tamna tema" - - + "Tamna tema\nŠtednja baterije" "NFC" "NFC je onemogućen" "NFC je omogućen" @@ -448,13 +455,16 @@ "Štednja baterije je uključena" "Smanjuje količinu rada i pozadinske podatke" "Isključite Štednju baterije" - "Tijekom snimanja ili emitiranja %s može zabilježiti sve osjetljive podatke, na primjer audiozapis koji reproducirate i vaše zaporke, podatke o plaćanjima, fotografije i poruke." + "Tijekom snimanja ili emitiranja %s može zabilježiti sve osjetljive podatke koji se prikazuju na zaslonu ili reproduciraju s uređaja, uključujući osjetljive podatke kao što su audiozapisi, lozinke, podaci o plaćanjima, fotografije i poruke." + "Tijekom snimanja ili emitiranja usluga u sklopu koje se pruža ova funkcija može zabilježiti sve osjetljive podatke koji se prikazuju na zaslonu ili reproduciraju s uređaja, uključujući osjetljive podatke kao što su audiozapisi, lozinke, podaci o plaćanjima, fotografije i poruke." "Izlaganje osjetljivih podataka tijekom emitiranja/snimanja" "Ne prikazuj ponovo" "Izbriši sve" "Upravljajte" - "Neupadljive obavijesti" - "Izbrišite sve neupadljive obavijesti" + + + + "Značajka Ne uznemiravaj pauzirala je Obavijesti" "Započni sad" "Nema obavijesti" @@ -638,9 +648,11 @@ "Blokiraj" "Nastavi prikazivati" "Minimiziraj" - "Tiho" + + "Nastavi tiho" - "Prekidajuća" + + "Nastavi obavještavati" "Isključi obavijesti" "Želite li da se obavijesti te aplikacije nastave prikazivati?" @@ -654,10 +666,8 @@ "Te se obavijesti ne mogu izmijeniti." "Ta se grupa obavijesti ne može konfigurirati ovdje" "Obavijest poslana putem proxyja" - - - - + "Sve obavijesti aplikacije %1$s" + "Pogledajte više" "Ova aplikacija upotrebljava kameru." "Ova aplikacija upotrebljava mikrofon." "Ova se aplikacija prikazuje preko drugih aplikacija na zaslonu." @@ -903,7 +913,8 @@ "Dopusti" "Odbij" "Dodirnite za zakazivanje štednje baterije" - "Uključuje se automatski kada je razina baterije na %d%%" + + "Ne, hvala" "Uključen je raspored štednje baterije" "Štednja baterije uključit će se automatski kad razina baterije padne ispod %d%%." @@ -935,6 +946,5 @@ "Premjesti u gornji desni kut" "Premjesti u donji lijevi kut" "Premjestite u donji desni kut" - - + "Odbaci" diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index cc0c07d283a3..941e22974cdf 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -62,9 +62,12 @@ "Az USB hibakeresése nem engedélyezett" "Az eszközre jelenleg bejelentkezett felhasználó nem engedélyezheti az USB-hibakeresést. A funkció használatához váltson az elsődleges felhasználóra." "USB-port letiltva" - "Az eszköz folyadéktól és szennyeződésektől való megóvása érdekében az USB-portot letiltottuk, így az nem észleli a kiegészítőket.\n\nÉrtesítést küldünk, amikor ismét biztonságosan használhatja az USB-portot." + + "Az USB-csatlakozó számára engedélyezve van a töltők és más tartozékok észlelése" "USB engedélyezése" + + "Nagyítás a kitöltéshez" "Nyújtás kitöltéshez" "Képernyőkép" @@ -118,6 +121,11 @@ "Mégse" "Megerősítés" "Újrapróbálkozás" + "Üres régió. Koppintson a hitelesítés visszavonásához" + "Próbálja újra" + "Arc keresése" + "Arc hitelesítve" + "Megerősítve" "Érintse meg az ujjlenyomat-érzékelőt" "Ujjlenyomat ikonja" "Keresem az Ön arcát…" @@ -369,8 +377,7 @@ "Bekapcsolás: %s" "Eddig: %s" "Sötét téma" - - + "Sötét téma\nAkkumulátorkímélő mód" "NFC" "Az NFC ki van kapcsolva" "Az NFC be van kapcsolva" @@ -445,13 +452,16 @@ "Akkumulátorkímélő mód bekapcsolva" "Csökkenti a teljesítményt és a háttéradatok használatát" "Akkumulátorkímélő mód kikapcsolása" - "Felvétel készítésekor vagy átküldés során a(z) %s rögzíthet bizalmas információkat, például a lejátszott hangokat, a jelszavakat, a fizetési adatokat, a fotókat és az üzeneteket." + "Felvétel rögzítésekor és átküldés során a(z) %s rögzítheti a képernyőn megjelenő és az eszközön lejátszott bizalmas információkat, például hangfelvételeket, jelszavakat, fizetési adatokat, fotókat és üzeneteket." + "Felvétel rögzítésekor és átküldés során a funkciót biztosító szolgáltató rögzítheti a képernyőn megjelenő és az eszközön lejátszott bizalmas információkat, például hangfelvételeket, jelszavakat, fizetési adatokat, fotókat és üzeneteket." "Bizalmas adatok feltárása átküldés vagy rögzítés során" "Ne jelenjen meg többé" "Az összes törlése" "Kezelés" - "Diszkrét értesítések" - "Az összes diszkrét értesítés törlése" + + + + "Ne zavarjanak funkcióval szüneteltetett értesítések" "Indítás most" "Nincs értesítés" @@ -635,9 +645,11 @@ "Tiltás" "Megjelenítés továbbra is" "Kis méret" - "Diszkrét" + + "Néma megjelenítés" - "Megszakító" + + "Értesítések folytatása" "Az értesítések kikapcsolása" "Továbbra is megjelenjenek az alkalmazás értesítései?" @@ -651,10 +663,8 @@ "Ezeket az értesítéseket nem lehet módosítani." "Az értesítések jelen csoportját itt nem lehet beállítani" "Továbbított értesítés" - - - - + "Az összes %1$s-értesítés" + "Továbbiak" "Ez az alkalmazás használja a kamerát." "Ez az alkalmazás használja a mikrofont." "Ez az alkalmazás a képernyőn lévő egyéb alkalmazások előtt jelenik meg." @@ -898,7 +908,8 @@ "Engedélyezés" "Elutasítás" "Koppintson az akkumulátorkímélő mód ütemezéséhez" - "Automatikus bekapcsolás, ha az akkumulátor töltöttsége %d%%" + + "Nem" "Akkumulátorkímélő mód ütemezése bekapcsolva" "Az akkumulátorkímélő mód automatikusan bekapcsol, ha az akkumulátor töltöttsége %d%% alá esik." @@ -930,6 +941,5 @@ "Áthelyezés fel és jobbra" "Áthelyezés le és balra" "Áthelyezés le és jobbra" - - + "Elvetés" diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index c6faea52ae11..9ebd2d69ab99 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -62,9 +62,12 @@ "USB վրիպազերծումը արգելված է" "Ընթացիկ հաշվի օգտատերը չի կարող միացնել USB վրիպազերծումը: Այս գործառույթը միացնելու համար մուտք գործեք հիմնական օգտատիրոջ հաշվով:" "USB միացքն անջատված է" - "USB միացքն անջատվել է, որպեսզի ձեր սարքը չթրջվի կամ չաղտոտվի: Այժմ USB միացքի միջոցով հնարավոր չէ միացնել այլ սարքեր:\n\nԴուք ծանուցում կստանաք, երբ այն նորից անվտանգ լինի օգտագործել:" + + "USB միացքը միացվել է՝ լիցքավորիչներն ու լրասարքերը հայտնաբերելու համար" "Միացնել USB-ն" + + "Խոշորացնել` էկրանը լցնելու համար" "Ձգել` էկրանը լցնելու համար" "Սքրինշոթ" @@ -118,6 +121,11 @@ "Չեղարկել" "Հաստատել" "Նորից փորձել" + "Ոչինչ չկա։ Հպեք՝ նույնականացումը չեղարկելու համար։" + "Նորից փորձեք" + "Դեմքի նույնականացում" + "Դեմքը ճանաչվեց" + "Հաստատվեց" "Հպեք մատնահետքերի սկաներին" "Մատնահետքի պատկերակ" "Դեմքի ճանաչում…" @@ -369,8 +377,7 @@ "Կմիացվի ժամը %s-ին" "Մինչև %s" "Մուգ թեմա" - - + "Մուգ թեմա\nՄարտկոցի տնտեսում" "NFC" "NFC-ն անջատված է" "NFC-ն միացված է" @@ -445,13 +452,16 @@ "Մարտկոցի տնտեսումը միացված է" "Նվազեցնում է ծանրաբեռնվածությունը և ֆոնային տվյալները" "Անջատել մարտկոցի տնտեսումը" - "Ձայնագրման և հեռարձակման ընթացքում %s-ը կարող է գաղտնի տեղեկություններ գրանցել, օրինակ՝ աուդիո նյութեր, գաղտնաբառեր, վճարային տվյալներ, լուսանկարներ և հաղորդագրություններ։" + "%s ծառայությունը ձայնագրման և հեռարձակման ընթացքում կարող է պահել ձեր սարքի էկրանին ցուցադրվող տեղեկությունները և ձեր սարքով նվագարկվող նյութերը, որոնք կարող են խիստ անձնական լինել, օրինակ՝ աուդիո նյութերը, գաղտնաբառերը, վճարային տվյալները, լուսանկարները և հաղորդագրությունները:" + "Այս գործառույթը տրամադրող ծառայությունը ձայնագրման և հեռարձակման ընթացքում կարող է պահել ձեր սարքի էկրանին ցուցադրվող տեղեկությունները և ձեր սարքով նվագարկվող նյութերը, որոնք կարող են խիստ անձնական լինել, օրինակ՝ աուդիո նյութերը, գաղտնաբառերը, վճարային տվյալները, լուսանկարները և հաղորդագրությունները:" "Գաղտնի տեղեկությունների բացահայտում հեռարձակման/ձայնագրման ընթացքում" "Այլևս ցույց չտալ" "Մաքրել բոլորը" "Կառավարել" - "Չհոգնեցնող ծանուցումներ" - "Ջնջել բոլոր չհոգնեցնող ծանուցումները" + + + + "Ծանուցումները չեն ցուցադրվի «Չանհանգստացնել» ռեժիմում" "Սկսել հիմա" "Ծանուցումներ չկան" @@ -635,9 +645,11 @@ "Արգելափակել" "Ցուցադրել" "Ծալել" - "Անձայն" + + "Չմիացնել ձայնը" - "Ծանուցումներ ձայնային ազդանշանով" + + "Ծանուցել" "Անջատել ծանուցումները" "Ցուցադրե՞լ ծանուցումներ այս հավելվածից։" @@ -651,10 +663,8 @@ "Այս ծանուցումները չեն կարող փոփոխվել:" "Ծանուցումների տվյալ խումբը հնարավոր չէ կարգավորել այստեղ" "Ծանուցումն ուղարկվել է պրոքսի սերվերի միջոցով" - - - - + "%1$s հավելվածի բոլոր ծանուցումները" + "Իմանալ ավելին" "Այս հավելվածն օգտագործում է տեսախցիկը:" "Այս հավելվածն օգտագործում է խոսափողը:" "Այս հավելվածը ցուցադրվում է մյուս հավելվածների վրայից:" @@ -898,7 +908,8 @@ "Թույլատրել" "Մերժել" "Հպեք՝ մարտկոցի տնտեսման ռեժիմը կարգավորելու համար" - "Ավտոմատ միացնել, երբ մարտկոցի լիցքը դառնա %d%%" + + "Ոչ" "Մարտկոցի տնտեսման ռեժիմին ավտոմատ անցումը միացված է" "Մարտկոցի տնտեսման ռեժիմն ավտոմատ կմիանա, երբ մարտկոցի լիցքը %d%%-ից պակասի:" @@ -930,6 +941,5 @@ "Տեղափոխել վերև՝ աջ" "Տեղափոխել ներքև՝ ձախ" "Տեղափոխել ներքև՝ աջ" - - + "Փակել" diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index ac4d2c76bcf9..bf5d3a17705a 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -62,9 +62,10 @@ "Debug USB tidak diizinkan" "Pengguna yang sedang login ke perangkat ini tidak dapat mengaktifkan proses debug USB. Beralihlah ke pengguna utama untuk menggunakan fitur ini." "Port USB dinonaktifkan" - "Untuk melindungi perangkat dari cairan atau kotoran, port USB dinonaktifkan dan tidak akan mendeteksi aksesori apa pun.\n\nAnda akan diberi tahu jika sudah aman untuk menggunakan port USB kembali." + "Untuk melindungi perangkat dari cairan atau kotoran, port USB dinonaktifkan dan tidak akan mendeteksi aksesori apa pun.\n\nAnda akan diberi tahu jika sudah diperbolehkan menggunakan port USB kembali." "Port USB diaktifkan untuk mendeteksi pengisi daya dan aksesori" "Aktifkan USB" + "Pelajari lebih lanjut" "Perbesar utk mengisi layar" "Rentangkn utk mngisi layar" "Screenshot" @@ -118,6 +119,11 @@ "Batal" "Konfirmasi" "Coba lagi" + "Area kosong. Tap untuk membatalkan autentikasi" + "Coba lagi" + "Mencari wajah Anda" + "Wajah diautentikasi" + "Dikonfirmasi" "Sentuh sensor sidik jari" "Ikon sidik jari" "Mencari wajah Anda…" @@ -369,8 +375,7 @@ "Aktif pada %s" "Hingga %s" "Tema Gelap" - - + "Tema Gelap\nPenghemat baterai" "NFC" "NFC dinonaktifkan" "NFC diaktifkan" @@ -445,13 +450,14 @@ "Penghemat Baterai aktif" "Mengurangi kinerja dan data latar belakang" "Nonaktifkan Penghemat Baterai" - "Selagi merekam atau melakukan transmisi, %s dapat mengambil informasi sensitif, seperti audio yang diputar dan sandi, info pembayaran, foto, dan pesan Anda." + "Saat merekam atau melakukan transmisi, %s dapat mengambil informasi sensitif apa pun yang ditampilkan di layar atau diputar dari perangkat Anda, termasuk informasi sensitif seperti audio, sandi, info pembayaran, foto, dan pesan." + "Saat merekam atau melakukan transmisi, layanan yang memberikan fungsi ini dapat mengambil informasi sensitif apa pun yang ditampilkan di layar atau diputar dari perangkat Anda, termasuk informasi sensitif seperti audio, sandi, info pembayaran, foto, dan pesan." "Menampakkan informasi sensitif saat melakukan transmisi/merekam" "Jangan tampilkan lagi" "Hapus semua" "Kelola" - "Notifikasi senyap" - "Hapus semua notifikasi senyap" + "Notifikasi senyap" + "Hapus semua notifikasi senyap" "Notifikasi dijeda oleh mode Jangan Ganggu" "Mulai sekarang" "Tidak ada notifikasi" @@ -635,9 +641,9 @@ "Blokir" "Terus tampilkan" "Perkecil" - "Senyap" + "Senyap" "Tetap nonaktif" - "Mengganggu" + "Pemberitahuan" "Terus beri tahu" "Nonaktifkan notifikasi" "Terus tampilkan notifikasi dari aplikasi ini?" @@ -651,10 +657,8 @@ "Notifikasi ini tidak dapat diubah." "Grup notifikasi ini tidak dapat dikonfigurasi di sini" "Notifikasi proxy" - - - - + "Semua notifikasi %1$s" + "Lihat lainnya" "Aplikasi ini sedang menggunakan kamera." "Aplikasi ini sedang menggunakan mikrofon." "Aplikasi ini ditampilkan di atas aplikasi lain di layar." @@ -898,7 +902,7 @@ "Izinkan" "Tolak" "Tap untuk menjadwalkan Penghemat Baterai" - "Aktifkan otomatis jika baterai tinggal %d%%" + "Aktifkan jika daya baterai kemungkinan akan habis" "Tidak, terima kasih" "Jadwal Penghemat Baterai diaktifkan" "Penghemat Baterai akan aktif otomatis jika baterai kurang dari %d%%." @@ -930,6 +934,5 @@ "Pindahkan ke kanan atas" "Pindahkan ke kiri bawah" "Pindahkan ke kanan bawah" - - + "Tutup" diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 88b091aa048f..b4b9be9485f4 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -62,9 +62,12 @@ "USB-villuleit ekki leyfð" "Notandinn sem er skráður inn í þetta tæki núna getur ekki kveikt á USB-villuleit. Til þess að nota þennan eiginleika skaltu skipta yfir í aðalnotandann." "USB-tengi gert óvirkt" - "Til að vernda tækið frá vökva og óhreinindum er USB-tengið óvirkt og mun ekki greina aukabúnað.\n\nÞú færð tilkynningu þegar öruggt er að nota USB-tengið aftur." + + "Kveikt var á USB-tengi til að greina hleðslutæki og aukabúnað" "Virkja USB" + + "Fylla skjá með aðdrætti" "Teygja yfir allan skjáinn" "Skjámynd" @@ -118,6 +121,11 @@ "Hætta við" "Staðfesta" "Reyna aftur" + "Autt rými, ýttu til að hætta við greiningu" + "Reyndu aftur" + "Leitar að andliti þínu" + "Andlit staðfest" + "Staðfest" "Snertu fingrafaralesarann" "Fingrafaratákn" "Leitar að þér ..." @@ -369,8 +377,7 @@ "Kveikt klukkan %s" "Til klukkan %s" "Dökkt þema" - - + "Dökkt þema\nRafhlöðusparnaður" "NFC" "Slökkt á NFC" "Kveikt á NFC" @@ -445,13 +452,16 @@ "Kveikt er á rafhlöðusparnaði" "Dregur úr afköstum og bakgrunnsgögnum" "Slökkva á rafhlöðusparnaði" - "Á meðan þú ert að taka upp eða senda út getur %s fangað viðkvæmar upplýsingar, svo sem hljóð sem þú spilar og aðgangsorð, greiðsluupplýsingar, myndir og skilaboð." + "Á meðan þú ert að taka upp eða senda út getur %s fangað viðkvæmar upplýsingar sem birtast á skjánum eða eru spilaðar í tækinu, svo sem hljóð, aðgangsorð, greiðsluupplýsingar, myndir og skilaboð." + "Á meðan þú ert að taka upp eða senda út getur þjónustan sem veitir þessar aðgerðir fangað viðkvæmar upplýsingar sem birtast á skjánum eða eru spilaðar í tækinu, svo sem hljóð, aðgangsorð, greiðsluupplýsingar, myndir og skilaboð." "Sýnir viðkvæmar upplýsingar við útsendingu/upptöku" "Ekki sýna þetta aftur" "Hreinsa allt" "Stjórna" - "Lágstemmdar tilkynningar" - "Hreinsa allar lágstemmdar tilkynningar" + + + + "Hlé gert á tilkynningum þar sem stillt er á „Ónáðið ekki“" "Byrja núna" "Engar tilkynningar" @@ -635,9 +645,11 @@ "Loka á" "Sýna áfram" "Minnka" - "Án hljóðs" + + "Áfram hljóðlaust" - "Truflandi" + + "Halda áfram að gera viðvart" "Slökkva á tilkynningum" "Sýna áfram tilkynningar frá þessu forriti?" @@ -651,10 +663,8 @@ "Ekki er hægt að breyta þessum tilkynningum." "Ekki er hægt að stilla þessar tilkynningar hér" "Staðgengilstilkynning" - - - - + "Allar %1$s tilkynningar" + "Sjá meira" "Þetta forrit er að nota myndavélina." "Þetta forrit er að nota hljóðnemann." "Þetta forrit er að birta efni yfir öðrum forritum á skjánum þínum." @@ -898,7 +908,8 @@ "Leyfa" "Hafna" "Pikka til að stilla rafhlöðusparnað" - "Kveikja sjálfkrafa þegar hleðsla rafhlöðunnar er %d%%" + + "Nei, takk" "Kveikt á rafhlöðusparnaði" "Sjálfkrafa verður kveikt á rafhlöðusparnaði þegar hleðsla rafhlöðunnar fer niður fyrir %d%%." @@ -930,6 +941,5 @@ "Færa efst til hægri" "Færa neðst til vinstri" "Færðu neðst til hægri" - - + "Hunsa" diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index e1ff5dd73652..52b915a8617b 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -62,9 +62,10 @@ "Debug USB non consentito" "L\'utente che ha eseguito l\'accesso a questo dispositivo non può attivare il debug USB. Per utilizzare questa funzione, passa all\'utente principale." "Porta USB disattivata" - "Per proteggere il tuo dispositivo da liquidi o detriti, la porta USB è stata disattivata e non rileverà alcun accessorio.\n\nRiceverai una notifica quando potrai riutilizzare in sicurezza la porta USB." + "Per proteggere il dispositivo da liquidi o detriti, la porta USB è stata disattivata e non rileverà gli accessori.\n\nTi avviseremo quando sarà di nuovo possibile utilizzarla." "Porta USB attivata per rilevare caricabatterie e accessori" "Attiva USB" + "Ulteriori informazioni" "Zoom per riempire schermo" "Estendi per riemp. schermo" "Screenshot" @@ -118,6 +119,11 @@ "Annulla" "Confermo" "Riprova" + "Spazio vuoto, tocca per annullare l\'autenticazione" + "Riprova" + "Ricerca del tuo volto" + "Volto autenticato" + "Confermato" "Tocca il sensore di impronte digitali" "Icona dell\'impronta digitale" "In attesa del volto…" @@ -369,8 +375,7 @@ "Dalle %s" "Fino alle %s" "Tema scuro" - - + "Tema scuro\nRisparmio energetico" "NFC" "NFC non attiva" "NFC attiva" @@ -445,13 +450,14 @@ "Risparmio energetico attivo" "Riduce le prestazioni e i dati in background" "Disattiva Risparmio energetico" - "Mentre registri o trasmetti, %s può acquisire informazioni sensibili di qualsiasi tipo, come l\'audio riprodotto, le password, le informazioni di pagamento, le foto e i messaggi." + "Mentre registri o trasmetti, %s può acquisire tutti i dati sensibili che vengono mostrati sul tuo schermo o riprodotti dal tuo dispositivo, incluse informazioni sensibili quali contenuti audio, password, informazioni di pagamento, foto e messaggi." + "Mentre registri o trasmetti, il servizio che offre questa funzionalità può acquisire tutti i dati sensibili che vengono mostrati sul tuo schermo o riprodotti dal tuo dispositivo, incluse informazioni sensibili quali contenuti audio, password, informazioni di pagamento, foto e messaggi." "Esposizione di informazioni sensibili durante la trasmissione/registrazione" "Non mostrare più" "Cancella tutto" "Gestisci" - "Notifiche senza avvisi" - "Cancella tutte le notifiche senza avvisi" + "Notifiche silenziose" + "Cancella tutte le notifiche silenziose" "Notifiche messe in pausa in base alla modalità Non disturbare" "Avvia adesso" "Nessuna notifica" @@ -635,13 +641,13 @@ "Blocca" "Continua a mostrare" "Riduci a icona" - "Silenziose" + "Modalità silenziosa" "Continua con notifiche silenziose" - "Modalità invasiva" + "Avvisi" "Continua ad avvisare" "Disattiva notifiche" "Continuare a ricevere notifiche da questa app?" - "Senza avvisi" + "Silenziose" "Con priorità" "Puoi concentrarti perché le notifiche sono visualizzate solo nell\'area a discesa. Sempre silenziose." "Vengono mostrate le notifiche con priorità bassa. Sempre silenziose." @@ -651,10 +657,8 @@ "Impossibile modificare queste notifiche." "Qui non è possibile configurare questo gruppo di notifiche" "Notifica inviata al proxy" - - - - + "Tutte le notifiche di %1$s" + "Altro" "Questa app sta utilizzando la fotocamera." "Questa app sta utilizzando il microfono." "Questa app è visualizzata sopra altre app sullo schermo." @@ -898,7 +902,7 @@ "Consenti" "Rifiuta" "Tocca per programmare il Risparmio energetico" - "Attiva automaticamente quando la batteria arriva al %d%%" + "Attiva questa funzionalità se è probabile che la batteria si scarichi" "No grazie" "Pianificazione del Risparmio energetico attivata" "Il Risparmio energetico verrà attivato automaticamente quando la carica della batteria sarà inferiore a %d%%." @@ -930,6 +934,5 @@ "Sposta in alto a destra" "Sposta in basso a sinistra" "Sposta in basso a destra" - - + "Ignora" diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 894a30ca9681..684398d72fcc 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -62,9 +62,12 @@ "‏לא ניתן לבצע ניפוי באגים ב-USB" "‏למשתמש המחובר לחשבון במכשיר הזה אין אפשרות להפעיל ניפוי באגים ב-USB. כדי להשתמש בתכונה הזו יש לעבור אל המשתמש הראשי." "‏יציאת ה-USB מושבתת" - "‏כדי להגן על המכשיר שלך מנוזלים או חלקיקים, יציאת ה-USB מושבתת ולא מזהה אביזרים כלל.\n\nתתקבל התראה כשיהיה בטוח להשתמש ביציאת ה-USB." + + "‏יציאת USB הופעלה לזיהוי מטענים ואביזרים" "‏הפעלת USB" + + "הגדל תצוגה כדי למלא את המסך" "מתח כדי למלא את המסך" "צילום מסך" @@ -118,6 +121,11 @@ "ביטול" "אישור" "ניסיון נוסף" + "אזור ריק, יש להקיש עליו כדי לבטל את האימות" + "עליך לנסות שוב" + "המערכת מחפשת את הפנים שלך" + "זיהוי הפנים בוצע" + "מאושר" "יש לגעת בחיישן טביעות האצבע" "סמל טביעת אצבע" "מחפש אותך…" @@ -373,8 +381,7 @@ "מופעל בשעה %s" "עד %s" "עיצוב כהה" - - + "עיצוב כהה\nלחיסכון בסוללה" "NFC" "‏NFC מושבת" "‏NFC מופעל" @@ -451,14 +458,15 @@ "תכונת החיסכון בסוללה פועלת" "מפחית את הביצועים ונתונים ברקע" "כיבוי תכונת החיסכון בסוללה" - "בזמן הקלטה או העברה, האפליקציה %s יכולה לקלוט מידע רגיש, כמו האודיו המושמע, סיסמאות, פרטי תשלום, תמונות והודעות." + "בזמן הקלטה או העברה, האפליקציה %s יכולה לקלוט מידע רגיש שמוצג במסך או מופעל מהמכשיר שלך, כולל מידע רגיש כמו אודיו, סיסמאות, פרטי תשלום, תמונות והודעות." + "בזמן הקלטה או העברה, השירות שמספק את הפונקציה הזו יכול לקלוט מידע רגיש שמוצג במסך או מופעל מהמכשיר שלך, כולל מידע רגיש כמו אודיו, סיסמאות, פרטי תשלום, תמונות והודעות." "חשיפת מידע רגיש בזמן העברה/הקלטה" "אל תציג שוב" "נקה הכל" "ניהול" - + - + "התראות הושהו על ידי מצב \'נא לא להפריע\'" "התחל כעת" @@ -643,26 +651,26 @@ "חסימה" "כן, המשיכו" "מזעור" - "התראות מתונות" + + "בשקט" - "התראות קופצות" + + "המשך שליחת התראות" "השבתת ההתראות" "שנמשיך להציג לך התראות מהאפליקציה הזאת?" - "התראות מתונות" + "ברמה מתונה" "בעדיפות" "עוזרת לריכוז באמצעות הצגת התראות בלוח ההתראות הנפתח בלבד. תמיד שקטה." - "מציגה התראות בעדיפות נמוכה. תמיד שקטה." - "מציגה התראות בעדיפות נמוכה. תמיד שקטה." - "מציגה התראות בעדיפות נמוכה. תמיד שקטה." + "יופיעו התראות בעדיפות נמוכה. תמיד בשקט." + "יופיעו התראות בעדיפות נמוכה. תמיד בשקט." + "יופיעו התראות בעדיפות נמוכה. תמיד בשקט." "מעוררת תשומת לב באמצעות צלילים וסמל בשורת הסטטוס. מוצגת במסך הנעילה." "לא ניתן לשנות את ההתראות האלה." "לא ניתן להגדיר כאן את קבוצת ההתראות הזו" "‏התראה דרך שרת proxy" - - - - + "כל ההתראות של %1$s" + "הצגת עוד" "האפליקציה הזו משתמשת במצלמה." "האפליקציה הזו משתמשת במיקרופון." "האפליקציה הזו מוצגת מעל אפליקציות אחרות במסך." @@ -910,7 +918,8 @@ "אני רוצה לאשר" "אני לא מרשה" "יש להקיש כדי לתזמן את מצב החיסכון בסוללה" - "הפעלה אוטומטית כשהסוללה ברמת טעינה של %d%%" + + "לא תודה" "הופעל תזמון של חיסכון בסוללה" "מצב חיסכון בסוללה יופעל באופן אוטומטי כשרמת טעינת הסוללה תהיה נמוכה מ-%d%%." @@ -942,6 +951,5 @@ "העברה לפינה הימנית העליונה" "העברה לפינה השמאלית התחתונה" "העברה לפינה הימנית התחתונה" - - + "סגירה" diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 3f589289f35c..39a84199dc3d 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -62,9 +62,12 @@ "USBデバッグは許可されていません" "このデバイスに現在ログインしているユーザーでは、USB デバッグを ON にすることはできません。この機能を使用するには、メインユーザーに切り替えてください。" "USB ポート無効" - "液体やゴミからデバイスを保護するため、USB ポートは無効になっています。アクセサリの検出は行われません。\n\nUSB ポートを再び安全に使用できるようになりましたらお知らせします。" + + "USB ポートが有効になり、充電器やアクセサリを検出できるようになりました" "USB を有効にする" + + "画面サイズに合わせて拡大" "画面サイズに合わせて拡大" "画面の保存" @@ -118,6 +121,11 @@ "キャンセル" "確認" "再試行" + "空白の領域をタップすると、認証をキャンセルできます" + "もう一度お試しください" + "顔を認証中です" + "顔を認証しました" + "確認しました" "指紋認証センサーをタップしてください" "指紋アイコン" "顔を認証しています…" @@ -369,8 +377,7 @@ "%s に ON" "%s まで" "ダークテーマ" - - + "ダークテーマ\nバッテリー セーバー" "NFC" "NFC は無効です" "NFC は有効です" @@ -445,13 +452,16 @@ "バッテリー セーバー ON" "パフォーマンスとバックグラウンドデータを制限します" "バッテリー セーバーを OFF" - "記録中やキャスト中に、%sは、ユーザーが再生している音声、パスワード、お支払い情報、写真、メッセージなど、プライベート情報を取得する可能性があります。" + "記録中やキャスト中に、%sは、画面上に表示またはデバイスから再生されている個人的な情報(音声、パスワード、お支払い情報、写真、メッセージなど)を取得する可能性があります。" + "記録中やキャスト中に、この機能を提供するサービスは、画面上に表示またはデバイスから再生されている個人的な情報(音声、パスワード、お支払い情報、写真、メッセージなど)を取得する可能性があります。" "キャスト中や記録中にプライベート情報が公開されます" "次回から表示しない" "すべて消去" "管理" - "控えめな通知" - "控えめな通知がすべて消去されます" + + + + "サイレント モードにより通知は一時停止中です" "今すぐ開始" "通知はありません" @@ -635,9 +645,11 @@ "ブロック" "今後も表示する" "最小化" - "通知音なし" + + "音なしで通知" - "通知音あり" + + "今後もアラートを受け取る" "通知を OFF にする" "このアプリからの通知を今後も表示しますか?" @@ -651,10 +663,8 @@ "これらの通知は変更できません。" "このグループの通知はここでは設定できません" "代理通知" - - - - + "%1$s のすべての通知" + "詳細" "このアプリはカメラを使用しています。" "このアプリはマイクを使用しています。" "このアプリは画面上で他のアプリの上に重ねて表示されます。" @@ -898,7 +908,8 @@ "許可" "拒否" "タップしてバッテリー セーバーのスケジュールを設定" - "電池が %d%% になったら自動的に ON にする" + + "いいえ" "バッテリー セーバーのスケジュール設定 ON" "電池が %d%% を下回ると、バッテリー セーバーが自動的に ON になります。" @@ -930,6 +941,5 @@ "右上に移動" "左下に移動" "右下に移動" - - + "閉じる" diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 9d45b3a0027c..0cc5c5e96c91 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -62,9 +62,12 @@ "USB ხარვეზების გამართვა ნებადართული არაა" "ამ მოწყობილობაზე ამჟამად შესულ მომხმარებელს არ შეუძლია USB ხარვეზების გამართვის ფუნქციის ჩართვა. ამ ფუნქციის გამოსაყენებლად, მიუერთდით მთავარ მომხმარებელს." "USB პორტი გათიშულია" - "USB პორტი გათიშულია თქვენი ტელეფონის დასაცავად სითხის ან ჭუჭყის მოხვედრისგან. აქსესუარების აღმოჩენა ვერ მოხერხდება.\n\nთქვენ მიიღებთ შეტყობინებას, როცა USB პორტის გამოყენება კვლავ უსაფრთხო იქნება." + + "USB პორტი ჩართულია დამტენებისა და აქსესუარების აღმოსაჩენად" "USB-ის ჩართვა" + + "მასშტაბი შეცვალეთ ეკრანის შესავსებად." "გაწიეთ ეკრანის შესავსებად." "ეკრანის ანაბეჭდი" @@ -118,6 +121,11 @@ "გაუქმება" "დადასტურება" "ხელახლა ცდა" + "დაფიქსირდა ცარიელი უბანი, შეეხეთ ამოცნობის გასაუქმებლად" + "გთხოვთ, ცადოთ ხელახლა" + "მიმდინარეობს თქვენი სახის ძებნა" + "სახის ამოცნობილია" + "დადასტურებული" "შეეხეთ თითის ანაბეჭდის სენსორს" "თითის ანაბეჭდის ხატულა" "მიმდინარეობს თქვენი ძიება…" @@ -369,8 +377,7 @@ "ჩაირთოს %s-ზე" "%s-მდე" "მუქი თემა" - - + "მუქი თემა\nბატარეის დამზოგი" "NFC" "NFC გათიშულია" "NFC ჩართულია" @@ -445,13 +452,16 @@ "ბატარეის დამზოგი ჩართულია" "ამცირებს წარმადობას და უკანა ფონის მონაცემებს" "ბატარეის დამზოგის გამორთვა" - "ჩაწერის ან ტრანსლირების განმავლობაში %s-ს შეუძლია აღბეჭდოს ნებისმიერი სენსიტიური ინფორმაცია, როგორიც არის აუდიო, რომელსაც უკრავთ და თქვენი პაროლები, გადახდის ინფორმაცია, ფოტოები და შეტყობინებები." + "ჩაწერის ან ტრანსლირების განმავლობაში, %s-ს შეუძლია აღბეჭდოს ნებისმიერი სენსიტიური ინფორმაცია, რომელიც თქვენს ეკრანზეა ნაჩვენები ან თქვენი მოწყობილობიდან იკვრება, მათ შორის ისეთი, როგორიც არის აუდიო, პაროლები, გადახდის ინფორმაცია, ფოტოები და შეტყობინებები." + "ჩაწერის ან ტრანსლირების განმავლობაში, ამ ფუნქციის მომწოდებელ სერვისს შეუძლია აღბეჭდოს ნებისმიერი სენსიტიური ინფორმაცია, რომელიც თქვენს ეკრანზეა ნაჩვენები ან თქვენი მოწყობილობიდან იკვრება, მათ შორის ისეთი, როგორიც არის აუდიო, პაროლები, გადახდის ინფორმაცია, ფოტოები და შეტყობინებები." "ტრანსლირების/ჩაწერის განმავლობაში მჟღავნდება სენსიტიური ინფორმაცია" "აღარ მაჩვენო" "ყველას გასუფთავება" "მართვა" - "მსუბუქი შეტყობინებები" - "ყველა მსუბუქი შეტყობინების გასუფთავება" + + + + "შეტყობინებები დაპაუზდა „არ შემაწუხოთ“ რეჟიმის მეშვეობით" "დაწყება ახლავე" "შეტყობინებები არ არის." @@ -635,9 +645,11 @@ "დაბლოკვა" "ჩვენების გაგრძელება" "ჩაკეცვა" - "წყნარი" + + "კვლავ ჩუმად ჩვენება" - "წყვეტის გამომწვევი" + + "გაფრთხილების გაგრძელება" "შეტყობინებების გამორთვა" "გაგრძელდეს შეტყობინებათა ჩვენება ამ აპიდან?" @@ -651,10 +663,8 @@ "ამ შეტყობინებების შეცვლა შეუძლებელია." "შეტყობინებების ამ ჯგუფის კონფიგურირება აქ შეუძლებელია" "პროქსირებული შეტყობინება" - - - - + "%1$s-ის ყველა შეტყობინება" + "მეტის ნახვა" "ეს აპი იყენებს კამერას." "ეს აპი იყენებს მიკროფონს." "ეს აპი თქვენს ეკრანზე ფარავს სხვა აპებს." @@ -898,7 +908,8 @@ "დაშვება" "უარყოფა" "შეეხეთ ბატარეის დამზოგის დასაგეგმად" - "ავტომატურად ჩაირთოს, როცა ბატარეა %d%%-ზეა" + + "არა, გმადლობთ" "ბატარეის დამზოგის განრიგი ჩართულია" "ბატარეის დამზოგი ავტომატურად ჩაირთვება, როცა ბატარეა ჩამოსცდება %d%%-ს." @@ -930,6 +941,5 @@ "გადაანაცვლეთ ზევით და მარჯვნივ" "ქვევით და მარცხნივ გადატანა" "გადაანაცვ. ქვემოთ და მარჯვნივ" - - + "დახურვა" diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index e5322e80d13a..bb1487687549 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -62,9 +62,12 @@ "USB жөндеу рұқсат етілмеген" "Бұл құрылғыға жаңа кірген пайдаланушы USB түзетуін іске қосылмайды. Бұл мүмкіндікті пайдалану үшін негізгі пайдаланушыға ауысыңыз." "USB порты өшірілді" - "Құрылғыңызға сұйықтық немесе қоқыс кіріп кетпеуі үшін, USB порты өшірілген және ешқандай керек-жарақты танымайды.\n\nUSB портын қайта пайдалануға болатын кезде, сізге хабарландыру жібереміз." + + "Зарядтағыштар мен аксессуарларды анықтау үшін USB порты қосылды." "USB қосу" + + "Экранды толтыру үшін ұлғайту" "Экранды толтыру үшін созу" "Скриншот" @@ -118,6 +121,11 @@ "Бас тарту" "Растау" "Қайталап көріңіз" + "Аймақта ештеңе көрсетілмеген. Оны басып, аутентификациядан бас тартыңыз." + "Қайталап көріңіз." + "Құрылғы бетіңізді талдап жатыр." + "Бет танылды." + "Расталды" "Саусақ ізін оқу сканерін түртіңіз" "Саусақ ізі белгішесі" "Бет ізделуде…" @@ -369,8 +377,7 @@ "Қосылу уақыты: %s" "%s дейін" "Қараңғы тақырып" - - + "Қараңғы тақырып\nBattery saver" "NFC" "NFC өшірулі" "NFC қосулы" @@ -445,13 +452,16 @@ "Battery saver қосулы" "Өнімділікті және фондық деректерді азайтады" "Battery saver функциясын өшіру" - "Жазу және трансляциялау кезінде %s ойнатылған аудиомазмұн, құпия сөздер, төлем мәліметтері, фотосуреттер және хабарлар сияқты кез келген құпия ақпаратты сақтай алады." + "Жазу немесе трансляциялау кезінде, %s экранда көрсетілген немесе құрылғыңызда ойнатылған құпия ақпараттың барлығын (мысалы, аудио, құпия сөздер, төлем туралы ақпарат, фотосуреттер және хабарлар) тіркеп отырады." + "Жазу немесе трансляциялау кезінде, осы функцияны ұсынатын қызмет экранда көрсетілген немесе құрылғыңызда ойнатылған құпия ақпараттың барлығын (мысалы, аудио, құпия сөздер, төлем туралы ақпарат, фотосуреттер және хабарлар) тіркеп отырады." "Трансляциялау/жазу кезінде құпия ақпаратты көрсету" "Қайта көрсетпеу" "Барлығын тазалау" "Басқару" - "Дыбыссыз хабарландырулар" - "Дыбыссыз хабарландырулардың барлығын өшіру" + + + + "Хабарландырулар \"Мазаламау\" режимінде кідіртілді" "Қазір бастау" "Хабарландырулар жоқ" @@ -635,9 +645,11 @@ "Бөгеу" "Көрсету" "Жасыру" - "Дыбыссыз" + + "Хабарландырулар алғым келмейді" - "Дыбыстық ескертулер" + + "Хабарландырулар келе берсін" "Хабарландыруларды өшіру" "Осы қолданбаның хабарландырулары көрсетілсін бе?" @@ -651,10 +663,8 @@ "Бұл хабарландыруларды өзгерту мүмкін емес." "Мұндай хабарландырулар бұл жерде конфигурацияланбайды." "Прокси-сервер арқылы жіберілген хабарландыру" - - - - + "Барлық %1$s хабарландырулары" + "Басқаларын көру" "Бұл қолданба камераны пайдалануда." "Бұл қолданба микрофонды пайдалануда." "Бұл қолданба экранда басқа қолданбалардың үстінен көрсетіліп тұр." @@ -898,7 +908,8 @@ "Рұқсат беру" "Тыйым салу" "Түймені түртіп, Battery Saver функциясын реттеңіз" - "Батарея заряды %d%% болғанда, автоматты түрде қосу" + + "Жоқ, рақмет" "Battery Saver кестесі қосылды" "Батарея заряды %d%% деңгейінен төмендегенде, Battery Saver автоматты түрде қосылады." @@ -930,6 +941,5 @@ "Жоғары оң жаққа жылжыту" "Төменгі сол жаққа жылжыту" "Төменгі оң жаққа жылжыту" - - + "Жабу" diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 58cfbe44f3ed..2c42f6a5f81d 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -62,9 +62,12 @@ "មិនអនុញ្ញាតការកែកំហុសតាម USB ទេ" "អ្នកប្រើ​ដែលបច្ចុប្បន្ន​បានចូលគណនី​នៅលើឧបករណ៍នេះ​មិនអាចបើកការកែកំហុស USB បានទេ។ ដើម្បីប្រើមុខងារនេះ សូមប្តូរទៅអ្នកប្រើចម្បង។" "បានបិទរន្ធ USB" - "ដើម្បី​ការពារ​ឧបករណ៍​របស់អ្នកកុំឱ្យ​ចូលទឹក ឬ​កម្ទេចផ្សេងៗ រន្ធ USB ត្រូវបានបិទ ហើយ​នឹង​មិនស្គាល់​គ្រឿង​បរិក្ខារ​នោះទេ។\n\nអ្នកនឹង​ទទួលបាន​ការជូនដំណឺង នៅពេល​ការប្រើប្រាស់​រន្ធ USB មាន​សុវត្ថិភាព​ម្ដងទៀត។" + + "បាន​បើក​រន្ធ USB ដើម្បី​សម្គាល់​ឆ្នាំងសាក និងគ្រឿងផ្សេងៗ" "បើក USB" + + "ពង្រីក​​ដើម្បី​ឲ្យ​ពេញ​អេក្រង់" "ទាញ​ដើម្បី​ឲ្យ​ពេញ​អេក្រង់" "រូបថតអេក្រង់" @@ -118,6 +121,11 @@ "បោះ​បង់​" "បញ្ជាក់" "ព្យាយាម​ម្ដង​ទៀត" + "កន្លែង​ទំនេរ សូមចុច​ដើម្បីបោះបង់​ការផ្ទៀងផ្ទាត់" + "សូម​ព្យាយាម​ម្ដងទៀត" + "កំពុង​ផ្ទៀងផ្ទាត់​មុខរបស់អ្នក" + "បានផ្ទៀងផ្ទាត់​មុខ" + "បានបញ្ជាក់" "ប៉ះ​ឧបករណ៍​ចាប់ស្នាម​ម្រាមដៃ" "រូបតំណាង​ស្នាម​ម្រាមដៃ" "កំពុងស្វែងរកអ្នក…" @@ -369,8 +377,7 @@ "បើក​នៅម៉ោង %s" "រហូតដល់​ម៉ោង %s" "រចនាប័ទ្ម​​​ងងឹត" - - + "រចនាប័ទ្មងងឹត\nកម្មវិធីសន្សំថ្ម" "NFC" "បាន​បិទ NFC" "បាន​បើក NFC" @@ -445,13 +452,16 @@ "កម្មវិធីសន្សំថ្មបានបើក" "ការ​បន្ថយ​ការ​ប្រតិបត្តិ និង​ទិន្នន័យ​ផ្ទៃ​ខាងក្រោយ" "បិទ​កម្មវិធី​សន្សំ​ថ្ម" - "នៅពេល​កំពុង​ថត ឬបញ្ជូន %s អាច​ថតព័ត៌មាន​រសើប​ទាំងឡាយដូចជា សំឡេងដែលអ្នកចាក់ និងពាក្យសម្ងាត់របស់អ្នក​ ព័ត៌មាន​ទូទាត់ រូបថត និងសារ​ជាដើម។" + "នៅពេល​កំពុងថត ឬបញ្ជូន %s អាច​ថតព័ត៌មាន​រសើប​ទាំងឡាយ​ដែលបង្ហាញ​នៅលើ​អេក្រង់​របស់អ្នក ឬដែលចាក់ពី​ឧបករណ៍​របស់អ្នក រួមទាំង​ព័ត៌មាន​រសើប​ដូចជា សំឡេង ពាក្យ​សម្ងាត់ ព័ត៌មាន​បង់ប្រាក់ រូបថត និងសារ​ជាដើម។" + "នៅពេល​កំពុងថត ឬបញ្ជូន សេវាកម្មដែល​ផ្ដល់មុខងារនេះ​អាចថតព័ត៌មាន​រសើប​ទាំងឡាយ​ដែលបង្ហាញ​នៅលើ​អេក្រង់​របស់អ្នក ឬដែលចាក់​ពីឧបករណ៍​របស់អ្នក រួមទាំង​ព័ត៌មាន​រសើប​ដូចជា សំឡេង ពាក្យ​សម្ងាត់ ព័ត៌មាន​បង់ប្រាក់​ រូបថត និងសារ​ជាដើម។" "បង្ហាញព័ត៌មានរសើប​ អំឡុងពេលបញ្ជូន/ថត" "កុំ​បង្ហាញ​ម្ដងទៀត" "សម្អាត​ទាំងអស់" "គ្រប់គ្រង" - "ការជូន​ដំណឹង​ស្ងាត់ៗ" - "សម្អាត​ការជូនដំណឹង​ស្ងាត់ៗ​ទាំងអស់" + + + + "ការជូនដំណឹង​បានផ្អាក​ដោយ​មុខងារកុំរំខាន" "ចាប់ផ្ដើម​ឥឡូវ" "គ្មាន​ការ​ជូនដំណឹង" @@ -635,9 +645,11 @@ "ទប់ស្កាត់" "បន្ត​បង្ហាញ" "បង្រួម" - "ស្ងាត់ៗ" + + "បន្ត​បិទសំឡេង" - "គួរឱ្យរំខាន" + + "បន្ត​ជូនដំណឹង" "បិទ​ការជូន​ដំណឹង" "បន្ត​បង្ហាញ​ការជូនដំណឹង​ពីកម្មវិធីនេះ?" @@ -651,10 +663,8 @@ "មិនអាច​កែប្រែ​ការជូនដំណឹង​ទាំងនេះ​បានទេ។" "មិនអាច​កំណត់​រចនាសម្ព័ន្ធ​ក្រុមការជូនដំណឹងនេះ​នៅទីនេះ​បានទេ" "ការជូនដំណឹង​ជា​ប្រូកស៊ី" - - - - + "ការជូន​ដំណឹងទាំងអស់​របស់ %1$s" + "មើលច្រើនទៀត" "កម្មវិធីនេះ​កំពុងប្រើ​កាមេរ៉ា។" "កម្មវិធីនេះ​កំពុងប្រើ​មីក្រូហ្វូន។" "កម្មវិធីនេះ​កំពុងបង្ហាញ​ពីលើកម្មវិធី​ផ្សេងទៀត​នៅលើអេក្រង់​របស់អ្នក។" @@ -898,7 +908,8 @@ "អនុញ្ញាត" "បដិសេធ" "ចុច​ដើម្បី​កំណត់​កាលវិភាគ​កម្មវិធី​សន្សំ​ថ្ម" - "បើក​ដោយ​ស្វ័យ​ប្រវត្តិ​ នៅ​ពេល​ដែល​ថ្ម​នៅ​ត្រឹម %d%%" + + "ទេ អរគុណ" "កាលវិភាគ​កម្មវិធី​សន្សំ​ថ្ម​បាន​បើក​ហើយ" "កម្មវិធី​សន្សំ​ថ្ម​នឹង​បើក​ដោយ​ស្វ័យ​ប្រវត្តិ​ នៅពេល​ថ្ម​នៅ​សល់​តិច​ជាង %d%% ។" @@ -930,6 +941,5 @@ "ផ្លាស់ទីទៅផ្នែកខាងលើខាងស្ដាំ" "ផ្លាស់ទីទៅផ្នែកខាងក្រោមខាងឆ្វេង​" "ផ្លាស់ទីទៅផ្នែកខាងក្រោម​ខាងស្ដាំ" - - + "ច្រានចោល" diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 9f02f785d62f..f14998d07aae 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -62,9 +62,10 @@ "USB ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ಅನುಮತಿಸಲಾಗಿಲ್ಲ" "ಬಳಕೆದಾರರು ಪ್ರಸ್ತುತ ಈ ಸಾಧನಕ್ಕೆ ಸೈನ್ ಇನ್ ಮಾಡಿದ್ದಾರೆ USB ಡೀಬಗ್ ಮಾಡುವುದನ್ನು ಆನ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲು, ಪ್ರಾಥಮಿಕ ಬಳಕೆದಾರರಿಗೆ ಬದಲಾಯಿಸಿ." "USB ಪೋರ್ಟ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" - "ದ್ರವ ಅಥವಾ ಧೂಳಿನ ಕಣಗಳಿಂದ ನಿಮ್ಮ ಸಾಧನವನ್ನು ರಕ್ಷಿಸಲು, USB ಪೋರ್ಟ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಮತ್ತು ಯಾವುದೇ ಪರಿಕರಗಳನ್ನು ಪತ್ತೆ ಮಾಡುವುದಿಲ್ಲ. \n\n USB ಪೋರ್ಟ್ ಅನ್ನು ಬಳಸಲು ಸುರಕ್ಷಿತವಾಗಿದ್ದಾಗ ಮತ್ತೆ ನಿಮಗೆ ಸೂಚಿಸಲಾಗುವುದು." + "ದ್ರವ ಅಥವಾ ಧೂಳಿನ ಕಣಗಳಿಂದ ನಿಮ್ಮ ಸಾಧನವನ್ನು ರಕ್ಷಿಸಲು, USB ಪೋರ್ಟ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಹಾಗಾಗಿ ಅದು ಯಾವುದೇ ಪರಿಕರಗಳನ್ನು ಪತ್ತೆ ಮಾಡುವುದಿಲ್ಲ. \n\n USB ಪೋರ್ಟ್ ಬಳಸಲು ಸುರಕ್ಷಿತವಾಗಿದ್ದಾಗ ಮತ್ತೆ ನಿಮಗೆ ಸೂಚಿಸಲಾಗುವುದು." "ಚಾರ್ಜರ್‌ಗಳು ಮತ್ತು ಪರಿಕರಗಳನ್ನು ಪತ್ತೆಹಚ್ಚಲು USB ಪೋರ್ಟ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" "USB ಸಕ್ರಿಯಗೊಳಿಸಿ" + "ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ" "ಪರದೆ ತುಂಬಿಸಲು ಝೂಮ್ ಮಾಡು" "ಪರದೆ ತುಂಬಿಸಲು ವಿಸ್ತಾರಗೊಳಿಸು" "ಸ್ಕ್ರೀನ್‌ಶಾಟ್" @@ -118,6 +119,11 @@ "ರದ್ದುಮಾಡಿ" "ದೃಢೀಕರಿಸಿ" "ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ" + "ಖಾಲಿ ಪ್ರದೇಶ, ದೃಢೀಕರಣವನ್ನು ರದ್ದುಗೊಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ" + "ಪುನಃ ಪ್ರಯತ್ನಿಸಿ" + "ನಿಮ್ಮ ಮುಖದ ದೃಢೀಕರಣಕ್ಕಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ" + "ಮುಖವನ್ನು ದೃಢೀಕರಿಸಲಾಗಿದೆ" + "ದೃಢೀಕರಿಸಲಾಗಿದೆ" "ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್‌‌ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ" "ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಐಕಾನ್" "ನಿಮಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ…" @@ -369,8 +375,7 @@ "%s ಸಮಯದಲ್ಲಿ" "%s ವರೆಗೂ" "ಡಾರ್ಕ್ ಥೀಮ್" - - + "ಡಾರ್ಕ್ ಥೀಮ್\nಬ್ಯಾಟರಿ ಸೇವರ್‌" "NFC" "NFC ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ" "NFC ಸಕ್ರಿಯಗೊಂಡಿದೆ" @@ -445,13 +450,14 @@ "ಬ್ಯಾಟರಿ ರಕ್ಷಕ ಆನ್ ಆಗಿದೆ" "ಕಾರ್ಯಕ್ಷಮತೆ ಮತ್ತು ಹಿನ್ನೆಲೆ ಡೇಟಾವನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ" "ಬ್ಯಾಟರಿ ಸೇವರ್‌ ಆಫ್ ಮಾಡಿ" - "ರೆಕಾರ್ಡ್ ಮಾಡುವಾಗ ಅಥವಾ ಕ್ಯಾಸ್ಟಿಂಗ್ ಮಾಡುವಾಗ, ನೀವು ಪ್ಲೇ ಮಾಡುವ ಆಡಿಯೊ ಮತ್ತು ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು, ಪಾವತಿ ಮಾಹಿತಿ, ಫೋಟೋಗಳು ಮತ್ತು ಸಂದೇಶಗಳಂತಹ ಯಾವುದೇ ಸೂಕ್ಷ್ಮ ಮಾಹಿತಿಯನ್ನು %s ಕ್ಯಾಪ್ಚರ್ ಮಾಡಬಹುದು." + "ರೆಕಾರ್ಡ್ ಮಾಡುವಾಗ ಅಥವಾ ಕ್ಯಾಸ್ಟಿಂಗ್ ಮಾಡುವಾಗ, ಸೂಕ್ಷ್ಮ ಮಾಹಿತಿಯಂತಹ ಆಡಿಯೋ, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು, ಪಾವತಿ ಮಾಹಿತಿ, ಫೋಟೋಗಳು ಮತ್ತು ಸಂದೇಶಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಡಿಸ್‌ಪ್ಲೇ ಮಾಡಿದ ಅಥವಾ ನಿಮ್ಮ ಸಾಧನದಿಂದ ಪ್ಲೇ ಮಾಡಿದ ಯಾವುದೇ ಸೂಕ್ಷ್ಮ ಮಾಹಿತಿಯನ್ನು %s ಕ್ಯಾಪ್ಚರ್ ಮಾಡಬಹುದು." + "ರೆಕಾರ್ಡ್ ಮಾಡುವಾಗ ಅಥವಾ ಕ್ಯಾಸ್ಟಿಂಗ್ ಮಾಡುವಾಗ, ಸೂಕ್ಷ್ಮ ಮಾಹಿತಿಯಂತಹ ಆಡಿಯೋ, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು, ಪಾವತಿ ಮಾಹಿತಿ, ಫೋಟೋಗಳು ಮತ್ತು ಸಂದೇಶಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಡಿಸ್‌ಪ್ಲೇ ಮಾಡಿದ ಅಥವಾ ನಿಮ್ಮ ಸಾಧನದಿಂದ ಪ್ಲೇ ಮಾಡಿದ ಯಾವುದೇ ಸೂಕ್ಷ್ಮ ಮಾಹಿತಿಯನ್ನು ಸೇವೆ ಒದಗಿಸುವ ಈ ಫಂಕ್ಷನ್ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಬಹುದು." "ಕ್ಯಾಸ್ಟಿಂಗ್/ರೆಕಾರ್ಡಿಂಗ್ ಸಮಯದಲ್ಲಿ ಸೂಕ್ಷ್ಮ ಮಾಹಿತಿಯನ್ನು ಬಹಿರಂಗಪಡಿಸುವುದು" "ಮತ್ತೊಮ್ಮೆ ತೋರಿಸದಿರು" "ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸು" "ನಿರ್ವಹಿಸಿ" - "ಸಾಮಾನ್ಯ ಅಧಿಸೂಚನೆಗಳು" - "ಎಲ್ಲಾ ಸಾಮಾನ್ಯ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ" + "ನಿಶ್ಶಬ್ಧ ಅಧಿಸೂಚನೆಗಳು" + "ಎಲ್ಲಾ ನಿಶ್ಶಬ್ಧ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ" "ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಎನ್ನುವ ಮೂಲಕ ಅಧಿಸೂಚನೆಗಳನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ" "ಈಗ ಪ್ರಾರಂಭಿಸಿ" "ಯಾವುದೇ ಅಧಿಸೂಚನೆಗಳಿಲ್ಲ" @@ -635,9 +641,9 @@ "ನಿರ್ಬಂಧಿಸಿ" "ತೋರಿಸುತ್ತಲಿರಿ" "ಕಿರಿದುಗೊಳಿಸಿ" - "ಹಿತವಾಗಿ" + "ನಿಶ್ಶಬ್ದಗೊಳಿಸಿ" "ಮೌನವಾಗಿರಿ" - "ಅಡಚಣೆ" + "ಎಚ್ಚರಿಕೆ" "ಎಚ್ಚರಿಸುತ್ತಿರಿ" "ಅಧಿಸೂಚನೆಗಳನ್ನು ಆಫ್ ಮಾಡಿ" "ಈ ಅಪ್ಲಿಕೇಶನ್‌ನಿಂದ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸುತ್ತಲೇ ಇರಬೇಕೆ?" @@ -651,10 +657,8 @@ "ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ." "ಈ ಗುಂಪಿನ ಅಧಿಸೂಚನೆಗಳನ್ನು ಇಲ್ಲಿ ಕಾನ್ಫಿಗರ್‌ ಮಾಡಲಾಗಿರುವುದಿಲ್ಲ" "ಪ್ರಾಕ್ಸಿ ಮಾಡಿದ ಅಧಿಸೂಚನೆಗಳು" - - - - + "%1$s ನ ಎಲ್ಲಾ ಅಧಿಸೂಚನೆಗಳು" + "ಇನ್ನಷ್ಟು ನೋಡಿ" "ಈ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಮರಾವನ್ನು ಬಳಸುತ್ತಿದೆ." "ಈ ಅಪ್ಲಿಕೇಶನ್ ಮೈಕ್ರೊಫೋನ್ ಅನ್ನು ಬಳಸುತ್ತಿದೆ." "ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿ ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಮೇಲಿಂದ ಪ್ರದರ್ಶಿಸುತ್ತಿದೆ." @@ -898,7 +902,7 @@ "ಅನುಮತಿಸಿ" "ನಿರಾಕರಿಸಿ" "ಬ್ಯಾಟರಿ ಸೇವರ್‌ ಅನ್ನು ನಿಗದಿಗೊಳಿಸಲು ಟ್ಯಾಪ್‌ ಮಾಡಿ" - "ಬ್ಯಾಟರಿ %d%% ರಷ್ಟು ಇರುವಾಗ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆನ್‌ ಆಗುತ್ತದೆ" + "ಬ್ಯಾಟರಿ ಖಾಲಿಯಾಗುವ ಸಾಧ್ಯತೆ ಇದ್ದಾಗ ಆನ್ ಮಾಡಿ" "ಬೇಡ ಧನ್ಯವಾದಗಳು" "ಬ್ಯಾಟರಿ ಸೇವರ್ ನಿಗದಿಯನ್ನು ಆನ್ ಮಾಡಲಾಗಿದೆ" "ಬ್ಯಾಟರಿ %d%% ಗಿಂತ ಕಡಿಮೆ ಆದಾಗ ಬ್ಯಾಟರಿ ಸೇವರ್‌ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆನ್‌ ಆಗುತ್ತದೆ." @@ -930,6 +934,5 @@ "ಬಲ ಮೇಲ್ಭಾಗಕ್ಕೆ ಸರಿಸಿ" "ಸ್ಕ್ರೀನ್‌ನ ಎಡ ಕೆಳಭಾಗಕ್ಕೆ ಸರಿಸಿ" "ಕೆಳಗಿನ ಬಲಭಾಗಕ್ಕೆ ಸರಿಸಿ" - - + "ವಜಾಗೊಳಿಸಿ" diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index e6d3283a07db..e40ab6fddb00 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -62,9 +62,12 @@ "USB 디버깅이 허용되지 않음" "현재 이 기기에 로그인한 사용자는 USB 디버깅을 사용 설정할 수 없습니다. 이 기능을 사용하려면 기본 사용자로 전환하세요." "USB 포트 비활성화됨" - "기기를 액체나 이물질로부터 보호하기 위해 USB 포트가 사용 중지되었으며 액세서리를 연결할 수 없습니다.\n\nUSB 포트를 다시 안전하게 사용할 수 있게 되면 알려 드리겠습니다." + + "충전기와 액세서리를 감지할 수 있도록 USB 포트가 사용 설정됨" "USB 사용" + + "전체화면 모드로 확대" "전체화면 모드로 확대" "스크린샷" @@ -118,6 +121,11 @@ "취소" "확인" "다시 시도하세요." + "비어 있는 공간, 탭하여 인증 취소" + "다시 시도해 주세요." + "얼굴을 찾는 중" + "얼굴이 인증되었습니다." + "확인함" "지문 센서를 터치하세요." "지문 아이콘" "찾는 중..." @@ -369,8 +377,7 @@ "%s에" "%s까지" "어두운 테마" - - + "어두운 테마\n절전 모드" "NFC" "NFC 사용 중지됨" "NFC 사용 설정됨" @@ -445,13 +452,16 @@ "절전 모드 사용 중" "성능 및 백그라운드 데이터를 줄입니다." "절전 모드 사용 중지" - "녹화 또는 전송 중에 %s에서 내가 재생하는 오디오, 비밀번호, 결제 정보, 사진, 메시지 등 민감한 정보를 캡처할 수 있습니다." + "녹화 또는 전송 중에 %s에서 오디오, 비밀번호, 결제 정보, 사진, 메시지 등 화면에 표시되거나 기기에서 재생되는 민감한 정보를 캡처할 수 있습니다." + "녹화 또는 전송 중에 이 기능을 제공하는 서비스에서 오디오, 비밀번호, 결제 정보, 사진, 메시지 등 화면에 표시되거나 기기에서 재생되는 민감한 정보를 캡처할 수 있습니다." "전송/녹화 중에 민감한 정보 노출" "다시 표시 안함" "모두 지우기" "관리" - "조용한 알림" - "조용한 알림 모두 삭제" + + + + "방해 금지 모드로 일시중지된 알림" "시작하기" "알림 없음" @@ -635,9 +645,11 @@ "차단" "계속 표시하기" "최소화" - "소리 및 알림 없이 표시" + + "계속 무음으로 알림" - "소리 및 알림으로 표시" + + "계속 알림" "알림 사용 중지" "이 앱의 알림을 계속 표시하시겠습니까?" @@ -651,10 +663,8 @@ "이 알림은 수정할 수 없습니다." "이 알림 그룹은 여기에서 설정할 수 없습니다." "프록시를 통한 알림" - - - - + "모든 %1$s 알림" + "더보기" "앱이 카메라를 사용 중입니다." "앱이 마이크를 사용 중입니다." "앱이 화면의 다른 앱 위에 표시되고 있습니다." @@ -898,7 +908,8 @@ "허용" "거부" "탭하여 절전 모드 예약" - "배터리가 %d%%가 되면 자동으로 켜기" + + "사용 안함" "절전 모드 예약 사용 설정됨" "배터리가 %d%% 아래로 내려가면 절전 모드가 자동으로 켜집니다." @@ -930,6 +941,5 @@ "오른쪽 상단으로 이동" "왼쪽 하단으로 이동" "오른쪽 하단으로 이동" - - + "닫기" diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index ff421cb829b9..dbeea5b6d386 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -62,9 +62,12 @@ "USB мүчүлүштүктөрүн оңдоого уруксат жок" "Учурда бул аккаунтта USB аркылуу мүчүлүштүктөрдү оңдоо функциясын иштетүүгө болбойт. Негизги колдонуучунун аккаунтуна кириңиз." "USB порту өчүрүлдү" - "Түзмөгүңүздү суюктук менен урандылардан коргоо үчүн USB порту өчүрүлдү, азырынча ага гарнитураны саюуга болбойт.\n\nUSB портун кайра колдонуу мүмкүн болгондо, билдирме аласыз." + + "Кубаттагычтарды жана аксессуарларды аныктоо үчүн USB оюкчасы иштетилди" "USB’ни иштетүү" + + "Экрнд тлтр ү. чен өлч өзг" "Экранды толтуруу ү-н чоюу" "Скриншот" @@ -118,6 +121,11 @@ "Жокко чыгаруу" "Ырастоо" "Кайталоо" + "Бош жер калып калды, аутентификацияны жокко чыгаруу үчүн таптап коюңуз" + "Кайра аракет кылыңыз" + "Жүзүңүз изделүүдө" + "Жүздүн аныктыгы текшерилди" + "Ырасталды" "Манжа изинин сенсорун басыңыз" "Манжа изинин сүрөтчөсү" "Жүзүңүз изделүүдө…" @@ -152,7 +160,7 @@ "Ethernet ажырады." "Ethernet туташты." "Сигнал жок." - "Туташуу жок." + "Байланыш жок." "Таякча жок." "Бир таякча." "Эки таякча." @@ -369,8 +377,7 @@ "Саат %s күйөт" "%s чейин" "Түнкү режим" - - + "Түнкү режим\nБатареяны үнөмдөгүч" "NFC" "NFC өчүрүлгөн" "NFC иштетилген" @@ -445,13 +452,16 @@ "Батареяны үнөмдөгүч режими күйүк" "Иштин майнаптуулугун начарлатып, фондук дайындарды чектейт" "Батареяны үнөмдөгүч режимин өчүрүү" - "Жаздырып же тышкы экранга чыгаруу учурунда, %s ойноткон аудиоңуз, сырсөздөрүңүз, төлөө маалыматыңыз, сүрөттөрүңүз жана билдирүүлөрүңүз сыяктуу купуя маалыматты жаздырып калышы мүмкүн." + "Жаздырып же тышкы экранга чыгаруу учурунда, %s колдонмосу ойноткон аудиоңуз, сырсөздөрүңүз, төлөө маалыматыңыз, сүрөттөрүңүз жана билдирүүлөрүңүз сыяктуу экранда көрсөтүлгөн купуя маалыматты жаздырып калышы мүмкүн." + "Жаздырып же тышкы экранга чыгаруу учурунда, бул функцияны аткарып жаткан колдонмо ойноткон аудиоңуз, сырсөздөрүңүз, төлөө маалыматыңыз, сүрөттөрүңүз жана билдирүүлөрүңүз сыяктуу экранда көрсөтүлгөн купуя маалыматты жаздырып калышы мүмкүн." "Тышкы экранга чыгарууда/жаздырууда купуя маалыматты ачыкка чыгаруу" "Экинчи көрсөтүлбөсүн" "Бардыгын тазалап салуу" "Башкаруу" - "Маанилүү эмес билдирмелер" - "Бардык маанилүү эмес билдирмелерди тазалоо" + + + + "\"Тынчымды алба\" режиминде билдирмелер тындырылды" "Азыр баштоо" "Билдирме жок" @@ -635,9 +645,11 @@ "Бөгөттөө" "Көрсөтүлө берсин" "Кичирейтүү" - "Жумшак" + + "Үнү чыкпасын" - "Үзгүлтүктүү" + + "Кабар бериле берсин" "Билдирмелерди өчүрүү" "Бул колдонмонун эскертмелери көрсөтүлө берсинби?" @@ -647,14 +659,12 @@ "Маанилүү билдирмелердин ылдый жагында чагылдырылат. Ар дайым үнсүз." "Маанилүү билдирмелердин ылдый жагында чагылдырылат. Ар дайым үнсүз." "Маанилүү билдирмелердин ылдый жагында чагылдырылат. Ар дайым үнсүз." - "Үн чыгаруу жана абал тилкесиндеги сүрөтчө менен көңүлүңүздү бурат. Кулпуланган экранда көрсөтүлөт." + "Билдирме келгенде атайын үн чыгат же абал тилкесинде сүрөтчө пайда болот. Билдирмелер кулпуланган экранда көрүнөт." "Бул билдирмелерди өзгөртүүгө болбойт." "Бул билдирмелердин тобун бул жерде конфигурациялоого болбойт" "Прокси билдирмеси" - - - - + "%1$s колдонмосунун бардык билдирмелери" + "Дагы көрүү" "Бул колдонмо камераны колдонууда." "Бул колдонмо микрофонду колдонууда." "Бул колдонмо экрандагы башка терезелердин үстүнөн көрсөтүлүүдө." @@ -898,7 +908,8 @@ "Уруксат берүү" "Жок" "Батареяны үнөмдөгүчтүн тартибин жөндөө үчүн басыңыз" - "Батареянын деңгээли %d%% жеткенде, автоматтык түрдө күйсүн" + + "Жок, рахмат" "Батареяны үнөмдөгүчтүн тартиби күйгүзүлдү" "Батареянын деңгээли %d%% төмөндөгөндө, Батареяны үнөмдөгүч режими автоматтык түрдө күйөт." @@ -930,6 +941,5 @@ "Жогорку оң жакка жылдырыңыз" "Төмөнкү сол жакка жылдыруу" "Төмөнкү оң жакка жылдырыңыз" - - + "Жабуу" diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 5acef8df3a36..fa1c32a9dfba 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -62,9 +62,12 @@ "ບໍ່​ອະ​ນຸ​ຍາດ​ໃຫ້​ມີ​ການ​ແກ້​ໄຂ​ບັນ​ຫາ USB" "ຜູ້ໃຊ້ທີ່ກຳລັງເຂົ້າສູ່ລະບົບອຸປະກອນຢູ່ໃນຕອນນີ້ບໍ່ສາມາດເປີດໃຊ້ການດີບັກ USB ໄດ້. ເພື່ອໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ສະຫຼັບໄປໃຊ້ຜູ້ໃຊ້ຫຼັກ." "ປິດການນຳໃຊ້ຜອດ USB ແລ້ວ" - "ເພື່ອປົກປ້ອງອຸປະກອນຂອງທ່ານຈາກຂອງແຫລວ ຫຼື ເສດດິນຕ່າງໆ, ຜອດ USB ຈຶ່ງຖືກປິດການນຳໃຊ້ ແລະ ຈະບໍ່ກວດຫາອຸປະກອນເສີມໃດໆ.\n\nທ່ານຈະໄດ້ຮັບການແຈ້ງເຕືອນເມື່ອມັນປອດໄພໃນການໃຊ້ຜອດ USB ອີກເທື່ອໜຶ່ງ." + + "ເປີດນຳໃຊ້ USB ແລ້ວເພື່ອກວດຫາສາຍສາກ ແລະ ອຸປະກອນເສີມ" "ເປີດໃຊ້ USB" + + "ຊູມໃຫ້ເຕັມໜ້າຈໍ" "ປັບໃຫ້ເຕັມໜ້າຈໍ" "ພາບໜ້າຈໍ" @@ -118,6 +121,11 @@ "ຍົກເລີກ" "ຢືນຢັນ" "ລອງໃໝ່" + "ພື້ນທີ່ຫວ່າງເປົ່າ, ແຕະເພື່ອຍົກເລີກການພິສູດຢືນຢັນ" + "ກະລຸນາລອງໃໝ່" + "ກຳລັງເບິ່ງໃບໜ້າຂອງທ່ານ" + "ພິສູດຢືນຢັນໃບໜ້າແລ້ວ" + "ຢືນຢັນແລ້ວ" "ແຕະໃສ່ເຊັນເຊີລາຍນິ້ວມື" "ໄອຄອນລາຍນິ້ວມື" "ກຳລັງຊອກຫາທ່ານ…" @@ -369,8 +377,7 @@ "ເປີດຕອນ %s" "ຈົນກວ່າຈະຮອດ %s" "ຮູບແບບສີສັນມືດ" - - + "ຮູບແບບສີສັນມືດ\nຕົວປະຢັດແບັດເຕີຣີ" "NFC" "NFC is disabled" "NFC is enabled" @@ -445,13 +452,16 @@ "ຕົວປະຢັດແບັດເຕີຣີເປີດຢູ່" "ຫຼຸດ​ປະ​ສິ​ທິ​ພາບ​ແລະ​ການ​ນຳ​ໃຊ້​ຂໍ້​ມູນ​ພື້ນຫຼັງ" "ປິດຕົວປະຢັດແບັດເຕີຣີ" - "ໃນລະຫວ່າງການບັນທຶກ ແລະ ການສົ່ງສັນຍານ, %s ຈະສາມາດບັນທຶກຂໍ້ມູນທີ່ລະອຽດອ່ອນໃດກໍຕາມ ເຊັ່ນ: ສຽງທີ່ທ່ານເປີດ ແລະ ລະຫັດຜ່ານຂອງທ່ານ, ຂໍ້ມູນການຈ່າຍເງິນ, ຮູບພາບ ແລະ ຂໍ້ຄວາມ." + "ໃນລະຫວ່າງການບັນທຶກ ຫຼື ການຖ່າຍທອດສັນຍານ, %s ຈະສາມາດບັນທຶກຂໍ້ມູນທີ່ລະອຽດອ່ອນໃດໆທີ່ສະແດງຢູ່ໜ້າຈໍຂອງທ່ານ ຫຼື ສາຍຈາກອຸປະກອນທ່ານ, ຮວມທັງຂໍ້ມູນທີ່ລະອຽດອ່ອນ ເຊັ່ນ: ສຽງ, ລະຫັດຜ່ານ, ຂໍ້ມູນການຈ່າຍເງິນ, ຮູບພາບ ແລະ ຂໍ້ຄວາມ." + "ໃນລະຫວ່າງການບັນທຶກ ຫຼື ການຖ່າຍທອດສັນຍານ, ບໍລິການທີ່ສະໜອງການເຮັດວຽກນີ້ຈະສາມາດບັນທຶກຂໍ້ມູນທີ່ລະອຽດອ່ອນໃດໆທີ່ສະແດງຢູ່ໜ້າຈໍຂອງທ່ານ ຫຼື ສາຍຈາກອຸປະກອນທ່ານ, ຮວມທັງຂໍ້ມູນທີ່ລະອຽດອ່ອນ ເຊັ່ນ: ສຽງ, ລະຫັດຜ່ານ, ຂໍ້ມູນການຈ່າຍເງິນ, ຮູບພາບ ແລະ ຂໍ້ຄວາມ." "ເປີດເຜີຍຂໍ້ມູນລະອຽດອ່ອນໃນລະຫວ່າງການສົ່ງສັນຍານ/ການບັນທຶກ" "ບໍ່​ຕ້ອງ​ສະ​ແດງ​ອີກ" "ລຶບລ້າງທັງໝົດ" "ຈັດການ" - "ການແຈ້ງເຕືອນສຸພາບ" - "ລຶບລ້າງການແຈ້ງເຕືອນແບບສຸພາບ" + + + + "ຢຸດການແຈ້ງເຕືອນໂດຍໂໝດຫ້າມລົບກວນແລ້ວ" "ເລີ່ມດຽວນີ້" "ບໍ່ມີການແຈ້ງເຕືອນ" @@ -635,9 +645,11 @@ "ບລັອກ" "ສະແດງຕໍ່ໄປ" "ຫຍໍ້" - "ສຸພາບ" + + "ສືບຕໍ່ມິດງຽບ" - "ການຂັດຈັງຫວະ" + + "ສືບຕໍ່ແຈ້ງເຕືອນ" "ປິດການແຈ້ງເຕືອນ" "ສະແດງການແຈ້ງເຕືອນຈາກແອັບນີ້ຕໍ່ໄປບໍ?" @@ -651,10 +663,8 @@ "ບໍ່ສາມາດແກ້ໄຂການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄດ້." "ບໍ່ສາມາດຕັ້ງຄ່າກຸ່ມການແຈ້ງເຕືອນນີ້ຢູ່ບ່ອນນີ້ໄດ້" "ການແຈ້ງເຕືອນແບບພຣັອກຊີ" - - - - + "ການແຈ້ງເຕືອນ %1$s ທັງໝົດ" + "ເບິ່ງເພີ່ມເຕີມ" "ແອັບນີ້ກຳລັງໃຊ້ກ້ອງຢູ່." "ແອັບນີ້ກຳລັງໃຊ້ໄມໂຄຣໂຟນຢູ່." "ແອັບນີ້ກຳລັງສະແດງຜົນບັງແອັບອື່ນຢູ່ໜ້າຈໍຂອງທ່ານ." @@ -898,7 +908,8 @@ "ອະນຸຍາດ" "ປະຕິເສດ" "ແຕະເພື່ອຕັ້ງການເປີດຕົວປະຢັດແບັດເຕີຣີ" - "ຕົວປະຢັດແບັດເຕີຣີຈະເປີດຂຶ້ນມາໂດຍອັດຕະໂນມັດເມື່ອແບັດເຕີຣີຢູ່ທີ່ລະດັບ %d%%." + + "ບໍ່, ຂອບໃຈ" "ຕັ້ງໃຫ້ເປີດຕົວປະຢັດແບັດເຕີຣີແລ້ວ" "ຕົວປະຢັດແບັດເຕີຣີຈະເປີດຂຶ້ນມາໂດຍອັດຕະໂນມັດເມື່ອແບັດເຕີຣີຕ່ຳກວ່າ %d%%." @@ -930,6 +941,5 @@ "ຍ້າຍຂວາເທິງ" "ຍ້າຍຊ້າຍລຸ່ມ" "ຍ້າຍຂວາລຸ່ມ" - - + "ປິດໄວ້" diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 3bb42122d4ed..88846d923974 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -62,9 +62,12 @@ "USB derinimas neleidžiamas" "Šiuo metu prie įrenginio prisijungęs naudotojas negali įjungti USB derinimo. Kad galėtumėte naudoti šią funkciją, perjunkite į pagrindinį naudotoją." "USB prievadas išjungtas" - "Siekiant apsaugoti įrenginį nuo skysčių ar smulkių dalelių, USB prievadas buvo išjungtas ir neaptiks jokių priedų.\n\nJums bus pranešta, kai galėsite vėl saugiai naudoti USB prievadą." + + "USB prievadas įgalintas aptikti kroviklius ir priedus" "Įgalinti USB" + + "Keisti mast., kad atit. ekr." "Ištempti, kad atit. ekr." "Ekrano kopija" @@ -118,6 +121,11 @@ "Atšaukti" "Patvirtinkite" "Bandyti dar kartą" + "Tuščia sritis; palieskite, kad atšauktumėte autentifikavimą" + "Bandykite dar kartą" + "Ieškoma veido" + "Veidas autentifikuotas" + "Patvirtinta" "Palieskite piršto antspaudo jutiklį" "Piršto antspaudo piktograma" "Ieškoma jūsų…" @@ -373,8 +381,7 @@ "%s" "Iki %s" "Tamsioji tema" - - + "Tamsioji tema\nAkum. tausojimo priemonė" "ALR" "ALR išjungtas" "ALR įjungtas" @@ -451,13 +458,16 @@ "Akumuliatoriaus tausojimo priemonė įjungta" "Sumažinamas našumas ir foninių duomenų naudojimas" "Išjungti Akumuliatoriaus tausojimo priemonę" - "Įrašant ar perduodant turinį „%s“ gali fiksuoti bet kokią neskelbtiną informaciją, pvz., leidžiamą garso įrašą ir slaptažodžius, mokėjimo informaciją, nuotraukas ir pranešimus." + "Įrašant ar perduodant turinį, programa „%s“ gali fiksuoti bet kokią neskelbtiną informaciją, rodomą ekrane ar leidžiamą iš įrenginio (įskaitant tokią neskelbtiną informaciją kaip garso įrašai, slaptažodžiai, mokėjimo informacija, nuotraukos ir pranešimai)." + "Įrašant ar perduodant turinį, šią funkciją teikianti paslauga gali fiksuoti bet kokią neskelbtiną informaciją, rodomą ekrane ar leidžiamą iš įrenginio (įskaitant tokią neskelbtiną informaciją kaip garso įrašai, slaptažodžiai, mokėjimo informacija, nuotraukos ir pranešimai)." "Neskelbtinos informacijos atskleidimas perduodant / įrašant" "Daugiau neberodyti" "Viską išvalyti" "Tvarkyti" - "Taktiški pranešimai" - "Išvalyti visus taktiškus pranešimus" + + + + "Pranešimai pristabdyti naudojant netrukdymo režimą" "Pradėti dabar" "Nėra įspėjimų" @@ -641,9 +651,11 @@ "Blokuoti" "Toliau rodyti" "Sumažinti" - "Švelnūs" + + "Neskambėti" - "Trikdantys" + + "Toliau įspėti" "Išjungti pranešimus" "Toliau rodyti iš šios programos gautus pranešimus?" @@ -657,10 +669,8 @@ "Šių pranešimų keisti negalima." "Šios grupės pranešimai čia nekonfigūruojami" "Per tarpinį serverį gautas pranešimas" - - - - + "Visi „%1$s“ pranešimai" + "Žr. daugiau" "Ši programa naudoja fotoaparatą." "Ši programa naudoja mikrofoną." "Ši programa rodoma ekrane virš kitų programų." @@ -908,7 +918,8 @@ "Leisti" "Neleisti" "Palietę planuokite akumuliatoriaus tausojimo priemonės veikimą" - "Įjunkite automatiškai akumuliatoriaus įkrovai pasiekus %d%%." + + "Ne, ačiū" "Akumuliatoriaus tausojimo priemonės veikimas suplanuotas" "Akumuliatoriaus tausojimo priemonė bus įjungta automatiškai akumuliatoriaus įkrovai pasiekus mažiau nei %d%%." @@ -940,6 +951,5 @@ "Perkelti į viršų dešinėje" "Perkelti į apačią kairėje" "Perkelti į apačią dešinėje" - - + "Atmesti" diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 2b529ae71592..5719dc119f27 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -62,9 +62,12 @@ "USB atkļūdošana nav atļauta" "Lietotājs, kurš pašlaik ir pierakstījies šajā ierīcē, nevar iespējot USB atkļūdošanu. Lai izmantotu šo funkciju, pārslēdzieties uz galveno lietotāju." "USB pieslēgvieta atspējota" - "Lai aizsargātu ierīci no šķidruma un gružiem, USB pieslēgvieta ir atspējota un tajā nevarēs noteikt pieslēgtus piederumus.\n\nKad USB pieslēgvietas izmantošana būs atkal droša, saņemsiet paziņojumu." + + "USB portam ir iespējota uzlādes ierīču un piederumu noteikšana" "Iespējot USB portu" + + "Tālumm., lai aizp. ekr." "Stiepiet, lai aizp. ekr." "Ekrānuzņēmums" @@ -118,6 +121,11 @@ "Atcelt" "Apstiprināt" "Mēģināt vēlreiz" + "Tukšs apgabals. Pieskarieties tam, lai atceltu autentificēšanu." + "Lūdzu, mēģiniet vēlreiz." + "Tiek meklēta jūsu seja" + "Seja autentificēta" + "Apstiprināts" "Pieskarieties pirksta nospieduma sensoram" "Pirksta nospieduma ikona" "Notiek jūsu sejas meklēšana…" @@ -371,8 +379,7 @@ "Plkst. %s" "Līdz %s" "Tumšais motīvs" - - + "Tumšais motīvs\nJaudas taupīšanas režīms" "NFC" "NFC ir atspējoti" "NFC ir iespējoti" @@ -448,13 +455,16 @@ "Akumulatora jaudas taupīšanas režīms ir ieslēgts" "Samazina veiktspēju un fona datus" "Izslēgt akumulatora jaudas taupīšanas režīmu" - "Ierakstīšanas un apraides laikā %s var tvert jebkādu sensitīvu informāciju, piemēram, jūsu atskaņoto audio, paroles, maksājumu informāciju, fotoattēlus un ziņojumus." + "Ierakstīšanas un apraides laikā lietotne %s var tvert jebkādu sensitīvu informāciju, kas tiek rādīta jūsu ekrānā vai atskaņota jūsu ierīcē, tostarp tādu sensitīvu informāciju kā audio, paroles, maksājumu informāciju, fotoattēlus un ziņojumus." + "Ierakstīšanas vai apraides laikā pakalpojums, kurš nodrošina šo funkciju, var tvert jebkādu sensitīvu informāciju, kas tiek rādīta jūsu ekrānā vai atskaņota jūsu ierīcē, tostarp tādu sensitīvu informāciju kā audio, paroles, maksājumu informāciju, fotoattēlus un ziņojumus." "Sensitīvas informācijas atklāšana apraides/ierakstīšanas laikā" "Vairs nerādīt" "Dzēst visu" "Pārvaldīt" - "Neuzkrītoši paziņojumi" - "Notīrīt visus neuzkrītošos paziņojumus" + + + + "Paziņojumi pārtraukti, izmantojot iestatījumu “Netraucēt”" "Sākt tūlīt" "Nav paziņojumu" @@ -638,9 +648,11 @@ "Bloķēt" "Turpināt rādīt" "Minimizēt" - "Neuzkrītoši brīdinājumi" + + "Neslēgt skaļumu" - "Uznirstoši brīdinājumi" + + "Turpināt paziņošanu" "Izslēgt paziņojumus" "Vai turpināt rādīt paziņojumus no šīs lietotnes?" @@ -654,10 +666,8 @@ "Šos paziņojumus nevar modificēt." "Šeit nevar konfigurēt šo paziņojumu grupu." "Starpniekservera paziņojums" - - - - + "Visi lietotnes %1$s paziņojumi" + "Skatīt vairāk" "Šajā lietotnē tiek izmantota kamera." "Šajā lietotnē tiek izmantots mikrofons." "Šī lietotne tiek rādīta ekrānā pāri citām lietotnēm." @@ -903,7 +913,8 @@ "Atļaut" "Neatļaut" "Pieskarieties, lai iestatītu akumulatora jaudas taupīšanas režīma grafiku" - "Ieslēgt automātiski, kad akumulatora uzlādes līmenis ir %d%%" + + "Nē, paldies" "Ieslēgts akumulatora enerģijas taupīšanas režīma grafiks" "Tiklīdz akumulatora uzlādes līmenis būs zemāks nekā %d%%, tiks automātiski ieslēgts akumulatora jaudas taupīšanas režīms." @@ -935,6 +946,5 @@ "Pārvietot augšpusē pa labi" "Pārvietot apakšpusē pa kreisi" "Pārvietot apakšpusē pa labi" - - + "Nerādīt" diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 69d648b82996..86109b82ab1b 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -62,9 +62,12 @@ "Отстранувањето грешки на USB не е дозволено" "Корисникот што моментално е најавен на уредов не може да вклучи отстранување грешки на USB. За да ја користите функцијава, префрлете се на примарниот корисник." "USB-портата е оневозможена" - "За да го заштити уредот од течност и нечистотија, USB-портата е оневозможена и нема да открива додатоци.\n\nЌе ве известиме кога ќе биде безбедно да ја користите USB-портата повторно." + + "USB-портата е овозможена за откривање полначи и додатоци" "Овозможи USB" + + "Зумирај да се исполни екранот" "Растегни да се исполни екранот" "Слика од екранот" @@ -118,6 +121,11 @@ "Откажи" "Потврди" "Обиди се повторно" + "Празен регион, допрете за да ја откажете проверката" + "Обидете се повторно" + "Го бараме вашето лице" + "Лицето е проверено" + "Потврдено" "Допрете го сензорот за отпечатоци" "Икона за отпечатоци" "Ве бараме вас…" @@ -369,8 +377,7 @@ "Ќе се вклучи во %s" "До %s" "Темна тема" - - + "Темна тема\nШтедач на батерија" "NFC" "NFC е оневозможено" "NFC е овозможено" @@ -445,13 +452,16 @@ "Штедачот на батерија е вклучен" "Ја намалува изведбата и податоците во заднина" "Исклучете го штедачот на батерија" - "При снимањето или емитувањето, %s може да ги сними сите чувствителни информации, како на пример, аудиото што ви е пуштено или лозинките, информациите за плаќање, фотографиите и пораките." + "При снимањето или емитувањето, %s може да ги сними чувствителните информации што се прикажани на вашиот екран или пуштени од вашиот уред, вклучувајќи чувствителни информации како што се аудио, лозинки, информации за плаќање, фотографии и пораки." + "При снимањето или емитувањето, услугата што ја обезбедува функцијава може да ги сними чувствителните информации што се прикажани на вашиот екран или пуштени од вашиот уред, вклучувајќи чувствителни информации како што се аудио, лозинки, информации за плаќање, фотографии и пораки." "Изложување чувствителни информации при емитување/снимање" "Не покажувај повторно" "Исчисти сè" "Управувајте" - "Нежни известувања" - "Исчисти ги сите нежни известувања" + + + + "Известувањата се паузирани од „Не вознемирувај“" "Започни сега" "Нема известувања" @@ -635,9 +645,11 @@ "Блокирај" "Продолжи да ги прикажуваш" "Минимизирај" - "Нежно" + + "Продолжи со безгласно прикажување" - "Прекинувачки" + + "Продолжи да ме предупредуваш" "Исклучи известувања" "Дали да продолжат да се прикажуваат известувања од апликацијава?" @@ -651,10 +663,8 @@ "Овие известувања не може да се изменат" "Оваа група известувања не може да се конфигурира тука" "Известување преку прокси" - - - - + "Сите известувања за %1$s" + "Прикажи повеќе" "Апликацијава ја користи камерата." "Апликацијава го користи микрофонот." "Апликацијава се прикажува врз други апликации на вашиот екран." @@ -898,7 +908,8 @@ "Дозволи" "Одбиј" "Допрете за да закажете „Штедач на батерија“" - "Вклучи автоматски кога батеријата е на %d %%" + + "Не, фала" "Распоредот за „Штедач на батерија“ е вклучен" "Штедачот на батерија ќе се вклучи автоматски кога батеријата ќе падне под %d %%." @@ -930,6 +941,5 @@ "Премести горе десно" "Премести долу лево" "Премести долу десно" - - + "Отфрли" diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 0cc0aef19e61..cd7cb67228fb 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -62,9 +62,12 @@ "USB ഡീബഗ്ഗിംഗ് അനുവദനീയമല്ല" "ഉപകരണത്തിൽ ഇപ്പോൾ സൈൻ ഇൻ ചെയ്‌തിരിക്കുന്ന ഉപയോക്താവിന് USB ഡീബഗ്ഗിംഗ് ഓണാക്കാനാകില്ല. ഈ ഫീച്ചർ ഉപയോഗിക്കാൻ പ്രാഥമിക ഉപയോക്താവിലേക്ക് മാറുക." "USB പോർട്ട് പ്രവർത്തനരഹിതമാക്കി" - "ദ്രാവകത്തിൽ നിന്നോ പൊടിയിൽ നിന്നോ നിങ്ങളുടെ ഉപകരണത്തെ പരിരക്ഷിക്കാനായി USB പോർട്ട് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നതിനാൽ അത് ആക്‌സസറികളൊന്നും തിരിച്ചറിയില്ല.\n\n USB പോർട്ട് സുരക്ഷിതമായി വീണ്ടും ഉപയോഗിക്കാനാകുമ്പോൾ നിങ്ങളെ അറിയിക്കും." + + "ആക്‌സസറികളും ചാർജറുകളും കണ്ടെത്താൻ USB പോർട്ട് പ്രവർത്തനക്ഷമമാക്കുക" "USB പ്രവർത്തനക്ഷമമാക്കുക" + + "സ്‌ക്രീനിൽ ഉൾക്കൊള്ളിക്കാൻ സൂം ചെയ്യുക" "സ്‌ക്രീനിൽ ഉൾക്കൊള്ളിക്കാൻ വലിച്ചുനീട്ടുക" "സ്‌ക്രീൻഷോട്ട്" @@ -118,6 +121,11 @@ "റദ്ദാക്കുക" "സ്ഥിരീകരിക്കുക" "വീണ്ടും ശ്രമിക്കുക" + "ശൂന്യമായ ഇടം, പരിശോധിച്ചുറപ്പിക്കൽ റദ്ദാക്കാൻ ടാപ്പ് ചെയ്യുക" + "വീണ്ടും ശ്രമിക്കുക" + "നിങ്ങളുടെ മുഖത്തിന് വേണ്ടി തിരയുന്നു" + "മുഖം പരിശോധിച്ചുറപ്പിച്ചു" + "സ്ഥിരീകരിച്ചു" "വിരലടയാള സെൻസർ സ്‌പർശിക്കുക" "വിരലടയാള ഐക്കൺ" "നിങ്ങൾക്കായി തിരയുന്നു…" @@ -369,8 +377,7 @@ "%s-ന്" "%s വരെ" "ഇരുണ്ട തീം" - - + "ഇരുണ്ട തീം\nബാറ്ററി ലാഭിക്കൽ" "NFC" "NFC പ്രവർത്തനരഹിതമാക്കി" "NFC പ്രവർത്തനക്ഷമമാക്കി" @@ -445,14 +452,15 @@ "ബാറ്ററി ലാഭിക്കൽ ഓണാണ്" "പ്രവർത്തനവും പശ്ചാത്തല ഡാറ്റയും കുറയ്‌ക്കുന്നു" "ബാറ്ററി ലാഭിക്കൽ ഓഫാക്കുക" - "റിക്കോർഡ് ചെയ്യുമ്പോഴോ കാസ്‌റ്റ് ചെയ്യുമ്പോഴോ, നിങ്ങൾ പ്ലേ ചെയ്യുന്ന ഓഡിയോയും പാസ്‌വേഡുകളും, പേയ്മെന്റ് വിവരം, ഫോട്ടോകൾ, സന്ദേശങ്ങളും %s-ന് ക്യാപ്‌ചർ ചെയ്യാനാവും." - "കാസ്‌റ്റ് /റിക്കോർഡ് ചെയ്യുമ്പോൾ സൂക്ഷ്‌മമായി കൈകാര്യം ചെയ്യേണ്ട വിവരം വെളിപ്പെടുത്തുന്നു" + "റെക്കോർഡ് അല്ലെങ്കിൽ കാസ്‌റ്റ് ചെയ്യുന്നതിനിടെ, %s നിങ്ങളുടെ സ്ക്രീനിൽ ദൃശ്യമാകുന്നതോ നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് പ്ലേ ചെയ്‌തതോ ആയ ഓഡിയോ, പാസ്‌വേഡുകൾ, പേയ്മെന്റ് വിവരം, ഫോട്ടോകൾ, സന്ദേശങ്ങൾ എന്നിവ ഉൾപ്പെടെയുള്ള തന്ത്രപ്രധാന വിവരങ്ങൾ ക്യാപ്‌ചർ ചെയ്യാനാവും." + "റെക്കോർഡ് അല്ലെങ്കിൽ കാസ്‌റ്റ് ചെയ്യുന്നതിനിടെ, ഈ പ്രവർത്തനത്തിനാവശ്യമായ സേവനത്തിന്, നിങ്ങളുടെ സ്ക്രീനിൽ ദൃശ്യമാകുന്നതോ ഉപകരണത്തിൽ നിന്ന് പ്ലേ ചെയ്‌തതോ ആയ ഓഡിയോ, പാസ്‌വേഡുകൾ, പേയ്മെന്റ് വിവരം, ഫോട്ടോകൾ, സന്ദേശങ്ങൾ എന്നിവ ഉൾപ്പെടെയുള്ള തന്ത്രപ്രധാന വിവരങ്ങൾ ക്യാപ്‌ചർ ചെയ്യാനാവും." + "കാസ്‌റ്റ്/റെക്കോർഡ് ചെയ്യുമ്പോൾ സൂക്ഷ്‌മമായി കൈകാര്യം ചെയ്യേണ്ട വിവരം വെളിപ്പെടുത്തുന്നു" "വീണ്ടും കാണിക്കരുത്" "എല്ലാം മായ്‌ക്കുക" "മാനേജ് ചെയ്യുക" - + - + "\'ശല്യപ്പെടുത്തരുത്\' വഴി അറിയിപ്പുകൾ താൽക്കാലികമായി നിർത്തി" "ഇപ്പോൾ ആരംഭിക്കുക" @@ -637,9 +645,11 @@ "ബ്ലോക്ക് ചെയ്യുക" "തുടർന്നും കാണിക്കുക" "ചെറുതാക്കുക‍" - "നിശബ്‌ദമായ" + + "നിശബ്‌ദമായ നിലയിൽ തുടരുക" - "തടസ്സപ്പെടുത്തുന്ന" + + "മുന്നറിയിപ്പ് നൽകുന്നത് തുടരുക" "അറിയിപ്പുകൾ ഓഫാക്കുക" "ഈ ആപ്പിൽ നിന്നുള്ള അറിയിപ്പുകൾ തുടർന്നും കാണിക്കണോ?" @@ -649,14 +659,12 @@ "കുറഞ്ഞ പ്രാധാന്യമുള്ള മുൻഗണനാ അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കുന്നു. എപ്പോഴും നിശബ്‌ദം." "കുറഞ്ഞ പ്രാധാന്യമുള്ള മുൻഗണനാ അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കുന്നു. എപ്പോഴും നിശബ്‌ദം." "കുറഞ്ഞ പ്രാധാന്യമുള്ള മുൻഗണനാ അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കുന്നു. എപ്പോഴും നിശബ്‌ദം." - "ശബ്‌ദവും സ്‌റ്റാറ്റസ് ബാർ ഐക്കണും ഉപയോഗിച്ച് നിങ്ങളുടെ ശ്രദ്ധ അതിലേക്ക് നൽകുക. ലോക്ക് സ്‌ക്രീനിൽ കാണിക്കുന്നു." + "ശബ്‌ദവും സ്‌റ്റാറ്റസ് ബാർ ഐക്കണും ഉപയോഗിച്ച് ശ്രദ്ധ ക്ഷണിക്കുന്നു. ലോക്ക് സ്‌ക്രീനിൽ കാണിക്കും." "ഈ അറിയിപ്പുകൾ പരിഷ്ക്കരിക്കാനാവില്ല." "അറിയിപ്പുകളുടെ ഈ ഗ്രൂപ്പ് ഇവിടെ കോണ്‍ഫിഗര്‍ ചെയ്യാൻ കഴിയില്ല" "പ്രോക്‌സി അറിയിപ്പ്" - - - - + "എല്ലാ %1$s അറിയിപ്പുകളും" + "കൂടുതൽ കാണുക" "ഈ ആപ്പ് ക്യാമറ ഉപയോഗിക്കുന്നുണ്ട്." "ഈ ആപ്പ് മൈക്രോഫോൺ ഉപയോഗിക്കുന്നു." "ഈ ആപ്പ് നിങ്ങളുടെ സ്‌ക്രീനിലെ മറ്റ് ആപ്പുകൾക്ക് മുകളിൽ പ്രദർശിപ്പിക്കുന്നു." @@ -900,7 +908,8 @@ "അനുവദിക്കുക" "നിരസിക്കുക" "ബാറ്ററി ലാഭിക്കൽ ഷെഡ്യൂൾ ചെയ്യാൻ ടാപ്പ് ചെയ്യുക" - "ബാറ്ററി %d%% ആകുമ്പോൾ സ്വമേധയാ ഓണാക്കുക" + + "വേണ്ട" "ബാറ്ററി ലാഭിക്കൽ ഷെഡ്യൂൾ ഓണാക്കുക" "ബാറ്ററി %d%% ൽ താഴെയാകുമ്പോൾ, ബാറ്ററി ലാഭിക്കൽ സ്വമേധയാ ഓണാകും." @@ -932,6 +941,5 @@ "മുകളിൽ വലതുഭാഗത്തേക്ക് നീക്കുക" "ചുവടെ ഇടതുഭാഗത്തേക്ക് നീക്കുക" "ചുവടെ വലതുഭാഗത്തേക്ക് നീക്കുക" - - + "ഡിസ്‌മിസ് ചെയ്യുക" diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index af58d4bb920f..5630e0d0d849 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -62,9 +62,12 @@ "USB алдаа засалт хийх боломжгүй" "Энэ төхөөрөмжид нэвтэрсэн хэрэглэгч USB дебаг хийх онцлогийг асаах боломжгүй байна. Энэ онцлогийг ашиглахын тулд үндсэн хэрэглэгч рүү сэлгэнэ үү." "USB портыг идэвхгүй болгосон" - "Таны төхөөрөмжийг шингэн зүйл эсвэл бохирдлоос хамгаалах зорилгоор USB портыг идэвхгүй болгосон бөгөөд ямар ч нэмэлт хэрэгслийг илрүүлэхгүй.\n\nТанд USB портыг дахин ашиглахад аюулгүй болох үед мэдэгдэх болно." + + "Цэнэглэгч болон нэмэлт хэрэгслийг илрүүлэхийн тулд USB портыг идэвхжүүлсэн" "USB-г идэвхжүүлэх" + + "Дэлгэц дүүргэх бол өсгөнө үү" "Дэлгэц дүүргэх бол татна уу" "Дэлгэцийн зураг дарах" @@ -118,6 +121,11 @@ "Цуцлах" "Баталгаажуулах" "Дахин оролдох" + "Нотолгоог цуцлахын тулд хоосон бүсийг товшино уу" + "Дахин оролдоно уу" + "Таны царайг хайж байна" + "Царайг баталгаажууллаа" + "Баталгаажсан" "Хурууны хээ мэдрэгчид хүрэх" "Хурууны хээний дүрс тэмдэг" "Таныг хайж байна…" @@ -369,8 +377,7 @@ "%s-д" "%s хүртэл" "Бараан загвар" - - + "Бараан загвар\nБатарей хэмнэгч" "NFC" "NFC-г цуцалсан" "NFC-г идэвхжүүлсэн" @@ -445,13 +452,16 @@ "Тэжээл хэмнэгч асаалттай байна" "Ажиллагаа болон далд датаг бууруулна" "Тэжээл хэмнэгчийг унтраах" - "Бичиж эсвэл дамжуулж байгаа үед %s таны тоглуулдаг аудио, нууц үг, төлбөрийн мэдээлэл, зураг болон мессеж зэрэг аливаа мэдрэг мэдээллийг авах боломжтой." - "Дамжуулах/бичих үед мэдрэг мэдээллийг задруулж байна" + "Бичиж эсвэл дамжуулж байх үед %s аудио, нууц үг, төлбөрийн мэдээлэл, зураг болон мессеж зэрэг эмзэг мэдээлэл буюу таны дэлгэц дээрээ харуулдаг эсвэл төхөөрөмжөөсөө тоглуулдаг эмзэг мэдээллийг авах боломжтой." + "Бичиж эсвэл дамжуулж байх үед энэ функцийг үзүүлж буй үйлчилгээ нь аудио, нууц үг, төлбөрийн мэдээлэл, зураг болон мессеж зэрэг эмзэг мэдээлэл буюу таны дэлгэц дээрээ харуулдаг эсвэл төхөөрөмжөөсөө тоглуулдаг эмзэг мэдээллийг авах боломжтой." + "Дамжуулах/бичих үед эмзэг мэдээллийг задруулж байна" "Дахиж үл харуулах" "Бүгдийг арилгах" "Удирдах" - "Эелдэг мэдэгдэл" - "Бүх эелдэг мэдэгдлийг устгах" + + + + "Бүү саад бол горимын түр зогсоосон мэдэгдэл" "Одоо эхлүүлэх" "Мэдэгдэл байхгүй" @@ -635,9 +645,11 @@ "Блоклох" "Харуулсан хэвээр байх" "Багасгах" - "Чимээгүй харуулах" + + "Чимээгүй хэвээр харуулах" - "Дуу гаргах" + + "Үргэлжлүүлэн сануулах" "Мэдэгдлийг унтраах" "Энэ аппаас мэдэгдэл харуулсан хэвээр байх уу?" @@ -651,10 +663,8 @@ "Эдгээр мэдэгдлийг өөрчлөх боломжгүй." "Энэ бүлэг мэдэгдлийг энд тохируулах боломжгүй байна" "Прокси хийсэн мэдэгдэл" - - - - + "%1$s-н бүх мэдэгдэл" + "Дэлгэрэнгүй үзэх" "Энэ апп камерыг ашиглаж байна." "Энэ апп микрофоныг ашиглаж байна." "Энэ аппыг таны дэлгэцэд бусад аппын дээр харуулж байна." @@ -898,7 +908,8 @@ "Зөвшөөрөх" "Татгалзах" "Тэжээл хэмнэгч онцлогийг хуваарилахын тулд товших" - "Батарей %d%% болох үед автоматаар асаах" + + "Үгүй, баярлалаа" "Тэжээл хэмнэгч онцлогийн хуваарийг асаасан" "Батарей %d%%-с бага болсон үед Тэжээл хэмнэгч автоматаар асна." @@ -930,6 +941,5 @@ "Баруун дээш зөөх" "Зүүн доош зөөх" "Баруун доош зөөх" - - + "Үл хэрэгсэх" diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index ad56eb6ab346..34c31e1f5e39 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -62,9 +62,12 @@ "USB डीबग करण्‍यास अनुमती नाही" "सध्‍या या डीव्हाइसमध्‍ये साइन इन केलेला वापरकर्ता USB डीबग करणे चालू करू शकत नाही. हे वैशिष्‍ट्य वापरण्‍यासाठी, प्राथमिक वापरकर्त्‍यावर स्विच करा." "USB पोर्ट बंद करा" - "ओलावा आणि धूळ यापासून तुमच्या डिव्हाइसचे रक्षण करण्यासाठी, USB पोर्ट बंद केले आहे आणि कोणत्याही अ‍ॅक्सेसरीज शोधू शकत नाही.\n\nपुन्हा USB पोर्ट वापरण्यासाठी सुरक्षित असेल तेव्हा तुम्हाला सूचना दिली जाईल." + + "चार्जर आणि अ‍ॅक्सेसरी शोधण्यासाठी USB पोर्ट सुरू केलेले आहे" "USB सुरू करा" + + "स्क्रीन भरण्यासाठी झूम करा" "स्क्रीन भरण्यासाठी ताणा" "स्क्रीनशॉट" @@ -118,6 +121,11 @@ "रद्द करा" "खात्री करा" "पुन्हा प्रयत्न करा" + "प्रदेशाचे नाव रिक्त आहे, ऑथेंटिकेशन रद्द करण्यासाठी टॅप करा" + "कृपया पुन्हा प्रयत्न करा" + "तुमचा चेहरा शोधत आहे" + "चेहरा ऑथेंटिकेशन केलेला आहे" + "निश्चित केले" "फिंगरप्रिंट सेन्सरला स्पर्श करा" "फिंगरप्रिंट आयकन" "तुमच्यासाठी शोधत आहे…" @@ -369,8 +377,7 @@ "%s वाजता चालू" "%s पर्यंत" "गडद थीम" - - + "गडद थीम\nबॅटरी सेव्हर" "NFC" "NFC अक्षम केले आहे" "NFC सक्षम केले आहे" @@ -445,14 +452,15 @@ "बॅटरी सेव्‍हर चालू आहे" "कामगिरी आणि पार्श्वभूमीवरील डेटा कमी करते" "बॅटरी सेव्हर बंद करा" - "रेकॉर्ड किंवा कास्ट करत असताना, तुम्ही प्ले करत असलेला ऑडिओ आणि तुमचे पासवर्ड, पेमेंट माहिती, फोटो आणि मेसेज यांसारखी कोणतीही संवेदनशील माहिती %s कॅप्चर करू शकते." + "रेकॉर्ड किंवा कास्ट करत असताना, %s हे ऑडिओ, पासवर्ड, पेमेंट माहिती, फोटो आणि मेसेज यासारख्या संवेदनशील माहितीच्या समावेशासह तुमच्या स्क्रीनवर दाखवलेली किंवा डिव्हाइसवर प्ले केलेली कोणतीही संवेदनशील माहिती कॅप्चर करू शकते." + "रेकॉर्ड किंवा कास्ट करत असताना, हे फंक्शन देऊ करणारी सेवा ऑडिओ, पासवर्ड, पेमेंट माहिती, फोटो आणि मेसेज यासारख्या संवेदनशील माहितीच्या समावेशासह तुमच्या स्क्रीनवर दाखवलेली किंवा डिव्हाइसवर प्ले केलेली कोणतीही संवेदनशील माहिती कॅप्चर करू शकते." "कास्टिंग/रेकॉर्डिंग करत असताना संवेदनशील माहिती उघड करत आहे" "पुन्हा दर्शवू नका" "सर्व साफ करा" "व्यवस्थापित करा" - + - + "व्यत्यय आणून नकाद्वारे सूचना थांबवल्या" "आता सुरू करा" @@ -637,9 +645,11 @@ "ब्लॉक करा" "दाखवणे सुरू ठेवा" "लहान करा" - "नाजूक" + + "सायलंट रहा" - "व्यत्यय आणणारे" + + "सूचना देत रहा" "सूचना बंद करा" "या अ‍ॅपकडील सूचना दाखवणे सुरू ठेवायचे?" @@ -653,10 +663,8 @@ "या सूचनांमध्ये सुधारणा केली जाऊ शकत नाही." "या सूचनांचा संच येथे कॉन्फिगर केला जाऊ शकत नाही" "प्रॉक्सी केलेल्या सूचना" - - - - + "सर्व %1$s वरील सूचना" + "आणखी पाहा" "हे अ‍ॅप कॅमेरा वापरत आहे." "हे अ‍ॅप मायक्रोफोन वापरत आहे." "हे अ‍ॅप स्क्रीनवरील इतर अ‍ॅप्स वर प्रदर्शित होत आहे." @@ -900,7 +908,8 @@ "अनुमती द्या" "नकार द्या" "बॅटरी बचतकर्ता शेड्यूल करण्यासाठी टॅप करा" - "बॅटरी %d%% असताना आपोआप सुरू करा" + + "नाही नको" "बॅटरी बचतकर्ता शेड्यूल सुरू केले आहे" "बॅटरी %d%% पेक्षा खाली गेल्यास बॅटरी सेव्हर आपोआप सुरू होईल." @@ -932,6 +941,5 @@ "वर उजवीकडे हलवा" "तळाशी डावीकडे हलवा" "तळाशी उजवीकडे हलवा" - - + "डिसमिस करा" diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 93b4fccb3029..716c24f7e96b 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -62,9 +62,12 @@ "Penyahpepijatan USB tidak dibenarkan" "Pengguna yang log masuk ke peranti ini pada masa ini tidak boleh menghidupkan penyahpepijatan USB. Untuk menggunakan ciri ini, tukar kepada pengguna utama." "Port USB dilumpuhkan" - "Untuk melindungi peranti anda daripada cecair atau serpihan, port USB dilumpuhkan dan tidak akan mengesan sebarang aksesori.\n\nAnda akan dimaklumi apabila selamat untuk menggunakan port USB lagi." + + "Port USB didayakan untuk mengesan pengecas dan aksesori" "Dayakan USB" + + "Zum untuk memenuhi skrin" "Regang utk memenuhi skrin" "Tangkapan skrin" @@ -118,6 +121,11 @@ "Batal" "Sahkan" "Cuba lagi" + "Kawasan kosong. Ketik untuk membatalkan pengesahan" + "Sila cuba lagi" + "Mencari wajah anda" + "Wajah disahkan" + "Disahkan" "Sentuh penderia cap jari" "Ikon cap jari" "Mencari anda…" @@ -369,8 +377,7 @@ "Dihidupkan pada %s" "Hingga %s" "Tema Gelap" - - + "Tema Gelap\nPenjimat bateri" "NFC" "NFC dilumpuhkan" "NFC didayakan" @@ -445,13 +452,16 @@ "Penjimat Bateri dihidupkan" "Mengurangkan prestasi dan data latar belakang" "Matikan Penjimat Bateri" - "Semasa merakam atau menghantar, %s boleh menangkap sebarang maklumat sensitif, seperti audio yang anda mainkan dan kata laluan, maklumat pembayaran, foto serta mesej anda." + "Semasa merakam atau menghantar, %s boleh menangkap sebarang maklumat sensitif yang dipaparkan pada skrin anda atau dimainkan daripada peranti anda, termasuk maklumat sensitif seperti audio, kata laluan, maklumat pembayaran, foto dan mesej." + "Semasa merakam atau menghantar, perkhidmatan yang menyediakan fungsi ini boleh menangkap sebarang maklumat sensitif yang dipaparkan pada skrin anda atau dimainkan daripada peranti anda, termasuk maklumat sensitif seperti audio, kata laluan, maklumat pembayaran, foto dan mesej." "Mendedahkan maklumat sensitif semasa menghantar/merakam" "Jangan tunjukkan lagi" "Kosongkan semua" "Urus" - "Pemberitahuan lembut" - "Kosongkan semua pemberitahuan lembut" + + + + "Pemberitahuan dijeda oleh Jangan Ganggu" "Mulakan sekarang" "Tiada pemberitahuan" @@ -635,9 +645,11 @@ "Sekat" "Terus tunjukkan" "Minimumkan" - "Lembut" + + "Kekal senyap" - "Mengganggu" + + "Teruskan memberikan makluman" "Matikan pemberitahuan" "Terus tunjukkan pemberitahuan daripada apl ini?" @@ -651,10 +663,8 @@ "Pemberitahuan ini tidak boleh diubah suai." "Kumpulan pemberitahuan ini tidak boleh dikonfigurasikan di sini" "Pemberitahuan berproksi" - - - - + "Semua pemberitahuan %1$s" + "Lihat lagi" "Apl ini sedang menggunakan kamera." "Apl ini sedang menggunakan mikrofon." "Apl ini dipaparkan di atas apl lain pada skrin anda." @@ -898,7 +908,8 @@ "Benarkan" "Tolak" "Ketik untuk menjadualkan Penjimat Bateri" - "Hidupkan secara automatik apabila kuasa bateri adalah pada %d%%" + + "Tidak perlu" "Jadual Penjimat Bateri dihidupkan" "Penjimat Bateri akan dihidupkan secara automatik setelah kuasa bateri kurang daripada %d%%." @@ -930,6 +941,5 @@ "Alihkan ke atas sebelah kanan" "Alihkan ke bawah sebelah kiri" "Alihkan ke bawah sebelah kanan" - - + "Ketepikan" diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index f058f92b00b8..ef095b35dd11 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -62,9 +62,10 @@ "USB အမှားပြင်ဆင်ခြင်း ခွင့်မပြုပါ" "ဤစက်ပစ္စည်းသို့ လက်ရှိဝင်ရောက်ထားသည့် အသုံးပြုသူသည် USB အမှားပြင်ဆင်ခြင်းကို ဖွင့်၍မရပါ။ ဤဝန်ဆောင်မှုကို အသုံးပြုရန် အဓိကအသုံးပြုသူအဖြစ်သို့ ပြောင်းပါ။" "USB ပို့တ် ပိတ်ပြီးပြီ" - "USB ပို့တ်ကို ပိတ်၍ သင့်ကိရိယာသို့ အရည် သို့မဟုတ် အမှိုက်စများ မဝင်စေရန် ကာကွယ်ပါ၊ မည်သည့် အပိုပစ္စည်းကိုမျှ အာရုံခံသိရှိနိုင်တော့မည် မဟုတ်ပါ။\n\nUSB ပို့တ်ကို ပြန်အသုံးပြုနိုင်သည့်အခါ သင့်ကိုအကြောင်းကြားပါမည်။" + "USB ပို့တ်ကို ပိတ်၍ သင့်ကိရိယာသို့ အရည် သို့မဟုတ် အမှိုက်စများ မဝင်စေရန် ကာကွယ်ပါ၊ မည်သည့် အပိုပစ္စည်းကိုမျှ အာရုံခံသိရှိနိုင်တော့မည် မဟုတ်ပါ။\n\nUSB ပို့တ်ကို ပြန်အသုံးပြုနိုင်သည့်အခါ သင့်ကိုအကြောင်းကြားပါမည်။" "အားသွင်းကိရိယာနှင့် ဆက်စပ်ပစ္စည်းများ သိရှိရန် USB ပို့တ် ဖွင့်ထားသည်" "USB ကို ဖွင့်ရန်" + "ပိုမိုလေ့လာရန်" "ဇူးမ်အပြည့်ဆွဲခြင်း" "ဖန်သားပြင်အပြည့်ဆန့်ခြင်း" "ဖန်သားပြင်ဓာတ်ပုံ" @@ -118,6 +119,11 @@ "မလုပ်တော့" "အတည်ပြုပါ" "ထပ်စမ်းကြည့်ရန်" + "နေရာလွတ်၊ အထောက်အထားစိစစ်ခြင်းကို မလုပ်တော့ရန် တို့ပါ" + "ထပ်စမ်းကြည့်ပါ" + "သင့်မျက်နှာကို ရှာနေသည်" + "မျက်နှာ အထောက်အထားစိစစ်ပြီးပြီ" + "အတည်ပြုပြီးပြီ" "လက်ဗွေအာရုံခံကိရိယာကို တို့ပါ" "လက်ဗွေ သင်္ကေတ" "သင့်ကို ရှာဖွေနေသည်…" @@ -310,7 +316,7 @@ "မျက်နှာပြင်အား အလိုအလျောက်လှည့်ခြင်း" "%s မုဒ်" "လည်မှု သော့ပိတ်ထား" - "ထောင်လိုက်" + "ဒေါင်လိုက်" "ဘေးတိုက်" "ထည့်သွင်းရန်နည်းလမ်း" "တည်နေရာ" @@ -369,8 +375,7 @@ "%s တွင် ဖွင့်ရန်" "%s အထိ" "မှောင်သည့် အပြင်အဆင်" - - + "မှောင်သည့် အပြင်အဆင်\nဘက်ထရီ အားထိန်း" "NFC" "NFC ကို ပိတ်ထားသည်" "NFC ကို ဖွင့်ထားသည်" @@ -445,13 +450,14 @@ "ဘက်ထရီ အားထိန်းကို ဖွင့်ထားခြင်း" "လုပ်ကိုင်မှုကို လျှော့ချလျက် နောက်ခံ ဒေတာကို ကန့်သတ်သည်" "ဘက်ထရီ အားထိန်းကို ပိတ်ရန်" - "အသံဖမ်းနေစဉ် (သို့) ကာစ်လုပ်နေစဉ် သင်ဖွင့်သည့် အသံ၊ သင့်စကားဝှက်၊ ငွေပေးချေမှုဆိုင်ရာ အချက်အလက်၊ ဓာတ်ပုံနှင့် မက်ဆေ့ဂျ်များကဲ့သို့ အရေးကြီးသော အချက်အလက်များကို %s က ဖမ်းယူနိုင်ပါသည်။" + "အသံဖမ်းနေစဉ် (သို့) ကာစ်လုပ်နေစဉ် %s သည် အသံ၊ စကားဝှက်၊ ငွေပေးချေမှုဆိုင်ရာ အချက်အလက်၊ ဓာတ်ပုံနှင့် မက်ဆေ့ဂျ်များကဲ့သို့ အရေးကြီးသည့် အချက်အလက်များအပါအဝင် သင့်မျက်နှာပြင်တွင် ပြသထားသော (သို့) သင့်စက်တွင် ဖွင့်ထားသော အရေးကြီးသည့် အချက်အလက်မှန်သမျှကို ဖမ်းယူနိုင်ပါသည်။" + "အသံဖမ်းနေစဉ် (သို့) ကာစ်လုပ်နေစဉ် ဤလုပ်ဆောင်ချက်ကို ပေးအပ်သည့် ဝန်ဆောင်မှုသည် အသံ၊ စကားဝှက်၊ ငွေပေးချေမှုဆိုင်ရာ အချက်အလက်၊ ဓာတ်ပုံနှင့် မက်ဆေ့ဂျ်များကဲ့သို့ အရေးကြီးသည့် အချက်အလက်များအပါအဝင် သင့်မျက်နှာပြင်တွင် ပြသထားသော (သို့) သင့်စက်တွင် ဖွင့်ထားသော အရေးကြီးသည့် အချက်အလက်မှန်သမျှကို ဖမ်းယူနိုင်ပါသည်။" "ကာစ်လုပ်နေစဉ်/အသံဖမ်းနေစဉ် အရေးကြီးသောအချက်အလက်များ ထုတ်ဖော်မိခြင်း" "နောက်ထပ် မပြပါနှင့်" "အားလုံး ဖယ်ရှားရန်" "စီမံရန်" - "မသိမသာ အကြောင်းကြားချက်များ" - "မသိမသာ အကြောင်းကြားချက်အားလုံး ရှင်းပါ" + "အကြောင်းကြားချက်များကို အသံတိတ်ခြင်း" + "အသံတိတ် အကြောင်းကြားချက်များအားလုံးကို ရှင်းလင်းရန်" "အကြောင်းကြားချက်များကို \'မနှောင့်ယှက်ရ\' က ခေတ္တရပ်ထားသည်" "ယခု စတင်ပါ" "အကြောင်းကြားချက်များ မရှိ" @@ -635,9 +641,9 @@ "ပိတ်ထားရန်" "ဆက်ပြရန်" "ချုံ့ရန်" - "ညင်သာသည်" + "အသံတိတ်ရန်" "ဆက်လက် အသံတိတ်ရန်" - "ကြားဖြတ်နိုင်သည်" + "သတိပေးခြင်း" "ဆက်လက် သတိပေးရန်" "အကြောင်းကြားချက်များ ပိတ်ရန်" "ဤအက်ပ်ထံမှ အကြောင်းကြားချက်များကို ဆက်ပြလိုပါသလား။" @@ -647,14 +653,12 @@ "ဦးစားပေးအကြောင်းကြားချက်များ၏ အောက်တွင်ဖော်ပြသည်။ အမြဲ အသံတိတ်ရန်။" "ဦးစားပေးအကြောင်းကြားချက်များ၏ အောက်တွင်ဖော်ပြသည်။ အမြဲ အသံတိတ်ရန်။" "ဦးစားပေးအကြောင်းကြားချက်များ၏ အောက်တွင်ဖော်ပြသည်။ အမြဲ အသံတိတ်ရန်။" - "အသံအပါအဝင် အ‌ခြေနေပြနေရာ သင်္ကေတဖြင့် သင်သတိထားမိအောင် ပြုလုပ်သည်။ လော့ခ်ချထားချိန် မျက်နှာပြင်တွင် ပြရန်။" + "အသံ၊ အခြေအနေပြဘား သင်္ကေတတို့ဖြင့် သတိပေးသည်။ လော့ခ်ချထားချိန်မျက်နှာပြင်တွင် ပြသည်။" "ဤအကြောင်းကြားချက်များကို ပြုပြင်၍ မရပါ။" "ဤအကြောင်းကြားချက်အုပ်စုကို ဤနေရာတွင် စီစဉ်သတ်မှတ်၍ မရပါ" "ပရောက်စီထည့်ထားသော အကြောင်းကြားချက်" - - - - + "%1$s အကြောင်းကြားချက်များ အားလုံး" + "ပိုပြရန်" "ဤအက်ပ်က ကင်မရာကို အသုံးပြုနေသည်။" "ဤအက်ပ်က မိုက်ခရိုဖုန်းကို အသုံးပြုနေသည်။" "ဤအက်ပ်က ဖန်သားမျက်နှာပြင်ပေါ်ရှိ အခြားအက်ပ်များ အပေါ်မှ ထပ်ပြီး ပြသနေပါသည်။" @@ -755,7 +759,7 @@ "ကလစ်ဘုတ်" "ကီးကုဒ်" "လှည့်ခြင်းကို အတည်ပြုရန်၊ ကီးဘုတ်ပြောင်း ကိရိယာ" - "တစ်ခုမျှမရှိ" + "မရှိ" "ပုံမှန်" @@ -851,7 +855,7 @@ "လက်ယာ ဖြတ်လမ်းလင့်ခ်" "လက်ဝဲ ဖြတ်လမ်းလင့်ခ်ဖြင့်လည်း လော့ခ်ဖွင့်ရန်" "လက်ယာ ဖြတ်လမ်းလင့်ခ်ဖြင့်လည်း လော့ခ်ဖွင့်ရန်" - "တစ်ခုမျှမရှိ" + "မရှိ" "%1$s ကို ဖွင့်ပါ" "အခြားအက်ပ်များ" "စက်ဝိုင်း" @@ -898,7 +902,7 @@ "ခွင့်ပြုရန်" "ငြင်းပယ်ရန်" "\'ဘက်ထရီ အားထိန်း\' အချိန်သတ်မှတ်ရန် အတွက် တို့ပါ" - "ဘက်ထရီ %d%% ရောက်သည့်အခါ အလိုအလျောက် ဖွင့်ပါ" + "ဘက်ထရီကုန်ခါနီးတွင် ဖွင့်ပါ" "မလိုပါ" "\'ဘက်ထရီ အားထိန်း\' အစီအစဉ် ဖွင့်ထားသည်" "ဘက်ထရီ %d%% အောက် ရောက်သွားသည်နှင့် \'ဘက်ထရီ အားထိန်း\' အလိုအလျောက် ဖွင့်ပါမည်။" @@ -930,6 +934,5 @@ "ညာဘက်ထိပ်သို့ ရွှေ့ပါ" "ဘယ်အောက်ခြေသို့ ရွှေ့ရန်" "ညာအောက်ခြေသို့ ရွှေ့ပါ" - - + "ပယ်ရန်" diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index aaff2fa8e9ee..70c0bb20eeba 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -62,9 +62,12 @@ "USB-feilsøking er ikke tillatt" "Brukeren som for øyeblikket er logget på denne enheten, kan ikke slå på USB-feilsøking. For å bruke denne funksjonen, bytt til hovedbrukeren." "USB-porten er deaktivert" - "For å beskytte enheten din mot væsker eller rusk er USB-porten deaktivert og kan ikke oppdage tilbehør.\n\nDu blir varslet når det er trygt å bruke USB-porten igjen." + + "Registrering av ladere og tilbehør er slått på for USB-porten" "Slå på USB" + + "Zoom for å fylle skjermen" "Strekk for å fylle skjerm" "Skjermdump" @@ -118,6 +121,11 @@ "Avbryt" "Bekreft" "Prøv på nytt" + "Tomt område – trykk for å avbryte autentisering" + "Prøv igjen" + "Ser etter ansiktet ditt" + "Ansiktet er autentisert" + "Bekreftet" "Trykk på fingeravtrykkssensoren" "Ikon for fingeravtrykk" "Ser etter deg …" @@ -369,8 +377,7 @@ "På kl. %s" "Til %s" "Mørkt tema" - - + "Mørkt tema\nBatterisparing" "NFC" "NFC er slått av" "NFC er slått på" @@ -445,13 +452,16 @@ "Batterisparing er på" "Reduserer ytelsen og begrenser bakgrunnsdataene" "Slå av batterisparing" - "Under opptak eller casting kan %s registrere all sensitiv informasjon, for eksempel lyd du spiller av, og passord, betaingsinformasjon, bilder og meldinger." - "Avdekke sensitiv informasjon under casting/opptak" + "Under opptak eller casting kan %s registrere all sensitiv informasjon som vises på skjermen eller spilles av fra enheten, for eksempel lyd, passord, betalingsinformasjon, bilder og meldinger." + "Under opptak eller casting kan tjenesten som leverer denne funksjonen, registrere all sensitiv informasjon som vises på skjermen eller spilles av fra enheten, for eksempel lyd, passord, betalingsinformasjon, bilder og meldinger." + "Avdekking av sensitiv informasjon under casting/opptak" "Ikke vis igjen" "Fjern alt" "Administrer" - "Diskré varsler" - "Fjern alle diskré varsler" + + + + "Varsler er satt på pause av «Ikke forstyrr»" "Start nå" "Ingen varsler" @@ -635,9 +645,11 @@ "Blokkér" "Fortsett å vise" "Minimer" - "Forsiktig" + + "Forbli lydløs" - "Forstyrrende" + + "Fortsett å varsle" "Slå av varsler" "Vil du fortsette å vise varsler fra denne appen?" @@ -651,10 +663,8 @@ "Disse varslene kan ikke endres." "Denne varselgruppen kan ikke konfigureres her" "Omdirigert varsel" - - - - + "Alle %1$s-varsler" + "Se mer" "Denne appen bruker kameraet." "Denne appen bruker mikrofonen." "Denne appen vises over andre apper på skjermen." @@ -898,7 +908,8 @@ "Tillat" "Avvis" "Trykk for å planlegge batterisparing" - "Slå på automatisk når batteriet er på %d %%" + + "Nei takk" "Tidsplan for batterisparing er slått på" "Batterisparing slås på automatisk når batteriet er lavere enn %d %%." @@ -930,6 +941,5 @@ "Flytt til øverst til høyre" "Flytt til nederst til venstre" "Flytt til nederst til høyre" - - + "Avvis" diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 5807b9dae6ed..84989eefb3b3 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -62,9 +62,12 @@ "USB डिबग गर्न अनुमति छैन" "हाल यस यन्त्रमा साइन इन हुनुभएको प्रयोगकर्ताले USB डिबग सक्रिय गर्न सक्नुहुन्न। यो सुविधाको प्रयोग गर्न प्राथमिक प्रयोगकर्तामा बदल्नुहोस्‌।" "USB पोर्ट असक्षम पारियो" - "तपाईंको यन्त्रलाई तरल पदार्थ वा धुलोबाट जोगाउन यसको USB पोर्ट असक्षम पारिएको छ र यसले कुनै पनि सहायक उपकरणहरू पहिचान गर्ने छैन।\n\nउक्त USB पोर्ट प्रयोग गर्न सुरक्षित हुँदा तपाईंलाई यसबारे सूचित गरिने छ।" + + "चार्जर तथा सामानहरू पत्ता लगाउन सक्षम पारिएको USB पोर्ट" "USB सक्षम पार्नुहोस्" + + "स्क्रिन भर्न जुम गर्नुहोस्" "स्क्रिन भर्न तन्काउनुहोस्" "स्क्रिनसट" @@ -118,6 +121,11 @@ "रद्द गर्नुहोस्" "पुष्टि गर्नुहोस्" "फेरि प्रयास गर्नुहोस्" + "खाली क्षेत्र, प्रमाणीकरण रद्द गर्न ट्याप गर्नुहोस्" + "कृपया फेरि प्रयास गर्नुहोस्" + "तपाईंको अनुहार खोज्दै" + "अनुहार प्रमाणीकरण गरियो" + "पुष्टि भयो" "फिंगरप्रिन्ट सेन्सरमा छुनुहोस्‌" "फिंगरप्रिन्ट जनाउने आइकन" "तपाईंलाई खोज्दै…" @@ -369,8 +377,7 @@ "%s मा सक्रिय" "%s सम्म" "अँध्यारो विषयवस्तु" - - + "अँध्यारो विषयवस्तु\nब्याट्री सेभर" "NFC" "NFC लाई असक्षम पारिएको छ" "NFC लाई सक्षम पारिएको छ" @@ -445,13 +452,16 @@ "ब्याट्री सेभर सक्रिय छ" "प्रदर्शन र पृष्ठभूमि डेटा घटाउँनुहोस्" "ब्याट्री सेभर निष्क्रिय पार्नुहोस्" - "रेकर्ड गर्दा वा कास्ट गर्दा %s ले तपाईंले प्ले गर्ने अडियो र तपाईंका पासवर्डहरू, भुक्तानीसम्बन्धी जानकारी, तस्बिर र सन्देशहरू जस्ता जुनसुकै संवेदनशील जानकारी समावेश गर्न सक्छ।" + "रेकर्ड वा casting गर्दा %s ले पासवर्ड, भुक्तानीसम्बन्धी जानकारी, तस्बिर तथा सन्देशहरू जस्ता संवेदनशील जानकारीलगायत तपाईंको स्क्रिनमा देखाइएको सबै संवेदनशील जानकारी वा तपाईंको यन्त्रबाट प्ले गरिएको सबै कुरा लिन सक्छ।" + "रेकर्ड वा casting गर्दा यो सुविधा प्रदान गर्ने सेवा प्रदायकले पासवर्ड, भुक्तानीसम्बन्धी जानकारी, तस्बिर तथा सन्देशहरू जस्ता संवेदनशील जानकारीलगायत तपाईंको स्क्रिनमा देखाइएको सबै संवेदनशील जानकारी वा तपाईंको यन्त्रबाट प्ले गरिएको सबै कुरा लिन सक्छ।" "कास्टिङ/रेकर्डिङका क्रममा संवेदनशील जानकारी देखाइँदै" "फेरि नदेखाउनुहोस्" "सबै हटाउनुहोस्" "व्यवस्थित गर्नुहोस्" - "सामान्य सूचनाहरू" - "सबै सामान्य सूचनाहरू खाली गर्नुहोस्" + + + + "बाधा नपुऱ्याउनुहोस् नामक मोडमार्फत पज पारिएका सूचनाहरू" "अहिले सुरु गर्नुहोस्" "कुनै सूचनाहरू छैनन्" @@ -635,9 +645,11 @@ "रोक लगाउनुहोस्" "देखाउने क्रम जारी राख्नुहोस्" "सानो बनाउनुहोस्" - "हलुका" + + "मौन रहनुहोस्" - "बाधा पुर्याइरहने" + + "सर्तक गराइरहनुहोस्" "सूचनाहरू निष्क्रिय पार्नुहोस्" "यो अनुप्रयोगका सूचनाहरू देखाउने क्रम जारी राख्ने हो?" @@ -651,10 +663,8 @@ "यी सूचनाहरू परिमार्जन गर्न मिल्दैन।" "यहाँबाट सूचनाहरूको यो समूह कन्फिगर गर्न सकिँदैन" "प्रोक्सीमार्फत आउने सूचना" - - - - + "%1$s सम्बन्धी सबै सूचनाहरू" + "थप हेर्नुहोस्" "यो अनुप्रयोगले क्यामेराको प्रयोग गर्दै छ।" "यो अनुप्रयोगले माइक्रोफोनको प्रयोग गर्दै छ।" "यो अनुप्रयोगले तपाईंको स्क्रिनका अन्य अनुप्रयोगहरूमाथि प्रदर्शन गर्दै छ।" @@ -675,7 +685,7 @@ "सूचना सम्बन्धी नियन्त्रणहरू" "सूचना स्नुज गर्ने विकल्पहरू" "स्नुज गर्नुहोस्" - "अनडू गर्नुहोस्" + "अन्डू गर्नुहोस्" "%1$s का लागि स्नुज गरियो" %d घन्टा @@ -898,7 +908,8 @@ "अनुमति दिनुहोस्" "अस्वीकार गर्नु…" "ब्याट्री सेभरको समयतालिका बनाउन ट्याप गर्नुहोस्" - "ब्याट्री %d%% भएको बेला ब्याट्री सेभर स्वतः सक्रिय गर्नुहोस्‌" + + "पर्दैन धन्यवाद" "ब्याट्री सेभरको समयतालिका सक्रिय गरियो" "ब्याट्री %d%% भन्दा कम भएको बेला ब्याट्री सेभर स्वतः सक्रिय हुने छ।" @@ -930,6 +941,5 @@ "सिरानमा दायाँतिर सार्नुहोस्" "पुछारमा बायाँतिर सार्नुहोस्" "पुछारमा दायाँतिर सार्नुहोस्" - - + "हटाउनुहोस्" diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 2538f52451ea..26e484545a5c 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -62,9 +62,12 @@ "USB-foutopsporing niet toegestaan" "De gebruiker die momenteel is ingelogd op dit apparaat, kan USB-foutopsporing niet inschakelen. Als je deze functie wilt gebruiken, schakel je naar de primaire gebruiker." "USB-poort uitgeschakeld" - "De USB-poort is uitgeschakeld en detecteert geen accessoires, zodat je apparaat wordt beschermd tegen vloeistof en vuil.\n\nJe ontvangt een melding wanneer het weer veilig is om de USB-poort te gebruiken." + + "USB-poort kan opladers en accessoires detecteren" "USB inschakelen" + + "Zoom om scherm te vullen" "Rek uit v. schermvulling" "Screenshot" @@ -118,6 +121,11 @@ "Annuleren" "Bevestigen" "Opnieuw proberen" + "Leeg gebied. Tik om de verificatie te annuleren." + "Probeer het opnieuw" + "Er wordt naar je gezicht gezocht" + "Gezicht geverifieerd" + "Bevestigd" "Raak de vingerafdruksensor aan" "Vingerafdrukpictogram" "Jouw gezicht zoeken…" @@ -369,8 +377,7 @@ "Aan om %s" "Tot %s" "Donker thema" - - + "Donker thema\nBatterijbesparing" "NFC" "NFC is uitgeschakeld" "NFC is ingeschakeld" @@ -445,13 +452,16 @@ "Batterijbesparing aan" "Vermindert de prestaties en achtergrondgegevens" "Batterijbesparing uitschakelen" - "Tijdens het opnemen of casten kan %s gevoelige informatie opvangen, zoals audio die je afspeelt of je wachtwoorden, betalingsgegevens, foto\'s en berichten." + "Tijdens het opnemen of casten kan %s gevoelige informatie opvangen die op je scherm wordt weergegeven of op je apparaat wordt afgespeeld, waaronder gevoelige informatie zoals audio, wachtwoorden, betalingsgegevens, foto\'s en berichten." + "Tijdens het opnemen of casten kan de service die deze functie levert gevoelige informatie opvangen die op je scherm wordt weergegeven of op je apparaat wordt afgespeeld, waaronder gevoelige informatie zoals audio, wachtwoorden, betalingsgegevens, foto\'s en berichten." "Gevoelige informatie vrijgeven tijdens casten/opnemen" "Niet opnieuw weergeven" "Alles wissen" "Beheren" - "Vriendelijke meldingen" - "Alle vriendelijke meldingen wissen" + + + + "Meldingen onderbroken door \'Niet storen\'" "Nu starten" "Geen meldingen" @@ -635,9 +645,11 @@ "Blokkeren" "Blijven weergeven" "Minimaliseren" - "Rustige modus" + + "Stil blijven" - "Onderbrekende modus" + + "Blijven waarschuwen" "Meldingen uitschakelen" "Meldingen van deze app blijven weergeven?" @@ -651,10 +663,8 @@ "Deze meldingen kunnen niet worden aangepast." "Deze groep meldingen kan hier niet worden geconfigureerd" "Melding via proxy" - - - - + "Alle meldingen van %1$s" + "Meer weergeven" "Deze app gebruikt de camera." "Deze app gebruikt de microfoon." "Deze app wordt over andere apps op je scherm heen weergegeven." @@ -898,7 +908,8 @@ "Toestaan" "Weigeren" "Tikken om Batterijbesparing in te schakelen" - "Automatisch inschakelen wanneer de batterijstatus %d%% is" + + "Nee" "Batterijbesparing is ingeschakeld" "Batterijbesparing wordt automatisch ingeschakeld wanneer de batterijstatus lager is dan %d%%." @@ -930,6 +941,5 @@ "Naar rechtsboven verplaatsen" "Naar linksonder verplaatsen" "Naar rechtsonder verplaatsen" - - + "Sluiten" diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 39714cf70d74..1de3ea35c539 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -62,9 +62,12 @@ "USBରେ ଡିବଗ୍‍ କରାଯାଇପାରିବ ନାହିଁ" "ସମ୍ପ୍ରତି ସାଇନ୍‍-ଇନ୍‍ କରିଥିବା ୟୁଜର୍‍ ଜଣକ ଏହି ଡିଭାଇସରେ USB ଡିବଗିଙ୍ଗ ଅନ୍‍ କରିପାରିବେ ନାହିଁ। ଏହି ବୈଶିଷ୍ଟ୍ୟ ବ୍ୟବହାର କରିବାକୁ, ପ୍ରାଥମିକ ୟୁଜର୍‍ରେ ସାଇନ୍‍-ଇନ୍‍ କରନ୍ତୁ।" "USB ପୋର୍ଟକୁ ଅକ୍ଷମ କରାଯାଇଛି" - "ଆପଣଙ୍କ ଡିଭାଇସ୍‌କୁ ତରଳ ପଦାର୍ଥ ଏବଂ ଧୂଳିରୁ ସୁରକ୍ଷିତ ରଖିବା ପାଇଁ, USB ପୋର୍ଟକୁ ଅକ୍ଷମ କରାଯାଇଛି ଏବଂ ଏହା କୌଣସି ଉପକରଣ ଚିହ୍ନଟ କରିବ ନାହିଁ। \n\nUSB ପୋର୍ଟକୁ ପୁଣିି ବ୍ୟବହାର କରିବାକୁ ସୁରକ୍ଷିତ ହେଲେ ଆପଣଙ୍କୁ ସୂଚିତ କରାଯିବ।" + + "ଚାର୍ଜର୍‍ ଏବଂ ଆକ୍ସେସରିଗୁଡ଼ିକୁ ଚିହ୍ନଟ କରିବାକୁ USB ପୋର୍ଟ ସକ୍ଷମ କରାଯାଇଛି" "USB ସକ୍ଷମ କରନ୍ତୁ" + + "ସ୍କ୍ରୀନ ଭରିବା ପାଇଁ ଜୁମ୍ କରନ୍ତୁ" "ସ୍କ୍ରୀନ୍‌କୁ ଭରିବା ପାଇଁ ଟାଣନ୍ତୁ" "ସ୍କ୍ରୀନଶଟ୍‌" @@ -101,7 +104,7 @@ "ମେନୁ" "ଆକ୍ସେସିବିଲିଟୀ" "ସ୍କ୍ରୀନ୍‌କୁ ଘୁରାନ୍ତୁ" - "ସଂକ୍ଷିପ୍ତ ବିବରଣୀ" + "ଓଭରଭିଉ" "ସର୍ଚ୍ଚ କରନ୍ତୁ" "କ୍ୟାମେରା" "ଫୋନ୍‍" @@ -118,6 +121,11 @@ "କ୍ୟାନ୍ସଲ୍‍ କରନ୍ତୁ" "ନିଶ୍ଚିତ କରନ୍ତୁ" "ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ" + "ଖାଲି ଅଞ୍ଚଳ, ପ୍ରାମାଣିକତା ବାତିଲ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ" + "ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ" + "ଆପଣଙ୍କର ମୁହଁକୁ ପ୍ରମାଣ କରୁଛି" + "ମୁହଁ ପ୍ରାମାଣିକତା ହୋଇଛି" + "ସୁନିଶ୍ଚିତ କରାଯାଇଛି" "ଟିପଚିହ୍ନ ସେନସର୍‌କୁ ଛୁଅଁନ୍ତୁ" "ଆଙ୍ଗୁଠି ଚିହ୍ନ ଆଇକନ୍" "ଆପଣଙ୍କୁ ଚିହ୍ନଟ କରୁଛି…" @@ -369,8 +377,7 @@ "%sରେ ଅନ୍ ହେବ" "%s ପର୍ଯ୍ୟନ୍ତ" "ଗାଢ଼ା ଥିମ୍" - - + "ଗାଢ଼ା ଥିମ୍‍\nବ୍ୟାଟେରୀ ସେଭର୍" "NFC" "NFC ଅକ୍ଷମ କରାଯାଇଛି" "NFC ସକ୍ଷମ କରାଯାଇଛି" @@ -445,14 +452,15 @@ "ବ୍ୟାଟେରୀ ସେଭର୍‌ ଅନ୍‌ ଅଛି" "କାର୍ଯ୍ୟ ସମ୍ପାଦନ ଓ ବ୍ୟାକ୍‌ଗ୍ରାଉଣ୍ଡ ଡାଟା କମ୍ କରନ୍ତୁ" "ବ୍ୟାଟେରୀ ସେଭର୍‌ ଅଫ୍‍ କରନ୍ତୁ" - "ରେକର୍ଡ କିମ୍ବା କାଷ୍ଟ କରିବା ସମୟରେ, %s ଯେକୌଣସି ସମ୍ବେଦନଶୀଳ ସୂଚନା ଯେପରିକି ଆପଣଙ୍କ ଦ୍ବାରା ଚଲାଯାଇଥିବା ଅଡିଓ, ଏବଂ ଆପଣଙ୍କର ପାସ୍‌ୱାର୍ଡଗୁଡ଼ିକ, ପେମେଣ୍ଟ ସୂଚନା, ଫଟୋ ଏବଂ ମେସେଜ୍‌ଗୁଡ଼ିକୁ କ୍ୟାପଚର୍ କରିପାରିବ।" - "କାଷ୍ଟିଂ/ରେକର୍ଡିଂ ସମୟରେ ସମ୍ବେଦନଶୀଳତା ଦେଖାନ୍ତୁ" + "ରେକର୍ଡିଂ କିମ୍ବା କାଷ୍ଟିଂ ସମୟରେ %s ଯେ କୌଣସି ସମ୍ବେଦନଶୀଳ ସୂଚନା କ୍ୟାପଚର୍ କରିପାରିବ ଯାହା ଅଡ଼ିଓ, ପାସ୍‌ୱାର୍ଡ, ପେମେଣ୍ଟ ସୂଚନା, ଫଟୋ ଏବଂ ମେସେଜ୍‌ଗୁଡ଼ିକ ପରି ସମ୍ବେଦନଶୀଳ ସୂଚନା ଆପଣଙ୍କର ଡିଭାଇସ୍‌ରେ ଚାଲିବ ବା ଆପଣଙ୍କ ସ୍କ୍ରିନ୍‌ରେ ଦେଖାଯିବ।" + "ରେକର୍ଡିଂ କିମ୍ବା କାଷ୍ଟିଂ ସମୟରେ ସେବା ପ୍ରଦାନ କରୁଥିବା ଏହି ଫଙ୍କ୍‌ସନ୍ ଯେ କୌଣସି ସମ୍ବେଦନଶୀଳ ସୂଚନା କ୍ୟାପଚର୍ କରିପାରିବ ଯାହା ଅଡ଼ିଓ, ପାସ୍‌ୱାର୍ଡ, ପେମେଣ୍ଟ ସୂଚନା, ଫଟୋ ଏବଂ ମେସେଜ୍‌ଗୁଡ଼ିକ ପରି ସମ୍ବେଦନଶୀଳ ସୂଚନା ଆପଣଙ୍କର ଡିଭାଇସ୍‌ରେ ଚାଲିବ ବା ଆପଣଙ୍କ ସ୍କ୍ରିନ୍‌ରେ ଦେଖାଯିବ।" + "କାଷ୍ଟିଂ/ରେକର୍ଡିଂ ସମୟରେ ସମ୍ବେଦନଶୀଳ ସୂଚନା ଦେଖାନ୍ତୁ" "ପୁଣି ଦେଖାନ୍ତୁ ନାହିଁ" "ସମସ୍ତ ଖାଲି କରନ୍ତୁ" "ପରିଚାଳନା କରନ୍ତୁ" - + - + "\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ବିକଳ୍ପ ଦ୍ୱାରା ବିଜ୍ଞପ୍ତି ପଜ୍‍ ହୋଇଛି" "ବର୍ତ୍ତମାନ ଆରମ୍ଭ କରନ୍ତୁ" @@ -580,7 +588,7 @@ "ସିଷ୍ଟମ୍ UI ଟ୍ୟୁନର୍‍" "ଏମ୍ବେଡ୍‍ ହୋଇଥିବା ବ୍ୟାଟେରୀ ଶତକଡ଼ା ଦେଖାନ୍ତୁ" "ଚାର୍ଜ ହେଉନଥିବାବେଳେ ଷ୍ଟାଟସ୍‍ ବାର୍‍ ଆଇକନ୍‍ ଭିତରେ ବ୍ୟାଟେରୀ ସ୍ତର ଶତକଡ଼ା ଦେଖାନ୍ତୁ" - "ଦ୍ରୁତ ସେଟିଙ୍ଗ" + "ଦ୍ରୁତ ସେଟିଂସ୍" "ଷ୍ଟାଟସ୍‍ ବାର୍‍" "ଅବଲୋକନ" "ସିଷ୍ଟମ୍‌ UI ଡେମୋ ମୋଡ୍‌" @@ -637,9 +645,11 @@ "ବ୍ଲକ୍ କରନ୍ତୁ" "ଦେଖାଇବା ଜାରି ରଖନ୍ତୁ" "ଛୋଟ କରନ୍ତୁ" - "ମୃଦୁ" + + "ନୀରବ ରହନ୍ତୁ" - "ପ୍ରତିବନ୍ଧକ" + + "ଆଲର୍ଟ କରିବା ଜାରି ରଖନ୍ତୁ" "ବିଜ୍ଞପ୍ତି ବନ୍ଦ କରନ୍ତୁ" "ଏହି ଆପ୍‌ରୁ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାଇବା ଜାରି ରଖିବେ?" @@ -653,10 +663,8 @@ "ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ କରିହେବ ନାହିଁ।" "ଏଠାରେ ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ଗ୍ରୁପ୍ କନଫ୍ୟୁଗର୍ କରାଯାଇପାରିବ ନାହିଁ" "ବିଜ୍ଞପ୍ତି ପ୍ରକ୍ସୀ ହୋଇଛି" - - - - + "ସମସ୍ତ %1$sବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ" + "ଅଧିକ ଦେଖନ୍ତୁ" "ଏହି ଆପ୍ କ୍ୟାମେରା ବ୍ୟବହାର କରୁଛି।" "ଏହି ଆପ୍, ମାଇକ୍ରୋଫୋନ୍‍ ବ୍ୟବହାର କରୁଛି।" "ଏହି ଆପ୍, ଆପଣଙ୍କର ସ୍କ୍ରୀନ୍ ଉପରେ ଥିବା ଅନ୍ୟ ଆପ୍ ଉପରେ ପ୍ରଦର୍ଶିତ ହେଉଛି।" @@ -900,7 +908,8 @@ "ଅନୁମତି ଦିଅନ୍ତୁ" "ଅସ୍ଵୀକାର କରନ୍ତୁ" "ବ୍ୟାଟେରୀ ସେଭର୍‌ ଅନ୍‌ ହେବାର ସମୟ ସେଟ୍‌ କରିବାକୁ ଟାପ୍‌ କରନ୍ତୁ" - "ବ୍ୟାଟେରୀ %d%%ରୁ କମ୍‌ ହେଲେ ଆପେ ଅନ୍‌ ହୋଇଯିବ" + + "ନାହିଁ, ଥାଉ" "ଆଗରୁ ସେଟ୍‌ କରିଥିବା ସମୟ ଅନୁସାରେ ବ୍ୟାଟେରୀ ସେଭର୍‌ ଅନ୍‌ ହୋଇଛି" "ଚାର୍ଜ %d%%ରୁ କମ୍‌ ହେଲେ ବ୍ୟାଟେରୀ ସେଭର୍‌ ଆପେ ଅନ୍‌ ହୋଇଯିବ।" @@ -932,6 +941,5 @@ "ଉପର-ଡାହାଣକୁ ନିଅନ୍ତୁ" "ତଳ ବାମକୁ ନିଅନ୍ତୁ" "ତଳ ଡାହାଣକୁ ନିଅନ୍ତୁ" - - + "ଖାରଜ କରନ୍ତୁ" diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index fcabbaf019b0..bb8bfb0f5784 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -62,9 +62,12 @@ "USB ਡਿਬੱਗਿੰਗ ਦੀ ਆਗਿਆ ਨਹੀਂ" "The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user." "USB ਪੋਰਟ ਬੰਦ ਕੀਤਾ ਗਿਆ" - "ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨੂੰ ਪਾਣੀ ਅਤੇ ਧੂੜ-ਮਿੱਟੀ ਤੋਂ ਬਚਾਉਣ ਲਈ, USB ਪੋਰਟ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ ਅਤੇ ਕੋਈ ਵੀ ਐਕਸੈਸਰੀ ਪਛਾਣੀ ਨਹੀਂ ਜਾਵੇਗੀ।\n\nUSB ਪੋਰਟ ਨੂੰ ਦੁਬਾਰਾ ਵਰਤਣਾ ਸੁਰੱਖਿਅਤ ਹੋਣ \'ਤੇ ਤੁਹਾਨੂੰ ਸੂਚਿਤ ਕੀਤਾ ਜਾਵੇਗਾ।" + + "ਚਾਰਜਰਾਂ ਅਤੇ ਉਪਸਾਧਨਾਂ ਦੀ ਪਛਾਣ ਕਰਨ ਲਈ USB ਪੋਰਟ ਚਾਲੂ ਹੈ" "USB ਚਾਲੂ ਕਰੋ" + + "ਸਕ੍ਰੀਨ ਭਰਨ ਲਈ ਜ਼ੂਮ ਕਰੋ" "ਸਕ੍ਰੀਨ ਭਰਨ ਲਈ ਸਟ੍ਰੈਚ ਕਰੋ" "ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਵੋ" @@ -118,6 +121,11 @@ "ਰੱਦ ਕਰੋ" "ਪੁਸ਼ਟੀ ਕਰੋ" "ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ" + "ਖਾਲੀ ਖੇਤਰ, ਪ੍ਰਮਾਣੀਕਰਨ ਰੱਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ" + "ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ" + "ਤੁਹਾਡਾ ਚਿਹਰਾ ਲੱਭਿਆ ਜਾ ਰਿਹਾ ਹੈ" + "ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਿਰਤ ਹੋਇਆ" + "ਪੁਸ਼ਟੀ ਕੀਤੀ ਗਈ" "ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ" "ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਪ੍ਰਤੀਕ" "ਤੁਹਾਡੀ ਪਛਾਣ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…" @@ -369,8 +377,7 @@ "%s ਵਜੇ ਚਾਲੂ" "%s ਤੱਕ" "ਗੂੜ੍ਹਾ ਥੀਮ" - - + "ਗੂੜ੍ਹਾ ਥੀਮ\nਬੈਟਰੀ ਸੇਵਰ" "NFC" "NFC ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ" "NFC ਨੂੰ ਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ" @@ -445,13 +452,16 @@ "ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਹੈ" "ਪ੍ਰਦਰਸ਼ਨ ਅਤੇ ਪਿਛੋਕੜ ਡਾਟਾ ਘੱਟ ਕਰਦਾ ਹੈ" "ਬੈਟਰੀ ਸੇਵਰ ਬੰਦ ਕਰੋ" - "ਰਿਕਾਰਡਿੰਗ ਜਾਂ ਕਾਸਟ ਕਰਨ ਵੇਲੇ, %s ਵਲੋਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਚਲਾਏ ਆਡੀਓ ਅਤੇ ਤੁਹਾਡੇ ਪਾਸਵਰਡਾਂ, ਭੁਗਤਾਨ ਜਾਣਕਾਰੀ, ਫ਼ੋਟੋਆਂ ਅਤੇ ਸੁਨੇਹਿਆਂ ਵਰਗੀ ਕੋਈ ਵੀ ਸੰਵੇਦਨਸ਼ੀਲ ਜਾਣਕਾਰੀ ਕੈਪਚਰ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ।" - "ਕਾਸਟ ਕਰਨ/ਰਿਕਾਰਡਿੰਗ ਕਰਨ ਵੇਲੇ ਸੰਵੇਦਨਸ਼ੀਲ ਜਾਣਕਾਰੀ ਦਾ ਖੁਲਾਸਾ ਹੋ ਸਕਦਾ ਹੈ" + "ਰਿਕਾਰਡਿੰਗ ਜਾਂ ਕਾਸਟ ਕਰਨ ਵੇਲੇ, %s ਐਪ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਣ ਜਾਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਤੋਂ ਚੱਲਣ ਵਾਲੀ ਕੋਈ ਵੀ ਸੰਵੇਦਨਸ਼ੀਲ ਜਾਣਕਾਰੀ ਨੂੰ ਕੈਪਚਰ ਕਰ ਸਕਦੀ ਹੈ, ਜਿਸ ਵਿੱਚ ਆਡੀਓ, ਪਾਸਵਰਡਾਂ, ਭੁਗਤਾਨ ਜਾਣਕਾਰੀ, ਫ਼ੋਟੋਆਂ ਅਤੇ ਸੁਨੇਹਿਆਂ ਵਰਗੀ ਸੰਵੇਦਨਸ਼ੀਲ ਜਾਣਕਾਰੀ ਸ਼ਾਮਲ ਹੈ।" + "ਰਿਕਾਰਡਿੰਗ ਜਾਂ ਕਾਸਟ ਕਰਨ ਵੇਲੇ, ਇਹ ਫੰਕਸ਼ਨ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਵਾਲੀ ਸੇਵਾ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਣ ਜਾਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਤੋਂ ਚੱਲਣ ਵਾਲੀ ਕੋਈ ਵੀ ਸੰਵੇਦਨਸ਼ੀਲ ਜਾਣਕਾਰੀ ਨੂੰ ਕੈਪਚਰ ਕਰ ਸਕਦੀ ਹੈ, ਜਿਸ ਵਿੱਚ ਆਡੀਓ, ਪਾਸਵਰਡਾਂ, ਭੁਗਤਾਨ ਜਾਣਕਾਰੀ, ਫ਼ੋਟੋਆਂ ਅਤੇ ਸੁਨੇਹਿਆਂ ਵਰਗੀ ਸੰਵੇਦਨਸ਼ੀਲ ਜਾਣਕਾਰੀ ਸ਼ਾਮਲ ਹੈ।" + "ਕਾਸਟ ਕਰਨ/ਰਿਕਾਰਡ ਕਰਨ ਵੇਲੇ ਸੰਵੇਦਨਸ਼ੀਲ ਜਾਣਕਾਰੀ ਦਾ ਖੁਲਾਸਾ ਹੋ ਜਾਣਾ" "ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ" "ਸਭ ਕਲੀਅਰ ਕਰੋ" "ਪ੍ਰਬੰਧਨ ਕਰੋ" - "ਸਰਲ ਸੂਚਨਾਵਾਂ" - "ਸਾਰੀਆਂ ਸਰਲ ਸੂਚਨਾਵਾਂ ਕਲੀਅਰ ਕਰੋ" + + + + "\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਰੋਕਿਆ ਗਿਆ" "ਹੁਣ ਚਾਲੂ ਕਰੋ" "ਕੋਈ ਸੂਚਨਾਵਾਂ ਨਹੀਂ" @@ -635,9 +645,11 @@ "ਬਲਾਕ ਕਰੋ" "ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖੋ" "ਛੋਟਾ ਕਰੋ" - "ਅਰਾਮਦੇਹ" + + "ਚੁੱਪ ਰਹੋ" - "ਰੁਕਾਵਟੀ" + + "ਸੁਚੇਤ ਰਖੋ" "ਸੂਚਨਾਵਾਂ ਬੰਦ ਕਰੋ" "ਕੀ ਇਸ ਐਪ ਤੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?" @@ -651,10 +663,8 @@ "ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸੋਧਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।" "ਇਹ ਸੂਚਨਾਵਾਂ ਦਾ ਗਰੁੱਪ ਇੱਥੇ ਸੰਰੂਪਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" "ਇੱਕ ਐਪ ਦੀ ਥਾਂ \'ਤੇ ਦੂਜੀ ਐਪ ਰਾਹੀਂ ਦਿੱਤੀ ਗਈ ਸੂਚਨਾ" - - - - + "ਸਾਰੀਆਂ %1$s ਸੂਚਨਾਵਾਂ" + "ਹੋਰ ਦੇਖੋ" "ਇਹ ਐਪ ਕੈਮਰੇ ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਹੈ।" "ਇਹ ਐਪ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਹੈ।" "ਇਹ ਐਪ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਹੋਰਾਂ ਐਪਾਂ ਉੱਪਰ ਦਿਖਾਈ ਜਾ ਰਹੀ ਹੈ।" @@ -898,7 +908,8 @@ "ਕਰਨ ਦਿਓ" "ਅਸਵੀਕਾਰ ਕਰੋ" "ਬੈਟਰੀ ਸੇਵਰ ਦੀ ਸਮਾਂ-ਸੂਚੀ ਤਿਆਰ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ" - "ਬੈਟਰੀ %d%% ਹੋਣ \'ਤੇ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਚਾਲੂ ਹੁੰਦਾ ਹੈ" + + "ਨਹੀਂ ਧੰਨਵਾਦ" "ਬੈਟਰੀ ਸੇਵਰ ਸਮਾਂ-ਸੂਚੀ ਚਾਲੂ ਕੀਤੀ ਗਈ" "ਬੈਟਰੀ ਦਾ ਪੱਧਰ %d%% ਤੋਂ ਘੱਟ ਹੋ ਜਾਣ \'ਤੇ ਬੈਟਰੀ ਸੇਵਰ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਚਾਲੂ ਹੋ ਜਾਵੇਗਾ।" @@ -930,6 +941,5 @@ "ਉੱਪਰ ਵੱਲ ਸੱਜੇ ਲਿਜਾਓ" "ਹੇਠਾਂ ਵੱਲ ਖੱਬੇ ਲਿਜਾਓ" "ਹੇਠਾਂ ਵੱਲ ਸੱਜੇ ਲਿਜਾਓ" - - + "ਖਾਰਜ ਕਰੋ" diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index ed792f2abced..fdb4a3b60c80 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -62,9 +62,12 @@ "Debugowanie USB jest niedozwolone" "Użytkownik obecnie zalogowany na tym urządzeniu nie może włączyć debugowania USB. Aby użyć tej funkcji, przełącz się na użytkownika głównego." "Port USB wyłączony" - "Aby chronić urządzenie przed wilgocią i zanieczyszczeniami, port USB został wyłączony i nie wykryje żadnych akcesoriów.\n\nOtrzymasz powiadomienie, gdy będzie można znów bezpiecznie używać portu." + + "Port USB włączony, by wykrywać ładowarki i akcesoria" "Włącz USB" + + "Powiększ, aby wypełnić ekran" "Rozciągnij, aby wypełnić ekran" "Zrzut ekranu" @@ -118,6 +121,11 @@ "Anuluj" "Potwierdź" "Spróbuj jeszcze raz" + "Pusty obszar, kliknij, by anulować uwierzytelnianie" + "Spróbuj ponownie" + "Szukam Twojej twarzy" + "Twarz rozpoznana" + "Potwierdzono" "Dotknij czytnika linii papilarnych" "Ikona odcisku palca" "Szukam Cię…" @@ -375,8 +383,7 @@ "Włącz o %s" "Do %s" "Ciemny motyw" - - + "Ciemny motywy\nOszczędzanie baterii" "Komunikacja NFC" "Komunikacja NFC jest wyłączona" "Komunikacja NFC jest włączona" @@ -453,13 +460,16 @@ "Oszczędzanie baterii jest włączone" "Zmniejsza wydajność i ogranicza dane w tle" "Wyłącz Oszczędzanie baterii" - "Podczas nagrywania lub przesyłania aplikacja %s może rejestrować wszelkie informacje poufne, takie jak odtwarzany dźwięk czy podawane hasła, informacje o płatnościach, zdjęcia i wiadomości." + "Podczas nagrywania lub przesyłania aplikacja %s może rejestrować wszelkie informacje poufne wyświetlane na ekranie lub odtwarzane na urządzeniu takie jak dźwięki czy podawane hasła, informacje o płatnościach, zdjęcia i wiadomości." + "Podczas nagrywania lub przesyłania usługa udostępniająca tę funkcję może rejestrować wszelkie informacje poufne wyświetlane na ekranie lub odtwarzane na urządzeniu takie jak dźwięki czy podawane hasła, informacje o płatnościach, zdjęcia i wiadomości." "Ujawnianie poufnych informacji podczas przesyłania/nagrywania" "Nie pokazuj ponownie" "Ukryj wszystkie" "Zarządzaj" - "Subtelne powiadomienia" - "Wyczyść wszystkie subtelne powiadomienia" + + + + "Powiadomienia wstrzymane przez tryb Nie przeszkadzać" "Rozpocznij teraz" "Brak powiadomień" @@ -643,9 +653,11 @@ "Zablokuj" "Pokazuj nadal" "Minimalizuj" - "Subtelne" + + "Zachowaj wyciszenie" - "Zakłócające pracę" + + "Powiadamiaj dalej" "Wyłącz powiadomienia" "Nadal pokazywać powiadomienia z tej aplikacji?" @@ -659,10 +671,8 @@ "Tych powiadomień nie można zmodyfikować." "Tej grupy powiadomień nie można tu skonfigurować" "Powiadomienie w zastępstwie" - - - - + "Wszystkie powiadomienia z aplikacji %1$s" + "Pokaż więcej" "Ta aplikacja używa aparatu." "Ta aplikacja używa mikrofonu." "Ta aplikacja wyświetla się nad innymi aplikacjami na ekranie." @@ -910,7 +920,8 @@ "Zezwól" "Odmów" "Kliknij, by zaplanować działanie oszczędzania baterii" - "Włącz automatycznie, gdy poziom naładowania baterii wynosi %d%%" + + "Nie" "Harmonogram oszczędzania baterii jest aktywny" "Oszczędzanie baterii włączy się automatycznie, gdy poziom naładowania baterii spadnie poniżej %d%%." @@ -942,6 +953,5 @@ "Przenieś w prawy górny róg" "Przenieś w lewy dolny róg" "Przenieś w prawy dolny róg" - - + "Zamknij" diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index cfca7980f409..6edbced561e7 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -62,9 +62,12 @@ "Depuração USB não permitida" "O usuário conectado a este dispositivo não pode ativar a depuração USB. Para usar esse recurso, mude para o usuário principal \"NAME\"." "Porta USB desativada" - "Para proteger seu dispositivo de líquidos e detritos, a porta USB está desativada e não detectará nenhum acessório.\n\nVocê receberá uma notificação quando for seguro usar a porta USB novamente." + + "Porta USB ativada para detectar carregadores e acessórios" "Ativar USB" + + "Zoom p/ preencher a tela" "Ampliar p/ preencher tela" "Captura de tela" @@ -118,6 +121,11 @@ "Cancelar" "Confirmar" "Tentar novamente" + "Região vazia. Toque nela para cancelar a autenticação" + "Tente novamente" + "Procurando seu rosto" + "Rosto autenticado" + "Confirmada" "Toque no sensor de impressão digital" "Ícone de impressão digital" "Procurando você…" @@ -369,8 +377,7 @@ "Ativado às %s" "Até %s" "Tema escuro" - - + "Tema escuro\nEconomia de bateria" "NFC" "A NFC está desativada" "A NFC está ativada" @@ -445,13 +452,16 @@ "Economia de bateria ativada" "Reduz o desempenho e os dados em segundo plano" "Desativar a Economia de bateria" - "Ao gravar ou transmitir, o %s pode capturar informações confidenciais, como áudios que você ouve e também senhas, informações de pagamento, fotos e mensagens." + "Ao gravar ou transmitir, o app %s pode capturar informações confidenciais exibidas na tela ou acessadas pelo dispositivo, incluindo áudio, senhas, informações de pagamento, fotos e mensagens." + "Ao gravar ou transmitir, o serviço relacionado a esta função pode capturar informações confidenciais exibidas na tela ou acessadas pelo dispositivo, incluindo áudio, senhas, informações de pagamento, fotos e mensagens." "Exposição de informações confidenciais durante transmissão/gravação" "Não mostrar novamente" "Limpar tudo" "Gerenciar" - "Notificações discretas" - "Limpar todas as notificações discretas" + + + + "Notificações pausadas pelo modo \"Não perturbe\"" "Iniciar agora" "Sem notificações" @@ -635,9 +645,11 @@ "Bloquear" "Continuar mostrando" "Minimizar" - "Com discrição" + + "Continuar sem som" - "Com interrupção" + + "Continuar alertando" "Desativar notificações" "Continuar mostrando notificações desse app?" @@ -651,10 +663,8 @@ "Não é possível modificar essas notificações." "Não é possível configurar esse grupo de notificações aqui" "Notificação salva no proxy" - - - - + "Todas as notificações do app %1$s" + "Ver mais" "Este app está usando a câmera." "Este app está usando o microfone." "Este app está sobreposto a outros apps na sua tela." @@ -662,7 +672,7 @@ "Este app está sobreposto a outros apps na sua tela e está usando a câmera." "Este app está sobreposto a outros apps na sua tela e está usando o microfone." "Este app está sobreposto a outros apps na sua tela e está usando o microfone e a câmera." - "Config." + "Configurações" "OK" "Controles de notificação de %1$s abertos" "Controles de notificação de %1$s fechados" @@ -898,7 +908,8 @@ "Permitir" "Negar" "Toque para programar o recurso Economia de bateria" - "Ativar automaticamente quando a bateria estiver em %d%%" + + "Não" "Programação do recurso Economia de bateria ativada" "O recurso Economia de bateria será ativado automaticamente depois que a bateria ficar abaixo de %d%%." @@ -930,6 +941,5 @@ "Mover para canto superior direito" "Mover para canto inferior esquerdo" "Mover para canto inferior direito" - - + "Dispensar" diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 328c1fd73af5..e373b3bf2687 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -62,9 +62,12 @@ "Depuração USB não permitida" "O utilizador com sessão iniciada atualmente neste dispositivo não pode ativar a depuração USB. Para utilizar esta funcionalidade, mude para o utilizador principal." "Porta USB desativada" - "Para proteger o dispositivo contra líquidos ou resíduos, a porta USB está desativada e não irá detetar quaisquer acessórios.\n\nSerá notificado quando for seguro utilizar a porta USB novamente." + + "Porta USB ativada para detetar carregadores e acessórios" "Ativar USB" + + "Zoom para preencher o ecrã" "Esticar p. caber em ec. int." "Captura de ecrã" @@ -118,6 +121,11 @@ "Cancelar" "Confirmar" "Tentar novamente" + "Região vazia. Toque para cancelar a autenticação." + "Tente novamente." + "A procurar o seu rosto…" + "Rosto autenticado" + "Confirmado" "Toque no sensor de impressões digitais." "Ícone de impressão digital" "À sua procura…" @@ -369,8 +377,7 @@ "Ativada à(s) %s" "Até à(s) %s" "Tema escuro" - - + "Tema escuro\nPoupança de bateria" "NFC" "O NFC está desativado" "O NFC está ativado" @@ -445,13 +452,16 @@ "Poupança de bateria ativada" "Reduz o desempenho e os dados de segundo plano" "Desativar a Poupança de bateria" - "Durante a gravação ou a transmissão, o %s pode capturar informações confidenciais, tais como o áudio reproduzido, palavras-passe, informações de pagamento, fotos e mensagens." + "Durante a gravação ou a transmissão, a aplicação %s pode capturar quaisquer informações confidenciais apresentadas no ecrã ou reproduzidas a partir do seu dispositivo, incluindo áudio, palavras-passe, informações de pagamento, fotos e mensagens." + "Durante a gravação ou a transmissão, o serviço que fornece esta função pode capturar quaisquer informações confidenciais apresentadas no ecrã ou reproduzidas a partir do seu dispositivo, incluindo áudio, palavras-passe, informações de pagamento, fotos e mensagens." "Exposição de informações confidenciais durante a transmissão/gravação" "Não mostrar de novo" "Limpar tudo" "Gerir" - "Notificações discretas" - "Limpar todas as notificações discretas" + + + + "Notificações colocadas em pausa pelo modo Não incomodar." "Começar agora" "Sem notificações" @@ -635,9 +645,11 @@ "Bloquear" "Continuar a mostrar" "Minimizar" - "Silenciosas" + + "Continuar sem som" - "Interruptivas" + + "Continuar a alertar" "Desativar notificações" "Pretende continuar a ver notificações desta aplicação?" @@ -646,15 +658,13 @@ "Ajuda-o a concentrar-se com notificações apenas no painel pendente. Sempre silenciosa." "É apresentada abaixo das notificações prioritárias. Sempre silenciosa." "É apresentada abaixo das notificações prioritárias. Sempre silenciosa." - "É apresentada abaixo das notificações prioritárias. Sempre silenciosa." - "Chama a sua atenção com som e um ícone na barra de estado. É apresentada no ecrã de bloqueio." + "Apresentadas abaixo das notificações prioritárias. Sempre silenciosas." + "Chamam à atenção com som e ícones na barra de estado. Apresentadas no ecrã de bloqueio." "Não é possível modificar estas notificações." "Não é possível configurar este grupo de notificações aqui." "Notificação de aplicação proxy" - - - - + "Todas as notificações da aplicação %1$s" + "Ver mais" "Esta aplicação está a utilizar a câmara." "Esta aplicação está a utilizar o microfone." "Esta aplicação está a sobrepor-se a outras aplicações no ecrã." @@ -898,7 +908,8 @@ "Permitir" "Recusar" "Tocar para agendar a Poupança de bateria" - "Ative automaticamente quando o nível de bateria estiver a %d%%." + + "Não, obrigado" "Poupança de bateria agendada ativada" "A Poupança de bateria é ativada automaticamente quando o nível de bateria está abaixo de %d%%." @@ -930,6 +941,5 @@ "Mover parte superior direita" "Mover p/ parte infer. esquerda" "Mover parte inferior direita" - - + "Ignorar" diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index cfca7980f409..6edbced561e7 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -62,9 +62,12 @@ "Depuração USB não permitida" "O usuário conectado a este dispositivo não pode ativar a depuração USB. Para usar esse recurso, mude para o usuário principal \"NAME\"." "Porta USB desativada" - "Para proteger seu dispositivo de líquidos e detritos, a porta USB está desativada e não detectará nenhum acessório.\n\nVocê receberá uma notificação quando for seguro usar a porta USB novamente." + + "Porta USB ativada para detectar carregadores e acessórios" "Ativar USB" + + "Zoom p/ preencher a tela" "Ampliar p/ preencher tela" "Captura de tela" @@ -118,6 +121,11 @@ "Cancelar" "Confirmar" "Tentar novamente" + "Região vazia. Toque nela para cancelar a autenticação" + "Tente novamente" + "Procurando seu rosto" + "Rosto autenticado" + "Confirmada" "Toque no sensor de impressão digital" "Ícone de impressão digital" "Procurando você…" @@ -369,8 +377,7 @@ "Ativado às %s" "Até %s" "Tema escuro" - - + "Tema escuro\nEconomia de bateria" "NFC" "A NFC está desativada" "A NFC está ativada" @@ -445,13 +452,16 @@ "Economia de bateria ativada" "Reduz o desempenho e os dados em segundo plano" "Desativar a Economia de bateria" - "Ao gravar ou transmitir, o %s pode capturar informações confidenciais, como áudios que você ouve e também senhas, informações de pagamento, fotos e mensagens." + "Ao gravar ou transmitir, o app %s pode capturar informações confidenciais exibidas na tela ou acessadas pelo dispositivo, incluindo áudio, senhas, informações de pagamento, fotos e mensagens." + "Ao gravar ou transmitir, o serviço relacionado a esta função pode capturar informações confidenciais exibidas na tela ou acessadas pelo dispositivo, incluindo áudio, senhas, informações de pagamento, fotos e mensagens." "Exposição de informações confidenciais durante transmissão/gravação" "Não mostrar novamente" "Limpar tudo" "Gerenciar" - "Notificações discretas" - "Limpar todas as notificações discretas" + + + + "Notificações pausadas pelo modo \"Não perturbe\"" "Iniciar agora" "Sem notificações" @@ -635,9 +645,11 @@ "Bloquear" "Continuar mostrando" "Minimizar" - "Com discrição" + + "Continuar sem som" - "Com interrupção" + + "Continuar alertando" "Desativar notificações" "Continuar mostrando notificações desse app?" @@ -651,10 +663,8 @@ "Não é possível modificar essas notificações." "Não é possível configurar esse grupo de notificações aqui" "Notificação salva no proxy" - - - - + "Todas as notificações do app %1$s" + "Ver mais" "Este app está usando a câmera." "Este app está usando o microfone." "Este app está sobreposto a outros apps na sua tela." @@ -662,7 +672,7 @@ "Este app está sobreposto a outros apps na sua tela e está usando a câmera." "Este app está sobreposto a outros apps na sua tela e está usando o microfone." "Este app está sobreposto a outros apps na sua tela e está usando o microfone e a câmera." - "Config." + "Configurações" "OK" "Controles de notificação de %1$s abertos" "Controles de notificação de %1$s fechados" @@ -898,7 +908,8 @@ "Permitir" "Negar" "Toque para programar o recurso Economia de bateria" - "Ativar automaticamente quando a bateria estiver em %d%%" + + "Não" "Programação do recurso Economia de bateria ativada" "O recurso Economia de bateria será ativado automaticamente depois que a bateria ficar abaixo de %d%%." @@ -930,6 +941,5 @@ "Mover para canto superior direito" "Mover para canto inferior esquerdo" "Mover para canto inferior direito" - - + "Dispensar" diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index d673743605fa..db853a098fb9 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -62,9 +62,12 @@ "Remedierea erorilor prin USB nu este permisă" "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor prin USB. Pentru a folosi această funcție, comutați la utilizatorul principal." "Portul USB a fost dezactivat" - "Pentru a vă proteja dispozitivul de lichide sau reziduuri, portul USB este dezactivat și nu va detecta niciun accesoriu.\n\nVeți primi o notificare când puteți folosi din nou portul USB în siguranță." + + "Portul USB a fost activat pentru a detecta încărcătoarele și accesoriile" "Activați USB" + + "Zoom pt. a umple ecranul" "Înt. pt. a umple ecranul" "Instantaneu" @@ -118,6 +121,11 @@ "Anulați" "Confirmați" "Încercați din nou" + "Zonă goală, atingeți pentru a anula autentificarea" + "Încercați din nou" + "Se caută chipul" + "Chip autentificat" + "Confirmat" "Atingeți senzorul de amprente" "Pictograma amprentă" "Vă căutăm…" @@ -371,8 +379,7 @@ "Activată la %s" "Până la %s" "Temă întunecată" - - + "Temă întunecată\nEconomisirea bateriei" "NFC" "Serviciul NFC este dezactivat" "Serviciul NFC este activat" @@ -448,13 +455,16 @@ "Economisire baterie activată" "Reduce performanța și datele de fundal" "Dezactivați economisirea bateriei" - "În timp ce înregistrați sau proiectați, %s poate captura toate informațiile sensibile, cum ar fi conținutul audio pe care îl redați, parolele, informațiile de plată, fotografiile și mesajele." + "În timp ce înregistrați sau proiectați, %s poate captura toate informațiile sensibile care sunt afișate pe ecran sau redate pe dispozitiv, inclusiv informații sensibile precum conținutul audio, parolele, informațiile de plată, fotografiile și mesajele." + "În timp ce înregistrați sau proiectați, serviciul care oferă această funcție poate captura toate informațiile sensibile care sunt afișate pe ecran sau redate pe dispozitiv, inclusiv informații sensibile precum conținutul audio, parolele, informațiile de plată, fotografiile și mesajele." "Se expun informații sensibile în timpul proiectării/înregistrării" "Nu se mai afișează" "Ștergeți toate notificările" "Gestionați" - "Notificări discrete" - "Ștergeți toate notificările discrete" + + + + "Notificări întrerupte prin „Nu deranja”" "Începeți acum" "Nicio notificare" @@ -638,9 +648,11 @@ "Blocați" "Continuați afișarea" "Minimizați" - "Discret" + + "Păstrați modul silențios" - "Interferent" + + "Păstrați alerta" "Dezactivați notificările" "Doriți să continuați afișarea notificărilor de la această aplicație?" @@ -654,10 +666,8 @@ "Aceste notificări nu pot fi modificate." "Acest grup de notificări nu poate fi configurat aici" "Notificare prin proxy" - - - - + "Toate notificările din %1$s" + "Vedeți mai multe" "Această aplicație folosește camera foto." "Această aplicație folosește microfonul." "Această aplicație se afișează pe alte aplicații de pe ecran." @@ -903,7 +913,8 @@ "Permiteți" "Refuzați" "Atingeți pentru a programa Economisirea energiei" - "Activați automat când bateria este la %d%%" + + "Nu, mulțumesc" "S-a activat programarea pentru Economisirea bateriei" "Economisirea bateriei se va activa automat imediat ce bateria scade sub %d%%." @@ -935,6 +946,5 @@ "Mutați în dreapta sus" "Mutați în stânga jos" "Mutați în dreapta jos" - - + "Închideți" diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 9593e4f1e561..98b18685e1d6 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -62,9 +62,12 @@ "Отладка по USB запрещена" "В этом аккаунте нельзя включить отладку по USB. Перейдите в аккаунт основного пользователя." "USB-порт отключен" - "Чтобы внутрь устройства не попала вода или грязь, USB-порт был отключен. Сейчас через него нельзя подсоединять другие устройства.\n\nКогда USB-порт снова можно будет использовать, вы получите уведомление." + + "USB-порт активен и может распознавать аксессуары и зарядные устройства." "Включить USB-порт" + + "Подогнать по размерам экрана" "Растянуть на весь экран" "Скриншот" @@ -118,6 +121,11 @@ "Отмена" "Подтвердить" "Повторить попытку" + "Пустая область. Нажмите на нее, чтобы отменить аутентификацию." + "Повторите попытку" + "Распознавание лица" + "Лицо распознано" + "Подтверждено" "Прикоснитесь к сканеру отпечатков пальцев." "Значок отпечатка пальца" "Поиск лица…" @@ -373,8 +381,7 @@ "Включить в %s" "До %s" "Тёмная тема" - - + "Тёмная тема\nРежим энергосбережения" "Модуль NFC" "Модуль NFC отключен" "Модуль NFC включен" @@ -451,13 +458,16 @@ "Режим энергосбережения включен" "Откл. фоновой передачи данных" "Отключить режим энергосбережения" - "При записи сообщений или трансляции экрана приложение \"%s\" может получить доступ к личной информации, например, к аудиозаписям, которые вы слушаете, паролям, фото, сообщениям и платежным данным." + "При записи сообщений или трансляции экрана приложение \"%s\" может получить доступ к конфиденциальной информации, которая отображается на экране или воспроизводится на устройстве, например к аудиозаписям, паролям, фото, сообщениям и платежным данным." + "При записи сообщений или трансляции экрана сервис может получить доступ к конфиденциальной информации, которая отображается на экране или воспроизводится на устройстве, например к аудиозаписям, паролям, фото, сообщениям и платежным данным." "Раскрытие личной информации при записи или трансляции" "Больше не показывать" "Очистить все" "Настроить" - "Беззвучные уведомления" - "Отклонить все беззвучные уведомления" + + + + "В режиме \"Не беспокоить\" уведомления заблокированы" "Начать" "Нет уведомлений" @@ -641,9 +651,11 @@ "Заблокировать" "Показывать" "Свернуть" - "Беззвучные уведомления" + + "Не включать звук" - "Уведомления со звуковым сигналом" + + "Присылать уведомления" "Выключить уведомления" "Показывать уведомления от этого приложения?" @@ -653,14 +665,12 @@ "Показ уведомлений с низким приоритетом. Всегда без звука." "Показ уведомлений с низким приоритетом. Всегда без звука." "Показ уведомлений с низким приоритетом. Всегда без звука." - "О наличии уведомлений можно узнать по специальному звуку и значку в строке состояния. Уведомления появляются на заблокированном экране." + "Со звуком и значком в строке состояния. Появляются на заблокированном экране." "Эти уведомления нельзя изменить." "Эту группу уведомлений нельзя настроить здесь." "Уведомление отправлено через прокси-сервер." - - - - + "Показывать все уведомления приложения \"%1$s\"" + "Ещё" "Это приложение использует камеру." "Это приложение использует микрофон." "Это приложение располагается поверх других приложений." @@ -908,7 +918,8 @@ "Да" "Нет" "Нажмите, чтобы настроить режим энергосбережения" - "Включать автоматически при заряде батареи ниже %d %%." + + "Отмена" "Автоматический переход в режим энергосбережения включен" "Режим энергосбережения активируется при заряде батареи ниже %d %%." @@ -940,6 +951,5 @@ "Перенести в правый верхний угол" "Перенести в левый нижний угол" "Перенести в правый нижний угол" - - + "Закрыть" diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 4d3f5dcb680e..a2be25967b84 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -62,9 +62,10 @@ "USB නිදොස්කරණය වෙත අවසර නැහැ" "දැනට මෙම උපාංගයට පුරා ඇති පරිශීලකයාට USB නිදොස්කරණය ක්‍රියාත්මක කළ නොහැක. මෙම විශේෂාංගය භාවිතා කිරීම සඳහා, මූලික පරිශීලකයා වෙත මාරු වෙන්න." "USB තොට අබලයි" - "ඔබේ උපාංගය ද්‍රවවලින් හෝ කුණුවලින් ආරක්‍ෂා කිරීමට, USB තොට අබල කර තිබෙන අතර, එය කිසිම අමතරාංගයක් අනාවරණ නොකරයි.\n\nනැවතත් USB තොට භාවිත කිරීම ආරක්‍ෂාකාරී වූ විට ඔබව දැනුම් දෙනු ලැබේ." + "ඔබේ උපාංගය ද්‍රවවලින් හෝ කුණුවලින් ආරක්‍ෂා කිරීමට, USB තොට අබල කර තිබෙන අතර, එය කිසිම අමතරාංගයක් අනාවරණ නොකරයි.\n\nනැවතත් USB තොට භාවිත කිරීම හරි නම් ඔබව දැනුම් දෙනු ලැබේ." "ආරෝපක සහ උපකාරක අංග අනාවරණ කිරීමට USB තොට සබල කර ඇත" "USB සබල කරන්න" + "තවත් දැන ගන්න" "තිරය පිරවීමට විශාලනය කරන්න" "තිරය පිරවීමට අදින්න" "තිර රුව" @@ -118,6 +119,11 @@ "අවලංගු කරන්න" "තහවුරු කරන්න" "නැවත උත්සාහ කරන්න" + "හිස් කලාපය, සත්‍යාපනය අවලංගු කිරීමට තට්ටු කරන්න" + "නැවත උත්සාහ කරන්න" + "ඔබේ මුහුණ සොයනු ලැබේ" + "මුහුණ සත්‍යාපන කළා" + "තහවුරු කළා" "ඇඟිලි සලකුණු සංවේදකය ස්පර්ශ කරන්න" "ඇඟිලි සලකුණු නිරූපකය" "ඔබව සොයමින්…" @@ -369,8 +375,7 @@ "%sට ක්‍රියාත්මකයි" "%s තෙක්" "අඳුරු තේමාව" - - + "අඳුරු තේමාව\nබැටරි සුරැකුම" "NFC" "NFC අබලයි" "NFC සබලයි" @@ -445,13 +450,14 @@ "බැටරි සුරැකුම ක්‍රියාත්මකයි" "ක්‍රියාකාරිත්වය සහ පසුබිම් දත්ත අඩු කරන්න" "බැටරි සුරැකුම ක්‍රියාවිරහිත කරන්න" - "පටිගත කරන හෝ විකාශන කරන අතරතුර, %s හට ඔබ වාදන කරන ශ්‍රව්‍යය සහ ඔබේ මුරපද, ගෙවීමේ තොරතුරු, ඡායාරූප, සහ පණිවුඩ වැනි ඕනෑම සංවේදී තොරතුරක් ග්‍රහණ කළ හැක." + "පටිගත හෝ විකාශය කරන අතරේ, %s හට ශ්‍රව්‍ය, මුරපද, ගෙවීමේ තතු, ඡායාරූප, සහ පණිවිඩ වැනි, ඔබේ තිරයෙහි සංදර්ශනය වන හෝ ඔබේ උපාංගයෙන් වාදනය වන ඕනෑම සංවේදී තොරතුරක් ග්‍රහණය කළ හැකිය." + "පටිගත හෝ විකාශය කරන අතරේ, මෙම කාර්යය සපයන සේවාවට ශ්‍රව්‍ය, මුරපද, ගෙවීමේ තතු, ඡායාරූප, සහ පණිවිඩ වැනි, ඔබේ තිරයෙහි සංදර්ශනය වන හෝ ඔබේ උපාංගයෙන් වාදනය වන ඕනෑම සංවේදී තොරතුරක් ග්‍රහණය කළ හැකිය." "විකාශනය/පටිගත කිරීම අතරතුර සංවේදී තොරතුරු හෙළි කිරීම" "නැවත නොපෙන්වන්න" "සියල්ල හිස් කරන්න" "කළමනාකරණය කරන්න" - "මෘදු දැනුම්දීම්" - "සියලු මෘදු දැනුම්දීම් හිස් කරන්න" + "නිහඬ දැනුම්දීම්" + "සියලු නිහඬ දැනුම්දීම් හිස් කරන්න" "බාධා නොකරන්න මගින් විරාම කරන ලද දැනුම්දීම්" "දැන් අරඹන්න" "දැනුම්දීම් නැත" @@ -635,9 +641,9 @@ "අවහිර කරන්න" "පෙන්වමින් තබන්න" "කුඩා කරන්න" - "මෘදු" + "නිහඬ" "නිහඬව සිටින්න" - "බාධක" + "ඇඟවීම" "අඟවමින් සිටින්න" "දැනුම්දීම් අක්‍රිය කරන්න" "මෙම යෙදුම වෙතින් දැනුම්දීම් පෙන්වමින් තබන්නද?" @@ -651,10 +657,8 @@ "මෙම දැනුම්දීම් වෙනස් කළ නොහැක." "මෙම දැනුම්දීම් සමූහය මෙහි වින්‍යාස කළ නොහැක" "ප්‍රොක්සි කළ දැනුම්දීම" - - - - + "සියලු %1$s දැනුම්දීම්" + "තවත් බලන්න" "මෙම යෙදුම කැමරාව භාවිතා කරයි." "මෙම යෙදුම මයික්‍රෆෝනය භාවිතා කරයි." "මෙම යෙදුම් ඔබගේ තිරය මත අනෙකුත් යෙදුම්වලට උඩින් සංදර්ශනය වේ." @@ -898,7 +902,7 @@ "ඉඩ දෙන්න" "ප්‍රතික්ෂේප කර." "බැටරි සුරැකුම කාලසටහන්ගත කිරීමට තට්ටු කරන්න" - "බැටරිය %d%% වූ විට ස්වයංක්‍රියව ක්‍රියාත්මක කරන්න" + "බැටරිය අවසන් වීමට යන විට සක්‍රීය කරන්න" "එපා ස්තූතියි" "බැටරි සුරැකුම් කාලසටහන ක්‍රියාත්මකයි" "බැටරිය %d%%ට වඩා අඩු වූ පසු බැටරි සුරැකුම ස්වයංක්‍රියව ක්‍රියාත්මක කරනු ඇත." @@ -930,6 +934,5 @@ "ඉහළ දකුණට ගෙන යන්න" "පහළ වමට ගෙන යන්න" "පහළ දකුණට ගෙන යන්න" - - + "ඉවතලන්න" diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 720b256f2e81..f4712e34d663 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -62,9 +62,12 @@ "Ladenie cez USB nie je povolené" "Používateľ, ktorý je práve prihlásený v tomto zariadení, nemôže zapnúť ladenie USB. Ak chcete použiť túto funkciu, prepnite na hlavného používateľa." "Port USB je deaktivovaný" - "Port USB je deaktivovaný na zaistenie ochrany zariadenia pred tekutinami alebo nečistotami a nerozpoznáva príslušenstvo.\n\nKeď ho budete môcť znova bezpečne použiť, upozorníme vás." + + "Bol povolený port USB na zisťovanie nabíjačiek a príslušenstva" "Povoliť USB" + + "Priblížiť na celú obrazovku" "Na celú obrazovku" "Snímka" @@ -118,6 +121,11 @@ "Zrušiť" "Potvrdiť" "Skúsiť znova" + "Prázdna oblasť, klepnutím zrušte overenie" + "Skúste to znova" + "Hľadá sa vaša tvár" + "Tvár bola overená" + "Potvrdené" "Dotknite sa senzora odtlačkov prstov" "Ikona odtlačku prsta" "Hľadáme vás…" @@ -373,8 +381,7 @@ "Od %s" "Do %s" "Tmavý motív" - - + "Tmavý motív\nŠetrič batérie" "NFC" "NFC je deaktivované" "NFC je aktivované" @@ -451,13 +458,16 @@ "Šetrič batérie je zapnutý" "Obmedzí výkonnosť a prenos údajov na pozadí" "Vypnúť šetrič batérie" - "Počas zaznamenávania alebo prenášania môže %s zachytiť citlivé údaje, napríklad prehrávaný zvuk a heslá, platobné údaje, fotky a správy." + "Počas nahrávania alebo prenosu môže aplikácia %s zachytiť citlivé údaje zobrazené na obrazovke alebo prehrávané zo zariadenia, napríklad zvuk, heslá, platobné údaje, fotky a správy." + "Počas nahrávania alebo prenosu môže služba poskytujúca túto funkciu zachytiť citlivé údaje zobrazené na obrazovke alebo prehrávané zo zariadenia, napríklad zvuk, heslá, platobné údaje, fotky a správy." "Počas prenášania/zaznamenávania sa odhaľujú citlivé údaje" "Nabudúce nezobrazovať" "Vymazať všetko" "Spravovať" - "Nenápadné upozornenia" - "Vymazať všetky nenápadné upozornenia" + + + + "Upozornenia sú pozastavené režimom bez vyrušení" "Spustiť" "Žiadne upozornenia" @@ -641,9 +651,11 @@ "Blokovať" "Naďalej zobrazovať" "Minimalizovať" - "Jemné" + + "Naďalej upozorňovať potichu" - "Rušivé" + + "Naďalej upozorňovať" "Vypnúť upozornenia" "Majú sa upozornenia z tejto aplikácie naďalej zobrazovať?" @@ -657,10 +669,8 @@ "Tieto upozornenia sa nedajú upraviť." "Túto skupinu upozornení nejde na tomto mieste konfigurovať" "Približné upozornenie" - - - - + "Všetky upozornenia aplikácie %1$s" + "Zobraziť viac" "Táto aplikácia používa fotoaparát." "Táto aplikácia používa mikrofón." "Táto aplikácia sa zobrazuje cez ďalšie aplikácie na obrazovke." @@ -908,7 +918,8 @@ "Povoliť" "Zamietnuť" "Klepnutím naplánujete aktivovanie Šetriča batérie" - "Zapnúť automaticky, keď batéria klesne pod %d %%" + + "Nie, vďaka" "Plánované aktivovanie Šetriča batérie bolo zapnuté" "Keď batéria klesne pod %d %%, automaticky sa aktivujte Šetrič batérie." @@ -940,6 +951,5 @@ "Presunúť doprava nahor" "Presunúť doľava nadol" "Presunúť doprava nadol" - - + "Zavrieť" diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index d0a5f50b2028..58ff0747691a 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -62,9 +62,12 @@ "Odpravljanje napak s povezavo USB ni dovoljeno" "Uporabnik, trenutno prijavljen v napravo, ne more vklopiti odpravljanja napak s povezavo USB. Če želite uporabljati to funkcijo, preklopite na primarnega uporabnika." "Vrata USB so onemogočena" - "Za zaščito naprave pred tekočino ali umazanijo so vrata USB onemogočena in ne bodo zaznala nobene dodatne opreme.\n\nKo bo znova varno uporabljati vrata USB, boste obveščeni." + + "Vrata USB so omogočena za zaznavanje polnilnikov in dodatne opreme" "Omogoči USB" + + "Povečava čez cel zaslon" "Raztegnitev čez zaslon" "Posnetek" @@ -118,6 +121,11 @@ "Prekliči" "Potrdite" "Poskusi znova" + "Prazno območje. Dotaknite se, da prekličete preverjanje pristnosti." + "Poskusite znova" + "Iskanje obraza" + "Pristnost obraza je potrjena" + "Potrjeno" "Dotaknite se tipala prstnih odtisov" "Ikona prstnih odtisov" "Preverjanje vašega obraza …" @@ -373,8 +381,7 @@ "Vklop ob %s" "Do %s" "Temna tema" - - + "Temna tema\nVarčevanje energije" "NFC" "Tehnologija NFC je onemogočena" "Tehnologija NFC je omogočena" @@ -451,13 +458,16 @@ "Varčevanje z energijo akumulatorja je vklopljeno" "Omeji zmogljivost delovanja in prenos podatkov v ozadju" "Izklop varčevanja z energijo akumulatorja" - "Med snemanjem ali predvajanjem lahko aplikacija %s zajame občutljive podatke, kot so zvok, ki ga predvajate, ter gesla, podatke o plačilu, fotografije in sporočila." + "Med snemanjem ali predvajanjem lahko aplikacija %s zajame morebitne občutljive podatke, ki so prikazani na vašem zaslonu ali se predvajajo iz vaše naprave, vključno z občutljivimi podatki, kot so zvok, gesla, podatki o plačilu, fotografije in sporočila." + "Med snemanjem ali predvajanjem lahko storitev, ki zagotavlja to funkcijo, zajame morebitne občutljive podatke, ki so prikazani na vašem zaslonu ali se predvajajo iz vaše naprave, vključno z občutljivimi podatki, kot so zvok, gesla, podatki o plačilu, fotografije in sporočila." "Med predvajanjem/snemanjem so izpostavljeni občutljivi podatki" "Tega ne prikaži več" "Izbriši vse" "Upravljanje" - "Diskretna obvestila" - "Počisti vsa diskretna obvestila" + + + + "Prikazovanje obvestil je začasno zaustavljeno z načinom »ne moti«" "Začni zdaj" "Ni obvestil" @@ -641,9 +651,11 @@ "Blokiraj" "Prikazuj še naprej" "Minimiraj" - "Diskretno" + + "Še naprej prikazuj brez zvoka" - "Z zvočnim opozorilom" + + "Še naprej opozarjaj" "Izklopi obvestila" "Želite, da so obvestila te aplikacije še naprej prikazana?" @@ -657,10 +669,8 @@ "Za ta obvestila ni mogoče spremeniti nastavitev." "Te skupine obvestil ni mogoče konfigurirati tukaj" "Posredovano obvestilo" - - - - + "Vsa obvestila aplikacije %1$s" + "Pokaži več" "Ta aplikacija uporablja fotoaparat." "Ta aplikacija uporablja mikrofon." "Ta aplikacija prekriva druge aplikacije na zaslonu." @@ -908,7 +918,8 @@ "Dovoli" "Zavrni" "Dotaknite se za načrtovanje varčevanja z energijo akumulatorja" - "Samodejno vklopi, ko je energija akumulatorja na %d %%" + + "Ne, hvala" "Urnik varčevanja z energijo akumulatorja je vklopljen" "Varčevanje z energijo akumulatorja se bo samodejno vklopilo, ko bo energija akumulatorja pod %d %%." @@ -940,6 +951,5 @@ "Premakni zgoraj desno" "Premakni spodaj levo" "Premakni spodaj desno" - - + "Opusti" diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index b4ec0669f649..592915bfcaa1 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -62,9 +62,12 @@ "Korrigjimi i USB-së nuk lejohet" "Përdoruesi i identifikuar aktualisht në këtë pajisje nuk mund ta aktivizojë korrigjimin e USB-së. Për ta përdorur këtë funksion, kalo te përdoruesi parësor." "Porta e USB-së është çaktivizuar" - "Për të mbrojtur pajisjen tënde nga lëngjet apo papastërtitë, porta e USB-së është çaktivizuar dhe nuk do t\'i dallojë aksesorët.\n\nDo të njoftohesh kur të mos ketë rrezik përdorimi përsëri i portës së USB-së." + + "Porta USB është aktivizuar për të zbuluar karikuesit dhe aksesorët" "Aktivizo USB-në" + + "Zmadho për të mbushur ekranin" "Shtrije për të mbushur ekranin" "Pamja e ekranit" @@ -118,6 +121,11 @@ "Anulo" "Konfirmo" "Provo përsëri" + "Rajon bosh, trokit për të anuluar vërtetimin" + "Provo përsëri" + "Po kërkon për fytyrën tënde" + "Fytyra u vërtetua" + "Konfirmuar" "Prek sensorin e gjurmës së gishtit" "Ikona e gjurmës së gishtit" "Po të kërkojmë…" @@ -369,8 +377,7 @@ "Aktive në %s" "Deri në %s" "Tema e errët" - - + "Tema e errët\nKursyesi i baterisë" "NFC" "NFC është çaktivizuar" "NFC është aktivizuar" @@ -445,13 +452,16 @@ "\"Kursyesi i baterisë\" është i aktivizuar" "Pakëson veprimtarinë dhe të dhënat në sfond" "Çaktivizo \"Kursyesin e baterisë\"" - "Gjatë regjistrimit ose transmetimit, %s mund të kapë çdo informacion delikat, si p.sh. audion që luan ti dhe fjalëkalimet e tua, informacionet e pagesës, fotografitë dhe mesazhet." + "Gjatë regjistrimit ose transmetimit, %s mund të regjistrojë çdo informacion të ndjeshëm që shfaqet në ekranin tënd ose luhet nga kjo pajisje, duke përfshirë informacionin e ndjeshëm si p.sh. audion, fjalëkalimet, informacionin e pagesës, fotografitë dhe mesazhet." + "Gjatë regjistrimit ose transmetimit, shërbimi që ofron këtë funksion mund të regjistrojë çdo informacion të ndjeshëm që shfaqet në ekranin tënd ose luhet nga kjo pajisje, duke përfshirë informacionin e ndjeshëm si p.sh. audion, fjalëkalimet, informacionin e pagesës, fotografitë dhe mesazhet." "Ekspozimi i informacioneve delikate gjatë transmetimit/regjistrimit" "Mos e shfaq sërish" "Pastroji të gjitha" "Menaxho" - "Njoftimet me rëndësi të ulët" - "Pastro të gjitha njoftimet me rëndësi të ulët" + + + + "Njoftimet janë vendosur në pauzë nga modaliteti \"Mos shqetëso\"" "Fillo tani" "Asnjë njoftim" @@ -635,9 +645,11 @@ "Blloko" "Vazhdo të shfaqësh" "Minimizo" - "Lehtë" + + "Qëndro në heshtje" - "Ndërprerës" + + "Vazhdo të sinjalizosh" "Çaktivizo njoftimet" "Do të vazhdosh t\'i shfaqësh njoftimet nga ky aplikacion?" @@ -651,10 +663,8 @@ "Këto njoftime nuk mund të modifikohen." "Ky grup njoftimesh nuk mund të konfigurohet këtu" "Njoftim i dërguar me përfaqësues" - - - - + "Të gjitha njoftimet e %1$s" + "Shiko më shumë" "Ky aplikacion po përdor kamerën." "Ky aplikacion po përdor mikrofonin." "Ky aplikacion po shfaqet mbi aplikacionet e tjera në ekran." @@ -716,7 +726,7 @@ "Kyçja e numrave" "Tastiera numerike %1$s" "Sistemi" - "Kreu" + "Ekrani bazë" "Të fundit" "Prapa" "Njoftimet" @@ -898,7 +908,8 @@ "Lejo" "Refuzo" "Trokit për të planifikuar \"Kursyesin e baterisë\"" - "Aktivizo automatikisht kur bateria është në %d%%" + + "Jo" "Planifikimi i \"Kursyesit të baterisë\" është aktivizuar" "\"Kursyesi i baterisë\" do të aktivizohet automatikisht kur bateria të jetë nën %d%%." @@ -930,6 +941,5 @@ "Lëviz lart djathtas" "Zhvendos poshtë majtas" "Lëvize poshtë djathtas" - - + "Hiq" diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index afdedc26b027..c71bbf60462b 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -62,9 +62,12 @@ "Отклањање грешака на USB-у није дозвољено" "Корисник који је тренутно пријављен на овај уређај не може да укључи отклањање грешака на USB-у. Да бисте користили ову функцију, пребаците на примарног корисника." "USB порт је онемогућен" - "Да би се уређај заштитио од течности или нечистоће, USB порт је онемогућен и неће откривати додатну опрему.\n\nОбавестићемо вас када поново будете могли да користите USB порт." + + "USB порт је омогућен ради откривања пуњача и додатне опреме" "Омогући USB" + + "Зумирај на целом екрану" "Развуци на цео екран" "Снимак екрана" @@ -118,6 +121,11 @@ "Откажи" "Потврди" "Пробај поново" + "Празна област, додирните да бисте отказали потврду идентитета" + "Пробајте поново" + "Тражи се ваше лице" + "Лице је потврђено" + "Потврђено" "Додирните сензор за отисак прста" "Икона отиска прста" "Тражимо вас…" @@ -371,8 +379,7 @@ "Укључује се у %s" "До %s" "Тамна тема" - - + "Тамна тема\nУштеда батерије" "NFC" "NFC је онемогућен" "NFC је омогућен" @@ -448,13 +455,16 @@ "Уштеда батерије је укључена" "Смањује перформансе и позадинске податке" "Искључи Уштеду батерије" - "Када снимате или пребацујете, %s може да чува осетљиве информације, као што су звук који репродукујете и лозинке, информације о плаћању, слике и поруке." + "Када снимате или пребацујете, %s може да чува осетљиве информације које се приказују на екрану или репродукују са уређаја, укључујући осетљиве информације као што су звук, лозинке, информације о плаћању, слике и поруке." + "Када снимате или пребацујете, услуга која пружа ову функцију може да чува осетљиве информације које се приказују на екрану или репродукују са уређаја, укључујући осетљиве информације као што су звук, лозинке, информације о плаћању, слике и поруке." "Откривање осетљивих информација током пребацивања/снимања" "Не приказуј поново" "Обриши све" "Управљајте" - "Дискретна обавештења" - "Обришите сва дискретна обавештења" + + + + "Обавештења су паузирана режимом Не узнемиравај" "Започни одмах" "Нема обавештења" @@ -638,9 +648,11 @@ "Блокирај" "Настави да приказујеш" "Умањи" - "Дискретно" + + "Не укључуј звук" - "Ометајућа" + + "Настави са обавештењима" "Искључи обавештења" "Желите ли да се обавештења из ове апликације и даље приказују?" @@ -654,10 +666,8 @@ "Ова обавештења не могу да се мењају." "Ова група обавештења не може да се конфигурише овде" "Обавештење преко проксија" - - - - + "Сва обавештења апликације %1$s" + "Прикажи још" "Ова апликација користи камеру." "Ова апликација користи микрофон." "Ова апликација се приказује преко других апликација на екрану." @@ -903,7 +913,8 @@ "Дозволи" "Одбиј" "Додирните да бисте направили распоред за уштеду батерије" - "Укључује се аутоматски када је батерија на %d%%" + + "Не, хвала" "Распоред за уштеду батерије је укључен" "Уштеда батерије ће се аутоматски укључивати када батерија падне испод %d%%." @@ -935,6 +946,5 @@ "Премести горе десно" "Премести доле лево" "Премести доле десно" - - + "Одбаци" diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 5c3f2f41bc3f..0f39fc2138dc 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -62,9 +62,12 @@ "USB-felsökning är inte tillåtet" "Användaren som är inloggad på enheten för närvarande kan inte aktivera USB-felsökning. Byt till den primära användaren om du vill använda den här funktionen." "USB-porten har inaktiverats" - "USB-porten har inaktiverats för att skydda enheten mot vätska eller smuts. Inga tillbehör kommer att hittas.\n\nDu meddelas när det går att använda USB-porten igen." + + "USB-porten har aktiverats för identifiering av laddare och tillbehör" "Aktivera USB" + + "Zooma för att fylla skärm" "Dra för att fylla skärmen" "Skärmdump" @@ -118,6 +121,11 @@ "Avbryt" "Bekräfta" "Försök igen" + "Området är tomt. Tryck för att avbryta autentiseringen" + "Försök igen" + "Söker efter ditt ansikte" + "Ansiktet har autentiserats" + "Bekräftat" "Tryck på fingeravtryckssensorn" "Ikon för fingeravtryck" "Håller utkik efter dig …" @@ -369,8 +377,7 @@ "På från %s" "Till %s" "Mörkt tema" - - + "Mörkt tema\nBatterisparläge" "NFC" "NFC är inaktiverat" "NFC är aktiverat" @@ -445,13 +452,16 @@ "Batterisparläget är aktiverat" "Minskar prestanda och bakgrundsdata" "Inaktivera batterisparläget" - "%s kan registrera känsliga uppgifter, till exempel ljud som du spelar upp och lösenord, betalningsuppgifter, foton samt meddelanden när du spelar in eller castar." + "När du spelar in eller castar kan %s registrera vilka känsliga uppgifter som helst som visas på skärmen eller spelas upp på enheten, inklusive ljud, lösenord, betalningsuppgifter, foton och meddelanden." + "När du spelar in eller castar kan tjänsten som tillhandahåller funktionen registrera vilka känsliga uppgifter som helst som visas på skärmen eller spelas upp på enheten, inklusive ljud, lösenord, betalningsuppgifter, foton och meddelanden." "Avslöja känsliga uppgifter under inspelning och vid castning" "Visa inte igen" "Rensa alla" "Hantera" - "Aviseringar utan avbrott" - "Rensa alla aviseringar utan avbrott" + + + + "Aviseringar har pausats via Stör ej" "Starta nu" "Inga aviseringar" @@ -635,9 +645,11 @@ "Blockera" "Fortsätt visa" "Minimera" - "Utan avbrott" + + "Fortsätt visa utan ljud" - "Avbrott" + + "Fortsätt meddela" "Inaktivera aviseringar" "Vill du fortsätta visa aviseringar för den här appen?" @@ -651,10 +663,8 @@ "Det går inte att ändra de här aviseringarna." "Den här aviseringsgruppen kan inte konfigureras här" "Avisering via proxy" - - - - + "Alla aviseringar från %1$s" + "Se mer" "Kameran används av appen." "Mikrofonen används av appen." "Appen visas över andra appar på skärmen." @@ -898,7 +908,8 @@ "Tillåt" "Neka" "Tryck för att skapa ett schema för batterisparläget" - "Aktivera automatiskt när batterinivån är på %d %%" + + "Nej tack" "Schema för Batterisparläge aktiverat" "Batterisparläget aktiveras automatiskt när batterinivån är under %d %%." @@ -930,6 +941,5 @@ "Flytta högst upp till höger" "Flytta längst ned till vänster" "Flytta längst ned till höger" - - + "Stäng" diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index a772af2168cf..d91ba6d70a12 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -62,9 +62,12 @@ "Utatuzi wa USB hauruhusiwi" "Mtumiaji aliyeingia katika akaunti kwa kutumia kifaa hiki kwa sasa hawezi kuwasha utatuzi wa USB. Ili utumie kipengele hiki, tumia akaunti ya mtumiaji wa msingi." "Mlango wa USB umezimwa" - "Ili ulinde kifaa chako dhidi ya vitu vya unyevu au uchafu, mlango wa USB umezimwa na hautatambua vifaa vyovyote.\n\nUtaarifiwa itapokuwa salama kutumia mlango wa USB tena." + + "Mlango wa USB umewezeshwa ili utambue chaja na vifuasi" "Washa kipengele cha USB" + + "Kuza ili kujaza skrini" "Tanua ili kujaza skrini" "Pichaskrini" @@ -118,6 +121,11 @@ "Ghairi" "Thibitisha" "Jaribu tena" + "Eneo lisilo na chochote, gusa ili ughairi uthibitishaji" + "Tafadhali jaribu tena" + "Inatafuta uso wako" + "Uso umethibitishwa" + "Imethibitishwa" "Gusa kitambua alama ya kidole" "Aikoni ya alama ya kidole" "Inakutafuta…" @@ -369,8 +377,7 @@ "Itawashwa saa %s" "Hadi %s" "Mandhari Meusi" - - + "Mandhari Meusi\nKiokoa betri" "NFC" "NFC imezimwa" "NFC imewashwa" @@ -445,13 +452,16 @@ "Kiokoa Betri kimewashwa" "Hupunguza utendaji na data ya chini chini" "Zima Kiokoa Betri" - "Inaporekodi au kutuma, %s inaweza kunasa maelezo nyeti, kama vile sauti unazozicheza na manenosiri yako, maelezo ya malipo, picha na ujumbe." + "Inaporekodi au kutuma, %s inaweza kunasa maelezo nyeti yanayoonyeshwa kwenye skrini yako au yanayochezwa kwenye kifaa chako, ikiwa ni pamoja na maelezo nyeti kama vile sauti, manenosiri, maelezo ya malipo, picha na ujumbe." + "Inaporekodi au kutuma, huduma inayotoa utendaji huu inaweza kunasa maelezo yoyote nyeti yanayoonyeshwa kwenye skrini yako au yanayochezwa kwenye kifaa chako, ikiwa ni pamoja na maelezo nyeti kama vile sauti, manenosiri, maelezo ya malipo, picha na ujumbe." "Inatoa maelezo nyeti wakati wa kutuma/kurekodi" "Usionyeshe tena" "Futa zote" "Dhibiti" - "Arifa zisizo na sauti" - "Futa arifa zote zisizo na sauti" + + + + "Kipengele cha Usinisumbue kimesitisha arifa" "Anza sasa" "Hakuna arifa" @@ -635,9 +645,11 @@ "Zuia" "Endelea kuonyesha" "Punguza" - "Bila sauti" + + "Isitoe sauti" - "Za kukatiza" + + "Endelea kutoa arifa" "Zima arifa" "Ungependa kuendelea kuonyesha arifa kutoka programu hii?" @@ -651,10 +663,8 @@ "Arifa hizi haziwezi kubadilishwa." "Kikundi hiki cha arifa hakiwezi kuwekewa mipangilio hapa" "Arifa wakilishi" - - - - + "Arifa zote za %1$s" + "Angalia zaidi" "Programu hii inatumia kamera." "Programu hii inatumia maikrofoni." "Programu hii inachomoza kwenye programu zingine zilizo katika skrini yako." @@ -898,7 +908,8 @@ "Ruhusu" "Kataa" "Gusa ili uratibu wakati wa kuwasha Kiokoa Betri" - "Washa kiokoa betri kiotomatiki chaji ya betri inapofika %d%%" + + "Hapana, asante" "Ratiba ya Kiokoa Betri imewashwa" "Kiokoa Betri kitawaka kiotomatiki baada ya chaji ya betri kufika chini ya %d%%." @@ -930,6 +941,5 @@ "Sogeza juu kulia" "Sogeza chini kushoto" "Sogeza chini kulia" - - + "Ondoa" diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 6124f079b343..172b62cd27fe 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -62,9 +62,12 @@ "USB பிழைதிருத்தம் அனுமதிக்கப்படவில்லை" "தற்போது இந்தச் சாதனத்தில் உள்நுழைந்துள்ள பயனரால் USB பிழைதிருத்தத்தை இயக்க முடியாது. இந்த அம்சத்தை இயக்க, முதன்மைப் பயனருக்கு மாறவும்." "USB போர்ட் முடக்கப்பட்டது" - "தேவையற்றவையில் இருந்து உங்கள் சாதனத்தைப் பாதுகாக்க, USB போர்ட் முடக்கப்பட்டுள்ளது, மேலும் எந்த துணைக் கருவிகளையும் கண்டறியாது.\n\nUSB போர்ட்டை மீண்டும் எப்போது பாதுகாப்பாகப் பயன்படுத்தலாம் என்பதைப் பற்றி உங்களுக்குத் தெரிவிக்கப்படும்." + + "சார்ஜர்களையும் துணைக்கருவிகளையும் கண்டறிவதற்காக USB போர்ட் இயக்கப்பட்டுள்ளது" "USBயை இயக்கு" + + "திரையை நிரப்ப அளவை மாற்று" "திரையை நிரப்ப இழு" "ஸ்கிரீன்ஷாட்" @@ -118,6 +121,11 @@ "ரத்துசெய்" "உறுதிப்படுத்துக" "மீண்டும் முயல்க" + "காலியான பகுதி, அங்கீகாரத்தை ரத்துசெய்யத் தட்டவும்" + "மீண்டும் முயலவும்" + "உங்கள் முகத்தை அங்கீகரிக்கிறது" + "முகம் அங்கீகரிக்கப்பட்டது" + "உறுதிப்படுத்தப்பட்டது" "கைரேகை சென்சாரைத் தொடவும்" "கைரேகை ஐகான்" "உங்கள் முகத்தைத் தேடுகிறது…" @@ -369,8 +377,7 @@ "%sக்கு ஆன் செய்" "%s வரை" "டார்க் தீம்" - - + "டார்க் தீம்\nபேட்டரி சேமிப்பான்" "NFC" "NFC முடக்கப்பட்டது" "NFC இயக்கப்பட்டது" @@ -445,14 +452,15 @@ "பேட்டரி சேமிப்பான் ஆன் செய்யப்பட்டுள்ளது" "செயல்திறனையும் பின்புல டேட்டா உபயோகத்தையும் குறைக்கிறது" "பேட்டரி சேமிப்பானை ஆஃப் செய்" - "ரெக்கார்டிங் செய்யும்போதோ அலைபரப்பும்போதோ நீங்கள் இயக்கும் ஆடியோ, கடவுச்சொற்கள், கட்டணத் தகவல், படங்கள் மற்றும் மெசேஜ்கள் போன்றவற்றை %s ஆப்ஸால் படமெடுக்க இயலும்." + "ரெக்கார்டிங் செய்யும்போதோ அலைபரப்பும்போதோ, உங்கள் திரையில் காட்டப்படும் அல்லது உங்கள் சாதனத்திலிருந்து இயக்கப்படும் (ஆடியோ, கடவுச்சொற்கள், கட்டணத் தகவல், படங்கள், மெசேஜ்கள் உள்ளிட்ட) எந்த ஒரு அதிமுக்கியத் தகவலையும் %s ஆல் படமெடுக்க முடியும்." + "ரெக்கார்டிங் செய்யும்போதோ அலைபரப்பும்போதோ உங்கள் திரையில் காட்டப்படும் அல்லது உங்கள் சாதனத்திலிருந்து இயக்கப்படும் (ஆடியோ, கடவுச்சொற்கள், கட்டணத் தகவல், படங்கள், மெசேஜ்கள் உள்ளிட்ட) எந்த ஒரு அதிமுக்கியத் தகவலையும் இந்தச் செயல்பாட்டை வழங்கும் சேவையால் படமெடுக்க முடியும்." "அலைபரப்பும்போதோ ரெக்கார்டிங் செய்யும்போதோ தனிப்பட்ட விவரங்கள் அறியப்படும் வாய்ப்புள்ளது" "மீண்டும் காட்டாதே" "எல்லாவற்றையும் அழி" "அறிவிப்புகளை நிர்வகி" - + - + "\'தொந்தரவு செய்ய வேண்டாம்\' அம்சத்தின் மூலம் அறிவிப்புகள் இடைநிறுத்தப்பட்டுள்ளன" "இப்போது தொடங்கு" @@ -533,8 +541,7 @@ "திரை பொருத்தப்பட்டது" "பொருத்தியதை அகற்றும் வரை இதைக் காட்சியில் வைக்கும். அகற்ற, முந்தையது மற்றும் மேலோட்டப் பார்வையைத் தொட்டுப் பிடிக்கவும்." "இதற்கான பின்னை அகற்றும் வரை, இந்தப் பயன்முறை செயல்பாட்டிலேயே இருக்கும். அகற்றுவதற்கு, முந்தையது மற்றும் முகப்புப் பொத்தான்களைத் தொட்டுப் பிடிக்கவும்." - - + "பின் செய்திருப்பதை அகற்றும் வரை இதைச் செயல்பாட்டில் வைத்திருக்கும். அதை அகற்றுவதற்கு மேல்நோக்கி ஸ்வைப் செய்து பிடித்திருக்கவும்." "பொருத்தியதை அகற்றும் வரை இதைக் காட்சியில் வைக்கும். அகற்ற, மேலோட்டப் பார்வையைத் தொட்டுப் பிடிக்கவும்." "இதற்கான பின்னை அகற்றும் வரை, இந்தப் பயன்முறை செயல்பாட்டிலேயே இருக்கும். அகற்றுவதற்கு, முகப்புப் பொத்தானைத் தொட்டுப் பிடிக்கவும்." "இந்தத் திரையின் பின்னை அகற்ற, முந்தையது மற்றும் மேலோட்டப் பார்வைப் பொத்தான்களைத் தொட்டுப் பிடிக்கவும்" @@ -623,7 +630,7 @@ "ஆற்றல்மிக்க அறிவிப்புக் கட்டுப்பாடுகள்" "ஆன்" "ஆஃப்" - "ஆற்றல்மிக்க அறிவிப்புக் கட்டுப்பாடுகள் மூலம், பயன்பாட்டின் அறிவிப்புகளுக்கு முக்கியத்துவ நிலையை (0-5) அமைக்கலாம். \n\n""நிலை 5"" \n- அறிவிப்புப் பட்டியலின் மேலே காட்டும் \n- முழுத் திரைக் குறுக்கீட்டை அனுமதிக்கும் \n- எப்போதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டும் \n\n""நிலை 4"" \n- முழுத் திரைக் குறுக்கீட்டைத் தடுக்கும் \n- எப்போதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டும் \n\n""நிலை 3"" \n- முழுத் திரைக் குறுக்கீட்டைத் தடுக்கும் \n- ஒருபோதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டாது \n\n""நிலை 2"" \n- முழுத் திரைக் குறுக்கீட்டைத் தடுக்கும் \n- ஒருபோதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டாது \n- ஒருபோதும் ஒலி எழுப்பாது, அதிர்வுறாது \n\n""நிலை 1"" \n- முழுத் திரைக் குறுக்கீட்டைத் தடுக்கும் \n- ஒருபோதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டாது \n- ஒருபோதும் ஒலி எழுப்பாது அல்லது அதிர்வுறாது \n- லாக் ஸ்கிரீன் மற்றும் நிலைப்பட்டியிலிருந்து மறைக்கும் \n- அறிவிப்புகள் பட்டியலின் கீழே காட்டும் \n\n""நிலை 0"" \n- பயன்பாட்டின் எல்லா அறிவிப்புகளையும் தடுக்கும்" + "ஆற்றல்மிக்க அறிவிப்புக் கட்டுப்பாடுகள் மூலம், ஆப்ஸின் அறிவிப்புகளுக்கு முக்கியத்துவ நிலையை (0-5) அமைக்கலாம். \n\n""நிலை 5"" \n- அறிவிப்புப் பட்டியலின் மேலே காட்டும் \n- முழுத் திரைக் குறுக்கீட்டை அனுமதிக்கும் \n- எப்போதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டும் \n\n""நிலை 4"" \n- முழுத் திரைக் குறுக்கீட்டைத் தடுக்கும் \n- எப்போதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டும் \n\n""நிலை 3"" \n- முழுத் திரைக் குறுக்கீட்டைத் தடுக்கும் \n- ஒருபோதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டாது \n\n""நிலை 2"" \n- முழுத் திரைக் குறுக்கீட்டைத் தடுக்கும் \n- ஒருபோதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டாது \n- ஒருபோதும் ஒலி எழுப்பாது, அதிர்வுறாது \n\n""நிலை 1"" \n- முழுத் திரைக் குறுக்கீட்டைத் தடுக்கும் \n- ஒருபோதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டாது \n- ஒருபோதும் ஒலி எழுப்பாது அல்லது அதிர்வுறாது \n- லாக் ஸ்கிரீன் மற்றும் நிலைப்பட்டியிலிருந்து மறைக்கும் \n- அறிவிப்புகள் பட்டியலின் கீழே காட்டும் \n\n""நிலை 0"" \n- ஆப்ஸின் எல்லா அறிவிப்புகளையும் தடுக்கும்" "அறிவிப்புகள்" "இந்த அறிவிப்புகளை இனி பார்க்கமாட்டீர்கள்" "இந்த அறிவிப்புகள் சிறிதாக்கப்படும்" @@ -638,12 +645,14 @@ "தடு" "அறிவிப்புகளைத் தொடர்ந்து காட்டு" "சிறிதாக்கு" - "ஜென்டில்" + + "அறிவிப்புகளை ஒலியின்றிக் காட்டு" - "இண்ட்டரப்டிவ்" + + "தொடர்ந்து விழிப்பூட்டு" "அறிவிப்புகளை முடக்கு" - "இந்தப் பயன்பாட்டின் அறிவிப்புகளைத் தொடர்ந்து காட்டவா?" + "இந்த ஆப்ஸின் அறிவிப்புகளைத் தொடர்ந்து காட்டவா?" "ஜென்டில்" "முன்னுரிமைப்படுத்தப்பட்டது" "கீழ் இழுக்கும் ஷேடில் வரும் அறிவிப்புகளில் மட்டும் கவனம் செலுத்த உதவுகிறது. எப்போதும் நிசப்தம்." @@ -654,10 +663,8 @@ "இந்த அறிவிப்புகளை மாற்ற இயலாது." "இந்த அறிவுப்புக் குழுக்களை இங்கே உள்ளமைக்க இயலாது" "ப்ராக்ஸியான அறிவிப்பு" - - - - + "அனைத்து %1$s அறிவிப்புகளும்" + "மேலும் காட்டு" "இந்த ஆப்ஸானது கேமராவை உபயோகிக்கிறது." "இந்த ஆப்ஸானது, மைக்ரோஃபோனை உபயோகிக்கிறது." "இந்த ஆப்ஸானது, உங்கள் திரையில் பிற ஆப்ஸின் இடைமுகத்தின் மேல் தோன்றுகிறது." @@ -894,14 +901,15 @@ "%s மூலம் டேட்டா அல்லது இணையத்தை உங்களால் பயன்படுத்த முடியாது. வைஃபை வழியாக மட்டுமே இணையத்தைப் பயன்படுத்த முடியும்." "உங்கள் மொபைல் நிறுவனம்" "அனுமதிக் கோரிக்கையை ஆப்ஸ் மறைப்பதால், அமைப்புகளால் உங்கள் பதிலைச் சரிபார்க்க முடியாது." - "%1$s ஆப்ஸை, %2$s பயன்பாட்டின் விழிப்பூட்டல்களைக் காண்பிக்க அனுமதிக்கவா?" + "%1$s ஆப்ஸை, %2$s ஆப்ஸின் விழிப்பூட்டல்களைக் காண்பிக்க அனுமதிக்கவா?" "- இது, %1$s பயன்பாட்டிலிருந்து தகவலைப் படிக்கும்" "- இது, %1$s பயன்பாட்டிற்குள் சென்று செயல்பாடுகளில் ஈடுபடும்" "எல்லா பயன்பாட்டிலிருந்தும் விழிப்பூட்டல்களைக் காண்பிக்க, %1$s ஆப்ஸை அனுமதி" "அனுமதி" "நிராகரி" "பேட்டரி சேமிப்பானை ஆன் செய்வது தொடர்பாகத் திட்டமிட, தட்டவும்" - "பேட்டரியின் அளவு %d%% ஆக இருக்கும்போது, தானாக ஆன் செய்" + + "வேண்டாம்" "திட்டமிட்ட பேட்டரி சேமிப்பான் ஆன் செய்யப்பட்டது" "பேட்டரியின் அளவு %d%%க்குக் கீழ் குறையும்போது, பேட்டரி சேமிப்பான் தானாகவே ஆன் செய்யப்படும்." @@ -922,8 +930,7 @@ "%1$s ஆப்ஸைத் திறக்கும்" "%1$s குமிழ்களுக்கான அமைப்புகள்" "%1$s ஆப்ஸிலிருந்து குமிழ்களை அனுமதிக்கவா?" - - + "நிர்வகி" "நிராகரி" "அனுமதி" "பிறகு கேள்" @@ -934,6 +941,5 @@ "மேலே வலப்புறமாக நகர்த்து" "கீழே இடப்புறமாக நகர்த்து" "கீழே வலதுபுறமாக நகர்த்து" - - + "மூடுக" diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index d2b117cc4f15..033fce46d8d5 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -62,9 +62,12 @@ "USB డీబగ్గింగ్‌కి అనుమతి లేదు" "ఈ పరికరానికి ప్రస్తుతం సైన్ ఇన్ చేసిన వినియోగదారు USB డీబగ్గింగ్ ఆన్ చేయలేరు. ఈ ఫీచర్ ఉపయోగించడానికి, ప్రాథమిక వినియోగదారుకి మారాలి." "USB పోర్ట్‌ నిలిపివేయబడింది" - "మీ పరికరాన్ని ద్రవ లేదా వ్యర్థ పదార్థాల నుండి కాపాడే తరుణంలో USB పోర్ట్‌ని నిలిపివేయడంతో పాటు ఎలాంటి యాక్సెసరీస్‌ను గుర్తించలేదు.\n\n కనుక USB పోర్ట్‌ని ఉపయోగించడం సురక్షితం అయ్యాక, మళ్లీ మీకో నోటిఫికేషన్‌ రూపంలో తెలియజేస్తాం." + + "ఛార్జర్‌లు, యాక్సెసరీలను గుర్తించే విధంగా USB పోర్ట్ ప్రారంభించబడింది" "USBని ప్రారంభించు" + + "స్క్రీన్‌కు నింపేలా జూమ్ చేయండి" "స్క్రీన్‌కు నింపేలా విస్తరించండి" "స్క్రీన్‌షాట్" @@ -118,6 +121,11 @@ "రద్దు చేయి" "నిర్ధారించు" "మళ్లీ ప్రయత్నించు" + "ఖాళీ ప్రదేశం, ప్రామాణీకరణను రద్దు చేయడానికి నొక్కండి" + "దయచేసి మళ్ళీ ప్రయత్నించండి" + "మీ ముఖాన్ని క్యాప్చర్ చేస్తోంది" + "ముఖం ప్రామాణీకరించబడింది" + "నిర్ధారించబడింది" "వేలిముద్ర సెన్సార్‌ను తాకండి" "వేలిముద్ర చిహ్నం" "మీ కోసం చూస్తోంది…" @@ -369,8 +377,7 @@ "%sకి" "%s వరకు" "ముదురు రంగు థీమ్" - - + "ముదురు రంగు థీమ్\nబ్యాటరీ సేవర్" "NFC" "NFC నిలిపివేయబడింది" "NFC ప్రారంభించబడింది" @@ -445,14 +452,15 @@ "బ్యాటరీ సేవర్ ఆన్‌లో ఉంది" "పనితీరుని మరియు నేపథ్య డేటాను తగ్గిస్తుంది" "బ్యాటరీ సేవర్‌ను ఆఫ్ చేయండి" - "రికార్డ్ చేేస్తున్నప్పుడు లేదా ప్రసారం చేస్తున్నప్పుడు, %s ఏదైనా గోప్యమైన సమాచారాన్ని, అంటే మీరు ప్లే చేసే ఆడియో, మీ పాస్‌వర్డ్‌లు, చెల్లింపు సమాచారం, ఫోటోలు, సందేశాలు లాంటివి క్యాప్చర్ చేయగలుగుతుంది." + "రికార్డ్ చేస్తున్నప్పుడు లేదా ప్రసారం చేస్తున్నప్పుడు, మీ స్క్రీన్‌పై ప్రదర్శించబడిన లేదా మీ పరికరం నుండి ప్లే చేయబడిన ఆడియో, పాస్‌వర్డ్‌లు, చెల్లింపు సమాచారం, ఫోటోలు మరియు సందేశాలతో సహా గోప్యమైన సమాచారాన్ని %s క్యాప్చర్ చేయగలుగుతుంది." + "రికార్డ్ చేస్తున్నప్పుడు లేదా ప్రసారం చేస్తున్నప్పుడు, మీ స్క్రీన్‌పై ప్రదర్శించబడిన లేదా మీ పరికరం నుండి ప్లే చేయబడిన ఆడియో, పాస్‌వర్డ్‌లు, చెల్లింపు సమాచారం, ఫోటోలు మరియు సందేశాలతో సహా గోప్యమైన సమాచారాన్ని ఈ ఫంక్షన్‌ను అందిస్తున్న సేవా ప్రదాత క్యాప్చర్ చేయగలుగుతుంది." "ప్రసారం/రికార్డ్ అయ్యే సమయాలలో గోప్యమైన సమాచారాన్ని బహిర్గతపరచడం" "మళ్లీ చూపవద్దు" "అన్నీ క్లియర్ చేయండి" "నిర్వహించండి" - + - + "అంతరాయం కలిగించవద్దు ద్వారా నోటిఫికేషన్‌లు పాజ్ చేయబడ్డాయి" "ఇప్పుడే ప్రారంభించు" @@ -637,9 +645,11 @@ "బ్లాక్ చేయి" "చూపిస్తూనే ఉండు" "కుదించు" - "సున్నితం" + + "నిశబ్దంగా తెలియజేయి" - "అంతరాయం" + + "ఎప్పటికప్పుడు హెచ్చరించు" "నోటిఫికేషన్‌లను ఆఫ్ చేయి" "ఈ యాప్ నుండి నోటిఫికేషన్‌లను చూపిస్తూ ఉండాలా?" @@ -653,10 +663,8 @@ "ఈ నోటిఫికేషన్‌లను సవరించడం వీలుపడదు." "ఈ నోటిఫికేషన్‌ల సమూహాన్ని ఇక్కడ కాన్ఫిగర్ చేయలేము" "ప్రాక్సీ చేయబడిన నోటిఫికేషన్" - - - - + "అన్ని %1$s నోటిఫికేషన్‌లు" + "మరిన్ని చూడండి" "ఈ యాప్ ఈ కెమెరాను ఉపయోగిస్తోంది." "ఈ యాప్ మైక్రోఫోన్‌ను ఉపయోగిస్తుంది." "ఈ యాప్ మీ స్క్రీన్‌లోని ఇతర యాప్‌లపై ప్రదర్శించబడుతోంది." @@ -900,7 +908,8 @@ "అనుమతించు" "తిరస్కరించు" "బ్యాటరీ సేవర్‌ని షెడ్యూల్ చేయడానికి నొక్కండి" - "బ్యాటరీ %d%% ఉన్నప్పుడు ఆటోమేటిక్‌గా ఆన్ అవుతుంది" + + "వద్దు, ధన్యవాదాలు" "బ్యాటరీ సేవర్ షెడ్యూల్ ఆన్ చేయబడింది" "బ్యాటరీ %d%% కంటే తగ్గినప్పుడు బ్యాటరీ సేవర్ ఆటోమేటిక్‌గా ఆన్ అవుతుంది." @@ -932,6 +941,5 @@ "ఎగువ కుడివైపునకు జరుపు" "దిగువ ఎడమవైపునకు తరలించు" "దిగవు కుడివైపునకు జరుపు" - - + "విస్మరించు" diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 5d50b16cf9ff..465a2b8b917b 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -62,9 +62,12 @@ "ไม่อนุญาตให้แก้ไขข้อบกพร่องผ่าน USB" "ผู้ใช้ที่ลงชื่อเข้าใช้อุปกรณ์อยู่ในขณะนี้ไม่สามารถเปิดการแก้ไขข้อบกพร่องผ่าน USB ได้ หากต้องการใช้ฟีเจอร์นี้ ให้เปลี่ยนไปเป็นผู้ใช้หลัก" "พอร์ต USB ถูกปิดใช้" - "พอร์ต USB ถูกปิดใช้และจะไม่ตรวจจับอุปกรณ์เสริมใดๆ เพื่อปกป้องอุปกรณ์จากของเหลวและฝุ่นละออง \n\nคุณจะได้รับแจ้งเมื่อใช้พอร์ต USB ได้อย่างปลอดภัยอีกครั้ง" + + "เปิดใช้พอร์ต USB แล้วเพื่อตรวจหาที่ชาร์จและอุปกรณ์เสริม" "เปิดใช้ USB" + + "ขยายจนเต็มหน้าจอ" "ยืดจนเต็มหน้าจอ" "ภาพหน้าจอ" @@ -99,7 +102,7 @@ "กลับ" "หน้าแรก" "เมนู" - "การเข้าถึงพิเศษ" + "การช่วยเหลือพิเศษ" "หมุนหน้าจอ" "ภาพรวม" "ค้นหา" @@ -118,6 +121,11 @@ "ยกเลิก" "ยืนยัน" "ลองอีกครั้ง" + "พื้นที่ว่าง แตะเพื่อยกเลิกการตรวจสอบสิทธิ์" + "โปรดลองอีกครั้ง" + "กำลังมองหาใบหน้าของคุณ" + "ตรวจสอบสิทธิ์ใบหน้าแล้ว" + "ยืนยันแล้ว" "แตะเซ็นเซอร์ลายนิ้วมือ" "ไอคอนลายนิ้วมือ" "กำลังหาใบหน้าคุณ…" @@ -369,8 +377,7 @@ "เปิดเวลา %s" "จนถึง %s" "ธีมสีเข้ม" - - + "ทีมสีเข้ม\nโหมดประหยัดแบตเตอรี่" "NFC" "NFC ถูกปิดใช้งาน" "เปิดใช้งาน NFC แล้ว" @@ -445,13 +452,16 @@ "เปิดโหมดประหยัดแบตเตอรี่อยู่" "ลดการใช้แบตเตอรี่และอินเทอร์เน็ตที่ใช้งานอยู่เบื้องหลัง" "ปิดโหมดประหยัดแบตเตอรี่" - "ขณะที่กำลังบันทึกหรือแคสต์ %s อาจบันทึกข้อมูลที่ละเอียดอ่อน เช่น เสียงที่คุณเล่นและรหัสผ่านของคุณ รวมถึงข้อมูลการชำระเงิน รูปภาพ และข้อความ" + "ขณะที่กำลังบันทึกหรือแคสต์ %s มีสิทธิ์บันทึกข้อมูลที่ละเอียดอ่อนซึ่งแสดงบนหน้าจอหรือเล่นจากอุปกรณ์ของคุณ เช่น เสียง รหัสผ่าน ข้อมูลการชำระเงิน รูปภาพ และข้อความ" + "ขณะที่กำลังบันทึกหรือแคสต์ บริการที่มีฟังก์ชันนี้มีสิทธิ์บันทึกข้อมูลที่ละเอียดอ่อนซึ่งแสดงบนหน้าจอหรือเล่นจากอุปกรณ์ของคุณ เช่น เสียง รหัสผ่าน ข้อมูลการชำระเงิน รูปภาพ และข้อความ" "มีการเปิดเผยข้อมูลที่ละเอียดอ่อนระหว่างการแคสต์/บันทึก" "ไม่ต้องแสดงข้อความนี้อีก" "ล้างทั้งหมด" "จัดการ" - "การแจ้งเตือนช่วยจำ" - "ล้างการแจ้งเตือนช่วยจำทั้งหมด" + + + + "หยุดการแจ้งเตือนชั่วคราวโดย \"ห้ามรบกวน\"" "เริ่มเลย" "ไม่มีการแจ้งเตือน" @@ -635,9 +645,11 @@ "บล็อก" "แสดงต่อไป" "ย่อเล็กสุด" - "แจ้งเตือนเบาๆ" + + "ปิดเสียงไว้" - "แจ้งเตือนแบบขัดจังหวะ" + + "แจ้งเตือนต่อไป" "ปิดการแจ้งเตือน" "แสดงการแจ้งเตือนจากแอปนี้ต่อไปไหม" @@ -651,10 +663,8 @@ "แก้ไขการแจ้งเตือนเหล่านี้ไม่ได้" "การแจ้งเตือนกลุ่มนี้กำหนดค่าที่นี่ไม่ได้" "การแจ้งเตือนที่ผ่านพร็อกซี" - - - - + "การแจ้งเตือนทั้งหมดของ %1$s" + "ดูเพิ่ม" "แอปนี้กำลังใช้กล้อง" "แอปนี้กำลังใช้ไมโครโฟน" "แอปนี้กำลังแสดงทับแอปอื่นๆ ในหน้าจอ" @@ -898,7 +908,8 @@ "อนุญาต" "ปฏิเสธ" "แตะเพื่อตั้งเวลาโหมดประหยัดแบตเตอรี่" - "เปิดโดยอัตโนมัติเมื่อแบตเตอรี่เหลือ %d%%" + + "ไม่เป็นไร" "เปิดใช้กำหนดเวลาโหมดประหยัดแบตเตอรี่อยู่" "โหมดประหยัดแบตเตอรี่จะเปิดโดยอัตโนมัติเมื่อแบตเตอรี่เหลือไม่ถึง %d%%" @@ -930,6 +941,5 @@ "ย้ายไปด้านขวาบน" "ย้ายไปด้านซ้ายล่าง" "ย้ายไปด้านขาวล่าง" - - + "ปิด" diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 5be6a3bf12bc..8a832b0ccbf8 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -62,9 +62,12 @@ "Hindi pinapayagan ang pagde-debug sa pamamagitan ng USB" "Hindi mao-on ng user na kasalukuyang naka-sign in sa device na ito ang pag-debug ng USB. Upang magamit ang feature na ito, lumipat sa pangunahing user." "Na-disable ang USB port" - "Para protektahan ang iyong device sa liquid o debris, na-disable ang USB port at hindi ito makaka-detect ng anumang accessory.\n\nMaaabisuhan ka kapag ligtas na gamitin muli ang USB port." + + "Na-enable ang USB port para ma-detect ang mga charger at accessory" "I-enable ang USB" + + "I-zoom upang punan screen" "I-stretch upang mapuno screen" "Screenshot" @@ -118,6 +121,11 @@ "Kanselahin" "Kumpirmahin" "Subukang muli" + "Walang laman na rehiyon, mag-tap para kanselahin ang pag-authenticate" + "Pakisubukan ulit" + "Hinahanap ang iyong mukha" + "Na-authenticate ang mukha" + "Nakumpirma" "Pindutin ang fingerprint sensor" "Icon ng fingerprint" "Hinahanap ka…" @@ -238,7 +246,7 @@ "Naka-on ang pag-uulat ng lokasyon." "Na-off ang pag-uulat ng lokasyon." "Na-on ang pag-uulat ng lokasyon." - "Alarm set para sa %s." + "Nakatakda ang alarm nang %s." "Isara ang panel." "Higit pang oras." "Mas kaunting oras." @@ -369,8 +377,7 @@ "Mao-on sa ganap na %s" "Hanggang %s" "Madilim na Tema" - - + "Madilim na Tema\nPangtipid sa Baterya" "NFC" "Naka-disable ang NFC" "Naka-enable ang NFC" @@ -445,13 +452,16 @@ "Naka-on ang Pangtipid sa Baterya" "Binabawasan ang performance at data sa background" "I-off ang Pangtipid sa Baterya" - "Habang nagre-record o nagka-cast, makukuha ng %s ang anumang sensitibong impormasyon, gaya ng audio na pine-play mo at iyong mga password, impormasyon sa pagbabayad, mga larawan, at mga mensahe." + "Habang nagre-record o nagka-cast, puwedeng kunin ng %s ang anumang sensitibong impormasyong ipinapakita sa iyong screen o pine-play mula sa device mo, kasama ang sensitibong impormasyon gaya ng audio, mga password, impormasyon sa pagbabayad, mga larawan, at mga mensahe." + "Habang nagre-record o nagka-cast, puwedeng kunin ng serbisyong nagbibigay ng function na ito ang anumang sensitibong impormasyong ipinapakita sa iyong screen o pine-play mula sa device mo, kasama ang sensitibong impormasyon gaya ng audio, mga password, impormasyon sa pagbabayad, mga larawan, at mga mensahe." "Maglalantad ng sensitibong impormasyon habang nagka-cast/nagre-record" "Huwag ipakitang muli" "I-clear lahat" "Pamahalaan" - "Mga banayad na notification" - "I-clear ang lahat ng banayad na notification" + + + + "Mga notification na na-pause ng Huwag Istorbohin" "Magsimula ngayon" "Walang mga notification" @@ -635,9 +645,11 @@ "I-block" "Patuloy na ipakita" "I-minimize" - "Malumanay" + + "Manatiling naka-silent" - "Nakakaabala" + + "Patuloy na mag-alerto" "I-off ang mga notification" "Patuloy na ipakita ang mga notification mula sa app na ito?" @@ -651,10 +663,8 @@ "Hindi puwedeng baguhin ang mga notification na ito." "Hindi mako-configure dito ang pangkat na ito ng mga notification" "Na-proxy na notification" - - - - + "Lahat ng notification ng %1$s" + "Tumingin pa" "Ginagamit ng app na ito ang camera." "Ginagamit ng app na ito ang mikropono." "Ipinapakita ang app na ito sa ibabaw ng iba pang app sa iyong screen." @@ -898,7 +908,8 @@ "Payagan" "Tanggihan" "I-tap para iiskedyul ang Pangtipid sa Baterya" - "Awtomatikong i-on kapag %d%% na ang baterya" + + "Hindi, salamat na lang" "Na-on ang iskedyul ng Pangtipid sa Baterya" "Awtomatikong mao-on ang Pangtipid sa Baterya kapag mas mababa na sa %d%% ang baterya." @@ -930,6 +941,5 @@ "Ilipat sa kanan sa itaas" "Ilipat sa kaliwa sa ibaba" "Ilipat sa kanan sa ibaba" - - + "I-dismiss" diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 7cfbb13e3600..c91b55101f2b 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -62,9 +62,12 @@ "USB hata ayıklama işlevine izin verilmiyor" "Bu cihazda geçerli olarak oturum açmış olan kullanıcı, USB hata ayıklama özelliğini açamaz. Bu özelliği kullanmak için birincil kullanıcıya geçin." "USB bağlantı noktası devre dışı bırakıldı" - "Cihazınızı sıvılardan veya tozlardan korumak için USB bağlantı noktası devre dışı bırakıldı ve aksesuarları algılamayacak.\n\nUSB bağlantı noktasını tekrar güvenli bir şekilde kullanabileceğiniz zaman bilgilendirileceksiniz." + + "USB bağlantı noktası, şarj cihazlarını ve aksesuarları algılamak üzere etkinleştirildi" "USB\'yi etkinleştir" + + "Yakınlaştır (ekranı kaplasın)" "Genişlet (ekran kapansın)" "Ekran görüntüsü" @@ -118,6 +121,11 @@ "İptal" "Onaylayın" "Tekrar dene" + "Boş alan, yetkilendirmeyi iptal etmek için dokunun" + "Lütfen tekrar deneyin" + "Yüzünüz aranıyor" + "Yüz kimliği doğrulandı" + "Onaylandı" "Parmak izi sensörüne dokunun" "Parmak izi simgesi" "Yüzünüz tanınmaya çalışılıyor…" @@ -369,8 +377,7 @@ "Şu saatte açılacak: %s" "Şu saate kadar: %s" "Koyu Tema" - - + "Koyu Tema\nPil tasarrufu" "NFC" "NFC devre dışı" "NFC etkin" @@ -445,13 +452,16 @@ "Pil Tasarrufu açık" "Performansı ve arka plan verilerini azaltır" "Pil Tasarrufu\'nu kapat" - "Kayıt veya yayın sırasında %s, çaldığınız sesler ve şifreleriniz, ödeme bilgileriniz, fotoğraflarınız ve mesajlarınız gibi hassas bilgileri yakalayabilir." + "Kayıt veya yayın sırasında %s, ekranınızda gösterilen veya cihazınızdan oynatılan ses, şifre, ödeme bilgileri, fotoğraflar ve mesajlar gibi hassas bilgileri yakalayabilir." + "Kayıt veya yayın sırasında bu işlevi sağlayan servis, ekranınızda gösterilen veya cihazınızdan oynatılan ses, şifre, ödeme bilgileri, fotoğraflar ve mesajlar gibi hassas bilgileri yakalayabilir." "Yayın/kayıt sırasında hassas bilgileri gösterme" "Bir daha gösterme" "Tümünü temizle" "Yönet" - "Sessiz bildirimler" - "Sessiz bildirimlerin tümünü temizle" + + + + "Bildirimler, Rahatsız Etmeyin özelliği tarafından duraklatıldı" "Şimdi başlat" "Bildirim yok" @@ -635,9 +645,11 @@ "Engelle" "Göstermeye devam et" "Küçült" - "Sessiz" + + "Sessiz uyarı göster" - "Çalışmayı kesintiye uğratan" + + "Uyarıda bulunmaya devam et" "Bildirimleri kapat" "Bu uygulamadan gelen bildirimler gösterilmeye devam edilsin mi?" @@ -651,10 +663,8 @@ "Bu bildirimler değiştirilemez." "Bu bildirim grubu burada yapılandırılamaz" "Proxy uygulanan bildirim" - - - - + "Tüm %1$s bildirimleri" + "Daha fazla göster" "Bu uygulama kamerayı kullanıyor." "Bu uygulama mikrofonu kullanıyor." "Bu uygulama, ekranınızdaki diğer uygulamaların üzerinde görüntüleniyor." @@ -898,7 +908,8 @@ "İzin ver" "Reddet" "Pil Tasarrufunu programlamak için dokunun" - "Pil %%%d düzeyinin altına düştüğünde otomatik olarak aç" + + "Hayır, teşekkürler" "Pil Tasarruf programı açık" "Pil %%%d düzeyinin altına düştüğünde Pil Tasarrufu otomatik olarak açılacaktır." @@ -930,6 +941,5 @@ "Sağ üste taşı" "Sol alta taşı" "Sağ alta taşı" - - + "Kapat" diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 9858a2cb7cfa..7af05cdeb2d0 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -62,9 +62,12 @@ "Ви не можете вмикати налагодження USB" "Користувач поточного облікового запису не може вмикати налагодження USB. Щоб увімкнути цю функцію, увійдіть в обліковий запис основного користувача." "USB-порт вимкнено" - "Щоб захистити ваш пристрій від рідини та сміття, USB-порт вимкнено. Він не виявлятиме жодних аксесуарів.\n\nКоли USB-порт можна буде безпечно використовувати, ви отримаєте сповіщення." + + "Порт USB виявлятиме зарядні пристрої та аксесуари" "Увімкнути USB" + + "Масштабув. на весь екран" "Розтягнути на весь екран" "Знімок екрана" @@ -118,6 +121,11 @@ "Скасувати" "Підтвердити" "Повторити спробу" + "Порожнє місце, торкніться, щоб скасувати автентифікацію" + "Повторіть спробу" + "Триває розпізнавання обличчя" + "Обличчя автентифіковано" + "Підтверджено" "Торкніться сканера відбитків пальців" "Значок відбитка пальця" "Пошук обличчя…" @@ -373,8 +381,7 @@ "Вмикається о %s" "До %s" "Темна тема" - - + "Нічний режим\nЕнергозбереження" "NFC" "NFC вимкнено" "NFC ввімкнено" @@ -451,13 +458,16 @@ "Режим економії заряду акумулятора ввімкнено" "Знижується продуктивність і обмежуються фонові дані" "Вимкнути режим економії заряду акумулятора" - "Під час запису або трансляції додаток %s може фіксувати будь-яку конфіденційну інформацію, зокрема відтворюване аудіо, паролі, платіжну інформацію, фотографії та повідомлення." + "Під час запису або трансляції додаток %s може фіксувати будь-яку конфіденційну інформацію (зокрема, аудіо, паролі, платіжну інформацію, фотографії та повідомлення), яка з\'являється на екрані або відтворюється на пристрої." + "Під час запису або трансляції сервіс, що надає цю функцію, може фіксувати будь-яку конфіденційну інформацію (зокрема, аудіо, паролі, платіжну інформацію, фотографії та повідомлення), яка з\'являється на екрані або відтворюється на пристрої." "Розкриття конфіденційної інформації під час трансляції або запису" "Більше не показувати" "Очистити все" "Керувати" - "Тихі сповіщення" - "Очистити всі тихі сповіщення" + + + + "Режим \"Не турбувати\" призупинив сповіщення" "Почати зараз" "Сповіщень немає" @@ -641,9 +651,11 @@ "Блокувати" "Показувати надалі" "Згорнути" - "Тихо" + + "Без звуку" - "Зі звуком" + + "Отримувати сповіщення" "Вимкнути сповіщення" "Чи показувати сповіщення з цього додатка надалі?" @@ -657,10 +669,8 @@ "Ці сповіщення не можна змінити." "Цю групу сповіщень не можна налаштувати тут" "Проксі-сповіщення" - - - - + "Усі сповіщення від додатка %1$s" + "Показати більше" "Цей додаток використовує камеру." "Цей додаток використовує мікрофон." "Цей додаток відображається поверх інших додатків на екрані." @@ -908,7 +918,8 @@ "Дозволити" "Відмовити" "Торкніться, щоб увімкнути автоматичний режим економії заряду акумулятора" - "Вмикати автоматично, коли заряд акумулятора знижується до %d%%" + + "Ні, дякую" "Автоматичний режим економії заряду акумулятора ввімкнено" "Режим економії заряду акумулятора вмикається автоматично, коли рівень заряду нижчий за %d%%." @@ -940,6 +951,5 @@ "Перемістити праворуч угору" "Перемістити ліворуч униз" "Перемістити праворуч униз" - - + "Закрити" diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 4c1be1b2199a..05f90f9a1b6a 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -62,9 +62,12 @@ "‏USB ڈیبگ کرنے کی اجازت نہیں ہے" "‏اس آلہ پر فی الحال سائن ان کردہ صارف USB ڈیبگنگ آن نہیں کر سکتا۔ اس خصوصیت کا استعمال کرنے کیلئے، ابتدائی صارف پر سوئچ کریں۔" "‏USB پورٹ غیر فعال ہو گیا" - "‏آپ کے آلے کی سیال یا دھول سے حفاظت کرنے کیلئے، USB پورٹ کو غیر فعال کر دیا گیا ہے اور یہ کسی لوازم کا پتہ نہیں لگا پائے گا۔\n\nUSB پورٹ کا دوبارہ استعمال کرنا محفوظ ہونے پر آپ کو مطلع کیا جائے گا۔" + + "‏چارجرز اور لوازمات کا پتا لگانے کے لیے USB پورٹ فعال ہے" "‏USB پورٹ فعال کریں" + + "پوری سکرین پر زوم کریں" "پوری سکرین پر پھیلائیں" "اسکرین شاٹ" @@ -101,7 +104,7 @@ "مینو" "ایکسیسبیلٹی" "اسکرین کو گھمائیں" - "مجموعی جائزہ" + "عمومی جائزہ" "تلاش کریں" "کیمرا" "فون" @@ -118,6 +121,11 @@ "منسوخ کریں" "تصدیق کریں" "دوبارہ کوشش کریں" + "خالی جگہیں، تصدیق کو منسوخ کرنے کے لیے تھپتھپائیں" + "براہ کرم دوبارہ کوشش کریں" + "آپ کا چہرہ تلاش کیا جا رہا ہے" + "چہرے کی تصدیق ہو گئی" + "تصدیق شدہ" "فنگر پرنٹ سینسر پر ٹچ کریں" "فنگر پرنٹ آئیکن" "آپ کے لیے تلاش کیا جا رہا ہے…" @@ -210,7 +218,7 @@ "فوری ترتیبات۔" "مقفل اسکرین۔" "ترتیبات" - "مجموعی جائزہ۔" + "عمومی جائزہ۔" "دفتری مقفل اسکرین" "بند کریں" "%1$s۔" @@ -369,8 +377,7 @@ "آن ہوگی بوقت %s" "%s تک" "گہری تھیم" - - + "گہری تھیم\nبیٹری سیور" "NFC" "‏NFC غیر فعال ہے" "‏NFC فعال ہے" @@ -445,14 +452,15 @@ "بیٹری سیور آن ہے" "کارکردگی اور پس منظر کا ڈیٹا کم کر دیتا ہے" "بیٹری سیور آف کریں" - "ریکارڈ یا کاسٹ کرنے کے دوران، %s کوئی بھی حساس معلومات، جیسے کہ وہ آڈیو جسے آپ چلاتے ہیں اور آپ کے پاس ورڈز، ادائیگی کی معلومات، تصاویر اور پیغامات کو کیپچر کر سکتی ہے۔" + "ریکارڈ یا کاسٹ کرنے کے دوران، %s کسی بھی ایسی حساس معلومات کو کیپچر کر سکتا ہے جو آپ کی اسکرین پر ڈسپلے ہوتی ہے یا آپ کے آلہ سے چلائی جاتی ہے، بشمول حساس معلومات جیسے کہ آڈیو، پاسورڈز، ادائیگی کی معلومات، تصاویر اور پیغامات۔" + "ریکارڈ یا کاسٹ کرنے کے دوران، اس فنکشن کی خدمت کا فراہم کنندہ کسی بھی ایسی حساس معلومات کو کیپچر کر سکتا ہے جو آپ کی اسکرین پر ڈسپلے ہوتی ہے یا آپ کے آلہ سے چلائی جاتی ہے، بشمول حساس معلومات جیسے کہ آڈیو، پاسورڈز، ادائیگی کی معلومات، تصاویر اور پیغامات۔" "کاسٹ/ریکارڈ کرنے کے دوران حساس معلومات کا افشاء کیا جا رہا ہے" "دوبارہ نہ دکھائیں" "سبھی کو صاف کریں" "نظم کریں" - + - + "\'ڈسٹرب نہ کریں\' کے ذریعے اطلاعات کو موقوف کیا گیا" "ابھی شروع کریں" @@ -582,7 +590,7 @@ "جب چارج نہ ہو رہا ہو تو بیٹری کی سطح کی فیصد اسٹیٹس بار آئیکن کے اندر دکھائیں" "فوری ترتیبات" "اسٹیٹس بار" - "مجموعی جائزہ" + "عمومی جائزہ" "‏سسٹم UI ڈیمو موڈ" "ڈیمو موڈ فعال کریں" "ڈیمو موڈ دکھائیں" @@ -637,9 +645,11 @@ "مسدود کریں" "دکھانا جاری رکھیں" "چھوٹا کریں" - "لطیف" + + "خاموش رہیں" - "خلل انداز" + + "متنبہ کرنا جاری رکھیں" "اطلاعات کو آف کریں" "اس ایپ کی طرف سے اطلاعات دکھانا جاری رکھیں؟" @@ -653,10 +663,8 @@ "ان اطلاعات کی ترمیم نہیں کی جا سکتی۔" "اطلاعات کے اس گروپ کو یہاں کنفیگر نہیں کیا جا سکتا" "پراکسی اطلاع" - - - - + "سبھی %1$s اطلاعات" + "مزید دیکھیں" "یہ ایپ کیمرے کا استعمال کر رہی ہے۔" "یہ ایپ مائیکروفون کا استعمال کر رہی ہے۔" "یہ ایپ آپ کی اسکرین پر دیگر ایپس پر ڈسپلے کر رہی ہے۔" @@ -900,7 +908,8 @@ "اجازت دیں" "مسترد کریں" "بیٹری سیور شیڈول کرنے کے لیے تھپتھپائیں" - "جب بیٹری %d%% ہو جائے تو خودکار طور پر آن کریں" + + "نہیں شکریہ" "بیٹری سیور شیڈول آن ہو گیا" "بیٹری کے %d%% سے کم ہونے پر بیٹری سیور خودکار طور پر آن ہو جائے گا۔" @@ -932,6 +941,5 @@ "اوپر دائیں جانب لے جائيں" "نیچے بائیں جانب لے جائیں" "نیچے دائیں جانب لے جائیں" - - + "برخاست کریں" diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 52ca26382f5e..21615274d4d5 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -62,9 +62,12 @@ "USB orqali nosozliklarni tuzatishga ruxsat berilmagan" "Ayni paytda ushbu qurilmaga o‘z hisobi bilan kirgan foydalanuvchi USB orqali nosozliklarni tuzatish funksiyasini yoqa olmaydi. Bu funksiyadan foydalanish uchun asosiy foydalanuvchi profiliga o‘ting." "USB port faolsizlashtirildi" - "Qurilmangizni suyuqlik va turli parchalardan himoya qilish uchun USB port faolsizlashtiriladi va hech qanday aksessuarni aniqlay olmaydi.\n\nUSB portdan xavfsiz foydalanish mumkin boʻlganda, sizga xabar beriladi." + + "Quvvatlash moslamalari va aksessuarlarni aniqlash uchun USB port yoqildi" "USB xususiyatini yoqish" + + "Ekranga moslashtirish" "Ekran hajmida cho‘zish" "Skrinshot" @@ -118,6 +121,11 @@ "Bekor qilish" "OK" "Qayta urinish" + "Boʻsh hudud, tekshiruvni bekor qilish uchun bosing" + "Qayta urining" + "Yuz tekshirilmoqda" + "Yuzingiz aniqlandi" + "Tasdiqlangan" "Barmoq izi skaneriga tegining" "Barmoq izi belgisi" "Yuzingiz tekshirilmoqda…" @@ -369,8 +377,7 @@ "%s da yoqish" "%s gacha" "Tungi mavzu" - - + "Tungi mavzu\nQuvvat tejash" "NFC" "NFC o‘chiq" "NFC yoniq" @@ -445,13 +452,16 @@ "Quvvat tejash rejimi yoniq" "Unumdorlik pasayadi va fonda internetdan foydalanish cheklanadi" "Quvvat tejash rejimidan chiqish" - "Yozib olinayotganda yoki translatsiya paytida, %s siz ijro etgan audio, parollar, toʻlov maʼlumotlari, suratlar va xabarlar kabi har qanday shaxsiy maʼlumotlarni yozib olishi mumkin." + "Yozib olinayotganda yoki translatsiya paytida, %s ijro etilgan audiolar va qurilma ekraniga chiqadigan har qanday axborotni, jumladan, audio, parollar, toʻlov axborotlari, suratlar va xabarlar kabi har qanday shaxsiy maʼlumotlarni yozib olishi mumkin." + "Yozib olinayotganda yoki translatsiya paytida, bu funksiya ijro etilgan audiolar va qurilma ekraniga chiqadigan har qanday axborotni, jumladan, audio, parollar, toʻlov axborotlari, suratlar va xabarlar kabi har qanday shaxsiy maʼlumotlarni yozib olishi mumkin." "Translatsiya/yozib olish paytida shaxsiy maʼlumotlarning oshkor boʻlishi" "Boshqa ko‘rsatilmasin" "Hammasini tozalash" "Boshqarish" - "Tovushsiz bildirishnomalar" - "Barcha tovushsiz bildirishnomalarni tozalash" + + + + "Bezovta qilinmasin rejimida bildirishnomalar pauza qilingan" "Boshlash" "Bildirishnomalar yo‘q" @@ -635,9 +645,11 @@ "Bloklash" "Ha" "Kichraytirish" - "Tovushsiz bildirishnomalar" + + "Ovozsiz qolsin" - "Tovushli bildirishnomalar" + + "Signal berishda davom etilsin" "Bildirishnoma kelmasin" "Bu ilovadan keladigan bildirishnomalar chiqaversinmi?" @@ -651,10 +663,8 @@ "Bu bildirishnomalarni tahrirlash imkonsiz." "Ushbu bildirishnomalar guruhi bu yerda sozlanmaydi" "Ishonchli bildirishnoma" - - - - + "%1$s ilovasining barcha bildirishnomalari" + "Yana" "Bu ilova kameradan foydalanmoqda." "Bu ilova mikrofondan foydalanmoqda." "Bu ilova ekranda boshqa ilovalar ustidan ochilgan." @@ -898,7 +908,8 @@ "Ruxsat" "Rad etish" "Quvvat tejash rejimini rejalashtirish uchun bosing" - "Batareya quvvati %d%% ga tushganida avtomatik yoqish" + + "Kerak emas" "Quvvat tejash rejimi jadvali faollashtirildi" "Batareya quvvati %d%% ga tushsa, quvvat tejash rejimi avtomatik ravishda yoqiladi." @@ -930,6 +941,5 @@ "Yuqori oʻngga surish" "Quyi chapga surish" "Quyi oʻngga surish" - - + "Yopish" diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 1150e16a0186..ace5215d7b8b 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -62,9 +62,12 @@ "Tính năng gỡ lỗi USB không được phép" "Người dùng hiện đã đăng nhập vào thiết bị này không thể bật tính năng gỡ lỗi USB. Để sử dụng tính năng này, hãy chuyển sang người dùng chính." "Đã tắt cổng USB" - "Để bảo vệ thiết bị của bạn khỏi chất lỏng hay mảnh vỡ, cổng USB sẽ tắt và không thể phát hiện được bất kỳ phụ kiện nào.\n\nBạn sẽ được thông báo khi có thể sử dụng lại cổng USB một cách an toàn." + + "Đã bật cổng USB để phát hiện bộ sạc và phụ kiện" "Bật USB" + + "T.phóng để lấp đầy m.hình" "Giãn ra để lấp đầy m.hình" "Chụp màn hình" @@ -118,6 +121,11 @@ "Hủy" "Xác nhận" "Thử lại" + "Vùng trống, nhấn để hủy quá trình xác thực" + "Vui lòng thử lại" + "Đang tìm khuôn mặt của bạn" + "Đã xác thực khuôn mặt" + "Ðã xác nhận" "Chạm vào cảm biến vân tay" "Biểu tượng vân tay" "Đang tìm kiếm bạn…" @@ -369,8 +377,7 @@ "Bật vào lúc %s" "Cho đến %s" "Giao diện tối" - - + "Giao diện tối\nTrình tiết kiệm pin" "NFC" "NFC đã được tắt" "NFC đã được bật" @@ -445,13 +452,16 @@ "Trình tiết kiệm pin đang bật" "Giảm hiệu suất và dữ liệu nền" "Tắt trình tiết kiệm pin" - "Trong khi quay hoặc quyền, %s có thể ghi mọi thông tin nhạy cảm, chẳng hạn như âm thanh bạn phát, mật khẩu, thông tin thanh toán, ảnh và tin nhắn." + "Trong khi quay hoặc truyền, %s có thể ghi lại mọi thông tin nhạy cảm hiển thị trên màn hình hoặc phát trên thiết bị của bạn, bao gồm cả thông tin nhạy cảm như âm thanh, mật khẩu, thông tin thanh toán, ảnh và tin nhắn." + "Trong khi quay hoặc truyền, dịch vụ cung cấp chức năng này có thể ghi lại mọi thông tin nhạy cảm hiển thị trên màn hình hoặc phát trên thiết bị của bạn, bao gồm cả thông tin nhạy cảm như âm thanh, mật khẩu, thông tin thanh toán, ảnh và tin nhắn." "Để lộ thông tin nhạy cảm khi truyền/quay" "Không hiển thị lại" "Xóa tất cả" "Quản lý" - "Thông báo nhẹ nhàng" - "Xóa tất cả thông báo nhẹ nhàng" + + + + "Chế độ Không làm phiền đã tạm dừng thông báo" "Bắt đầu ngay" "Không có thông báo nào" @@ -635,9 +645,11 @@ "Chặn" "Tiếp tục hiển thị" "Thu nhỏ" - "Nhẹ nhàng" + + "Tiếp tục chế độ im lặng" - "Gián đoạn" + + "Tiếp tục cảnh báo" "Tắt thông báo" "Tiếp tục hiển thị các thông báo từ ứng dụng này?" @@ -651,10 +663,8 @@ "Không thể sửa đổi các thông báo này." "Không thể định cấu hình nhóm thông báo này tại đây" "Thông báo đã xử lý qua máy chủ proxy" - - - - + "Tất cả thông báo của %1$s" + "Xem thêm" "Ứng dụng này đang sử dụng máy ảnh." "Ứng dụng này đang sử dụng micrô." "Ứng dụng này đang hiển thị chồng lên các ứng dụng khác trên màn hình." @@ -898,7 +908,8 @@ "Cho phép" "Từ chối" "Nhấn để lên lịch Trình tiết kiệm pin" - "Tự động bật khi pin ở mức %d%%" + + "Không, cảm ơn" "Đã bật Trình tiết kiệm pin được lên lịch" "Trình tiết kiệm pin sẽ tự động bật khi mức pin thấp hơn %d%%." @@ -930,6 +941,5 @@ "Chuyển lên trên cùng bên phải" "Chuyển tới dưới cùng bên trái" "Chuyển tới dưới cùng bên phải" - - + "Loại bỏ" diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 5f1b4ad9d4ed..8675e317b581 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -62,9 +62,12 @@ "不允许使用 USB 调试功能" "目前已登录此设备的用户无法开启 USB 调试功能。要使用此功能,请切换为主要用户的帐号。" "USB 端口已停用" - "为避免液体或碎屑导致您的设备受损,系统已停用 USB 端口,因此目前无法检测任何配件。\n\n系统会在可重新安全使用 USB 端口时通知您。" + + "USB 端口已启用,可检测充电器和配件" "启用 USB" + + "缩放以填满屏幕" "拉伸以填满屏幕" "屏幕截图" @@ -118,6 +121,11 @@ "取消" "确认" "重试" + "空白区域,点按即可取消身份验证" + "请重试" + "正在查找您的面孔" + "面孔身份验证成功" + "已确认" "请触摸指纹传感器" "指纹图标" "正在查找中…" @@ -369,8 +377,7 @@ "在%s 开启" "直到%s" "深色主题背景" - - + "深色主题背景\n省电模式" "NFC" "NFC 已停用" "NFC 已启用" @@ -445,13 +452,16 @@ "省电模式已开启" "降低性能并限制后台流量" "关闭省电模式" - "在录制或投射内容时,%s可以获取任何敏感信息,例如您播放的音频、您的密码、付款信息、照片和消息等。" + "在录制或投射内容时,%s可以获取您屏幕上显示或设备中播放的所有敏感信息,例如音频、密码、付款信息、照片、消息等。" + "在录制或投射内容时,提供录制或投射功能的服务可以获取您屏幕上显示或设备中播放的所有敏感信息,例如音频、密码、付款信息、照片、消息等。" "在投射/录制时显示敏感信息" "不再显示" "全部清除" "管理" - "无声通知" - "清除所有无声通知" + + + + "勿扰模式暂停的通知" "立即开始" "没有通知" @@ -635,9 +645,11 @@ "屏蔽" "继续显示" "最小化" - "无声显示" + + "显示通知但不发出提示音" - "强制提醒" + + "继续提醒" "关闭通知" "要继续显示来自此应用的通知吗?" @@ -651,10 +663,8 @@ "无法修改这些通知。" "您无法在此处配置这组通知" "代理通知" - - - - + "所有的%1$s通知" + "查看更多" "此应用正在使用摄像头。" "此应用正在使用麦克风。" "此应用正显示在屏幕上其他应用的上层。" @@ -898,7 +908,8 @@ "允许" "拒绝" "点按即可预设省电模式" - "当电池电量剩余 %d%% 时自动开启" + + "不用了" "预设的省电模式已开启" "一旦电池电量降到 %d%% 以下,省电模式就会自动开启。" @@ -930,6 +941,5 @@ "移至右上角" "移至左下角" "移至右下角" - - + "关闭" diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index b3e48aed24ee..002e40ccb12a 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -62,9 +62,12 @@ "不允許 USB 偵錯" "目前登入此裝置的使用者無法啟用 USB 偵錯功能。如要使用此功能,請切換至主要使用者。" "已停用 USB 連接埠" - "為了保護您的裝置免受液體或碎片損害,USB 連接埠已停用,因此不會偵測到任何配件。\n\nUSB 連接埠可安全使用時,您會收到通知。" + + "已啟用 USB 連接埠以偵測充電器和配件" "啟用 USB" + + "放大為全螢幕" "放大為全螢幕" "螢幕截圖" @@ -118,6 +121,11 @@ "取消" "確認" "請再試一次" + "空白區域,輕按即可取消驗證" + "請再試一次" + "正在尋找您的臉孔" + "臉孔已經驗證" + "已確認" "請輕觸指紋感應器" "指紋圖示" "正在搜尋您的臉孔…" @@ -369,8 +377,7 @@ "%s 開啟" "直到%s" "深色主題背景" - - + "深色主題背景\n省電模式" "NFC" "NFC 已停用" "NFC 已啟用" @@ -445,13 +452,16 @@ "省電模式已開啟" "降低效能並限制背景數據傳輸" "關閉省電模式" - "錄製或投放期間,「%s」可以擷取任何敏感資料,例如您播放的音效檔案、您的密碼、付款資料、相片和訊息。" + "錄製或投放期間,「%s」可以擷取螢幕顯示或裝置播放的任何敏感資料,包括音效、密碼、付款資料、相片和訊息等敏感資料。" + "錄製或投放期間,此功能的服務供應商可以擷取螢幕顯示或裝置播放的任何敏感資料,包括音效、密碼、付款資料、相片和訊息等敏感資料。" "在投放/錄製期間披露敏感資訊" "不用再顯示" "全部清除" "管理" - "低重要性通知" - "清除所有低重要性通知" + + + + "「請勿騷擾」模式已將通知暫停" "立即開始" "沒有通知" @@ -635,9 +645,11 @@ "封鎖" "繼續顯示" "最小化" - "溫柔" + + "保持靜音" - "打擾" + + "繼續提示" "關閉通知" "要繼續顯示此應用程式的通知嗎?" @@ -651,10 +663,8 @@ "無法修改這些通知。" "無法在此設定這組通知" "代理通知" - - - - + "所有「%1$s」通知" + "查看更多" "此應用程式目前使用相機。" "此應用程式目前使用麥克風。" "此應用程式目前透過其他應用程式在畫面上顯示內容。" @@ -898,7 +908,8 @@ "允許" "拒絕" "輕按即可預定省電模式自動開啟時間" - "在電量為 %d%% 時自動開啟" + + "不用了,謝謝" "已預定省電模式開啟時間" "省電模式將會在電量低於 %d%% 時自動開啟。" @@ -930,6 +941,5 @@ "移去右上角" "移去左下角" "移去右下角" - - + "關閉" diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 46d22853348c..3824e2378db3 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -62,9 +62,12 @@ "無權使用 USB 偵錯功能" "目前登入這個裝置的使用者無法啟用 USB 偵錯功能。如要使用這項功能,請切換到主要使用者。" "USB 連接埠已停用" - "為了避免液體或灰塵導致你的裝置受損,系統已停用 USB 連接埠,因此目前無法偵測任何配件。\n\n系統會在可繼續安全使用 USB 連接埠時通知你。" + + "USB 通訊埠已啟用,可偵測充電器和配件" "啟用 USB 連接埠" + + "放大為全螢幕" "放大為全螢幕" "擷取螢幕畫面" @@ -99,7 +102,7 @@ "返回" "主螢幕" "選單" - "協助工具" + "無障礙設定" "旋轉螢幕" "總覽" "搜尋" @@ -118,6 +121,11 @@ "取消" "確認" "再試一次" + "空白的區域,輕觸即可取消驗證" + "請再試一次" + "正在尋找你的臉孔" + "臉孔驗證成功" + "確認完畢" "請輕觸指紋感應器" "指紋圖示" "正在尋找你的臉孔…" @@ -369,8 +377,7 @@ "%s 開啟" "%s 關閉" "深色主題" - - + "深色主題\n節約耗電量" "NFC" "NFC 已停用" "NFC 已啟用" @@ -445,13 +452,16 @@ "節約耗電量模式已開啟" "降低效能並限制背景數據傳輸" "關閉節約耗電量模式" - "「%s」在錄製或投放內容時可擷取任何機密資訊,例如你播放的音訊,以及你的密碼、付款資訊、相片和訊息。" + "在錄製或投放內容時,「%s」可擷取畫面所顯示或裝置所播放的任何機密資訊,例如音訊、密碼、付款資訊、相片和訊息等。" + "在錄製或投放內容時,提供這項功能的服務可擷取畫面所顯示或裝置所播放的任何機密資訊,例如音訊、密碼、付款資訊、相片和訊息等。" "在投放/錄製時顯示機密資訊" "不要再顯示" "全部清除" "管理" - "無聲通知" - "清除所有無聲通知" + + + + "「零打擾」模式已將通知設為暫停" "立即開始" "沒有通知" @@ -551,7 +561,7 @@ "通知" "藍牙" "雙音多頻" - "協助工具" + "無障礙" "通話" "鈴聲" "震動" @@ -635,9 +645,11 @@ "封鎖" "繼續顯示" "最小化" - "無聲顯示" + + "繼續顯示通知但不發出音效" - "強制提醒" + + "繼續顯示通知" "關閉通知" "要繼續顯示這個應用程式的通知嗎?" @@ -651,10 +663,8 @@ "無法修改這些通知。" "無法在這裡設定這個通知群組" "經過 Proxy 處理的通知" - - - - + "「%1$s」的所有通知" + "顯示更多" "這個應用程式正在使用相機。" "這個應用程式正在使用麥克風。" "這個應用程式顯示在畫面上其他應用程式的上層。" @@ -898,7 +908,8 @@ "允許" "拒絕" "輕觸即可排定節約耗電量模式自動開啟的情況" - "在電量 %d%% 時自動開啟" + + "不用了,謝謝" "已按照排定開啟節約耗電量模式" "節約耗電量模式會在電量低於 %d%% 時自動開啟。" @@ -930,6 +941,5 @@ "移至右上方" "移至左下方" "移至右下方" - - + "關閉" diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 066e1596ef85..30b2e6e323c9 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -62,9 +62,10 @@ "Ukususa iphutha kwe-USB akuvunyelwe" "Umsebenzisi manje ongene ngemvume kule divayisi entsha akakwazi ukuvula ukulungisa amaphutha ku-USB. Ukuze usebenzise lesi sici, shintshela kumsebenzisi oyinhloko." "Imbobo ye-USB ikhutshaziwe" - "Ukuze uvikele idivayisi yakho kusukela kuketshezi noma ama-debris, imbobo ye-USB iyakhutshazwa futhi ngeke ithole noma iziphi izisetshenziswa.\n\nUzokwaziswa uma kuphephile ukuphinda usebenzise imbobo yakho ye-USB." + "Ukuze kuvikelwe idivayisi yakho kusukela kuketshezi noma ama-debris, imbobo ye-USB iyakhutshazwa futhi ngeke ize ithole noma iziphi izisetshenziswa.\n\nUzokwaziswa uma sekulungile ukusebenzisa imbobo ye-USB futhi." "Imbobo ye-USB inikwe amandla ukuze ithole amashaja nezisetshenziswa" "Nika amandla i-USB" + "Funda kabanzi" "Sondeza ukugcwalisa isikrini" "Nweba ukugcwalisa isikrini" "Isithombe-skrini" @@ -118,6 +119,11 @@ "Khansela" "Qinisekisa" "Zama futhi" + "Isifunda esingenalutho, thepha ukuze ukhansele ukufakazela ubuqiniso" + "Sicela uzame futhi" + "Ifuna ubuso bakho" + "Ubuso bufakazelwe ubuqiniso" + "Kuqinisekisiwe" "Thinta inzwa yesigxivizo somunwe" "Isithonjana sezigxivizo zeminwe" "Kufunwa wena…" @@ -369,8 +375,7 @@ "Kuvulwe ngo-%s" "Kuze kube ngu-%s" "Itimu emnyama" - - + "Itimu emnyama\nIsilondolozi sebethri" "I-NFC" "I-NFC ikhutshaziwe" "I-NFC inikwe amandla" @@ -445,13 +450,14 @@ "Isilondolozi sebhethri sivuliwe" "Sehlisa ukusebenza nedatha yasemuva" "Vala isilondolozi sebhethri" - "Ngenkathi kurekhodwa noma kusakazwa, i-%s ingathwebula ulwazi olunozwelo, olufana nomsindo owudlalayo kanye namaphasiwedi akho, ulwazi lokukhokha, izithombe, nemilayezo." + "Ngenkathi irekhoda noma isakaza, i-%s ingathatha noma iluphi ulwazi olunozwelo oluboniswa kusikrini sakho noma oludlalwa kusukela kudivayisi yakho, okufaka ulwazi olunozwelo olufana nomsindo, amaphasiwedi, ulwazi lokukhokha, izithombe kanye nemilayezo." + "Ngenkathi irekhoda noma isakaza, isevisi enikeza lokhu kusebenza ingathatha noma iluphi ulwazi olunozwelo oluboniswa kusikrini sakho noma oludlalwa kusukela kudivayisi yakho, okufaka ulwazi olunozwelo olufana nomsindo, amaphasiwedi, ulwazi lokukhokha, izithombe kanye nemilayezo." "Ukuveza ulwazi oluzwelayo ngesikhathi sokusakaza/ukurekhoda" "Ungabonisi futhi" "Sula konke" "Phatha" - "Izaziso ezimnene" - "Sula zonke izaziso ezimnene" + "Thulisa izaziso" + "Sula zonke izaziso ezithulile" "Izaziso zimiswe okwesikhashana ukungaphazamisi" "Qala manje" "Azikho izaziso" @@ -635,9 +641,9 @@ "Vimba" "Qhubeka nokubonisa" "Nciphisa" - "Okumnene" + "Kuthulile" "Hlala uthulile" - "Okuphazamisayo" + "Iyazisa" "Qhubeka wazise" "Vala izaziso" "Qhubeka nokubonisa izaziso kusuka kulolu hlelo lokusebenza?" @@ -651,10 +657,8 @@ "Lezi zaziso azikwazi ukushintshwa." "Leli qembu lezaziso alikwazi ukulungiselelwa lapha" "Isaziso sommeli" - - - - + "Zonke izaziso ze-%1$s" + "Bona okwengeziwe" "Lolu hlelo lokusebenza lusebenzisa ikhamera." "Lolu hlelo lokusebenza lusebenzisa imakrofoni." "Lolu hlelo lokusebenza luboniswa ngaphezulu kwezinye izinhlelo zokusebenza kusikrini sakho." @@ -898,7 +902,7 @@ "Vumela" "Yenqaba" "Thepha ukuze ushejuli isilondolozi sebhethri" - "Ukuze uvule ngokuzenzakalelayo uma ibhethri liku-%d%%" + "Vula uma ibhethri sekungenzeka liphele" "Cha ngiyabonga" "Ishejuli yesilondolozi sebhethri ivuliwe" "Isilondolozi sebhethri sizovuleka ngokuzenzakalelayo uma ibhethri lifika ngaphansi kuka-%d%%." @@ -930,6 +934,5 @@ "Hambisa phezulu ngakwesokudla" "Hambisa inkinobho ngakwesokunxele" "Hambisa inkinobho ngakwesokudla" - - + "Cashisa" -- GitLab From c1d9ab226b7d95118bbbc9c27455952d06148e86 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Tue, 21 May 2019 18:08:30 -0700 Subject: [PATCH 018/620] Extended the bypass experience Notifications do not show on the lock screen anymore and are instead collapsed to icons. The experience with incoming notifications is still an open issue. Bug: 130327302 Test: astest SystemUITests Change-Id: Iba4fbaaa3ca1e9dd6ccfe22c760f863452d990f3 --- .../systemui/statusbar/NotificationShelf.java | 4 +-- .../NotificationWakeUpCoordinator.kt | 30 +++++++++++++++++-- .../notification/stack/AmbientState.java | 12 ++++---- .../stack/NotificationStackScrollLayout.java | 22 +++++++------- .../stack/StackScrollAlgorithm.java | 2 +- .../phone/KeyguardClockPositionAlgorithm.java | 13 ++++++-- .../phone/NotificationPanelView.java | 14 +++++---- .../NotificationStackScrollLayoutTest.java | 4 +-- .../KeyguardClockPositionAlgorithmTest.java | 2 +- .../phone/NotificationPanelViewTest.java | 17 +++++++---- 10 files changed, 82 insertions(+), 38 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index d202190724f5..799876db57df 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -453,7 +453,7 @@ public class NotificationShelf extends ActivatableNotificationView implements private void updateContinuousClipping(final ExpandableNotificationRow row) { StatusBarIconView icon = row.getEntry().expandedIcon; - boolean needsContinuousClipping = ViewState.isAnimatingY(icon) && !mAmbientState.isDark(); + boolean needsContinuousClipping = ViewState.isAnimatingY(icon) && !mAmbientState.isDozing(); boolean isContinuousClipping = icon.getTag(TAG_CONTINUOUS_CLIPPING) != null; if (needsContinuousClipping && !isContinuousClipping) { final ViewTreeObserver observer = icon.getViewTreeObserver(); @@ -829,7 +829,7 @@ public class NotificationShelf extends ActivatableNotificationView implements private void setOpenedAmount(float openedAmount) { mNoAnimationsInThisFrame = openedAmount == 1.0f && mOpenedAmount == 0.0f; mOpenedAmount = openedAmount; - if (!mAmbientState.isPanelFullWidth() || mAmbientState.isDark()) { + if (!mAmbientState.isPanelFullWidth() || mAmbientState.isDozing()) { // We don't do a transformation at all, lets just assume we are fully opened openedAmount = 1.0f; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt index 1e506ad0ee94..cd9616534eb8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt @@ -22,11 +22,12 @@ import android.util.FloatProperty import com.android.systemui.Interpolators import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.AmbientPulseManager -import com.android.systemui.statusbar.SysuiStatusBarStateController +import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout import com.android.systemui.statusbar.notification.stack.StackStateAnimator import com.android.systemui.statusbar.phone.DozeParameters +import com.android.systemui.statusbar.phone.KeyguardBypassController import javax.inject.Inject import javax.inject.Singleton @@ -35,7 +36,8 @@ import javax.inject.Singleton class NotificationWakeUpCoordinator @Inject constructor( private val mContext: Context, private val mAmbientPulseManager: AmbientPulseManager, - private val mStatusBarStateController: StatusBarStateController) + private val mStatusBarStateController: StatusBarStateController, + private val mBypassController: KeyguardBypassController) : AmbientPulseManager.OnAmbientChangedListener, StatusBarStateController.StateListener { private val mNotificationVisibility @@ -117,6 +119,9 @@ class NotificationWakeUpCoordinator @Inject constructor( } override fun onDozeAmountChanged(linear: Float, eased: Float) { + if (updateDozeAmountIfBypass()) { + return + } if (linear != 1.0f && linear != 0.0f && (mLinearDozeAmount == 0.0f || mLinearDozeAmount == 1.0f)) { // Let's notify the scroller that an animation started @@ -133,6 +138,27 @@ class NotificationWakeUpCoordinator @Inject constructor( } } + override fun onStateChanged(newState: Int) { + updateDozeAmountIfBypass(); + } + + private fun updateDozeAmountIfBypass(): Boolean { + if (mBypassController.bypassEnabled) { + if (mStatusBarStateController.state == StatusBarState.SHADE + || mStatusBarStateController.state == StatusBarState.SHADE_LOCKED) { + mDozeAmount = 0.0f + mLinearDozeAmount = 0.0f + } else { + mDozeAmount = 1.0f + mLinearDozeAmount = 1.0f + } + updateDarkAmount() + mStackScroller.setDozeAmount(mDozeAmount) + return true + } + return false + } + private fun startVisibilityAnimation(increaseSpeed: Boolean) { if (mNotificationVisibleAmount == 0f || mNotificationVisibleAmount == 1f) { mVisibilityInterpolator = if (mNotificationsVisible) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java index 8c6d1015bd4d..67266f969c69 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java @@ -52,7 +52,7 @@ public class AmbientState { private float mOverScrollTopAmount; private float mOverScrollBottomAmount; private int mSpeedBumpIndex = -1; - private boolean mDark; + private boolean mDozing; private boolean mHideSensitive; private AmbientPulseManager mAmbientPulseManager = Dependency.get(AmbientPulseManager.class); private float mStackTranslation; @@ -181,8 +181,8 @@ public class AmbientState { } /** In dark mode, we draw as little as possible, assuming a black background */ - public void setDark(boolean dark) { - mDark = dark; + public void setDozing(boolean dozing) { + mDozing = dozing; } /** Dark ratio of the status bar **/ @@ -215,8 +215,8 @@ public class AmbientState { return mDimmed; } - public boolean isDark() { - return mDark; + public boolean isDozing() { + return mDozing; } public boolean isHideSensitive() { @@ -452,7 +452,7 @@ public class AmbientState { * @return whether a row is dozing and not pulsing right now */ public boolean isDozingAndNotPulsing(ExpandableNotificationRow row) { - return isDark() && !isPulsing(row.getEntry()); + return isDozing() && !isPulsing(row.getEntry()); } public void setExpandAnimationTopChange(int expandAnimationTopChange) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 8c73e9834195..f6634dcba0d6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -770,7 +770,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd if (mShouldDrawNotificationBackground && (mSections[0].getCurrentBounds().top < mSections[NUM_SECTIONS - 1].getCurrentBounds().bottom - || mAmbientState.isDark())) { + || mAmbientState.isDozing())) { drawBackground(canvas); } else if (mInHeadsUpPinnedMode || mHeadsUpAnimatingAway) { drawHeadsUpBackground(canvas); @@ -842,7 +842,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd break; } } - if (!mAmbientState.isDark() || anySectionHasVisibleChild) { + if (!mAmbientState.isDozing() || anySectionHasVisibleChild) { drawBackgroundRects(canvas, left, right, top, backgroundTopAnimationOffset); } @@ -1435,7 +1435,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd int notGoneChildCount = getNotGoneChildCount(); if (mEmptyShadeView.getVisibility() == GONE && notGoneChildCount != 0) { if (isHeadsUpTransition() - || (mHeadsUpManager.hasPinnedHeadsUp() && !mAmbientState.isDark())) { + || (mHeadsUpManager.hasPinnedHeadsUp() && !mAmbientState.isDozing())) { appearPosition = getTopHeadsUpPinnedHeight(); } else { appearPosition = 0; @@ -3534,7 +3534,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private void generateTopPaddingEvent() { if (mTopPaddingNeedsAnimation) { AnimationEvent event; - if (mAmbientState.isDark()) { + if (mAmbientState.isDozing()) { event = new AnimationEvent(null /* view */, AnimationEvent.ANIMATION_TYPE_TOP_PADDING_CHANGED, KeyguardSliceView.DEFAULT_ANIM_DURATION); @@ -4714,21 +4714,19 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } /** - * See {@link AmbientState#setDark}. + * See {@link AmbientState#setDozing}. */ @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public void setDark(boolean dark, boolean animate, @Nullable PointF touchWakeUpScreenLocation) { - if (mAmbientState.isDark() == dark) { + public void setDozing(boolean dozing, boolean animate, + @Nullable PointF touchWakeUpScreenLocation) { + if (mAmbientState.isDozing() == dozing) { return; } - mAmbientState.setDark(dark); + mAmbientState.setDozing(dozing); if (animate && mAnimationsEnabled) { mDarkNeedsAnimation = true; mDarkAnimationOriginIndex = findDarkAnimationOriginIndex(touchWakeUpScreenLocation); mNeedsAnimation = true; - } else { - setDarkAmount(dark ? 1f : 0f); - updateBackground(); } requestChildrenUpdate(); updateWillNotDraw(); @@ -6349,7 +6347,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd (int) (dragLengthY / mDisplayMetrics.density), 0 /* velocityDp - N/A */); - if (!mAmbientState.isDark() || startingChild != null) { + if (!mAmbientState.isDozing() || startingChild != null) { // We have notifications, go to locked shade. mShadeController.goToLockedShade(startingChild); if (startingChild instanceof ExpandableNotificationRow) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index 60061c6a9ad2..2980ee4ac45e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -255,7 +255,7 @@ public class StackScrollAlgorithm { state.paddingMap.clear(); int notGoneIndex = 0; ExpandableView lastView = null; - int firstHiddenIndex = ambientState.isDark() + int firstHiddenIndex = ambientState.isDozing() ? (ambientState.hasPulsingNotifications() ? 1 : 0) : childCount; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java index bc2d00f53186..fc91ad55a92d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java @@ -111,6 +111,12 @@ public class KeyguardClockPositionAlgorithm { private float mEmptyDragAmount; + /** + * If true the clock should always be positioned like it's dark. Used in the bypass, where + * notifications don't expand on the lock screen and should be kept stable + */ + private boolean mPositionLikeDark; + /** * Refreshes the dimension values. */ @@ -132,7 +138,8 @@ public class KeyguardClockPositionAlgorithm { public void setup(int minTopMargin, int maxShadeBottom, int notificationStackHeight, float panelExpansion, int parentHeight, int keyguardStatusHeight, int clockPreferredY, - boolean hasCustomClock, boolean hasVisibleNotifs, float dark, float emptyDragAmount) { + boolean hasCustomClock, boolean hasVisibleNotifs, float dark, float emptyDragAmount, + boolean positionLikeDark) { mMinTopMargin = minTopMargin + mContainerTopPadding; mMaxShadeBottom = maxShadeBottom; mNotificationStackHeight = notificationStackHeight; @@ -144,6 +151,7 @@ public class KeyguardClockPositionAlgorithm { mHasVisibleNotifs = hasVisibleNotifs; mDarkAmount = dark; mEmptyDragAmount = emptyDragAmount; + mPositionLikeDark = positionLikeDark; } public void run(Result result) { @@ -209,7 +217,8 @@ public class KeyguardClockPositionAlgorithm { float clockY = MathUtils.lerp(clockYBouncer, clockYRegular, shadeExpansion); clockYDark = MathUtils.lerp(clockYBouncer, clockYDark, shadeExpansion); - return (int) (MathUtils.lerp(clockY, clockYDark, mDarkAmount) + mEmptyDragAmount); + float darkAmount = mPositionLikeDark ? 1.0f : mDarkAmount; + return (int) (MathUtils.lerp(clockY, clockYDark, darkAmount) + mEmptyDragAmount); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 9da75b64acdf..05ce9dde0685 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -150,6 +150,7 @@ public class NotificationPanelView extends PanelView implements private final AccessibilityManager mAccessibilityManager; private final NotificationWakeUpCoordinator mWakeUpCoordinator; private final PulseExpansionHandler mPulseExpansionHandler; + private final KeyguardBypassController mKeyguardBypassController; @VisibleForTesting protected KeyguardAffordanceHelper mAffordanceHelper; @@ -348,7 +349,8 @@ public class NotificationPanelView extends PanelView implements InjectionInflationController injectionInflationController, NotificationWakeUpCoordinator coordinator, PulseExpansionHandler pulseExpansionHandler, - DynamicPrivacyController dynamicPrivacyController) { + DynamicPrivacyController dynamicPrivacyController, + KeyguardBypassController bypassController) { super(context, attrs); setWillNotDraw(!DEBUG); mInjectionInflationController = injectionInflationController; @@ -363,6 +365,7 @@ public class NotificationPanelView extends PanelView implements mDisplayId = context.getDisplayId(); mPulseExpansionHandler = pulseExpansionHandler; mThemeResId = context.getThemeResId(); + mKeyguardBypassController = bypassController; dynamicPrivacyController.addListener(this); } @@ -655,7 +658,8 @@ public class NotificationPanelView extends PanelView implements hasCustomClock(), mNotificationStackScroller.getVisibleNotificationCount() != 0, mInterpolatedDarkAmount, - mEmptyDragAmount); + mEmptyDragAmount, + mKeyguardBypassController.getBypassEnabled()); mClockPositionAlgorithm.run(mClockPositionResult); PropertyAnimator.setProperty(mKeyguardStatusView, AnimatableProperty.X, mClockPositionResult.clockX, CLOCK_ANIMATION_PROPERTIES, animateClock); @@ -2865,7 +2869,7 @@ public class NotificationPanelView extends PanelView implements public void setDozing(boolean dozing, boolean animate, PointF wakeUpTouchLocation) { if (dozing == mDozing) return; mDozing = dozing; - mNotificationStackScroller.setDark(mDozing, animate, wakeUpTouchLocation); + mNotificationStackScroller.setDozing(mDozing, animate, wakeUpTouchLocation); mKeyguardBottomArea.setDozing(mDozing, animate); if (mBarState == StatusBarState.KEYGUARD @@ -2873,8 +2877,8 @@ public class NotificationPanelView extends PanelView implements updateDozingVisibilities(animate); } - final float darkAmount = dozing ? 1 : 0; - mStatusBarStateController.setDozeAmount(darkAmount, animate); + final float dozeAmount = dozing ? 1 : 0; + mStatusBarStateController.setDozeAmount(dozeAmount, animate); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index 56265d08c131..662edd2d58cd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -194,9 +194,9 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { public void testAntiBurnInOffset() { final int burnInOffset = 30; mStackScroller.setAntiBurnInOffsetX(burnInOffset); - mStackScroller.setDark(false /* dark */, false /* animated */, null /* touch */); + mStackScroller.setDarkAmount(0.0f, 0.0f); Assert.assertEquals(0 /* expected */, mStackScroller.getTranslationX(), 0.01 /* delta */); - mStackScroller.setDark(true /* dark */, false /* animated */, null /* touch */); + mStackScroller.setDarkAmount(1.0f, 1.0f); Assert.assertEquals(burnInOffset /* expected */, mStackScroller.getTranslationX(), 0.01 /* delta */); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java index f8394f01a081..66c61ce9b7e8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java @@ -383,7 +383,7 @@ public class KeyguardClockPositionAlgorithmTest extends SysuiTestCase { private void positionClock() { mClockPositionAlgorithm.setup(EMPTY_MARGIN, SCREEN_HEIGHT, mNotificationStackHeight, mPanelExpansion, SCREEN_HEIGHT, mKeyguardStatusHeight, mPreferredClockY, - mHasCustomClock, mHasVisibleNotifs, mDark, ZERO_DRAG); + mHasCustomClock, mHasVisibleNotifs, mDark, ZERO_DRAG, false /* positionLikeDark */); mClockPositionAlgorithm.run(mClockPosition); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java index 1b7ca952dbfe..e0e4a25a9f90 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java @@ -49,6 +49,7 @@ import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ZenModeController; +import com.android.systemui.tuner.TunerService; import com.android.systemui.util.InjectionInflationController; import org.junit.Before; @@ -111,12 +112,16 @@ public class NotificationPanelViewTest extends SysuiTestCase { mDependency.injectMockDependency(NotificationLockscreenUserManager.class); mDependency.injectMockDependency(ConfigurationController.class); mDependency.injectMockDependency(ZenModeController.class); + KeyguardBypassController bypassController = new KeyguardBypassController(mContext, + mock(TunerService.class)); NotificationWakeUpCoordinator coordinator = new NotificationWakeUpCoordinator(mContext, new AmbientPulseManager(mContext), - new StatusBarStateControllerImpl()); + new StatusBarStateControllerImpl(), + bypassController); PulseExpansionHandler expansionHandler = new PulseExpansionHandler(mContext, coordinator); - mNotificationPanelView = new TestableNotificationPanelView(coordinator, expansionHandler); + mNotificationPanelView = new TestableNotificationPanelView(coordinator, expansionHandler, + bypassController); mNotificationPanelView.setHeadsUpManager(mHeadsUpManager); mNotificationPanelView.setBar(mPanelBar); @@ -128,7 +133,7 @@ public class NotificationPanelViewTest extends SysuiTestCase { public void testSetDozing_notifiesNsslAndStateController() { mNotificationPanelView.setDozing(true /* dozing */, true /* animate */, null /* touch */); InOrder inOrder = inOrder(mNotificationStackScrollLayout, mStatusBarStateController); - inOrder.verify(mNotificationStackScrollLayout).setDark(eq(true), eq(true), eq(null)); + inOrder.verify(mNotificationStackScrollLayout).setDozing(eq(true), eq(true), eq(null)); inOrder.verify(mStatusBarStateController).setDozeAmount(eq(1f), eq(true)); } @@ -178,11 +183,13 @@ public class NotificationPanelViewTest extends SysuiTestCase { private class TestableNotificationPanelView extends NotificationPanelView { TestableNotificationPanelView(NotificationWakeUpCoordinator coordinator, - PulseExpansionHandler expansionHandler) { + PulseExpansionHandler expansionHandler, + KeyguardBypassController bypassController) { super(NotificationPanelViewTest.this.mContext, null, new InjectionInflationController( SystemUIFactory.getInstance().getRootComponent()), - coordinator, expansionHandler, mock(DynamicPrivacyController.class)); + coordinator, expansionHandler, mock(DynamicPrivacyController.class), + bypassController); mNotificationStackScroller = mNotificationStackScrollLayout; mKeyguardStatusView = NotificationPanelViewTest.this.mKeyguardStatusView; mKeyguardStatusBar = NotificationPanelViewTest.this.mKeyguardStatusBar; -- GitLab From db6d6df85549d12fc4d941fc6c3b196c2da7fa08 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Wed, 22 May 2019 20:39:59 -0700 Subject: [PATCH 019/620] Fixed the maxPanelheight on the lockscreen Previously the maxPanelHeight was depending on the actual position also including the current expand position. That could lead to flickering and the hint animation being wrong. Bug: 130327302 Test: expand and collapse panel, perform hint while dismiss function is enabled Change-Id: I606690898a52a1999c391888149d490f20a0b9cb --- .../stack/NotificationStackScrollLayout.java | 14 ++++++-------- .../phone/KeyguardClockPositionAlgorithm.java | 12 +++++++++--- .../statusbar/phone/NotificationPanelView.java | 8 +++----- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index f6634dcba0d6..6e1d512e8eda 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -804,7 +804,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd canvas.drawLine(0, y, getWidth(), y, mDebugPaint); } canvas.drawText(Integer.toString(getMaxNegativeScrollAmount()), getWidth() - 100, - getIntrinsicPadding() + 30, mDebugPaint); + getTopPadding() + 30, mDebugPaint); canvas.drawText(Integer.toString(getMaxPositiveScrollAmount()), getWidth() - 100, getHeight() - 30, mDebugPaint); } @@ -2400,7 +2400,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } mIntrinsicContentHeight = height; - mContentHeight = height + mTopPadding + mBottomMargin; + // The topPadding can be bigger than the regular padding when qs is expanded, in that + // state the maxPanelHeight and the contentHeight should be bigger + mContentHeight = height + Math.max(mIntrinsicPadding, mTopPadding) + mBottomMargin; updateScrollability(); clampScrollPosition(); mAmbientState.setLayoutMaxHeight(mContentHeight); @@ -2785,12 +2787,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd * * @param qsHeight the top padding imposed by the quick settings panel * @param animate whether to animate the change - * @param ignoreIntrinsicPadding if true, {@link #getIntrinsicPadding()} is ignored and - * {@code qsHeight} is the final top padding */ @ShadeViewRefactor(RefactorComponent.COORDINATOR) - public void updateTopPadding(float qsHeight, boolean animate, - boolean ignoreIntrinsicPadding) { + public void updateTopPadding(float qsHeight, boolean animate) { int topPadding = (int) qsHeight; int minStackHeight = getLayoutMinHeight(); if (topPadding + minStackHeight > getHeight()) { @@ -2798,8 +2797,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } else { mTopPaddingOverflow = 0; } - setTopPadding(ignoreIntrinsicPadding ? topPadding : clampPadding(topPadding), - animate); + setTopPadding(topPadding, animate); setExpandedHeight(mExpandedHeight); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java index fc91ad55a92d..579d1abe7650 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java @@ -155,10 +155,11 @@ public class KeyguardClockPositionAlgorithm { } public void run(Result result) { - final int y = getClockY(); + final int y = getClockY(mPanelExpansion); result.clockY = y; result.clockAlpha = getClockAlpha(y); result.stackScrollerPadding = y + mKeyguardStatusHeight; + result.stackScrollerPaddingExpanded = getClockY(1.0f) + mKeyguardStatusHeight; result.clockX = (int) interpolate(0, burnInPreventionOffsetX(), mDarkAmount); } @@ -203,7 +204,7 @@ public class KeyguardClockPositionAlgorithm { return (int) y; } - private int getClockY() { + private int getClockY(float panelExpansion) { // Dark: Align the bottom edge of the clock at about half of the screen: float clockYDark = (mHasCustomClock ? getPreferredClockY() : getMaxClockY()) + burnInPreventionOffsetY(); @@ -213,7 +214,7 @@ public class KeyguardClockPositionAlgorithm { float clockYBouncer = -mKeyguardStatusHeight; // Move clock up while collapsing the shade - float shadeExpansion = Interpolators.FAST_OUT_LINEAR_IN.getInterpolation(mPanelExpansion); + float shadeExpansion = Interpolators.FAST_OUT_LINEAR_IN.getInterpolation(panelExpansion); float clockY = MathUtils.lerp(clockYBouncer, clockYRegular, shadeExpansion); clockYDark = MathUtils.lerp(clockYBouncer, clockYDark, shadeExpansion); @@ -266,5 +267,10 @@ public class KeyguardClockPositionAlgorithm { * The top padding of the stack scroller, in pixels. */ public int stackScrollerPadding; + + /** + * The top padding of the stack scroller, in pixels when fully expanded. + */ + public int stackScrollerPaddingExpanded; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 05ce9dde0685..747909d40d88 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -666,7 +666,7 @@ public class NotificationPanelView extends PanelView implements PropertyAnimator.setProperty(mKeyguardStatusView, AnimatableProperty.Y, mClockPositionResult.clockY, CLOCK_ANIMATION_PROPERTIES, animateClock); updateClock(); - stackScrollerPadding = mClockPositionResult.stackScrollerPadding; + stackScrollerPadding = mClockPositionResult.stackScrollerPaddingExpanded; } mNotificationStackScroller.setIntrinsicPadding(stackScrollerPadding); mNotificationStackScroller.setAntiBurnInOffsetX(mClockPositionResult.clockX); @@ -1601,7 +1601,7 @@ public class NotificationPanelView extends PanelView implements } else if (mKeyguardShowing) { // We can only do the smoother transition on Keyguard when we also are not collapsing // from a scrolled quick settings. - return MathUtils.lerp((float) mNotificationStackScroller.getIntrinsicPadding(), + return MathUtils.lerp((float) mClockPositionResult.stackScrollerPadding, (float) (mQsMaxExpansionHeight + mQsNotificationTopPadding), getQsExpansionFraction()); } else { @@ -1610,9 +1610,7 @@ public class NotificationPanelView extends PanelView implements } protected void requestScrollerTopPaddingUpdate(boolean animate) { - mNotificationStackScroller.updateTopPadding(calculateQsTopPadding(), - animate, mKeyguardShowing - && (mQsExpandImmediate || mIsExpanding && mQsExpandedWhenExpandingStarted)); + mNotificationStackScroller.updateTopPadding(calculateQsTopPadding(), animate); } private void trackMovement(MotionEvent event) { -- GitLab From 54fead82f5aa636b1144274a097581fc05c81781 Mon Sep 17 00:00:00 2001 From: Beverly Date: Wed, 22 May 2019 17:57:39 -0400 Subject: [PATCH 020/620] Add disable methods in StatusBarManager Test: manual Bug: 132844641 Change-Id: Ibee48629c6ddb523cafa45238668cb00553f2d5b --- core/java/android/app/StatusBarManager.java | 64 ++++++++++++++++++- .../statusbar/StatusBarShellCommand.java | 13 +++- 2 files changed, 74 insertions(+), 3 deletions(-) diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java index af2d774508c4..205e7a13092b 100644 --- a/core/java/android/app/StatusBarManager.java +++ b/core/java/android/app/StatusBarManager.java @@ -433,6 +433,9 @@ public class StatusBarManager { private boolean mNotificationPeeking; private boolean mRecents; private boolean mSearch; + private boolean mSystemIcons; + private boolean mClock; + private boolean mNotificationIcons; /** @hide */ public DisableInfo(int flags1, int flags2) { @@ -441,6 +444,9 @@ public class StatusBarManager { mNotificationPeeking = (flags1 & DISABLE_NOTIFICATION_ALERTS) != 0; mRecents = (flags1 & DISABLE_RECENT) != 0; mSearch = (flags1 & DISABLE_SEARCH) != 0; + mSystemIcons = (flags1 & DISABLE_SYSTEM_INFO) != 0; + mClock = (flags1 & DISABLE_CLOCK) != 0; + mNotificationIcons = (flags1 & DISABLE_NOTIFICATION_ICONS) != 0; } /** @hide */ @@ -526,6 +532,48 @@ public class StatusBarManager { mSearch = disabled; } + /** + * @return {@code true} if system icons are disabled + * + * @hide + */ + public boolean areSystemIconsDisabled() { + return mSystemIcons; + } + + /** * @hide */ + public void setSystemIconsDisabled(boolean disabled) { + mSystemIcons = disabled; + } + + /** + * @return {@code true} if the clock icon is disabled + * + * @hide + */ + public boolean isClockDisabled() { + return mClock; + } + + /** * @hide */ + public void setClockDisabled(boolean disabled) { + mClock = disabled; + } + + /** + * @return {@code true} if notification icons are disabled + * + * @hide + */ + public boolean areNotificationIconsDisabled() { + return mNotificationIcons; + } + + /** * @hide */ + public void setNotificationIconsDisabled(boolean disabled) { + mNotificationIcons = disabled; + } + /** * @return {@code true} if no components are disabled (default state) * @@ -535,7 +583,7 @@ public class StatusBarManager { @TestApi public boolean areAllComponentsEnabled() { return !mStatusBarExpansion && !mNavigateHome && !mNotificationPeeking && !mRecents - && !mSearch; + && !mSearch && !mSystemIcons && !mClock && !mNotificationIcons; } /** @hide */ @@ -545,6 +593,9 @@ public class StatusBarManager { mNotificationPeeking = false; mRecents = false; mSearch = false; + mSystemIcons = false; + mClock = false; + mNotificationIcons = false; } /** @@ -554,7 +605,7 @@ public class StatusBarManager { */ public boolean areAllComponentsDisabled() { return mStatusBarExpansion && mNavigateHome && mNotificationPeeking - && mRecents && mSearch; + && mRecents && mSearch && mSystemIcons && mClock && mNotificationIcons; } /** @hide */ @@ -564,6 +615,9 @@ public class StatusBarManager { mNotificationPeeking = true; mRecents = true; mSearch = true; + mSystemIcons = true; + mClock = true; + mNotificationIcons = true; } @Override @@ -576,6 +630,9 @@ public class StatusBarManager { .append(mNotificationPeeking ? "disabled" : "enabled"); sb.append(" mRecents=").append(mRecents ? "disabled" : "enabled"); sb.append(" mSearch=").append(mSearch ? "disabled" : "enabled"); + sb.append(" mSystemIcons=").append(mSystemIcons ? "disabled" : "enabled"); + sb.append(" mClock=").append(mClock ? "disabled" : "enabled"); + sb.append(" mNotificationIcons=").append(mNotificationIcons ? "disabled" : "enabled"); return sb.toString(); @@ -596,6 +653,9 @@ public class StatusBarManager { if (mNotificationPeeking) disable1 |= DISABLE_NOTIFICATION_ALERTS; if (mRecents) disable1 |= DISABLE_RECENT; if (mSearch) disable1 |= DISABLE_SEARCH; + if (mSystemIcons) disable1 |= DISABLE_SYSTEM_INFO; + if (mClock) disable1 |= DISABLE_CLOCK; + if (mNotificationIcons) disable1 |= DISABLE_NOTIFICATION_ICONS; return new Pair(disable1, disable2); } diff --git a/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java b/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java index b12129835ca1..d7f86cd65ae9 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java +++ b/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java @@ -161,7 +161,15 @@ public class StatusBarShellCommand extends ShellCommand { case "statusbar-expansion": info.setStatusBarExpansionDisabled(true); break; - + case "system-icons": + info.setSystemIconsDisabled(true); + break; + case "clock": + info.setClockDisabled(true); + break; + case "notification-icons": + info.setNotificationIconsDisabled(true); + break; default: break; } @@ -221,6 +229,9 @@ public class StatusBarShellCommand extends ShellCommand { pw.println(" recents - disable recents/overview"); pw.println(" notification-peek - disable notification peeking"); pw.println(" statusbar-expansion - disable status bar expansion"); + pw.println(" system-icons - disable system icons appearing in status bar"); + pw.println(" clock - disable clock appearing in status bar"); + pw.println(" notification-icons - disable notification icons from status bar"); pw.println(""); } -- GitLab From 903091fcc251fdb0da4e72c78f7fbadb90f4d217 Mon Sep 17 00:00:00 2001 From: Amin Shaikh Date: Thu, 23 May 2019 11:37:15 -0400 Subject: [PATCH 021/620] Update themed icons. - Ensure underlying icons and overlayed icons match in size, tint and autoMirrored - Add a couple missing Settings icons - Change perm_group_* icons to use colorControlNormal Fixes: 132997623 Fixes: 131346125 Test: make; change overlays Change-Id: I65170eb7671c425bd2c39cd2f1341f641fa810e3 --- core/res/res/drawable/ic_audio_alarm.xml | 4 +- core/res/res/drawable/ic_audio_alarm_mute.xml | 4 +- .../res/drawable/ic_bluetooth_share_icon.xml | 2 +- core/res/res/drawable/ic_corp_badge.xml | 4 +- core/res/res/drawable/ic_file_copy.xml | 3 +- core/res/res/drawable/ic_qs_auto_rotate.xml | 4 +- core/res/res/drawable/ic_qs_battery_saver.xml | 4 +- core/res/res/drawable/ic_qs_flashlight.xml | 4 +- .../perm_group_activity_recognition.xml | 1 + core/res/res/drawable/perm_group_aural.xml | 1 + core/res/res/drawable/perm_group_calendar.xml | 5 +- core/res/res/drawable/perm_group_call_log.xml | 1 + core/res/res/drawable/perm_group_camera.xml | 1 + core/res/res/drawable/perm_group_contacts.xml | 1 + core/res/res/drawable/perm_group_location.xml | 1 + .../res/drawable/perm_group_microphone.xml | 1 + .../res/drawable/perm_group_phone_calls.xml | 3 +- core/res/res/drawable/perm_group_sensors.xml | 1 + core/res/res/drawable/perm_group_sms.xml | 1 + core/res/res/drawable/perm_group_storage.xml | 1 + core/res/res/drawable/perm_group_visual.xml | 3 +- .../res/values/overlayable_icons_test.xml | 4 ++ .../SystemUI/res/drawable/ic_info_outline.xml | 4 +- .../res/drawable/ic_invert_colors.xml | 4 +- .../drawable/ic_qs_bluetooth_connecting.xml | 4 +- .../SystemUI/res/drawable/ic_qs_no_sim.xml | 4 +- .../res/drawable/ic_screenshot_delete.xml | 4 +- .../res/drawable/ic_battery_80_24dp.xml} | 2 +- .../res/drawable/ic_bt_misc_hid.xml | 1 - .../res/drawable/ic_file_copy.xml | 2 +- .../res/drawable/ic_lock.xml | 1 - .../res/drawable/ic_lock_open.xml | 1 - .../res/drawable/ic_lockscreen_ime.xml | 1 + .../res/drawable/ic_mode_edit.xml | 1 + .../drawable/ic_notifications_alerted.xml} | 10 ++-- .../res/drawable/ic_phone.xml | 2 + .../res/drawable/ic_qs_battery_saver.xml | 2 + .../res/drawable/ic_qs_bluetooth.xml | 1 + .../drawable/ic_signal_cellular_0_4_bar.xml | 52 ++++++++++--------- .../drawable/ic_signal_cellular_1_4_bar.xml | 47 +++++++++-------- .../drawable/ic_signal_cellular_2_4_bar.xml | 42 ++++++++------- .../drawable/ic_signal_cellular_3_4_bar.xml | 37 +++++++------ .../drawable/ic_signal_cellular_4_4_bar.xml | 32 +++++++----- .../perm_group_activity_recognition.xml | 2 +- .../res/drawable/perm_group_calendar.xml | 1 + .../res/drawable/perm_group_call_log.xml | 2 +- .../res/drawable/perm_group_camera.xml | 2 +- .../res/drawable/perm_group_contacts.xml | 2 +- .../res/drawable/perm_group_location.xml | 2 +- .../res/drawable/perm_group_microphone.xml | 2 +- .../res/drawable/perm_group_phone_calls.xml | 2 +- .../res/drawable/perm_group_sensors.xml | 2 +- .../res/drawable/perm_group_sms.xml | 2 +- .../res/drawable/perm_group_storage.xml | 2 +- .../res/drawable/perm_group_visual.xml | 2 +- .../res/drawable/ic_setting.xml | 1 + .../res/drawable/ic_arrow_back.xml | 1 + .../drawable/ic_battery_saver_accent_24dp.xml | 29 ----------- .../drawable/ic_battery_status_bad_24dp.xml | 28 ---------- .../res/drawable/ic_cellular_off.xml | 1 + .../res/drawable/ic_chevron_right_24dp.xml | 1 + .../drawable/ic_content_copy_grey600_24dp.xml | 2 +- .../res/drawable/ic_data_saver.xml | 19 +++---- .../res/drawable/ic_devices_other.xml | 1 + .../res/drawable/ic_eject_24dp.xml | 1 + .../res/drawable/ic_find_in_page_24px.xml | 32 ++++++++++++ .../res/drawable/ic_help_actionbar.xml | 1 + .../res/drawable/ic_network_cell.xml | 33 +++++++----- .../drawable/ic_notifications_off_24dp.xml | 1 + .../res/drawable/ic_settings_data_usage.xml | 7 ++- .../res/drawable/ic_settings_language.xml | 26 ++++++++++ .../res/drawable/ic_settings_multiuser.xml} | 5 +- .../drawable/ic_settings_wireless_white.xml | 34 ------------ .../res/drawable/ic_arrow_back.xml | 1 + .../res/drawable/ic_brightness_thumb.xml | 2 +- .../res/drawable/ic_camera.xml | 4 +- .../res/drawable/ic_data_saver.xml | 22 ++++---- .../res/drawable/ic_data_saver_off.xml | 7 ++- .../drawable/ic_qs_bluetooth_connecting.xml | 1 + .../res/drawable/ic_volume_alarm_mute.xml | 1 + .../res/drawable/ic_battery_80_24dp.xml} | 8 +-- .../res/drawable/ic_bt_misc_hid.xml | 1 - .../res/drawable/ic_file_copy.xml | 2 +- .../res/drawable/ic_lock.xml | 1 - .../res/drawable/ic_lock_open.xml | 1 - .../res/drawable/ic_lockscreen_ime.xml | 1 + .../res/drawable/ic_mode_edit.xml | 1 + .../drawable/ic_notifications_alerted.xml} | 9 ++-- .../res/drawable/ic_phone.xml | 2 + .../res/drawable/ic_qs_battery_saver.xml | 2 + .../res/drawable/ic_qs_bluetooth.xml | 1 + .../perm_group_activity_recognition.xml | 2 +- .../res/drawable/perm_group_calendar.xml | 1 + .../res/drawable/perm_group_call_log.xml | 2 +- .../res/drawable/perm_group_camera.xml | 2 +- .../res/drawable/perm_group_contacts.xml | 2 +- .../res/drawable/perm_group_location.xml | 2 +- .../res/drawable/perm_group_microphone.xml | 2 +- .../res/drawable/perm_group_phone_calls.xml | 2 +- .../res/drawable/perm_group_sensors.xml | 2 +- .../res/drawable/perm_group_sms.xml | 2 +- .../res/drawable/perm_group_storage.xml | 2 +- .../res/drawable/perm_group_visual.xml | 2 +- .../res/drawable/ic_setting.xml | 1 + .../res/drawable/ic_arrow_back.xml | 1 + .../res/drawable/ic_cellular_off.xml | 1 + .../res/drawable/ic_chevron_right_24dp.xml | 1 + .../drawable/ic_content_copy_grey600_24dp.xml | 2 +- .../res/drawable/ic_data_saver.xml | 1 + .../res/drawable/ic_devices_other.xml | 1 + .../res/drawable/ic_eject_24dp.xml | 1 + .../res/drawable/ic_find_in_page_24px.xml | 27 ++++++++++ .../res/drawable/ic_help_actionbar.xml | 1 + .../res/drawable/ic_network_cell.xml | 1 + .../drawable/ic_notifications_off_24dp.xml | 1 + .../res/drawable/ic_settings_language.xml | 26 ++++++++++ .../res/drawable/ic_settings_multiuser.xml | 29 +++++++++++ .../res/drawable/ic_arrow_back.xml | 1 + .../res/drawable/ic_brightness_thumb.xml | 2 +- .../res/drawable/ic_camera.xml | 4 +- .../res/drawable/ic_cast_connected.xml | 4 +- .../res/drawable/ic_data_saver.xml | 4 +- .../drawable/ic_qs_bluetooth_connecting.xml | 1 + .../res/drawable/ic_volume_alarm_mute.xml | 1 + .../res/drawable/ic_battery_80_24dp.xml} | 3 +- .../res/drawable/ic_file_copy.xml | 2 +- .../res/drawable/ic_lock.xml | 1 - .../res/drawable/ic_lock_open.xml | 1 - .../res/drawable/ic_lockscreen_ime.xml | 1 + .../res/drawable/ic_mode_edit.xml | 13 +++-- .../drawable/ic_notifications_alerted.xml} | 10 ++-- .../res/drawable/ic_phone.xml | 2 + .../res/drawable/ic_qs_battery_saver.xml | 2 + .../res/drawable/ic_qs_bluetooth.xml | 1 + .../perm_group_activity_recognition.xml | 2 +- .../res/drawable/perm_group_calendar.xml | 1 + .../res/drawable/perm_group_call_log.xml | 2 +- .../res/drawable/perm_group_camera.xml | 2 +- .../res/drawable/perm_group_contacts.xml | 2 +- .../res/drawable/perm_group_location.xml | 2 +- .../res/drawable/perm_group_microphone.xml | 2 +- .../res/drawable/perm_group_phone_calls.xml | 2 +- .../res/drawable/perm_group_sensors.xml | 2 +- .../res/drawable/perm_group_sms.xml | 2 +- .../res/drawable/perm_group_storage.xml | 2 +- .../res/drawable/perm_group_visual.xml | 2 +- .../res/drawable/ic_setting.xml | 1 + .../res/drawable/ic_arrow_back.xml | 1 + .../res/drawable/ic_cellular_off.xml | 1 + .../res/drawable/ic_chevron_right_24dp.xml | 1 + .../drawable/ic_content_copy_grey600_24dp.xml | 2 +- .../res/drawable/ic_data_saver.xml | 19 +++---- .../res/drawable/ic_devices_other.xml | 1 + .../res/drawable/ic_eject_24dp.xml | 1 + .../res/drawable/ic_find_in_page_24px.xml | 32 ++++++++++++ .../res/drawable/ic_help_actionbar.xml | 1 + .../res/drawable/ic_network_cell.xml | 1 + .../drawable/ic_notifications_off_24dp.xml | 1 + .../res/drawable/ic_settings_data_usage.xml | 7 ++- .../res/drawable/ic_settings_language.xml | 26 ++++++++++ ...ent_24dp.xml => ic_settings_multiuser.xml} | 6 +-- .../drawable/ic_settings_wireless_white.xml | 34 ------------ .../res/drawable/ic_arrow_back.xml | 1 + .../res/drawable/ic_brightness_thumb.xml | 2 +- .../res/drawable/ic_camera.xml | 4 +- .../res/drawable/ic_cast_connected.xml | 4 +- .../res/drawable/ic_data_saver.xml | 22 ++++---- .../res/drawable/ic_data_saver_off.xml | 7 ++- .../drawable/ic_qs_bluetooth_connecting.xml | 1 + .../res/drawable/ic_volume_alarm_mute.xml | 1 + 170 files changed, 591 insertions(+), 400 deletions(-) rename packages/overlays/{IconPackFilledSettingsOverlay/res/drawable/ic_battery_status_bad_24dp.xml => IconPackCircularAndroidOverlay/res/drawable/ic_battery_80_24dp.xml} (74%) rename packages/overlays/{IconPackCircularSettingsOverlay/res/drawable/ic_delete_accent.xml => IconPackCircularAndroidOverlay/res/drawable/ic_notifications_alerted.xml} (53%) delete mode 100644 packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_battery_saver_accent_24dp.xml delete mode 100644 packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_battery_status_bad_24dp.xml create mode 100644 packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_find_in_page_24px.xml create mode 100644 packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_language.xml rename packages/overlays/{IconPackRoundedSettingsOverlay/res/drawable/ic_battery_status_bad_24dp.xml => IconPackCircularSettingsOverlay/res/drawable/ic_settings_multiuser.xml} (67%) delete mode 100644 packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_wireless_white.xml rename packages/overlays/{IconPackFilledSettingsOverlay/res/drawable/ic_delete_accent.xml => IconPackFilledAndroidOverlay/res/drawable/ic_battery_80_24dp.xml} (75%) rename packages/overlays/{IconPackFilledSettingsOverlay/res/drawable/ic_settings_wireless_white.xml => IconPackFilledAndroidOverlay/res/drawable/ic_notifications_alerted.xml} (55%) create mode 100644 packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_find_in_page_24px.xml create mode 100644 packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_language.xml create mode 100644 packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_multiuser.xml rename packages/overlays/{IconPackFilledSettingsOverlay/res/drawable/ic_battery_saver_accent_24dp.xml => IconPackRoundedAndroidOverlay/res/drawable/ic_battery_80_24dp.xml} (71%) rename packages/overlays/{IconPackRoundedSettingsOverlay/res/drawable/ic_delete_accent.xml => IconPackRoundedAndroidOverlay/res/drawable/ic_notifications_alerted.xml} (53%) create mode 100644 packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_find_in_page_24px.xml create mode 100644 packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_language.xml rename packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/{ic_battery_saver_accent_24dp.xml => ic_settings_multiuser.xml} (65%) delete mode 100644 packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_wireless_white.xml diff --git a/core/res/res/drawable/ic_audio_alarm.xml b/core/res/res/drawable/ic_audio_alarm.xml index 96206ea3ce57..93f9f8f99cdc 100644 --- a/core/res/res/drawable/ic_audio_alarm.xml +++ b/core/res/res/drawable/ic_audio_alarm.xml @@ -14,8 +14,8 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> diff --git a/core/res/res/drawable/ic_audio_alarm_mute.xml b/core/res/res/drawable/ic_audio_alarm_mute.xml index 7f248c3b33e6..510a7c630fd2 100644 --- a/core/res/res/drawable/ic_audio_alarm_mute.xml +++ b/core/res/res/drawable/ic_audio_alarm_mute.xml @@ -14,8 +14,8 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> diff --git a/core/res/res/drawable/ic_bluetooth_share_icon.xml b/core/res/res/drawable/ic_bluetooth_share_icon.xml index 2152af55d5b6..6acfd57e669f 100644 --- a/core/res/res/drawable/ic_bluetooth_share_icon.xml +++ b/core/res/res/drawable/ic_bluetooth_share_icon.xml @@ -19,7 +19,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24" - android:tint="@android:color/accent_device_default_light"> + android:tint="@*android:color/accent_device_default_light"> diff --git a/core/res/res/drawable/ic_file_copy.xml b/core/res/res/drawable/ic_file_copy.xml index b6d5e7328c40..d05b55f1279f 100644 --- a/core/res/res/drawable/ic_file_copy.xml +++ b/core/res/res/drawable/ic_file_copy.xml @@ -16,9 +16,10 @@ + android:fillColor="@android:color/white"/> diff --git a/core/res/res/drawable/ic_qs_auto_rotate.xml b/core/res/res/drawable/ic_qs_auto_rotate.xml index 47e1059fab44..8858e2b778bb 100644 --- a/core/res/res/drawable/ic_qs_auto_rotate.xml +++ b/core/res/res/drawable/ic_qs_auto_rotate.xml @@ -16,8 +16,8 @@ --> diff --git a/core/res/res/drawable/ic_qs_flashlight.xml b/core/res/res/drawable/ic_qs_flashlight.xml index e63595300d5f..59b0ccd493dd 100644 --- a/core/res/res/drawable/ic_qs_flashlight.xml +++ b/core/res/res/drawable/ic_qs_flashlight.xml @@ -15,8 +15,8 @@ limitations under the License. --> diff --git a/core/res/res/drawable/perm_group_aural.xml b/core/res/res/drawable/perm_group_aural.xml index b2737f24b86e..4b4c62cb73b6 100644 --- a/core/res/res/drawable/perm_group_aural.xml +++ b/core/res/res/drawable/perm_group_aural.xml @@ -16,6 +16,7 @@ Copyright (C) 2015 The Android Open Source Project - - \ No newline at end of file + diff --git a/core/res/res/drawable/perm_group_call_log.xml b/core/res/res/drawable/perm_group_call_log.xml index 0dfdbee4e600..a37ed88bebfc 100644 --- a/core/res/res/drawable/perm_group_call_log.xml +++ b/core/res/res/drawable/perm_group_call_log.xml @@ -18,6 +18,7 @@ diff --git a/core/res/res/drawable/perm_group_contacts.xml b/core/res/res/drawable/perm_group_contacts.xml index b834a27bac4b..dd6ae210181f 100644 --- a/core/res/res/drawable/perm_group_contacts.xml +++ b/core/res/res/drawable/perm_group_contacts.xml @@ -17,6 +17,7 @@ diff --git a/core/res/res/drawable/perm_group_location.xml b/core/res/res/drawable/perm_group_location.xml index a7fa52471ab4..a87fc0dc43df 100644 --- a/core/res/res/drawable/perm_group_location.xml +++ b/core/res/res/drawable/perm_group_location.xml @@ -17,6 +17,7 @@ diff --git a/core/res/res/drawable/perm_group_microphone.xml b/core/res/res/drawable/perm_group_microphone.xml index 9b532c1a7376..a1ed72510cf8 100644 --- a/core/res/res/drawable/perm_group_microphone.xml +++ b/core/res/res/drawable/perm_group_microphone.xml @@ -17,6 +17,7 @@ diff --git a/core/res/res/drawable/perm_group_phone_calls.xml b/core/res/res/drawable/perm_group_phone_calls.xml index 324d86492703..563222698b46 100644 --- a/core/res/res/drawable/perm_group_phone_calls.xml +++ b/core/res/res/drawable/perm_group_phone_calls.xml @@ -17,6 +17,7 @@ - \ No newline at end of file + diff --git a/core/res/res/drawable/perm_group_sensors.xml b/core/res/res/drawable/perm_group_sensors.xml index e4663d7206fc..f800965b6058 100644 --- a/core/res/res/drawable/perm_group_sensors.xml +++ b/core/res/res/drawable/perm_group_sensors.xml @@ -17,6 +17,7 @@ diff --git a/core/res/res/drawable/perm_group_storage.xml b/core/res/res/drawable/perm_group_storage.xml index 4b8965bd9ef8..fceda2b84885 100644 --- a/core/res/res/drawable/perm_group_storage.xml +++ b/core/res/res/drawable/perm_group_storage.xml @@ -17,6 +17,7 @@ diff --git a/core/res/res/drawable/perm_group_visual.xml b/core/res/res/drawable/perm_group_visual.xml index 9b21c279e30a..bf3edea74199 100644 --- a/core/res/res/drawable/perm_group_visual.xml +++ b/core/res/res/drawable/perm_group_visual.xml @@ -16,11 +16,10 @@ Copyright (C) 2015 The Android Open Source Project - diff --git a/core/tests/coretests/res/values/overlayable_icons_test.xml b/core/tests/coretests/res/values/overlayable_icons_test.xml index 68de2c0caf18..285db5005187 100644 --- a/core/tests/coretests/res/values/overlayable_icons_test.xml +++ b/core/tests/coretests/res/values/overlayable_icons_test.xml @@ -20,15 +20,18 @@ @*android:drawable/ic_audio_alarm @*android:drawable/ic_audio_alarm_mute + @*android:drawable/ic_battery_80_24dp @*android:drawable/ic_bluetooth_share_icon @*android:drawable/ic_bt_headphones_a2dp @*android:drawable/ic_bt_headset_hfp @*android:drawable/ic_bt_hearing_aid @*android:drawable/ic_bt_laptop + @*android:drawable/ic_bt_misc_hid @*android:drawable/ic_bt_network_pan @*android:drawable/ic_bt_pointing_hid @*android:drawable/ic_corp_badge @*android:drawable/ic_expand_more + @*android:drawable/ic_faster_emergency @*android:drawable/ic_file_copy @*android:drawable/ic_lock @*android:drawable/ic_lock_bugreport @@ -36,6 +39,7 @@ @*android:drawable/ic_lock_power_off @*android:drawable/ic_lockscreen_ime @*android:drawable/ic_mode_edit + @*android:drawable/ic_notifications_alerted @*android:drawable/ic_phone @*android:drawable/ic_qs_airplane @*android:drawable/ic_qs_auto_rotate diff --git a/packages/SystemUI/res/drawable/ic_info_outline.xml b/packages/SystemUI/res/drawable/ic_info_outline.xml index a4a3e9aab239..44e09f6faa51 100644 --- a/packages/SystemUI/res/drawable/ic_info_outline.xml +++ b/packages/SystemUI/res/drawable/ic_info_outline.xml @@ -15,8 +15,8 @@ --> diff --git a/packages/SystemUI/res/drawable/ic_qs_no_sim.xml b/packages/SystemUI/res/drawable/ic_qs_no_sim.xml index 22e12cc10405..6cabcaf4bcb4 100644 --- a/packages/SystemUI/res/drawable/ic_qs_no_sim.xml +++ b/packages/SystemUI/res/drawable/ic_qs_no_sim.xml @@ -14,8 +14,8 @@ Copyright (C) 2017 The Android Open Source Project limitations under the License. --> + android:pathData="M18,19V7c0-1.66-1.34-3-3-3h-1c0-0.55-0.45-1-1-1h-2c-0.55,0-1,0.45-1,1H9C7.34,4,6,5.34,6,7v12c0,1.66,1.34,3,3,3h6 C16.66,22,18,20.66,18,19z M9,5.5h6c0.83,0,1.5,0.67,1.5,1.5v1h-9V7C7.5,6.17,8.17,5.5,9,5.5z" /> \ No newline at end of file diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_bt_misc_hid.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_bt_misc_hid.xml index e182886d4252..5096f2f0f2e9 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_bt_misc_hid.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_bt_misc_hid.xml @@ -20,7 +20,6 @@ android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_file_copy.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_file_copy.xml index dc6ab95e23b1..b8e9845d5039 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_file_copy.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_file_copy.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lock.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lock.xml index 1e3400b40e79..5a67f95788ee 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lock.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lock.xml @@ -16,7 +16,6 @@ --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lock_open.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lock_open.xml index f4606a2a9d3e..21abd6e2d3ba 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lock_open.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lock_open.xml @@ -16,7 +16,6 @@ --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lockscreen_ime.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lockscreen_ime.xml index 4344e32a75aa..455bdd50ceba 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lockscreen_ime.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lockscreen_ime.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_mode_edit.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_mode_edit.xml index f0d782e03d11..aca3d52c1a24 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_mode_edit.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_mode_edit.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_delete_accent.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_notifications_alerted.xml similarity index 53% rename from packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_delete_accent.xml rename to packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_notifications_alerted.xml index b4d88271284c..86863b3b6c98 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_delete_accent.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_notifications_alerted.xml @@ -16,17 +16,19 @@ --> + android:pathData="M5.85,3.01C3.72,4.82,2.5,7.46,2.5,10.25C2.5,10.66,2.84,11,3.25,11S4,10.66,4,10.25c0-2.35,1.03-4.57,2.82-6.1 C7.14,3.88,7.17,3.41,6.91,3.1C6.64,2.78,6.17,2.74,5.85,3.01z" /> + android:pathData="M21.5,10.25c0-2.79-1.22-5.43-3.35-7.24c-0.32-0.27-0.79-0.23-1.06,0.08c-0.27,0.32-0.23,0.79,0.08,1.06 C18.97,5.68,20,7.9,20,10.25c0,0.41,0.34,0.75,0.75,0.75S21.5,10.66,21.5,10.25z" /> + android:pathData="M12,2.5c-0.83,0-1.5,0.67-1.5,1.5v0.7C7.91,5.36,6,7.71,6,10.5V15c0,0.55-0.45,1-1,1s-1,0.45-1,1v2h16v-2 c0-0.55-0.45-1-1-1s-1-0.45-1-1v-4.5c0-2.79-1.91-5.14-4.5-5.8V4C13.5,3.17,12.83,2.5,12,2.5z M16.5,10.5V15 c0,1.21,0.86,2.22,2,2.45v0.05h-13v-0.05c1.14-0.23,2-1.24,2-2.45v-4.5C7.5,8.02,9.52,6,12,6S16.5,8.02,16.5,10.5z" /> + \ No newline at end of file diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_phone.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_phone.xml index 28733c1890cb..85c184b9f9a8 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_phone.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_phone.xml @@ -15,7 +15,9 @@ limitations under the License. --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_battery_saver.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_battery_saver.xml index a558337902c4..73310b03f625 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_battery_saver.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_battery_saver.xml @@ -15,7 +15,9 @@ limitations under the License. --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_bluetooth.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_bluetooth.xml index 452a032c49e9..19731249bfc7 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_bluetooth.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_bluetooth.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_0_4_bar.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_0_4_bar.xml index e09aeb7f1d2f..d9dfa54697e4 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_0_4_bar.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_0_4_bar.xml @@ -19,28 +19,32 @@ android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - - - - + + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_1_4_bar.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_1_4_bar.xml index 26e96ab4c5c8..70f91afab7d5 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_1_4_bar.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_1_4_bar.xml @@ -19,25 +19,30 @@ android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - - - - + + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_2_4_bar.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_2_4_bar.xml index 53be899d5a8d..f014eea9354f 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_2_4_bar.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_2_4_bar.xml @@ -19,22 +19,28 @@ android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - - - - + + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_3_4_bar.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_3_4_bar.xml index 9139bb449509..9b83fab35144 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_3_4_bar.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_3_4_bar.xml @@ -19,19 +19,26 @@ android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - - - - + + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_4_4_bar.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_4_4_bar.xml index 2c8d70123f60..6f7f48d1ea96 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_4_4_bar.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_4_4_bar.xml @@ -19,16 +19,24 @@ android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - - - - + + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_activity_recognition.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_activity_recognition.xml index 5ad146eb21ac..cbd60d880fb2 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_activity_recognition.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_activity_recognition.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_calendar.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_calendar.xml index 781c0f8e8ea5..397050fd88f4 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_calendar.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_calendar.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_call_log.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_call_log.xml index 126b70cff251..b56eec39334c 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_call_log.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_call_log.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_camera.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_camera.xml index 70d4fcc945df..c8cb2e2cfc1f 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_camera.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_camera.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_contacts.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_contacts.xml index 6da4b269d312..6124df86e931 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_contacts.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_contacts.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_location.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_location.xml index d443a7484e5a..77ff42ad3e25 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_location.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_location.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_microphone.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_microphone.xml index cdac2d8cadaa..06aa0cd3f238 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_microphone.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_microphone.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_phone_calls.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_phone_calls.xml index 991f320add6c..3aea5f44902b 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_phone_calls.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_phone_calls.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_sensors.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_sensors.xml index e4dee2adc467..4d70fc90850e 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_sensors.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_sensors.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_sms.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_sms.xml index d15cfa3b1e3a..30ed8c92a198 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_sms.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_sms.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_storage.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_storage.xml index 29d26736135b..52cd4c1c7153 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_storage.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_storage.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_visual.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_visual.xml index 519136a28725..1c461791c868 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_visual.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_visual.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_setting.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_setting.xml index 4c9b5d7b1c48..f1f0f507d4b9 100644 --- a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_setting.xml +++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_setting.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_arrow_back.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_arrow_back.xml index 920ecb5deb70..a9e1ffe6d69e 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_arrow_back.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_arrow_back.xml @@ -15,6 +15,7 @@ limitations under the License. --> - - - - - \ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_battery_status_bad_24dp.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_battery_status_bad_24dp.xml deleted file mode 100644 index a558337902c4..000000000000 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_battery_status_bad_24dp.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_cellular_off.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_cellular_off.xml index 57fcebc91d2e..6df47564407e 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_cellular_off.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_cellular_off.xml @@ -15,6 +15,7 @@ limitations under the License. --> diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_data_saver.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_data_saver.xml index 77c0a158ebdd..ba3c5808d26c 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_data_saver.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_data_saver.xml @@ -15,18 +15,19 @@ limitations under the License. --> - - - + + + \ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_devices_other.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_devices_other.xml index 17a191e2ad07..14898c465a31 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_devices_other.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_devices_other.xml @@ -15,6 +15,7 @@ limitations under the License. --> diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_find_in_page_24px.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_find_in_page_24px.xml new file mode 100644 index 000000000000..fd1a00dc738b --- /dev/null +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_find_in_page_24px.xml @@ -0,0 +1,32 @@ + + + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_help_actionbar.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_help_actionbar.xml index 8b388f2d8761..b980a2cce710 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_help_actionbar.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_help_actionbar.xml @@ -15,6 +15,7 @@ limitations under the License. --> - - - - + + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_notifications_off_24dp.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_notifications_off_24dp.xml index 2dc6545c0fe3..2a21776232b4 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_notifications_off_24dp.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_notifications_off_24dp.xml @@ -15,6 +15,7 @@ limitations under the License. --> - + android:fillType="evenOdd" + android:pathData="M19.5000671,12 C19.5000671,8.198 16.6680671,5.064 13.0000671,4.574 L13.0000671,2.05 C18.0500671,2.55 22.0000671,6.82 22.0000671,12 C22.0000671,13.45 21.6800671,14.83 21.1200671,16.07 L18.9560671,14.796 C19.3040671,13.932 19.5000671,12.989 19.5000671,12 Z M12.0000671,19.5 C14.3900671,19.5 16.5140671,18.378 17.8870671,16.637 C18.6270671,17.073 20.0500671,17.91 20.0500671,17.91 C17.9790671,20.732 14.4710671,22.427 10.6010671,21.906 C6.22106711,21.316 2.68406711,17.774 2.09406711,13.394 C1.31306711,7.591 5.49306711,2.594 11.0000671,2.05 L11.0000671,4.574 C7.33206711,5.064 4.50006711,8.198 4.50006711,12 C4.50006711,16.142 7.85806711,19.5 12.0000671,19.5 Z" + android:strokeWidth="1" /> \ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_language.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_language.xml new file mode 100644 index 000000000000..2c83c3481ba4 --- /dev/null +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_language.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_battery_status_bad_24dp.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_multiuser.xml similarity index 67% rename from packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_battery_status_bad_24dp.xml rename to packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_multiuser.xml index db4d302eb240..d6d655871b74 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_battery_status_bad_24dp.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_multiuser.xml @@ -16,13 +16,14 @@ --> + android:pathData="M8,8c0,2.21,1.79,4,4,4s4-1.79,4-4c0-2.21-1.79-4-4-4S8,5.79,8,8z M12,5.5c1.38,0,2.5,1.12,2.5,2.5 c0,1.38-1.12,2.5-2.5,2.5S9.5,9.38,9.5,8C9.5,6.62,10.62,5.5,12,5.5z" /> + android:pathData="M20,20c0-3.99-4-6-8-6s-8,2.01-8,6H20z M12,15.5c2.57,0,5.3,0.95,6.2,3H5.8C6.7,16.45,9.43,15.5,12,15.5z" /> \ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_wireless_white.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_wireless_white.xml deleted file mode 100644 index fde996584f57..000000000000 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_wireless_white.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_arrow_back.xml b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_arrow_back.xml index 920ecb5deb70..a9e1ffe6d69e 100644 --- a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_arrow_back.xml +++ b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_arrow_back.xml @@ -15,6 +15,7 @@ limitations under the License. --> + android:width="17dp" > diff --git a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_data_saver.xml b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_data_saver.xml index 938d2412bef8..cdc3bfbd3d5f 100644 --- a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_data_saver.xml +++ b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_data_saver.xml @@ -15,17 +15,17 @@ limitations under the License. --> - - - + android:width="18dp" > + + + \ No newline at end of file diff --git a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_data_saver_off.xml b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_data_saver_off.xml index 3d620a18bb1a..7dab949f9da5 100644 --- a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_data_saver_off.xml +++ b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_data_saver_off.xml @@ -21,8 +21,7 @@ android:width="24dp" > - + android:fillType="evenOdd" + android:pathData="M19.5000671,12 C19.5000671,8.198 16.6680671,5.064 13.0000671,4.574 L13.0000671,2.05 C18.0500671,2.55 22.0000671,6.82 22.0000671,12 C22.0000671,13.45 21.6800671,14.83 21.1200671,16.07 L18.9560671,14.796 C19.3040671,13.932 19.5000671,12.989 19.5000671,12 Z M12.0000671,19.5 C14.3900671,19.5 16.5140671,18.378 17.8870671,16.637 C18.6270671,17.073 20.0500671,17.91 20.0500671,17.91 C17.9790671,20.732 14.4710671,22.427 10.6010671,21.906 C6.22106711,21.316 2.68406711,17.774 2.09406711,13.394 C1.31306711,7.591 5.49306711,2.594 11.0000671,2.05 L11.0000671,4.574 C7.33206711,5.064 4.50006711,8.198 4.50006711,12 C4.50006711,16.142 7.85806711,19.5 12.0000671,19.5 Z" + android:strokeWidth="1" /> \ No newline at end of file diff --git a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml index fc38ed431759..c7a0266cbfca 100644 --- a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml +++ b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml index 659b4e164415..9bdc79a23008 100644 --- a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml +++ b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_delete_accent.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_battery_80_24dp.xml similarity index 75% rename from packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_delete_accent.xml rename to packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_battery_80_24dp.xml index e65987e1d5f6..eb8550fb9f44 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_delete_accent.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_battery_80_24dp.xml @@ -16,14 +16,16 @@ --> + android:pathData="M17,5.33C17,4.6,16.4,4,15.67,4H14V2h-4v2H8.33C7.6,4,7,4.6,7,5.33V9h10V5.33z" + android:strokeAlpha="0.3" + android:strokeWidth="1" /> + android:pathData="M7,9v11.67C7,21.4,7.6,22,8.33,22h7.33C16.4,22,17,21.4,17,20.67V9H7z" /> \ No newline at end of file diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_bt_misc_hid.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_bt_misc_hid.xml index b86d9ba1849b..6b9735c1acfb 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_bt_misc_hid.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_bt_misc_hid.xml @@ -20,7 +20,6 @@ android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_file_copy.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_file_copy.xml index 6245147c538b..e479f506bac5 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_file_copy.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_file_copy.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lock.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lock.xml index 07c81ddf563c..b2fa85f9fd16 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lock.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lock.xml @@ -16,7 +16,6 @@ --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lock_open.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lock_open.xml index 698ce668c1e9..13bfbf901adb 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lock_open.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lock_open.xml @@ -16,7 +16,6 @@ --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lockscreen_ime.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lockscreen_ime.xml index 4cd05f3374c9..16541e614965 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lockscreen_ime.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lockscreen_ime.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_mode_edit.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_mode_edit.xml index bf8df45826ec..bb3c043f68f5 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_mode_edit.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_mode_edit.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_wireless_white.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_notifications_alerted.xml similarity index 55% rename from packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_wireless_white.xml rename to packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_notifications_alerted.xml index 03e142e2be35..0847a3564998 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_wireless_white.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_notifications_alerted.xml @@ -21,11 +21,14 @@ android:width="24dp" > + android:pathData="M4.12,9.67C4.42,7.73,5.38,6,6.77,4.73C7.19,4.35,7.2,3.7,6.8,3.3c-0.39-0.39-1-0.39-1.4-0.03 C3.7,4.84,2.52,6.96,2.15,9.34c-0.1,0.61,0.37,1.16,0.99,1.16C3.63,10.5,4.04,10.15,4.12,9.67z" /> + android:pathData="M18.6,3.28c-0.4-0.37-1.02-0.36-1.4,0.02c-0.4,0.4-0.38,1.04,0.03,1.42c1.38,1.27,2.35,3,2.65,4.94 c0.08,0.49,0.5,0.84,0.98,0.84c0.61,0,1.09-0.55,0.99-1.16C21.47,6.96,20.29,4.84,18.6,3.28z" /> + android:pathData="M12,22c1.1,0,2-0.9,2-2h-4C10,21.1,10.9,22,12,22z" /> + \ No newline at end of file diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_phone.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_phone.xml index de348159cc6c..adf521c853ae 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_phone.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_phone.xml @@ -15,7 +15,9 @@ limitations under the License. --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_battery_saver.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_battery_saver.xml index 22e183c694d5..4f7d96381e6e 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_battery_saver.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_battery_saver.xml @@ -15,7 +15,9 @@ limitations under the License. --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_bluetooth.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_bluetooth.xml index 09643e606350..58800c8d29be 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_bluetooth.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_bluetooth.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_activity_recognition.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_activity_recognition.xml index e1849bbee061..67d28c60b7a0 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_activity_recognition.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_activity_recognition.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_calendar.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_calendar.xml index 16359b04178d..0144ba2fbf36 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_calendar.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_calendar.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_call_log.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_call_log.xml index 8d70f484e731..590ced09e4af 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_call_log.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_call_log.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_camera.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_camera.xml index 03075a688846..b063e2bb6985 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_camera.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_camera.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_contacts.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_contacts.xml index 50cd6331e42a..54cfeec0355e 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_contacts.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_contacts.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_location.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_location.xml index ebd9e61d8efe..3815921846b7 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_location.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_location.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_microphone.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_microphone.xml index 39acc9ca82a1..e6493bc95ff2 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_microphone.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_microphone.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_phone_calls.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_phone_calls.xml index 2b6e32a59cab..ae84541e0801 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_phone_calls.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_phone_calls.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_sensors.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_sensors.xml index 2128e79b350a..88f0c541caf5 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_sensors.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_sensors.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_sms.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_sms.xml index eef9e62f15b0..7a320e0c81e2 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_sms.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_sms.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_storage.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_storage.xml index 3a863a342354..0ad7e6d3484b 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_storage.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_storage.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_visual.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_visual.xml index 57c7ae9f6efa..d5bdb872825e 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_visual.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_visual.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_setting.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_setting.xml index 30e866095675..b3625ac9cf15 100644 --- a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_setting.xml +++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_setting.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_arrow_back.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_arrow_back.xml index b4f2a9de63a6..deb77c820ecb 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_arrow_back.xml +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_arrow_back.xml @@ -15,6 +15,7 @@ limitations under the License. --> diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_data_saver.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_data_saver.xml index 2718efadfe59..5c85eb36b41c 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_data_saver.xml +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_data_saver.xml @@ -15,6 +15,7 @@ limitations under the License. --> diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_find_in_page_24px.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_find_in_page_24px.xml new file mode 100644 index 000000000000..dd35dae227b0 --- /dev/null +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_find_in_page_24px.xml @@ -0,0 +1,27 @@ + + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_help_actionbar.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_help_actionbar.xml index ed6d553f5f37..4d6d9dd0a9e5 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_help_actionbar.xml +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_help_actionbar.xml @@ -15,6 +15,7 @@ limitations under the License. --> + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_multiuser.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_multiuser.xml new file mode 100644 index 000000000000..accc694238d9 --- /dev/null +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_multiuser.xml @@ -0,0 +1,29 @@ + + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_arrow_back.xml b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_arrow_back.xml index b4f2a9de63a6..deb77c820ecb 100644 --- a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_arrow_back.xml +++ b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_arrow_back.xml @@ -15,6 +15,7 @@ limitations under the License. --> \ No newline at end of file diff --git a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_camera.xml b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_camera.xml index ae3e7e2d60c6..fac551cf4a63 100644 --- a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_camera.xml +++ b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_camera.xml @@ -15,10 +15,10 @@ limitations under the License. --> + android:width="17dp" > diff --git a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_cast_connected.xml b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_cast_connected.xml index f5056f2a1f12..bbe2cff62720 100644 --- a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_cast_connected.xml +++ b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_cast_connected.xml @@ -15,10 +15,10 @@ limitations under the License. --> + android:width="24dp" > diff --git a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_data_saver.xml b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_data_saver.xml index 3d4cf5e88f07..28b8ba1bccfc 100644 --- a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_data_saver.xml +++ b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_data_saver.xml @@ -15,10 +15,10 @@ limitations under the License. --> + android:width="18dp" > diff --git a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml index f661673e1fea..59a18bad6c66 100644 --- a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml +++ b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml index 8640a7950672..e498f803f687 100644 --- a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml +++ b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_battery_saver_accent_24dp.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_battery_80_24dp.xml similarity index 71% rename from packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_battery_saver_accent_24dp.xml rename to packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_battery_80_24dp.xml index 4ddeae66401c..c19ca31d41b2 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_battery_saver_accent_24dp.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_battery_80_24dp.xml @@ -16,11 +16,10 @@ --> + android:pathData="M13,2.49h-2c-0.55,0-1,0.45-1,1V4H7C6.45,4,6,4.45,6,5v16c0,0.55,0.45,1,1,1h10c0.55,0,1-0.45,1-1V5c0-0.55-0.45-1-1-1h-3 V3.49C14,2.94,13.55,2.49,13,2.49z M16.5,9.01h-9V5.5h9V9.01z" /> \ No newline at end of file diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_file_copy.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_file_copy.xml index 97945f00395e..1feaab1663c1 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_file_copy.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_file_copy.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lock.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lock.xml index ac8e4781b904..d0b85e70920d 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lock.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lock.xml @@ -16,7 +16,6 @@ --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lock_open.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lock_open.xml index 345d6b181b92..6f19afe7c484 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lock_open.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lock_open.xml @@ -16,7 +16,6 @@ --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lockscreen_ime.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lockscreen_ime.xml index 16f0868987fb..fae8445a0a42 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lockscreen_ime.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lockscreen_ime.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_mode_edit.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_mode_edit.xml index 5db3b12ac1dd..c44a8d6fb9c5 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_mode_edit.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_mode_edit.xml @@ -16,10 +16,17 @@ --> - + + + \ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_delete_accent.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_notifications_alerted.xml similarity index 53% rename from packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_delete_accent.xml rename to packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_notifications_alerted.xml index d30eb7c0f098..752dab5082a4 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_delete_accent.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_notifications_alerted.xml @@ -16,17 +16,19 @@ --> + android:pathData="M14,20h-4c0,1.1,0.9,2,2,2S14,21.1,14,20z" /> + android:pathData="M12,2.5c-0.69,0-1.25,0.56-1.25,1.25v0.77C8.04,5.11,6,7.51,6,10.4V17H4.75C4.34,17,4,17.34,4,17.75s0.34,0.75,0.75,0.75 h14.5c0.41,0,0.75-0.34,0.75-0.75S19.66,17,19.25,17H18v-6.6c0-2.88-2.04-5.29-4.75-5.87V3.75C13.25,3.06,12.69,2.5,12,2.5z M16.5,10.4V17h-9v-6.6c0-2.48,2.02-4.5,4.5-4.5S16.5,7.91,16.5,10.4z" /> + android:pathData="M5.85,3.01C3.72,4.82,2.5,7.46,2.5,10.25C2.5,10.66,2.84,11,3.25,11S4,10.66,4,10.25c0-2.35,1.03-4.57,2.82-6.1 C7.14,3.88,7.17,3.41,6.91,3.1C6.64,2.78,6.17,2.74,5.85,3.01z" /> + \ No newline at end of file diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_phone.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_phone.xml index 21153928240f..c6e8f57f5ec1 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_phone.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_phone.xml @@ -15,7 +15,9 @@ limitations under the License. --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_battery_saver.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_battery_saver.xml index db4d302eb240..ca37d581332b 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_battery_saver.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_battery_saver.xml @@ -15,7 +15,9 @@ limitations under the License. --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_bluetooth.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_bluetooth.xml index 3d270b3fce42..5e1a5f20c6d6 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_bluetooth.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_bluetooth.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_activity_recognition.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_activity_recognition.xml index b470603cddd0..669704775311 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_activity_recognition.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_activity_recognition.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_calendar.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_calendar.xml index e9dddd071481..4e61af0dbf34 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_calendar.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_calendar.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_call_log.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_call_log.xml index 2d6a6b916789..8d3c43c3d216 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_call_log.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_call_log.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_camera.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_camera.xml index e3498c380d11..7d42ff758b8c 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_camera.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_camera.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_contacts.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_contacts.xml index 987ed184a826..5d68581757ba 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_contacts.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_contacts.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_location.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_location.xml index 2da48d857617..5dce9cb985b3 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_location.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_location.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_microphone.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_microphone.xml index ddf14df872f2..b45e8322628d 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_microphone.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_microphone.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_phone_calls.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_phone_calls.xml index 516ee36d7f48..fe45a97a3287 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_phone_calls.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_phone_calls.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_sensors.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_sensors.xml index 65a193d98b32..c84cb0e99bde 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_sensors.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_sensors.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_sms.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_sms.xml index b5509d12a059..96b70f7fbfbd 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_sms.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_sms.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_storage.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_storage.xml index 9b17e55f0be1..9240bb48b35e 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_storage.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_storage.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_visual.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_visual.xml index 350bb4b80c85..2cd1bc0f17b0 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_visual.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_visual.xml @@ -16,7 +16,7 @@ --> diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_setting.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_setting.xml index 86cb525e203a..70621ae19749 100644 --- a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_setting.xml +++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_setting.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_arrow_back.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_arrow_back.xml index 03f06e997e26..34f79b4478c9 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_arrow_back.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_arrow_back.xml @@ -15,6 +15,7 @@ limitations under the License. --> diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_data_saver.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_data_saver.xml index 9acb62da7d43..ba3c5808d26c 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_data_saver.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_data_saver.xml @@ -15,18 +15,19 @@ limitations under the License. --> - - - + + + \ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_devices_other.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_devices_other.xml index 9283216b1a2f..463525d4bf26 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_devices_other.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_devices_other.xml @@ -15,6 +15,7 @@ limitations under the License. --> diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_find_in_page_24px.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_find_in_page_24px.xml new file mode 100644 index 000000000000..a54c0f080b5e --- /dev/null +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_find_in_page_24px.xml @@ -0,0 +1,32 @@ + + + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_help_actionbar.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_help_actionbar.xml index e0a6f9553b15..c7d672efa574 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_help_actionbar.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_help_actionbar.xml @@ -15,6 +15,7 @@ limitations under the License. --> - + android:fillType="evenOdd" + android:pathData="M19.5000671,12 C19.5000671,8.198 16.6680671,5.064 13.0000671,4.574 L13.0000671,2.05 C18.0500671,2.55 22.0000671,6.82 22.0000671,12 C22.0000671,13.45 21.6800671,14.83 21.1200671,16.07 L18.9560671,14.796 C19.3040671,13.932 19.5000671,12.989 19.5000671,12 Z M12.0000671,19.5 C14.3900671,19.5 16.5140671,18.378 17.8870671,16.637 C18.6270671,17.073 20.0500671,17.91 20.0500671,17.91 C17.9790671,20.732 14.4710671,22.427 10.6010671,21.906 C6.22106711,21.316 2.68406711,17.774 2.09406711,13.394 C1.31306711,7.591 5.49306711,2.594 11.0000671,2.05 L11.0000671,4.574 C7.33206711,5.064 4.50006711,8.198 4.50006711,12 C4.50006711,16.142 7.85806711,19.5 12.0000671,19.5 Z" + android:strokeWidth="1" /> \ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_language.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_language.xml new file mode 100644 index 000000000000..730942bda59c --- /dev/null +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_language.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_battery_saver_accent_24dp.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_multiuser.xml similarity index 65% rename from packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_battery_saver_accent_24dp.xml rename to packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_multiuser.xml index 9b39a9406dc8..83d9d2a9311e 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_battery_saver_accent_24dp.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_multiuser.xml @@ -16,14 +16,14 @@ --> + android:pathData="M4,19c0,0.55,0.45,1,1,1h14c0.55,0,1-0.45,1-1v-3c0-1.66-1.34-3-3-3H7c-1.66,0-3,1.34-3,3V19z M5.5,16 c0-0.83,0.67-1.5,1.5-1.5h10c0.83,0,1.5,0.67,1.5,1.5v2.5h-13V16z" /> + android:pathData="M8,8c0,2.21,1.79,4,4,4s4-1.79,4-4c0-2.21-1.79-4-4-4S8,5.79,8,8z M12,5.5c1.38,0,2.5,1.12,2.5,2.5 c0,1.38-1.12,2.5-2.5,2.5S9.5,9.38,9.5,8C9.5,6.62,10.62,5.5,12,5.5z" /> \ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_wireless_white.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_wireless_white.xml deleted file mode 100644 index 0a1c3055870d..000000000000 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_wireless_white.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_arrow_back.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_arrow_back.xml index 03f06e997e26..34f79b4478c9 100644 --- a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_arrow_back.xml +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_arrow_back.xml @@ -15,6 +15,7 @@ limitations under the License. --> + android:width="17dp" > diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_cast_connected.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_cast_connected.xml index 14d88e76bb91..f2821668c870 100644 --- a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_cast_connected.xml +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_cast_connected.xml @@ -15,10 +15,10 @@ limitations under the License. --> + android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_data_saver.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_data_saver.xml index ee11b84b28ba..cdc3bfbd3d5f 100644 --- a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_data_saver.xml +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_data_saver.xml @@ -15,17 +15,17 @@ limitations under the License. --> - - - + android:width="18dp" > + + + \ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_data_saver_off.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_data_saver_off.xml index 3d620a18bb1a..7dab949f9da5 100644 --- a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_data_saver_off.xml +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_data_saver_off.xml @@ -21,8 +21,7 @@ android:width="24dp" > - + android:fillType="evenOdd" + android:pathData="M19.5000671,12 C19.5000671,8.198 16.6680671,5.064 13.0000671,4.574 L13.0000671,2.05 C18.0500671,2.55 22.0000671,6.82 22.0000671,12 C22.0000671,13.45 21.6800671,14.83 21.1200671,16.07 L18.9560671,14.796 C19.3040671,13.932 19.5000671,12.989 19.5000671,12 Z M12.0000671,19.5 C14.3900671,19.5 16.5140671,18.378 17.8870671,16.637 C18.6270671,17.073 20.0500671,17.91 20.0500671,17.91 C17.9790671,20.732 14.4710671,22.427 10.6010671,21.906 C6.22106711,21.316 2.68406711,17.774 2.09406711,13.394 C1.31306711,7.591 5.49306711,2.594 11.0000671,2.05 L11.0000671,4.574 C7.33206711,5.064 4.50006711,8.198 4.50006711,12 C4.50006711,16.142 7.85806711,19.5 12.0000671,19.5 Z" + android:strokeWidth="1" /> \ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml index f2284bc37287..85c2bcdbdce0 100644 --- a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml @@ -16,6 +16,7 @@ --> diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml index 15201e924933..3a26cbaf7238 100644 --- a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml @@ -16,6 +16,7 @@ --> -- GitLab From bdad8c206578128c8059d6027529dcb66bd186c0 Mon Sep 17 00:00:00 2001 From: Amin Shaikh Date: Tue, 28 May 2019 17:38:22 -0400 Subject: [PATCH 022/620] Update filled themed QS bluetooth icon. There was an inconsistency between the bluetooth icon and the bluetooth connected icon for the filled theme, making the animation look off. Fixes: 118757654 Test: make Change-Id: Ia278eb70df140182bdee31a22b32f8648a191060 --- .../res/drawable/ic_qs_bluetooth.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_bluetooth.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_bluetooth.xml index 09643e606350..012fdb6f5b8b 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_bluetooth.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_bluetooth.xml @@ -21,5 +21,5 @@ android:width="24dp" > + android:pathData="M13.51,12l3.75-3.74c0.41-0.41,0.41-1.07,0-1.48l-4.47-4.47l-0.03-0.03c-0.42-0.39-1.08-0.37-1.48,0.05 C11.1,2.52,11,2.78,11,3.04v6.44L6.95,5.43c-0.41-0.41-1.06-0.41-1.47,0c-0.41,0.41-0.41,1.06,0,1.47l5.09,5.1l-5.09,5.09 c-0.41,0.41-0.41,1.06,0,1.47c0.41,0.41,1.06,0.41,1.47,0L11,14.51v6.45c0,0.57,0.47,1.04,1.04,1.04c0.26,0,0.52-0.1,0.71-0.28 l0.05-0.05l4.46-4.46c0.41-0.41,0.41-1.07,0-1.48L13.51,12z M12.99,5.37l2.15,2.15l-2.15,2.15V5.37z M12.99,18.62v-4.3l2.15,2.15 L12.99,18.62z" /> \ No newline at end of file -- GitLab From 260416cfd456cabb26cef8877ea5efe1cf6a04da Mon Sep 17 00:00:00 2001 From: chen xu Date: Tue, 28 May 2019 15:28:37 -0700 Subject: [PATCH 023/620] skip permission check for TelephonyManager API getMmsUserAgent Bug: 133637995 Test: Manual test Change-Id: Ib9f211120c34e9b48c02f990088c32fb307a64f2 (cherry picked from commit 48781653654ff06b5db51ab312fd1f01111d65de) --- .../android/telephony/TelephonyManager.java | 24 ++++++++++++++----- .../internal/telephony/ITelephony.aidl | 10 ++++++++ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index d63c37accb37..2ba34c6c3453 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -5356,18 +5356,30 @@ public class TelephonyManager { * Returns the MMS user agent. */ public String getMmsUserAgent() { - if (mContext == null) return null; - return SubscriptionManager.getResourcesForSubId(mContext, getSubId()).getString( - com.android.internal.R.string.config_mms_user_agent); + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + return telephony.getMmsUserAgent(getSubId()); + } + } catch (RemoteException ex) { + } catch (NullPointerException ex) { + } + return null; } /** * Returns the MMS user agent profile URL. */ public String getMmsUAProfUrl() { - if (mContext == null) return null; - return SubscriptionManager.getResourcesForSubId(mContext, getSubId()).getString( - com.android.internal.R.string.config_mms_user_agent_profile_url); + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + return telephony.getMmsUAProfUrl(getSubId()); + } + } catch (RemoteException ex) { + } catch (NullPointerException ex) { + } + return null; } /** diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 63aded1c4b20..cf1323a328fe 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -1986,4 +1986,14 @@ interface ITelephony { * outgoing SmsManager operation. */ oneway void enqueueSmsPickResult(String callingPackage, IIntegerConsumer subIdResult); + + /** + * Returns the MMS user agent. + */ + String getMmsUserAgent(int subId); + + /** + * Returns the MMS user agent profile URL. + */ + String getMmsUAProfUrl(int subId); } -- GitLab From c0bb3fe2efccb4df41995dda4590ad8a363bd370 Mon Sep 17 00:00:00 2001 From: Benjamin Schwartz Date: Tue, 28 May 2019 17:09:44 -0700 Subject: [PATCH 024/620] statsd: Remove repetitive logging if ODPM is not present Bug: 133674207 Test: adb shell cmd stats pull-source 10038 Test: tested above command on Pixel device without ODPM Change-Id: Iae8fe3c824167dad2659c1f8172f7646d7925d32 --- cmds/statsd/src/external/PowerStatsPuller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmds/statsd/src/external/PowerStatsPuller.cpp b/cmds/statsd/src/external/PowerStatsPuller.cpp index c56f9a27086e..b142caca3acc 100644 --- a/cmds/statsd/src/external/PowerStatsPuller.cpp +++ b/cmds/statsd/src/external/PowerStatsPuller.cpp @@ -85,7 +85,6 @@ bool PowerStatsPuller::PullInternal(vector>* data) { std::lock_guard lock(gPowerStatsHalMutex); if (!getPowerStatsHalLocked()) { - ALOGE("power.stats Hal not loaded"); return false; } @@ -116,6 +115,7 @@ bool PowerStatsPuller::PullInternal(vector>* data) { if (gRailInfo.empty()) { ALOGE("power.stats has no rail information"); gPowerStatsExist = false; // No rail info, so never try again. + gPowerStatsHal = nullptr; return false; } } -- GitLab From 2a42d99897c5da804926627984c0fb587d9ce78f Mon Sep 17 00:00:00 2001 From: Feng Cao Date: Tue, 28 May 2019 17:10:23 -0700 Subject: [PATCH 025/620] Make content capture send text update event for TextView even when it is not editable (EditText) Test: atest CtsContentCaptureServiceTestCases Fixes: 124203774 Change-Id: Ib79c847d68dfcde89155e18feea1bc34206269f9 --- core/java/android/widget/TextView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index cdbec293a96d..383d9b4e9c41 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -10578,7 +10578,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // notifyAppeared was not sent. // ContentCapture - if (isLaidOut() && isImportantForContentCapture() && isTextEditable()) { + if (isLaidOut() && isImportantForContentCapture()) { final ContentCaptureManager cm = mContext.getSystemService(ContentCaptureManager.class); if (cm != null && cm.isContentCaptureEnabled()) { final ContentCaptureSession session = getContentCaptureSession(); -- GitLab From 1b883b4858adc0414f48a89b278b986469cc029e Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Tue, 28 May 2019 17:43:59 -0700 Subject: [PATCH 026/620] Move bypass default value to framework It also needs to be read from Settings Bug: 130327302 Test: make Test: toggle setting on Settings app Change-Id: I46b7e61764e4bc9a07110e4b0b25deb7bc0b88f1 --- core/res/res/values/config.xml | 3 +++ core/res/res/values/symbols.xml | 1 + packages/SystemUI/res/values/config.xml | 3 --- .../statusbar/phone/KeyguardBypassController.kt | 11 ++++++++--- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index fb585693c8a5..483ec376df06 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4117,6 +4117,9 @@ + + true + diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index d910be976b98..7563a454b1da 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2581,6 +2581,7 @@ + diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 19e7b734912a..6039568cab3a 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -40,9 +40,6 @@ false - - false - 0 diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt index 5b5eb767e184..5abf39e781f3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt @@ -17,10 +17,10 @@ package com.android.systemui.statusbar.phone import android.content.Context +import android.hardware.face.FaceManager import android.provider.Settings import com.android.internal.annotations.VisibleForTesting import com.android.keyguard.KeyguardUpdateMonitor -import com.android.systemui.R import com.android.systemui.tuner.TunerService import javax.inject.Inject @@ -32,8 +32,13 @@ class KeyguardBypassController { @Inject constructor(context: Context, tunerService: TunerService) { - val dismissByDefault = if (context.getResources().getBoolean( - R.bool.config_faceAuthDismissesKeyguard)) 1 else 0 + val faceManager = context.getSystemService(FaceManager::class.java) + if (faceManager?.isHardwareDetected != true) { + return + } + + val dismissByDefault = if (context.resources.getBoolean( + com.android.internal.R.bool.config_faceAuthDismissesKeyguard)) 1 else 0 tunerService.addTunable( object : TunerService.Tunable { override fun onTuningChanged(key: String?, newValue: String?) { -- GitLab From 4108a9b46cb385ed285f80df408a913922e748c2 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Tue, 28 May 2019 20:41:51 -0700 Subject: [PATCH 027/620] Do not wake up in MODE_NONE Test: pulse, face auth Fixes: 133525174 Change-Id: Idcf927be54044a47ce981230398dabe3a366158a --- .../systemui/statusbar/phone/BiometricUnlockController.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 6159f6ca7d1e..d67795210f0c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -23,7 +23,6 @@ import android.os.Handler; import android.os.PowerManager; import android.os.SystemClock; import android.os.Trace; -import android.provider.Settings; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; @@ -34,7 +33,6 @@ import com.android.keyguard.KeyguardConstants; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.Dependency; -import com.android.systemui.R; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle; @@ -272,7 +270,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { Trace.endSection(); }; - if (!delayWakeUp) { + if (!delayWakeUp && mMode != MODE_NONE) { wakeUp.run(); } switch (mMode) { -- GitLab From 4ec838b6ff785c4abcc5a5c589d97b0ef2d0f1ee Mon Sep 17 00:00:00 2001 From: Beverly Date: Wed, 29 May 2019 11:34:45 -0400 Subject: [PATCH 028/620] OverlayPlugin uses StatusBarTouchableRegionManager Instead of using OtherwisedCollapsedListener to update the touchable region, use StatusBarTouchableRegionManager so there aren't conflicting InternalInsetsInfo set. Filed a bug to deprecate use of "setCollapseDesired" in OverlayPlugin: b/133841810 Test: manual Fixes: 133125670 Change-Id: I31b276bfb9b3296168c82fb3c109adce96a5b3bb --- .../StatusBarTouchableRegionManager.java | 11 +++++--- .../phone/StatusBarWindowController.java | 25 +++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java index e949ade28b59..3d25749265f1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java @@ -26,7 +26,6 @@ import android.view.ViewTreeObserver; import android.view.ViewTreeObserver.OnComputeInternalInsetsListener; import com.android.systemui.Dependency; -import com.android.systemui.assist.AssistManager; import com.android.systemui.bubbles.BubbleController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; @@ -38,7 +37,6 @@ import com.android.systemui.statusbar.policy.ConfigurationController.Configurati public final class StatusBarTouchableRegionManager implements OnComputeInternalInsetsListener, ConfigurationListener { - private final AssistManager mAssistManager = Dependency.get(AssistManager.class); private final BubbleController mBubbleController = Dependency.get(BubbleController.class); private final Context mContext; private final HeadsUpManagerPhone mHeadsUpManager; @@ -48,6 +46,7 @@ public final class StatusBarTouchableRegionManager implements private int mStatusBarHeight; private final View mStatusBarWindowView; private boolean mForceCollapsedUntilLayout = false; + private final StatusBarWindowController mStatusBarWindowController; public StatusBarTouchableRegionManager(@NonNull Context context, HeadsUpManagerPhone headsUpManager, @@ -57,12 +56,17 @@ public final class StatusBarTouchableRegionManager implements mHeadsUpManager = headsUpManager; mStatusBar = statusBar; mStatusBarWindowView = statusBarWindowView; + mStatusBarWindowController = Dependency.get(StatusBarWindowController.class); initResources(); mBubbleController.setBubbleStateChangeListener((hasBubbles) -> { updateTouchableRegion(); }); + + mStatusBarWindowController.setForcePluginOpenListener((forceOpen) -> { + updateTouchableRegion(); + }); Dependency.get(ConfigurationController.class).addCallback(this); } @@ -77,7 +81,8 @@ public final class StatusBarTouchableRegionManager implements mHeadsUpManager.hasPinnedHeadsUp() || mHeadsUpManager.isHeadsUpGoingAway() || mBubbleController.hasBubbles() || mForceCollapsedUntilLayout - || hasCutoutInset; + || hasCutoutInset + || mStatusBarWindowController.getForcePluginOpen(); if (shouldObserve == mShouldAdjustInsets) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java index 631920c16a2c..f08db1b5c76c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java @@ -80,6 +80,7 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat private float mScreenBrightnessDoze; private final State mCurrentState = new State(); private OtherwisedCollapsedListener mListener; + private ForcePluginOpenListener mForcePluginOpenListener; private final SysuiColorExtractor mColorExtractor = Dependency.get(SysuiColorExtractor.class); @@ -477,6 +478,16 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat public void setForcePluginOpen(boolean forcePluginOpen) { mCurrentState.forcePluginOpen = forcePluginOpen; apply(mCurrentState); + if (mForcePluginOpenListener != null) { + mForcePluginOpenListener.onChange(forcePluginOpen); + } + } + + /** + * The forcePluginOpen state for the status bar. + */ + public boolean getForcePluginOpen() { + return mCurrentState.forcePluginOpen; } public void setNotTouchable(boolean notTouchable) { @@ -525,6 +536,10 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat mListener = listener; } + public void setForcePluginOpenListener(ForcePluginOpenListener listener) { + mForcePluginOpenListener = listener; + } + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("StatusBarWindowController state:"); pw.println(mCurrentState); @@ -637,4 +652,14 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat public interface OtherwisedCollapsedListener { void setWouldOtherwiseCollapse(boolean otherwiseCollapse); } + + /** + * Listener to indicate forcePluginOpen has changed + */ + public interface ForcePluginOpenListener { + /** + * Called when mState.forcePluginOpen is changed + */ + void onChange(boolean forceOpen); + } } -- GitLab From c56a2669d7844bebdb8affdc3679f1711a898675 Mon Sep 17 00:00:00 2001 From: Robert Snoeberger Date: Wed, 29 May 2019 15:00:24 -0400 Subject: [PATCH 029/620] Catch IllegalArgumentException caused by recycled bitmap Fixes: 132858949 Test: Added test MediaArtworkProcessorTest with test point that passes recycled bitmap. Change-Id: I8e9c0f64b5b9e53979df2e8c2bc0ad8356d096a8 --- .../statusbar/MediaArtworkProcessor.kt | 75 +++++++----- .../statusbar/MediaArtworkProcessorTest.kt | 109 ++++++++++++++++++ 2 files changed, 152 insertions(+), 32 deletions(-) create mode 100644 packages/SystemUI/tests/src/com/android/systemui/statusbar/MediaArtworkProcessorTest.kt diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/MediaArtworkProcessor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/MediaArtworkProcessor.kt index 4b2d13121f6b..aaf48490d7b0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/MediaArtworkProcessor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/MediaArtworkProcessor.kt @@ -25,6 +25,7 @@ import android.renderscript.Allocation import android.renderscript.Element import android.renderscript.RenderScript import android.renderscript.ScriptIntrinsicBlur +import android.util.Log import android.util.MathUtils import com.android.internal.graphics.ColorUtils import com.android.systemui.statusbar.notification.MediaNotificationProcessor @@ -32,6 +33,7 @@ import com.android.systemui.statusbar.notification.MediaNotificationProcessor import javax.inject.Inject import javax.inject.Singleton +private const val TAG = "MediaArtworkProcessor" private const val COLOR_ALPHA = (255 * 0.7f).toInt() private const val BLUR_RADIUS = 25f private const val DOWNSAMPLE = 6 @@ -42,45 +44,54 @@ class MediaArtworkProcessor @Inject constructor() { private val mTmpSize = Point() private var mArtworkCache: Bitmap? = null - fun processArtwork(context: Context, artwork: Bitmap): Bitmap { + fun processArtwork(context: Context, artwork: Bitmap): Bitmap? { if (mArtworkCache != null) { - return mArtworkCache!! + return mArtworkCache } - - context.display.getSize(mTmpSize) val renderScript = RenderScript.create(context) - val rect = Rect(0, 0, artwork.width, artwork.height) - MathUtils.fitRect(rect, Math.max(mTmpSize.x / DOWNSAMPLE, mTmpSize.y / DOWNSAMPLE)) - var inBitmap = Bitmap.createScaledBitmap(artwork, rect.width(), rect.height(), - true /* filter */) - // Render script blurs only support ARGB_8888, we need a conversion if we got a - // different bitmap config. - if (inBitmap.config != Bitmap.Config.ARGB_8888) { - val oldIn = inBitmap - inBitmap = oldIn.copy(Bitmap.Config.ARGB_8888, false /* isMutable */) - oldIn.recycle() - } - val input = Allocation.createFromBitmap(renderScript, inBitmap, - Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_GRAPHICS_TEXTURE) - val outBitmap = Bitmap.createBitmap(inBitmap.width, inBitmap.height, - Bitmap.Config.ARGB_8888) - val output = Allocation.createFromBitmap(renderScript, outBitmap) val blur = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript)) - blur.setRadius(BLUR_RADIUS) - blur.setInput(input) - blur.forEach(output) - output.copyTo(outBitmap) + var input: Allocation? = null + var output: Allocation? = null + var inBitmap: Bitmap? = null + try { + context.display.getSize(mTmpSize) + val rect = Rect(0, 0, artwork.width, artwork.height) + MathUtils.fitRect(rect, Math.max(mTmpSize.x / DOWNSAMPLE, mTmpSize.y / DOWNSAMPLE)) + inBitmap = Bitmap.createScaledBitmap(artwork, rect.width(), rect.height(), + true /* filter */) + // Render script blurs only support ARGB_8888, we need a conversion if we got a + // different bitmap config. + if (inBitmap.config != Bitmap.Config.ARGB_8888) { + val oldIn = inBitmap + inBitmap = oldIn.copy(Bitmap.Config.ARGB_8888, false /* isMutable */) + oldIn.recycle() + } + val outBitmap = Bitmap.createBitmap(inBitmap.width, inBitmap.height, + Bitmap.Config.ARGB_8888) - val swatch = MediaNotificationProcessor.findBackgroundSwatch(artwork) + input = Allocation.createFromBitmap(renderScript, inBitmap, + Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_GRAPHICS_TEXTURE) + output = Allocation.createFromBitmap(renderScript, outBitmap) - input.destroy() - output.destroy() - inBitmap.recycle() - blur.destroy() + blur.setRadius(BLUR_RADIUS) + blur.setInput(input) + blur.forEach(output) + output.copyTo(outBitmap) - val canvas = Canvas(outBitmap) - canvas.drawColor(ColorUtils.setAlphaComponent(swatch.rgb, COLOR_ALPHA)) - return outBitmap + val swatch = MediaNotificationProcessor.findBackgroundSwatch(artwork) + + val canvas = Canvas(outBitmap) + canvas.drawColor(ColorUtils.setAlphaComponent(swatch.rgb, COLOR_ALPHA)) + return outBitmap + } catch (ex: IllegalArgumentException) { + Log.e(TAG, "error while processing artwork", ex) + return null + } finally { + input?.destroy() + output?.destroy() + blur.destroy() + inBitmap?.recycle() + } } fun clearCache() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/MediaArtworkProcessorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/MediaArtworkProcessorTest.kt new file mode 100644 index 000000000000..72e6df27a254 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/MediaArtworkProcessorTest.kt @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar + +import com.google.common.truth.Truth.assertThat + +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Point +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +private const val WIDTH = 200 +private const val HEIGHT = 200 + +@RunWith(AndroidTestingRunner::class) +@SmallTest +class MediaArtworkProcessorTest : SysuiTestCase() { + + private var screenWidth = 0 + private var screenHeight = 0 + + private lateinit var processor: MediaArtworkProcessor + + @Before + fun setUp() { + processor = MediaArtworkProcessor() + + val point = Point() + context.display.getSize(point) + screenWidth = point.x + screenHeight = point.y + } + + @After + fun tearDown() { + processor.clearCache() + } + + @Test + fun testProcessArtwork() { + // GIVEN some "artwork", which is just a solid blue image + val artwork = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888) + Canvas(artwork).drawColor(Color.BLUE) + // WHEN the background is created from the artwork + val background = processor.processArtwork(context, artwork)!! + // THEN the background has the size of the screen that has been downsamples + assertThat(background.height).isLessThan(screenHeight) + assertThat(background.width).isLessThan(screenWidth) + assertThat(background.config).isEqualTo(Bitmap.Config.ARGB_8888) + } + + @Test + fun testCache() { + // GIVEN a solid blue image + val artwork = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888) + Canvas(artwork).drawColor(Color.BLUE) + // WHEN the background is processed twice + val background1 = processor.processArtwork(context, artwork)!! + val background2 = processor.processArtwork(context, artwork)!! + // THEN the two bitmaps are the same + // Note: This is currently broken and trying to use caching causes issues + assertThat(background1).isNotSameAs(background2) + } + + @Test + fun testConfig() { + // GIVEN some which is not ARGB_8888 + val artwork = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ALPHA_8) + Canvas(artwork).drawColor(Color.BLUE) + // WHEN the background is created from the artwork + val background = processor.processArtwork(context, artwork)!! + // THEN the background has Config ARGB_8888 + assertThat(background.config).isEqualTo(Bitmap.Config.ARGB_8888) + } + + @Test + fun testRecycledArtwork() { + // GIVEN some "artwork", which is just a solid blue image + val artwork = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888) + Canvas(artwork).drawColor(Color.BLUE) + // AND the artwork is recycled + artwork.recycle() + // WHEN the background is created from the artwork + val background = processor.processArtwork(context, artwork) + // THEN the processed bitmap is null + assertThat(background).isNull() + } +} \ No newline at end of file -- GitLab From 851bfd1c5a1e6a33eec58a17345e126dd6f21a80 Mon Sep 17 00:00:00 2001 From: chen xu Date: Tue, 28 May 2019 15:28:37 -0700 Subject: [PATCH 030/620] skip permission check for TelephonyManager API getMmsUserAgent Bug: 133637995 Test: Manual test Change-Id: Ib9f211120c34e9b48c02f990088c32fb307a64f2 (cherry picked from commit 48781653654ff06b5db51ab312fd1f01111d65de) --- .../android/telephony/TelephonyManager.java | 24 ++++++++++++++----- .../internal/telephony/ITelephony.aidl | 10 ++++++++ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index d63c37accb37..2ba34c6c3453 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -5356,18 +5356,30 @@ public class TelephonyManager { * Returns the MMS user agent. */ public String getMmsUserAgent() { - if (mContext == null) return null; - return SubscriptionManager.getResourcesForSubId(mContext, getSubId()).getString( - com.android.internal.R.string.config_mms_user_agent); + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + return telephony.getMmsUserAgent(getSubId()); + } + } catch (RemoteException ex) { + } catch (NullPointerException ex) { + } + return null; } /** * Returns the MMS user agent profile URL. */ public String getMmsUAProfUrl() { - if (mContext == null) return null; - return SubscriptionManager.getResourcesForSubId(mContext, getSubId()).getString( - com.android.internal.R.string.config_mms_user_agent_profile_url); + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + return telephony.getMmsUAProfUrl(getSubId()); + } + } catch (RemoteException ex) { + } catch (NullPointerException ex) { + } + return null; } /** diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 63aded1c4b20..cf1323a328fe 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -1986,4 +1986,14 @@ interface ITelephony { * outgoing SmsManager operation. */ oneway void enqueueSmsPickResult(String callingPackage, IIntegerConsumer subIdResult); + + /** + * Returns the MMS user agent. + */ + String getMmsUserAgent(int subId); + + /** + * Returns the MMS user agent profile URL. + */ + String getMmsUAProfUrl(int subId); } -- GitLab From 9a7520a393ba1595507863b9750aef7aad643df9 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Wed, 29 May 2019 17:27:21 -0700 Subject: [PATCH 031/620] Fixed that we could be stuck with notifications pulse expanding We weren't properly reseting the pulse expanding state in the bypass flow Fixes: 133868650 Change-Id: Ibddac4a374f6eec990b11e80a824a02cfdd06f99 --- .../NotificationWakeUpCoordinator.kt | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt index 61fc1a3cb38b..3613f9f3ea5f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt @@ -147,11 +147,16 @@ class NotificationWakeUpCoordinator @Inject constructor( // Let's notify the scroller that an animation started notifyAnimationStart(mLinearDozeAmount == 1.0f) } + setDozeAmount(linear, eased) + } + + fun setDozeAmount(linear: Float, eased: Float) { + val changed = linear != mLinearDozeAmount mLinearDozeAmount = linear mDozeAmount = eased mStackScroller.setDozeAmount(mDozeAmount) updateDarkAmount() - if (linear == 0.0f) { + if (changed && linear == 0.0f) { setNotificationsVisible(visible = false, animate = false, increaseSpeed = false); setNotificationsVisibleForExpansion(visible = false, animate = false, increaseSpeed = false) @@ -164,16 +169,12 @@ class NotificationWakeUpCoordinator @Inject constructor( private fun updateDozeAmountIfBypass(): Boolean { if (mBypassController.bypassEnabled) { + var amount = 1.0f; if (mStatusBarStateController.state == StatusBarState.SHADE || mStatusBarStateController.state == StatusBarState.SHADE_LOCKED) { - mDozeAmount = 0.0f - mLinearDozeAmount = 0.0f - } else { - mDozeAmount = 1.0f - mLinearDozeAmount = 1.0f + amount = 0.0f; } - updateDarkAmount() - mStackScroller.setDozeAmount(mDozeAmount) + setDozeAmount(amount, amount) return true } return false -- GitLab From f443938d5649000230c45cf604cd1405c2705f09 Mon Sep 17 00:00:00 2001 From: shawnlin Date: Thu, 23 May 2019 20:44:49 +0800 Subject: [PATCH 032/620] Implemented the mechanism of hiding clock face based on phenotype flag. Created a string type of phenotype flag which contains the clock plugin service names that are not allow to be shown. Each service name is seperated by a comma(","). Test: atest com.android.keyguard.clock.ClockManagerTest Bug: 133406302 Change-Id: I51c00b03ec56eaf4de7cab91073deeeb73610f93 --- .../sysui/SystemUiDeviceConfigFlags.java | 7 ++ .../android/keyguard/clock/ClockManager.java | 80 +++++++++++++++---- .../keyguard/clock/ClockManagerTest.java | 33 +++++++- 3 files changed, 103 insertions(+), 17 deletions(-) diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 28ac8cc8b8bd..93eb553eed12 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -132,6 +132,13 @@ public final class SystemUiDeviceConfigFlags { */ public static final String ASSIST_HANDLES_SHOWN_FREQUENCY_THRESHOLD_MS = "assist_handles_shown_frequency_threshold_ms"; + // Flag related to clock face + + /** + * (String) Contains the clock plugin service names that are not allow to be shown. + * Each service name is seperated by a comma(",") in the string. + */ + public static final String CLOCK_FACE_BLACKLIST = "clock_face_blacklist"; private SystemUiDeviceConfigFlags() { } } diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java index 9f4c403ed787..9edb54c146df 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java @@ -15,6 +15,8 @@ */ package com.android.keyguard.clock; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.CLOCK_FACE_BLACKLIST; + import android.annotation.Nullable; import android.content.ContentResolver; import android.content.Context; @@ -24,9 +26,12 @@ import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.os.UserHandle; +import android.provider.DeviceConfig; import android.provider.Settings; import android.util.ArrayMap; +import android.util.ArraySet; import android.util.DisplayMetrics; +import android.util.Log; import android.view.LayoutInflater; import androidx.annotation.VisibleForTesting; @@ -42,10 +47,12 @@ import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.util.InjectionInflationController; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Supplier; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; @@ -67,6 +74,8 @@ public final class ClockManager { private final Handler mMainHandler = new Handler(Looper.getMainLooper()); private final CurrentUserObservable mCurrentUserObservable; + private final ArraySet mBlacklistedClockPlugins = new ArraySet<>(); + /** * Observe settings changes to know when to switch the clock face. */ @@ -155,6 +164,41 @@ public final class ClockManager { DisplayMetrics dm = res.getDisplayMetrics(); mWidth = dm.widthPixels; mHeight = dm.heightPixels; + + updateBlackList(); + registerDeviceConfigListener(); + } + + private void updateBlackList() { + String blacklist = getBlackListFromConfig(); + + mBlacklistedClockPlugins.clear(); + if (blacklist != null && !blacklist.isEmpty()) { + mBlacklistedClockPlugins.addAll(Arrays.asList(blacklist.split(","))); + } + } + + String getBlackListFromConfig() { + return DeviceConfig.getString( + DeviceConfig.NAMESPACE_SYSTEMUI, CLOCK_FACE_BLACKLIST, null); + } + + private void registerDeviceConfigListener() { + DeviceConfig.addOnPropertiesChangedListener( + DeviceConfig.NAMESPACE_SYSTEMUI, + r -> mMainHandler.post(r), + properties -> onDeviceConfigPropertiesChanged(properties.getNamespace())); + } + + void onDeviceConfigPropertiesChanged(String namespace) { + if (!DeviceConfig.NAMESPACE_SYSTEMUI.equals(namespace)) { + Log.e(TAG, "Received update from DeviceConfig for unrelated namespace: " + + namespace); + return; + } + + updateBlackList(); + reload(); } /** @@ -240,9 +284,9 @@ public final class ClockManager { } private void reload() { - mPreviewClocks.reload(); + mPreviewClocks.reloadCurrentClock(); mListeners.forEach((listener, clocks) -> { - clocks.reload(); + clocks.reloadCurrentClock(); ClockPlugin clock = clocks.getCurrentClock(); if (clock instanceof DefaultClockController) { listener.onClockChanged(null); @@ -287,20 +331,13 @@ public final class ClockManager { @Override public void onPluginConnected(ClockPlugin plugin, Context pluginContext) { addClockPlugin(plugin); - reload(); - if (plugin == mCurrentClock) { - ClockManager.this.reload(); - } + reloadIfNeeded(plugin); } @Override public void onPluginDisconnected(ClockPlugin plugin) { - boolean isCurrentClock = plugin == mCurrentClock; removeClockPlugin(plugin); - reload(); - if (isCurrentClock) { - ClockManager.this.reload(); - } + reloadIfNeeded(plugin); } /** @@ -313,10 +350,12 @@ public final class ClockManager { } /** - * Get information about available clock faces. + * Get information about clock faces which are available and not in blacklist. */ List getInfo() { - return mClockInfo; + return mClockInfo.stream() + .filter(info -> !mBlacklistedClockPlugins.contains(info.getId())) + .collect(Collectors.toList()); } /** @@ -347,10 +386,19 @@ public final class ClockManager { } } + private void reloadIfNeeded(ClockPlugin plugin) { + final boolean wasCurrentClock = plugin == mCurrentClock; + reloadCurrentClock(); + final boolean isCurrentClock = plugin == mCurrentClock; + if (wasCurrentClock || isCurrentClock) { + ClockManager.this.reload(); + } + } + /** * Update the current clock. */ - void reload() { + void reloadCurrentClock() { mCurrentClock = getClockPlugin(); } @@ -359,7 +407,7 @@ public final class ClockManager { if (ClockManager.this.isDocked()) { final String name = mSettingsWrapper.getDockedClockFace( mCurrentUserObservable.getCurrentUser().getValue()); - if (name != null) { + if (name != null && !mBlacklistedClockPlugins.contains(name)) { plugin = mClocks.get(name); if (plugin != null) { return plugin; @@ -368,7 +416,7 @@ public final class ClockManager { } final String name = mSettingsWrapper.getLockScreenCustomClockFace( mCurrentUserObservable.getCurrentUser().getValue()); - if (name != null) { + if (name != null && !mBlacklistedClockPlugins.contains(name)) { plugin = mClocks.get(name); } return plugin; diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java index 3330d1e6d0a8..6891f562a3c4 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockManagerTest.java @@ -20,12 +20,14 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.ContentResolver; import android.database.ContentObserver; import android.net.Uri; +import android.provider.DeviceConfig; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; @@ -50,6 +52,8 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.util.List; + @SmallTest @RunWith(AndroidTestingRunner.class) // Need to run tests on main looper because LiveData operations such as setData, observe, @@ -63,7 +67,7 @@ public final class ClockManagerTest extends SysuiTestCase { private static final int SECONDARY_USER_ID = 11; private static final Uri SETTINGS_URI = null; - private ClockManager mClockManager; + ClockManager mClockManager; private ContentObserver mContentObserver; private DockManagerFake mFakeDockManager; private MutableLiveData mCurrentUser; @@ -139,6 +143,33 @@ public final class ClockManagerTest extends SysuiTestCase { assertThat(mClockManager.getCurrentClock()).isInstanceOf(BUBBLE_CLOCK_CLASS); } + @Test + public void getCurrentClock_inBlackList() { + mClockManager = spy(mClockManager); + // GIVEN that settings is set to the bubble clock face + when(mMockSettingsWrapper.getLockScreenCustomClockFace(anyInt())).thenReturn(BUBBLE_CLOCK); + // WHEN settings change event is fired + mContentObserver.onChange(false, SETTINGS_URI, MAIN_USER_ID); + // GIVEN that bubble clock is in blacklist + when(mClockManager.getBlackListFromConfig()).thenReturn(BUBBLE_CLOCK); + // WHEN device config change of systemui is fired + mClockManager.onDeviceConfigPropertiesChanged(DeviceConfig.NAMESPACE_SYSTEMUI); + // THEN the result is null, indicated the current clock should be reset to the default one. + assertThat(mClockManager.getCurrentClock()).isNull(); + } + + @Test + public void getClockInfo_inBlackList() { + mClockManager = spy(mClockManager); + // GIVEN that bubble clock is in blacklist + when(mClockManager.getBlackListFromConfig()).thenReturn(BUBBLE_CLOCK); + // WHEN device config change of systemui is fired + mClockManager.onDeviceConfigPropertiesChanged(DeviceConfig.NAMESPACE_SYSTEMUI); + // THEN the ClockInfo should not contain bubble clock + List clocks = mClockManager.getClockInfos(); + assertThat(clocks.stream().anyMatch(info -> BUBBLE_CLOCK.equals(info.getId()))).isFalse(); + } + @Test public void onClockChanged_customClock() { // GIVEN that settings is set to the bubble clock face -- GitLab From 741bf5f310df2a6bff62dc5aac59a6072b65c424 Mon Sep 17 00:00:00 2001 From: Long Ling Date: Mon, 15 Apr 2019 14:08:49 -0700 Subject: [PATCH 033/620] Add brightness threshold for peak refresh rate To avoid flicker issue due to HW limitation at low brightness. Bug: 130248001 Change-Id: I81d222b24d32e37e3efe06db321d1397355eab8b --- core/res/res/values/config.xml | 3 ++ core/res/res/values/symbols.xml | 1 + .../server/display/DisplayModeDirector.java | 32 ++++++++++++++++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 483ec376df06..ea9f4a1b9da3 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4055,6 +4055,9 @@ for higher refresh rates to be automatically used out of the box --> 60 + + -1 + diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 7563a454b1da..1b2aea756db7 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3764,6 +3764,7 @@ + diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 0940a2e4b3cd..fee60d01affc 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -407,7 +407,8 @@ public class DisplayModeDirector { // the other. public static final int PRIORITY_APP_REQUEST_REFRESH_RATE = 1; public static final int PRIORITY_APP_REQUEST_SIZE = 2; - public static final int PRIORITY_LOW_POWER_MODE = 3; + public static final int PRIORITY_LOW_BRIGHTNESS = 3; + public static final int PRIORITY_LOW_POWER_MODE = 4; // Whenever a new priority is added, remember to update MIN_PRIORITY and/or MAX_PRIORITY as // appropriate, as well as priorityToString. @@ -485,15 +486,20 @@ public class DisplayModeDirector { Settings.System.getUriFor(Settings.System.PEAK_REFRESH_RATE); private final Uri mLowPowerModeSetting = Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE); + private final Uri mBrightnessSetting = + Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS); private final Context mContext; private final float mDefaultPeakRefreshRate; + private final int mBrightnessThreshold; SettingsObserver(@NonNull Context context, @NonNull Handler handler) { super(handler); mContext = context; mDefaultPeakRefreshRate = (float) context.getResources().getInteger( R.integer.config_defaultPeakRefreshRate); + mBrightnessThreshold = context.getResources().getInteger( + R.integer.config_brightnessThresholdOfPeakRefreshRate); } public void observe() { @@ -502,9 +508,14 @@ public class DisplayModeDirector { UserHandle.USER_SYSTEM); cr.registerContentObserver(mLowPowerModeSetting, false /*notifyDescendants*/, this, UserHandle.USER_SYSTEM); + if (mBrightnessThreshold >= 0) { + cr.registerContentObserver(mBrightnessSetting, false /*notifyDescendants*/, this, + UserHandle.USER_SYSTEM); + } synchronized (mLock) { updateRefreshRateSettingLocked(); updateLowPowerModeSettingLocked(); + updateBrightnessSettingLocked(); } } @@ -515,6 +526,8 @@ public class DisplayModeDirector { updateRefreshRateSettingLocked(); } else if (mLowPowerModeSetting.equals(uri)) { updateLowPowerModeSettingLocked(); + } else if (mBrightnessThreshold >=0 && mBrightnessSetting.equals(uri)) { + updateBrightnessSettingLocked(); } } } @@ -538,6 +551,23 @@ public class DisplayModeDirector { updateVoteLocked(Vote.PRIORITY_USER_SETTING, vote); } + private void updateBrightnessSettingLocked() { + int brightness = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS, -1); + + if (brightness < 0) { + return; + } + + final Vote vote; + if (brightness <= mBrightnessThreshold) { + vote = Vote.forRefreshRates(0f, 60f); + } else { + vote = null; + } + updateVoteLocked(Vote.PRIORITY_LOW_BRIGHTNESS, vote); + } + public void dumpLocked(PrintWriter pw) { pw.println(" SettingsObserver"); pw.println(" mDefaultPeakRefreshRate: " + mDefaultPeakRefreshRate); -- GitLab From bca7ec7ce7fa19c07a1891f25b5582b07addce2b Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Thu, 30 May 2019 10:24:54 -0700 Subject: [PATCH 034/620] Shorter sensor debounce Fixes: 134056932 Test: manual Change-Id: I8e710450e5bbb19cdb0cf50097dae2c1f21bfe70 --- core/res/res/values/config.xml | 2 +- .../SystemUI/src/com/android/systemui/doze/DozeSensors.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index fb585693c8a5..8cbbe3f57eb2 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2311,7 +2311,7 @@ false - 1500 + 300 + true + diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index d910be976b98..7563a454b1da 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2581,6 +2581,7 @@ + diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 19e7b734912a..6039568cab3a 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -40,9 +40,6 @@ false - - false - 0 diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt index 5b5eb767e184..5abf39e781f3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt @@ -17,10 +17,10 @@ package com.android.systemui.statusbar.phone import android.content.Context +import android.hardware.face.FaceManager import android.provider.Settings import com.android.internal.annotations.VisibleForTesting import com.android.keyguard.KeyguardUpdateMonitor -import com.android.systemui.R import com.android.systemui.tuner.TunerService import javax.inject.Inject @@ -32,8 +32,13 @@ class KeyguardBypassController { @Inject constructor(context: Context, tunerService: TunerService) { - val dismissByDefault = if (context.getResources().getBoolean( - R.bool.config_faceAuthDismissesKeyguard)) 1 else 0 + val faceManager = context.getSystemService(FaceManager::class.java) + if (faceManager?.isHardwareDetected != true) { + return + } + + val dismissByDefault = if (context.resources.getBoolean( + com.android.internal.R.bool.config_faceAuthDismissesKeyguard)) 1 else 0 tunerService.addTunable( object : TunerService.Tunable { override fun onTuningChanged(key: String?, newValue: String?) { -- GitLab From 594daca6abf5cee87c9ccb4c79eaadc3f10cb7ad Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Wed, 29 May 2019 17:27:21 -0700 Subject: [PATCH 037/620] Fixed that we could be stuck with notifications pulse expanding We weren't properly reseting the pulse expanding state in the bypass flow Fixes: 133868650 Change-Id: Ibddac4a374f6eec990b11e80a824a02cfdd06f99 (cherry picked from commit 9a7520a393ba1595507863b9750aef7aad643df9) --- .../NotificationWakeUpCoordinator.kt | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt index 61fc1a3cb38b..3613f9f3ea5f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt @@ -147,11 +147,16 @@ class NotificationWakeUpCoordinator @Inject constructor( // Let's notify the scroller that an animation started notifyAnimationStart(mLinearDozeAmount == 1.0f) } + setDozeAmount(linear, eased) + } + + fun setDozeAmount(linear: Float, eased: Float) { + val changed = linear != mLinearDozeAmount mLinearDozeAmount = linear mDozeAmount = eased mStackScroller.setDozeAmount(mDozeAmount) updateDarkAmount() - if (linear == 0.0f) { + if (changed && linear == 0.0f) { setNotificationsVisible(visible = false, animate = false, increaseSpeed = false); setNotificationsVisibleForExpansion(visible = false, animate = false, increaseSpeed = false) @@ -164,16 +169,12 @@ class NotificationWakeUpCoordinator @Inject constructor( private fun updateDozeAmountIfBypass(): Boolean { if (mBypassController.bypassEnabled) { + var amount = 1.0f; if (mStatusBarStateController.state == StatusBarState.SHADE || mStatusBarStateController.state == StatusBarState.SHADE_LOCKED) { - mDozeAmount = 0.0f - mLinearDozeAmount = 0.0f - } else { - mDozeAmount = 1.0f - mLinearDozeAmount = 1.0f + amount = 0.0f; } - updateDarkAmount() - mStackScroller.setDozeAmount(mDozeAmount) + setDozeAmount(amount, amount) return true } return false -- GitLab From 71d2fb230e47f183ed0398cb2824b0b2a5610c45 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Thu, 30 May 2019 18:26:54 -0700 Subject: [PATCH 038/620] Clearer scanning state and debug logs Always show scanning state, even on lock screen. Also added some logs to make it easier to debug face auth. Fixes: 133342103 Fixes: 133873875 Test: logcat Test: manual Change-Id: I1e5c1825a3fc33b5c9862b4f72a7652a89779514 --- .../keyguard/KeyguardUpdateMonitor.java | 6 +++++ .../KeyguardIndicationController.java | 10 +------- .../systemui/statusbar/phone/LockIcon.java | 23 ++++--------------- 3 files changed, 11 insertions(+), 28 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 873874f30875..26d3d86778e4 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -111,6 +111,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static final String TAG = "KeyguardUpdateMonitor"; private static final boolean DEBUG = KeyguardConstants.DEBUG; private static final boolean DEBUG_SIM_STATES = KeyguardConstants.DEBUG_SIM_STATES; + private static final boolean DEBUG_FACE = true; private static final int LOW_BATTERY_THRESHOLD = 20; private static final String ACTION_FACE_UNLOCK_STARTED @@ -182,6 +183,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { * Prudently disable lockscreen. */ public static final boolean CORE_APPS_ONLY; + static { try { CORE_APPS_ONLY = IPackageManager.Stub.asInterface( @@ -734,6 +736,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { if (acquireInfo != FaceManager.FACE_ACQUIRED_GOOD) { return; } + if (DEBUG_FACE) Log.d(TAG, "Face acquired"); for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -760,6 +763,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { Log.d(TAG, "Face authentication disabled by DPM for userId: " + userId); return; } + if (DEBUG_FACE) Log.d(TAG, "Face auth succeeded for user " + userId); onFaceAuthenticated(userId); } finally { setFaceRunningState(BIOMETRIC_STATE_STOPPED); @@ -768,6 +772,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } private void handleFaceHelp(int msgId, String helpString) { + if (DEBUG_FACE) Log.d(TAG, "Face help received: " + helpString); for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -786,6 +791,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { }; private void handleFaceError(int msgId, String errString) { + if (DEBUG_FACE) Log.d(TAG, "Face error received: " + errString); if (msgId == FaceManager.FACE_ERROR_CANCELED && mFaceRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) { setFaceRunningState(BIOMETRIC_STATE_STOPPED); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 25bde3bbe2fa..812c1bb54472 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -741,13 +741,5 @@ public class KeyguardIndicationController implements StateListener, updateIndication(false); } } - - @Override - public void onKeyguardBouncerChanged(boolean bouncer) { - if (mLockIcon == null) { - return; - } - mLockIcon.setBouncerVisible(bouncer); - } - }; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index c7f778d37914..3143971241d8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -90,11 +90,9 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange private int mDensity; private boolean mPulsing; private boolean mDozing; - private boolean mBouncerVisible; private boolean mDocked; private boolean mLastDozing; private boolean mLastPulsing; - private boolean mLastBouncerVisible; private int mIconColor; private float mDozeAmount; private int mIconRes; @@ -252,9 +250,9 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange int state = getState(); mIsFaceUnlockState = state == STATE_SCANNING_FACE; if (state != mLastState || mLastDozing != mDozing || mLastPulsing != mPulsing - || mLastScreenOn != mScreenOn || mLastBouncerVisible != mBouncerVisible || force) { + || mLastScreenOn != mScreenOn || force) { @LockAnimIndex final int lockAnimIndex = getAnimationIndexForTransition(mLastState, - state, mLastPulsing, mPulsing, mLastDozing, mDozing, mBouncerVisible); + state, mLastPulsing, mPulsing, mLastDozing, mDozing); boolean isAnim = lockAnimIndex != -1; int iconRes = isAnim ? getThemedAnimationResId(lockAnimIndex) : getIconForState(state); @@ -302,7 +300,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange mLastScreenOn = mScreenOn; mLastDozing = mDozing; mLastPulsing = mPulsing; - mLastBouncerVisible = mBouncerVisible; } boolean onAodNotPulsingOrDocked = mDozing && (!mPulsing || mDocked); @@ -371,8 +368,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange } private int getAnimationIndexForTransition(int oldState, int newState, - boolean wasPulsing, boolean pulsing, boolean wasDozing, boolean dozing, - boolean bouncerVisible) { + boolean wasPulsing, boolean pulsing, boolean wasDozing, boolean dozing) { // Never animate when screen is off if (dozing && !pulsing && !mWasPulsingOnThisFrame) { @@ -391,7 +387,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange return UNLOCK; } else if (justLocked) { return LOCK; - } else if (newState == STATE_SCANNING_FACE && bouncerVisible) { + } else if (newState == STATE_SCANNING_FACE) { return SCANNING; } else if ((nowPulsing || turningOn) && newState != STATE_LOCK_OPEN) { return LOCK_IN; @@ -496,17 +492,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange setImageTintList(ColorStateList.valueOf(color)); } - /** - * If bouncer is visible or not. - */ - public void setBouncerVisible(boolean bouncerVisible) { - if (mBouncerVisible == bouncerVisible) { - return; - } - mBouncerVisible = bouncerVisible; - update(); - } - @Override public void onDensityOrFontScaleChanged() { ViewGroup.LayoutParams lp = getLayoutParams(); -- GitLab From 29f0fa5883c4f70a12eac5d9d1710f14816146a6 Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Thu, 30 May 2019 16:21:57 -0700 Subject: [PATCH 039/620] Don't create system fixed, revoked permissions .. when restricting a previously unrestricted permission. Fixes: 134069814 Test: Upgraded from Q (before loc bg was restricted) to Q (after log bg was restricted) and saw previously system-fixed loc bg perm to be re-granted via the DefaultPermissionGrantPolicy. Change-Id: I641a95a0e481ca057c4fb7e05b29b18b7a8c10b6 (cherry picked from commit 6a59bbe2be05c374df96765600f616df8b4c564c) --- .../server/pm/permission/PermissionManagerService.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index 267fbf030619..beb72686d6ce 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -1173,6 +1173,14 @@ public class PermissionManagerService { } } + if (hardRestricted && !restrictionExempt + && (flags & FLAG_PERMISSION_SYSTEM_FIXED) != 0) { + // Applying a hard restriction implies revoking it. This might + // lead to a system-fixed, revoked permission. + flags &= ~FLAG_PERMISSION_SYSTEM_FIXED; + wasChanged = true; + } + if (wasChanged) { updatedUserIds = ArrayUtils.appendInt(updatedUserIds, userId); } -- GitLab From 9c1e45245c583cbbe02eada97a3447ccfa7e6a75 Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Fri, 31 May 2019 08:48:14 -0700 Subject: [PATCH 040/620] Reset SYSTEM_FIXED flags for hard restricted perms So that incorrectly SYSTEM_FIXED / denied permissions will be able to get regrated via the default permission grant policy This can be removed after all devices have been fixed Test: Got system into the state with SYSTEM_FIXED / denied permission and then silulated an OTA with this change Bug: 134069814 Change-Id: I7bc986f0d3e69dd60a017f16867182163fd6eecb (cherry picked from commit 0891123822d6173686e9772c3265b72c27b2b901) --- .../android/server/pm/permission/PermissionManagerService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index beb72686d6ce..81dd868ca8e9 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -1173,7 +1173,7 @@ public class PermissionManagerService { } } - if (hardRestricted && !restrictionExempt + if (hardRestricted && (flags & FLAG_PERMISSION_SYSTEM_FIXED) != 0) { // Applying a hard restriction implies revoking it. This might // lead to a system-fixed, revoked permission. -- GitLab From 813beeaf4883373e81cedbe6b35f2ca93dfdc2b3 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 31 May 2019 17:03:07 -0700 Subject: [PATCH 041/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: Ide4337a3ef503c5a5a839ddf7b27ad6a9cf7ea31 --- core/res/res/values-am/strings.xml | 32 ++++++----------- core/res/res/values-ar/strings.xml | 36 +++++++------------ core/res/res/values-as/strings.xml | 30 ++++++---------- core/res/res/values-az/strings.xml | 30 ++++++---------- core/res/res/values-b+sr+Latn/strings.xml | 30 ++++++---------- core/res/res/values-be/strings.xml | 30 ++++++---------- core/res/res/values-bg/strings.xml | 30 ++++++---------- core/res/res/values-bn/strings.xml | 32 ++++++----------- core/res/res/values-bs/strings.xml | 32 ++++++----------- core/res/res/values-ca/strings.xml | 34 +++++++----------- core/res/res/values-cs/strings.xml | 32 ++++++----------- core/res/res/values-da/strings.xml | 32 ++++++----------- core/res/res/values-de/strings.xml | 30 ++++++---------- core/res/res/values-es-rUS/strings.xml | 30 ++++++---------- core/res/res/values-es/strings.xml | 30 ++++++---------- core/res/res/values-et/strings.xml | 30 ++++++---------- core/res/res/values-eu/strings.xml | 42 +++++++++-------------- core/res/res/values-fa/strings.xml | 34 +++++++----------- core/res/res/values-fi/strings.xml | 30 ++++++---------- core/res/res/values-fr-rCA/strings.xml | 30 ++++++---------- core/res/res/values-fr/strings.xml | 30 ++++++---------- core/res/res/values-gl/strings.xml | 30 ++++++---------- core/res/res/values-gu/strings.xml | 30 ++++++---------- core/res/res/values-hi/strings.xml | 34 +++++++----------- core/res/res/values-hr/strings.xml | 30 ++++++---------- core/res/res/values-hu/strings.xml | 30 ++++++---------- core/res/res/values-hy/strings.xml | 32 ++++++----------- core/res/res/values-in/strings.xml | 2 +- core/res/res/values-is/strings.xml | 30 ++++++---------- core/res/res/values-it/strings.xml | 4 +-- core/res/res/values-iw/strings.xml | 30 ++++++---------- core/res/res/values-ja/strings.xml | 32 ++++++----------- core/res/res/values-ka/strings.xml | 30 ++++++---------- core/res/res/values-kk/strings.xml | 32 ++++++----------- core/res/res/values-km/strings.xml | 30 ++++++---------- core/res/res/values-ko/strings.xml | 30 ++++++---------- core/res/res/values-ky/strings.xml | 32 ++++++----------- core/res/res/values-lo/strings.xml | 30 ++++++---------- core/res/res/values-lt/strings.xml | 30 ++++++---------- core/res/res/values-lv/strings.xml | 30 ++++++---------- core/res/res/values-mk/strings.xml | 30 ++++++---------- core/res/res/values-ml/strings.xml | 30 ++++++---------- core/res/res/values-mn/strings.xml | 30 ++++++---------- core/res/res/values-mr/strings.xml | 34 +++++++----------- core/res/res/values-ms/strings.xml | 30 ++++++---------- core/res/res/values-my/strings.xml | 4 +-- core/res/res/values-nb/strings.xml | 32 ++++++----------- core/res/res/values-ne/strings.xml | 32 ++++++----------- core/res/res/values-nl/strings.xml | 30 ++++++---------- core/res/res/values-or/strings.xml | 30 ++++++---------- core/res/res/values-pa/strings.xml | 30 ++++++---------- core/res/res/values-pl/strings.xml | 30 ++++++---------- core/res/res/values-pt-rBR/strings.xml | 34 +++++++----------- core/res/res/values-pt-rPT/strings.xml | 30 ++++++---------- core/res/res/values-pt/strings.xml | 34 +++++++----------- core/res/res/values-ro/strings.xml | 30 ++++++---------- core/res/res/values-ru/strings.xml | 30 ++++++---------- core/res/res/values-sk/strings.xml | 32 ++++++----------- core/res/res/values-sl/strings.xml | 30 ++++++---------- core/res/res/values-sq/strings.xml | 30 ++++++---------- core/res/res/values-sr/strings.xml | 30 ++++++---------- core/res/res/values-sv/strings.xml | 32 ++++++----------- core/res/res/values-sw/strings.xml | 32 ++++++----------- core/res/res/values-ta/strings.xml | 30 ++++++---------- core/res/res/values-te/strings.xml | 32 ++++++----------- core/res/res/values-th/strings.xml | 30 ++++++---------- core/res/res/values-tl/strings.xml | 30 ++++++---------- core/res/res/values-tr/strings.xml | 30 ++++++---------- core/res/res/values-uk/strings.xml | 30 ++++++---------- core/res/res/values-ur/strings.xml | 30 ++++++---------- core/res/res/values-uz/strings.xml | 32 ++++++----------- core/res/res/values-vi/strings.xml | 34 +++++++----------- core/res/res/values-zh-rCN/strings.xml | 32 ++++++----------- core/res/res/values-zh-rHK/strings.xml | 30 ++++++---------- core/res/res/values-zh-rTW/strings.xml | 32 ++++++----------- 75 files changed, 766 insertions(+), 1486 deletions(-) diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 78b46ef1a86a..6c30f6b1f3c1 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -549,15 +549,11 @@ "የጣት አሻራ አዶ" - - + "በመልክ መክፈቻ ሃርድዌርን ማስተዳደር" "መተግበሪያው ጥቅም ላይ እንዲውሉ የፊት ቅንብር ደንቦችን ለማከል እና ለመሰረዝ የሚያስችሉ ስልቶችን እንዲያስጀምር ያስችለዋል።" - - - - - - + "በመልክ መክፈት ሃርድዌርን መጠቀም" + "መተግበሪያው የመልክ መክፈቻ ሃርድዌርን ለማረጋገጥ እንዲጠቀም ያስችለዋል" + "በመልክ መክፈት" "የእርስዎን ፊት ዳግመኛ ያስመዝግቡ" "ማንነትን ለይቶ ማወቅን ለማሻሻል፣ እባክዎ የእርስዎን ፊት ዳግም ያስመዝግቡ" "ትክክለኛ የፊት ውሂብ ማንሳት አልተቻለም። እንደገና ይሞክሩ።" @@ -583,20 +579,15 @@ "መልክን ማረጋገጥ አይቻልም። ሃርድዌር የለም።" - - + "በመልክ መክፈትን እንደገና ይሞክሩ።" "አዲስ የመልክ ውውሂብ ማስቀመጥ አልተቻለም። መጀመሪያ የድሮውን ይሰርዙት።" "የፊት ሥርዓተ ክወና ተሰርዟል።" - - + "በመልክ መክፈት በተጠቃሚ ተሰርዟል።" "ከልክ በላይ ብዙ ሙከራዎች። በኋላ ላይ እንደገና ይሞክሩ።" - - + "በጣም ብዙ ሙከራዎች። በመልክ መክፈት ተሰናክሏል።" "ፊትን ማረጋገጥ አይቻልም። እንደገና ይሞክሩ።" - - - - + "በመልክ መክፈትን አላቀናበሩም።" + "በመልክ መክፈት መስጫ በዚህ መሣሪያ ላይ አይደገፍም።" "ፊት %d" @@ -1366,8 +1357,7 @@ "የመሞከሪያ ጥቅል ሁነታን ለማሰናከል የፋብሪካ ዳግም ቅንብርን ይሞክሩ።" "በዩኤስቢ ወደብ ውስጥ ፈሳሽ ወይም ፍርስራሽ" "የዩኤስቢ ወደብ በራስ-ሰር ተሰናክሏል። የበለጠ ለመረዳት መታ ያድርጉ።" - - + "የዩኤስቢ ወደቡን መጠቀም ችግር የለውም" "ስልክ ከእንግዲህ ፈሳሽ ወይም ፍርስራሽ አላገኘም።" "የሳንካ ሪፖርትን በመውሰድ ላይ…" "የሳንካ ሪፖርት ይጋራ?" @@ -1503,7 +1493,7 @@ "ቀጣዩን አግኝ" "ቀዳሚውን አግኝ" "የስፍራ ጥየቃ ቅፅ%s" - "የስፍራ ጥየቃ" + "የአካባቢ ጥየቃ" " በ፡%1$s(%2$s) ተጠየቀ" "አዎ" "አይ" diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index dfc316cbf4fe..3ea8779d387a 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -561,15 +561,11 @@ "رمز بصمة الإصبع" - - + "إدارة أجهزة \"فتح القفل بالوجه\"" "السماح للتطبيق باستدعاء طرق لإضافة نماذج من الوجوه وحذفها" - - - - - - + "استخدام أجهزة \"فتح القفل بالوجه\"" + "السماح للتطبيق باستخدام أجهزة \"فتح القفل بالوجه\" لإجراء المصادقة" + "فتح القفل بالوجه" "إعادة تسجيل وجهك" "لتحسين قدرة الجهاز على معرفة وجهك، يُرجى إعادة تسجيل الوجه." "تعذّر تسجيل بيانات دقيقة للوجه. حاول مرة أخرى." @@ -595,20 +591,15 @@ "يتعذّر التحقُّق من الوجه. الجهاز غير مُتاح." - - + "حاول استخدام \"فتح القفل بالوجه\" مرة أخرى." "يتعذَّر تخزين بيانات الوجه الجديد. احذف الوجه القديم أولاً." "تمّ إلغاء عملية مصادقة الوجه." - - + "ألغى المستخدم \"فتح القفل بالوجه\"." "تمّ إجراء محاولات كثيرة. أعِد المحاولة لاحقًا." - - + "تم إجراء عدد كبير جدًا من المحاولات. وتم إيقاف \"فتح القفل بالوجه\"." "يتعذّر التحقق من الوجه. حاول مرة أخرى." - - - - + "لم يسبق لك إعداد \"فتح القفل بالوجه\"." + "\"فتح القفل بالوجه\" غير متوفر على هذا الجهاز." "الوجه %d" @@ -709,7 +700,7 @@ "فاكس العمل" "فاكس المنزل" "جهاز نداء" - "آخر" + "غير ذلك" "مخصص" @@ -1210,7 +1201,7 @@ "إلغاء" "تنبيه" "جارٍ التحميل…" - "تشغيل" + "مفعّلة" "إيقاف" "إكمال الإجراء باستخدام" "‏إكمال الإجراء باستخدام %1$s" @@ -1454,8 +1445,7 @@ "يمكنك إجراء إعادة ضبط على إعدادات المصنع لإيقاف وضع \"مفعِّل اختبار\"." "‏السوائل والشوائب في منفذ USB" "‏تمّ إيقاف منفذ USB تلقائيًا. انقُر لمعرفة المزيد من المعلومات." - - + "‏مسموح باستخدام منفذ USB" "لم يَعُد الهاتف يكتشف سوائل أو شوائب." "جارٍ الحصول على تقرير الخطأ…" "هل تريد مشاركة تقرير الخطأ؟" @@ -1595,7 +1585,7 @@ "بحث عن التطابق التالي" "بحث عن التطابق السابق" "طلب الموقع من %s" - "طلب الموقع" + "طلب الموقع الجغرافي" "مطلوب من %1$s (%2$s)" "نعم" "لا" diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index f9717034f7b5..3213774ab3e7 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -549,15 +549,11 @@ "ফিংগাৰপ্ৰিণ্ট আইকন" - - + "মুখাৱয়বৰদ্বাৰা আনলক হার্ডৱেৰ পৰিচালনা কৰক" "মুখমণ্ডলৰ টেম্প্লেট যোগ কৰাৰ বা মচাৰ পদ্ধতি কামত লগাবলৈ আহ্বান কৰিবলৈ এপটোক অনুমতি দিয়ে।" - - - - - - + "মুখাৱয়বৰদ্বাৰা আনলক হার্ডৱেৰ ব্যৱহাৰ কৰক" + "বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে এপ্‌ক মুখাৱয়বৰদ্বাৰা আনলক কৰা হাৰ্ডৱেৰ ব্যৱহাৰ কৰিবলৈ দিয়ে" + "মুখাৱয়বৰদ্বাৰা আনলক কৰা সুবিধা" "আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ণ কৰক" "চিনাক্তকৰণৰ সুবিধাটো উন্নত কৰিবলৈ, অনুগ্ৰহ কৰি আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ন কৰক" "সঠিক মুখমণ্ডলৰ ডেটা কেপচাৰ নহ’ল। আকৌ চেষ্টা কৰক।" @@ -583,20 +579,15 @@ "মুখমণ্ডল সত্যাপন কৰিব পৰা নগ’ল। হাৰ্ডৱেৰ নাই।" - - + "পুনৰ মুখাৱয়বৰদ্বাৰা আনলক কৰি চাওক।" "নতুন মুখমণ্ডলৰ ডেটা জমা কৰিব পৰা নাই। প্ৰথমে পুৰণি এখন মচক।" "মুখমণ্ডলৰ প্ৰক্ৰিয়া বাতিল কৰা হ’ল।" - - + "ব্যৱহাৰকাৰীয়ে মুখাৱয়বৰদ্বাৰা আনলক কৰাটো বাতিল কৰিছে।" "অত্যধিক ভুল প্ৰয়াস। কিছুসময়ৰ পাছত আকৌ চেষ্টা কৰক।" - - + "অতি বেছি প্ৰয়াস। মুখাৱয়বৰদ্বাৰা আনলক কৰাটো অক্ষম কৰা হৈছে।" "মুখমণ্ডল সত্যাপন কৰিব পৰা নগ’ল। আকৌ চেষ্টা কৰক।" - - - - + "আপুনি মুখাৱয়বৰদ্বাৰা আনলক কৰাটো ছেট আপ কৰা নাই।" + "এই ডিভাইচটোত মুখাৱয়বৰদ্বাৰা আনলক কৰা সুবিধাটো নচলে।" "মুখমণ্ডল %d" @@ -1366,8 +1357,7 @@ "টেষ্ট হাৰনেছ ম’ড অক্ষম কৰিবলৈ ফেক্টৰী ৰিছেট কৰক।" "ইউএছবি প’ৰ্টত তৰল বা ধূলি-মাকতি আছে" "ইউএছবি প’ৰ্ট স্বয়ংক্ৰিয়ভাৱে অক্ষম কৰা হয়। অধিক জানিবৰ বাবে টিপক।" - - + "ইউএছবি প’ৰ্ট ব্যৱহাৰ কৰাত সমস্যা নাই" "ফ’নটোৱে তৰল বা ধূলি-মাকতি আৰু চিনাক্ত নকৰে।" "বাগ সম্পর্কীয় অভিযোগ গ্ৰহণ কৰি থকা হৈছে…" "বাগ সম্পর্কীয় অভিযোগ শ্বেয়াৰ কৰিবনে?" diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 6eac6fef15e8..815cf722661e 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -549,15 +549,11 @@ "Barmaq izi ikonası" - - + "üz kilidi avadanlığını idarə edin" "Proqramdan istifadə üçün barmaq izi şablonlarını əlavə etmək və silmək məqsədilə üsullara müraciət etməyə imkan verir." - - - - - - + "üz kilidi avadanlığından istifadə edin" + "İdentifikasiya üçün tətbiqin üz kilidi avadanlığından istifadə etməsinə icazə verir" + "Üz kilidi" "Üzünüzü yenidən qeydiyyatdan keçirin" "Tanınmanı təkmilləşdirmək üçün üzünüzü yenidən qeydiyyatdan keçirin" "Dəqiq üz datası əldə edilmədi. Yenidən cəhd edin." @@ -583,20 +579,15 @@ "Üz doğrulanmadı. Avadanlıq əlçatan deyil." - - + "Üz kilidini yenidən sınayın." "Yeni üz datası saxlanmadı. Əvvəlcə köhnə olanı silin." "Üz əməliyyatı ləğv edildi." - - + "İstifadəçi üz kilidini ləğv edib." "Həddindən çox cəhd. Sonraya saxlayın." - - + "Həddindən çox cəhd. Üz kilidi deaktiv edildi." "Üz doğrulanmadı. Yenidən cəhd edin." - - - - + "Üz kilidi quraşdırmamısınız." + "Üz kilidi bu cihazda dəstəklənmir." "Üz %d" @@ -1366,8 +1357,7 @@ "Test Rejimini deaktiv etmək üçün fabrika ayarlarına sıfırlayın." "USB portuna maye sızıb və ya qırılıb" "USB portu avtomatik deaktiv edildi. Ətraflı məlumat üçün klikləyin." - - + "USB portundan istifadə etmək üçün OK" "Telefon artıq maye və ya nasazlığı aşkarlamayacaq." "Baq hesabatı verilir..." "Baq hesabatı paylaşılsın?" diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 8f138d4c22aa..8f1bb2c95059 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -552,15 +552,11 @@ "Ikona otiska prsta" - - + "upravljanje hardv. za otključavanje licem" "Dozvoljava da aplikacija aktivira metode za dodavanje i brisanje šablona lica radi korišćenja." - - - - - - + "korišćenje hardvera za otključavanje licem" + "Dozvoljava da aplikacija koristi hardver za otključavanje licem radi potvrde identiteta" + "Otključavanje licem" "Ponovo registrujte lice" "Da biste poboljšali prepoznavanje, ponovo registrujte lice" "Snimanje lica nije uspelo. Probajte ponovo." @@ -586,20 +582,15 @@ "Provera lica nije uspela. Hardver nije dostupan." - - + "Probajte ponovo otključavanje licem." "Novi podaci o licu nisu sačuvani. Prvo izbrišete prethodne." "Obrada lica je otkazana." - - + "Korisnik je otkazao otključavanje licem" "Previše pokušaja. Probajte ponovo kasnije." - - + "Previše pokušaja. Otključavanje licem je onemogućeno." "Provera lica nije uspela. Probajte ponovo." - - - - + "Niste podesili otključavanje licem" + "Otključavanje licem nije podržano na ovom uređaju" "Lice %d" @@ -1388,8 +1379,7 @@ "Obavite resetovanje na fabrička podešavanja da biste onemogućili režim probnog korišćenja." "Tečnost ili nečistoća u USB portu" "USB port je automatski isključen. Dodirnite da biste saznali više." - - + "Korišćenje USB porta je dozvoljeno" "Telefon više ne otkriva tečnost ili nečistoću." "Izveštaj o grešci se generiše…" "Želite li da podelite izveštaj o grešci?" diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index e3a55024a5b9..6d8bafaa132f 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -555,15 +555,11 @@ "Значок адбіткаў пальцаў" - - + "кіраваць апаратным забеспячэннем для распазнавання твару" "Праграма зможа дадаваць і выдаляць шаблоны твару." - - - - - - + "выкарыстоўваць апаратнае забеспячэнне для распазнавання твару" + "Для аўтэнтыфікацыі праграма зможа ўжываць апаратнае забеспячэнне для распазнавання твару" + "Распазнаванне твару" "Паўтарыце рэгістрацыю твару" "Каб палепшыць распазнавальнасць, яшчэ раз выканайце рэгістрацыю твару" "Не атрымалася распазнаць твар. Паўтарыце спробу." @@ -589,20 +585,15 @@ "Твар не спраўджаны. Абсталяванне недаступнае." - - + "Выканайце распазнаванне твару паўторна." "Новыя даныя пра твар не захаваны. Спачатку выдаліце старыя." "Распазнаванне твару скасавана." - - + "Распазнаванне твару скасавана карыстальнікам." "Занадта шмат спроб. Паўтарыце спробу пазней." - - + "Занадта шмат спроб. Распазнаванне твару выключана." "Не ўдалося спраўдзіць твар. Паўтарыце спробу." - - - - + "Вы не наладзілі распазнаванне твару." + "На гэтай прыладзе распазнаванне твару не падтрымліваецца." "Твар %d" @@ -1410,8 +1401,7 @@ "Каб выключыць тэставы рэжым, скіньце налады да заводскіх значэнняў." "Вадкасць або смецце ў порце USB" "Порт USB аўтаматычна адключаны. Каб даведацца больш, націсніце тут." - - + "Порт USB можна выкарыстоўваць" "Тэлефон выявіў, што вадкасці і смецця больш няма." "Стварэнне справаздачы пра памылку…" "Падзяліцца справаздачай пра памылку?" diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 0e8555429ada..9b36914a7d12 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -549,15 +549,11 @@ "Икона за отпечатък" - - + "управление на хардуера за отключване с лице" "Разрешава на прил. да извиква методи за добавяне и изтриване на лицеви шаблони за ползване" - - - - - - + "използване на хардуера за отключване с лице" + "Разрешава на приложението да използва хардуера за отключване с лице с цел удостоверяване" + "Отключване с лице" "Регистрирайте отново лицето си" "С цел подобряване на разпознаването регистрирайте отново лицето си" "Лицето не бе заснето точно. Опитайте отново." @@ -583,20 +579,15 @@ "Лицето не може да се потвърди. Хардуерът не е налице." - - + "Опитайте отново да отключите с лице." "Не може да се запази ново лице. Първо изтрийте старо." "Операцията с лице е анулирана." - - + "Отключването с лице е анулирано от потребителя." "Твърде много опити. Опитайте отново по-късно." - - + "Твърде много опити. Отключването с лице е деактивирано." "Лицето не може да се потвърди. Опитайте отново." - - - - + "Не сте настроили отключването с лице." + "Отключването с лице не се поддържа на това устройство." "Лице %d" @@ -1366,8 +1357,7 @@ "Възстановете фабричните настройки, за да деактивирате режима за тестова среда." "Течност или замърсяване в USB порта" "USB портът е деактивиран автоматично. Докоснете, за да научите повече." - - + "Можете да използвате USB порта" "Телефонът вече не открива течности или замърсяване." "Сигналът за програмна грешка се извлича…" "Да се сподели ли сигналът за програмна грешка?" diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 8f1cf57e4906..19b0103bb750 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -549,15 +549,11 @@ "আঙ্গুলের ছাপ আইকন" - - + "মুখের সাহায্যে আনলক করার হার্ডওয়্যার ম্যানেজ করা" "ব্যবহার করার জন্য ফেস টেম্পলেট যোগ করা এবং মোছার পদ্ধতি গ্রহণ করতে অ্যাপটিকে অনুমতি দেয়৷" - - - - - - + "মুখের সাহায্যে আনলক করার হার্ডওয়্যার ব্যবহার করা" + "অ্যাপকে যাচাইকরণের জন্য মুখের সাহায্যে আনলক করার হার্ডওয়্যার ব্যবহার করতে দেয়" + "মুখের সাহায্যে আনলক" "আপনার ফেস আবার এনরোল করুন" "শনাক্তকরণের উন্নতি করতে আপনার ফেস আবার এনরোল করুন" "মুখের সঠিক ডেটা পাওয়া যায়নি। আবার চেষ্টা করুন।" @@ -583,20 +579,15 @@ "ফেস যাচাই করা যায়নি। হার্ডওয়্যার উপলভ্য নেই।" - - + "আবার মুখের সাহায্যে আনলক করার চেষ্টা করুন।" "নতুন ফেস ডেটা স্টোর করা যায়নি। প্রথমে পুরনোটি মুছে ফেলুন।" "ফেস অপারেশন বাতিল করা হয়েছে৷" - - + "ব্যবহারকারী মুখের সাহায্যে আনলক বাতিল করে দিয়েছেন।" "অনেকবার চেষ্টা করা হয়েছে। পরে আবার চেষ্টা করুন।" - - + "অনেকবার চেষ্টা করেছেন। মুখের সাহায্যে আনলক করার সুবিধা বন্ধ করা হয়েছে।" "আপনার মুখ যাচাই করা যাচ্ছে না। আবার চেষ্টা করুন।" - - - - + "এখনও মুখের সাহায্যে আনলক করার সুবিধা সেট-আপ করেননি।" + "এই ডিভাইসে মুখের সাহায্যে আনলক করার সুবিধাটি কাজ করে না।" "%d ফেস" @@ -1367,8 +1358,7 @@ "টেস্ট হারনেস মোড বন্ধ করতে ফ্যাক্টরি রিসেট করুন।" "ইউএসবি পোর্টে তরল পদার্থ অথবা ধুলো কণা" "ইউএসবি পোর্ট নিজে থেকে বন্ধ করা হবে। আরও জানতে ট্যাপ করুন।" - - + "ইউএসবি পোর্ট ব্যবহার করা যেতে পারে" "ফোন আর তরল পদার্থ এবং ধুলো কণা শনাক্ত করবে না।" "ত্রুটির প্রতিবেদন নেওয়া হচ্ছে..." "ত্রুটির প্রতিবেদন শেয়ার করবেন?" @@ -1504,7 +1494,7 @@ "পরবর্তীটি খুঁজুন" "পূর্ববর্তীটি খুঁজুন" "%s এর থেকে অবস্থানের অনুরোধ" - "অবস্থানের অনুরোধ" + "লোকেশন জানার অনুরোধ" "%1$s (%2$s) এর দ্বারা অনুরোধকৃত" "হ্যাঁ" "না" diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 5ef243c53027..cd04c6f9497d 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -552,15 +552,11 @@ "Ikona za otisak prsta" - - + "upravljanje hardverom za otključavanje licem" "Omogućava aplikaciji korištenje metoda za dodavanje i brisanje šablona lica za upotrebu." - - - - - - + "korištenje hardvera za otključavanje licem" + "Omogućava aplikaciji da za autentifikaciju koristi hardver za otključavanje licem" + "Otključavanje licem" "Ponovo registrirajte lice" "Ponovo registrirajte lice da poboljšate prepoznavanje" "Lice nije snimljeno precizno. Pokušajte ponovo." @@ -586,20 +582,15 @@ "Nije moguće potvrditi lice. Hardver nije dostupan." - - + "Pokušajte ponovo s otključavanjem licem." "Nije moguće sačuvati nove podatke o licu. Prvo izbrišite stare." "Prepoznavanje lica je otkazano." - - + "Korisnik je otkazao otključavanje licem." "Previše pokušaja. Pokušajte ponovo kasnije." - - + "Previše pokušaja. Otključavanje licem je onemogućeno." "Nije moguće potvrditi lice. Pokušajte ponovo." - - - - + "Niste postavili otključavanje licem." + "Otključavanje licem nije podržano na ovom uređaju." "Lice %d" @@ -1390,8 +1381,7 @@ "Izvršite vraćanje na fabričke postavke da onemogućite način rada okvira za testiranje." "Tečnost ili nečistoće u USB priključku" "USB priključak je automatski onemogućen. Dodirnite da saznate više." - - + "USB priključak je sada sigurno koristiti" "Telefon više ne detektira tečnost ili nečistoće." "Prijem izvještaja o grešci..." "Podijeliti izvještaj o grešci?" @@ -1528,7 +1518,7 @@ "Nađi sljedeći" "Nađi prethodni" "Korisnik %s je poslao zahtjev za utvrđivanje lokacije" - "Zahtjev za utvrđivanje lokacije" + "Zahtjev za lokaciju" "Zahtjev uputio %1$s (%2$s)" "Da" "Ne" diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 2050de30a49d..8f3a1c778272 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -549,15 +549,11 @@ "Icona d\'empremta digital" - - + "gestiona el maquinari de desbloqueig facial" "Permet que l\'aplicació afegeixi i suprimeixi plantilles de cares que es puguin fer servir." - - - - - - + "utilitza el maquinari de desbloqueig facial" + "Permet que l\'aplicació faci servir el maquinari de desbloqueig facial per a l\'autenticació" + "Desbloqueig facial" "Torna a registrar la cara" "Per millorar el reconeixement, torna a registrar la cara" "No es reconeix la teva cara. Torna-ho a provar." @@ -583,20 +579,15 @@ "No es pot verificar la cara. Maquinari no disponible." - - + "Torna a provar el desbloqueig facial." "No es poden desar dades facials noves. Suprimeix-ne d\'antigues." "S\'ha cancel·lat el reconeixement facial." - - + "L\'usuari ha cancel·lat el desbloqueig facial." "Massa intents. Torna-ho a provar més tard." - - + "Massa intents. S\'ha desactivat el desbloqueig facial." "No es pot verificar la cara. Torna-ho a provar." - - - - + "No has configurat el desbloqueig facial" + "El desbloqueig facial no és compatible amb el dispositiu." "Cara %d" @@ -1366,8 +1357,7 @@ "Si vols desactivar el mode Agent de prova, restableix les dades de fàbrica." "Hi ha líquid o pols al port USB" "El port USB es desactiva automàticament. Toca per obtenir més informació." - - + "Ja pots utilitzar el port USB" "El telèfon ja no detecta líquids ni pols." "S\'està creant l\'informe d\'errors…" "Vols compartir l\'informe d\'errors?" @@ -1792,7 +1782,7 @@ "Torna-ho a provar més tard" "Mode de pantalla completa" "Per sortir, llisca cap avall des de la part superior." - "D\'acord" + "Entesos" "Fet" "Control circular de les hores" "Control circular dels minuts" @@ -2014,7 +2004,7 @@ "L\'estalvi de bateria s\'ha desactivat. Les funcions ja no estan restringides." "L\'estalvi de bateria s\'ha desactivat. Les funcions ja no estan restringides." "Carpeta" - "Aplicació per a Android" + "Aplicació d\'Android" "Fitxer" "Fitxer %1$s" "Àudio" diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 6feb718f42f5..ecb0d6ce13e5 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -555,15 +555,11 @@ "Ikona otisku prstů" - - + "správa hardwaru k odemknutí obličejem" "Umožňuje aplikaci volat metody k přidání a smazání šablon obličeje, které budou použity." - - - - - - + "použití hardwaru k odemknutí obličejem" + "Umožňuje aplikaci provést ověření pomocí hardwaru k odemknutí obličejem" + "Odemknutí obličejem" "Zaznamenejte obličej znovu" "Chcete-li rozpoznání zdokonalit, zaznamenejte obličej znovu" "Obličej se nepodařilo zachytit. Zkuste to znovu." @@ -589,20 +585,15 @@ "Obličej nelze ověřit. Hardware není dostupný." - - + "Zopakujte odemknutí obličejem." "Údaje o novém obličeji nelze uložit. Nejdřív vymažte starý." "Operace snímání obličeje byla zrušena." - - + "Odemknutí obličejem zrušil uživatel." "Příliš mnoho pokusů. Zkuste to později." - - + "Příliš mnoho pokusů. Odemknutí obličejem bylo deaktivováno." "Obličej se nepodařilo ověřit. Zkuste to znovu." - - - - + "Ověření obličejem nemáte nastavené." + "Odemknutí obličejem na tomto zařízení není podporováno." "Obličej %d" @@ -1410,8 +1401,7 @@ "Chcete-li deaktivovat režim správce testů, restartujte zařízení do továrního nastavení." "Kapalina nebo nečistota v portu USB" "Port USB byl automaticky deaktivován. Klepnutím zobrazíte další informace." - - + "Port USB lze bezpečně použít" "Telefon již nedetekuje kapaliny ani nečistoty." "Vytváření zprávy o chybě…" "Sdílet zprávu o chybě?" @@ -1549,7 +1539,7 @@ "Najít další" "Najít předchozí" "Požadavek na informace o poloze od uživatele %s" - "Požadavek na informace o poloze" + "Žádost o informaci o poloze" "Požadavek od uživatele %1$s (%2$s)" "Ano" "Ne" diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index ffa382b8849d..32ee7712020c 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -549,15 +549,11 @@ "Ikon for fingeraftryk" - - + "administrere hardware til ansigtslås" "Tillader, at appen kan bruge metoder til at tilføje og slette ansigtsskabeloner." - - - - - - + "bruge hardware til ansigtslås" + "Tillader, at appen bruger hardware til ansigtslås til godkendelse" + "Ansigtslås" "Registrer dit ansigt igen" "Registrer dit ansigt igen for at forbedre genkendelsen af det" "Der blev ikke registreret ansigtsdata. Prøv igen." @@ -583,20 +579,15 @@ "Ansigt ikke bekræftet. Hardware ikke tilgængelig." - - + "Prøv ansigtslås igen." "Der kan ikke gemmes flere nye ansigter. Slet et gammelt." "Ansigtshandlingen blev annulleret." - - + "Ansigtslås blev annulleret af brugeren." "Du har prøvet for mange gange. Prøv igen senere." - - + "Du har brugt for mange forsøg. Ansigtslås er deaktiveret." "Ansigtet kan ikke genkendes. Prøv igen." - - - - + "Du har ikke konfigureret ansigtslås." + "Ansigtslås understøttes ikke på denne enhed." "Ansigt %d" @@ -1366,8 +1357,7 @@ "Gendan fabriksindstillingerne for at deaktivere tilstanden Testsele." "Væske eller snavs i USB-porten" "USB-porten deaktiveres automatisk. Tryk for at få flere oplysninger." - - + "USB-porten kan bruges" "Telefonen registrerer ikke længere væske og snavs." "Opretter fejlrapport…" "Vil du dele fejlrapporten?" @@ -1989,7 +1979,7 @@ "Der er registreret en skadelig app" "%1$s anmoder om tilladelse til at vise eksempler fra %2$s" "Rediger" - "Telefonen vil vibrere ved opkald og notifikationer" + "Telefonen vibrerer ved opkald og notifikationer" "Der afspilles ikke lyd ved opkald og notifikationer" "Systemændringer" "Forstyr ikke" diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 5e0ccd058d48..6d94a77fdc26 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -549,15 +549,11 @@ "Fingerabdruck-Symbol" - - + "Face Unlock-Hardware verwalten" "Ermöglicht der App, Gesichtsvorlagen hinzuzufügen oder zu entfernen." - - - - - - + "Face Unlock-Hardware verwenden" + "Ermöglicht der App, zu Authentifizierungszwecken Face Unlock-Hardware zu verwenden" + "Face Unlock" "Gesicht neu scannen lassen" "Für bessere Erkennung Gesicht neu scannen lassen" "Gesichtsdaten nicht gut erfasst. Erneut versuchen." @@ -583,20 +579,15 @@ "Gesicht nicht erkannt. Hardware nicht verfügbar." - - + "Face Unlock noch einmal versuchen." "Kein Speicherplatz frei. Bitte erst ein Gesicht löschen." "Gesichtserkennung abgebrochen." - - + "Face Unlock vom Nutzer abgebrochen." "Zu viele Versuche, bitte später noch einmal versuchen" - - + "Zu viele Versuche. Face Unlock wurde deaktiviert." "Gesichtsprüfung nicht möglich. Noch mal versuchen." - - - - + "Face Unlock ist nicht eingerichtet." + "Face Unlock wird auf diesem Gerät nicht unterstützt." "Gesicht %d" @@ -1366,8 +1357,7 @@ "Setz das Gerät auf die Werkseinstellungen zurück, um den Test-Harnischmodus zu deaktivieren." "Flüssigkeiten oder Fremdkörper im USB-Port" "Der USB-Port wird automatisch deaktiviert. Für weitere Informationen tippen." - - + "USB-Port kann wieder verwendet werden" "Das Smartphone erkennt keine Flüssigkeiten oder Fremdkörper mehr." "Fehlerbericht wird abgerufen…" "Fehlerbericht teilen?" diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 07cae0a9b7af..96e358015889 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -549,15 +549,11 @@ "Ícono de huella digital" - - + "administrar el hardware de Desbloqueo facial" "Permite que la app emplee métodos para agregar y borrar plantillas de rostros para su uso." - - - - - - + "usar el hardware de Desbloqueo facial" + "Permite que la app use el hardware de Desbloqueo facial con fines de autenticación" + "Desbloqueo facial" "Vuelve a registrar tu rostro" "Para mejorar el reconocimiento, vuelve a registrar tu rostro" "Datos faciales imprecisos. Vuelve a intentarlo." @@ -583,20 +579,15 @@ "No se verificó el rostro. Hardware no disponible." - - + "Vuelve a probar el Desbloqueo facial." "No hay espacio para datos faciales nuevos. Borra uno viejo." "Se canceló el reconocimiento facial." - - + "El usuario canceló el Desbloqueo facial." "Demasiados intentos. Inténtalo de nuevo más tarde." - - + "Demasiados intentos. Se inhabilitó el Desbloqueo facial." "No se pudo verificar la cara. Vuelve a intentarlo." - - - - + "No configuraste el Desbloqueo facial." + "No se admite el Desbloqueo facial en este dispositivo." "Rostro %d" @@ -1366,8 +1357,7 @@ "Restablece la configuración de fábrica para inhabilitar el modo de agente de prueba." "Hay líquido o suciedad en el puerto USB" "El puerto USB se inhabilitó automáticamente. Presiona para obtener más información." - - + "Se puede usar el puerto USB" "El teléfono ya no detecta líquidos o suciedad." "Realizando un informe de errores…" "¿Compartir informe de errores?" diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 7261eb012b26..0e4108cad1fc 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -549,15 +549,11 @@ "Icono de huella digital" - - + "gestionar el hardware de desbloqueo facial" "Permite que la app use métodos para añadir y suprimir plantillas de caras para su uso." - - - - - - + "Utilizar hardware de desbloqueo facial" + "Permite que la aplicación utilice el hardware de desbloqueo facial para autenticarte" + "Desbloqueo facial" "Volver a registrar la cara" "Para mejorar el reconocimiento, vuelve a registrar tu cara" "Datos faciales no reconocidos. Vuelve a intentarlo." @@ -583,20 +579,15 @@ "No se puede verificar. Hardware no disponible." - - + "Vuelve a probar el desbloqueo facial." "Para guardar nuevos datos faciales, borra otros antiguos." "Se ha cancelado el reconocimiento facial." - - + "El usuario ha cancelado el desbloqueo facial." "Demasiados intentos. Inténtalo de nuevo más tarde." - - + "Muchos intentos. Se ha inhabilitado el desbloqueo facial." "No se ha verificado tu cara. Vuelve a intentarlo." - - - - + "No has configurado el desbloqueo facial." + "El desbloqueo facial no está disponible en este dispositivo." "Cara %d" @@ -1366,8 +1357,7 @@ "Restablece los ajustes de fábrica para inhabilitar el modo de agente de prueba." "Se ha detectado líquido o suciedad en el puerto USB" "El puerto USB se ha inhabilitado automáticamente. Toca para obtener más información." - - + "Se puede utilizar el puerto USB" "El teléfono ya no detecta líquidos ni suciedad." "Creando informe de errores…" "¿Compartir informe de errores?" diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 42ce4ef4917f..b447922d2b90 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -549,15 +549,11 @@ "Sõrmejälje ikoon" - - + "hallata Face Unlocki riistvara" "Lubab rakendusel tühistada meetodid kasutatavate näomallide lisamiseks ja kustutamiseks." - - - - - - + "kasutada Face Unlocki riistvara" + "Võimaldab rakendusel autentimiseks kasutada Face Unlocki riistvara" + "Face Unlock" "Registreerige oma nägu uuesti" "Tuvastamise parandamiseks registreerige oma nägu uuesti" "Näoandmeid ei saanud jäädvustada. Proovige uuesti." @@ -583,20 +579,15 @@ "Nägu ei saa kinnitada. Riistvara pole saadaval." - - + "Proovige Face Unlocki uuesti." "Uue näo andmeid ei saa salvestada. Kustutage enne vanad." "Näotuvastuse toiming tühistati." - - + "Kasutaja tühistas Face Unlocki." "Liiga palju katseid. Proovige hiljem uuesti." - - + "Liiga palju katseid. Face Unlock on keelatud." "Nägu ei saa kinnitada. Proovige uuesti." - - - - + "Face Unlocki ei ole seadistatud." + "Seade ei toeta Face Unlocki." "Nägu %d" @@ -1366,8 +1357,7 @@ "Testrakendirežiimi keelamiseks taastage tehaseseaded." "USB-pordis on vedelik või mustus" "USB-port on automaatselt keelatud. Puudutage lisateabe saamiseks." - - + "USB-porti tohib kasutada" "Telefon ei tuvasta enam vedelikku ega mustust." "Veaaruande võtmine …" "Kas jagada veaaruannet?" diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 00e9de9ee3b3..0e8e66b14422 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -549,15 +549,11 @@ "Hatz-markaren ikonoa" - - + "kudeatu aurpegiaren bidez desblokeatzeko hardwarea" "Aurpegi-txantiloiak gehitu eta ezabatzeko metodoei dei egitea baimentzen dio aplikazioari." - - - - - - + "erabili aurpegiaren bidez desblokeatzeko hardwarea" + "Autentifikazioa egiteko aurpegiaren bidez desblokeatzeko hardwarea erabiltzeko baimena ematen dio aplikazioari" + "Aurpegiaren bidez desblokeatzeko aukera" "Erregistratu aurpegia berriro" "Ezagutzea hobetzeko, erregistratu aurpegia berriro" "Ezin izan dira bildu argazkiaren datu zehatzak. Saiatu berriro." @@ -583,20 +579,15 @@ "Ezin da egiaztatu aurpegia. Hardwarea ez dago erabilgarri." - - + "Saiatu berriro aurpegiaren bidez desblokeatzen." "Ezin dira gorde aurpegiaren datu berriak. Ezabatu zaharrak." "Utzi da aurpegiaren bidezko eragiketa." - - + "Erabiltzaileak bertan behera utzi du aurpegiaren bidez desblokeatzea." "Saiakera gehiegi egin dituzu. Saiatu berriro geroago." - - + "Saiakera gehiegi egin dira. Aurpegiaren bidez desblokeatzeko aukera desgaitu egin da." "Ezin da egiaztatu aurpegia. Saiatu berriro." - - - - + "Ez duzu konfiguratu aurpegiaren bidez desblokeatzeko aukera." + "Gailu honek ez du onartzen aurpegiaren bidez desblokeatzea." "%d aurpegia" @@ -621,8 +612,8 @@ "Telekomunikabideekiko konexioak kudeatzea baimentzen die aplikazioei." "erabili pantaila deiak abian direnean" "Erabiltzaileak deiaren pantaila noiz eta nola ikusten duen kontrolatzeko aukera ematen die aplikazioei." - "elkarreragin telefono-zerbitzuekin" - "Deiak egiteko eta jasotzeko telefonia-zerbitzuekin elkarreragitea baimentzen die aplikazioei." + "jardun interakzioan telefono-zerbitzuekin" + "Deiak egiteko eta jasotzeko telefonia-zerbitzuekin interakzioan aritzea baimentzen die aplikazioei." "eskaini erabiltzaileentzako aukerak deiak abian direnean" "Deiak abian direnean erabiltzeko aukera eskaintzea baimentzen die aplikazioei." "irakurri sare-erabileraren historia" @@ -978,8 +969,8 @@ "Bidali kontsulta" "Ahozko bilaketa" "\"Arakatu ukituta\" eginbidea gaitu nahi duzu?" - "%1$s zerbitzuak \"Arakatu ukituta\" eginbidea gaitu nahi du. Eginbide hori aktibatuta dagoenean, hatzaren azpian duzunaren azalpena ikus edo entzun dezakezu, edo tabletarekin elkarrekintzan aritzeko keinuak egin ditzakezu." - "%1$s zerbitzuak \"Arakatu ukituta\" eginbidea gaitu nahi du. Eginbide hori aktibatuta dagoenean, hatzaren azpian duzunaren azalpena ikus edo entzun dezakezu, edo telefonoarekin elkarrekintzan aritzeko keinuak egin ditzakezu." + "%1$s zerbitzuak \"Arakatu ukituta\" eginbidea gaitu nahi du. Eginbide hori aktibatuta dagoenean, hatzaren azpian duzunaren azalpena ikus edo entzun dezakezu, edo tabletarekin interakzioan aritzeko keinuak egin ditzakezu." + "%1$s zerbitzuak \"Arakatu ukituta\" eginbidea gaitu nahi du. Eginbide hori aktibatuta dagoenean, hatzaren azpian duzunaren azalpena ikus edo entzun dezakezu, edo telefonoarekin interakzioan aritzeko keinuak egin ditzakezu." "Duela hilabete" "Duela hilabete baino gutxiago" @@ -1160,7 +1151,7 @@ "Erabili beste aplikazio bat" "Garbitu aplikazio lehenetsia Sistemaren ezarpenak > Aplikazioak > Deskargatutakoak atalean." "Aukeratu ekintza bat" - "Aukeratu USB gailurako aplikazioa" + "Aukeratu USB bidezko gailurako aplikazioa" "Ez dago ekintza hori egin dezakeen aplikaziorik." "Gelditu egin da %1$s" "Gelditu egin da %1$s" @@ -1367,8 +1358,7 @@ "Proba-materialaren modua desgaitzeko, berrezarri jatorrizko datuak." "Likidoa edo zikinkeriak daude USB atakan" "USB ataka automatikoki desgaitu da. Informazio gehiago lortzeko, sakatu hau." - - + "Erabiltzeko moduan dago USB ataka" "Telefonoak ez du hautematen likidorik edo zikinkeriarik." "Akatsen txostena sortzen…" "Akatsen txostena partekatu nahi duzu?" @@ -1910,7 +1900,7 @@ "Aplikazioa Android-en bertsio zaharrago baterako sortu zenez, baliteke behar bezala ez funtzionatzea. Bilatu eguneratzerik baden, edo jarri garatzailearekin harremanetan." "Bilatu eguneratzeak" "Mezu berriak dituzu" - "Mezuak ikusteko, ireki SMS mezuen aplikazioa" + "Mezuak ikusteko, ireki SMS mezuetarako aplikazioa" "Baliteke funtzio batzuk mugatuta egotea" "Blokeatuta dago laneko profila" "Sakatu profila desblokeatzeko" diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index d8582ffa3fd4..17604d0e637f 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -549,15 +549,11 @@ "نماد اثر انگشت" - - + "‏مدیریت سخت‌افزار face unlock" "به برنامه امکان می‌دهد روش‌هایی را برای افزودن و حذف الگوهای چهره جهت استفاده فرابخواند." - - - - - - + "‏استفاده از سخت‌افزار face unlock" + "‏به برنامه امکان می‌دهد از سخت‌افزار face unlock برای احراز هویت استفاده کند" + "Face unlock" "ثبت مجدد چهره" "برای بهبود تشخیص، لطفاً چهره‌تان را دوباره ثبت کنید" "داده‌های دقیق چهره ضبط نشد. دوباره امتحان کنید." @@ -583,20 +579,15 @@ "چهره تأیید نشد. سخت‌افزار در دسترس نیست." - - + "‏face unlock را دوباره امتحان کنید." "داده‌ چهره جدید ذخیره نشد. اول داده‌ چهره قدیمی را حذف کنید." "عملیات شناسایی چهره لغو شد." - - + "‏کاربر Face unlock را لغو کرد." "تعداد زیادی تلاش ناموفق. بعداً دوباره امتحان کنید." - - + "‏تعداد تلاش‌ها بیش‌ازحد مجاز است. Face unlock غیرفعال است." "چهره تأیید نشد. دوباره امتحان کنید." - - - - + "‏face unlock را راه‌اندازی نکردید." + "‏Face unlock در این دستگاه پشتیبانی نمی‌شود." "چهره %d" @@ -1366,8 +1357,7 @@ "برای غیرفعال کردن «حالت مجموعه داده‌های تست»، بازنشانی کارخانه‌ای کنید." "‏مایعات یا خاکروبه در درگاه USB" "‏درگاه USB به‌طور خودکار غیرفعال شده است. برای اطلاعات بیشتر، ضربه بزنید." - - + "‏می‌توان از درگاه USB استفاده کرد" "تلفن دیگر وجود مایعات یا خاکروبه را تشخیص نمی‌دهد." "درحال گرفتن گزارش اشکال…" "گزارش اشکال به اشتراک گذاشته شود؟" @@ -1502,8 +1492,8 @@ "جستجوی وب" "یافتن بعدی" "یافتن قبلی" - "درخواست موقعیت مکانی از %s" - "درخواست موقعیت مکانی" + "درخواست مکان از %s" + "درخواست مکان" "درخواست شده توسط %1$s (%2$s)" "بله" "نه" diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 921788fcb649..b51bb81f1f73 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -549,15 +549,11 @@ "Sormenjälkikuvake" - - + "hallinnoida Face Unlock ‑laitteistoa" "Sallii sovelluksen käyttää menetelmiä, joilla voidaan lisätä tai poistaa kasvomalleja." - - - - - - + "käyttää Face Unlock ‑laitteistoa" + "Sallii sovelluksen käyttää Face Unlock ‑laitteistoa todennukseen" + "Face Unlock" "Lisää kasvot uudelleen" "Lisää kasvosi uudelleen tunnistamisen parantamiseksi" "Tarkan kasvodatan tallennus epäonnistui. Yritä uudelleen." @@ -583,20 +579,15 @@ "Kasvoja ei voi vahvistaa. Laitteisto ei käytettäv." - - + "Yritä käyttää Face Unlockia uudelleen." "Uutta kasvodataa ei voi tallentaa. Poista ensin vanhaa." "Kasvotoiminto peruutettu" - - + "Käyttäjä peruutti Face Unlockin." "Liian monta yritystä. Yritä myöhemmin uudelleen." - - + "Liian monta yritystä. Face Unlock poistettu käytöstä." "Kasvoja ei voi vahvistaa. Yritä uudelleen." - - - - + "Et ole määrittänyt Face Unlockia." + "Tämä laite ei tue Face Unlockia." "Kasvot %d" @@ -1366,8 +1357,7 @@ "Palauta tehdasasetukset, niin voit poistaa testikehystilan käytöstä." "Nestettä tai likaa USB-portissa" "USB-portti poistetaan käytöstä automaattisesti. Napauta nähdäksesi lisätietoja." - - + "USB-portin käyttö on sallittu" "Puhelin ei enää havaitse nesteitä eikä likaa." "Luodaan virheraporttia…" "Jaetaanko virheraportti?" diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 8f99e3de0f15..a24756b3c07b 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -549,15 +549,11 @@ "Icône d\'empreinte digitale" - - + "gérer le matériel de déverrouillage par reconnaissance faciale" "Permet à l\'appli d\'employer des méthodes d\'aj. et de suppr. de modèles de reconn. visage." - - - - - - + "utiliser le matériel de déverrouillage par reconnaissance faciale" + "Permet à l\'appli d\'utiliser du matériel de déverr. par reconn faciale pour l\'authentific." + "Déverrouillage par reconnaissance faciale" "Inscrivez votre visage à nouveau" "Pour améliorer la reconnaissance, veuillez enregistrer à nouveau votre visage" "Imposs. capt. données visage précises. Réessayez." @@ -583,20 +579,15 @@ "Imposs. de vérif. visage. Matériel non accessible." - - + "Réessayez le déverr. par reconnaissance faciale." "Impossible de stocker de nouveaux visages. Supprimez-en un." "Opération de reconnaissance du visage annulée." - - + "Déverr. par reconn. faciale annulé par l\'utilisateur." "Trop de tentatives. Veuillez réessayer plus tard." - - + "Trop de tentatives. Le déverr. par reconnaissance faciale est désactivé." "Impossible de vérifier le visage. Réessayez." - - - - + "Vous n\'avez pas config. le déverr. par reconn. faciale." + "Cet appar. ne prend pas en charge le déverr. par reconn. faciale." "Visage %d" @@ -1366,8 +1357,7 @@ "Effectuez une réinitialisation pour désactiver le mode Logiciel de test." "Liquide ou débris dans le port USB" "Le port USB est désactivé automatiquement. Touchez ici pour en savoir plus." - - + "Autorisation d\'utiliser le port USB" "Le téléphone ne détecte plus les liquides ni les débris." "Création d\'un rapport de bogue en cours..." "Partager le rapport de bogue?" diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index b55f2972770f..e78ceda1e6c7 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -549,15 +549,11 @@ "Icône d\'empreinte digitale" - - + "gérer les composants de Face Unlock" "Autorise l\'appli à invoquer des méthodes pour ajouter et supprimer des modèles de visages." - - - - - - + "utiliser les composants de Face Unlock" + "Autorise l\'application à utiliser les composants de Face Unlock pour l\'authentification" + "Face Unlock" "Enregistrer à nouveau votre visage" "Pour améliorer la reconnaissance, veuillez enregistrer à nouveau votre visage" "Capture du visage impossible. Réessayez." @@ -583,20 +579,15 @@ "Imposs. valider visage. Matériel non disponible." - - + "Réessayez d\'activer Face Unlock." "Impossible stocker nouv. visages. Veuillez en supprimer un." "Opération de reconnaissance faciale annulée." - - + "Face Unlock annulé par l\'utilisateur." "Trop de tentatives. Réessayez plus tard." - - + "Tentatives trop nombreuses. Désactivation de Face Unlock." "Impossible de valider votre visage. Réessayez." - - - - + "Face Unlock n\'est pas configuré." + "Face Unlock n\'est pas compatible avec cet appareil." "Visage %d" @@ -1366,8 +1357,7 @@ "Rétablissez la configuration d\'usine pour désactiver le mode Atelier de test." "Présence de liquide ou de saletés dans le port USB" "Le port USB est désactivé automatiquement. Appuyez sur cette notification pour en savoir plus." - - + "Autoriser l\'utilisation du port USB" "Le téléphone ne détecte plus les liquides ni les saletés." "Création du rapport de bug…" "Partager le rapport de bug ?" diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 5e497a0895f1..f740edfec0b5 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -549,15 +549,11 @@ "Icona de impresión dixital" - - + "xestionar o hardware de desbloqueo facial" "Permite que a aplicación invoque métodos para engadir e eliminar modelos faciais de uso." - - - - - - + "utilizar o hardware de desbloqueo facial" + "Permite que a aplicación utilice o hardware de desbloqueo facial para a autenticación" + "Desbloqueo facial" "Volve inscribir a túa cara" "Para mellorar o recoñecemento, inscribe de novo a túa cara" "Sen datos faciais exactos. Téntao de novo." @@ -583,20 +579,15 @@ "Sen verificar a cara. Hardware non dispoñible." - - + "Tenta utilizar o desbloqueo facial de novo." "Para gardar novos datos faciais, elimina os antigos." "Cancelouse a operación relacionada coa cara" - - + "O usuario cancelou o desbloqueo facial." "Demasiados intentos. Téntao de novo máis tarde." - - + "Demasiados intentos. Desactivouse o desbloqueo facial." "Non se puido verificar a cara. Téntao de novo." - - - - + "Non configuraches o desbloqueo facial." + "Este dispositivo non admite o desbloqueo facial." "Cara %d" @@ -1367,8 +1358,7 @@ "Restablece a configuración de fábrica para desactivar o modo de axente de proba." "Hai líquido ou residuos no porto USB" "O porto USB desactivouse automaticamente. Toca para obter máis información." - - + "Pódese utilizar o porto USB" "O teléfono xa non detecta líquidos nin residuos." "Creando informe de erros…" "Queres compartir o informe de erros?" diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index c03db766d292..dc23dcdb276c 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -549,15 +549,11 @@ "ફિંગરપ્રિન્ટ આયકન" - - + "ફેસ અનલૉકના હાર્ડવેરને મેનેજ કરો" "ઍપને ઉપયોગ માટે ચહેરાના નમૂના ઉમેરવા અને ડિલીટ કરવાની પદ્ધતિને રદ કરવાની મંજૂરી આપે છે." - - - - - - + "ફેસ અનલૉક હાર્ડવેરનો ઉપયોગ કરો" + "ઍપને પ્રમાણીકરણ માટે ફેસ અનલૉકના હાર્ડવેરનો ઉપયોગ કરવાની મંજૂરી આપે છે" + "ફેસ અનલૉક" "તમારા ચહેરાની ફરી નોંધણી કરાવો" "ઓળખવાની પ્રક્રિયાને બહેતર બનાવવા માટે કૃપા કરીને તમારા ચહેરાની ફરી નોંધણી કરાવો" "ચહેરાનો સચોટ ડેટા કૅપ્ચર ન થયો. ફરી પ્રયાસ કરો." @@ -583,20 +579,15 @@ "ચહેરો ચકાસી શકાતો નથી. હાર્ડવેર ઉપલબ્ધ નથી." - - + "ફેસ અનલૉકને ફરી અજમાવો." "ચહેરાનો નવો ડેટા સ્ટોર કરી શકતાં નથી. પહેલા જૂનો ડિલીટ કરો." "ચહેરા સંબંધિત કાર્યવાહી રદ કરવામાં આવી છે." - - + "વપરાશકર્તાએ ફેસ અનલૉક રદ કર્યું." "ઘણા બધા પ્રયત્નો. થોડા સમય પછી ફરી પ્રયાસ કરો." - - + "ઘણા બધા પ્રયાસો. ફેસ અનલૉક બંધ કર્યું." "ચહેરો ચકાસી શકાતો નથી. ફરી પ્રયાસ કરો." - - - - + "તમે ફેસ અનલૉકનું સેટઅપ કર્યું નથી." + "આ ડિવાઇસ પર ફેસ અનલૉક કરવાની સુવિધા નથી." "ચહેરાનું %d" @@ -1367,8 +1358,7 @@ "ટેસ્ટ હાર્નેસ મોડ બંધ કરવા માટે ફૅક્ટરી રીસેટ કરો." "USB પોર્ટમાં પ્રવાહી કે ધૂળ" "USB પોર્ટ ઑટોમૅટિક રીતે બંધ કરવામાં આવ્યો છે. વધુ જાણવા માટે ટૅપ કરો." - - + "USB પોર્ટનો ઉપયોગ કરવો યોગ્ય છે" "ફોનને હવે કોઈ પ્રવાહી કે ધૂળ હોવાનું જણાયું નથી." "બગ રિપોર્ટ લઈ રહ્યાં છે…" "બગ રિપોર્ટ શેર કરીએ?" diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 4eeb661e782e..4a4bdf959dda 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -549,15 +549,11 @@ "फ़िंगरप्रिंट आइकॉन" - - + "\'मालिक का चेहरा पहचानकर अनलॉक\' वाला हार्डवेयर प्रबंधित करें" "ऐप्लिकेशन को चेहरे के टेम्पलेट इस्तेमाल के तरीके जोड़ने और मिटाने की मंज़ूरी मिलती है." - - - - - - + "\'मालिक का चेहरा पहचानकर अनलॉक\' वाला हार्डवेयर इस्तेमाल करें" + "ऐप्लिकेशन को \'मालिक का चेहरा पहचानकर अनलॉक\' वाले हार्डवेयर के इस्तेमाल की मंज़ूरी देता है" + "मालिक का चेहरा पहचानकर अनलॉक" "अपना चेहरा फिर से दर्ज करें" "कृपया अपना चेहरा फिर से दर्ज करें ताकि आपको बेहतर तरीके से पहचाना जा सके" "चेहरे से जुड़ा सटीक डेटा कैप्चर नहीं किया जा सका. फिर से कोशिश करें." @@ -583,20 +579,15 @@ "चेहरा नहीं पहचान पा रहे. हार्डवेयर उपलब्ध नहीं है." - - + "\'मालिक का चेहरा पहचानकर अनलॉक\' फिर से आज़माएं." "चेहरे का नया डेटा सेव नहीं हो सकता. कोई पुराना डेटा मिटाएं." "चेहरा पहचानने की कार्रवाई रद्द की गई." - - + "उपयोगकर्ता ने \'मालिक का चेहरा पहचानकर अनलॉक\' रद्द की." "कई बार कोशिश की गई. बाद में कोशिश करें." - - + "कई बार कोशिश की जा चुकी है. \'मालिक का चेहरा पहचानकर अनलॉक\' बंद है." "चेहरा नहीं पहचान पा रहे. फिर से कोशिश करें." - - - - + "आपने \'मालिक का चेहरा पहचानकर अनलॉक\' सेट नहीं की है." + "इस डिवाइस पर \'मालिक का चेहरा पहचानकर अनलॉक\' काम नहीं करती है." "चेहरा %d" @@ -1366,8 +1357,7 @@ "टेस्ट हार्नेस मोड बंद करने के लिए फ़ैक्ट्री रीसेट करें." "यूएसबी पोर्ट में तरल चीज़ या कचरा है" "यूएसबी पोर्ट अपने आप बंद हो गया है. ज़्यादा जानने के लिए टैप करें." - - + "यूएसबी पोर्ट का इस्तेमाल करना सुरक्षित है" "फ़ोन अब तरल चीज़ों या कचरे की पहचान नहीं करता." "गड़बड़ी की रिपोर्ट ली जा रही है…" "गड़बड़ी की रिपोर्ट शेयर करें?" @@ -1465,7 +1455,7 @@ "वॉलपेपर बदलें" "सूचना को सुनने की सुविधा" "VR श्रोता" - "स्थिति प्रदाता" + "स्थिति देने वाली" "सूचना रैंकर सेवा" "VPN सक्रिय" "VPN को %s द्वारा सक्रिय किया गया है" @@ -1503,7 +1493,7 @@ "आगे ढूंढें" "पिछला ढूंढें" "%s ने जगह का अनुरोध किया गया है" - "जगह का अनुरोध किया जा रहा है" + "जगह की जानकारी मांगी जा रही है" "%1$s (%2$s) द्वारा अनुरोधित" "हां" "नहीं" diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index eb091047f4ff..d68895fac6b7 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -552,15 +552,11 @@ "Ikona otiska prsta" - - + "Upravljajte hardverom za otključavanje licem" "Aplikaciji omogućuje pozivanje načina za dodavanje i brisanje predložaka lica za upotrebu." - - - - - - + "Koristiti hardver za otključavanje licem" + "Aplikaciji omogućuje upotrebu hardvera za otključavanje licem radi autentifikacije" + "Otključavanje licem" "Ponovo registrirajte svoje lice" "Za poboljšanje prepoznavanja ponovo registrirajte svoje lice" "Podaci o licu nisu točni. Pokušajte ponovo." @@ -586,20 +582,15 @@ "Lice nije potvrđeno. Hardver nije dostupan." - - + "Ponovo pokušajte otključavanje licem." "Podaci o novom licu nisu pohranjeni. Izbrišite neko staro." "Otkazana je radnja s licem." - - + "Otključavanje licem otkazao je korisnik." "Previše pokušaja. Pokušajte ponovo kasnije." - - + "Previše pokušaja. Onemogućeno otključavanje licem" "Lice nije potvrđeno. Pokušajte ponovo." - - - - + "Niste postavili otključavanje licem" + "Otključavanje licem nije podržano na ovom uređaju." "Lice %d" @@ -1388,8 +1379,7 @@ "Vratite na tvorničke postavke da biste onemogućili način testnog okvira." "Tekućina ili prljavština u USB priključku" "USB priključak automatski je onemogućen. Dodirnite da biste saznali više." - - + "Možete koristiti USB priključak" "Telefon više ne otkriva tekućinu ili prljavštinu." "Izrada izvješća o programskoj pogrešci…" "Želite li podijeliti izvješće o programskoj pogrešci?" diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 608a1217172e..98c93f6cdbe4 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -549,15 +549,11 @@ "Ujjlenyomat ikon" - - + "arcalapú feloldásra szolgáló hardver kezelése" "Engedélyezi, hogy az alkalmazás arcsablon-hozzáadási és -törlési metódusokat hívjon." - - - - - - + "arcalapú feloldásra szolgáló hardver használata" + "Engedélyezi, hogy az alkalmazás hitelesítésre használja az arcalapú feloldás hardverét" + "Arcalapú feloldás" "Rögzítsen újra képet az arcáról" "A felismerés javítása érdekében rögzítsen újra az arcáról készített képet" "Sikertelen az arc pontos rögzítése. Próbálja újra." @@ -583,20 +579,15 @@ "Sikertelen arcellenőrzés. A hardver nem érhető el." - - + "Próbálja újra az arcalapú feloldást." "Nem tárolhatók újabb arcadatok. Törölje valamelyik arcot." "Az arccal kapcsolatos művelet törölve." - - + "Az arcalapú feloldást megszakította a felhasználó." "Túl sok próbálkozás. Próbálja újra később." - - + "Túl sok próbálkozás. Az arcalapú feloldás letiltva." "Nem sikerült ellenőrizni az arcát. Próbálja újra." - - - - + "Nem állította be az arcalapú feloldást." + "Az eszköz nem támogatja az arcalapú feloldást" "%d arc" @@ -1366,8 +1357,7 @@ "A Tesztelési alapkörnyezet mód kikapcsolásához állítsa vissza a gyári beállításokat." "Folyadék vagy szennyeződés az USB-portban" "USB-port automatikusan letiltva. Koppintson, ha további információra van szüksége." - - + "Az USB-port rendben használható" "A telefon már nem észlel folyadékot vagy szennyeződést." "Hibajelentés készítése…" "Megosztja a hibajelentést?" diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index d99afcb9e9d9..5008bda423fa 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -280,7 +280,7 @@ "Թույլատրե՞լ <b>%1$s</b> հավելվածին օգտագործել ձեր կոնտակտները" "Տեղորոշում" "տեղորոշել այս սարքը" - "Թույլատրե՞լ <b>%1$s</b>-ին օգտագործել այս սարքի տեղադրության տվյալները" + "Թույլատրե՞լ <b>%1$s</b> հավելվածին օգտագործել այս սարքի տեղադրության տվյալները" "Տեղադրության տվյալները հասանելի կլինեն հավելվածին, միայն երբ այն օգտագործելիս լինեք" "<b>Միշտ</b> հասանելի դարձնե՞լ <b>%1$s</b> հավելվածին ձեր սարքի տեղադրությունը" "Տեղադրության տվյալները հասանելի կլինեն հավելվածին, միայն երբ այն օգտագործելիս լինեք" @@ -549,15 +549,11 @@ "Մատնահետքի պատկերակ" - - + "կառավարել դեմքով ապակողպման համար սարքը" "Հավելվածին թույլ է տալիս ավելացնել և հեռացնել դեմքի նմուշներ:" - - - - - - + "օգտագործել դեմքով ապակողպման համար սարքը" + "Թույլ է տալիս հավելվածին օգտագործել դեմքով ապակողպման համար նախատեսված սարքը" + "Դեմքով ապակողպում" "Նորից գրանցեք ձեր դեմքը" "Ճանաչումը լավացնելու համար նորից գրանցեք ձեր դեմքը" "Չհաջողվեց գրանցել դեմքի ճշգրիտ տվյալները։ Կրկնեք։" @@ -583,20 +579,15 @@ "Չհաջողվեց հաստատել դեմքը։ Սարքն անհասանելի է:" - - + "Նորից փորձեք դեմքով ապակողպումը։" "Չհաջողվեց պահել նոր դեմքը։ Ջնջեք հին տարբերակը։" "Դեմքի ճանաչումը չեղարկվել է։" - - + "Դեմքով ապակողմումը չեղարկվել է օգտատիրոջ կողմից:" "Չափից շատ փորձեր եք կատարել: Փորձեք ավելի ուշ:" - - + "Չափազանց շատ փորձեր են արվել։ Դեմքով ապակողպումն անջատված է:" "Չհաջողվեց հաստատել դեմքը։ Նորից փորձեք։" - - - - + "Դուք չեք կարգավորել դեմքով ապակողպումը:" + "Դեմքով ապակողպումն այս սարքում չի աջակցվում" "Դեմք %d" @@ -1366,8 +1357,7 @@ "Թեստային ռեժիմն անջատելու համար զրոյացրեք կարգավորումները։" "USB միացքում ջուր կամ աղտ է հայտնաբերվել" "USB միացքն ավտոմատ անջատվել է: Հպեք՝ ավելին իմանալու համար:" - - + "USB միացքը կարող է օգտագործվել" "Հեռախոսում ջուր կամ աղտ չի հայտնաբերվել:" "Վրիպակի զեկույցի ստեղծում…" "Տրամադրե՞լ վրիպակի զեկույցը:" diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index a3cc65277774..0908926a793c 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -584,7 +584,7 @@ "Pemrosesan wajah dibatalkan." "Face unlock dibatalkan oleh pengguna." "Terlalu banyak percobaan. Coba lagi nanti." - "Terlalu banyak percobaan. Face unlock dinonaktifkan." + "Terlalu banyak gagal. Face unlock dinonaktifkan." "Tidak dapat memverifikasi wajah. Coba lagi." "Anda belum menyiapkan face unlock." "Face unlock tidak didukung di perangkat ini." diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 00637a4e54c4..faf065e5923f 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -549,15 +549,11 @@ "Fingrafaratákn" - - + "stjórna vélbúnaði andlitsopnunar" "Leyfir forritinu að beita aðferðum til að bæta við og eyða andlitssniðmátum til notkunar." - - - - - - + "nota vélbúnað andlitsopnunar" + "Leyfir forritinu að nota andlitsopnunarvélbúnað til auðkenningar" + "Andlitsopnun" "Skráðu andlitið þitt aftur" "Skráðu andlitið þitt til að bæta kennsl" "Nákvæm andlitsgögn fengust ekki. Reyndu aftur." @@ -583,20 +579,15 @@ "Andlit ekki staðfest. Vélbúnaður er ekki tiltækur." - - + "Prófaðu andlitsopnun aftur." "Ekki er hægt að vista ný andlitsgögn. Eyddu gömlu fyrst." "Hætt við andlitsgreiningu." - - + "Notandi hætti við andlitsopnun." "Of margar tilraunir. Reyndu aftur síðar." - - + "Of margar tilraunir. Slökkt á andlitsopnun." "Ekki tókst að staðfesta andlit. Reyndu aftur." - - - - + "Þú hefur ekki sett upp andlitsopnun." + "Andlitsopnun er ekki studd í þessu tæki." "Andlit %d" @@ -1367,8 +1358,7 @@ "Núllstilltu til að slökkva á stillingu prófunarvangs." "Vökvi eða óhreinindi í USB-tengi" "USB-tengi er gert óvirkt sjálfkrafa. Ýttu til að fá frekari upplýsingar." - - + "Óhætt að nota USB-tengi" "Síminn greinir ekki lengur vökva eða óhreinindi" "Tekur við villutilkynningu…" "Deila villutilkynningu?" diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 96d44c6c454c..e54d305e3738 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1492,8 +1492,8 @@ "Ricerca Web" "Trova successivo" "Trova precedente" - "Richiesta posizione da %s" - "Richiesta posizione" + "Richiesta di posizione da %s" + "Richiesta di posizione" "Richiesto da %1$s (%2$s)" "Sì" "No" diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 78085c72591e..3bec6d0f11b1 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -555,15 +555,11 @@ "סמל טביעת אצבע" - - + "ניהול החומרה לשחרור נעילה על ידי זיהוי פנים" "מאפשרת לאפליקציה להפעיל שיטות להוספה ומחיקה של תבניות פנים שבהן ייעשה שימוש." - - - - - - + "שימוש בחומרה לשחרור נעילה על ידי זיהוי פנים" + "מאפשרת לאפליקציה להשתמש בחומרה לשחרור נעילה על ידי זיהוי פנים לצורך אימות" + "שחרור נעילה על ידי זיהוי פנים" "יש לבצע רישום מחדש של הפנים שלך" "לשיפור הזיהוי יש לבצע רישום מחדש של הפנים שלך" "לא ניתן היה לקלוט את הפנים במדויק. יש לנסות שוב." @@ -589,20 +585,15 @@ "לא ניתן לאמת את הפנים. החומרה לא זמינה." - - + "יש לנסות שוב את שחרור הנעילה על ידי זיהוי פנים." "לא ניתן לאחסן נתוני פנים. תחילה יש למחוק פנים ישנים." "פעולת הפנים בוטלה." - - + "שחרור הנעילה על ידי זיהוי פנים בוטל על ידי המשתמש." "יותר מדי ניסיונות. יש לנסות שוב מאוחר יותר." - - + "יותר מדי ניסיונות. שחרור נעילה על ידי זיהוי פנים מושבת." "לא ניתן לאמת את הפנים. יש לנסות שוב." - - - - + "לא הגדרת שחרור נעילה על ידי זיהוי פנים." + "המכשיר הזה לא תומך בשחרור נעילה על ידי זיהוי פנים." "פנים %d" @@ -1410,8 +1401,7 @@ "כדי להשבית את מצב מסגרת בדיקה צריך לאפס להגדרות היצרן." "‏יש נוזלים או חלקיקים ביציאת ה-USB" "‏יציאת ה-USB הושבתה באופן אוטומטי. יש להקיש לקבלת מידע נוסף." - - + "‏ניתן להשתמש ביציאת ה-USB" "הטלפון לא מזהה יותר נוזלים וחלקיקים." "עיבוד דוח על באג..." "האם לשתף דוח על באג?" diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index e71bc0a30172..439c64e442ca 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -549,15 +549,11 @@ "指紋アイコン" - - + "フェイスアンロック ハードウェアの管理" "使用する顔テンプレートの追加や削除を行うメソッドの呼び出しをアプリに許可します。" - - - - - - + "フェイスアンロック ハードウェアの使用" + "フェイスアンロック ハードウェアを認証に使用することをアプリに許可します" + "フェイスアンロック" "顔の再登録" "認識を改善するには、顔を再登録してください" "顔を認識できませんでした。もう一度お試しください。" @@ -583,20 +579,15 @@ "顔を確認できません。ハードウェアを利用できません。" - - + "フェイスアンロックをもう一度お試しください。" "新しい顔データを保存できません。古いデータを削除してください。" "顔の操作をキャンセルしました。" - - + "フェイスアンロックはユーザーによりキャンセルされました。" "試行回数の上限です。後でもう一度お試しください。" - - + "試行回数が上限を超えました。フェイスアンロックを無効にしました。" "顔を確認できません。もう一度お試しください。" - - - - + "フェイスアンロックを設定していません。" + "このデバイスでは、フェイスアンロックはご利用いただけません。" "顔 %d" @@ -1366,8 +1357,7 @@ "出荷時設定にリセットしてテストハーネス モードを無効にしてください。" "USB ポート内の液体やゴミ" "USB ポートが自動的に無効になりました。タップして詳細をご確認ください。" - - + "USB ポートを安全に使用できます" "液体やゴミは検出されなくなりました。" "バグレポートを取得しています…" "バグレポートを共有しますか?" @@ -1503,7 +1493,7 @@ "次を検索" "前を検索" "%sさんからの現在地情報リクエスト" - "現在地情報へのアクセス許可" + "現在地情報リクエスト" "%1$sさん(%2$s)からのリクエスト" "はい" "いいえ" diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index d9ae8ead5d43..2856d0398632 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -549,15 +549,11 @@ "თითის ანაბეჭდის ხატულა" - - + "სახით განბლოკვის აპარატურის მართვა" "საშუალებას აძლევს აპს, დაამატოს და წაშალოს სახეების შაბლონები." - - - - - - + "სახით განბლოკვის აპარატურის გამოყენება" + "საშუალებას აძლევს აპს, ამოცნობისთვის გამოიყენოს სახით განბლოკვის აპარატურა" + "განბლოკვა სახით" "დაარეგისტრირეთ თქვენი სახე ხელახლა" "ამოცნობის გასაუმჯობესებლად, გთხოვთ, ხელახლა დაარეგისტრიროთ თქვენი სახე" "სახის ზუსტი მონაცემები არ აღიბეჭდა. ცადეთ ხელახლა." @@ -583,20 +579,15 @@ "სახე ვერ დასტურდება. აპარატი მიუწვდომელია." - - + "ცადეთ ხელახლა სახით განბლოკვა." "სახის ახალი მონაცემები ვერ ინახება. ჯერ ძველი წაშალეთ." "სახის ამოცნობა გაუქმდა." - - + "განბლოკვა სახით გაუქმდა მომხმარებლის მიერ." "დაფიქსირდა ბევრი მცდელობა. ცადეთ მოგვიანებით." - - + "მეტისმეტად ბევრი მცდელობა იყო. სახით განბლოკვა გათიშულია." "სახის დადასტურება ვერ ხერხდება. ცადეთ ხელახლა." - - - - + "თქვენ არ დაგიყენებიათ სახით განბლოკვა." + "განბლოკვა სახით ამ მოწყობილობაზე მხარდაჭერილი არ არის." "სახე %d" @@ -1366,8 +1357,7 @@ "დააბრუნეთ ქარხნული პარამეტრები „გარემო ტესტირებისთვის“ რეჟიმის გასათიშად." "USB პორტში აღმოჩენილია სითხე ან ჭუჭყი" "USB პორტი ავტომატურად გათიშულია. შეეხეთ დამატებითი ინფორმაციისთვის." - - + "თანხმობა USB პორტის გამოყენებაზე" "ტელეფონი აღარ აღმოაჩენს სითხეს ან ჭუჭყს." "მიმდინარეობს ხარვეზის შესახებ ანგარიშის შექმნა…" "გსურთ ხარვეზის შესახებ ანგარიშის გაზიარება?" diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index cb43ba04a85b..09d2c9bf2a5d 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -549,15 +549,11 @@ "Саусақ ізі белгішесі" - - + "Face Unlock жабдығын басқару" "Қолданбаға пайдаланатын бет үлгілерін енгізу және жою әдістерін шақыруға мүмкіндік береді." - - - - - - + "Face Unlock жабдығын пайдалану" + "Аутентификациялау үшін қолданбаға Face Unlock жабдығын пайдалануға рұқсат береді." + "Face Unlock" "Бетті қайта тіркеу" "Құрылғы жүзіңізді жақсырақ тануы үшін, бетіңізді қайта тіркеңіз." "Бет деректері дұрыс алынбады. Әрекетті қайталаңыз." @@ -583,20 +579,15 @@ "Бетті тану мүмкін емес. Жабдық қолжетімді емес." - - + "Face Unlock функциясын қайта қолданып көріңіз." "Жаңа бетті сақтау мүмкін емес. Алдымен ескісін жойыңыз." "Бетті танудан бас тартылды." - - + "Пайдаланушы Face Unlock функциясынан бас тартты." "Тым көп әрекет жасалды. Кейінірек қайталаңыз." - - + "Тым көп әрекет жасалды. Face Unlock функциясы өшірілді." "Бетті тану мүмкін емес. Әрекетті қайталаңыз." - - - - + "Face Unlock реттелмеді." + "Бұл құрылғыда Face Unlock функциясы істемейді." "%d беті" @@ -1367,8 +1358,7 @@ "Сынақ бағдарламасы режимін өшіру үшін зауыттық күйіне қайтарыңыз." "USB портына сұйықтық немесе қоқыс кірді" "USB порты автоматты түрде өшірілді. Толығырақ ақпарат алу үшін түртіңіз." - - + "USB портын пайдалана беруге болады" "Телефон бұдан былай сұйықтықты немесе қоқысты анықтамайды." "Қате туралы есеп алынуда…" "Қате туралы есепті бөлісу керек пе?" @@ -1504,7 +1494,7 @@ "Келесіні табу" "Алдыңғыны табу" "Орын туралы өтініші жіберген %s" - "Орын туралы өтініш" + "Орын туралы сұрау" "Өтініш жіберген %1$s (%2$s)" "Иә" "Жоқ" diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index f1a573eeef95..d70469aa0fa5 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -549,15 +549,11 @@ "រូបតំណាងស្នាមម្រាមដៃ" - - + "គ្រប់គ្រង​ហាតវែរ​ដោះសោតាមទម្រង់មុខ" "អនុញ្ញាតឱ្យកម្មវិធីប្រើវិធីសាស្ត្រដើម្បី​បញ្ចូល និងលុបទម្រង់​គំរូ​ផ្ទៃមុខសម្រាប់ប្រើប្រាស់។" - - - - - - + "ប្រើ​ហាតវែរ​ដោះសោ​តាមទម្រង់មុខ" + "អនុញ្ញាត​ឱ្យ​កម្មវិធី​ប្រើ​ហាតវែរ​ដោះសោតាមទម្រង់មុខ​សម្រាប់​ការផ្ទៀងផ្ទាត់" + "ការដោះសោ​តាមទម្រង់មុខ" "ស្កេន​បញ្ចូល​មុខរបស់អ្នក​ម្ដងទៀត" "ដើម្បី​ធ្វើឱ្យ​ការសម្គាល់មុខ​ប្រសើរជាងមុន សូមស្កេន​បញ្ចូល​មុខរបស់អ្នក​ម្ដងទៀត" "មិនអាច​ថត​ទិន្នន័យទម្រង់មុខ​បាន​ត្រឹមត្រូវទេ។ សូមព្យាយាមម្ដងទៀត។" @@ -583,20 +579,15 @@ "មិនអាច​ផ្ទៀងផ្ទាត់​មុខបានទេ។ មិនមាន​ហាតវែរទេ។" - - + "សាកល្បង​ដោះសោតាមទម្រង់មុខ​ម្ដងទៀត។" "មិនអាច​ផ្ទុកទិន្នន័យទម្រង់​មុខថ្មី​បានទេ។ សូមលុបទិន្នន័យទម្រង់​មុខចាស់ជាមុនសិន។" "បាន​បោះបង់​ប្រតិបត្តិការចាប់​ផ្ទៃមុខ។" - - + "អ្នកប្រើប្រាស់​បានបោះបង់​ការដោះសោ​តាមទម្រង់មុខ។" "ព្យាយាមចូលច្រើនពេកហើយ។ សូមព្យាយាមម្តងទៀតពេលក្រោយ។" - - + "ការដោះសោ​តាមទម្រង់មុខត្រូវបាន​បិទ ដោយ​សារ​ព្យាយាម​ច្រើនដង​ពេក។" "មិន​អាច​ផ្ទៀងផ្ទាត់​មុខ​បាន​ទេ។ សូមព្យាយាមម្ដងទៀត។" - - - - + "អ្នក​មិនទាន់​រៀបចំ​ការដោះសោតាមទម្រង់មុខ​នៅឡើយទេ។" + "មិនអាចប្រើ​ការដោះសោតាមទម្រង់មុខ​នៅលើ​ឧបករណ៍​នេះ​បានទេ។" "ផ្ទៃមុខទី %d" @@ -1368,8 +1359,7 @@ "ធ្វើការកំណត់ដូចដើមឡើងវិញ ដើម្បី​បិទ​មុខងារប្រមូលធ្វើតេស្ត។" "មានទឹក ឬ​កម្ទេចផ្សេងៗ​នៅក្នុងរន្ធ USB" "រន្ធ USB ត្រូវបាន​បិទ​ដោយ​ស្វ័យប្រវត្តិ។ សូមចុច​ដើម្បី​ស្វែងយល់​បន្ថែម។" - - + "អាច​ប្រើរន្ធ USB បាន" "ទូរសព្ទ​រកមិនឃើញ​ទឹក ឬ​កម្ទេចផ្សេងៗ​ទេ។" "កំពុងទទួលយករបាយការណ៍កំហុស…" "ចែករំលែករបាយការណ៍កំហុសឬ?" diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 8bdb19d0dcb3..65ccadb56c6a 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -549,15 +549,11 @@ "지문 아이콘" - - + "얼굴인식 잠금해제 하드웨어 관리" "사용할 얼굴 템플릿의 추가 및 삭제 메서드를 앱에서 호출하도록 허용합니다." - - - - - - + "얼굴인식 잠금해제 하드웨어 사용" + "앱에서 얼굴인식 잠금해제 하드웨어를 인증에 사용하도록 허용합니다." + "얼굴인식 잠금해제" "얼굴 재등록 필요" "인식률을 개선하려면 얼굴을 다시 등록하세요." "정확한 얼굴 데이터를 캡처하지 못했습니다. 다시 시도하세요." @@ -583,20 +579,15 @@ "얼굴을 확인할 수 없습니다. 하드웨어를 사용할 수 없습니다." - - + "얼굴인식 잠금해제를 다시 시도해 주세요." "새 얼굴 데이터를 저장할 수 없습니다. 먼저 기존 얼굴 데이터를 삭제하세요." "얼굴 인식 작업이 취소되었습니다." - - + "사용자가 얼굴인식 잠금해제를 취소했습니다." "시도 횟수가 너무 많습니다. 나중에 다시 시도하세요." - - + "시도 횟수가 너무 많습니다. 얼굴인식 잠금해제가 사용 중지되었습니다." "얼굴을 확인할 수 없습니다. 다시 시도하세요." - - - - + "얼굴인식 잠금해제를 설정하지 않았습니다." + "이 기기에서는 얼굴인식 잠금해제가 지원되지 않습니다." "얼굴 %d" @@ -1366,8 +1357,7 @@ "테스트 하네스 모드를 사용 중지하려면 초기화하세요." "USB 포트에서 액체 또는 이물질 감지됨" "USB 포트가 자동으로 사용 중지되었습니다. 자세한 내용을 보려면 탭하세요." - - + "USB 포트를 사용해도 좋음" "휴대전화에서 액체나 이물질이 더 이상 감지되지 않습니다." "버그 보고서 가져오는 중..." "버그 보고서를 공유하시겠습니까?" diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 4d1d0f43a58e..77176802a2c3 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -549,15 +549,11 @@ "Манжа изинин сүрөтчөсү" - - + "жүзүнөн таануу функциясынын аппараттык камсыздоосун башкаруу" "Колдонмого пайдалануу үчүн жүздүн үлгүлөрүн кошуу жана жок кылуу мүмкүндүгүн берет." - - - - - - + "аппараттык камсыздоо үчүн жүзүнөн таанууну колдонуу" + "Колдонмо аныктыкты текшерүүдө Жүзүнөн таануу функциясынын аппараттык камсыздоосун колдонот" + "Жүзүнөн таануу" "Жүзүңүздү кайра таанытыңыз." "Мыкты таануу үчүн, жүзүңүздү кайра таанытыңыз" "Жүзүңүз жакшы тартылган жок. Кайра аракет кылыңыз." @@ -583,20 +579,15 @@ "Жүз ырасталбай жатат. Аппараттык камсыздоо жеткиликсиз." - - + "Жүзүнөн таануу функциясын кайра текшерип көрүңүз." "Жаңы жүздү сактоо мүмкүн эмес. Адегенде эскисин өчүрүңүз." "Жүздүн аныктыгын текшерүү жокко чыгарылды." - - + "Жүзүнөн таануу функциясын колдонуучу өчүрүп салды." "Өтө көп жолу аракет жасадыңыз. Кийинчерээк кайра аракет кылыңыз." - - + "Өтө көп жолу аракет кылдыңыз. Жүзүнөн таануу функциясы өчүрүлдү." "Жүз ырасталбай жатат. Кайра аракет кылыңыз." - - - - + "Жүзүнөн таануу функциясын жөндөй элексиз." + "Жүзүнөн таануу функциясы бул түзмөктө иштебейт." "Жүз %d" @@ -1368,8 +1359,7 @@ "Сыноо программасынын режимин өчүрүү үчүн, баштапкы жөндөөлөргө кайтарыңыз." "USB портунда суюктук же урандылар бар" "USB порт автоматтык түрдө өчүрүлдү. Кененирээк маалымат алуу үчүн таптап коюңуз." - - + "USB портун колдонууга болот" "Телефон суюктук менен урандыларды аныктаган жок." "Мүчүлүштүк тууралуу кабар алынууда…" "Мүчүлүштүк тууралуу баяндама бөлүшүлсүнбү?" @@ -1505,7 +1495,7 @@ "Кийинкиси" "Мурункусу" "%s колдонуучусу жайгашкан жердин маалыматын сурады" - "Жайгашкан жердин маалыматын суроо" + "Каякта экенин билүү" "%1$s (%2$s) сурады" "Ооба" "Жок" diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index bfc999e1a1d1..fd614f31362a 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -549,15 +549,11 @@ "ໄອຄອນລາຍນິ້ວມື" - - + "ຈັດການຮາດແວປົດລັອກດ້ວຍໜ້າ" "ອະນຸຍາດໃຫ້ແອັບເປີດວິທີການຕ່າງໆເພື່ອເພີ່ມ ແລະ ລຶບແມ່ແບບໃບໜ້າສຳລັບການນຳໃຊ້." - - - - - - + "ໃຊ້ຮາດແວການປົດລັອກໃບໜ້າ" + "ອະນຸຍາດໃຫ້ແອັບໃຊ້ຮາດແວການປົດລັອກດ້ວຍໜ້າເພື່ອພິສູດຢືນຢັນ" + "ປົດລັອກດ້ວຍໜ້າ" "ລົງທະບຽນໃບໜ້າຂອງທ່ານຄືນໃໝ່" "ເພື່ອປັບປຸງການຈຳແນກ, ກະລຸນາລົງທະບຽນໃບໜ້າຂອງທ່ານຄືນໃໝ່." "ບໍ່ສາມາດບັນທຶກຂໍ້ມູນໃບໜ້າທີ່ຖືກຕ້ອງໄດ້. ກະລຸນາລອງໃໝ່." @@ -583,20 +579,15 @@ "ບໍ່ສາມາດຢັ້ງຢືນໃບໜ້າໄດ້. ບໍ່ມີຮາດແວໃຫ້ໃຊ້." - - + "ລອງປົດລັອກດ້ວຍໜ້າອີກເທື່ອໜຶ່ງ." "ບໍ່ສາມາດບັນທຶກຂໍ້ມູນໃບໜ້າໃໝ່ໄດ້. ກະລຸນາລຶບຂໍ້ມູນເກົ່າອອກກ່ອນ." "ຍົກເລີກການດຳເນີນການກັບໃບໜ້າແລ້ວ." - - + "ຜູ້ໃຊ້ຍົກເລີກການປົດລັອກດ້ວຍໜ້າແລ້ວ." "ມີຄວາມພະຍາຍາມຫຼາຍຄັ້ງເກີນໄປ. ກະລຸນາລອງໃໝ່ໃນພາຍຫຼັງ." - - + "ພະຍາຍາມຫຼາຍເທື່ອເກີນໄປ. ປິດນຳໃຊ້ການປົດລັອກດ້ວຍໜ້າແລ້ວ." "ບໍ່ສາມາດຢັ້ງຢືນໃບໜ້າໄດ້. ກະລຸນາລອງໃໝ່." - - - - + "ທ່ານຍັງບໍ່ໄດ້ຕັ້ງການປົດລັອກດ້ວຍໜ້າເທື່ອ." + "ບໍ່ຮອງຮັບການປົດລັອກດ້ວຍໜ້າຢູ່ອຸປະກອນນີ້." "ໃບໜ້າ %d" @@ -1366,8 +1357,7 @@ "ດຳເນີນການຣີເຊັດເປັນຄ່າຈາກໂຮງງານເພື່ອປິດການນຳໃຊ້ໂໝດ Test Harness." "ມີຂອງແຫລວ ຫຼື ເສດດິນໃນຜອດ USB" "ປິດຜອດ USB ໂດຍອັດຕະໂນມັດແລ້ວ. ແຕະເພື່ອສຶກສາເພີ່ມເຕີມ." - - + "ສາມາດໃຊ້ຜອດ USB ໄດ້" "ໂທລະສັບຈະບໍ່ກວດຫາຂອງແຫລວ ຫຼື ເສດດິນອີກຕໍ່ໄປ." "ກຳລັງຂໍລາຍງານຂໍ້ຜິດພາດ…" "ແບ່ງປັນລາຍງານບັນຫາບໍ?" diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 3deae1387b0e..18ecae4df5be 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -555,15 +555,11 @@ "Piršto antspaudo piktograma" - - + "tvarkyti Atrakinimo pagal veidą aparatinę įrangą" "Programai leidžiama aktyv. metodus, norint pridėti ir ištrinti naudojamus veidų šablonus." - - - - - - + "naudoti Atrakinimo pagal veidą aparatinę įrangą" + "Programai leidžiama naudoti Atrakinimo pagal veidą aparatinę įrangą tapatybei nustatyti" + "Atrakinimas pagal veidą" "Pakartotinis veido registravimas" "Kad patobulintumėte atpažinimą, iš naujo užregistruokite veidą" "Neužfiks. tikslūs veido duom. Bandykite dar kartą." @@ -589,20 +585,15 @@ "Nepavyko patv. veido. Aparatinė įranga negalima." - - + "Band. naudoti Atrakinimą pagal veidą dar kartą." "Nepavyko išs. naujų veido duomenų. Pirm. ištrinkite senus." "Veido atpažinimo operacija atšaukta." - - + "Atrakinimą pagal veidą atšaukė naudotojas." "Per daug bandymų. Vėliau bandykite dar kartą." - - + "Per daug bandymų. Atrakinimas pagal veidą išjungtas." "Nepavyko patvirtinti veido. Bandykite dar kartą." - - - - + "Nenustatėte Atrakinimo pagal veidą." + "Atrakinimas pagal veidą šiame įrenginyje nepalaikomas." "%d veidas" @@ -1410,8 +1401,7 @@ "Atkurkite gamyklinius duomenis, kad išjungtumėte testavimo sistemos režimą." "USB prievade yra skysčių ar smulkių dalelių" "USB prievadas automatiškai išjungtas. Palieskite, kad sužinotumėte daugiau." - - + "Saugu naudoti USB prievadą" "Telefonas nebeaptinka skysčių ar smulkių dalelių." "Pateikiamas pranešimas apie riktą…" "Bendrinti pranešimą apie riktą?" diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 77ce8558dd3f..11abc5f46e3a 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -552,15 +552,11 @@ "Pirksta nospieduma ikona" - - + "pārvaldīt aparatūru, kas paredzēta autorizācijai pēc sejas" "Atļauj lietotnei izsaukt metodes izmantojamo sejas veidņu pievienošanai un dzēšanai." - - - - - - + "lietot aparatūru, kas paredzēta autorizācijai pēc sejas" + "Atļauj lietotnei izmantot autentificēšanai aparatūru, ar ko veic autorizāciju pēc sejas" + "Autorizācija pēc sejas" "Atkārtoti reģistrējiet seju" "Lai uzlabotu atpazīšanu, lūdzu, atkārtoti reģistrējiet savu seju" "Neizdevās tvert sejas datus. Mēģiniet vēlreiz." @@ -586,20 +582,15 @@ "Nevar verificēt seju. Aparatūra nav pieejama." - - + "Vēlreiz mēģiniet veikt autorizāciju pēc sejas." "Nevar saglabāt jaunās sejas datus. Dzēsiet kādu no vecajām." "Darbība ar sejas datiem atcelta." - - + "Lietotājs atcēla autorizāciju pēc sejas." "Pārāk daudz mēģinājumu. Vēlāk mēģiniet vēlreiz." - - + "Pārāk daudz mēģinājumu. Autorizācija pēc sejas ir atspējota." "Nevar verificēt seju. Mēģiniet vēlreiz." - - - - + "Autorizācija pēc sejas nav iestatīta." + "Autorizācija pēc sejas šajā ierīcē netiek atbalstīta" "Seja %d" @@ -1388,8 +1379,7 @@ "Lai atspējotu drošības pārbaudes režīmu, veiciet rūpnīcas datu atiestatīšanu." "USB pieslēgvietā ir šķidrums vai daļiņas" "USB pieslēgvieta ir automātiski atspējota. Pieskarieties, lai uzzinātu vairāk." - - + "USB pieslēgvietu drīkst izmantot" "Tālrunī vairs netiek konstatēts šķidrums vai gruži." "Notiek kļūdas pārskata izveide…" "Vai kopīgot kļūdas pārskatu?" diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 0d085c8295d3..d0f04c2e316a 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -549,15 +549,11 @@ "Икона за отпечатоци" - - + "управува со хардвер за „Отклучување со лик“" "Дозволува апликац. да повика начини за додавање и бришење шаблони на лице за користење." - - - - - - + "користи хардвер за „Отклучување со лик“" + "Дозволува апликацијата да користи хардвер за „Отклучување со лик“ за проверка" + "Отклучување со лик" "Повторно регистрирајте го ликот" "За да се подобри препознавањето, повторно регистрирајте го ликот" "Не се сними прецизна слика. Обидете се повторно." @@ -583,20 +579,15 @@ "Ликот не може да се потврди. Хардвер - недостапен." - - + "Пробајте „Отклучување со лик“ повторно." "Не зачувува податоци за нов лик. Прво избришете стар." "Операцијата со лице се откажа." - - + "„Отклучувањето со лик“ е откажано од корисникот." "Премногу обиди. Обидете се повторно подоцна." - - + "Премногу обиди. „Отклучувањето со лик“ е оневозможено." "Ликот не може да се потврди. Обидете се повторно." - - - - + "Не сте поставиле „Отклучување со лик“." + "„Отклучувањето со лик“ не е поддржано на уредов." "Лице %d" @@ -1367,8 +1358,7 @@ "Извршете фабричко ресетирање за да го оневозможите режимот на рамка за тестирање." "Течност или нечистотија во USB-портата" "USB-портата е автоматски оневозможена. Допрете за да дознаете повеќе." - - + "Во ред е да се користи USB-порта" "Телефонот веќе не открива течност или нечистотија." "Се зема извештајот за грешки…" "Да се сподели извештајот за грешки?" diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index c5d8d4e65a3f..644ca2f0f48e 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -549,15 +549,11 @@ "വിരലടയാള ഐക്കൺ" - - + "മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് ഹാർഡ്‌വെയർ മാനേജ് ചെയ്യുക" "ഉപയോഗിക്കാനായി, മുഖത്തിന്റെ ടെംപ്ലേറ്റുകൾ ചേർക്കാനും ഇല്ലാതാക്കാനുമുള്ള രീതികൾ അഭ്യർത്ഥിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു." - - - - - - + "മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് ഹാർഡ്‌വെയർ ഉപയോഗിക്കുക" + "പരിശോധിച്ചുറപ്പിക്കാൻ മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് ഹാർഡ്‌വെയർ ഉപയോഗിക്കാൻ അനുവദിക്കുന്നു" + "മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക്" "നിങ്ങളുടെ മുഖം വീണ്ടും എൻറോൾ ചെയ്യൂ" "തിരിച്ചറിയൽ മെച്ചപ്പെടുത്താൻ, നിങ്ങളുടെ മുഖം ദയവായി വീണ്ടും എൻറോൾ ചെയ്യൂ" "കൃത്യ മുഖ ഡാറ്റ എടുക്കാനായില്ല. വീണ്ടും ശ്രമിക്കൂ." @@ -583,20 +579,15 @@ "മുഖം പരിശോധിക്കാൻ കഴിയില്ല. ഹാർഡ്‌വെയർ ലഭ്യമല്ല." - - + "മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് വീണ്ടും പരീക്ഷിക്കൂ" "പുതിയ മുഖ ഡാറ്റ സംഭരിക്കാനാകില്ല. ആദ്യം പഴയത് ഇല്ലാതാക്കുക." "മുഖത്തിന്റെ പ്രവർത്തനം റദ്ദാക്കി." - - + "ഉപയോക്താവ് മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് റദ്ദാക്കി" "നിരവധി തവണ ശ്രമിച്ചു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക." - - + "വളരെയധികം ശ്രമങ്ങൾ. മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് പ്രവർത്തനരഹിതമാക്കി" "മുഖം പരിശോധിക്കാൻ കഴിയില്ല. വീണ്ടും ശ്രമിക്കൂ." - - - - + "മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് സജ്ജീകരിച്ചില്ല." + "മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് ഈ ഉപകരണം പിന്തുണയ്ക്കുന്നില്ല." "മുഖം %d" @@ -1367,8 +1358,7 @@ "പരിശോധനാ സംവിധാന മോഡ് പ്രവർത്തനരഹിതമാക്കാൻ ഫാക്‌ടറി പുനഃക്രമീകരണം നിർവഹിക്കുക." "USB പോർട്ടിൽ ദ്രാവകമോ പൊടിയോ കണ്ടെത്തി" "USB പോർട്ടർ സ്വയമേവ പ്രവർത്തനരഹിതമായി. കൂടുതലറിയാൻ ടാപ്പ് ചെയ്യുക." - - + "ഇനി USB പോർട്ട് ഉപയോഗിക്കാം" "നിലവിൽ ദ്രാവകമോ പൊടിയോ ഉള്ളതായി ഫോൺ കണ്ടെത്തുന്നില്ല." "ബഗ് റിപ്പോർട്ട് എടുക്കുന്നു…" "ബഗ് റിപ്പോർട്ട് പങ്കിടണോ?" diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 13417f2846ae..1c4ae79deef1 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -549,15 +549,11 @@ "Хурууны хээний дүрс" - - + "царайгаар тайлах техник хангамжийг удирдах" "Аппад царайны загварыг ашиглахын тулд нэмэх эсвэл устгах аргыг идэвхжүүлэхийг зөвшөөрдөг." - - - - - - + "царайгаар тайлах техник хангамж ашиглах" + "Аппад царайгаар тайлах техник хангамжийг баталгаажуулалтад ашиглахыг зөвшөөрдөг" + "Царайгаар тайлах" "Царайгаа дахин бүртгүүлнэ үү" "Танилтыг сайжруулахын тулд царайгаа дахин бүртгүүлнэ үү" "Царайн өгөгдлийг зөв авч чадсангүй. Дахин оролдоно уу." @@ -583,20 +579,15 @@ "Царайг бататгаж чадсангүй. Техник хангамж боломжгүй байна." - - + "Царайгаар тайлахыг дахин оролдоно уу." "Царайн шинэ өгөгдлийг хадгалж чадсангүй. Эхлээд хуучин өгөгдлийг устгана уу." "Царайны үйл ажиллагааг цуцаллаа." - - + "Хэрэглэгч царайгаар тайлахыг цуцалсан." "Хэт олон удаа оролдлоо. Дараа дахин оролдоно уу." - - + "Хэтэрхий олон удаа оролдлоо. Царайгаар тайлахыг идэвхгүй болголоо." "Царайг бататгаж чадсангүй. Дахин оролдоно уу." - - - - + "Та царайгаар тайлахыг тохируулаагүй байна." + "Царайгаар тайлахыг энэ төхөөрөмж дээр дэмждэггүй." "Царай %d" @@ -1366,8 +1357,7 @@ "Туршилтын цогц горимыг идэвхгүй болгохын тулд үйлдвэрийн төлөвт шинэчилнэ үү." "USB порт дээрх шингэн зүйл эсвэл бохирдол" "USB портыг автоматаар идэвхгүй болгосон байна. Дэлгэрэнгүй мэдээлэл авахын тулд товшино уу." - - + "USB портыг ашиглахад зүгээр" "Утас шингэн зүйл эсвэл бохирдлыг илрүүлсэнгүй." "Алдааны тайланг авч байна..." "Алдааны тайланг хуваалцах уу?" diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index f4ef749382c8..3ecc71f966b3 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -280,7 +280,7 @@ "<b>%1$s</b> ला तुमचे संपर्क अॅक्सेस करू द्यायचे?" "स्थान" "या डिव्हाइसच्या स्थानावर प्रवेश" - "<b>%1$s</b> ला या डिव्हाइसचे स्थान अॅक्सेस करू द्यायचे?" + "<b>%1$s</b> ला या डिव्हाइसचे स्थान अ‍ॅक्सेस करू द्यायचे?" "तुम्ही अ‍ॅप वापरत असताना अ‍ॅपला फक्त स्थानाचा अॅक्सेस असेल" "<b>%1$s</b> ला <b>प्रत्येक वेळी</b> या डिव्हाइसच्या स्थानाचा अ‍ॅक्सेस द्यायचा?" "अ‍ॅप सध्या फक्त तुम्ही अ‍ॅप वापरत असतानाच स्थान अ‍ॅक्सेस करू शकते" @@ -549,15 +549,11 @@ "फिंगरप्रिंट आयकन" - - + "फेस अनलॉक हार्डवेअर व्यवस्थापित करा" "अॅपला वापरासाठी चेहरा टेम्पलेट जोडण्याच्या आणि हटवण्याच्या पद्धती जारी करू देते." - - - - - - + "फेस अनलॉक हार्डवेअर वापरा" + "अ‍ॅपला ऑथेंटिकेशनसाठी फेस अनलॉक हार्डवेअर वापरण्याची अनुमती देते" + "फेस अनलॉक" "तुमच्या चेहऱ्याची पुन्हा नोंदणी करा" "ओळखण्यामध्ये सुधारणा करण्यासाठी, कृपया तुमच्या चेहऱ्याची पुन्हा नोंदणी करा" "अचूक फेस डेटा कॅप्चर करता आला नाही. पुन्हा करा." @@ -583,20 +579,15 @@ "चेहरा पडताळू शकत नाही. हार्डवेअर उपलब्ध नाही." - - + "फेस अनलॉकचा पुन्हा प्रयत्न करा." "नवीन फेस डेटा स्टोअर करू शकत नाही. आधी जुना हटवा." "चेहरा ऑपरेशन रद्द केले गेले." - - + "वापरकर्त्याने फेस अनलॉक रद्द केले आहे." "खूप जास्त प्रयत्न केले. नंतर पुन्हा प्रयत्न करा." - - + "बरेच प्रयत्न. फेस अनलॉक बंद केले आहे." "चेहरा पडताळणी करू शकत नाही. पुन्हा प्रयत्न करा." - - - - + "तुम्ही फेस अनलॉक सेट केले नाही." + "या डिव्हाइसवर फेस अनलॉकला सपोर्ट नाही." "चेहरा %d" @@ -1367,8 +1358,7 @@ "टेस्ट हार्नेस मोड बंद करण्यासाठी फॅक्टरी रीसेट करा." "USB पोर्ट मध्ये ओलावा किंवा धूळ आहे" "USB पोर्ट आपोआप बंद होईल. अधिक जाणून घेण्यासाठी टॅप करा." - - + "USB पोर्ट वापरण्यासाठी ठीक आहे" "फोनला धूळ किंवा ओलावा आढळला नाही." "बग रीपोर्ट घेत आहे..." "बग अहवाल शेअर करायचा?" @@ -1860,7 +1850,7 @@ "आठवड्याची शेवटची रात्र" "आठवड्याच्या शेवटी" "इव्‍हेंट" - "निष्क्रिय आहे" + "झोपताना" "%1$s काही ध्‍वनी म्‍यूट करत आहे" "आपल्‍या डिव्‍हाइसमध्‍ये अंतर्गत समस्‍या आहे आणि तुमचा फॅक्‍टरी डेटा रीसेट होईपर्यंत ती अस्‍थिर असू शकते." "आपल्‍या डिव्‍हाइसमध्‍ये अंतर्गत समस्‍या आहे. तपशीलांसाठी आपल्‍या निर्मात्याशी संपर्क साधा." diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 2961f379899a..0124af413349 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -549,15 +549,11 @@ "Ikon cap jari" - - + "urus perkakasan wajah buka kunci" "Membenarkan apl menggunakan kaedah untuk menambahkan dan memadamkan templat wajah untuk digunakan." - - - - - - + "gunakan perkakasan wajah buka kunci" + "Membenarkan apl menggunakan perkakasan wajah buka kunci untuk pengesahan" + "Wajah buka kunci" "Daftarkan semula wajah anda" "Untuk meningkatkan pengecaman, sila daftarkan semula wajah anda" "Gagal menangkap data wajah dgn tepat. Cuba lagi." @@ -583,20 +579,15 @@ "Tdk dpt sahkan wajah. Perkakasan tidak tersedia." - - + "Cuba wajah buka kunci sekali lagi." "Tdk dpt menyimpan data wajah baharu. Padamkan yg lama dahulu." "Pengendalian wajah dibatalkan." - - + "Wajah buka kunci dibatalkan oleh pengguna." "Terlalu banyak percubaan. Cuba sebentar lagi." - - + "Terlalu banyak percubaan. Wajah buka kunci dilumpuhkan." "Tidak dapat mengesahkan wajah. Cuba lagi." - - - - + "Anda belum menyediakan wajah buka kunci." + "Wajah buka kunci tidak disokong pada peranti ini." "Wajah %d" @@ -1366,8 +1357,7 @@ "Laksanakan tetapan semula kilang untuk melumpuhkan Mod Abah-abah Ujian." "Cecair atau serpihan dalam port USB" "Port USB dilumpuhkan secara automatik. Ketik untuk mengetahui lebih lanjut." - - + "OK untuk menggunakan port USB" "Telefon tidak lagi mengesan cecair atau serpihan." "Mengambil laporan pepijat…" "Kongsi laporan pepijat?" diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index f59301af883a..9090c1ddad5e 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -1494,7 +1494,7 @@ "နောက်တစ်ခု ရှာဖွေရန်" "အရင်တစ်ခု ရှာဖွေရန်" "%sမှ တည်နေရာအား တောင်းခံသည်" - "တည်နေရာအား တောင်းခံသည်" + "တည်နေရာ တောင်းခံခြင်း" "%1$s (%2$s)မှတောင်းခံသည်" "Yes" "No" @@ -1888,7 +1888,7 @@ "ဒေသရွေးချယ်မှု" "ဘာသာစကားအမည် ထည့်ပါ" "အကြံပြုထားသည်" - "ဘာသာစကားများအားလုံး" + "ဘာသာစကားအားလုံး" "ဒေသအားလုံး" "ရှာဖွေရန်" "အက်ပ်ကို မရရှိနိုင်ပါ" diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 11cc95fda2a4..c19b1b025957 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -549,15 +549,11 @@ "Ikon for fingeravtrykk" - - + "administrere maskinvare for Ansiktslås" "Lar appen bruke metoder for å legge til og slette ansiktmaler for bruk." - - - - - - + "bruke maskinvare for Ansiktslås" + "Lar appen bruke maskinvare for Ansiktslås til autentisering" + "Ansiktslås" "Registrer ansiktet ditt på nytt" "For å forbedre gjenkjennelse, registrer ansiktet ditt på nytt" "Kunne ikke ta opp nøyaktige ansiktsdata Prøv igjen" @@ -583,20 +579,15 @@ "Kan ikke bekrefte ansikt. Utilgjengelig maskinvare." - - + "Prøv Ansiktslås igjen." "Kan ikke lagre nye ansiktsdata. Slett gamle data først." "Ansikt-operasjonen ble avbrutt." - - + "Ansiktslås ble avbrutt av brukeren." "For mange forsøk. Prøv igjen senere." - - + "For mange forsøk. Ansiktslås er slått av." "Kan ikke bekrefte ansiktet. Prøv igjen." - - - - + "Du har ikke konfigurert Ansiktslås." + "Ansiktslås støttes ikke på denne enheten" "Ansikt %d" @@ -1366,8 +1357,7 @@ "Tilbakestill enheten til fabrikkstandard for å slå av Testrammeverk-modus." "Væske eller rusk i USB-porten" "USB-porten deaktiveres automatisk. Trykk for å finne ut mer." - - + "Trygt å bruke USB-porten" "Telefonen oppdager ikke væsker eller rusk lenger." "Kjører feilrapport …" "Vil du dele feilrapporten?" @@ -1907,7 +1897,7 @@ "Jobbappene dine samt varsler, data og andre funksjoner i jobbprofilen din blir slått på" "Slå på" "Denne appen er utviklet for en eldre versjon av Android og fungerer kanskje ikke som den skal. Prøv å se etter oppdateringer, eller kontakt utvikleren." - "Se etter oppdatering" + "Se etter oppdateringer" "Du har nye meldinger" "Åpne SMS-appen for å se" "Enkelte funksjoner kan begrenses" diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index db9ca870b02e..0210b6c27dce 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -549,15 +549,11 @@ "फिंगरप्रिन्ट आइकन" - - + "फेस अनलकको हार्डवेयर व्यवस्थित गर्नुहोस्" "अनुप्रयोगलाई प्रयोगका लागि अनुहार टेम्प्लेट थप्न र मेटाउने तरिका आह्वान गर्न अनुमति दिन्छ।" - - - - - - + "फेस अनलकको हार्डवेयर प्रयोग गर्नुहोस्" + "अनुप्रयोगलाई प्रमाणीकरणका लागि फेस अनलकको हार्डवेयर प्रयोग गर्न अनुमति दिन्छ" + "फेस अनलक" "आफ्नो अनुहार पुनः दर्ता गर्नुहोस्" "अनुहार पहिचानको गुणस्तर सुधार गर्न कृपया आफ्नो अनुहार पुनः दर्ता गर्नुहोस्" "अनुहारको सटीक डेटा खिच्न सकिएन। फेरि प्रयास गर्नुहोस्।" @@ -583,20 +579,15 @@ "अनुहार पुष्टि गर्न सकिएन। हार्डवेयर उपलब्ध छैन।" - - + "फेरि फेस अनलक प्रयोग गरी हेर्नुहोस्।" "अनुहारसम्बन्धी नयाँ डेटा भण्डारण गर्न सकिएन। पहिले कुनै पुरानो डेटा मेटाउनुहोस्।" "अनुहार पहिचान रद्द गरियो।" - - + "प्रयोगकर्ताले फेस अनलकको कार्य रद्द गर्नुभयो।" "धेरैपटक प्रयासहरू भए। पछि फेरि प्रयास गर्नुहोस्‌।" - - + "अत्यधिक प्रयासहरू भए। फेस अनलक असक्षम पारियो।" "अनुहार पुष्टि गर्न सकिएन। फेरि प्रयास गर्नुहोस्।" - - - - + "तपाईंले फेस अनलक सुविधा सेट अप गर्नुभएको छैन।" + "यस यन्त्रमा फेस अनलक सुविधा प्रयोग गर्न मिल्दैन।" "अनुहार %d" @@ -1372,8 +1363,7 @@ "परीक्षण प्याकेज मोड असक्षम पार्न फ्याक्ट्री रिसेट गर्नुहोस्।" "USB पोर्टमा तरल पदार्थ वा धुलो भएको कुरा पत्ता लाग्यो" "USB पोर्ट स्वतः असक्षम पारियो। थप जान्न ट्याप गर्नुहोस्।" - - + "USB पोर्ट प्रयोग गर्दा हुन्छ" "फोनले अब उप्रान्त तरल पदार्थ वा धुलो नभएको पत्ता लगायो" "बग रिपोर्ट लिँदै..." "बग रिपोर्टलाई साझेदारी गर्ने हो?" @@ -1509,7 +1499,7 @@ "अर्को भेटाउनुहोस्" "अघिल्लो फेला पार्नुहोस्" "%s बाट स्थान अनुरोध" - "स्थान अनुरोध" + "स्थानसम्बन्धी अनुरोध" "%1$s (%2$s) द्वारा अनुरोध गरिएको" "हो" "होइन" diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index b583c73c3974..e77adf435c46 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -549,15 +549,11 @@ "Vingerafdruk-pictogram" - - + "hardware voor ontgrendelen via gezichtsherkenning beheren" "Hiermee kan de app methoden aanroepen om gezichtstemplates toe te voegen en te verwijderen voor gebruik." - - - - - - + "hardware voor ontgrendelen via gezichtsherkenning gebruiken" + "Hiermee kan de app hardware voor ontgrendelen via gezichtsherkenning gebruiken voor verificatie" + "Ontgrendelen via gezichtsherkenning" "Je gezicht opnieuw registreren" "Registreer je gezicht opnieuw om de herkenning te verbeteren" "Geen accurate gegevens. Probeer het nog eens." @@ -583,20 +579,15 @@ "Kan gezicht niet verifiëren. Hardware niet beschikbaar." - - + "Probeer ontgrendelen via gezichtsherkenning opnieuw." "Kan nieuwe gezichten niet opslaan. Verwijder eerst een oude." "Bewerking voor gezichtsherkenning geannuleerd." - - + "Ontgrendelen via gezichtsherkenning geannuleerd door gebruiker." "Te veel pogingen. Probeer het later opnieuw." - - + "Te veel pogingen. Ontgrendelen via gezichtsherkenning uitgeschakeld." "Kan gezicht niet verifiëren. Probeer het nog eens." - - - - + "Je hebt ontgrendelen via gezichtsherkenning niet ingesteld." + "Ontgrendelen via gezichtsherkenning wordt niet ondersteund op dit apparaat." "Gezicht %d" @@ -1366,8 +1357,7 @@ "Reset de fabrieksinstellingen om de test harness-modus uit te schakelen." "Vloeistof of vuil in USB-poort" "USB-poort is automatisch uitgeschakeld. Tik voor meer informatie." - - + "USB-poort kan worden gebruikt" "De telefoon detecteert geen vloeistof of vuil meer." "Bugrapport genereren…" "Bugrapport delen?" diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 112f974f0156..231950269c9c 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -549,15 +549,11 @@ "ଆଙ୍ଗୁଠି ଚିହ୍ନ ଆଇକନ୍" - - + "ଫେସ୍ ଅନ୍‌ଲକ୍ ହାର୍ଡୱେର୍ ପରିଚାଳନା କରନ୍ତୁ" "ବ୍ୟବହାର ପାଇଁ ଆପ୍‍କୁ ଫେସିଆଲ୍‍ ଟେମ୍ପଲେଟ୍‍ ଯୋଡିବା ଓ ଡିଲିଟ୍‍ ର ପଦ୍ଧତି ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।" - - - - - - + "ଫେସ୍ ଅନ୍‌ଲକ୍ ହାର୍ଡୱେର୍ ବ୍ୟବହାର କରନ୍ତୁ" + "ପ୍ରାମାଣିକତା ପାଇଁ ଫେସ୍ ଅନ୍‌ଲକ୍ ହାର୍ଡୱେର୍‌ର ବ୍ୟବହାର ପାଇଁ ଆପ୍‍କୁ ଅନୁମତି ଦିଅନ୍ତୁ।" + "ଫେସ୍ ଅନ୍‌ଲକ୍" "ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍‍ରୋଲ୍ କରନ୍ତୁ" "ଚିହ୍ନଟକରଣକୁ ଉନ୍ନତ କରିବା ପାଇଁ, ଦୟାକରି ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍‍ରୋଲ୍ କରନ୍ତୁ।" "ମୁହଁର ଡାଟା କ୍ୟାପଚର୍ ହେଲାନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।" @@ -583,20 +579,15 @@ "ମୁହଁ ଚିହ୍ନଟ କରିପାରିଲା ନାହିଁ। ହାର୍ଡୱେୟାର୍ ଉପଲବ୍ଧ ନାହିଁ।" - - + "ଫେସ୍ ଅନ୍‌ଲକ୍ ପୁଣି ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ" "ନୂଆ ମୁହଁ ଡାଟା ଷ୍ଟୋର୍ ହେବ ନାହିଁ। ପ୍ରଥମେ ପୁରୁଣାକୁ ଡିଲିଟ୍ କରନ୍ତୁ।" "ଫେସ୍‍ର ଅପରେଶନ୍‍ କ୍ୟାନ୍ସଲ୍‍ ହୋ‍ଇଗଲା" - - + "ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ଦ୍ୱାରା ଫେସ୍ ଅନଲକ୍ ବାତିଲ୍ କରାଯାଇଛି।" "ବାରମ୍ବାର ଚେଷ୍ଟା। ପରେ ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।" - - + "ଅତ୍ୟଧିକ ପ୍ରଚେଷ୍ଟା. ଫେସ୍ ଅନ୍‌ଲକ୍ ଅକ୍ଷମ କରନ୍ତୁ" "ମୁହଁ ଚିହ୍ନଟ କରିପାରିଲା ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।" - - - - + "ଆପଣ ଫେସ୍ ଅନ୍‌ଲକ୍ ସେଟ୍ ଅପ୍ କରିନାହାଁନ୍ତି" + "ଏହି ଡିଭାଇସ୍‌ରେ ଫେସ୍ ଅନ୍‌ଲକ୍ ସମର୍ଥିତ ନୁହେଁ।" "%dଙ୍କ ଫେସ୍‍" @@ -1366,8 +1357,7 @@ "ଟେଷ୍ଟ ହାର୍‌ନେସ୍ ମୋଡ୍ ଅକ୍ଷମ କରିବାକୁ ଏକ ଫ୍ୟାକ୍ଟରୀ ରିସେଟ୍ କରନ୍ତୁ।" "USB ପୋର୍ଟରେ ତରଳ ପଦାର୍ଥ ବା ଧୂଳି" "USB ପୋର୍ଟ ସ୍ୱଚାଳିତ ଭାବେ ଅକ୍ଷମ ହୋଇଛି। ଅଧିକ ଜାଣିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।" - - + "USB ପୋର୍ଟ ବ୍ୟବହାର କରିବା ପାଇଁ ଠିକ୍ ଅଟେ" "ଫୋନ୍ ଆଉ ତରଳ ପଦାର୍ଥ କିମ୍ବା ଧୂଳିର ଚିହ୍ନଟ କରୁନାହିଁ।" "ବଗ୍ ରିପୋର୍ଟ ନିଆଯାଉଛି…" "ବଗ୍‍ ରିପୋର୍ଟ ସେୟାର୍‌ କରିବେ?" diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index fcdc90045b22..7b31b8390e0b 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -549,15 +549,11 @@ "ਫਿੰਗਰਪ੍ਰਿੰਟ ਪ੍ਰਤੀਕ" - - + "ਚਿਹਰਾ ਅਣਲਾਕ ਹਾਰਡਵੇਅਰ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ" "ਐਪ ਨੂੰ ਵਰਤਣ ਲਈ ਚਿਹਰਾ ਟੈਮਪਲੇਟ ਸ਼ਾਮਲ ਕਰਨ ਜਾਂ ਮਿਟਾਉਣ ਦੀਆਂ ਵਿਧੀਆਂ ਦੀ ਬੇਨਤੀ ਕਰਨ ਦਿੰਦੀ ਹੈ।" - - - - - - + "ਚਿਹਰਾ ਅਣਲਾਕ ਹਾਰਡਵੇਅਰ ਵਰਤੋ" + "ਐਪ ਨੂੰ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚਿਹਰਾ ਅਣਲਾਕ ਹਾਰਡਵੇਅਰ ਵਰਤਣ ਦਿੰਦੀ ਹੈ" + "ਚਿਹਰਾ ਅਣਲਾਕ" "ਆਪਣਾ ਚਿਹਰਾ ਮੁੜ-ਦਰਜ ਕਰੋ" "ਪਛਾਣ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਚਿਹਰੇ ਨੂੰ ਮੁੜ-ਦਰਜ ਕਰੋ" "ਸਟੀਕ ਚਿਹਰਾ ਡਾਟਾ ਕੈਪਚਰ ਨਹੀਂ ਹੋਇਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" @@ -583,20 +579,15 @@ "ਚਿਹਰੇ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਹੋ ਸਕੀ। ਹਾਰਡਵੇਅਰ ਉਪਲਬਧ ਨਹੀਂ।" - - + "ਚਿਹਰਾ ਅਣਲਾਕ ਦੁਬਾਰਾ ਵਰਤ ਕੇ ਦੇਖੋ।" "ਨਵਾਂ ਚਿਹਰਾ ਡਾਟਾ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਪਹਿਲਾਂ ਪੁਰਾਣਾ ਹਟਾਓ।" "ਚਿਹਰਾ ਪਛਾਣਨ ਦੀ ਪ੍ਰਕਿਰਿਆ ਰੱਦ ਕੀਤੀ ਗਈ।" - - + "ਵਰਤੋਂਕਾਰ ਨੇ ਚਿਹਰਾ ਅਣਲਾਕ ਰੱਦ ਕੀਤਾ।" "ਹੱਦੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" - - + "ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ। ਚਿਹਰਾ ਅਣਲਾਕ ਬੰਦ ਕੀਤਾ ਗਿਆ।" "ਚਿਹਰੇ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" - - - - + "ਤੁਸੀਂ ਚਿਹਰਾ ਅਣਲਾਕ ਸੈੱਟਅੱਪ ਨਹੀਂ ਕੀਤਾ ਹੈ।" + "ਇਸ ਡੀਵਾਈਸ ਵਿੱਚ ਚਿਹਰਾ ਅਣਲਾਕ ਦੀ ਸੁਵਿਧਾ ਨਹੀਂ ਹੈ।" "ਚਿਹਰਾ %d" @@ -1367,8 +1358,7 @@ "ਟੈਸਟ ਹਾਰਨੈੱਸ ਮੋਡ ਬੰਦ ਕਰਨ ਲਈ ਫੈਕਟਰੀ ਰੀਸੈੱਟ ਕਰੋ।" "USB ਪੋਰਟ ਵਿੱਚ ਪਾਣੀ ਜਾਂ ਧੂੜ-ਮਿੱਟੀ" "USB ਪੋਰਟ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਬੰਦ ਕੀਤਾ ਗਿਆ। ਹੋਰ ਜਾਣਨ ਲਈ ਟੈਪ ਕਰੋ।" - - + "USB ਪੋਰਟ ਵਰਤਣ ਲਈ ਠੀਕ ਹੈ" "ਫ਼ੋਨ ਹੁਣ ਪਾਣੀ ਜਾਂ ਧੂੜ-ਮਿੱਟੀ ਦਾ ਪਤਾ ਨਹੀਂ ਲਗਾਉਂਦਾ ਹੈ।" "ਬੱਗ ਰਿਪਰੋਟ ਪ੍ਰਾਪਤ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..." "ਕੀ ਬੱਗ ਰਿਪੋਰਟ ਸਾਂਝੀ ਕਰਨੀ ਹੈ?" diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 120d2568811b..2dedf9dcffea 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -555,15 +555,11 @@ "Ikona odcisku palca" - - + "zarządzanie sprzętem do rozpoznawania twarzy" "Zezwala na aktywowanie przez aplikację metody dodawania i usuwania szablonów twarzy." - - - - - - + "używanie sprzętu do rozpoznawania twarzy" + "Zezwala na używanie przez aplikację sprzętu do rozpoznawania twarzy w uwierzytelniania" + "Rozpoznanie twarzy" "Zarejestruj swoją twarz ponownie" "Aby poprawić rozpoznawanie, ponownie zarejestruj swoją twarz" "Nie udało się zarejestrować danych twarzy. Spróbuj ponownie." @@ -589,20 +585,15 @@ "Nie można zweryfikować twarzy. Sprzęt niedostępny." - - + "Spróbuj rozpoznania twarzy ponownie." "Nie można przechowywać nowych danych twarzy. Usuń stare." "Analiza twarzy została anulowana." - - + "Użytkownik anulował rozpoznanie twarzy." "Zbyt wiele prób. Spróbuj ponownie później." - - + "Zbyt wiele prób. Rozpoznanie twarzy zostało wyłączone." "Nie można zweryfikować twarzy. Spróbuj ponownie." - - - - + "Rozpoznanie twarzy nie jest skonfigurowane." + "To urządzenie nie obsługuje rozpoznania twarzy." "Twarz %d" @@ -1410,8 +1401,7 @@ "Przywróć ustawienia fabryczne, by wyłączyć tryb jarzma testowego." "Wilgoć lub brud w porcie USB" "Port USB został automatycznie wyłączony. Kliknij, by dowiedzieć się więcej." - - + "Możesz używać portu USB" "Telefon nie wykrywa już wilgoci ani zanieczyszczeń." "Zgłaszam błąd…" "Udostępnić raport o błędzie?" diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 4dedb69fcfc1..d873d2051dbe 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -549,15 +549,11 @@ "Ícone de impressão digital" - - + "gerenciar hardware de desbloqueio facial" "Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso." - - - - - - + "usar hardware de desbloqueio facial" + "Permite que o app use o hardware de desbloqueio facial para autenticação" + "Desbloqueio facial" "Registre seu rosto novamente" "Para melhorar o reconhecimento, registre seu rosto novamente" "Dados precisos não capturados. Tente novamente." @@ -583,20 +579,15 @@ "Impossível verificar rosto. Hardware indisponível." - - + "Tente usar o desbloqueio facial novamente." "Não é possível salvar dados faciais. Exclua dados antigos." "Operação facial cancelada." - - + "Desbloqueio facial cancelado pelo usuário." "Excesso de tentativas. Tente novamente mais tarde." - - + "Muitas tentativas. Desbloqueio facial desativado." "Não é possível verificar o rosto. Tente novamente." - - - - + "O desbloqueio facial não foi configurado." + "O desbloqueio facial não é compatível com este dispositivo." "Rosto %d" @@ -1366,8 +1357,7 @@ "Realize uma redefinição para configuração original para desativar o modo Arcabouço de testes." "Líquido ou detrito na porta USB" "A porta USB é desativada automaticamente. Toque para saber mais." - - + "É seguro usar a porta USB" "Não há mais líquidos ou detritos detectados no smartphone." "Gerando relatório do bug..." "Compartilhar relatório do bug?" @@ -1503,7 +1493,7 @@ "Localizar próximo" "Localizar anterior" "Solicitação de local de %s" - "Solicitação de local" + "Pedido de localização" "Solicitado por %1$s (%2$s)" "Sim" "Não" @@ -1598,7 +1588,7 @@ "Tablet" "TV" "Telefone" - "Alto-falantes da dock" + "Alto-falantes na base" "HDMI" "Fones de ouvido" "USB" diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 7283db2d208f..c2c5d8397acb 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -549,15 +549,11 @@ "Ícone de impressão digital" - - + "gerir hardware de Desbloqueio Através do Rosto" "Permite à aplicação invocar métodos para adicionar e eliminar modelos faciais para uso." - - - - - - + "utilizar hardware de Desbloqueio Através do Rosto" + "Permite que a aplicação utilize hardware de Desbloqueio Através do Rosto para autenticação" + "Desbloqueio Através do Rosto" "Volte a inscrever o seu rosto" "Para melhorar o reconhecimento, volte a inscrever o seu rosto." "Imp. capt. dados rosto precisos. Tente novamente." @@ -583,20 +579,15 @@ "Não pode validar o rosto. Hardware não disponível." - - + "Experimente de novo o Desbloqueio Através do Rosto" "Não pode guardar novos dados de rostos. Elimine um antigo." "Operação de rosto cancelada." - - + "Desbloqueio Através do Rosto cancelado pelo utilizador" "Demasiadas tentativas. Tente novamente mais tarde." - - + "Demasiadas tentativas. O Desbloqueio Através do Rosto está desativado." "Não é possível validar o rosto. Tente novamente." - - - - + "Não configurou o Desbloqueio Através do Rosto." + "Desbloqueio Através do Rosto não suportado neste dispositivo." "Rosto %d" @@ -1366,8 +1357,7 @@ "Efetue uma reposição de dados de fábrica para desativar o Modo de estrutura de teste." "Líquido ou resíduos na porta USB" "A porta USB é automaticamente desativada. Toque para saber mais." - - + "É seguro utilizar a porta USB" "O telemóvel já não deteta líquidos nem resíduos." "A criar relatório de erro…" "Pretende partilhar o relatório de erro?" diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 4dedb69fcfc1..d873d2051dbe 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -549,15 +549,11 @@ "Ícone de impressão digital" - - + "gerenciar hardware de desbloqueio facial" "Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso." - - - - - - + "usar hardware de desbloqueio facial" + "Permite que o app use o hardware de desbloqueio facial para autenticação" + "Desbloqueio facial" "Registre seu rosto novamente" "Para melhorar o reconhecimento, registre seu rosto novamente" "Dados precisos não capturados. Tente novamente." @@ -583,20 +579,15 @@ "Impossível verificar rosto. Hardware indisponível." - - + "Tente usar o desbloqueio facial novamente." "Não é possível salvar dados faciais. Exclua dados antigos." "Operação facial cancelada." - - + "Desbloqueio facial cancelado pelo usuário." "Excesso de tentativas. Tente novamente mais tarde." - - + "Muitas tentativas. Desbloqueio facial desativado." "Não é possível verificar o rosto. Tente novamente." - - - - + "O desbloqueio facial não foi configurado." + "O desbloqueio facial não é compatível com este dispositivo." "Rosto %d" @@ -1366,8 +1357,7 @@ "Realize uma redefinição para configuração original para desativar o modo Arcabouço de testes." "Líquido ou detrito na porta USB" "A porta USB é desativada automaticamente. Toque para saber mais." - - + "É seguro usar a porta USB" "Não há mais líquidos ou detritos detectados no smartphone." "Gerando relatório do bug..." "Compartilhar relatório do bug?" @@ -1503,7 +1493,7 @@ "Localizar próximo" "Localizar anterior" "Solicitação de local de %s" - "Solicitação de local" + "Pedido de localização" "Solicitado por %1$s (%2$s)" "Sim" "Não" @@ -1598,7 +1588,7 @@ "Tablet" "TV" "Telefone" - "Alto-falantes da dock" + "Alto-falantes na base" "HDMI" "Fones de ouvido" "USB" diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 3c2e03effae0..0d5cff4467c3 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -552,15 +552,11 @@ "Pictograma amprentă" - - + "să gestioneze hardware de deblocare facială" "Permite aplicației să invoce metode pentru a adăuga și a șterge șabloane faciale pentru utilizare." - - - - - - + "să folosească hardware de deblocare facială" + "Permite aplicației să folosească hardware de deblocare facială pentru autentificare" + "Deblocare facială" "Reînregistrați-vă chipul" "Pentru a îmbunătăți recunoașterea, reînregistrați-vă chipul" "Nu s-a putut fotografia fața cu precizie. Încercați din nou." @@ -586,20 +582,15 @@ "Nu se poate confirma fața. Hardware-ul nu este disponibil." - - + "Încercați din nou deblocarea facială." "Nu se pot stoca date faciale noi. Ștergeți întâi unele vechi." "Operațiunea privind chipul a fost anulată." - - + "Deblocarea facială este anulată de utilizator." "Prea multe încercări. Reîncercați mai târziu." - - + "Prea multe încercări. Deblocarea facială este dezactivată." "Nu se poate confirma fața. Încercați din nou." - - - - + "Nu ați configurat deblocarea facială." + "Deblocarea facială nu este acceptată pe dispozitiv." "Chip %d" @@ -1388,8 +1379,7 @@ "Reveniți la setările din fabrică pentru a dezactiva modul Set de testare." "Lichide sau reziduuri în portul USB" "Portul USB este dezactivat automat. Atingeți ca să aflați mai multe." - - + "Portul USB poate fi folosit" "Telefonul nu mai detectează lichide sau reziduuri." "Se creează un raport de eroare…" "Trimiteți raportul de eroare?" diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 936f463f7c42..2c17d59c1d4f 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -555,15 +555,11 @@ "Значок отпечатка пальца" - - + "Управление аппаратным обеспечением для функции \"Фейсконтроль\"" "Приложение сможет добавлять и удалять шаблоны лиц." - - - - - - + "Использование аппаратного обеспечения для функции \"Фейсконтроль\"" + "Приложение сможет использовать для аутентификации аппаратное обеспечение Фейсконтроля." + "Фейсконтроль" "Зарегистрируйте лицо ещё раз" "Чтобы улучшить распознавание лица, зарегистрируйте его ещё раз" "Не удалось собрать данные. Повторите попытку." @@ -589,20 +585,15 @@ "Не удалось распознать лицо. Сканер недоступен." - - + "Попробуйте воспользоваться функцией ещё раз." "Недостаточно места. Удалите старые данные для распознавания." "Распознавание отменено" - - + "Фейсконтроль: операция отменена пользователем." "Слишком много попыток. Повторите позже." - - + "Слишком много попыток. Функция \"Фейсконтроль\" отключена." "Не удалось распознать лицо. Повторите попытку." - - - - + "Вы не настроили функцию \"Фейсконтроль\"." + "Это устройство не поддерживает функцию \"Фейсконтроль\"." "Лицо %d" @@ -1410,8 +1401,7 @@ "Чтобы отключить тестовый режим, сбросьте настройки до заводских." "В USB-порт попала вода или грязь" "USB-порт был автоматически отключен. Нажмите, чтобы узнать подробности." - - + "USB-порт можно использовать" "Вода или грязь внутри не обнаружена." "Подготовка отчета об ошибке" "Разрешить доступ к информации об ошибке?" diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 3a8136de91af..cb12d4196a26 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -555,15 +555,11 @@ "Ikona odtlačku prsta" - - + "spravovať hardvér odomknutia tvárou" "Umožňuje aplikácii vyvolať metódy, ktoré pridávajú a odstraňujú šablóny tvárí." - - - - - - + "používať hardvér Odomknutia tvárou" + "Umožňuje aplikácii používať na overenie totožnosti hardvér Odomknutia tvárou" + "Odomknutie tvárou" "Znova zaregistrujte svoju tvár" "Znova zaregistrujte svoju tvár, aby sa zlepšilo rozpoznávanie" "Nepodarilo sa nasnímať presné údaje o tvári. Skúste to znova." @@ -589,20 +585,15 @@ "Tvár sa nedá overiť. Hardvér nie je k dispozícii." - - + "Skúste znova použiť odomknutie tvárou." "Nové údaje o tvári sa nedajú uložiť. Najprv odstráňte jeden zo starých záznamov." "Operácia týkajúca sa tváre bola zrušená" - - + "Odomknutie tvárou zrušil používateľ." "Príliš veľa pokusov. Skúste to znova neskôr." - - + "Príliš veľa pokusov. Odomknutie tvárou bolo zakázané." "Nedá sa overiť tvár. Skúste to znova." - - - - + "Nenastavili ste odomknutie tvárou." + "Toto zariadenie nepodporuje odomknutie tvárou." "Tvár %d" @@ -1410,8 +1401,7 @@ "Ak chcete zakázať režim správcu testov, obnovte výrobné nastavenia." "Tekutina alebo nečistoty v porte USB" "Port USB je automaticky deaktivovaný. Ďalšie informácie zobrazíte klepnutím." - - + "Port USB môžete použiť" "Telefón už nerozpoznáva tekutinu ani nečistoty." "Preberá sa hlásenie chyby…" "Chcete zdieľať hlásenie chyby?" @@ -1549,7 +1539,7 @@ "Nájsť ďalšiu" "Nájsť predchádzajúcu" "Žiadosť o informácie o polohe od používateľa %s" - "Žiadosť o informácie o polohe" + "Žiadosť o informácie o polohe" "Žiadosť od používateľa %1$s (%2$s)" "Áno" "Nie" diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 84e63ccf3d87..088eb48b6103 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -555,15 +555,11 @@ "Ikona prstnih odtisov" - - + "upravljanje strojne opreme za odklepanje z obrazom" "Aplikaciji omogoča sprožanje načinov za dodajanje in brisanje predlog z obrazi za uporabo." - - - - - - + "uporaba strojne opreme za odklepanje z obrazom" + "Aplikaciji omogoča uporabo strojne opreme za odklepanje z obrazom za preverj. pristnosti" + "Odklepanje z obrazom" "Znova prijavite obraz" "Za izboljšanje prepoznavanja znova prijavite svoj obraz" "Točnih podatkov o obrazu ni bilo mogoče zajeti. Poskusite znova." @@ -589,20 +585,15 @@ "Obraza ni mogoče preveriti. Str. opr. ni na voljo." - - + "Znova izvedite odklepanje z obrazom." "Novega obraza ni mogoče shraniti. Najprej izbrišite starega." "Dejanje z obrazom je bilo preklicano." - - + "Odklepanje z obrazom je preklical uporabnik." "Preveč poskusov. Poskusite znova pozneje." - - + "Preveč poskusov. Odklepanje z obrazom je onemogočeno." "Obraza ni mogoče preveriti. Poskusite znova." - - - - + "Odklepanja z obrazom niste nastavili." + "Ta naprava ne podpira odklepanja z obrazom." "Obraz %d" @@ -1410,8 +1401,7 @@ "Če želite onemogočiti način preizkusnega ogrodja, ponastavite napravo na tovarniške nastavitve." "V vratih USB je tekočina ali umazanija" "Vrata USB so samodejno onemogočena. Dotaknite se, če želite izvedeti več." - - + "Vrata USB so varna za uporabo" "Telefon ne zaznava več tekočine ali umazanije." "Zajemanje poročila o napakah …" "Želite poslati poročilo o napakah?" diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 202d0900a3a4..4c2543c7e16d 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -549,15 +549,11 @@ "Ikona e gjurmës së gishtit" - - + "menaxho harduerin për shkyçjen me fytyrën" "Lejon aplikacionin të aktivizojë mënyra për shtim e fshirje të shablloneve të përdorura." - - - - - - + "përdor harduerin e shkyçjes me fytyrën" + "Lejon aplikacionin të përdorë harduerin e shkyçjes me fytyrën për procesin e vërtetimit" + "Shkyçja me fytyrë" "Regjistro përsëri fytyrën tënde" "Për të përmirësuar njohjen, regjistro përsëri fytyrën tënde" "S\'mund të regjistroheshin të dhëna të sakta të fytyrës. Provo përsëri." @@ -583,20 +579,15 @@ "Fytyra s\'mund të verifikohet. Hardueri nuk ofrohet." - - + "Provo përsëri shkyçjen me fytyrën." "S\'mund të ruhen të dhëna të reja fytyre. Fshi një të vjetër në fillim." "Veprimi me fytyrën u anulua." - - + "Shkyçja me fytyrë u anulua nga përdoruesi." "Shumë përpjekje. Provo sërish më vonë." - - + "Shumë përpjekje. Shkyçja me fytyrë u çaktivizua." "Fytyra nuk mund të verifikohet. Provo përsëri." - - - - + "Nuk e ke konfiguruar shkyçjen me fytyrë." + "Shkyçja me fytyrë nuk mbështetet në këtë pajisje" "Fytyra %d" @@ -1367,8 +1358,7 @@ "Kryej një rivendosje në cilësimet e fabrikës për të çaktivizuar \"Modalitetin e lidhjes së testimit\"." "Lëngje ose papastërti në portën e USB-së" "Porta e USB-së është çaktivizuar automatikisht. Trokit për të mësuar më shumë." - - + "Në rregulloj për përdorimin e portës USB" "Telefoni nuk i dallon më lëngjet apo papastërtitë." "Po merret raporti i defekteve në kod…" "Të ndahet raporti i defektit në kod?" diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 812af0257fd8..e95d15449480 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -552,15 +552,11 @@ "Икона отиска прста" - - + "управљање хардв. за откључавање лицем" "Дозвољава да апликација активира методе за додавање и брисање шаблона лица ради коришћења." - - - - - - + "коришћење хардвера за откључавање лицем" + "Дозвољава да апликација користи хардвер за откључавање лицем ради потврде идентитета" + "Откључавање лицем" "Поново региструјте лице" "Да бисте побољшали препознавање, поново региструјте лице" "Снимање лица није успело. Пробајте поново." @@ -586,20 +582,15 @@ "Провера лица није успела. Хардвер није доступан." - - + "Пробајте поново откључавање лицем." "Нови подаци о лицу нису сачувани. Прво избришете претходне." "Обрада лица је отказана." - - + "Корисник је отказао откључавање лицем" "Превише покушаја. Пробајте поново касније." - - + "Превише покушаја. Откључавање лицем је онемогућено." "Провера лица није успела. Пробајте поново." - - - - + "Нисте подесили откључавање лицем" + "Откључавање лицем није подржано на овом уређају" "Лице %d" @@ -1388,8 +1379,7 @@ "Обавите ресетовање на фабричка подешавања да бисте онемогућили режим пробног коришћења." "Течност или нечистоћа у USB порту" "USB порт је аутоматски искључен. Додирните да бисте сазнали више." - - + "Коришћење USB порта је дозвољено" "Телефон више не открива течност или нечистоћу." "Извештај о грешци се генерише…" "Желите ли да поделите извештај о грешци?" diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index b3e95f9d11ae..6335fcd40def 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -549,15 +549,11 @@ "Ikon för fingeravtryck" - - + "hantera maskinvara för ansiktslås" "Tillåter att appen anropar metoder för att lägga till och radera ansiktsmallar." - - - - - - + "använd maskinvara för ansiktslås" + "Tillåter att appen använder maskinvara för ansiktslås vid autentisering" + "Ansiktslås" "Registrera ansiktet på nytt" "Gör om registreringen av ansiktet så att ansiktsigenkänningen ska fungera bättre" "Det gick inte att fånga ansiktsdata. Försök igen." @@ -583,20 +579,15 @@ "Ansiktsverifiering går ej. Otillgänglig maskinvara." - - + "Försök att använda ansiktslåset igen." "Kan inte lagra ny ansiktsdata. Radera först gammal data." "Ansiktsåtgärden har avbrutits." - - + "Ansiktslås avbröts av användaren." "Du har gjort för många försök. Försök igen senare." - - + "För många försök. Ansiktslås har inaktiverats." "Det gick inte att verifiera ansiktet. Försök igen." - - - - + "Du har inte konfigurerat ansiktslås." + "Ansiktslås stöds inte på den här enheten." "Ansikte %d" @@ -1366,8 +1357,7 @@ "Inaktivera testverktygsläget genom att göra en återställning till standardinställningarna." "Vätska eller smuts i USB-porten" "USB-porten har inaktiverats automatiskt. Tryck för att läsa mer." - - + "Nu kan du använda USB-porten" "Mobilen känner inte längre av någon vätska eller smuts." "Felrapporten överförs …" "Vill du dela felrapporten?" @@ -1503,7 +1493,7 @@ "Sök nästa" "Sök föregående" "Positionsförfrågan från %s" - "Positionsförfrågan" + "Platsförfrågan" "Begärt av %1$s (%2$s)" "Ja" "Nej" diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index b18543eb12c5..4d5821a4f847 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -549,15 +549,11 @@ "Aikoni ya kitambulisho" - - + "dhibiti maunzi ya kufungua kwa uso" "Huruhusu programu iombe njia za kuongeza na kufuta violezo vya uso vitakavyotumiwa." - - - - - - + "tumia maunzi ya kufungua kwa uso" + "Huruhusu programu itumie maunzi ya kufungua kwa uso kwa ajili ya uthibitishaji" + "Kufungua kwa uso" "Sajili uso wako tena" "Ili kuimarisha utambuzi, tafadhali sajili uso wako tena" "Imeshindwa kunasa data sahihi ya uso. Jaribu tena." @@ -583,20 +579,15 @@ "Imeshindwa kuthibitisha uso. Maunzi hayapatikani." - - + "Jaribu kufungua kwa uso tena." "Imeshindwa kuhifadhi data ya uso mpya. Futa wa kale kwanza." "Utendaji wa kitambulisho umeghairiwa." - - + "Kufungua kwa uso kumeghairiwa na mtumiaji." "Umejaribu mara nyingi mno. Jaribu tena baadaye." - - + "Umejaribu mara nyingi mno. Umezima kipengele cha kufungua kwa uso." "Imeshindwa kuthibitisha uso. Jaribu tena." - - - - + "Hujaweka mipangilio ya kufungua kwa uso." + "Kufungua kwa uso hakutumiki kwenye kifaa hiki." "Uso wa %d" @@ -1366,8 +1357,7 @@ "Rejesha mipangilio iliyotoka nayo kiwandani ili uzime hali ya Muunganisho wa Majaribio." "Unyevu au uchafu katika mlango wa USB" "Mlango wa USB umezimwa kiotomatiki. Gusa ili upate maelezo zaidi." - - + "Ni sawa kutumia mlango wa USB" "Simu haitambui tena unyevu au uchafu." "Inatayarisha ripoti ya hitilafu…" "Ungependa kushiriki ripoti ya hitilafu?" @@ -1503,7 +1493,7 @@ "Pata ifuatayo" "Pata iliyotangulia" "Ombi la mahali kutoka %s" - "Ombi la mahali" + "Ombi la kutambua mahali" "Imeombwa na %1$s (%2$s)" "Ndiyo" "Hapana" diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 3215fec520e3..b87a1122fc19 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -549,15 +549,11 @@ "கைரேகை ஐகான்" - - + "\'முகம் காட்டித் திறத்தலுக்கான\' வன்பொருளை நிர்வகித்தல்" "உபயோகிப்பதற்காக முக டெம்ப்ளேட்டுகளை சேர்க்கும்/நீக்கும் முறைகளை இயக்க, ஆப்ஸை அனுமதிக்கும்." - - - - - - + "’முகம் காட்டித் திறத்தல்’ அம்சத்திற்கான வன்பொருளைப் பயன்படுத்துதல்" + "அடையாளம் காண \'முகம் காட்டித் திறத்தலுக்கான\' வன்பொருளைப் பயன்படுத்த ஆப்ஸை அனுமதிக்கும்" + "முகம் காட்டித் திறத்தல்" "முகத்தை மீண்டும் பதிவுசெய்யவும்" "அடையாளத்தை மேம்படுத்த முகத்தை மீண்டும் பதிவுசெய்யவும்" "முகம் தெளிவாகப் பதிவாகவில்லை. மீண்டும் முயலவும்." @@ -583,20 +579,15 @@ "முகத்தைச் சரிபார்க்க இயலவில்லை. வன்பொருள் இல்லை." - - + "\'முகம் காட்டித் திறத்தலை\' மீண்டும் முயலவும்." "புதிய முகங்களைச் சேர்க்க இயலவில்லை. பழையது ஒன்றை நீக்கவும்." "முக அங்கீகாரச் செயல்பாடு ரத்துசெய்யப்பட்டது." - - + "\'முகம் காட்டித் திறத்தல்\' பயனரால் ரத்துசெய்யப்பட்டது." "பலமுறை முயன்றுவிட்டீர்கள். பிறகு முயலவும்." - - + "பலமுறை முயன்றுவிட்டீர்கள். \'முகம் காட்டித் திறத்தல்’ முடக்கப்பட்டது." "முகத்தைச் சரிபார்க்க இயலவில்லை. மீண்டும் முயலவும்." - - - - + "’முகம் காட்டித் திறத்தலை’ நீங்கள் அமைக்கவில்லை." + "இந்த சாதனத்தில் ’முகம் காட்டித் திறத்தல்’ ஆதரிக்கப்படவில்லை." "முகம் %d" @@ -1367,8 +1358,7 @@ "’தன்னியக்க சோதனைப்\' பயன்முறையை முடக்க ஆரம்பநிலைக்கு மீட்டமைக்கவும்." "USB போர்ட்டில் சேதம் உள்ளது" "USB போர்ட் தானாகவே முடக்கப்பட்டது மேலும் அறிய, தட்டவும்." - - + "USB போர்ட்டைப் பயன்படுத்தலாம்" "மொபைலில் எந்தச் சேதாரமும் கண்டறியப்படவில்லை." "பிழை அறிக்கையை எடுக்கிறது…" "பிழை அறிக்கையைப் பகிரவா?" diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 908f10d9c746..ff1643cd3e4c 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -280,7 +280,7 @@ "మీ పరిచయాలను యాక్సెస్ చేయడానికి <b>%1$s</b>ని అనుమతించాలా?" "స్థానం" "ఈ పరికర స్థానాన్ని యాక్సెస్ చేయడానికి" - "ఈ పరికర స్థానాన్ని యాక్సెస్ చేయడానికి <b>%1$s</b>ని అనుమతించాలా?" + "ఈ పరికర స్థానాన్ని యాక్సెస్ చేయడానికి <b>%1$s</b>ను అనుమతించాలా?" "మీరు యాప్‌ను ఉపయోగిస్తున్నప్పుడు మాత్రమే స్థానానికి యాప్ యాక్సెస్ కలిగి ఉంటుంది" "ఈ పరికర స్థానాన్ని <b>అన్ని సమయాలలో</b> యాక్సెస్ చేయడానికి <b>%1$s</b>ను అనుమతించాలా?" "యాప్ ప్రస్తుతం మీరు ఆ యాప్‌ను ఉపయోగిస్తున్నప్పుడు మాత్రమే స్థానాన్ని యాక్సెస్ చేయగలుగుతుంది" @@ -549,15 +549,11 @@ "వేలిముద్ర చిహ్నం" - - + "ముఖంతో అన్‌లాక్ చేయగల హార్డ్‌వేర్ నిర్వహణ" "వినియోగం కోసం ముఖ టెంప్లేట్‌లను జోడించే మరియు తొలగించే పద్ధతులను అమలు చేయడానికి యాప్‌ను అనుమతిస్తుంది." - - - - - - + "ముఖంతో అన్‌లాక్ చేయగల హార్డ్‌వేర్ వినియోగం" + "ప్రమాణీకరణ కోసం ముఖంతో అన్‌లాక్ చేయగల హార్డ్‌వేర్‌ను ఉపయోగించడానికి యాప్‌ను అనుమతిస్తుంది" + "ముఖంతో అన్‌లాక్" "మీ ముఖాన్ని తిరిగి నమోదు చేయండి" "గుర్తింపును మెరుగుపరచడానికి, దయచేసి మీ ముఖంను తిరిగి నమోదు చేసుకోండి" "ముఖం డేటా సరిగ్గా రాలేదు. మళ్లీ ప్రయత్నించండి." @@ -583,20 +579,15 @@ "ముఖం ధృవీకరించలేరు. హార్డ్‌వేర్ అందుబాటులో లేదు." - - + "ముఖంతో అన్‌లాక్‌ను మళ్లీ ప్రయత్నించండి." "కొత్త ముఖం డేటాను నిల్వ చేయడం కాదు. మొదట పాతది తొలిగించండి." "ముఖ కార్యకలాపం రద్దయింది." - - + "ముఖంతో అన్‌లాక్‌ను వినియోగదారు రద్దు చేశారు." "చాలా ఎక్కువ ప్రయత్నాలు చేసారు. తర్వాత మళ్లీ ప్రయత్నించండి." - - + "అనేకసార్లు ప్రయత్నించారు. ముఖంతో అన్‌లాక్ నిలిపివేయబడింది." "ముఖం ధృవీకరించలేకపోయింది. మళ్లీ ప్రయత్నించండి." - - - - + "మీరు ముఖంతో అన్‌లాక్‌ను సెటప్ చేయలేదు." + "ఈ పరికరంలో ముఖంతో అన్‌లాక్‌ను ఉపయోగించడానికి మద్దతు లేదు." "ముఖ %d" @@ -1367,8 +1358,7 @@ "పరీక్ష నియంత్రణ మోడ్‌ను నిలిపివేయడానికి ఫ్యాక్టరీ రీసెట్‍‌ను అమలు చేయండి." "USB పోర్ట్‌లో ద్రవ లేదా వ్యర్థ పదార్థాలు ఉన్నాయి" "USB పోర్ట్ ఆటోమేటిక్‌గా నిలిపివేయబడింది. మరింత తెలుసుకోవడానికి నొక్కండి." - - + "USB పోర్ట్‌ను ఉపయోగించడం సురక్షితం" "ఫోన్ ఇకపై ద్రవ లేదా వ్యర్థ పదార్థాలను గుర్తించదు." "బగ్ నివేదికను తీస్తోంది…" "బగ్ నివేదికను భాగస్వామ్యం చేయాలా?" diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index fb00ceef249f..42294da969c7 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -549,15 +549,11 @@ "ไอคอนลายนิ้วมือ" - - + "จัดการฮาร์ดแวร์ Face Unlock" "อนุญาตให้แอปเรียกใช้วิธีเพิ่มและลบเทมเพลตใบหน้าสำหรับการใช้งาน" - - - - - - + "ใช้ฮาร์ดแวร์ Face Unlock" + "อนุญาตให้แอปใช้ฮาร์ดแวร์ Face Unlock เพื่อตรวจสอบสิทธิ์" + "Face Unlock" "ลงทะเบียนใบหน้าอีกครั้ง" "โปรดลงทะเบียนใบหน้าอีกครั้งเพื่อปรับปรุงการจดจำ" "บันทึกข้อมูลใบหน้าที่ถูกต้องไม่ได้ ลองอีกครั้ง" @@ -583,20 +579,15 @@ "ยืนยันใบหน้าไม่ได้ ฮาร์ดแวร์ไม่พร้อมใช้งาน" - - + "ลองใช้ Face Unlock อีกครั้ง" "จัดเก็บข้อมูลใบหน้าใหม่ไม่ได้ ลบข้อมูลเก่าออกไปก่อน" "ยกเลิกการดำเนินการกับใบหน้าแล้ว" - - + "ผู้ใช้ยกเลิกการใช้ Face Unlock" "ดำเนินการหลายครั้งเกินไป ลองอีกครั้งในภายหลัง" - - + "ลองหลายครั้งเกินไป ปิดใช้ Face Unlock แล้ว" "ยืนยันใบหน้าไม่ได้ ลองอีกครั้ง" - - - - + "คุณยังไม่ได้ตั้งค่า Face Unlock" + "อุปกรณ์นี้ไม่รองรับ Face Unlock" "ใบหน้า %d" @@ -1366,8 +1357,7 @@ "รีเซ็ตเป็นค่าเริ่มต้นเพื่อปิดใช้โหมดโปรแกรมทดสอบอัตโนมัติ" "มีของเหลวหรือฝุ่นละอองในพอร์ต USB" "พอร์ต USB ปิดใช้โดยอัตโนมัติ แตะเพื่อดูข้อมูลเพิ่มเติม" - - + "ใช้พอร์ต USB ได้แล้ว" "โทรศัพท์ไม่ได้ตรวจจับของเหลวและฝุ่นละอองแล้ว" "กำลังสร้างรายงานข้อบกพร่อง…" "แชร์รายงานข้อบกพร่องไหม" diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 73439bb9f864..346a0b60380c 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -549,15 +549,11 @@ "Icon ng fingerprint" - - + "pamahalaan ang hardware ng face unlock" "Pumapayag na mag-invoke ang app ng paraang magdagdag at mag-delete ng template ng mukha." - - - - - - + "gamitin ang hardware ng face unlock" + "Pinapayagan ang app na gamitin ang hardware ng face unlock para sa pag-authenticate" + "Face unlock" "I-enroll ulit ang iyong mukha" "Para mapahusay ang pagkilala, paki-enroll ulit ang iyong mukha" "Hindi makakuha ng tamang face data. Subukang muli." @@ -583,20 +579,15 @@ "Di ma-verify ang mukha. Di available ang hardware." - - + "Subukan ulit ang face unlock." "Hindi ma-store ang data ng mukha. Mag-delete muna ng iba." "Nakansela ang operation kaugnay ng mukha." - - + "Kinansela ng user ang face unlock." "Masyadong maraming pagsubok. Subukang muli mamaya." - - + "Masyadong maraming pagsubok. Na-disable ang face unlock." "Hindi ma-verify ang mukha. Subukang muli." - - - - + "Hindi mo pa nase-set up ang face unlock." + "Hindi sinusuportahan ang face unlock sa device na ito." "Mukha %d" @@ -1366,8 +1357,7 @@ "Mag-factory reset para i-disable ang Test Harness Mode." "Liquid o debris sa USB port" "Awtomatikong na-disable ang USB port. Mag-tap para matuto pa." - - + "Ayos na gamitin ang USB port" "Hindi na nakaka-detect ang telepono ng liquid o debris." "Kinukuha ang ulat ng bug…" "Gusto mo bang ibahagi ang ulat ng bug?" diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index e1fa7da5f18d..233eb8eb08c4 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -549,15 +549,11 @@ "Parmak izi simgesi" - - + "yüz tanıma kilidi donanımı yönet" "Uygulamanın, kullanılacak yüz şablonlarını ekleme ve silme yöntemlerini başlatmasına izin verir." - - - - - - + "yüz tanıma kilidi donanımını kullan" + "Uygulamanın yüz tanıma kilidi donanımı kullanmasına izin verir" + "Yüz tanıma kilidi" "Yüzünüzü yeniden kaydedin" "Daha iyi tanınmasını sağlamak için lütfen yüzünüzü yeniden kaydedin" "Doğru yüz verileri yakalanamadı. Tekrar deneyin." @@ -583,20 +579,15 @@ "Yüz doğrulanamıyor. Donanım kullanılamıyor." - - + "Yüz tanıma kilidini yeniden deneyin." "Yeni yüz verisi depolanamıyor. Önce eski bir tanesini silin." "Yüz işlemi iptal edildi." - - + "Yüz tanıma kilidi kullanıcı tarafından iptal edildi." "Çok fazla deneme yapıldı. Daha sonra tekrar deneyin." - - + "Çok fazla deneme yapıldı. Yüz tanıma kilidi devredışı." "Yüz doğrulanamıyor. Tekrar deneyin." - - - - + "Yüz tanıma kilidi ayarlamadınız." + "Bu cihazda yüz tanıma kilidi desteklenmiyor" "Yüz %d" @@ -1366,8 +1357,7 @@ "Test Bandı Modu\'nu devre dışı bırakmak için cihazı fabrika ayarlarına sıfırlayın." "USB bağlantı noktasında sıvı veya toz var" "USB bağlantı noktası otomatik olarak devre dışı bırakıldı. Daha fazla bilgi için dokunun." - - + "USB bağlantı noktasını kullanabilirsiniz" "Telefon artık sıvıları veya tozları algılamıyor." "Hata raporu alınıyor…" "Hata raporu paylaşılsın mı?" diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 26de58325d8f..6fb4cbd17ff9 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -555,15 +555,11 @@ "Значок відбитка пальця" - - + "керувати апаратним забезпечення для Фейсконтролю" "Додаток може активувати способи додавання й видалення шаблонів облич." - - - - - - + "використовувати апаратне забезпечення для Фейсконтролю" + "Додаток може використовувати апаратне забезпечення для Фейсконтролю" + "Фейсконтроль" "Повторно проскануйте обличчя" "Повторно проскануйте обличчя для ефективнішого розпізнавання" "Не вдалося чітко зняти обличчя. Повторіть спробу." @@ -589,20 +585,15 @@ "Не вдається перевірити обличчя. Апаратне забезпечення недоступне." - - + "Скористайтеся Фейсконтролем ще раз." "Не вдається зберегти нові дані про обличчя. Видаліть старі." "Дію з обличчям скасовано." - - + "Користувач скасував Фейсконтроль." "Забагато спроб. Повторіть пізніше." - - + "Забагато спроб. Фейсконтроль вимкнено." "Не вдається перевірити обличчя. Повторіть спробу." - - - - + "Ви не налаштували Фейсконтроль" + "На цьому пристрої не підтримується Фейсконтроль." "Обличчя %d" @@ -1410,8 +1401,7 @@ "Щоб вимкнути режим автоматизованого тестування, відновіть заводські налаштування." "Рідина або сміття в USB-порту" "USB-порт автоматично вимкнено. Торкніться, щоб дізнатися більше." - - + "Можна використовувати USB-порт" "Телефон уже не виявляє рідини або сміття." "Створюється повідомлення про помилку…" "Надіслати звіт про помилку?" diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 78d4a5806124..a132989112b1 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -549,15 +549,11 @@ "فنگر پرنٹ آئیکن" - - + "چہرے کے ذریعے غیر مقفل کرنے والے ہارڈ ویئر کا نظم کریں" "ایپ کو چہرے کی تمثیلات شامل اور حذف کرنے کے طریقوں کو کالعدم قرار دینے کی اجازت دیتا ہے۔" - - - - - - + "چہرے کے ذریعے غیر مقفل کرنے والا ہارڈ ویئر استعمال کریں" + "ایپ کو تصدیق کے لیے چہرے کے ذریعے غیر مقفل کرنے کا ہارڈ ویئر استعمال کرنے کی اجازت دیتی ہے" + "چہرے کے ذریعے غیر مقفل کریں" "اپنے چہرے کو دوبارہ مندرج کریں" "شناخت کو بہتر بنانے کے لیے براہ کرم اپنے چہرے کو دوبارہ مندرج کریں" "چہرے کا درست ڈيٹا کیپچر نہیں ہو سکا۔ پھر آزمائيں۔" @@ -583,20 +579,15 @@ "چہرے کی توثیق نہیں کی جا سکی۔ ہارڈ ویئر دستیاب نہیں ہے۔" - - + "چہرے کے ذریعے غیر مقفل کرنے کو دوبارہ آزمائیں۔" "چہرے کا نیا ڈیٹا اسٹور نہیں کر سکتے۔ پہلے پرانا حذف کریں۔" "چہرے پر ہونے والی کارروائی منسوخ ہو گئی۔" - - + "صارف نے چہرے کے ذریعے غیر مقفل کرنے کو منسوخ کر دیا۔" "کافی زیادہ کوششیں کی گئیں۔ دوبارہ کوشش کریں۔" - - + "کافی زیادہ کوششیں۔ چہرے کے ذریعے غیر مقفل کرنا غیر فعال کر دیا گیا۔" "چہرے کی توثیق نہیں کی جا سکی۔ پھر آزمائيں۔" - - - - + "آپ نے بذریعہ چہرہ غیر مقفل کرنے کو سیٹ نہیں کیا ہے۔" + "اس آلہ پر چہرے کے ذریعے غیر مقفل کرنا تعاون یافتہ نہیں ہے۔" "چہرہ %d" @@ -1367,8 +1358,7 @@ "ٹیسٹ ہارنیس موڈ غیر فعال کرنے کے لیے فیکٹری ری سیٹ کریں۔" "‏USB پورٹ میں سیال یا دھول ہے" "‏USB پورٹ خودکار طور پر غیر فعال کر دیا گیا۔ مزید جاننے کیلئے تھپتھپائیں۔" - - + "‏USB پورٹ کا استعمال ٹھیک ہے" "فون مزید سیال یا دھول کا پتہ نہیں لگاتا۔" "بگ رپورٹ لی جا رہی ہے…" "بگ رپورٹ کا اشتراک کریں؟" diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index a192c762377a..7775aa70a575 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -549,15 +549,11 @@ "Barmoq izi belgisi" - - + "yuz bilan ochish qurilmasini boshqarish" "Ilova foydalanish uchun yuz namunalarini qo‘shish va o‘chirish usullarini tatbiq qilishi mumkin." - - - - - - + "yuz bilan ochish qurilmasidan foydalanish" + "Haqiqiylikni tekshirish uchun yuz bilan ochishdan foydalanish imkonini beradi" + "Yuz bilan ochish" "Yuzingizni yana qayd qiling" "Yuzingiz yanada yaxshiroq aniqlanishi uchun uni yana bir marta qayd qiling" "Yuz ravshan suratga olinmadi. Qaytadan urining." @@ -583,20 +579,15 @@ "Yuzingiz tasdiqlanmadi. Qurilma ishlamayapti." - - + "Yana yuz bilan ochishga urining." "Yuzga oid axborot saqlanmadi. Avval eskilari tozalansin." "Yuzni aniqlash bekor qilindi." - - + "Yuz bilan ochishni foydalanuvchi bekor qildi." "Juda ko‘p urinildi. Keyinroq qaytadan urining." - - + "Juda koʻp urinildi. Yuz bilan ochish faolsizlantirildi." "Yuzingiz tasdiqlanmadi. Qaytadan urining." - - - - + "Hali yuz bilan ochishni sozlamagansiz" + "Yuz bilan ochish bu qurilmada ishlamaydi" "Yuz %d" @@ -1367,8 +1358,7 @@ "Xavfsizlik sinovi rejimini faolsizlantirish uchun zavod sozlamalariga qaytaring." "USB portda suyuqlik yoki parcha bor" "USB port avtomatik tarzda faolsizlashtirildi. Batafsil axborot olish uchun bosing." - - + "USB portdan foydalanish mumkin" "Telefon endi suyuqlik yoki turli parchalarni aniqlay olmaydi." "Xatoliklar hisoboti olinmoqda…" "Xatoliklar hisoboti yuborilsinmi?" @@ -1504,7 +1494,7 @@ "Keyingisini topish" "Oldingisini topish" "%sdan manzil haqida so‘rov" - "Manzil so‘rovi" + "Joylashuv axboroti talabi" "%1$s (%2$s) tomonidan so‘raldi" "Ha" "Yo‘q" diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index b4e1559d5446..57c9816f7571 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -549,15 +549,11 @@ "Biểu tượng vân tay" - - + "quản lý phần cứng mở khóa bằng khuôn mặt" "Cho phép ứng dụng gọi ra các phương pháp để thêm và xóa mẫu khuôn mặt sử dụng." - - - - - - + "sử dụng phần cứng mở khóa bằng khuôn mặt" + "Cho phép ứng dụng dùng phần cứng mở khóa bằng khuôn mặt để tiến hành xác thực" + "Mở khóa bằng khuôn mặt" "Đăng ký lại khuôn mặt của bạn" "Để cải thiện khả năng nhận dạng, hãy đăng ký lại khuôn mặt của bạn" "Không thể ghi lại đúng dữ liệu mặt. Hãy thử lại." @@ -583,20 +579,15 @@ "Không thể xác minh khuôn mặt. Phần cứng không có sẵn." - - + "Thử lại thao tác mở khóa bằng khuôn mặt." "Không lưu được dữ liệu khuôn mặt mới. Hãy xóa dữ liệu cũ trước." "Đã hủy thao tác dùng khuôn mặt." - - + "Người dùng đã hủy thao tác mở khóa bằng khuôn mặt." "Bạn đã thử quá nhiều lần. Hãy thử lại sau." - - + "Quá nhiều lần thử. Đã tắt tính năng mở khóa bằng khuôn mặt." "Không thể xác minh khuôn mặt. Hãy thử lại." - - - - + "Bạn chưa thiết lập tính năng mở khóa bằng khuôn mặt." + "Thiết bị này không hỗ trợ tính năng mở khóa bằng khuôn mặt." "Khuôn mặt %d" @@ -692,7 +683,7 @@ "Ngăn sử dụng một số tính năng của phương thức khóa màn hình." "Nhà riêng" - "Di Động" + "Di động" "Cơ quan" "Số fax cơ quan" "Số fax nhà riêng" @@ -1366,8 +1357,7 @@ "Khôi phục cài đặt gốc để tắt Chế độ khai thác kiểm thử." "Có chất lỏng hoặc mảnh vỡ trong cổng USB" "Cổng USB đã tự động tắt. Nhấn để tìm hiểu thêm." - - + "Có thể sử dụng cổng USB" "Điện thoại không còn phát hiện chất lỏng hay mảnh vỡ nữa." "Đang thu thập báo cáo lỗi…" "Chia sẻ báo cáo lỗi?" @@ -1503,7 +1493,7 @@ "Tìm kết quả phù hợp tiếp theo" "Tìm kết quả phù hợp trước" "Yêu cầu vị trí từ %s" - "Yêu cầu vị trí" + "Yêu cầu truy cập vị trí" "Được yêu cầu bởi %1$s (%2$s)" "Có" "Không" diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index da239b92238d..ad08e53fbf37 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -549,15 +549,11 @@ "指纹图标" - - + "管理人脸解锁硬件" "允许该应用调用方法来添加和删除可用的人脸模板。" - - - - - - + "使用人脸解锁硬件" + "允许该应用使用人脸解锁硬件进行身份验证" + "人脸解锁" "重新注册您的面孔" "要提升识别精确度,请重新注册您的面孔" "无法捕获准确的人脸数据,请重试。" @@ -583,20 +579,15 @@ "无法验证人脸。硬件无法使用。" - - + "请重新尝试人脸解锁。" "无法存储新的人脸数据。请先删除旧的人脸数据。" "面孔处理操作已取消。" - - + "用户已取消人脸解锁。" "尝试次数过多,请稍后重试。" - - + "尝试次数过多,人脸解锁已停用。" "无法验证人脸,请重试。" - - - - + "您尚未设置人脸解锁。" + "此设备不支持人脸解锁。" "面孔 %d" @@ -1366,8 +1357,7 @@ "恢复出厂设置以停用自动化测试框架模式。" "USB 端口中有液体或碎屑" "USB 端口已自动停用。点按即可了解详情。" - - + "允许使用 USB 端口" "手机不再检测到液体或碎屑。" "正在生成错误报告…" "要分享错误报告吗?" @@ -1503,7 +1493,7 @@ "下一条结果" "上一条结果" "来自%s的定位请求" - "定位请求" + "位置信息请求" "请求人:%1$s%2$s)" "是" "否" diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 1da26f03c968..27605359e337 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -549,15 +549,11 @@ "指紋圖示" - - + "管理臉容解鎖硬件" "允許應用程式調用方法,以加入和刪除可用的臉孔範本。" - - - - - - + "使用臉容解鎖硬件" + "允許應用程式使用臉容解鎖硬件來驗證" + "臉容解鎖" "重新註冊臉孔" "如要提高識別能力,請重新註冊您的臉孔" "無法擷取準確的臉容資料。請再試一次。" @@ -583,20 +579,15 @@ "無法驗證臉孔,硬件無法使用。" - - + "請再次嘗試「臉容解鎖」。" "無法儲存新的臉容資料,請先刪除舊資料。" "臉孔操作已取消。" - - + "使用者已取消「臉容解鎖」。" "嘗試次數過多,請稍後再試。" - - + "嘗試次數過多,「臉容解鎖」已停用。" "無法驗證臉孔。請再試一次。" - - - - + "您尚未設定「臉容解鎖」。" + "此裝置不支援「臉容解鎖」。" "臉孔 %d" @@ -1366,8 +1357,7 @@ "請將裝置回復原廠設定,以停用測試工具模式。" "USB 連接埠中有液體或碎片" "USB 連接埠已自動停用。輕按即可瞭解詳情。" - - + "USB 連接埠可安全使用" "手機不再偵測到液體或碎片。" "正在取得錯誤報告…" "要分享錯誤報告嗎?" diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 2e1a697ba357..59e52fc833eb 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -549,15 +549,11 @@ "指紋圖示" - - + "管理人臉解鎖硬體" "允許應用程式呼叫方法來新增及移除可用的臉孔範本。" - - - - - - + "使用人臉解鎖硬體" + "允許應用程式使用人臉解鎖硬體進行驗證" + "人臉解鎖" "請重新註冊你的臉孔" "為提升辨識精準度,請重新註冊你的臉孔" "無法擷取精準臉孔資料,請再試一次。" @@ -583,20 +579,15 @@ "相關硬體無法使用,因此無法驗證臉孔。" - - + "請重新進行人臉解鎖。" "無法儲存新的臉孔資料,請先刪除舊的資料。" "臉孔處理作業已取消。" - - + "使用者已取消人臉解鎖作業。" "嘗試次數過多,請稍後再試。" - - + "嘗試次數過多,因此系統已停用人臉解鎖功能。" "無法驗證臉孔,請再試一次。" - - - - + "你尚未設定人臉解鎖功能。" + "這個裝置不支援人臉解鎖功能。" "臉孔 %d" @@ -1366,8 +1357,7 @@ "恢復原廠設定以停用測試控管工具模式。" "USB 連接埠中有液體或灰塵" "系統已自動停用 USB 連接埠。輕觸即可瞭解詳情。" - - + "現在可以使用 USB 連接埠" "手機目前無法偵測液體或灰塵。" "正在接收錯誤報告…" "要分享錯誤報告嗎?" @@ -1503,7 +1493,7 @@ "尋找下一個項目" "尋找上一個項目" "%s 的地點要求" - "位置要求" + "位置資訊要求" "要求者:%1$s (%2$s)" "是" "否" -- GitLab From b52f586f5597ae4fa59f0f3d7675ad4ce68b010b Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 1 Jun 2019 00:25:34 -0700 Subject: [PATCH 042/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I5957fcaca8d668a97a14b5b054aee45a51f4a7c0 --- packages/SystemUI/res/values-af/strings.xml | 15 +++---- packages/SystemUI/res/values-am/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-ar/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-as/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-az/strings.xml | 36 +++++++--------- .../SystemUI/res/values-b+sr+Latn/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-be/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-bg/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-bn/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-bs/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-ca/strings.xml | 42 ++++++++----------- packages/SystemUI/res/values-cs/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-da/strings.xml | 38 +++++++---------- packages/SystemUI/res/values-de/strings.xml | 40 ++++++++---------- packages/SystemUI/res/values-el/strings.xml | 15 +++---- .../SystemUI/res/values-en-rAU/strings.xml | 15 +++---- .../SystemUI/res/values-en-rCA/strings.xml | 15 +++---- .../SystemUI/res/values-en-rGB/strings.xml | 15 +++---- .../SystemUI/res/values-en-rIN/strings.xml | 15 +++---- .../SystemUI/res/values-en-rXC/strings.xml | 13 +++--- .../SystemUI/res/values-es-rUS/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-es/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-et/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-eu/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-fa/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-fi/strings.xml | 36 +++++++--------- .../SystemUI/res/values-fr-rCA/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-fr/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-gl/strings.xml | 38 +++++++---------- packages/SystemUI/res/values-gu/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-hi/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-hr/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-hu/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-hy/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-in/strings.xml | 17 ++++---- packages/SystemUI/res/values-is/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-it/strings.xml | 15 +++---- packages/SystemUI/res/values-iw/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-ja/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-ka/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-kk/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-km/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-kn/strings.xml | 15 +++---- packages/SystemUI/res/values-ko/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-ky/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-lo/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-lt/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-lv/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-mk/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-ml/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-mn/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-mr/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-ms/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-my/strings.xml | 17 ++++---- packages/SystemUI/res/values-nb/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-ne/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-nl/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-or/strings.xml | 38 +++++++---------- packages/SystemUI/res/values-pa/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-pl/strings.xml | 36 +++++++--------- .../SystemUI/res/values-pt-rBR/strings.xml | 36 +++++++--------- .../SystemUI/res/values-pt-rPT/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-pt/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-ro/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-ru/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-si/strings.xml | 15 +++---- packages/SystemUI/res/values-sk/strings.xml | 38 +++++++---------- packages/SystemUI/res/values-sl/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-sq/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-sr/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-sv/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-sw/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-ta/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-te/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-th/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-tl/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-tr/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-uk/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-ur/strings.xml | 36 +++++++--------- packages/SystemUI/res/values-uz/strings.xml | 38 +++++++---------- packages/SystemUI/res/values-vi/strings.xml | 36 +++++++--------- .../SystemUI/res/values-zh-rCN/strings.xml | 36 +++++++--------- .../SystemUI/res/values-zh-rHK/strings.xml | 36 +++++++--------- .../SystemUI/res/values-zh-rTW/strings.xml | 38 +++++++---------- packages/SystemUI/res/values-zu/strings.xml | 15 +++---- 85 files changed, 1195 insertions(+), 1616 deletions(-) diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index e6579da55ed8..80cba56ddc6c 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -647,13 +647,10 @@ "Hou aan waarsku" "Skakel kennisgewings af" "Hou aan om kennisgewings van hierdie program af te wys?" - "Lig" - "Geprioritiseerd" - "Help jou om te fokus met kennisgewings wat net op die aftrekskerm is. Altyd stil." - "Wys prioriteitkennisgewings hieronder. Altyd stil." - "Wys prioriteitkennisgewings hieronder. Altyd stil." - "Wys prioriteitkennisgewings hieronder. Altyd stil." - "Trek jou aandag met klank en \'n statusbalk-ikoon. Wys op sluitskerm." + "Stil" + "Waarskuwings" + "Help jou om te fokus sonder klank of vibrasie." + "Kry jou aandag met klank of vibrasie." "Hierdie kennisgewings kan nie gewysig word nie." "Hierdie groep kennisgewings kan nie hier opgestel word nie" "Instaanbediener-kennisgewing" @@ -935,4 +932,8 @@ "Beweeg na links onder" "Beweeg na regs onder" "Maak toe" + + + + diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 47897892f6af..b779ce7c6cea 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -62,12 +62,10 @@ "የዩኤስቢ እርማት አይፈቀድም" "አሁን ወደዚህ መሣሪያ የገባው ተጠቃሚ የዩኤስቢ እርማትን ማብራት አይችልም። ይህን ባህሪ ለመጠቀም ወደ ዋና ተጠቃሚ ይቀይሩ።" "የዩኤስቢ ወደብ ተሰናክሏል" - - + "መሣሪያዎን ከፈሳሽ ወይም ፍርስራሽ ለመጠበቅ ሲባል የዩኤስቢ ወደቡ ተሰናክሏል፣ እና ማናቸውም ተቀጥላዎችን አያገኝም።\n\nየዩኤስቢ ወደቡን እንደገና መጠቀም ችግር በማይኖረው ጊዜ ማሳወቂያ ይደርሰዎታል።" "ኃይል መሙያዎችን እና ተጨማሪ መሣሪያዎችን ፈልጎ ለማግኘት የነቃ የዩኤስቢ ወደብ" "ዩኤስቢ አንቃ" - - + "የበለጠ መረዳት" "ማያ እንዲሞላ አጉላ" "ማያ ለመሙለት ሳብ" "ቅጽበታዊ ገጽ እይታ" @@ -458,10 +456,8 @@ "ዳግመኛ አታሳይ" "ሁሉንም አጽዳ" "ያቀናብሩ" - - - - + "ጸጥ ያሉ ማሳወቂያዎች" + "ሁሉንም ጸጥ ያሉ ማሳወቂያዎችን ያጽዱ" "ማሳወቂያዎች በአትረብሽ ባሉበት ቆመዋል" "አሁን ጀምር" "ምንም ማሳወቂያ የለም" @@ -645,21 +641,16 @@ "አግድ" "ማሳየትን ቀጥል" "አሳንስ" - - + "ፀጥ ያለ" "ጸጥ እንዳለ ቆይ" - - + "ማንቃት" "ማንቃቱን ቀጥል" "ማሳወቂያዎችን አጥፋ" "ከዚህ መተግበሪያ ማሳወቂያዎችን ማሳየት ይቀጥል?" - "ረጋ ያለ" - "ቅድሚያ የተሰጠው" - "በወደታች ተጎችታች ጥላ ውስጥ ብቻ በማሳወቂያዎች ላይ እንዲያተኩሩ ያግዝዎታል። ሁልጊዜ ጸጥታ።" - "ከዚህ በታች ቅድሚያ ተሰጪ ማሳወቂያዎችን ያሳያል። ሁልጊዜ ጸጥታ።" - "ከዚህ በታች ቅድሚያ ተሰጪ ማሳወቂያዎችን ያሳያል። ሁልጊዜ ጸጥታ።" - "ከዚህ በታች ቅድሚያ ተሰጪ ማሳወቂያዎችን ያሳያል። ሁልጊዜ ጸጥታ።" - "ከድምፅ እና የሁኔታ አሞሌ አዶ ጋር የእርስዎን ትኩረት ይስባል። በማያ ገጽ ቁልፍ ላይ ያሳያል።" + "ፀጥ ያለ" + "ማንቃት" + "ያለ ድምፅ ወይም ንዝረት እርስዎ ትኩረት እንዲያደርጉ ያግዛል።" + "ከድምፅ ወይም ንዝረት ጋር የእርስዎን ትኩረት ይስባል።" "እነዚህ ማሳወቂያዎች ሊሻሻሉ አይችሉም።" "የማሳወቂያዎች ይህ ቡድን እዚህ ላይ ሊዋቀር አይችልም" "ተኪ ማሳወቂያ" @@ -908,8 +899,7 @@ "ፍቀድ" "ከልክል" "ለባትሪ ቆጣቢ መርሐግብርን ለማስያዝ መታ ያድርጉ" - - + "ባትሪው የማለቅ ዕድሉ ከፍ ያለ ከሆነ ያብሩት" "አይ፣ አመሰግናለሁ" "የባትሪ ቆጣቢ መርሐግብር በርቷል" "ባትሪ ልክ ከ%d%% በታች ሲሆን ባትሪ ቆጣቢ በራስ-ሰር ይበራል።" @@ -942,4 +932,8 @@ "የግርጌውን ግራ አንቀሳቅስ" "ታችኛውን ቀኝ ያንቀሳቅሱ" "አሰናብት" + + + + diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 42879a410b51..2381e1691eb4 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -62,12 +62,10 @@ "‏لا يُسمح بتصحيح أخطاء USB" "‏لا يمكن للمستخدم الذي يسجّل دخوله حاليًا إلى هذا الجهاز تشغيل تصحيح أخطاء USB. لاستخدام هذه الميزة، يمكنك التبديل إلى المستخدم الأساسي." "‏تمّ إيقاف منفذ USB" - - + "‏لحماية جهازك من السوائل أو الشوائب، سيتمّ إيقاف منفذ USB ولن يتم رصد أيّ ملحقات.\n\nوسيتمّ إعلامك عندما يُسمح باستخدام منفذ USB مرة أخرى." "‏تم تفعيل منفذ USB لاكتشاف أجهزة الشحن والملحقات." "‏تفعيل USB" - - + "مزيد من المعلومات" "تكبير/تصغير لملء الشاشة" "توسيع بملء الشاشة" "لقطة شاشة" @@ -470,10 +468,8 @@ "عدم الإظهار مرة أخرى" "محو الكل" "إدارة" - - - - + "الإشعارات الصامتة" + "محو جميع الإشعارات الصامتة" "تم إيقاف الإشعارات مؤقتًا وفقًا لإعداد \"الرجاء عدم الإزعاج\"" "البدء الآن" "ليس هناك أي اشعارات" @@ -657,21 +653,16 @@ "حظر" "الاستمرار في تلقّي الإشعارات" "تصغير" - - + "صامت" "متابعة عرض الإشعارات بدون صوت" - - + "تنبيه" "متابعة إرسال التنبيهات" "إيقاف الإشعارات" "هل تريد الاستمرار في تلقي إشعارات من هذا التطبيق؟" - "الإشعارات الهادئة" - "لها الأولوية" - "لمساعدتك على التركيز، يتم عرض هذه الإشعارات ضمن \"مركز الإشعارات\" فقط. كتم الصوت دائمًا." - "يتم عرض هذه الإشعارات تحت الإشعارات ذات الأولوية، مع كتم صوتها دائمًا." - "يتم عرض هذه الإشعارات تحت الإشعارات ذات الأولوية، مع كتم صوتها دائمًا." - "يتم عرض هذه الإشعارات تحت الإشعارات ذات الأولوية، مع كتم صوتها دائمًا." - "عند تلقّي هذه الإشعارات، سيظهر رمز في شريط الحالة مع صوت للفت انتباهك. ويتم عرض هذه الإشعارات على شاشة التأمين." + "إشعار صامت" + "إشعار مصحوب بتنبيه صوتي" + "يساعدك هذا الإشعار على التركيز بدون صوت أو اهتزاز." + "يلفت هذا الإشعار انتباهك باستخدام الصوت والاهتزاز." "يتعذّر تعديل هذه الإشعارات." "يتعذّر ضبط مجموعة الإشعارات هذه هنا." "إشعار مستند إلى خادم وكيل" @@ -928,8 +919,7 @@ "سماح" "رفض" "انقر لجدولة \"توفير شحن البطارية\"." - - + "فعِّل الميزة إذا كان من المرجح نفاد شحن البطارية." "لا، شكرًا" "تم تفعيل جدولة \"توفير شحن البطارية\"." "سيتم تفعيل ميزة \"توفير شحن البطارية\" عندما تنخفض البطارية عن %d%%." @@ -962,4 +952,8 @@ "نقل إلى أسفل يمين الشاشة" "نقل إلى أسفل اليسار" "تجاهل" + + + + diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index de2b933d06eb..7f349eb68920 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -62,12 +62,10 @@ "ইউএছবি ডিবাগিঙৰ অনুমতি নাই" "এই ডিভাইচটোত বর্তমান ছাইন ইন হৈ থকা ব্যৱহাৰকাৰীজনে ইউএছবি ডিবাগিং অন কৰিব নোৱাৰে। এই সুবিধাটো ব্যৱহাৰ কৰিবলৈ হ\'লে মুখ্য ব্যৱহাৰকাৰী হিচাপে ছাইন ইন কৰক।" "ইউএছবি প’ৰ্ট অক্ষম কৰা হ’ল" - - + "আপোনাৰ ডিভাইচটো তৰল বা ধূলি-মাকতিৰ পৰা ৰক্ষা কৰিবলৈ ইউএছবি প’ৰ্টটো অক্ষম কৰি ৰখা হৈছে ফলত ই কোনো আনুষংগিক সামগ্ৰী ধৰা পেলাব নোৱাৰে।\n\nযেতিয়া ইউএছবি প’ৰ্টটো নিৰাপদভাৱে ব্যৱহাৰ কৰিব পৰা হ’ব তেতিয়া আপোনাক জনোৱা হ’ব।" "চাৰ্জাৰ আৰু আনুষংগিক সামগ্ৰী চিনাক্ত কৰিবলৈ USB প’ৰ্ট সক্ষম কৰা হ’ল" "USB সক্ষম কৰক" - - + "অধিক জানক" "স্ক্ৰীণ পূর্ণ কৰিবলৈ জুম কৰক" "স্ক্ৰীণ পূর্ণ কৰিবলৈ প্ৰসাৰিত কৰক" "স্ক্ৰীণশ্বট" @@ -458,10 +456,8 @@ "পুনৰাই নেদেখুৱাব" "সকলো মচক" "পৰিচালনা" - - - - + "নীৰৱ জাননীসমূহ" + "সকলো নীৰৱ জাননী মচক" "অসুবিধা নিদিব-ই জাননী পজ কৰিছে" "এতিয়াই আৰম্ভ কৰক" "কোনো জাননী নাই" @@ -645,21 +641,16 @@ "অৱৰোধ কৰক" "দেখুওৱাই থাকক" "সৰু কৰক" - - + "নিৰৱ" "নীৰৱ হৈ থাকক" - - + "সতৰ্ক কৰক" "সতৰ্ক কৰি থাকক" "জাননী অফ কৰক" "এই এপটোৰ জাননী দেখুওৱাই থাকিব লাগিবনে?" - "সাধাৰণ" - "অগ্ৰাধিকাৰপ্ৰাপ্ত" - "আপুনি যাতে অসুবিধা নাপায়, তাৰ বাবে কেৱল পুল-ডাউন শ্বেডত এই জাননী দেখুৱায়। সদায় নিৰৱ।" - "অগ্ৰাধিকাৰপ্ৰাপ্ত জাননীসমূহৰ তলত দেখুৱায়। সদায় নিৰৱ।" - "অগ্ৰাধিকাৰপ্ৰাপ্ত জাননীসমূহৰ তলত দেখুৱায়। সদায় নিৰৱ।" - "অগ্ৰাধিকাৰপ্ৰাপ্ত জাননীসমূহৰ তলত দেখুৱায়। সদায় নিৰৱ।" - "ধ্বনি আৰু স্থিতি দণ্ডৰ আইকনৰ জৰিয়তে আপোনাৰ মনোযোগ আকৰ্ষণ কৰে। লক স্ক্ৰীণত দেখুৱায়।" + "নীৰৱ" + "সতৰ্ক কৰক" + "কোনো ধ্বনি অথবা কম্পন অবিহনে আপোনাক মনোযোগ দিয়াত সহায় কৰে।" + "ধ্বনি অথবা কম্পনৰ জৰিয়তে আপোনাৰ মনোযোগ আকৰ্ষণ কৰে।" "এই জাননীসমূহ সংশোধন কৰিব নোৱাৰি।" "এই ধৰণৰ জাননীবোৰ ইয়াত কনফিগাৰ কৰিব পৰা নাযায়" "প্ৰক্সি হিচাপে পঠিওৱা জাননী" @@ -908,8 +899,7 @@ "অনুমতি দিয়ক" "অস্বীকাৰ কৰক" "বেটাৰি সঞ্চয়কাৰীৰ সময়সূচী সক্ৰিয় কৰিবলৈ টিপক" - - + "বেটাৰি শেষ হোৱাৰ সম্ভাৱনা থাকিলে অন কৰক" "নালাগে, ধন্যবাদ" "বেটাৰি সঞ্চয়কাৰীৰ সময়সূচী অন কৰা অৱস্থাত আছে" "বেটাৰি চ্চাৰ্জৰ স্তৰ %d%%তকৈ কম হোৱাৰ লগে লগে বেটাৰি সঞ্চয়কাৰী স্বয়ংক্ৰিয়ভাৱে অন হ’ব।" @@ -942,4 +932,8 @@ "বুটামটো বাওঁফালে নিয়ক" "তলৰ সোঁফালে নিয়ক" "অগ্ৰাহ্য কৰক" + + + + diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index f27bc4b4c8af..4602bd2df6de 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -62,12 +62,10 @@ "USB debaq prosesinə icazə verilmir" "Hazırda bu cihaza daxil olmuş istifadəçi USB sazlama prosesini aktiv edə bilməz. Bu funksiyadan istifadə etmək üçün əsas istifadəçi hesaba daxil olmalıdır." "USB portu deaktiv edildi" - - + "USB portu deaktivdir. Cihazı maye və zərbədən qorumaq üçün aksesuar aşkarlanmayacaq.\n\nUSB portu yenidən istifadə üçün təhlükəsiz olduqda bildiriş göndəriləcək." "Adapter və aksesuarları aşkarlamaq üçün USB portu aktiv edildi" "USB-ni aktiv edin" - - + "Ətraflı məlumat" "Ekranı doldurmaq üçün yaxınlaşdır" "Ekranı doldurmaq üçün uzat" "Skrinşot" @@ -458,10 +456,8 @@ "Daha göstərmə" "Hamısını silin" "İdarə edin" - - - - + "Səssiz bildirişlər" + "Səssiz bildirişlərin hamısını silin" "Bildirişlər \"Narahat Etməyin\" rejimi tərəfindən dayandırıldı" "İndi başlayın" "Heç bir bildiriş yoxdur" @@ -645,21 +641,16 @@ "Blok edin" "Göstərməyə davam edin" "Kiçildin" - - + "Səssiz" "Səssiz göstərilsin" - - + "Siqnal" "Xəbərdarlıq göndərməyə davam edin" "Bildirişləri deaktiv edin" "Bu tətbiqin bildirişləri göstərilməyə davam edilsin?" - "Daha az əhəmiyyətli" - "Mühüm" - "Yalnız aşağı açılan siyahıda bildirişlərə fokuslanmağınıza kömək edir. Həmişə səssiz." - "Mühüm bildirişlərin aşağısında göstərilir. Həmişə səssiz." - "Mühüm bildirişlərin aşağısında göstərilir. Həmişə səssiz." - "Mühüm bildirişlərin aşağısında göstərilir. Həmişə səssiz." - "Səs & status paneli ikonası ilə diqqətinizi cəlb edir. Ekran kilidini göstərir." + "Səssiz" + "Siqnal" + "Səs və ya vibrasiya olmadan fokuslanmağınıza kömək edir." + "Səs və ya vibrasiya ilə diqqətinizi çəkir." "Bu bildirişlər dəyişdirilə bilməz." "Bu bildiriş qrupunu burada konfiqurasiya etmək olmaz" "Proksi bildirişi" @@ -908,8 +899,7 @@ "İcazə verin" "Rədd edin" "Batareya Qənaətini planlaşdırmaq üçün klikləyin" - - + "Batareya bitmək üzrə olduqda aktiv edin" "Xeyr, təşəkkür" "Batareya Qənaəti aktivdir" "Batareya %d%%-dən aşağı düşdükdə Batareya Qənaəti avtomatik aktiv ediləcək." @@ -942,4 +932,8 @@ "Aşağıya sola köçürün" "Aşağıya sağa köçürün" "Kənarlaşdırın" + + + + diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index afe84d00a47b..75be041dd6e0 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -62,12 +62,10 @@ "Otklanjanje grešaka na USB-u nije dozvoljeno" "Korisnik koji je trenutno prijavljen na ovaj uređaj ne može da uključi otklanjanje grešaka na USB-u. Da biste koristili ovu funkciju, prebacite na primarnog korisnika." "USB port je onemogućen" - - + "Da bi se uređaj zaštitio od tečnosti ili nečistoće, USB port je onemogućen i neće otkrivati dodatnu opremu.\n\nObavestićemo vas kada ponovo budete mogli da koristite USB port." "USB port je omogućen radi otkrivanja punjača i dodatne opreme" "Omogući USB" - - + "Saznajte više" "Zumiraj na celom ekranu" "Razvuci na ceo ekran" "Snimak ekrana" @@ -461,10 +459,8 @@ "Ne prikazuj ponovo" "Obriši sve" "Upravljajte" - - - - + "Nečujna obaveštenja" + "Obrišite sva nečujna obaveštenja" "Obaveštenja su pauzirana režimom Ne uznemiravaj" "Započni odmah" "Nema obaveštenja" @@ -648,21 +644,16 @@ "Blokiraj" "Nastavi da prikazuješ" "Umanji" - - + "Nečujno" "Ne uključuj zvuk" - - + "Upozoravanje" "Nastavi sa obaveštenjima" "Isključi obaveštenja" "Želite li da se obaveštenja iz ove aplikacije i dalje prikazuju?" - "Diskretno" - "Prioritetno" - "Pomaže vam da se fokusirate. Obaveštenja su samo na padajućoj traci. Uvek nečujno." - "Prikazuje se ispod prioritetnih obaveštenja. Uvek nečujno." - "Prikazuje se ispod prioritetnih obaveštenja. Uvek nečujno." - "Prikazuje se ispod prioritetnih obaveštenja. Uvek nečujno." - "Privlači vam pažnju pomoću zvuka i ikone statusne trake. Prikazuje se na zaključanom ekranu." + "Nečujno" + "Upozoravanje" + "Pomaže vam da se koncentrišete bez zvuka ili vibracije." + "Privlači vam pažnju pomoću zvuka ili vibracije." "Ova obaveštenja ne mogu da se menjaju." "Ova grupa obaveštenja ne može da se konfiguriše ovde" "Obaveštenje preko proksija" @@ -913,8 +904,7 @@ "Dozvoli" "Odbij" "Dodirnite da biste napravili raspored za uštedu baterije" - - + "Uključite ako će baterija verovatno da se isprazni" "Ne, hvala" "Raspored za uštedu baterije je uključen" "Ušteda baterije će se automatski uključivati kada baterija padne ispod %d%%." @@ -947,4 +937,8 @@ "Premesti dole levo" "Premesti dole desno" "Odbaci" + + + + diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 4c459f2d0964..2155b33a4947 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -62,12 +62,10 @@ "Адладка USB не дапускаецца" "Карыстальнік, які зараз увайшоў у гэту прыладу, не можа ўключыць адладку USB. Каб выкарыстоўваць гэту функцыю, пераключыцеся на асноўнага карыстальніка." "Порт USB адключаны" - - + "Порт USB адключаны, каб засцерагчы прыладу ад вадкасці і смецця, таму дадатковае абсталяванне не будзе выяўлена.\n\nВы атрымаеце апавяшчэнне, калі порт USB можна будзе выкарыстоўваць зноў." "USB-порту дазволена вызначаць зарадныя прылады і аксесуары" "Уключыць USB" - - + "Даведацца больш" "Павял. на ўвесь экран" "Расцягн. на ўвесь экран" "Здымак экрана" @@ -466,10 +464,8 @@ "Не паказваць зноў" "Ачысціць усё" "Кіраваць" - - - - + "Апавяшчэнні без гуку" + "Выдаліць усе апавяшчэнні без гуку" "Паказ апавяшчэнняў прыпынены ў рэжыме \"Не турбаваць\"" "Пачаць зараз" "Апавяшчэнняў няма" @@ -653,21 +649,16 @@ "Заблакіраваць" "Працягваць паказваць" "Згарнуць" - - + "Бязгучны рэжым" "Не ўключаць гук" - - + "Апавяшчаць" "Апавяшчаць далей" "Выключыць апавяшчэнні" "Працягваць паказваць апавяшчэнні гэтай праграмы?" - "Ціхі рэжым" - "Прыярытэтныя" - "Дапамагае не адцягваць увагу, паказваючы апавяшчэнні толькі на апушчанай шторцы. Заўсёды без гуку." - "Паказвае ўнізе апавяшчэнні з высокім прыярытэтам. Заўсёды без гуку." - "Паказвае ўнізе апавяшчэнні з высокім прыярытэтам. Заўсёды без гуку." - "Паказвае ўнізе апавяшчэнні з высокім прыярытэтам. Заўсёды без гуку." - "Прываблівае ўвагу гукам і значком на панэлі стану. Паказвае на экране блакіроўкі." + "Бязгучны рэжым" + "Абвесткі" + "Не адцягвае ўвагу дзякуючы выключаным гуку і вібрацыі." + "Прыцягвае ўвагу гукам і вібрацыяй." "Гэтыя апавяшчэнні нельга змяніць." "Тут канфігурыраваць гэту групу апавяшчэнняў забаронена" "Праксіраванае апавяшчэнне" @@ -920,8 +911,7 @@ "Дазволіць" "Адмовіць" "Націсніце, каб уключыць рэжым эканоміі зараду" - - + "Уключыце, калі зарад акумулятара заканчваецца" "Не, дзякуй" "Уключаны рэжым эканоміі зараду" "Калі ўзровень зараду акумулятара знізіцца да %d%%, аўтаматычна ўключыцца рэжым эканоміі энергіі." @@ -954,4 +944,8 @@ "Перамясціць лявей і ніжэй" "Перамясціць правей і ніжэй" "Адхіліць" + + + + diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index ee07f5dab29a..1e619a82233b 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -62,12 +62,10 @@ "Отстраняването на грешки през USB не е разрешено" "Потребителят, който понастоящем е влязъл в това устройство, не може да включи функцията за отстраняване на грешки през USB. За да я използвате, превключете към основния потребител." "USB портът е деактивиран" - - + "С цел защита на устройството ви от течности и замърсяване USB портът е деактивиран и няма да открива аксесоари.\n\nЩе получите известие, когато можете отново да използвате USB порта." "USB портът може да разпознава зарядни устройства и аксесоари" "Активиране на USB" - - + "Научете повече" "Мащаб – запълва екрана" "Разпъване – запълва екрана" "Екранна снимка" @@ -458,10 +456,8 @@ "Да не се показва отново" "Изчистване на всички" "Управление" - - - - + "Беззвучни известия" + "Изчистване на всички беззвучни известия" "Известията са поставени на пауза от режима „Не безпокойте“" "Стартиране сега" "Няма известия" @@ -645,21 +641,16 @@ "Блокиране" "Да продължат да се показват" "Намаляване" - - + "Тих режим" "Показване на известията без звук" - - + "Сигнализиране" "Продължаване на сигнализирането" "Изключване на известията" "Да продължат ли да се показват известията от това приложение?" - "Ненатрапчиви известия" - "Приоритетни известия" - "Помага ви да се съсредоточите, като известията се показват само в падащия панел. Винаги в тих режим." - "Показва се под приоритетните известия. Винаги в тих режим." - "Показва се под приоритетните известия. Винаги в тих режим." - "Показва се под приоритетните известия. Винаги в тих режим." - "Привлича вниманието ви със звук и икона в лентата на състоянието. Показва се на заключения екран." + "Тих режим" + "Сигнализиране" + "Помага ви да се фокусирате без звук или вибриране." + "Привлича вниманието ви със звук или вибриране." "Тези известия не могат да бъдат променяни." "Тази група от известия не може да бъде конфигурирана тук" "Известие, получено чрез делегиране" @@ -908,8 +899,7 @@ "Разрешаване" "Отказ" "Докоснете, за да активирате автоматичния режим за запазване на батерията" - - + "Включване, когато е вероятно батерията да се изтощи" "Не, благодаря" "Включен е автоматичен режим за запазване на батерията" "Режимът за запазване на батерията ще се включи автоматично, след като нивото й премине под %d%%." @@ -942,4 +932,8 @@ "Преместване долу вляво" "Преместване долу вдясно" "Отхвърляне" + + + + diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index c04093ae504a..99043416a0ef 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -62,12 +62,10 @@ "USB ডিবাগিং অনুমোদিত নয়" "ব্যবহারকারী এখন এই ডিভাইসে সাইন-ইন করেছেন তাই USB ডিবাগিং চালু করা যাবে না। এই বৈশিষ্ট্যটি ব্যবহার করতে, প্রাথমিক ব্যবহারকারীতে পাল্টে নিন।" "ইউএসবি পোর্ট বন্ধ করা হয়েছে" - - + "কোনও তরল পদার্থ ও ধুলো থেকে আপনার ডিভাইসকে সুরক্ষিত রাখতে, ইউএসবি পোর্ট বন্ধ করা আছে, তাই কোনও অ্যাক্সেসরির শনাক্ত করা যাবে না।\n\nইউএসবি পোর্ট আবার ব্যবহার করা নিরাপদ হলে, আপনাকে জানানো হবে।" "চার্জার ও আনুষঙ্গিক আইটেম শনাক্ত করার জন্য ইউএসবি চালু করা হয়েছে" "ইউএসবি চালু করুন" - - + "আরও জানুন" "স্ক্রীণ পূরণ করতে জুম করুন" "ফুল স্ক্রিন করুন" "স্ক্রিনশট নিন" @@ -458,10 +456,8 @@ "আর দেখাবেন না" "সবকিছু সাফ করুন" "পরিচালনা করুন" - - - - + "নীরব বিজ্ঞপ্তি" + "সব নীরব বিজ্ঞপ্তি মুছুন" "\'বিরক্ত করবেন না\' দিয়ে বিজ্ঞপ্তি পজ করা হয়েছে" "এখন শুরু করুন" "কোনো বিজ্ঞপ্তি নেই" @@ -645,21 +641,16 @@ "ব্লক করুন" "দেখতে থাকুন" "ছোট করে দিন" - - + "নীরব রাখুন" "বিজ্ঞপ্তি মিউট করুন" - - + "সতর্ক করুন" "বিজ্ঞপ্তি পান" "বিজ্ঞপ্তি বন্ধ করুন" "এই অ্যাপের বিজ্ঞপ্তি পরেও দেখে যেতে চান?" - "সাইলেন্ট মোডে" - "অগ্রাধিকার দেওয়া হয়েছে" - "আপনি যাতে বিরক্ত না হন, তার জন্য শুধুমাত্র পুল-ডাউন শেডে এই বিজ্ঞপ্তি দেখায়। সবসময় সাইলেন্ট।" - "অগ্রাধিকারযুক্ত বিজ্ঞপ্তির নিচে দেখানো হয়। সবসময় সাইলেন্ট।" - "অগ্রাধিকারযুক্ত বিজ্ঞপ্তির নিচে দেখানো হয়। সবসময় সাইলেন্ট।" - "অগ্রাধিকারযুক্ত বিজ্ঞপ্তির নিচে দেখানো হয়। সবসময় সাইলেন্ট।" - "সাউন্ড ও স্ট্যাটাস বার আইকনের সাহায্যে দৃষ্টি আকর্ষণ করে। এটি লক স্ক্রিনে দেখা যায়।" + "সাইলেন্ট" + "সতর্ক করুন" + "সাউন্ড বা ভাইব্রেশন ছাড়া ফোকাস করতে আপনাকে সাহায্য করে।" + "সাউন্ড বা ভাইব্রেশনের সাহায্যে দৃষ্টি আকর্ষণ করে।" "এই বিজ্ঞপ্তিগুলি পরিবর্তন করা যাবে না।" "এই সমস্ত বিজ্ঞপ্তিকে এখানে কনফিগার করা যাবে না" "প্রক্সি করা বিজ্ঞপ্তি" @@ -908,8 +899,7 @@ "অনুমতি দিন" "খারিজ করুন" "ব্যাটারি সেভার চালু হওয়ার সময় সেট করতে ট্যাপ করুন" - - + "ব্যাটারির চার্জ শেষ হয়ে যাওয়ার সম্ভাবনা দেখা দিলে চালু করুন" "না থাক" "আগে সেট করা সময় অনুযায়ী ব্যাটারি সেভার চালু হয়েছে" "চার্জ %d%%-এর নিচে চলে গেলে ব্যাটারি সেভার নিজে থেকেই চালু হয়ে যাবে।" @@ -942,4 +932,8 @@ "নিচে বাঁদিকে সরান" "নিচে ডান দিকে সরান" "খারিজ করুন" + + + + diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index e0ef1bd1166b..8a02f16e9058 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -62,12 +62,10 @@ "Otklanjanje grešaka putem uređaja spojenog na USB nije dozvoljeno" "Korisnik koji je trenutno prijavljen na ovaj uređaj ne može uključiti opciju za otklanjanje grešaka koristeći USB. Da koristite tu funkciju, prebacite se na primarnog korisnika." "USB priključak je onemogućen" - - + "USB priključak je onemogućen kako bi se vaš uređaj zaštitio od tečnosti i nečistoća i neće detektirati priključene uređaje.\n\nDobit ćete obavještenje kada ponovo bude sigurno koristiti USB priključak." "USB priključak je omogućen za prepoznavanje punjača i pribora" "Omogući USB" - - + "Saznajte više" "Uvećaj prikaz na ekran" "Razvuci prikaz na ekran" "Snimak ekrana" @@ -461,10 +459,8 @@ "Ne prikazuj opet" "Očisti sve" "Upravljaj" - - - - + "Nečujna obavještenja" + "Obriši sva nečujna obavještenja" "Obavještenja su pauzirana načinom rada Ne ometaj" "Započni odmah" "Nema obavještenja" @@ -650,21 +646,16 @@ "Blokiraj" "Nastavi prikazivanje" "Minimiziraj" - - + "Nečujno" "Ostani u nečujnom načinu rada" - - + "Upozorenja" "Nastavi upozoravati" "Isključi obavještenja" "Nastaviti prikazivanje obavještenja iz ove aplikacije?" - "Diskretno" - "Prioritetno" - "Pomaže vam da se fokusirate prikazujući obavještenja samo na padajućoj traci. Uvijek nečujno." - "Prikazuje se ispod prioritetnih obavještenja. Uvijek nečujno." - "Prikazuje se ispod prioritetnih obavještenja. Uvijek nečujno." - "Prikazuje se ispod prioritetnih obavještenja. Uvijek nečujno." - "Privlači vašu pažnju pomoću zvuka i ikone na statusnoj traci. Prikazuje se na zaključanom ekranu." + "Nečujno" + "Upozorenja" + "Pomaže vam da se koncentrirate bez zvuka ili vibracije." + "Privlači vašu pažnju pomoću zvuka ili vibracije." "Ta obavještenja se ne mogu izmijeniti." "Ovdje nije moguće konfigurirati ovu grupu obavještenja" "Obavještenje preko proksi servera" @@ -915,8 +906,7 @@ "Dozvoli" "Odbij" "Dodirnite da zakažete Uštedu baterije" - - + "Uključite ako je vjerovatno da će se baterija istrošiti" "Ne, hvala" "Zakazivanje Uštede baterije je uključeno" "Kada je baterija ispod %d%%, Ušteda baterije se automatski uključuje." @@ -949,4 +939,8 @@ "Pomjeri dolje lijevo" "Pomjerite dolje desno" "Odbaci" + + + + diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 19be8295d735..4c5272247466 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -62,12 +62,10 @@ "No es permet la depuració per USB" "L\'usuari que té iniciada la sessió al dispositiu en aquest moment no pot activar la depuració per USB. Per utilitzar aquesta funció, cal canviar a l\'usuari principal." "El port USB està desactivat" - - + "Per protegir el teu dispositiu dels líquids o de la pols, el port USB s\'ha desactivat i no detectarà cap accessori.\n\nRebràs una notificació quan puguis tornar a utilitzar-lo." "S\'ha activat el port USB per detectar carregadors i accessoris" "Activa l\'USB" - - + "Més informació" "Zoom per omplir pantalla" "Estira per omplir pant." "Captura de pantalla" @@ -458,10 +456,8 @@ "No ho tornis a mostrar" "Esborra-ho tot" "Gestió" - - - - + "Notificacions silencioses" + "Esborra totes les notificacions silencioses" "Notificacions pausades pel mode No molestis" "Comença ara" "Cap notificació" @@ -546,7 +542,7 @@ "Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, mantén premut el botó d\'inici." "Per deixar de fixar aquesta pantalla, mantén premuts els botons Enrere i Aplicacions recents" "Per deixar de fixar aquesta pantalla, mantén premuts els botons Enrere i Inici" - "D\'acord" + "Entesos" "No, gràcies" "S\'ha fitxat la pantalla" "S\'ha deixat de fixar la pantalla" @@ -610,7 +606,7 @@ "Diversió per a uns quants, però no per a tothom" "El Personalitzador d\'interfície d\'usuari presenta opcions addicionals per canviar i personalitzar la interfície d\'usuari d\'Android. És possible que aquestes funcions experimentals canviïn, deixin de funcionar o desapareguin en versions futures. Continua amb precaució." "És possible que aquestes funcions experimentals canviïn, deixin de funcionar o desapareguin en versions futures. Continua amb precaució." - "D\'acord" + "Entesos" "Enhorabona! El Personalitzador d\'interfície d\'usuari s\'ha afegit a Configuració." "Treu de Configuració" "Vols suprimir el Personalitzador d\'interfície d\'usuari de Configuració i deixar d\'utilitzar-ne totes les funcions?" @@ -645,21 +641,16 @@ "Bloqueja" "Continua rebent" "Minimitza" - - + "Silencioses" "Continua silenciant" - - + "Alertes" "Continua avisant-me" "Desactiva les notificacions" "Vols continuar rebent notificacions d\'aquesta aplicació?" - "Discreta" - "Prioritàries" - "T\'ajuda a concentrar-te perquè les notificacions només es mostren a l\'àrea desplegable. Sempre en silenci." - "Es mostren a sota de les notificacions prioritàries. Sempre silencioses." - "Es mostren a sota de les notificacions prioritàries. Sempre silencioses." - "Es mostren a sota de les notificacions prioritàries. Sempre silencioses." - "Atrauen la teva atenció amb un so i una icona a la barra d\'estat. Es mostren a la pantalla de bloqueig." + "Silenci" + "Alertes" + "T\'ajuda a concentrar-te sense so ni vibració." + "Atrau la teva atenció amb so i vibració." "Aquestes notificacions no es poden modificar." "Aquest grup de notificacions no es pot configurar aquí" "Notificació mitjançant aplicació intermediària" @@ -908,13 +899,12 @@ "Permet" "Denega" "Toca per programar l\'estalvi de bateria" - - + "Activa\'l quan sigui probable que et quedis sense bateria" "No" "S\'ha activat la programació de l\'estalvi de bateria" "L\'estalvi de bateria s\'activarà automàticament quan el nivell de bateria sigui inferior al %d%%." "Configuració" - "D\'acord" + "Entesos" "Aboca espai de SysUI" "%1$s està fent servir el següent: %2$s." "Algunes aplicacions estan fent servir el següent: %s." @@ -942,4 +932,8 @@ "Mou a baix a l\'esquerra" "Mou a baix a la dreta" "Omet" + + + + diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 266ba15cec9e..4afe0c524070 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -62,12 +62,10 @@ "Ladění přes USB není povoleno" "Uživatel aktuálně přihlášený k tomuto zařízení nemůže zapnout ladění přes USB. Chcete-li tuto funkci použít, přepněte na primárního uživatele." "Port USB je deaktivován" - - + "Kvůli ochraně vašeho zařízení před tekutinami a nečistotami je port USB zakázán a nerozpozná žádné příslušenství.\n\nAž bude opět bezpečné port USB použít, budeme vás informovat." "Port USB může zjišťovat nabíječky a příslušenství" "Aktivovat USB" - - + "Další informace" "Přiblížit na celou obrazovku" "Na celou obrazovku" "Snímek obrazovky" @@ -464,10 +462,8 @@ "Tuto zprávu příště nezobrazovat" "Smazat vše" "Spravovat" - - - - + "Tichá oznámení" + "Vymazat všechna tichá oznámení" "Oznámení jsou pozastavena režimem Nerušit" "Spustit" "Žádná oznámení" @@ -651,21 +647,16 @@ "Blokovat" "Nadále zobrazovat" "Minimalizovat" - - + "Tiché" "Nadále bez zvuku" - - + "Upozorňovat" "Dál upozorňovat" "Vypnout oznámení" "Mají se oznámení z této aplikace nadále zobrazovat?" - "Nenápadná" - "Prioritní" - "Budete se moci lépe soustředit, protože oznámení se budou zobrazovat pouze na vysouvacím panelu. Vždy tichý režim." - "Níže zobrazit prioritní oznámení. Vždy tichý režim." - "Níže zobrazit prioritní oznámení. Vždy tichý režim." - "Níže zobrazit prioritní oznámení. Vždy tichý režim." - "Upozorní vás pomocí zvuku a ikony na stavovém řádku. Zobrazit na obrazovce uzamčení." + "Ticho" + "Upozornění" + "Pomáhá vám soustředit se vypnutím zvuku a vibrací." + "Upozorňuje vás pomocí zvuku a vibrací." "Tato oznámení nelze upravit." "Tuto skupinu oznámení tady nelze nakonfigurovat" "Zprostředkované oznámení" @@ -918,8 +909,7 @@ "Povolit" "Zamítnout" "Klepnutím naplánujete aktivování spořiče baterie" - - + "Zapnout, když bude pravděpodobné, že se vybije baterie" "Ne, díky" "Plánované aktivování spořiče baterie je zapnuté" "Spořič baterie se automaticky aktivuje, jakmile baterie klesne pod %d %%." @@ -952,4 +942,8 @@ "Přesunout vlevo dolů" "Přesunout vpravo dolů" "Zavřít" + + + + diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 0bf19bec7c25..702fdcf9a729 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -62,12 +62,10 @@ "USB-fejlretning er ikke tilladt" "Den bruger, der i øjeblikket er logget ind på denne enhed, kan ikke aktivere USB-fejlretning. Skift til den primære bruger for at bruge denne funktion." "USB-porten er deaktiveret" - - + "USB-porten er blevet deaktiveret for at beskytte din enhed mod væske og snavs. Den kan derfor ikke registrere noget tilbehør.\n\nDu får besked, når du kan bruge USB-porten igen." "USB-porten er aktiveret for at registrere opladere og tilbehør" "Aktivér USB" - - + "Få flere oplysninger" "Zoom til fuld skærm" "Stræk til fuld skærm" "Screenshot" @@ -100,7 +98,7 @@ "Isæt som et kamera (PTP)" "Installer appen Android Filoverførsel til Mac" "Tilbage" - "Startskærm" + "Hjem" "Menu" "Hjælpefunktioner" "Roter skærmen" @@ -458,10 +456,8 @@ "Vis ikke igen" "Ryd alle" "Administrer" - - - - + "Lydløse notifikationer" + "Ryd alle lydløse notifikationer" "Notifikationer er sat på pause af Forstyr ikke" "Start nu" "Ingen notifikationer" @@ -645,21 +641,16 @@ "Bloker" "Fortsæt med at vise notifikationer" "Minimer" - - + "Lydløs" "Fortsæt med lydløse notifikationer" - - + "Underretninger" "Fortsæt med at underrette" "Deaktiver notifikationer" "Vil du fortsætte med at se notifikationer fra denne app?" - "Diskret" - "Prioriteret" - "Hjælper dig med at fokusere på de vigtige ting, da notifikationerne kun vises i panelet, der trækkes ned. Altid lydløs." - "Viser notifikationer med lav prioritet. Altid lydløs." - "Viser notifikationer med lav prioritet. Altid lydløs." - "Viser notifikationer med lav prioritet. Altid lydløs." - "Fanger din opmærksomhed med lyd og ikoner i statusbjælken. Vises på låseskærmen." + "Lydløs" + "Underretninger" + "Ingen lyde eller vibrationer, der forstyrrer dig." + "Fanger din opmærksomhed med lyd eller vibration." "Disse notifikationer kan ikke redigeres." "Du kan ikke konfigurere denne gruppe notifikationer her" "Proxyforbundet notifikation" @@ -908,8 +899,7 @@ "Tillad" "Afvis" "Tryk for at fastsætte en tidsplan for batterisparefunktionen" - - + "Aktivér, når det ser ud til, at batteriet løber tør" "Nej tak" "Tidsplanen for batterisparefunktionen er aktiveret" "Batterisparefunktionen aktiveres automatisk, når batteriniveauet når under %d %%." @@ -942,4 +932,8 @@ "Flyt ned til venstre" "Flyt ned til højre" "Afvis" + + + + diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 5c21ea3b9d61..a1a01dfdd06c 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -62,12 +62,10 @@ "USB-Debugging nicht zulässig" "Der momentan auf diesem Gerät angemeldete Nutzer kann das USB-Debugging nicht aktivieren. Um diese Funktion verwenden zu können, wechsle zum primären Nutzer." "USB-Port deaktiviert" - - + "Zum Schutz deines Geräts vor Flüssigkeiten oder Fremdkörpern ist der USB-Port zurzeit deaktiviert und erkennt kein Zubehör.\n\nDu wirst benachrichtigt, wenn der USB-Port wieder verwendet werden kann." "Erkennung von Ladegeräten und Zubehör am USB-Port aktiviert" "USB aktivieren" - - + "Weitere Informationen" "Zoom auf Bildschirmgröße" "Auf Bildschirmgröße anpassen" "Screenshot" @@ -462,10 +460,8 @@ "Nicht mehr anzeigen" "Alle löschen" "Verwalten" - - - - + "Lautlose Benachrichtigungen" + "Alle lautlosen Benachrichtigungen löschen" "Benachrichtigungen durch \"Bitte nicht stören\" pausiert" "Jetzt starten" "Keine Benachrichtigungen" @@ -542,7 +538,7 @@ "aktivieren" "deaktivieren" "Ausgabegerät wechseln" - "Bildschirm ist fixiert" + "Der Bildschirm ist angpinnt" "Der Bildschirm bleibt so lange eingeblendet, bis du die Fixierung aufhebst. Berühre und halte dazu \"Zurück\" und \"Übersicht\"." "Der Bildschirm wird so lange angezeigt, bis du die Fixierung aufhebst. Berühre und halte dazu \"Zurück\" und \"Startbildschirm\"." "Der Bildschirm wird so lange angezeigt, bis du die Fixierung aufhebst. Dazu wischst du nach oben und hältst den Bildschirm gedrückt" @@ -552,7 +548,7 @@ "Um die Fixierung für diesen Bildschirm aufzuheben, berühre und halte \"Zurück\" und \"Startbildschirm\"" "Ok" "Nein danke" - "Bildschirm fixiert" + "Der Bildschirm ist angepinnt" "Fixierung für Bildschirm aufgehoben" "%1$s ausblenden?" "Sie wird wieder eingeblendet, wenn du sie in den Einstellungen erneut aktivierst." @@ -649,21 +645,16 @@ "Blockieren" "Weiterhin anzeigen" "Minimieren" - - + "Lautlos" "Weiter lautlos bleiben" - - + "Benachrichtigen" "Weiterhin Benachrichtigungen senden" "Benachrichtigungen deaktivieren" "Benachrichtigungen dieser App weiterhin anzeigen?" - "Stumm" - "Priorisiert" - "Benachrichtigungen erscheinen nur in der Benachrichtigungsleiste. So kannst du dich besser konzentrieren. Immer lautlos." - "Erscheinen unter den wichtigen Benachrichtigungen. Immer lautlos." - "Erscheinen unter den wichtigen Benachrichtigungen. Immer lautlos." - "Erscheinen unter den wichtigen Benachrichtigungen. Immer lautlos." - "Benachrichtigungen werden mit einem Ton und einem Statusleistensymbol angekündigt. Erscheinen auf dem Sperrbildschirm." + "Lautlos" + "Benachrichtigen" + "Benachrichtigungen werden ohne Ton oder Vibration angekündigt, um deine Konzentration nicht zu stören." + "Benachrichtigungen werden mit einem Ton oder einer Vibration angekündigt, um dich auf sie aufmerksam zu machen." "Diese Benachrichtigungen können nicht geändert werden." "Die Benachrichtigungsgruppe kann hier nicht konfiguriert werden" "Weitergeleitete Benachrichtigung" @@ -912,8 +903,7 @@ "Zulassen" "Ablehnen" "Tippen zum Planen des Energiesparmodus" - - + "Aktivieren, wenn der Akku wahrscheinlich nicht mehr lange hält" "Nein danke" "Geplanter Energiesparmodus aktiviert" "Der Energiesparmodus wird bei einem Akkustand von %d %% automatisch aktiviert." @@ -946,4 +936,8 @@ "Nach unten links verschieben" "Nach unten rechts verschieben" "Schließen" + + + + diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 775f9b167b8b..0a8707859b8d 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -647,13 +647,10 @@ "Να συνεχιστούν οι ειδοποιήσεις" "Απενεργοποίηση ειδοποιήσεων" "Να συνεχίσουν να εμφανίζονται ειδοποιήσεις από αυτήν την εφαρμογή;" - "Διακριτικές" - "Προτεραιότητας" - "Σας βοηθάει να συγκεντρωθείτε με ειδοποιήσεις που εμφανίζονται μόνο στο αναπτυσσόμενο πλαίσιο σκίασης. Πάντα σε σίγαση." - "Εμφανίζεται κάτω από ειδοποιήσεις προτεραιότητας. Πάντα σε σίγαση." - "Εμφανίζεται κάτω από ειδοποιήσεις προτεραιότητας. Πάντα σε σίγαση." - "Εμφανίζεται κάτω από ειδοποιήσεις προτεραιότητας. Πάντα σε σίγαση." - "Τραβάει την προσοχή σας με ήχους και ένα εικονίδιο γραμμής κατάστασης. Εμφανίζεται στην οθόνη κλειδώματος." + "Σίγαση" + "Ειδοποίηση" + "Σας βοηθά να συγκεντρωθείτε χωρίς ήχο και δόνηση." + "Τραβά την προσοχή σας με ήχο ή δόνηση." "Δεν είναι δυνατή η τροποποίηση αυτών των ειδοποιήσεων" "Δεν είναι δυνατή η διαμόρφωση αυτής της ομάδας ειδοποιήσεων εδώ" "Ειδοποίηση μέσω διακομιστή μεσολάβησης" @@ -935,4 +932,8 @@ "Μετακίνηση κάτω αριστερά" "Μετακίνηση κάτω δεξιά" "Παράβλεψη" + + + + diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index ed2c0a07ebb2..2b836ec5a87f 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -647,13 +647,10 @@ "Keep alerting" "Turn off notifications" "Keep showing notifications from this app?" - "Gentle" - "Prioritised" - "Helps you focus with notifications only in the pull-down shade. Always silent." - "Displays below priority notifications. Always silent." - "Displays below priority notifications. Always silent." - "Displays below priority notifications. Always silent." - "Gets your attention with sound and a status bar icon. Shows on lock screen." + "Silent" + "Alerting" + "Helps you focus without sound or vibration." + "Gets your attention with sound or vibration." "These notifications can\'t be modified." "This group of notifications cannot be configured here" "Proxied notification" @@ -935,4 +932,8 @@ "Move bottom left" "Move bottom right" "Dismiss" + + + + diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index c67a491c579e..3409611c7b53 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -647,13 +647,10 @@ "Keep alerting" "Turn off notifications" "Keep showing notifications from this app?" - "Gentle" - "Prioritised" - "Helps you focus with notifications only in the pull-down shade. Always silent." - "Displays below priority notifications. Always silent." - "Displays below priority notifications. Always silent." - "Displays below priority notifications. Always silent." - "Gets your attention with sound and a status bar icon. Shows on lock screen." + "Silent" + "Alerting" + "Helps you focus without sound or vibration." + "Gets your attention with sound or vibration." "These notifications can\'t be modified." "This group of notifications cannot be configured here" "Proxied notification" @@ -935,4 +932,8 @@ "Move bottom left" "Move bottom right" "Dismiss" + + + + diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index ed2c0a07ebb2..2b836ec5a87f 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -647,13 +647,10 @@ "Keep alerting" "Turn off notifications" "Keep showing notifications from this app?" - "Gentle" - "Prioritised" - "Helps you focus with notifications only in the pull-down shade. Always silent." - "Displays below priority notifications. Always silent." - "Displays below priority notifications. Always silent." - "Displays below priority notifications. Always silent." - "Gets your attention with sound and a status bar icon. Shows on lock screen." + "Silent" + "Alerting" + "Helps you focus without sound or vibration." + "Gets your attention with sound or vibration." "These notifications can\'t be modified." "This group of notifications cannot be configured here" "Proxied notification" @@ -935,4 +932,8 @@ "Move bottom left" "Move bottom right" "Dismiss" + + + + diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index ed2c0a07ebb2..2b836ec5a87f 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -647,13 +647,10 @@ "Keep alerting" "Turn off notifications" "Keep showing notifications from this app?" - "Gentle" - "Prioritised" - "Helps you focus with notifications only in the pull-down shade. Always silent." - "Displays below priority notifications. Always silent." - "Displays below priority notifications. Always silent." - "Displays below priority notifications. Always silent." - "Gets your attention with sound and a status bar icon. Shows on lock screen." + "Silent" + "Alerting" + "Helps you focus without sound or vibration." + "Gets your attention with sound or vibration." "These notifications can\'t be modified." "This group of notifications cannot be configured here" "Proxied notification" @@ -935,4 +932,8 @@ "Move bottom left" "Move bottom right" "Dismiss" + + + + diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index d5c5a44aebf5..416931db3c6c 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -647,13 +647,10 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‏‎‎‏‎‏‏‏‏‎‎‏‏‎‎‏‏‎‎‎‎‏‏‎‏‎Keep alerting‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‏‏‏‏‎‎‏‏‎‎‏‏‏‎‏‏‏‎‏‎‎‏‎‎‏‎‎‎‏‎‎‎‏‎‎‎‎‎‏‎‎‏‎‏‏‏‎‎‏‏‎Turn off notifications‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‏‎‏‎‏‎‎‏‎‎‏‎‎‎‏‏‎‏‏‎‎‎‎‎‎‎‏‎‎‎‏‏‎‏‎‎‎‏‎‎‎‎‎‏‎Keep showing notifications from this app?‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‎‏‎‎‏‎‎‎‎‎‎‏‎‏‏‎‎‎‎‏‎‏‎‏‏‏‎‏‎‎‎‎‏‎‏‎‎Gentle‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‎‎‎‏‏‎‎‎‎‎‏‏‏‏‎‏‎‎‎‏‎‎‏‏‎‎‎‏‎‎‏‏‏‎‏‎Prioritized‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‏‎‎‏‎‏‎‏‎‎‎‏‏‎‏‎‏‎‎‏‎‏‏‏‎‏‏‎‎‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‎‎‎‎‎‎‏‎‏‎‎‎Helps you focus with notifications only in the pull-down shade. Always silent.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‎‎‎‎‎‎‎‎‏‎‎‏‏‎‏‎‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‎‏‎‏‎‏‎‏‎‎‎‏‏‎‏‎‎‏‎‏‏‎Displays below priority notifications. Always silent.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‏‏‏‏‎‎‎‏‎‎‎‏‎‏‎‎‎‎‏‎‏‏‎‎‏‏‏‎‏‎‎‎‏‏‏‎‎‎‎‎‎‏‎‏‎‏‎‎‏‎‏‎‎Displays below priority notifications. Always silent.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‏‎‎‎‏‏‎‏‎‎‎‎‎‏‎‏‎‏‏‏‏‎‎‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‏‎‏‎‏‏‎‏‎‎‎‎‏‏‎Displays below priority notifications. Always silent.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‎‎‏‎‎‎‏‎‏‎‎‎‏‏‎‏‎‏‏‎‎‏‎‎‏‎‏‏‎‎‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‏‏‏‏‎‎‏‏‎Gets your attention with sound & a status bar icon. Shows on lock screen.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‏‏‎‎‏‏‎‏‎‏‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎‎‎‏‎‏‎‏‏‎‎‏‎Silent‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‎‏‎‏‎‏‏‎‎‎‏‎‎‎‏‏‏‎‎‎‎‏‎‎‏‎‏‎‏‎‏‎‎‎‎‏‏‎‎‏‎‎‏‎‎‎Alerting‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‎‎‎‎‏‎‏‎‏‏‎‎‏‎‎‏‏‏‎‏‎‎‎‎‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‏‎‎‎‏‏‏‎‏‏‎‎‎‏‏‎Helps you focus without sound or vibration.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‎‏‏‏‏‎‎‏‏‎‎‎‎‎‏‏‎‎‏‎‏‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‎‏‎‎‏‎‎Gets your attention with sound or vibration.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‏‎‏‎‏‏‎‎‏‎‎‎‏‏‎‎‎‎‏‎‎‏‏‎‎‏‎‎‎‏‎‏‎‎‏‎‎‎‎‎‏‎‎‎‎‎‎‎‏‏‎‎These notifications can\'t be modified.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‏‎‏‎‏‏‎‏‎‎‎‎‏‎‏‎‏‎‎‎‏‏‎‏‏‎‏‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‏‏‎‎This group of notifications cannot be configured here‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‎‏‎‎‎‏‎‎‎‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‎‎‏‏‏‎‏‎‏‎‎‏‎‏‏‎‎‏‏‏‎‎‎‏‏‏‏‏‎‎Proxied notification‎‏‎‎‏‎" @@ -935,4 +932,6 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‎‏‎‎‏‎‏‎‏‏‏‎‎‏‏‎‏‏‎‏‏‎‏‏‎‎‏‎‏‏‏‏‎‏‎‏‎‏‎‎‏‏‏‏‏‏‎‎‎‏‎Move bottom left‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‎‎‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‎‏‎‏‏‎‏‏‎‎‎‏‎‎‎‏‏‏‏‎‏‎‏‎‎‎‎‎‎‏‎‎‏‎Move bottom right‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‎‏‎‎‏‏‎‎‎‏‎‏‎‎‏‏‏‎‏‎‎‎‏‏‏‎‎‏‏‎‎‏‏‏‏‏‎‎‎‏‎‏‏‏‎‎‎‎‏‎‎‎Dismiss‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‏‎‏‏‏‏‎‏‎‎‏‎‎‎‏‎‏‏‎‎‎‏‎‏‏‎‏‏‏‎‎‎‏‏‏‎‎‎‏‎‎‏‏‎‏‎‎‏‏‏‎‎‎System navigation updated. To make changes, go to Settings.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‎‎‎‏‎‎‎‎‏‏‎‎‎‏‎‏‎‎‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‎‎‎‎Go to Settings to update system navigation‎‏‎‎‏‎" diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 924e59611b5d..96dd605b3b9c 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -62,12 +62,10 @@ "No tienes permitida la depuración por USB" "El usuario al que accediste en este dispositivo no puede activar la depuración por USB. Para usar esta función, debes cambiar al usuario principal." "Puerto USB inhabilitado" - - + "Para proteger tu dispositivo de líquidos o suciedad, el puerto USB está inhabilitado y no detectará ningún accesorio.\n\nTe avisaremos cuando puedas usar el puerto USB de nuevo." "Se habilitó el puerto USB para detectar cargadores y accesorios" "Habilitar USB" - - + "Más información" "Zoom para ocupar la pantalla" "Estirar p/ ocupar la pantalla" "Captura de pantalla" @@ -458,10 +456,8 @@ "No volver a mostrar" "Borrar todo" "Administrar" - - - - + "Notificaciones silenciosas" + "Borrar todas las notificaciones silenciosas" "Notificaciones pausadas por el modo \"No interrumpir\"" "Comenzar ahora" "No hay notificaciones" @@ -645,21 +641,16 @@ "Bloquear" "Seguir viendo" "Minimizar" - - + "Silencio" "Silenciar notificaciones" - - + "Alertas" "Seguir recibiendo alertas" "Desactivar notificaciones" "¿Quieres seguir viendo las notificaciones de esta app?" - "Discretas" - "Priorizadas" - "Te ayuda a concentrarte, ya que las notificaciones se muestran solo como banner desplegable. Siempre en silencio." - "Se muestra debajo de las notificaciones de prioridad. Siempre en silencio." - "Se muestra debajo de las notificaciones de prioridad. Siempre en silencio." - "Se muestra debajo de las notificaciones de prioridad. Siempre en silencio." - "Notificaciones que llaman la atención con sonido y un ícono en la barra de estado. Se muestra en la pantalla bloqueada." + "Silencio" + "Alertas" + "Te ayuda a concentrarte sin sonar ni vibrar." + "Capta tu atención con sonido o vibración." "No se pueden modificar estas notificaciones." "No se puede configurar aquí este grupo de notificaciones" "Notificación almacenada en proxy" @@ -908,8 +899,7 @@ "Permitir" "Rechazar" "Presiona para programar el Ahorro de batería" - - + "Actívalo cuando la batería se esté por acabar" "No, gracias" "Se activó la programación del Ahorro de batería" "El Ahorro de batería se activará automáticamente cuando quede menos de %d%% de batería." @@ -942,4 +932,8 @@ "Ubicar abajo a la izquierda" "Ubicar abajo a la derecha" "Ignorar" + + + + diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 25611bd6e36d..2129bd867ed6 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -62,12 +62,10 @@ "Depuración USB no permitida" "El usuario con el que se ha iniciado sesión en este dispositivo no puede activar la depuración USB. Para utilizar esta función, inicia sesión con la cuenta de usuario principal." "Puerto USB inhabilitado" - - + "Para proteger tu dispositivo de los líquidos y la suciedad, el puerto USB se ha inhabilitado y no detectará ningún accesorio.\n\nRecibirás una notificación cuando puedas volver a usarlo." "Puerto USB habilitado para detectar cargadores y accesorios" "Habilitar USB" - - + "Más información" "Zoom para ajustar" "Expandir para ajustar" "Captura de pantalla" @@ -458,10 +456,8 @@ "No volver a mostrar" "Borrar todo" "Gestionar" - - - - + "Notificaciones silenciadas" + "Borrar todas las notificaciones silenciadas" "Notificaciones pausadas por el modo No molestar" "Iniciar ahora" "No hay notificaciones" @@ -645,21 +641,16 @@ "Bloquear" "Seguir mostrando" "Minimizar" - - + "Silencio" "Silenciar notificaciones" - - + "Alertas" "Quiero seguir recibiendo alertas" "Desactivar notificaciones" "¿Quieres seguir viendo las notificaciones de esta aplicación?" - "Discretas" - "Priorizadas" - "Las notificaciones solo se muestran en la pantalla desplegable para que puedas concentrarte. Siempre en silencio." - "Muestra las notificaciones con prioridad baja. Siempre en silencio." - "Muestra las notificaciones con prioridad baja. Siempre en silencio." - "Muestra las notificaciones con prioridad baja. Siempre en silencio." - "Llama tu atención con sonido y un icono en la barra de estado. Se muestra en la pantalla de bloqueo." + "Silencio" + "Alertas" + "Te ayuda a concentrarte sin sonido ni vibración." + "Llama tu atención con sonido o vibración." "Estas notificaciones no se pueden modificar." "Este grupo de notificaciones no se puede configurar aquí" "Notificación mediante proxy" @@ -908,8 +899,7 @@ "Permitir" "Denegar" "Tocar para programar el modo Ahorro de batería" - - + "Activar cuando sea probable que se quede sin batería" "No, gracias" "Se ha activado la programación del modo Ahorro de batería" "El modo Ahorro de batería se activará automáticamente cuando quede menos de un %d %% de batería." @@ -942,4 +932,8 @@ "Mover abajo a la izquierda." "Mover abajo a la derecha" "Cerrar" + + + + diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 28641282e645..c9219e72c911 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -62,12 +62,10 @@ "USB-silumine pole lubatud" "Sellesse seadmesse praegu sisse logitud kasutaja ei saa USB-silumist sisse lülitada. Selle funktsiooni kasutamiseks vahetage peamisele kasutajale." "USB-port on keelatud" - - + "Selleks et kaitsta teie seadet vedeliku või mustuse eest, on USB-port keelatud ja see ei tuvasta lisatarvikuid.\n\nKui USB-porti tohib taas kasutada, saate selle kohta märguande." "USB-pordil on lubatud tuvastada laadijaid ja tarvikuid" "Luba USB" - - + "Lisateave" "Suumi ekraani täitmiseks" "Venita ekraani täitmiseks" "Ekraanipilt" @@ -458,10 +456,8 @@ "Ära kuva uuesti" "Tühjenda kõik" "Haldamine" - - - - + "Hääletud märguanded" + "Kustuta kõik hääletud märguanded" "Režiim Mitte segada peatas märguanded" "Alusta kohe" "Märguandeid pole" @@ -645,21 +641,16 @@ "Blokeeri" "Jätka kuvamist" "Minimeeri" - - + "Hääletu" "Kuva helita" - - + "Teavitamine" "Teavita ka edaspidi" "Lülita märguanded välja" "Kas jätkata selle rakenduse märguannete kuvamist?" - "Leebe" - "Prioriseeritud" - "Aitab teil allatõmmatavas menüüs ainult märguannetele keskenduda. Alati vaikne." - "Kuvatakse prioriteetsete märguannete all. Alati vaikne." - "Kuvatakse prioriteetsete märguannete all. Alati vaikne." - "Kuvatakse prioriteetsete märguannete all. Alati vaikne." - "Haarab teie tähelepanu heli ja olekuriba ikooni abil. Kuvatakse lukustuskuval." + "Hääletu" + "Teavitamine" + "Aitab teil keskenduda (heli või vibreerimine puudub)." + "Haarab heli või vibreerimisega teie tähelepanu." "Neid märguandeid ei saa muuta." "Seda märguannete rühma ei saa siin seadistada" "Puhvriga märguanne" @@ -908,8 +899,7 @@ "Luba" "Keela" "Puudutage akusäästja ajastamiseks" - - + "Lülitatakse sisse, kui aku hakkab tühjaks saama" "Tänan, ei" "Automaatne akusäästja on sisse lülitatud" "Kui aku tase langeb alla %d%%, lülitub akusäästja automaatselt sisse." @@ -942,4 +932,8 @@ "Teisalda alla vasakule" "Teisalda alla paremale" "Loobu" + + + + diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 1feb1b11615d..9dea61fd8f84 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -62,12 +62,10 @@ "Ez da onartzen USB arazketa" "Gailu honetan saioa hasita duen erabiltzaileak ezin du aktibatu USB arazketa. Eginbide hori erabiltzeko, aldatu erabiltzaile nagusira." "Desgaitu egin da USB ataka" - - + "USB ataka desgaitu egin da gailua likido edo zikinkeriengandik babesteko, eta ez du hautemango osagarririk.\n\nJakinarazpen bat jasoko duzu USB ataka berriz erabiltzeko moduan dagoenean." "USB ataka gaitu da kargagailuak eta osagarriak hautemateko" "Gaitu USB ataka" - - + "Lortu informazio gehiago" "Handiagotu pantaila betetzeko" "Luzatu pantaila betetzeko" "Pantaila-argazkia" @@ -458,10 +456,8 @@ "Ez erakutsi berriro" "Garbitu guztiak" "Kudeatu" - - - - + "Soinurik gabeko jakinarazpenak" + "Garbitu soinurik gabeko jakinarazpen guztiak" "\"Ez molestatu\" moduak pausatu egin ditu jakinarazpenak" "Hasi" "Ez dago jakinarazpenik" @@ -645,21 +641,16 @@ "Blokeatu" "Jarraitu erakusten" "Minimizatu" - - + "Soinurik gabe" "Jarraitu isilik" - - + "Alertak" "Jarraitu jakinarazpenak bidaltzen" "Desaktibatu jakinarazpenak" "Aplikazio honen jakinarazpenak erakusten jarraitzea nahi duzu?" - "Jakinarazi soinurik gabe" - "Lehentasunezkoak" - "Pantailaren goialdeko goitibeherako barran bakarrik erakusten ditu jakinarazpenak, arretarik gal ez dezazun. Beti isilik." - "Lehentasunik ez duten jakinarazpenak erakusten ditu. Beti isilik." - "Lehentasunik ez duten jakinarazpenak erakusten ditu. Beti isilik." - "Lehentasunik ez duten jakinarazpenak erakusten ditu. Beti isilik." - "Arretari dei egiten dio soinua eginda eta egoera-barran ikonoa erakutsita. Pantaila blokeatua agertzen da." + "Isila" + "Ohartarazlea" + "Ez du egiten soinu edo dardararik, arretarik gal ez dezazun." + "Arreta erakartzen du soinua eta dardara eginda." "Jakinarazpen horiek ezin dira aldatu." "Jakinarazpen talde hau ezin da konfiguratu hemen" "Proxy bidezko jakinarazpena" @@ -908,8 +899,7 @@ "Baimendu" "Ukatu" "Sakatu bateria-aurrezlea noiz aktibatu antolatzeko" - - + "Aktibatu aurrezlea bateria agortzeko arriskua dagoenean" "Ez" "Bateria-aurrezlea aktibatu da" "Bateria-aurrezlea automatikoki aktibatuko da bateriaren %% %d gelditzen denean." @@ -942,4 +932,8 @@ "Eraman behealdera, ezkerretara" "Eraman behealdera, eskuinetara" "Baztertu" + + + + diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index e161b7732e56..e405afe44068 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -62,12 +62,10 @@ "‏اشکال‌زدایی USB مجاز نیست" "‏کاربری که درحال حاضر در این دستگاه وارد سیستم شده است نمی‌تواند اشکال‌زدایی USB را روشن کند. برای استفاده از این قابلیت، به کاربر اصلی تغییر وضعیت دهید." "‏درگاه USB غیرفعال شده است" - - + "‏برای محافظت از دستگاهتان دربرابر مایعات یا خاکروبه، درگاه USB غیرفعال شده است و هیچ‌کدام از لوازم جانبی را شناسایی نخواهد کرد.\n\nهرزمان که استفاده از درگاه USB امکان‌پذیر باشد، به شما اطلاع داده می‌شود." "‏درگاه USB برای تشخیص شارژرها و لوازم جانبی فعال شد" "‏فعال کردن USB" - - + "بیشتر بدانید" "بزرگ‌نمایی برای پر کردن صفحه" "گسترده کردن برای پر کردن صفحه" "عکس صفحه‌نمایش" @@ -458,10 +456,8 @@ "دوباره نشان داده نشود" "پاک کردن همه موارد" "مدیریت" - - - - + "اعلان‌های بی‌صدا" + "پاک کردن همه اعلان‌های بی‌صدا" "اعلان‌ها توسط «مزاحم نشوید» موقتاً متوقف شدند" "اکنون شروع شود" "اعلانی موجود نیست" @@ -645,21 +641,16 @@ "مسدود کردن" "همچنان نشان داده شود" "کوچک کردن" - - + "بی‌صدا" "بی‌صدا بماند" - - + "هشدار دادن" "همچنان اطلاع داده شود" "خاموش کردن اعلان‌ها" "نمایش اعلان از این برنامه ادامه یابد؟" - "آرام" - "دراولویت" - "با فقط نمایش اعلان در کشوی اعلان‌های پایین‌کش، به شما کمک می‌کند تمرکزتان را ازدست ندهید همیشه بی‌صدا." - "اعلان‌های با اولویت پایین را نشان می‌دهد. همیشه بی‌صدا." - "اعلان‌های با اولویت پایین را نشان می‌دهد. همیشه بی‌صدا." - "اعلان‌های با اولویت پایین را نشان می‌دهد. همیشه بی‌صدا." - "با صدا و نماد نوار وضعیت توجه شما را جلب می‌کند. در صفحه قفل نشان داده می‌شود." + "بی‌صدا" + "هشدار دادن" + "به شما کمک می‌کند بدون صدا یا لرزش تمرکز کنید." + "با صدا یا لرزش توجه شما را جلب می‌کند." "این اعلان‌ها قابل اصلاح نیستند." "نمی‌توانید این گروه اعلان‌ها را در اینجا پیکربندی کنید" "اعلان‌های دارای پراکسی" @@ -908,8 +899,7 @@ "مجاز" "رد کردن" "برای زمان‌بندی «بهینه‌سازی باتری» ضربه بزنید" - - + "وقتی باتری روبه‌اتمام است، بهینه‌سازی باتری را روشن کنید" "نه متشکرم" "زمان‌بندی «بهینه‌سازی باتری» روشن شد" "وقتی شارژ باتری به زیر %d%% برسد، «بهینه‌سازی باتری» به‌طور خودکار روشن می‌شود." @@ -942,4 +932,8 @@ "انتقال به پایین سمت راست" "انتقال به پایین سمت چپ" "رد کردن" + + + + diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 54d2d938507c..4e52a4ee491d 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -62,12 +62,10 @@ "USB-vianetsintää ei sallita" "Laitteelle tällä hetkellä kirjautunut käyttäjä ei voi ottaa USB-vianetsintää käyttöön. Vaihda käyttäjäksi ensisijainen käyttäjä, jotta voit käyttää tätä ominaisuutta." "USB-portti poistettu käytöstä" - - + "Laitteen suojaamiseksi nesteiltä ja lialta USB-portti on poistettu käytöstä, eikä se havaitse lisävarusteita.\n\nSaat ilmoituksen, kun USB-porttia voi taas käyttää." "USB-portti on käytössä ja voi havaita latureita sekä lisävarusteita" "Ota USB käyttöön" - - + "Lue lisää" "Zoomaa koko näyttöön" "Venytä koko näyttöön" "Kuvakaappaus" @@ -458,10 +456,8 @@ "Älä näytä uudelleen" "Poista kaikki" "Muuta asetuksia" - - - - + "Hiljaiset ilmoitukset" + "Tyhjennä kaikki hiljaiset ilmoitukset" "Älä häiritse ‑tila keskeytti ilmoitukset" "Aloita nyt" "Ei ilmoituksia" @@ -645,21 +641,16 @@ "Estä" "Jatka näyttämistä" "Pienennä" - - + "Äänetön" "Jatka äänettömyyttä" - - + "Hälyttää" "Jatka ilmoituksista hälyttämistä" "Poista ilmoitukset käytöstä" "Jatketaanko ilmoitusten näyttämistä tästä sovelluksesta?" - "Varovainen" - "Priorisoitu" - "Keskittyminen on helpompaa, sillä ilmoitukset näkyvät vain alas vedettävällä alueella. Aina äänetön." - "Näytetään priorisoitujen ilmoitusten alapuolella. Aina äänetön." - "Näytetään priorisoitujen ilmoitusten alapuolella. Aina äänetön." - "Näytetään priorisoitujen ilmoitusten alapuolella. Aina äänetön." - "Kiinnittää huomion äänellä ja tilapalkin kuvakkeella. Näkyy lukitusnäytöllä." + "Äänetön" + "Hälyttää" + "Keskittyminen on helpompaa ilman ääntä tai värinää." + "Kiinnittää huomion ilman ääntä tai värinää." "Näitä ilmoituksia ei voi muokata" "Tätä ilmoitusryhmää ei voi määrittää tässä" "Välitetty ilmoitus" @@ -908,8 +899,7 @@ "Salli" "Estä" "Ajoita virransäästö napauttamalla" - - + "Ota käyttöön, jos akku todennäköisesti loppuu" "Ei kiitos" "Virransäästön ajoitus otettu käyttöön" "Virransäästö käynnistyy automaattisesti, kun akun lataustaso on alle %d %%." @@ -942,4 +932,8 @@ "Siirrä vasempaan alareunaan" "Siirrä oikeaan alareunaan" "Ohita" + + + + diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index a904d3068973..4f6c1b561d1b 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -62,12 +62,10 @@ "Débogage USB non autorisé" "L\'utilisateur actuellement connecté sur cet appareil ne peut pas activer le débogage USB. Pour utiliser cette fonctionnalité, l\'utilisateur principal doit se connecter." "Le port USB a été désactivé" - - + "Pour protéger votre appareil des liquides et des débris, le port USB est désactivé et ne pourra pas détecter les accessoires.\n\nVous verrez une notification lorsque vous pourrez utiliser le port USB à nouveau." "Le port USB a été activé afin de détecté les chargeurs et les accessoires" "Activer l\'USB" - - + "En savoir plus" "Zoomer pour remplir l\'écran" "Étirer pour remplir l\'écran" "Capture d\'écran" @@ -458,10 +456,8 @@ "Ne plus afficher" "Tout effacer" "Gérer" - - - - + "Notifications silencieuses" + "Effacer toutes les notifications silencieuses" "Les notifications sont suspendues par le mode Ne pas déranger" "Commencer" "Aucune notification" @@ -645,21 +641,16 @@ "Bloquer" "Continuer à afficher" "Réduire" - - + "Mode silencieux" "Continuer d\'util. mode silencieux" - - + "Alertes" "Continuer d\'envoyer des alertes" "Désactiver les notifications" "Continuer à afficher les notifications de cette application?" - "Discrètes" - "Priorisées" - "Vous aide à vous concentrer en affichant seulement les notifications dans le volet déroulant. Toujours silencieux." - "S\'affiche sous les notifications prioritaires. Toujours silencieux." - "S\'affiche sous les notifications prioritaires. Toujours silencieux." - "S\'affiche sous les notifications prioritaires. Toujours silencieux." - "Attire votre attention à l\'aide de sons et d\'une icône dans la barre d\'état. S\'affiche sur l\'écran de verrouillage." + "Mode silencieux" + "Alertes" + "Vous aider à vous concentrer, sans son ni vibration." + "Attire votre attention à l\'aide de sons et de vibrations." "Ces notifications ne peuvent pas être modifiées" "Ce groupe de notifications ne peut pas être configuré ici" "Notification par mandataire" @@ -908,8 +899,7 @@ "Autoriser" "Refuser" "Toucher pour activer la fonction Économie d\'énergie" - - + "Activer si la pile est susceptible de s\'épuiser totalement" "Non merci" "La fonction Économie d\'énergie est activée" "La fonction Économie d\'énergie s\'activera automatiquement une fois que la pile sera en dessous de %d %%." @@ -942,4 +932,8 @@ "Déplacer dans coin inf. gauche" "Déplacer dans coin inf. droit" "Fermer" + + + + diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 23f601c2178a..95cd5b6e6e53 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -62,12 +62,10 @@ "Débogage USB non autorisé" "L\'utilisateur actuellement connecté sur cet appareil ne peut pas activer le débogage USB. Pour utiliser cette fonctionnalité, l\'utilisateur principal doit se connecter." "Port USB désactivé" - - + "Pour protéger votre appareil des liquides et des saletés, le port USB est désactivé et ne détecte plus les accessoires.\n\nVous recevrez une notification lorsque vous pourrez de nouveau utiliser le port USB." "Port USB activé pour détecter les chargeurs et les accessoires" "Activer le port USB" - - + "En savoir plus" "Zoomer pour remplir l\'écran" "Étirer pour remplir l\'écran" "Capture" @@ -458,10 +456,8 @@ "Ne plus afficher" "Tout effacer" "Gérer" - - - - + "Notifications silencieuses" + "Effacer toutes les notifications silencieuses" "Notifications suspendues par le mode Ne pas déranger" "Commencer" "Aucune notification" @@ -645,21 +641,16 @@ "Bloquer" "Continuer d\'afficher les notifications" "Réduire" - - + "Mode silencieux" "Notifications silencieuses" - - + "Alertes" "Continuer de m\'avertir" "Désactiver les notifications" "Continuer d\'afficher les notifications de cette application ?" - "Discret" - "Prioritaire" - "Vous aide à vous concentrer en affichant les notifications seulement dans le volet déroulant. Toujours silencieux." - "S\'affiche sous les notifications prioritaires. Toujours silencieux." - "S\'affiche sous les notifications prioritaires. Toujours silencieux." - "S\'affiche sous les notifications prioritaires. Toujours silencieux." - "Attire votre attention à l\'aide d\'un son et d\'une icône dans la barre d\'état. S\'affiche sur l\'écran de verrouillage." + "Silencieux" + "Alertes" + "Sans sons ni vibrations, vous aide à vous concentrer." + "Attire votre attention à l\'aide de sons ou de vibrations." "Impossible de modifier ces notifications." "Vous ne pouvez pas configurer ce groupe de notifications ici" "Notification de proxy" @@ -908,8 +899,7 @@ "Autoriser" "Refuser" "Appuyez ici pour programmer l\'économiseur de batterie" - - + "Activer l\'économiseur de batterie si l\'autonomie restante risque d\'être insuffisante" "Non, merci" "Programmation de l\'économiseur de batterie activée" "L\'économiseur de batterie s\'active automatiquement lorsque l\'autonomie de la batterie est inférieure à %d %%." @@ -942,4 +932,8 @@ "Déplacer en bas à gauche" "Déplacer en bas à droite" "Ignorer" + + + + diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index fcb82e6b23ad..cce17d6e231d 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -62,12 +62,10 @@ "Non se permite a depuración por USB" "O usuario coa sesión iniciada actualmente neste dispositivo non pode activar a depuración por USB. Para utilizar esta función, cambia ao usuario principal." "O porto USB está desactivado" - - + "Para protexer o dispositivo de líquidos ou residuos, desactivouse o porto USB e non detectará ningún accesorio.\n\nRecibirás unha notificación cando o poidas utilizar de novo." "Activouse o porto USB para detectar cargadores e accesorios" "Activar USB" - - + "Máis información" "Ampliar ata ocupar todo" "Estirar ata ocupar todo" "Capt. pantalla" @@ -214,7 +212,7 @@ "Notificación rexeitada" - "Sombra de notificación" + "Panel despregable" "Configuración rápida" "Pantalla de bloqueo." "Configuración" @@ -458,10 +456,8 @@ "Non mostrar outra vez" "Eliminar todas" "Xestionar" - - - - + "Notificacións silenciadas" + "Borra todas as notificacións silenciadas" "O modo Non molestar puxo en pausa as notificacións" "Iniciar agora" "Non hai notificacións" @@ -645,21 +641,16 @@ "Bloquear" "Continuar mostrando notificacións" "Minimizar" - - + "Silencio" "Notificacións silenciosas" - - + "Alertando" "Continuar recibindo notificacións" "Desactivar notificacións" "Queres seguir mostrando as notificacións desta aplicación?" - "Discretas" - "Prioritarias" - "Permíteche centrarte con notificacións só no panel despregable. Sempre en silencio." - "Mostra as notificacións con prioridade baixa. Sempre en silencio." - "Mostra as notificacións con prioridade baixa. Sempre en silencio." - "Mostra as notificacións con prioridade baixa. Sempre en silencio." - "Chama a túa atención cun son e cunha icona na barra de estado. Móstrase na pantalla de bloqueo." + "Silenciosas" + "Con alertas" + "Axúdache a centrarte sen son nin vibración." + "Chama a túa atención con son ou vibración." "Estas notificacións non se poden modificar." "Aquí non se pode configurar este grupo de notificacións" "Notificación mediante proxy" @@ -908,8 +899,7 @@ "Permitir" "Denegar" "Tocar para programar a función Aforro de batería" - - + "Activa a función se prevés que a batería pode esgotarse" "Non, grazas" "Activouse o programa da función Aforro de batería" "Activarase automaticamente a función Aforro de batería en canto o nivel de carga sexa inferior ao %d %%." @@ -942,4 +932,8 @@ "Mover á parte infer. esquerda" "Mover á parte inferior dereita" "Ignorar" + + + + diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 7b2c6d3e03eb..53107f1910e2 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -62,12 +62,10 @@ "USB ડીબગિંગની મંજૂરી નથી" "હાલમાં આ ઉપકરણમાં સાઇન ઇન થયેલ વપરાશકર્તા USB ડિબગીંગ ચાલુ કરી શકતા નથી. આ સુવિધાનો ઉપયોગ કરવા માટે પ્રાથમિક વપરાશકર્તા પર સ્વિચ કરો." "USB પોર્ટ બંધ કરવામાં આવ્યો છે" - - + "પ્રવાહી અથવા ધૂળથી તમારા ડિવાઇસનું રક્ષણ કરવા માટે, USB પોર્ટ બંધ કરવામાં આવ્યો છે અને કોઈ ઍક્સેસરી શોધશે નહીં.\n\nજ્યારે ફરીથી USB પોર્ટને ઉપયોગમાં લેવાનું સુરક્ષિત હશે ત્યારે તમને નોટિફિકેશન આપવામાં આવશે." "ચાર્જર અને ઍક્સેસરીની ઓળખ માટે USB પોર્ટ ચાલુ કર્યું" "USB ચાલુ કરો" - - + "વધુ જાણો" "સ્ક્રીન ભરવા માટે ઝૂમ કરો" "સ્ક્રીન ભરવા માટે ખેંચો" "સ્ક્રીનશૉટ" @@ -458,10 +456,8 @@ "ફરીથી બતાવશો નહીં" "બધુ સાફ કરો" "મેનેજ કરો" - - - - + "સાઇલન્ટ નોટિફિકેશન" + "બધા સાઇલન્ટ નોટિફિકેશન સાફ કરો" "ખલેલ પાડશો નહીં દ્વારા થોભાવેલ નોટિફિકેશન" "હવે પ્રારંભ કરો" "કોઈ સૂચનાઓ નથી" @@ -645,21 +641,16 @@ "બ્લૉક કરો" "બતાવવાનું ચાલુ રાખો" "નાનું કરો" - - + "સાઇલન્ટ" "સાઇલન્ટ મોડ ચાલુ રાખો" - - + "અલર્ટ કરતા રહો" "અલર્ટ કરવાનું ચાલુ રાખો" "નોટિફિકેશન બંધ કરો" "આ ઍપમાંથી નોટિફિકેશન બતાવવાનું ચાલુ રાખીએ?" - "સામાન્ય નોટિફિકેશન" - "મહત્ત્વના નોટિફિકેશન" - "નીચે દેખાતા શેડમાં માત્ર નોટિફિકેશન પર ફોકસ કરવામાં તમને સહાય કરે છે. હંમેશાં સાઇલન્ટ." - "પ્રાધાન્યતાવાળા નોટિફિકેશન નીચે બતાવે છે. હંમેશાં સાઇલન્ટ." - "પ્રાધાન્યતાવાળા નોટિફિકેશન નીચે બતાવે છે. હંમેશાં સાઇલન્ટ." - "પ્રાધાન્યતાવાળા નોટિફિકેશન નીચે બતાવે છે. હંમેશાં સાઇલન્ટ." - "સાઉન્ડ અને સ્ટેટસ બાર આઇકન તમારું ધ્યાન દોરે છે. લૉક સ્ક્રીન પર બતાવે છે." + "સાઇલન્ટ" + "અલર્ટ કરવાનું ચાલુ રાખો" + "તમને સાઉન્ડ અથવા વાઇબ્રેશન વિના ફોકસ કરવામાં સહાય કરે છે." + "સાઉન્ડ અથવા વાઇબ્રેશન વિના તમારું ધ્યાન દોરે છે." "આ નોટિફિકેશનમાં કોઈ ફેરફાર થઈ શકશે નહીં." "નોટિફિકેશનના આ ગ્રૂપની ગોઠવણી અહીં કરી શકાશે નહીં" "પ્રૉક્સી નોટિફિકેશન" @@ -908,8 +899,7 @@ "મંજૂરી આપો" "નકારો" "બૅટરી સેવર શેડ્યૂલ કરવા માટે ટૅપ કરો" - - + "જ્યારે બૅટરી સંભવિત રૂપે પૂરી થવામાં હોય ત્યારે બૅટરી સેવર ચાલુ કરો" "ના, આભાર" "બૅટરી સેવર શેડ્યૂલ ચાલુ થયું" "બૅટરીનું સ્તર એકવાર %d%% કરતાં ઓછું થાય તે પછી બૅટરી સેવર ઑટોમૅટિક રીતે ચાલુ થશે." @@ -942,4 +932,8 @@ "નીચે ડાબે ખસેડો" "નીચે જમણે ખસેડો" "છોડી દો" + + + + diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 941ca05be7ff..92f372593710 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -62,12 +62,10 @@ "USB डीबगिंग की अनुमति नहीं है" "अभी इस डिवाइस में जिस उपयोगकर्ता ने साइन इन किया है, वो USB डीबगिंग चालू नहीं कर सकता. इस सुविधा का इस्तेमाल करने के लिए, प्राथमिक उपयोगकर्ता में बदलें." "यूएसबी पोर्ट बंद है" - - + "तरल चीज़ या कचरे से आपके डिवाइस की सुरक्षा करने के लिए, यूएसबी पोर्ट को बंद कर दिया गया है. साथ ही, इससे किसी भी एक्सेसरी की पहचान नहीं की जा सकेगी.\n\nयूएसबी पोर्ट का दोबारा इस्तेमाल करना सुरक्षित होने पर आपको सूचित किया जाएगा." "चार्जर और एक्सेसरी पहचानने के लिए यूएसबी पोर्ट को चालू कर दिया गया है" "यूएसबी चालू करें" - - + "ज़्यादा जानें" "स्‍क्रीन भरने के लिए ज़ूम करें" "स्‍क्रीन भरने के लिए खींचें" "स्क्रीनशॉट" @@ -458,10 +456,8 @@ "फिर से न दिखाएं" "सभी को हटाएं" "प्रबंधित करें" - - - - + "बिना आवाज़ या वाइब्रेशन वाली सूचनाएं" + "बिना आवाज़ की सभी सूचनाएं हटाएं" "\'परेशान न करें\' सुविधा के ज़रिए कुछ समय के लिए सूचनाएं दिखाना रोक दिया गया है" "अब शुरू करें" "कोई सूचना नहीं मिली" @@ -645,21 +641,16 @@ "ब्लॉक करें" "दिखाना जारी रखें" "सूचनाएं छोटी करें" - - + "बिना आवाज़ के सूचनाएं दिखाएं" "साइलेंट मोड में सूचनाएं पाएं" - - + "चेतावनी देना" "सूचना देना जारी रखें" "सूचनाएं बंद करें" "इस ऐप्लिकेशन से जुड़ी सूचनाएं दिखाना जारी रखें?" - "बिना आवाज़ के" - "ज़रूरी" - "सिर्फ़ नीचे खिंचने वाली सूची में सूचनाएं दिखती हैं ताकि आप उन पर पूरा ध्यान दे सकें. दिखते समय आवाज़ और वाइब्रेशन हमेशा बंद रहते हैं." - "कम ज़रूरी सूचनाएं दिखती हैं. दिखते समय आवाज़ और वाइब्रेशन हमेशा बंद रहते हैं." - "कम ज़रूरी सूचनाएं दिखती हैं. दिखते समय आवाज़ और वाइब्रेशन हमेशा बंद रहते हैं." - "कम ज़रूरी सूचनाएं दिखती हैं. दिखते समय आवाज़ और वाइब्रेशन हमेशा बंद रहते हैं." - "आवाज़ और स्टेटस बार के आइकॉन की मदद से सूचनाओं पर आपका ध्यान खिंचता है. लॉक स्क्रीन पर दिखाई देता है." + "आवाज़ के बिना सूचनाएं दिखाएं" + "चेतावनी वाली सूचनाएं" + "आवाज़ या वाइब्रेशन न होने की वजह से आप काम में ध्यान लगा पाते हैं." + "आवाज़ या वाइब्रेशन होने की वजह से आपका ध्यान सूचनाओं पर जाता है." "ये सूचनाएं नहीं बदली जा सकती हैं." "सूचनाओं के इस समूह को यहां कॉन्फ़िगर नहीं किया जा सकता" "प्रॉक्सी सूचना" @@ -908,8 +899,7 @@ "मंज़ूरी दें" "नामंज़ूर करें" "बैटरी सेवर शेड्यूल करने के लिए टैप करें" - - + "जब बैटरी खत्म होने वाली हो तब \'बैटरी सेवर\' चालू करें" "जी नहीं, शुक्रिया" "शेड्यूल किया गया बैटरी सेवर चालू हो गया" "बैटरी के %d%% से कम होने पर बैटरी सेवर अपने आप चालू हो जाएगा." @@ -942,4 +932,8 @@ "बाईं ओर सबसे नीचे ले जाएं" "सबसे नीचे दाईं ओर ले जाएं" "खारिज करें" + + + + diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index ba0d1fb65613..04200c1a0001 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -62,12 +62,10 @@ "Otklanjanje pogrešaka putem USB-a nije dopušteno" "Korisnik koji je trenutačno prijavljen na ovaj uređaj ne može uključiti otklanjanje pogrešaka putem USB-a. Da biste upotrebljavali tu značajku, prijeđite na primarnog korisnika." "Onemogućen je USB priključak" - - + "Radi zaštite uređaja od tekućine ili prljavštine USB priključak onemogućen je i neće otkrivati pribor.\n\nPrimit ćete obavijest kad upotreba USB priključka ponovo bude sigurna." "USB priključak omogućen za otkrivanje punjača i opreme" "Omogući USB" - - + "Saznajte više" "Zumiraj i ispuni zaslon" "Rastegni i ispuni zaslon" "Snimka zaslona" @@ -461,10 +459,8 @@ "Ne prikazuj ponovo" "Izbriši sve" "Upravljajte" - - - - + "Bešumne obavijesti" + "Izbriši sve bešumne obavijesti" "Značajka Ne uznemiravaj pauzirala je Obavijesti" "Započni sad" "Nema obavijesti" @@ -648,21 +644,16 @@ "Blokiraj" "Nastavi prikazivati" "Minimiziraj" - - + "Bešumno" "Nastavi tiho" - - + "Obavještavanje" "Nastavi obavještavati" "Isključi obavijesti" "Želite li da se obavijesti te aplikacije nastave prikazivati?" - "Neupadljivo" - "Prioritetno" - "Pomaže vam da se usredotočite prikazujući obavijesti samo na zaslonu obavijesti. Uvijek bešumno." - "Prikazuje se ispod prioritetnih obavijesti. Uvijek bešumno." - "Prikazuje se ispod prioritetnih obavijesti. Uvijek bešumno." - "Prikazuje se ispod prioritetnih obavijesti. Uvijek bešumno." - "Privlači vašu pažnju zvučnim signalom i ikonom na traci statusa. Prikazuje se na zaključanom zaslonu." + "Bešumno" + "Upozoravanje" + "Pomaže vam da se usredotočite bez zvučnih signala i vibracija." + "Privlači vašu pažnju zvučnim signalima ili vibracijama." "Te se obavijesti ne mogu izmijeniti." "Ta se grupa obavijesti ne može konfigurirati ovdje" "Obavijest poslana putem proxyja" @@ -913,8 +904,7 @@ "Dopusti" "Odbij" "Dodirnite za zakazivanje štednje baterije" - - + "Uključite kad bi se baterija mogla isprazniti" "Ne, hvala" "Uključen je raspored štednje baterije" "Štednja baterije uključit će se automatski kad razina baterije padne ispod %d%%." @@ -947,4 +937,8 @@ "Premjesti u donji lijevi kut" "Premjestite u donji desni kut" "Odbaci" + + + + diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 941e22974cdf..cd5de1a2c763 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -62,12 +62,10 @@ "Az USB hibakeresése nem engedélyezett" "Az eszközre jelenleg bejelentkezett felhasználó nem engedélyezheti az USB-hibakeresést. A funkció használatához váltson az elsődleges felhasználóra." "USB-port letiltva" - - + "Az eszköz folyadéktól és szennyeződésektől való megóvása érdekében az USB-portot letiltottuk, így az nem észleli a kiegészítőket.\n\nÉrtesítést küldünk, amikor ismét rendben használhatja az USB-portot." "Az USB-csatlakozó számára engedélyezve van a töltők és más tartozékok észlelése" "USB engedélyezése" - - + "Részletek" "Nagyítás a kitöltéshez" "Nyújtás kitöltéshez" "Képernyőkép" @@ -458,10 +456,8 @@ "Ne jelenjen meg többé" "Az összes törlése" "Kezelés" - - - - + "Néma értesítések" + "Az összes néma értesítés törlése" "Ne zavarjanak funkcióval szüneteltetett értesítések" "Indítás most" "Nincs értesítés" @@ -645,21 +641,16 @@ "Tiltás" "Megjelenítés továbbra is" "Kis méret" - - + "Néma" "Néma megjelenítés" - - + "Értesítések" "Értesítések folytatása" "Az értesítések kikapcsolása" "Továbbra is megjelenjenek az alkalmazás értesítései?" - "Diszkrét" - "Prioritásos" - "Segítségével a fontos dolgokra koncentrálhat, az értesítések csak a lehúzható értesítési felületen jelennek meg. Mindig némítva van." - "Az elsőbbségi értesítések alatt jelenik meg. Mindig némítva van." - "Az elsőbbségi értesítések alatt jelenik meg. Mindig némítva van." - "Az elsőbbségi értesítések alatt jelenik meg. Mindig némítva van." - "Figyelemfelkeltő a hangjelzésnek és az állapotsávon megjelenő ikonnak köszönhetően. Megjelenik a lezárási képernyőn." + "Néma" + "Figyelemfelkeltő" + "Hangjelzés és rezgés nélkül segít a koncentrálásban." + "Figyelemfelkeltő a hangjelzésnek és rezgésnek köszönhetően." "Ezeket az értesítéseket nem lehet módosítani." "Az értesítések jelen csoportját itt nem lehet beállítani" "Továbbított értesítés" @@ -908,8 +899,7 @@ "Engedélyezés" "Elutasítás" "Koppintson az akkumulátorkímélő mód ütemezéséhez" - - + "Kapcsolja be, ha az akkumulátor hamarosan lemerül" "Nem" "Akkumulátorkímélő mód ütemezése bekapcsolva" "Az akkumulátorkímélő mód automatikusan bekapcsol, ha az akkumulátor töltöttsége %d%% alá esik." @@ -942,4 +932,8 @@ "Áthelyezés le és balra" "Áthelyezés le és jobbra" "Elvetés" + + + + diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 9ebd2d69ab99..be536476f5c3 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -62,12 +62,10 @@ "USB վրիպազերծումը արգելված է" "Ընթացիկ հաշվի օգտատերը չի կարող միացնել USB վրիպազերծումը: Այս գործառույթը միացնելու համար մուտք գործեք հիմնական օգտատիրոջ հաշվով:" "USB միացքն անջատված է" - - + "USB միացքն անջատվել է, որպեսզի ձեր սարքը չթրջվի կամ չաղտոտվի: Այժմ USB միացքի միջոցով հնարավոր չէ միացնել այլ սարքեր:\n\nԴուք ծանուցում կստանաք, երբ այն նորից անվտանգ լինի օգտագործել:" "USB միացքը միացվել է՝ լիցքավորիչներն ու լրասարքերը հայտնաբերելու համար" "Միացնել USB-ն" - - + "Իմանալ ավելին" "Խոշորացնել` էկրանը լցնելու համար" "Ձգել` էկրանը լցնելու համար" "Սքրինշոթ" @@ -458,10 +456,8 @@ "Այլևս ցույց չտալ" "Մաքրել բոլորը" "Կառավարել" - - - - + "Անձայն ծանուցումներ" + "Ջնջել բոլոր անձայն ծանուցումները" "Ծանուցումները չեն ցուցադրվի «Չանհանգստացնել» ռեժիմում" "Սկսել հիմա" "Ծանուցումներ չկան" @@ -645,21 +641,16 @@ "Արգելափակել" "Ցուցադրել" "Ծալել" - - + "Անձայն" "Չմիացնել ձայնը" - - + "Ծանուցել" "Ծանուցել" "Անջատել ծանուցումները" "Ցուցադրե՞լ ծանուցումներ այս հավելվածից։" - "Անձայն" - "Առաջնահերթ" - "Ծանուցումները ցուցադրվում են միայն իջնող վահանակի վրա, որպեսզի դուք չշեղվեք ձեր աշխատանքից: Միշտ անձայն:" - "Ցուցադրվում են կարևոր ծանուցումների տակ: Միշտ անձայն:" - "Ցուցադրվում են կարևոր ծանուցումների տակ: Միշտ անձայն:" - "Ցուցադրվում են կարևոր ծանուցումների տակ: Միշտ անձայն:" - "Ծանուցումները ձեր ուշադրությունն են գրավում ազդանշանով և կարգավիճակի գոտում ցուցադրվող պատկերակով: Ցուցադրվում են կողպէկրանին:" + "Անձայն" + "Ծանուցումներ" + "Ծանուցումները գալիս են առանց ձայնի և թրթռոցի։" + "Ծանուցումները գալիս են ձայնով կամ թրթռոցով։" "Այս ծանուցումները չեն կարող փոփոխվել:" "Ծանուցումների տվյալ խումբը հնարավոր չէ կարգավորել այստեղ" "Ծանուցումն ուղարկվել է պրոքսի սերվերի միջոցով" @@ -908,8 +899,7 @@ "Թույլատրել" "Մերժել" "Հպեք՝ մարտկոցի տնտեսման ռեժիմը կարգավորելու համար" - - + "Միացնել էներգախնայումը, երբ մարտկոցի լիցքը գրեթե սպառված է" "Ոչ" "Մարտկոցի տնտեսման ռեժիմին ավտոմատ անցումը միացված է" "Մարտկոցի տնտեսման ռեժիմն ավտոմատ կմիանա, երբ մարտկոցի լիցքը %d%%-ից պակասի:" @@ -942,4 +932,8 @@ "Տեղափոխել ներքև՝ ձախ" "Տեղափոխել ներքև՝ աջ" "Փակել" + + + + diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index bf5d3a17705a..671f5f741459 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -62,7 +62,7 @@ "Debug USB tidak diizinkan" "Pengguna yang sedang login ke perangkat ini tidak dapat mengaktifkan proses debug USB. Beralihlah ke pengguna utama untuk menggunakan fitur ini." "Port USB dinonaktifkan" - "Untuk melindungi perangkat dari cairan atau kotoran, port USB dinonaktifkan dan tidak akan mendeteksi aksesori apa pun.\n\nAnda akan diberi tahu jika sudah diperbolehkan menggunakan port USB kembali." + "Untuk melindungi perangkat dari cairan atau kotoran, port USB dinonaktifkan dan tidak akan mendeteksi aksesori apa pun.\n\nAnda akan diberi tahu jika port USB sudah dapat digunakan kembali." "Port USB diaktifkan untuk mendeteksi pengisi daya dan aksesori" "Aktifkan USB" "Pelajari lebih lanjut" @@ -647,13 +647,10 @@ "Terus beri tahu" "Nonaktifkan notifikasi" "Terus tampilkan notifikasi dari aplikasi ini?" - "Senyap" - "Diprioritaskan" - "Membantu Anda berfokus hanya pada notifikasi di bayangan pull-down. Selalu senyap." - "Ditampilkan di bawah notifikasi prioritas. Selalu senyap." - "Ditampilkan di bawah notifikasi prioritas. Selalu senyap." - "Ditampilkan di bawah notifikasi prioritas. Selalu senyap." - "Menarik perhatian Anda dengan suara & ikon status bar. Ditampilkan di layar kunci." + "Senyap" + "Pemberitahuan" + "Membantu Anda tetap fokus tanpa suara atau getaran." + "Menarik perhatian Anda dengan suara atau getaran." "Notifikasi ini tidak dapat diubah." "Grup notifikasi ini tidak dapat dikonfigurasi di sini" "Notifikasi proxy" @@ -935,4 +932,8 @@ "Pindahkan ke kiri bawah" "Pindahkan ke kanan bawah" "Tutup" + + + + diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index b4b9be9485f4..69cc6932946e 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -62,12 +62,10 @@ "USB-villuleit ekki leyfð" "Notandinn sem er skráður inn í þetta tæki núna getur ekki kveikt á USB-villuleit. Til þess að nota þennan eiginleika skaltu skipta yfir í aðalnotandann." "USB-tengi gert óvirkt" - - + "Til að vernda tækið fyrir vökva og óhreinindum er USB-tengið óvirkt og mun ekki greina aukabúnað.\n\nÞú færð tilkynningu þegar öruggt er að nota USB-tengið aftur." "Kveikt var á USB-tengi til að greina hleðslutæki og aukabúnað" "Virkja USB" - - + "Frekari upplýsingar" "Fylla skjá með aðdrætti" "Teygja yfir allan skjáinn" "Skjámynd" @@ -458,10 +456,8 @@ "Ekki sýna þetta aftur" "Hreinsa allt" "Stjórna" - - - - + "Þöglar tilkynningar" + "Hreinsa allar þöglar tilkynningar" "Hlé gert á tilkynningum þar sem stillt er á „Ónáðið ekki“" "Byrja núna" "Engar tilkynningar" @@ -645,21 +641,16 @@ "Loka á" "Sýna áfram" "Minnka" - - + "Hljóðlaust" "Áfram hljóðlaust" - - + "Tilkynna" "Halda áfram að gera viðvart" "Slökkva á tilkynningum" "Sýna áfram tilkynningar frá þessu forriti?" - "Lágstemmdar" - "Í forgangi" - "Auðveldar þér að einbeita þér með tilkynningum sem birtast aðeins á fellisvæði. Alltaf án hljóðs." - "Birtir tilkynningar með lítinn forgang. Alltaf án hljóðs." - "Birtir tilkynningar með lítinn forgang. Alltaf án hljóðs." - "Birtir tilkynningar með lítinn forgang. Alltaf án hljóðs." - "Fangar athygli þína með hljóði og stöðustikutákni. Sést á lásskjánum." + "Hljóðlaust" + "Viðvörun" + "Auðveldar þér að einbeita þér án hljóðs eða titrings." + "Fangar athygli þína með hljóði eða titringi." "Ekki er hægt að breyta þessum tilkynningum." "Ekki er hægt að stilla þessar tilkynningar hér" "Staðgengilstilkynning" @@ -908,8 +899,7 @@ "Leyfa" "Hafna" "Pikka til að stilla rafhlöðusparnað" - - + "Kveikja þegar rafhlaða er við það að klárast" "Nei, takk" "Kveikt á rafhlöðusparnaði" "Sjálfkrafa verður kveikt á rafhlöðusparnaði þegar hleðsla rafhlöðunnar fer niður fyrir %d%%." @@ -942,4 +932,8 @@ "Færa neðst til vinstri" "Færðu neðst til hægri" "Hunsa" + + + + diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 52b915a8617b..dfdf5f6a6e43 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -647,13 +647,10 @@ "Continua ad avvisare" "Disattiva notifiche" "Continuare a ricevere notifiche da questa app?" - "Silenziose" - "Con priorità" - "Puoi concentrarti perché le notifiche sono visualizzate solo nell\'area a discesa. Sempre silenziose." - "Vengono mostrate le notifiche con priorità bassa. Sempre silenziose." - "Vengono mostrate le notifiche con priorità bassa. Sempre silenziose." - "Vengono mostrate le notifiche con priorità bassa. Sempre silenziose." - "Attirano la tua attenzione con un suono e un\'icona nella barra di stato. Le notifiche sono mostrate nella schermata di blocco." + "Modalità silenziosa" + "Avvisi" + "Favorisce la tua concentrazione grazie all\'assenza di suono o vibrazione." + "Richiama la tua attenzione con suono o vibrazione." "Impossibile modificare queste notifiche." "Qui non è possibile configurare questo gruppo di notifiche" "Notifica inviata al proxy" @@ -935,4 +932,8 @@ "Sposta in basso a sinistra" "Sposta in basso a destra" "Ignora" + + + + diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 684398d72fcc..571b37d4af17 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -62,12 +62,10 @@ "‏לא ניתן לבצע ניפוי באגים ב-USB" "‏למשתמש המחובר לחשבון במכשיר הזה אין אפשרות להפעיל ניפוי באגים ב-USB. כדי להשתמש בתכונה הזו יש לעבור אל המשתמש הראשי." "‏יציאת ה-USB מושבתת" - - + "‏כדי להגן על המכשיר שלך מנוזלים או חלקיקים, יציאת ה-USB מושבתת ולא מזהה אביזרים כלל.\n\nתתקבל התראה כשניתן יהיה להשתמש ביציאת ה-USB." "‏יציאת USB הופעלה לזיהוי מטענים ואביזרים" "‏הפעלת USB" - - + "מידע נוסף" "הגדל תצוגה כדי למלא את המסך" "מתח כדי למלא את המסך" "צילום מסך" @@ -464,10 +462,8 @@ "אל תציג שוב" "נקה הכל" "ניהול" - - - - + "התראות שקטות" + "ניקוי כל ההתראות השקטות" "התראות הושהו על ידי מצב \'נא לא להפריע\'" "התחל כעת" "אין התראות" @@ -651,21 +647,16 @@ "חסימה" "כן, המשיכו" "מזעור" - - + "שקטה" "בשקט" - - + "שליחת התראות" "המשך שליחת התראות" "השבתת ההתראות" "שנמשיך להציג לך התראות מהאפליקציה הזאת?" - "ברמה מתונה" - "בעדיפות" - "עוזרת לריכוז באמצעות הצגת התראות בלוח ההתראות הנפתח בלבד. תמיד שקטה." - "יופיעו התראות בעדיפות נמוכה. תמיד בשקט." - "יופיעו התראות בעדיפות נמוכה. תמיד בשקט." - "יופיעו התראות בעדיפות נמוכה. תמיד בשקט." - "מעוררת תשומת לב באמצעות צלילים וסמל בשורת הסטטוס. מוצגת במסך הנעילה." + "שקט" + "שליחת התראות" + "עוזרת להתרכז ללא צלילים או רטט." + "מעוררת תשומת לב באמצעות צלילים או רטט." "לא ניתן לשנות את ההתראות האלה." "לא ניתן להגדיר כאן את קבוצת ההתראות הזו" "‏התראה דרך שרת proxy" @@ -918,8 +909,7 @@ "אני רוצה לאשר" "אני לא מרשה" "יש להקיש כדי לתזמן את מצב החיסכון בסוללה" - - + "מומלץ להפעיל את התכונה כשיש סבירות גבוהה שהסוללה תתרוקן" "לא תודה" "הופעל תזמון של חיסכון בסוללה" "מצב חיסכון בסוללה יופעל באופן אוטומטי כשרמת טעינת הסוללה תהיה נמוכה מ-%d%%." @@ -952,4 +942,8 @@ "העברה לפינה השמאלית התחתונה" "העברה לפינה הימנית התחתונה" "סגירה" + + + + diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 39a84199dc3d..b14d37c0845e 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -62,12 +62,10 @@ "USBデバッグは許可されていません" "このデバイスに現在ログインしているユーザーでは、USB デバッグを ON にすることはできません。この機能を使用するには、メインユーザーに切り替えてください。" "USB ポート無効" - - + "液体やゴミからデバイスを保護するため、USB ポートは無効になっています。アクセサリの検出は行われません。\n\nUSB ポートを再び安全に使用できるようになりましたらお知らせします。" "USB ポートが有効になり、充電器やアクセサリを検出できるようになりました" "USB を有効にする" - - + "詳細" "画面サイズに合わせて拡大" "画面サイズに合わせて拡大" "画面の保存" @@ -458,10 +456,8 @@ "次回から表示しない" "すべて消去" "管理" - - - - + "サイレント通知" + "サイレント通知がすべて消去されます" "サイレント モードにより通知は一時停止中です" "今すぐ開始" "通知はありません" @@ -645,21 +641,16 @@ "ブロック" "今後も表示する" "最小化" - - + "サイレント" "音なしで通知" - - + "アラートを受け取る" "今後もアラートを受け取る" "通知を OFF にする" "このアプリからの通知を今後も表示しますか?" - "通知音なし" - "優先" - "プルダウン シェードでのみ通知を確認できます。常に通知音は鳴りません。" - "優先度の低い通知を表示します。常に通知音は鳴りません。" - "優先度の低い通知を表示します。常に通知音は鳴りません。" - "優先度の低い通知を表示します。常に通知音は鳴りません。" - "通知音とステータスバーのアイコンで注意を促します。ロック画面に表示されます。" + "サイレント" + "アラートを受け取る" + "音やバイブレーションが作動しないため、通知に煩わされずに済みます。" + "音やバイブレーションで通知をお知らせします。" "これらの通知は変更できません。" "このグループの通知はここでは設定できません" "代理通知" @@ -908,8 +899,7 @@ "許可" "拒否" "タップしてバッテリー セーバーのスケジュールを設定" - - + "電池切れになる可能性が高くなると有効になります" "いいえ" "バッテリー セーバーのスケジュール設定 ON" "電池が %d%% を下回ると、バッテリー セーバーが自動的に ON になります。" @@ -942,4 +932,8 @@ "左下に移動" "右下に移動" "閉じる" + + + + diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 0cc5c5e96c91..a3375cb2bc10 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -62,12 +62,10 @@ "USB ხარვეზების გამართვა ნებადართული არაა" "ამ მოწყობილობაზე ამჟამად შესულ მომხმარებელს არ შეუძლია USB ხარვეზების გამართვის ფუნქციის ჩართვა. ამ ფუნქციის გამოსაყენებლად, მიუერთდით მთავარ მომხმარებელს." "USB პორტი გათიშულია" - - + "თქვენი მოწყობილობის სითხის ან ნადებისგან დასაცავად, USB პორტი გათიშულია და ვერცერთი აქსესუარის აღმოჩენას ვერ შეძლებს.\n\nთქვენ მიიღებთ შეტყობინებას, როდესაც USB პორტის გამოყენება კვლავ შესაძლებელი იქნება." "USB პორტი ჩართულია დამტენებისა და აქსესუარების აღმოსაჩენად" "USB-ის ჩართვა" - - + "შეიტყვეთ მეტი" "მასშტაბი შეცვალეთ ეკრანის შესავსებად." "გაწიეთ ეკრანის შესავსებად." "ეკრანის ანაბეჭდი" @@ -458,10 +456,8 @@ "აღარ მაჩვენო" "ყველას გასუფთავება" "მართვა" - - - - + "ჩუმი შეტყობინებები" + "ყველა ჩუმი შეტყობინების გასუფთავება" "შეტყობინებები დაპაუზდა „არ შემაწუხოთ“ რეჟიმის მეშვეობით" "დაწყება ახლავე" "შეტყობინებები არ არის." @@ -645,21 +641,16 @@ "დაბლოკვა" "ჩვენების გაგრძელება" "ჩაკეცვა" - - + "ჩუმი" "კვლავ ჩუმად ჩვენება" - - + "გაფრთხილება" "გაფრთხილების გაგრძელება" "შეტყობინებების გამორთვა" "გაგრძელდეს შეტყობინებათა ჩვენება ამ აპიდან?" - "მსუბუქი" - "პრიორიტეტული" - "გეხმარებათ იმ შეტყობინებებზე ყურადღების გამახვილებაში, რომლებიც ჩამოსაწევ ფარდაში ჩანს. ყოველთვის ჩუმი." - "აჩვენებს ნაკლებად პრიორიტეტულ შეტყობინებებს. ყოველთვის ჩუმი." - "აჩვენებს ნაკლებად პრიორიტეტულ შეტყობინებებს. ყოველთვის ჩუმი." - "აჩვენებს ნაკლებად პრიორიტეტულ შეტყობინებებს. ყოველთვის ჩუმი." - "იქცევს თქვენს ყურადღებას ხმით & სტატუსის ზოლის ხატულით. ჩნდება ჩაკეტილ ეკრანზე." + "ჩუმი" + "გამაფრთხილებელი" + "გეხმარებათ ფოკუსირებაში ხმის ან ვიბრაციის უქონლობის გამო." + "იპყრობს თქვენს ყურადღებას ხმით ან ვიბრაციით." "ამ შეტყობინებების შეცვლა შეუძლებელია." "შეტყობინებების ამ ჯგუფის კონფიგურირება აქ შეუძლებელია" "პროქსირებული შეტყობინება" @@ -908,8 +899,7 @@ "დაშვება" "უარყოფა" "შეეხეთ ბატარეის დამზოგის დასაგეგმად" - - + "ჩაირთოს, როცა ბატარეა დაცლის პირას არის" "არა, გმადლობთ" "ბატარეის დამზოგის განრიგი ჩართულია" "ბატარეის დამზოგი ავტომატურად ჩაირთვება, როცა ბატარეა ჩამოსცდება %d%%-ს." @@ -942,4 +932,8 @@ "ქვევით და მარცხნივ გადატანა" "გადაანაცვ. ქვემოთ და მარჯვნივ" "დახურვა" + + + + diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index bb1487687549..5026b537d9cc 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -62,12 +62,10 @@ "USB жөндеу рұқсат етілмеген" "Бұл құрылғыға жаңа кірген пайдаланушы USB түзетуін іске қосылмайды. Бұл мүмкіндікті пайдалану үшін негізгі пайдаланушыға ауысыңыз." "USB порты өшірілді" - - + "Құрылғыңызға сұйықтық немесе қоқыс кіріп кетпеуі үшін, USB порты өшірілген және ешқандай керек-жарақты анықтамайды.\n\nUSB портын қайта пайдалануға болатын кезде хабарландыру аласыз." "Зарядтағыштар мен аксессуарларды анықтау үшін USB порты қосылды." "USB қосу" - - + "Толығырақ" "Экранды толтыру үшін ұлғайту" "Экранды толтыру үшін созу" "Скриншот" @@ -458,10 +456,8 @@ "Қайта көрсетпеу" "Барлығын тазалау" "Басқару" - - - - + "Дыбыссыз хабарландырулар" + "Барлық дыбыссыз хабарландыруларды өшіру" "Хабарландырулар \"Мазаламау\" режимінде кідіртілді" "Қазір бастау" "Хабарландырулар жоқ" @@ -645,21 +641,16 @@ "Бөгеу" "Көрсету" "Жасыру" - - + "Дыбыссыз" "Хабарландырулар алғым келмейді" - - + "Ескерту" "Хабарландырулар келе берсін" "Хабарландыруларды өшіру" "Осы қолданбаның хабарландырулары көрсетілсін бе?" - "Дыбыссыз" - "Маңызды" - "Ашылмалы панельдегі хабарландырулар ғана көрсетіледі. Үнемі дыбыссыз режимде болады." - "Маңыздылығы төмен хабарландыруларды көрсетеді. Үнемі дыбыссыз режимде болады." - "Маңыздылығы төмен хабарландыруларды көрсетеді. Үнемі дыбыссыз режимде болады." - "Маңыздылығы төмен хабарландыруларды көрсетеді. Үнемі дыбыссыз режимде болады." - "Дыбыс және күй жолағы белгішесі арқылы ескертеді. Құлыптаулы экранда көрсетіледі." + "Дыбыссыз" + "Ескертулер" + "Хабарландырулар келгенде, дыбыс шықпайды не дірілдемейді" + "Хабарландырулар келгенде, дыбыс шығады не дірілдейді" "Бұл хабарландыруларды өзгерту мүмкін емес." "Мұндай хабарландырулар бұл жерде конфигурацияланбайды." "Прокси-сервер арқылы жіберілген хабарландыру" @@ -908,8 +899,7 @@ "Рұқсат беру" "Тыйым салу" "Түймені түртіп, Battery Saver функциясын реттеңіз" - - + "Батареяның заряды бітуге жақындағанда қосыңыз." "Жоқ, рақмет" "Battery Saver кестесі қосылды" "Батарея заряды %d%% деңгейінен төмендегенде, Battery Saver автоматты түрде қосылады." @@ -942,4 +932,8 @@ "Төменгі сол жаққа жылжыту" "Төменгі оң жаққа жылжыту" "Жабу" + + + + diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 2c42f6a5f81d..935986823c72 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -62,12 +62,10 @@ "មិនអនុញ្ញាតការកែកំហុសតាម USB ទេ" "អ្នកប្រើ​ដែលបច្ចុប្បន្ន​បានចូលគណនី​នៅលើឧបករណ៍នេះ​មិនអាចបើកការកែកំហុស USB បានទេ។ ដើម្បីប្រើមុខងារនេះ សូមប្តូរទៅអ្នកប្រើចម្បង។" "បានបិទរន្ធ USB" - - + "ដើម្បី​ការពារ​ឧបករណ៍​របស់អ្នកកុំឱ្យ​ចូលទឹក ឬ​កម្ទេចផ្សេងៗ រន្ធ USB ត្រូវបានបិទ ហើយ​នឹង​មិនស្គាល់​គ្រឿង​បរិក្ខារ​នោះទេ។\n\nអ្នកនឹង​ទទួលបាន​ការជូនដំណឺង នៅពេល​អ្នកអាច​ប្រើប្រាស់​រន្ធ USB ម្ដងទៀត។" "បាន​បើក​រន្ធ USB ដើម្បី​សម្គាល់​ឆ្នាំងសាក និងគ្រឿងផ្សេងៗ" "បើក USB" - - + "ស្វែងយល់​បន្ថែម" "ពង្រីក​​ដើម្បី​ឲ្យ​ពេញ​អេក្រង់" "ទាញ​ដើម្បី​ឲ្យ​ពេញ​អេក្រង់" "រូបថតអេក្រង់" @@ -458,10 +456,8 @@ "កុំ​បង្ហាញ​ម្ដងទៀត" "សម្អាត​ទាំងអស់" "គ្រប់គ្រង" - - - - + "ការជូនដំណឹង​ស្ងាត់" + "សម្អាត​ការជូនដំណឹង​ស្ងាត់ទាំងអស់" "ការជូនដំណឹង​បានផ្អាក​ដោយ​មុខងារកុំរំខាន" "ចាប់ផ្ដើម​ឥឡូវ" "គ្មាន​ការ​ជូនដំណឹង" @@ -645,21 +641,16 @@ "ទប់ស្កាត់" "បន្ត​បង្ហាញ" "បង្រួម" - - + "ស្ងាត់" "បន្ត​បិទសំឡេង" - - + "ការជូនដំណឹង" "បន្ត​ជូនដំណឹង" "បិទ​ការជូន​ដំណឹង" "បន្ត​បង្ហាញ​ការជូនដំណឹង​ពីកម្មវិធីនេះ?" - "ស្ងាត់ៗ" - "ជា​អាទិភាព" - "ជួយ​ឱ្យអ្នក​ផ្ដោត​តាមរយៈការជូនដំណឹង​តែនៅក្នុង​ផ្ទាំងជូនដំណឹងធ្លាក់ចុះ​ប៉ុណ្ណោះ។ បិទសំឡេង​ជានិច្ច។" - "បង្ហាញ​ការជូនដំណឹង​អាទិភាព​ខាងក្រោម។ បិទសំឡេង​ជានិច្ច។" - "បង្ហាញ​ការជូនដំណឹង​អាទិភាព​ខាងក្រោម។ បិទសំឡេង​ជានិច្ច។" - "បង្ហាញ​ការជូនដំណឹង​អាទិភាព​ខាងក្រោម។ បិទសំឡេង​ជានិច្ច។" - "ធ្វើឱ្យអ្នកចាប់អារម្មណ៍តាមរយៈ​សំឡេង និងរូបរបារស្ថានភាព។ បង្ហាញ​នៅលើ​អេក្រង់ចាក់សោ។" + "ស្ងាត់" + "បញ្ចេញ​សំឡេង" + "ជួយឱ្យ​អ្នក​ផ្តោតអារម្មណ៍ ដោយមិនឮសំឡេង ឬ​ការញ័រ។" + "ធ្វើឱ្យ​អ្នក​ចាប់អារម្មណ៍​តាមរយៈ​សំឡេង ឬ​ការញ័រ។" "មិនអាច​កែប្រែ​ការជូនដំណឹង​ទាំងនេះ​បានទេ។" "មិនអាច​កំណត់​រចនាសម្ព័ន្ធ​ក្រុមការជូនដំណឹងនេះ​នៅទីនេះ​បានទេ" "ការជូនដំណឹង​ជា​ប្រូកស៊ី" @@ -908,8 +899,7 @@ "អនុញ្ញាត" "បដិសេធ" "ចុច​ដើម្បី​កំណត់​កាលវិភាគ​កម្មវិធី​សន្សំ​ថ្ម" - - + "បើក​នៅពេល​ថ្ម​ទំនងជា​អស់" "ទេ អរគុណ" "កាលវិភាគ​កម្មវិធី​សន្សំ​ថ្ម​បាន​បើក​ហើយ" "កម្មវិធី​សន្សំ​ថ្ម​នឹង​បើក​ដោយ​ស្វ័យ​ប្រវត្តិ​ នៅពេល​ថ្ម​នៅ​សល់​តិច​ជាង %d%% ។" @@ -942,4 +932,8 @@ "ផ្លាស់ទីទៅផ្នែកខាងក្រោមខាងឆ្វេង​" "ផ្លាស់ទីទៅផ្នែកខាងក្រោម​ខាងស្ដាំ" "ច្រានចោល" + + + + diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index f14998d07aae..c28b5e20675e 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -647,13 +647,10 @@ "ಎಚ್ಚರಿಸುತ್ತಿರಿ" "ಅಧಿಸೂಚನೆಗಳನ್ನು ಆಫ್ ಮಾಡಿ" "ಈ ಅಪ್ಲಿಕೇಶನ್‌ನಿಂದ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸುತ್ತಲೇ ಇರಬೇಕೆ?" - "ಸಾಮಾನ್ಯ" - "ಆದ್ಯತೆಗೊಳಿಸಿದ" - "ಪುಲ್-ಡೌನ್ ಶೇಡ್‌ನಲ್ಲಿರುವ ಅಧಿಸೂಚನೆಗಳ ಕಡೆಗೆ ಮಾತ್ರ ಗಮನಹರಿಸಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಯಾವಾಗಲೂ ನಿಶ್ಯಬ್ದ." - "ಪ್ರಾಶಸ್ತ್ಯದ ಅಧಿಸೂಚನೆಗಳ ಕೆಳಗೆ ಪ್ರದರ್ಶಿತವಾಗುತ್ತದೆ. ಯಾವಾಗಲೂ ನಿಶ್ಯಬ್ದ." - "ಪ್ರಾಶಸ್ತ್ಯದ ಅಧಿಸೂಚನೆಗಳ ಕೆಳಗೆ ಪ್ರದರ್ಶಿತವಾಗುತ್ತದೆ. ಯಾವಾಗಲೂ ನಿಶ್ಯಬ್ದ." - "ಪ್ರಾಶಸ್ತ್ಯದ ಅಧಿಸೂಚನೆಗಳ ಕೆಳಗೆ ಪ್ರದರ್ಶಿತವಾಗುತ್ತದೆ. ಯಾವಾಗಲೂ ನಿಶ್ಯಬ್ದ." - "ಧ್ವನಿ ಮತ್ತು ಸ್ಥಿತಿ ಪಟ್ಟಿ ಐಕಾನ್ ಮೂಲಕ ನಿಮ್ಮ ಗಮನವನ್ನು ಸೆಳೆಯುತ್ತದೆ. ಲಾಕ್ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ತೋರಿಸುತ್ತದೆ." + "ನಿಶ್ಶಬ್ದ" + "ಎಚ್ಚರಿಸಲಾಗುತ್ತಿದೆ" + "ಶಬ್ದ ಅಥವಾ ವೈಬ್ರೇಷನ್ ಇರದಂತೆ ನಿಮಗೆ ಗಮನಹರಿಸಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ." + "ಧ್ವನಿ ಅಥವಾ ವೈಬ್ರೇಷನ್ ಮೂಲಕ ನಿಮ್ಮ ಗಮನವನ್ನು ಸೆಳೆಯುತ್ತದೆ." "ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ." "ಈ ಗುಂಪಿನ ಅಧಿಸೂಚನೆಗಳನ್ನು ಇಲ್ಲಿ ಕಾನ್ಫಿಗರ್‌ ಮಾಡಲಾಗಿರುವುದಿಲ್ಲ" "ಪ್ರಾಕ್ಸಿ ಮಾಡಿದ ಅಧಿಸೂಚನೆಗಳು" @@ -935,4 +932,8 @@ "ಸ್ಕ್ರೀನ್‌ನ ಎಡ ಕೆಳಭಾಗಕ್ಕೆ ಸರಿಸಿ" "ಕೆಳಗಿನ ಬಲಭಾಗಕ್ಕೆ ಸರಿಸಿ" "ವಜಾಗೊಳಿಸಿ" + + + + diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index e40ab6fddb00..af6f6eb31ee4 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -62,12 +62,10 @@ "USB 디버깅이 허용되지 않음" "현재 이 기기에 로그인한 사용자는 USB 디버깅을 사용 설정할 수 없습니다. 이 기능을 사용하려면 기본 사용자로 전환하세요." "USB 포트 비활성화됨" - - + "기기를 액체나 이물질로부터 보호하기 위해 USB 포트가 사용 중지되었으며 액세서리를 연결할 수 없습니다.\n\nUSB 포트를 다시 안전하게 사용할 수 있게 되면 알려 드리겠습니다." "충전기와 액세서리를 감지할 수 있도록 USB 포트가 사용 설정됨" "USB 사용" - - + "자세히 알아보기" "전체화면 모드로 확대" "전체화면 모드로 확대" "스크린샷" @@ -458,10 +456,8 @@ "다시 표시 안함" "모두 지우기" "관리" - - - - + "무음 알림" + "무음 알림 모두 삭제" "방해 금지 모드로 일시중지된 알림" "시작하기" "알림 없음" @@ -645,21 +641,16 @@ "차단" "계속 표시하기" "최소화" - - + "무음" "계속 무음으로 알림" - - + "알림" "계속 알림" "알림 사용 중지" "이 앱의 알림을 계속 표시하시겠습니까?" - "조용히 표시됨" - "우선순위 지정됨" - "풀다운 창에만 알림을 표시하여 집중에 방해가 되지 않습니다. 항상 음소거됩니다." - "우선순위 알림 아래에 표시됩니다. 항상 음소거됩니다." - "우선순위 알림 아래에 표시됩니다. 항상 음소거됩니다." - "우선순위 알림 아래에 표시됩니다. 항상 음소거됩니다." - "소리 및 상태 표시줄 아이콘으로 주의를 끕니다. 잠금 화면에 표시됩니다." + "무음" + "주의를 끄는 알림" + "소리나 진동 없이 집중할 수 있도록 도와줍니다" + "소리나 진동으로 주의를 끕니다" "이 알림은 수정할 수 없습니다." "이 알림 그룹은 여기에서 설정할 수 없습니다." "프록시를 통한 알림" @@ -908,8 +899,7 @@ "허용" "거부" "탭하여 절전 모드 예약" - - + "배터리가 소진될 것 같으면 사용 설정" "사용 안함" "절전 모드 예약 사용 설정됨" "배터리가 %d%% 아래로 내려가면 절전 모드가 자동으로 켜집니다." @@ -942,4 +932,8 @@ "왼쪽 하단으로 이동" "오른쪽 하단으로 이동" "닫기" + + + + diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index dbeea5b6d386..7f5a011e9a78 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -62,12 +62,10 @@ "USB мүчүлүштүктөрүн оңдоого уруксат жок" "Учурда бул аккаунтта USB аркылуу мүчүлүштүктөрдү оңдоо функциясын иштетүүгө болбойт. Негизги колдонуучунун аккаунтуна кириңиз." "USB порту өчүрүлдү" - - + "Түзмөгүңүздүн ичине суюктук же булганч нерселер кирип кетпеши үчүн USB порту өчүрүлдү. Азырынча ал аркылуу башка түзмөктөргө туташууга болбойт.\n\nUSB портун кайра колдонуу мүмкүн болгондо, билдирме аласыз." "Кубаттагычтарды жана аксессуарларды аныктоо үчүн USB оюкчасы иштетилди" "USB’ни иштетүү" - - + "Кененирээк" "Экрнд тлтр ү. чен өлч өзг" "Экранды толтуруу ү-н чоюу" "Скриншот" @@ -458,10 +456,8 @@ "Экинчи көрсөтүлбөсүн" "Бардыгын тазалап салуу" "Башкаруу" - - - - + "Үнсүз билдирмелер" + "Маанилүү эмес билдирмелердин баарын өчүрүү" "\"Тынчымды алба\" режиминде билдирмелер тындырылды" "Азыр баштоо" "Билдирме жок" @@ -645,21 +641,16 @@ "Бөгөттөө" "Көрсөтүлө берсин" "Кичирейтүү" - - + "Үнсүз" "Үнү чыкпасын" - - + "Билдирүү" "Кабар бериле берсин" "Билдирмелерди өчүрүү" "Бул колдонмонун эскертмелери көрсөтүлө берсинби?" - "Маанилүү эмес" - "Маанилүү" - "Тигинен жайгашкан экрандагы билдирмелерге гана фокустоого жардам берет. Ар дайым үнсүз." - "Маанилүү билдирмелердин ылдый жагында чагылдырылат. Ар дайым үнсүз." - "Маанилүү билдирмелердин ылдый жагында чагылдырылат. Ар дайым үнсүз." - "Маанилүү билдирмелердин ылдый жагында чагылдырылат. Ар дайым үнсүз." - "Билдирме келгенде атайын үн чыгат же абал тилкесинде сүрөтчө пайда болот. Билдирмелер кулпуланган экранда көрүнөт." + "Үнсүз" + "Шашылыш билдирме" + "Үн же дирилдөөсүз ой топтоого жардам берет." + "Үн чыгарып же дирилдеп көңүлүңүздү бурат." "Бул билдирмелерди өзгөртүүгө болбойт." "Бул билдирмелердин тобун бул жерде конфигурациялоого болбойт" "Прокси билдирмеси" @@ -908,8 +899,7 @@ "Уруксат берүү" "Жок" "Батареяны үнөмдөгүчтүн тартибин жөндөө үчүн басыңыз" - - + "Батареянын кубаты түгөнүп калганда, күйгүзүлсүн" "Жок, рахмат" "Батареяны үнөмдөгүчтүн тартиби күйгүзүлдү" "Батареянын деңгээли %d%% төмөндөгөндө, Батареяны үнөмдөгүч режими автоматтык түрдө күйөт." @@ -942,4 +932,8 @@ "Төмөнкү сол жакка жылдыруу" "Төмөнкү оң жакка жылдырыңыз" "Жабуу" + + + + diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index fa1c32a9dfba..4a1589d809be 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -62,12 +62,10 @@ "ບໍ່​ອະ​ນຸ​ຍາດ​ໃຫ້​ມີ​ການ​ແກ້​ໄຂ​ບັນ​ຫາ USB" "ຜູ້ໃຊ້ທີ່ກຳລັງເຂົ້າສູ່ລະບົບອຸປະກອນຢູ່ໃນຕອນນີ້ບໍ່ສາມາດເປີດໃຊ້ການດີບັກ USB ໄດ້. ເພື່ອໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ສະຫຼັບໄປໃຊ້ຜູ້ໃຊ້ຫຼັກ." "ປິດການນຳໃຊ້ຜອດ USB ແລ້ວ" - - + "ເພື່ອປົກປ້ອງອຸປະກອນຂອງທ່ານຈາກຂອງແຫລວ ຫຼື ເສດດິນຕ່າງໆ, ຜອດ USB ຈຶ່ງຖືກປິດການນຳໃຊ້ ແລະ ຈະບໍ່ກວດຫາອຸປະກອນເສີມໃດໆ.\n\nທ່ານຈະໄດ້ຮັບການແຈ້ງເຕືອນເມື່ອສາມາດໃຊ້ຜອດ USB ໄດ້ອີກເທື່ອໜຶ່ງ." "ເປີດນຳໃຊ້ USB ແລ້ວເພື່ອກວດຫາສາຍສາກ ແລະ ອຸປະກອນເສີມ" "ເປີດໃຊ້ USB" - - + "ສຶກສາເພີ່ມເຕີມ" "ຊູມໃຫ້ເຕັມໜ້າຈໍ" "ປັບໃຫ້ເຕັມໜ້າຈໍ" "ພາບໜ້າຈໍ" @@ -458,10 +456,8 @@ "ບໍ່​ຕ້ອງ​ສະ​ແດງ​ອີກ" "ລຶບລ້າງທັງໝົດ" "ຈັດການ" - - - - + "ການແຈ້ງເຕືອນແບບງຽບ" + "ລຶບລ້າງການແຈ້ງເຕືອນແບບງຽບທັງໝົດ" "ຢຸດການແຈ້ງເຕືອນໂດຍໂໝດຫ້າມລົບກວນແລ້ວ" "ເລີ່ມດຽວນີ້" "ບໍ່ມີການແຈ້ງເຕືອນ" @@ -645,21 +641,16 @@ "ບລັອກ" "ສະແດງຕໍ່ໄປ" "ຫຍໍ້" - - + "ປິດສຽງ" "ສືບຕໍ່ມິດງຽບ" - - + "ການເຕືອນ" "ສືບຕໍ່ແຈ້ງເຕືອນ" "ປິດການແຈ້ງເຕືອນ" "ສະແດງການແຈ້ງເຕືອນຈາກແອັບນີ້ຕໍ່ໄປບໍ?" - "ສຸພາບ" - "ສຳຄັນ" - "ຊ່ວຍທ່ານມີສະມາທິກກັບການແຈ້ງເຕືອນສະເພາະໃນແຖບເລື່ອນລົງເທົ່ານັ້ນ. ປິດສຽງຕະຫຼອດ." - "ສະແດງການແຈ້ງເຕືອນທີ່ຄວາມສຳຄັນຕ່ຳລົງ. ປິດສຽງຕະຫຼອດ." - "ສະແດງການແຈ້ງເຕືອນທີ່ຄວາມສຳຄັນຕ່ຳລົງ. ປິດສຽງຕະຫຼອດ." - "ສະແດງການແຈ້ງເຕືອນທີ່ຄວາມສຳຄັນຕ່ຳລົງ. ປິດສຽງຕະຫຼອດ." - "ດຶງຄວາມສົນໃຈຂອງທ່ານດ້ວຍສຽງ ແລະ ໄອຄອນແຖບສະຖານະ. ສະແດງຢູ່ໜ້າຈໍລັອກ." + "ປິດສຽງ" + "ການເຕືອນ" + "ຊ່ວຍທ່ານມີສະມາທິໂດຍບໍ່ໃຊ້ສຽງ ຫຼື ການສັ່ນເຕືອນ." + "ດຶງຄວາມສົນໃຈຂອງທ່ານດ້ວຍສຽງ ຫຼື ການສັ່ນເຕືອນ." "ບໍ່ສາມາດແກ້ໄຂການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄດ້." "ບໍ່ສາມາດຕັ້ງຄ່າກຸ່ມການແຈ້ງເຕືອນນີ້ຢູ່ບ່ອນນີ້ໄດ້" "ການແຈ້ງເຕືອນແບບພຣັອກຊີ" @@ -908,8 +899,7 @@ "ອະນຸຍາດ" "ປະຕິເສດ" "ແຕະເພື່ອຕັ້ງການເປີດຕົວປະຢັດແບັດເຕີຣີ" - - + "ເປີດໃຊ້ເມື່ອແບັດເຕີຣີໜ້າຈະໃກ້ໝົດ" "ບໍ່, ຂອບໃຈ" "ຕັ້ງໃຫ້ເປີດຕົວປະຢັດແບັດເຕີຣີແລ້ວ" "ຕົວປະຢັດແບັດເຕີຣີຈະເປີດຂຶ້ນມາໂດຍອັດຕະໂນມັດເມື່ອແບັດເຕີຣີຕ່ຳກວ່າ %d%%." @@ -942,4 +932,8 @@ "ຍ້າຍຊ້າຍລຸ່ມ" "ຍ້າຍຂວາລຸ່ມ" "ປິດໄວ້" + + + + diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 88846d923974..ab6a04423833 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -62,12 +62,10 @@ "USB derinimas neleidžiamas" "Šiuo metu prie įrenginio prisijungęs naudotojas negali įjungti USB derinimo. Kad galėtumėte naudoti šią funkciją, perjunkite į pagrindinį naudotoją." "USB prievadas išjungtas" - - + "Siekiant apsaugoti įrenginį nuo skysčių ar smulkių dalelių, USB prievadas buvo išjungtas ir neaptiks jokių priedų.\n\nJums bus pranešta, kai galėsite vėl saugiai naudoti USB prievadą." "USB prievadas įgalintas aptikti kroviklius ir priedus" "Įgalinti USB" - - + "Sužinokite daugiau" "Keisti mast., kad atit. ekr." "Ištempti, kad atit. ekr." "Ekrano kopija" @@ -464,10 +462,8 @@ "Daugiau neberodyti" "Viską išvalyti" "Tvarkyti" - - - - + "Tylūs pranešimai" + "Išvalyti visus tylius pranešimus" "Pranešimai pristabdyti naudojant netrukdymo režimą" "Pradėti dabar" "Nėra įspėjimų" @@ -651,21 +647,16 @@ "Blokuoti" "Toliau rodyti" "Sumažinti" - - + "Tylūs" "Neskambėti" - - + "Įspėti" "Toliau įspėti" "Išjungti pranešimus" "Toliau rodyti iš šios programos gautus pranešimus?" - "Netrikdantys" - "Pirmenybiniai" - "Padeda susikaupti, nes pranešimai pateikiami tik išskleidžiamajame skydelyje. Visada nutildyti." - "Pateikiami po prioritetiniais pranešimais. Visada nutildyti." - "Pateikiami po prioritetiniais pranešimais. Visada nutildyti." - "Pateikiami po prioritetiniais pranešimais. Visada nutildyti." - "Dėmesį atkreipia garsas ir būsenos juostos piktograma. Rodomi užrakintame ekrane." + "Tylūs" + "Įspėti" + "Padeda atkreipti dėmesį be garso arba vibravimo." + "Atkreipia dėmesį garsu arba vibravimu." "Šių pranešimų keisti negalima." "Šios grupės pranešimai čia nekonfigūruojami" "Per tarpinį serverį gautas pranešimas" @@ -918,8 +909,7 @@ "Leisti" "Neleisti" "Palietę planuokite akumuliatoriaus tausojimo priemonės veikimą" - - + "Įjunkite, jei akumuliatorius gali greitai išsekti" "Ne, ačiū" "Akumuliatoriaus tausojimo priemonės veikimas suplanuotas" "Akumuliatoriaus tausojimo priemonė bus įjungta automatiškai akumuliatoriaus įkrovai pasiekus mažiau nei %d%%." @@ -952,4 +942,8 @@ "Perkelti į apačią kairėje" "Perkelti į apačią dešinėje" "Atmesti" + + + + diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 5719dc119f27..889629e9034b 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -62,12 +62,10 @@ "USB atkļūdošana nav atļauta" "Lietotājs, kurš pašlaik ir pierakstījies šajā ierīcē, nevar iespējot USB atkļūdošanu. Lai izmantotu šo funkciju, pārslēdzieties uz galveno lietotāju." "USB pieslēgvieta atspējota" - - + "Lai aizsargātu ierīci no šķidruma un gružiem, USB pieslēgvieta ir atspējota un tajā nevarēs noteikt pieslēgtus piederumus.\n\nKad USB pieslēgvietu atkal drīkstēs izmantot, saņemsiet paziņojumu." "USB portam ir iespējota uzlādes ierīču un piederumu noteikšana" "Iespējot USB portu" - - + "Uzzināt vairāk" "Tālumm., lai aizp. ekr." "Stiepiet, lai aizp. ekr." "Ekrānuzņēmums" @@ -461,10 +459,8 @@ "Vairs nerādīt" "Dzēst visu" "Pārvaldīt" - - - - + "Klusie paziņojumi" + "Notīrīt visus klusos paziņojumus" "Paziņojumi pārtraukti, izmantojot iestatījumu “Netraucēt”" "Sākt tūlīt" "Nav paziņojumu" @@ -648,21 +644,16 @@ "Bloķēt" "Turpināt rādīt" "Minimizēt" - - + "Klusums" "Neslēgt skaļumu" - - + "Saņemt brīdinājumus" "Turpināt paziņošanu" "Izslēgt paziņojumus" "Vai turpināt rādīt paziņojumus no šīs lietotnes?" - "Neuzkrītoši" - "Prioritāri" - "Lai netraucētu jums koncentrēties, paziņojumi tiek rādīti tikai nolaižamajā panelī. Vienmēr bez skaņas." - "Tiek rādīts zem prioritārajiem paziņojumiem. Vienmēr bez skaņas." - "Tiek rādīts zem prioritārajiem paziņojumiem. Vienmēr bez skaņas." - "Tiek rādīts zem prioritārajiem paziņojumiem. Vienmēr bez skaņas." - "Lai piesaistītu jūsu uzmanību, tiek atskaņots signāls un tiek rādīta statusa joslas ikona. Paziņojums ir redzams bloķēšanas ekrānā." + "Klusums" + "Brīdinājumu saņemšana" + "Palīdz jums koncentrēties, nenovēršot uzmanību ar skaņu vai vibrāciju." + "Jūsu uzmanība tiek piesaistīta ar skaņas vai vibrācijas signālu." "Šos paziņojumus nevar modificēt." "Šeit nevar konfigurēt šo paziņojumu grupu." "Starpniekservera paziņojums" @@ -913,8 +904,7 @@ "Atļaut" "Neatļaut" "Pieskarieties, lai iestatītu akumulatora jaudas taupīšanas režīma grafiku" - - + "Ieslēgt, ja akumulators var izlādēties" "Nē, paldies" "Ieslēgts akumulatora enerģijas taupīšanas režīma grafiks" "Tiklīdz akumulatora uzlādes līmenis būs zemāks nekā %d%%, tiks automātiski ieslēgts akumulatora jaudas taupīšanas režīms." @@ -947,4 +937,8 @@ "Pārvietot apakšpusē pa kreisi" "Pārvietot apakšpusē pa labi" "Nerādīt" + + + + diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 86109b82ab1b..d6f2ae471469 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -62,12 +62,10 @@ "Отстранувањето грешки на USB не е дозволено" "Корисникот што моментално е најавен на уредов не може да вклучи отстранување грешки на USB. За да ја користите функцијава, префрлете се на примарниот корисник." "USB-портата е оневозможена" - - + "За да го заштитиме уредот од течност или нечистотија, USB-портата е оневозможена и нема да ги открива додатоците.\n\nЌе ве известиме кога ќе биде во ред да ја користите USB-портата повторно." "USB-портата е овозможена за откривање полначи и додатоци" "Овозможи USB" - - + "Дознајте повеќе" "Зумирај да се исполни екранот" "Растегни да се исполни екранот" "Слика од екранот" @@ -458,10 +456,8 @@ "Не покажувај повторно" "Исчисти сè" "Управувајте" - - - - + "Тивки известувања" + "Исчисти ги сите тивки известувања" "Известувањата се паузирани од „Не вознемирувај“" "Започни сега" "Нема известувања" @@ -645,21 +641,16 @@ "Блокирај" "Продолжи да ги прикажуваш" "Минимизирај" - - + "Тивко" "Продолжи со безгласно прикажување" - - + "Предупредувај" "Продолжи да ме предупредуваш" "Исклучи известувања" "Дали да продолжат да се прикажуваат известувања од апликацијава?" - "Тивко" - "Приоритетно" - "Не ви го одвлекува вниманието прикажувајќи известувања само во списокот со известувања. Секогаш безгласно." - "Се прикажува под приоритетните известувања. Секогаш безгласно." - "Се прикажува под приоритетните известувања. Секогаш безгласно." - "Се прикажува под приоритетните известувања. Секогаш безгласно." - "Ви го привлекува вниманието со звук и икона во статусната лента. Се прикажува на заклучен екран." + "Тивко" + "Предупредувај" + "Ви помага да се концентрирате без звук или вибрации." + "Ви го привлекува вниманието со звук или вибрации." "Овие известувања не може да се изменат" "Оваа група известувања не може да се конфигурира тука" "Известување преку прокси" @@ -908,8 +899,7 @@ "Дозволи" "Одбиј" "Допрете за да закажете „Штедач на батерија“" - - + "Вклучи ако е веројатно дека батеријата ќе се испразни" "Не, фала" "Распоредот за „Штедач на батерија“ е вклучен" "Штедачот на батерија ќе се вклучи автоматски кога батеријата ќе падне под %d %%." @@ -942,4 +932,8 @@ "Премести долу лево" "Премести долу десно" "Отфрли" + + + + diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index cd7cb67228fb..5f4e499cbc9c 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -62,12 +62,10 @@ "USB ഡീബഗ്ഗിംഗ് അനുവദനീയമല്ല" "ഉപകരണത്തിൽ ഇപ്പോൾ സൈൻ ഇൻ ചെയ്‌തിരിക്കുന്ന ഉപയോക്താവിന് USB ഡീബഗ്ഗിംഗ് ഓണാക്കാനാകില്ല. ഈ ഫീച്ചർ ഉപയോഗിക്കാൻ പ്രാഥമിക ഉപയോക്താവിലേക്ക് മാറുക." "USB പോർട്ട് പ്രവർത്തനരഹിതമാക്കി" - - + "ദ്രാവകത്തിൽ നിന്നോ പൊടിയിൽ നിന്നോ നിങ്ങളുടെ ഉപകരണത്തെ പരിരക്ഷിക്കാനായി USB പോർട്ട് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നതിനാൽ അത് ആക്‌സസറികളൊന്നും തിരിച്ചറിയില്ല.\n\n USB പോർട്ട് വീണ്ടും ഉപയോഗിക്കാനാകുമ്പോൾ നിങ്ങളെ അറിയിക്കും." "ആക്‌സസറികളും ചാർജറുകളും കണ്ടെത്താൻ USB പോർട്ട് പ്രവർത്തനക്ഷമമാക്കുക" "USB പ്രവർത്തനക്ഷമമാക്കുക" - - + "കൂടുതലറിയുക" "സ്‌ക്രീനിൽ ഉൾക്കൊള്ളിക്കാൻ സൂം ചെയ്യുക" "സ്‌ക്രീനിൽ ഉൾക്കൊള്ളിക്കാൻ വലിച്ചുനീട്ടുക" "സ്‌ക്രീൻഷോട്ട്" @@ -458,10 +456,8 @@ "വീണ്ടും കാണിക്കരുത്" "എല്ലാം മായ്‌ക്കുക" "മാനേജ് ചെയ്യുക" - - - - + "നിശബ്‌ദ അറിയിപ്പുകൾ" + "എല്ലാ നിശബ്‌ദ അറിയിപ്പുകളും മായ്ക്കുക" "\'ശല്യപ്പെടുത്തരുത്\' വഴി അറിയിപ്പുകൾ താൽക്കാലികമായി നിർത്തി" "ഇപ്പോൾ ആരംഭിക്കുക" "അറിയിപ്പുകൾ ഒന്നുമില്ല" @@ -645,21 +641,16 @@ "ബ്ലോക്ക് ചെയ്യുക" "തുടർന്നും കാണിക്കുക" "ചെറുതാക്കുക‍" - - + "നിശബ്‌ദം" "നിശബ്‌ദമായ നിലയിൽ തുടരുക" - - + "മുന്നറിയിപ്പ് നൽകൽ" "മുന്നറിയിപ്പ് നൽകുന്നത് തുടരുക" "അറിയിപ്പുകൾ ഓഫാക്കുക" "ഈ ആപ്പിൽ നിന്നുള്ള അറിയിപ്പുകൾ തുടർന്നും കാണിക്കണോ?" - "സൗമ്യമായ" - "മുൻഗണനയുള്ള" - "പുൾ ഡൗൺ ഷെയ്‌ഡിൽ മാത്രമുള്ള അറിയിപ്പുകളിൽ ശ്രദ്ധ കേന്ദ്രീകരിക്കാൻ നിങ്ങളെ സഹായിക്കുന്നു. എപ്പോഴും നിശബ്‌ദം." - "കുറഞ്ഞ പ്രാധാന്യമുള്ള മുൻഗണനാ അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കുന്നു. എപ്പോഴും നിശബ്‌ദം." - "കുറഞ്ഞ പ്രാധാന്യമുള്ള മുൻഗണനാ അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കുന്നു. എപ്പോഴും നിശബ്‌ദം." - "കുറഞ്ഞ പ്രാധാന്യമുള്ള മുൻഗണനാ അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കുന്നു. എപ്പോഴും നിശബ്‌ദം." - "ശബ്‌ദവും സ്‌റ്റാറ്റസ് ബാർ ഐക്കണും ഉപയോഗിച്ച് ശ്രദ്ധ ക്ഷണിക്കുന്നു. ലോക്ക് സ്‌ക്രീനിൽ കാണിക്കും." + "നിശബ്‌ദം" + "മുന്നറിയിപ്പ് നൽകൽ" + "ശബ്‌ദമോ വൈബ്രേഷനോ ഇല്ലാതെ ശ്രദ്ധ കേന്ദ്രീകരിക്കാൻ നിങ്ങളെ സഹായിക്കുന്നു." + "ശബ്‌ദമോ വെെബ്രേഷനോ ഉപയോഗിച്ച് നിങ്ങളുടെ ശ്രദ്ധ ക്ഷണിക്കുന്നു." "ഈ അറിയിപ്പുകൾ പരിഷ്ക്കരിക്കാനാവില്ല." "അറിയിപ്പുകളുടെ ഈ ഗ്രൂപ്പ് ഇവിടെ കോണ്‍ഫിഗര്‍ ചെയ്യാൻ കഴിയില്ല" "പ്രോക്‌സി അറിയിപ്പ്" @@ -908,8 +899,7 @@ "അനുവദിക്കുക" "നിരസിക്കുക" "ബാറ്ററി ലാഭിക്കൽ ഷെഡ്യൂൾ ചെയ്യാൻ ടാപ്പ് ചെയ്യുക" - - + "ബാറ്ററി ചാർജ് തീരാൻ സാധ്യതയുണ്ടെങ്കിൽ ഓണാക്കുക" "വേണ്ട" "ബാറ്ററി ലാഭിക്കൽ ഷെഡ്യൂൾ ഓണാക്കുക" "ബാറ്ററി %d%% ൽ താഴെയാകുമ്പോൾ, ബാറ്ററി ലാഭിക്കൽ സ്വമേധയാ ഓണാകും." @@ -942,4 +932,8 @@ "ചുവടെ ഇടതുഭാഗത്തേക്ക് നീക്കുക" "ചുവടെ വലതുഭാഗത്തേക്ക് നീക്കുക" "ഡിസ്‌മിസ് ചെയ്യുക" + + + + diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 5630e0d0d849..4ed8fcc3392e 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -62,12 +62,10 @@ "USB алдаа засалт хийх боломжгүй" "Энэ төхөөрөмжид нэвтэрсэн хэрэглэгч USB дебаг хийх онцлогийг асаах боломжгүй байна. Энэ онцлогийг ашиглахын тулд үндсэн хэрэглэгч рүү сэлгэнэ үү." "USB портыг идэвхгүй болгосон" - - + "Таны төхөөрөмжийг шингэн зүйл эсвэл бохирдлоос хамгаалахын тулд USB портыг идэвхгүй болгосон бөгөөд энэ нь ямар ч дагалдах хэрэгслийг илрүүлэхгүй.\n\nТанд USB портыг дахин ашиглахад аюулгүй болох үед мэдэгдэх болно." "Цэнэглэгч болон нэмэлт хэрэгслийг илрүүлэхийн тулд USB портыг идэвхжүүлсэн" "USB-г идэвхжүүлэх" - - + "Нэмэлт мэдээлэл авах" "Дэлгэц дүүргэх бол өсгөнө үү" "Дэлгэц дүүргэх бол татна уу" "Дэлгэцийн зураг дарах" @@ -458,10 +456,8 @@ "Дахиж үл харуулах" "Бүгдийг арилгах" "Удирдах" - - - - + "Чимээгүй мэдэгдэл" + "Бүх чимээгүй мэдэгдлийг арилгах" "Бүү саад бол горимын түр зогсоосон мэдэгдэл" "Одоо эхлүүлэх" "Мэдэгдэл байхгүй" @@ -645,21 +641,16 @@ "Блоклох" "Харуулсан хэвээр байх" "Багасгах" - - + "Чимээгүй" "Чимээгүй хэвээр харуулах" - - + "Сэрэмжлүүлж байна" "Үргэлжлүүлэн сануулах" "Мэдэгдлийг унтраах" "Энэ аппаас мэдэгдэл харуулсан хэвээр байх уу?" - "Бага ач холбогдолтой" - "Чухал ач холбогдолтой" - "Танд зөвхөн доош татдаг сүүдрийн мэдэгдлээр төвлөрөхөд тусалдаг. Үргэлж чимээгүй байна." - "Доорх ач холбогдолтой мэдэгдлийг харуулдаг. Үргэлж чимээгүй байна." - "Доорх ач холбогдолтой мэдэгдлийг харуулдаг. Үргэлж чимээгүй байна." - "Доорх ач холбогдолтой мэдэгдлийг харуулдаг. Үргэлж чимээгүй байна." - "Таны анхаарлыг дуу болон статус самбарын дүрс тэмдгээр татдаг. Түгжигдсэн дэлгэц дээр харуулдаг." + "Чимээгүй" + "Дуутай" + "Дуу эсвэл чичиргээгүйгээр танд төвлөрөхөд тусална." + "Дуу эсвэл чичиргээгүйгээр таны анхаарлыг татна." "Эдгээр мэдэгдлийг өөрчлөх боломжгүй." "Энэ бүлэг мэдэгдлийг энд тохируулах боломжгүй байна" "Прокси хийсэн мэдэгдэл" @@ -908,8 +899,7 @@ "Зөвшөөрөх" "Татгалзах" "Тэжээл хэмнэгч онцлогийг хуваарилахын тулд товших" - - + "Батарей дуусах гэж байгаа үед асаана уу" "Үгүй, баярлалаа" "Тэжээл хэмнэгч онцлогийн хуваарийг асаасан" "Батарей %d%%-с бага болсон үед Тэжээл хэмнэгч автоматаар асна." @@ -942,4 +932,8 @@ "Зүүн доош зөөх" "Баруун доош зөөх" "Үл хэрэгсэх" + + + + diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 34c31e1f5e39..65034a3003cd 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -62,12 +62,10 @@ "USB डीबग करण्‍यास अनुमती नाही" "सध्‍या या डीव्हाइसमध्‍ये साइन इन केलेला वापरकर्ता USB डीबग करणे चालू करू शकत नाही. हे वैशिष्‍ट्य वापरण्‍यासाठी, प्राथमिक वापरकर्त्‍यावर स्विच करा." "USB पोर्ट बंद करा" - - + "तुमच्या डिव्हाइसला ओलावा किंवा धूळीपासून संरक्षित करण्यासाठी, USB पोर्ट बंद आहे आणि अ‍ॅक्सेसरी डिटेक्ट करणार नाही. \n\n तुम्हाला USB पोर्ट पुन्हा वापरणे ठीक आहे तेव्हा सूचित केले जाईल." "चार्जर आणि अ‍ॅक्सेसरी शोधण्यासाठी USB पोर्ट सुरू केलेले आहे" "USB सुरू करा" - - + "अधिक जाणून घ्या" "स्क्रीन भरण्यासाठी झूम करा" "स्क्रीन भरण्यासाठी ताणा" "स्क्रीनशॉट" @@ -458,10 +456,8 @@ "पुन्हा दर्शवू नका" "सर्व साफ करा" "व्यवस्थापित करा" - - - - + "सायलंट सूचना" + "सर्व सायलंट सूचना साफ करा" "व्यत्यय आणून नकाद्वारे सूचना थांबवल्या" "आता सुरू करा" "सूचना नाहीत" @@ -645,21 +641,16 @@ "ब्लॉक करा" "दाखवणे सुरू ठेवा" "लहान करा" - - + "सायलंट" "सायलंट रहा" - - + "सूचना देत आहे" "सूचना देत रहा" "सूचना बंद करा" "या अ‍ॅपकडील सूचना दाखवणे सुरू ठेवायचे?" - "हळू आवाजातील" - "प्राधान्यकृत" - "फक्त पुल डाउन शेडमध्ये सूचनांवर लक्ष केंद्रीत करण्यात मदत करते. नेहमी सायलंट." - "कमी प्राधान्य असलेल्या सूचना दाखवते. नेहमी सायलंट." - "कमी प्राधान्य असलेल्या सूचना दाखवते. नेहमी सायलंट." - "कमी प्राधान्य असलेल्या सूचना दाखवते. नेहमी सायलंट." - "आवाज आणि स्टेटस बार आयकनसह तुमचे लक्ष वेधून घेते. लॉक स्‍क्रीनवर दाखवते." + "सायलंट" + "सूचना देत आहे" + "आवाज किंवा व्हायब्रेशनशिवाय तुम्हाला लक्ष केंद्रित करण्यास मदत करते." + "आवाज किंवा व्हायब्रेशनने तुमचे लक्ष वेधून घेते." "या सूचनांमध्ये सुधारणा केली जाऊ शकत नाही." "या सूचनांचा संच येथे कॉन्फिगर केला जाऊ शकत नाही" "प्रॉक्सी केलेल्या सूचना" @@ -908,8 +899,7 @@ "अनुमती द्या" "नकार द्या" "बॅटरी बचतकर्ता शेड्यूल करण्यासाठी टॅप करा" - - + "बॅटरी संपण्याची शक्यता असल्यास सुरू करा" "नाही नको" "बॅटरी बचतकर्ता शेड्यूल सुरू केले आहे" "बॅटरी %d%% पेक्षा खाली गेल्यास बॅटरी सेव्हर आपोआप सुरू होईल." @@ -942,4 +932,8 @@ "तळाशी डावीकडे हलवा" "तळाशी उजवीकडे हलवा" "डिसमिस करा" + + + + diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 716c24f7e96b..9669077d2afc 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -62,12 +62,10 @@ "Penyahpepijatan USB tidak dibenarkan" "Pengguna yang log masuk ke peranti ini pada masa ini tidak boleh menghidupkan penyahpepijatan USB. Untuk menggunakan ciri ini, tukar kepada pengguna utama." "Port USB dilumpuhkan" - - + "Untuk melindungi peranti anda daripada cecair atau serpihan, port USB dilumpuhkan dan tidak akan mengesan sebarang aksesori.\n\nAnda akan dimaklumi apabila selamat untuk menggunakan port USB lagi." "Port USB didayakan untuk mengesan pengecas dan aksesori" "Dayakan USB" - - + "Ketahui lebih lanjut" "Zum untuk memenuhi skrin" "Regang utk memenuhi skrin" "Tangkapan skrin" @@ -458,10 +456,8 @@ "Jangan tunjukkan lagi" "Kosongkan semua" "Urus" - - - - + "Pemberitahuan senyap" + "Kosongkan semua pemberitahuan senyap" "Pemberitahuan dijeda oleh Jangan Ganggu" "Mulakan sekarang" "Tiada pemberitahuan" @@ -645,21 +641,16 @@ "Sekat" "Terus tunjukkan" "Minimumkan" - - + "Senyap" "Kekal senyap" - - + "Memaklumi" "Teruskan memberikan makluman" "Matikan pemberitahuan" "Terus tunjukkan pemberitahuan daripada apl ini?" - "Lembut" - "Diutamakan" - "Membantu anda fokus dengan memaparkan pemberitahuan sahaja dalam bidai tarik turun. Sentiasa senyap." - "Dipaparkan di bawah pemberitahuan keutamaan. Sentiasa senyap." - "Dipaparkan di bawah pemberitahuan keutamaan. Sentiasa senyap." - "Dipaparkan di bawah pemberitahuan keutamaan. Sentiasa senyap." - "Menarik perhatian anda dengan bunyi & ikon bar status. Ditunjukkan pada skrin kunci." + "Senyap" + "Memaklumi" + "Membantu anda fokus tanpa bunyi atau getaran." + "Menarik perhatian anda dengan bunyi atau getaran." "Pemberitahuan ini tidak boleh diubah suai." "Kumpulan pemberitahuan ini tidak boleh dikonfigurasikan di sini" "Pemberitahuan berproksi" @@ -908,8 +899,7 @@ "Benarkan" "Tolak" "Ketik untuk menjadualkan Penjimat Bateri" - - + "Hidupkan apabila bateri berkemungkinan habis" "Tidak perlu" "Jadual Penjimat Bateri dihidupkan" "Penjimat Bateri akan dihidupkan secara automatik setelah kuasa bateri kurang daripada %d%%." @@ -942,4 +932,8 @@ "Alihkan ke bawah sebelah kiri" "Alihkan ke bawah sebelah kanan" "Ketepikan" + + + + diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index ef095b35dd11..3734536b39c4 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -586,7 +586,7 @@ "အားမသွင်းနေစဉ်တွင် ဘတ်ထရီအဆင့် ရာခိုင်နှုန်းကို အခြေနေပြဘား အိုင်ကွန်တွင် ပြပါ" "အမြန် ဆက်တင်များ" "အခြေအနေပြနေရာ" - "ခြုံငုံသုံးသပ်ချက်" + "အကျဉ်း" "စနစ် UI စရုပ်ပြမုဒ်" "သရုပ်ပြမုဒ်ကို ဖွင့်ရန်" "သရုပ်ပြမုဒ် ပြရန်" @@ -647,13 +647,10 @@ "ဆက်လက် သတိပေးရန်" "အကြောင်းကြားချက်များ ပိတ်ရန်" "ဤအက်ပ်ထံမှ အကြောင်းကြားချက်များကို ဆက်ပြလိုပါသလား။" - "မသိမသာ" - "ဦးစားပေး" - "အပေါ်မှဆွဲချသည့် နေရာတွင်သာ အကြောင်းကြားချက်များကို အာရုံစိုက်ရန် အထောက်ကူပြုပေးသည်။ အမြဲ အသံတိတ်ရန်။" - "ဦးစားပေးအကြောင်းကြားချက်များ၏ အောက်တွင်ဖော်ပြသည်။ အမြဲ အသံတိတ်ရန်။" - "ဦးစားပေးအကြောင်းကြားချက်များ၏ အောက်တွင်ဖော်ပြသည်။ အမြဲ အသံတိတ်ရန်။" - "ဦးစားပေးအကြောင်းကြားချက်များ၏ အောက်တွင်ဖော်ပြသည်။ အမြဲ အသံတိတ်ရန်။" - "အသံ၊ အခြေအနေပြဘား သင်္ကေတတို့ဖြင့် သတိပေးသည်။ လော့ခ်ချထားချိန်မျက်နှာပြင်တွင် ပြသည်။" + "အသံတိတ်ရန်" + "သတိပေးခြင်း" + "အသံ သို့မဟုတ် တုန်ခါမှု မပါဘဲ အာရုံစိုက်နိုင်စေရန် ကူညီပေးသည်။" + "အသံ သို့မဟုတ် တုန်ခါမှုဖြင့် အာရုံစိုက်လာအောင် ပြုလုပ်သည်။" "ဤအကြောင်းကြားချက်များကို ပြုပြင်၍ မရပါ။" "ဤအကြောင်းကြားချက်အုပ်စုကို ဤနေရာတွင် စီစဉ်သတ်မှတ်၍ မရပါ" "ပရောက်စီထည့်ထားသော အကြောင်းကြားချက်" @@ -935,4 +932,8 @@ "ဘယ်အောက်ခြေသို့ ရွှေ့ရန်" "ညာအောက်ခြေသို့ ရွှေ့ပါ" "ပယ်ရန်" + + + + diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 70c0bb20eeba..c10bc376ed1e 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -62,12 +62,10 @@ "USB-feilsøking er ikke tillatt" "Brukeren som for øyeblikket er logget på denne enheten, kan ikke slå på USB-feilsøking. For å bruke denne funksjonen, bytt til hovedbrukeren." "USB-porten er deaktivert" - - + "For å beskytte enheten din mot væsker eller rusk er USB-porten deaktivert og kan ikke oppdage tilbehør.\n\nDu blir varslet når det er trygt å bruke USB-porten igjen." "Registrering av ladere og tilbehør er slått på for USB-porten" "Slå på USB" - - + "Finn ut mer" "Zoom for å fylle skjermen" "Strekk for å fylle skjerm" "Skjermdump" @@ -458,10 +456,8 @@ "Ikke vis igjen" "Fjern alt" "Administrer" - - - - + "Lydløse varsler" + "Fjern alle lydløse varsler" "Varsler er satt på pause av «Ikke forstyrr»" "Start nå" "Ingen varsler" @@ -645,21 +641,16 @@ "Blokkér" "Fortsett å vise" "Minimer" - - + "Lydløs" "Forbli lydløs" - - + "Varsling" "Fortsett å varsle" "Slå av varsler" "Vil du fortsette å vise varsler fra denne appen?" - "Diskré" - "Prioritert" - "Hjelper deg med å fokusere, med varsler bare i nedtrekkspanelet. Alltid lydløs." - "Vises under prioritetsvarsler. Alltid lydløs." - "Vises under prioritetsvarsler. Alltid lydløs." - "Vises under prioritetsvarsler. Alltid lydløs." - "Får oppmerksomheten din med lyd og et ikon i statusfeltet. Vises på låseskjermen." + "Lydløs" + "Varsling" + "Hjelper deg med å fokusere uten lyd eller vibrering." + "Får oppmerksomheten din med lyd eller vibrering." "Disse varslene kan ikke endres." "Denne varselgruppen kan ikke konfigureres her" "Omdirigert varsel" @@ -908,8 +899,7 @@ "Tillat" "Avvis" "Trykk for å planlegge batterisparing" - - + "Slå på når det er sannsynlig at du går tom for batteri" "Nei takk" "Tidsplan for batterisparing er slått på" "Batterisparing slås på automatisk når batteriet er lavere enn %d %%." @@ -942,4 +932,8 @@ "Flytt til nederst til venstre" "Flytt til nederst til høyre" "Avvis" + + + + diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 84989eefb3b3..239e207d2976 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -62,12 +62,10 @@ "USB डिबग गर्न अनुमति छैन" "हाल यस यन्त्रमा साइन इन हुनुभएको प्रयोगकर्ताले USB डिबग सक्रिय गर्न सक्नुहुन्न। यो सुविधाको प्रयोग गर्न प्राथमिक प्रयोगकर्तामा बदल्नुहोस्‌।" "USB पोर्ट असक्षम पारियो" - - + "तपाईंको यन्त्रलाई तरल पदार्थ वा धुलोबाट जोगाउन यसको USB पोर्ट असक्षम पारिएको छ र यसले कुनै पनि सहायक उपकरणहरू पहिचान गर्ने छैन।\n\nउक्त USB पोर्ट फेरि प्रयोग गर्दा हुन्छ भने तपाईंलाई यसबारे सूचित गरिने छ।" "चार्जर तथा सामानहरू पत्ता लगाउन सक्षम पारिएको USB पोर्ट" "USB सक्षम पार्नुहोस्" - - + "थप जान्नुहोस्" "स्क्रिन भर्न जुम गर्नुहोस्" "स्क्रिन भर्न तन्काउनुहोस्" "स्क्रिनसट" @@ -458,10 +456,8 @@ "फेरि नदेखाउनुहोस्" "सबै हटाउनुहोस्" "व्यवस्थित गर्नुहोस्" - - - - + "मौन सूचनाहरू" + "सबै मौन सूचनाहरू हटाउनुहोस्" "बाधा नपुऱ्याउनुहोस् नामक मोडमार्फत पज पारिएका सूचनाहरू" "अहिले सुरु गर्नुहोस्" "कुनै सूचनाहरू छैनन्" @@ -645,21 +641,16 @@ "रोक लगाउनुहोस्" "देखाउने क्रम जारी राख्नुहोस्" "सानो बनाउनुहोस्" - - + "मौन" "मौन रहनुहोस्" - - + "सतर्क गराउने" "सर्तक गराइरहनुहोस्" "सूचनाहरू निष्क्रिय पार्नुहोस्" "यो अनुप्रयोगका सूचनाहरू देखाउने क्रम जारी राख्ने हो?" - "मौन" - "प्राथमिकता दिइएको" - "तपाईंलाई पुल डाउन सेडमा रहेका सूचनाहरूमा मात्र केन्द्रित हुन मद्दत गर्छ। सधैँ मौन।" - "न्यून प्राथमिकताका सूचनाहरू देखाउँछ। सधैँ मौन।" - "न्यून प्राथमिकताका सूचनाहरू देखाउँछ। सधैँ मौन।" - "न्यून प्राथमिकताका सूचनाहरू देखाउँछ। सधैँ मौन।" - "ध्वनि र वस्तुस्थिति पट्टीको आइकनमार्फत तपाईंको ध्यान खिच्छ। लक स्क्रिनमा देखाउँछ।" + "मौन" + "सतर्क गराउँदै" + "तपाईंलाई आवाज वा कम्पनविना ध्यान केन्द्रित गर्न मद्दत गर्छ।" + "ध्वनि वा कम्पनमार्फत तपाईंको ध्यान आकर्षित गर्छ।" "यी सूचनाहरू परिमार्जन गर्न मिल्दैन।" "यहाँबाट सूचनाहरूको यो समूह कन्फिगर गर्न सकिँदैन" "प्रोक्सीमार्फत आउने सूचना" @@ -908,8 +899,7 @@ "अनुमति दिनुहोस्" "अस्वीकार गर्नु…" "ब्याट्री सेभरको समयतालिका बनाउन ट्याप गर्नुहोस्" - - + "ब्याट्री सकिने सम्भावना भएमा सक्रिय गर्नुहोस्" "पर्दैन धन्यवाद" "ब्याट्री सेभरको समयतालिका सक्रिय गरियो" "ब्याट्री %d%% भन्दा कम भएको बेला ब्याट्री सेभर स्वतः सक्रिय हुने छ।" @@ -942,4 +932,8 @@ "पुछारमा बायाँतिर सार्नुहोस्" "पुछारमा दायाँतिर सार्नुहोस्" "हटाउनुहोस्" + + + + diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 26e484545a5c..59cbdaa6066f 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -62,12 +62,10 @@ "USB-foutopsporing niet toegestaan" "De gebruiker die momenteel is ingelogd op dit apparaat, kan USB-foutopsporing niet inschakelen. Als je deze functie wilt gebruiken, schakel je naar de primaire gebruiker." "USB-poort uitgeschakeld" - - + "De USB-poort is uitgeschakeld en detecteert geen accessoires, zodat je apparaat wordt beschermd tegen vloeistof en vuil.\n\nJe ontvangt een melding wanneer je de USB-poort weer kunt gebruiken." "USB-poort kan opladers en accessoires detecteren" "USB inschakelen" - - + "Meer informatie" "Zoom om scherm te vullen" "Rek uit v. schermvulling" "Screenshot" @@ -458,10 +456,8 @@ "Niet opnieuw weergeven" "Alles wissen" "Beheren" - - - - + "Stille meldingen" + "Alle stille meldingen wissen" "Meldingen onderbroken door \'Niet storen\'" "Nu starten" "Geen meldingen" @@ -645,21 +641,16 @@ "Blokkeren" "Blijven weergeven" "Minimaliseren" - - + "Stil" "Stil blijven" - - + "Waarschuwen" "Blijven waarschuwen" "Meldingen uitschakelen" "Meldingen van deze app blijven weergeven?" - "Vriendelijk" - "Met prioriteit" - "Helpt je focussen doordat meldingen alleen in het pull-downvenster worden weergegeven. Altijd stil." - "Wordt weergegeven onder de prioriteitsmeldingen. Altijd stil." - "Wordt weergegeven onder de prioriteitsmeldingen. Altijd stil." - "Wordt weergegeven onder de prioriteitsmeldingen. Altijd stil." - "Trekt de aandacht met geluid en een pictogram in de statusbalk. Wordt weergegeven op het vergrendelingsscherm." + "Stil" + "Waarschuwen" + "Helpt je focussen zonder geluid of trilling." + "Trekt je aandacht met geluid of trillingen." "Deze meldingen kunnen niet worden aangepast." "Deze groep meldingen kan hier niet worden geconfigureerd" "Melding via proxy" @@ -908,8 +899,7 @@ "Toestaan" "Weigeren" "Tikken om Batterijbesparing in te schakelen" - - + "Inschakelen wanneer de batterij waarschijnlijk leeg raakt" "Nee" "Batterijbesparing is ingeschakeld" "Batterijbesparing wordt automatisch ingeschakeld wanneer de batterijstatus lager is dan %d%%." @@ -942,4 +932,8 @@ "Naar linksonder verplaatsen" "Naar rechtsonder verplaatsen" "Sluiten" + + + + diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 1de3ea35c539..2aa9c9689827 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -62,12 +62,10 @@ "USBରେ ଡିବଗ୍‍ କରାଯାଇପାରିବ ନାହିଁ" "ସମ୍ପ୍ରତି ସାଇନ୍‍-ଇନ୍‍ କରିଥିବା ୟୁଜର୍‍ ଜଣକ ଏହି ଡିଭାଇସରେ USB ଡିବଗିଙ୍ଗ ଅନ୍‍ କରିପାରିବେ ନାହିଁ। ଏହି ବୈଶିଷ୍ଟ୍ୟ ବ୍ୟବହାର କରିବାକୁ, ପ୍ରାଥମିକ ୟୁଜର୍‍ରେ ସାଇନ୍‍-ଇନ୍‍ କରନ୍ତୁ।" "USB ପୋର୍ଟକୁ ଅକ୍ଷମ କରାଯାଇଛି" - - + "ଆପଣଙ୍କ ଡିଭାଇସ୍‌କୁ ତରଳ ପଦାର୍ଥ ଏବଂ ଧୂଳିରୁ ସୁରକ୍ଷିତ ରଖିବା ପାଇଁ, USB ପୋର୍ଟକୁ ଅକ୍ଷମ କରାଯାଇଛି ଏବଂ ଏହା କୌଣସି ଉପକରଣ ଚିହ୍ନଟ କରିବ ନାହିଁ। \n\n ଯେତେବେଳେ USB ପୋର୍ଟ ପୁଣିି ବ୍ୟବହାର କରିବାକୁ ସୁରକ୍ଷିତ ହେବ, ସେତେବେଳେ ଆପଣଙ୍କୁ ସୂଚିତ କରାଯିବ।" "ଚାର୍ଜର୍‍ ଏବଂ ଆକ୍ସେସରିଗୁଡ଼ିକୁ ଚିହ୍ନଟ କରିବାକୁ USB ପୋର୍ଟ ସକ୍ଷମ କରାଯାଇଛି" "USB ସକ୍ଷମ କରନ୍ତୁ" - - + "ଅଧିକ ଜାଣନ୍ତୁ" "ସ୍କ୍ରୀନ ଭରିବା ପାଇଁ ଜୁମ୍ କରନ୍ତୁ" "ସ୍କ୍ରୀନ୍‌କୁ ଭରିବା ପାଇଁ ଟାଣନ୍ତୁ" "ସ୍କ୍ରୀନଶଟ୍‌" @@ -458,10 +456,8 @@ "ପୁଣି ଦେଖାନ୍ତୁ ନାହିଁ" "ସମସ୍ତ ଖାଲି କରନ୍ତୁ" "ପରିଚାଳନା କରନ୍ତୁ" - - - - + "ନୀରବ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ" + "ସମସ୍ତ ନୀରବ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଖାଲି କରନ୍ତୁ" "\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ବିକଳ୍ପ ଦ୍ୱାରା ବିଜ୍ଞପ୍ତି ପଜ୍‍ ହୋଇଛି" "ବର୍ତ୍ତମାନ ଆରମ୍ଭ କରନ୍ତୁ" "କୌଣସି ବିଜ୍ଞପ୍ତି ନାହିଁ" @@ -645,21 +641,16 @@ "ବ୍ଲକ୍ କରନ୍ତୁ" "ଦେଖାଇବା ଜାରି ରଖନ୍ତୁ" "ଛୋଟ କରନ୍ତୁ" - - + "ନୀରବ" "ନୀରବ ରହନ୍ତୁ" - - + "ଆଲର୍ଟ କରିବା" "ଆଲର୍ଟ କରିବା ଜାରି ରଖନ୍ତୁ" "ବିଜ୍ଞପ୍ତି ବନ୍ଦ କରନ୍ତୁ" "ଏହି ଆପ୍‌ରୁ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାଇବା ଜାରି ରଖିବେ?" - "ଧିରେ" - "ପ୍ରାଥମିକତା ଭିତ୍ତିକ" - "କେବଳ ପୁଲ୍-ଡାଉନ୍ ସେଡ୍‌ରେ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଉପରେ ଫୋକସ୍ ରହିବା ପାଇଁ ଆପଣଙ୍କୁ ସାହାଯ୍ୟ କରିଥାଏ। ସର୍ବଦା ନୀରବ।" - "ପ୍ରାଥମିକତା ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ତଳେ ଡିସ୍‌ପ୍ଲେ ହୁଏ। ସର୍ବଦା ନିରବ।" - "ପ୍ରାଥମିକତା ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ତଳେ ଡିସ୍‌ପ୍ଲେ ହୁଏ। ସର୍ବଦା ନିରବ।" - "ପ୍ରାଥମିକତା ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ତଳେ ଡିସ୍‌ପ୍ଲେ ହୁଏ। ସର୍ବଦା ନିରବ।" - "ସାଉଣ୍ଡ୍ ଏବଂ ଏକ ଷ୍ଟାଟସ୍ ବାର୍ ଆଇକନ୍ ମାଧ୍ୟମରେ ଆପଣଙ୍କର ଧ୍ୟାନ ଆକର୍ଷିତ କରିଥାଏ। ଲକ୍ ସ୍କ୍ରିନ୍‌ରେ ଦେଖାଯାଇଥାଏ।" + "ନୀରବ" + "ଆଲର୍ଟ କରିବା" + "ବିନା ସାଉଣ୍ଡ କିମ୍ବା ଭାଇବ୍ରେସନ୍‌ରେ ଆପଣଙ୍କୁ ଫୋକସ୍ କରିବାରେ ସାହାଯ୍ୟ କରେ।" + "ସାଉଣ୍ଡ କିମ୍ବା ଭାଇବ୍ରେସନ୍ ମାଧ୍ୟମରେ ଆପଣଙ୍କର ଧ୍ୟାନ ଆକର୍ଷିତ କରିଥାଏ।" "ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ କରିହେବ ନାହିଁ।" "ଏଠାରେ ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ଗ୍ରୁପ୍ କନଫ୍ୟୁଗର୍ କରାଯାଇପାରିବ ନାହିଁ" "ବିଜ୍ଞପ୍ତି ପ୍ରକ୍ସୀ ହୋଇଛି" @@ -755,7 +746,7 @@ "ଡାଟା ସେଭର୍‌ ଅନ୍‌ ଅଛି" "ଡାଟା ସେଭର୍‍ ଅଫ୍ ଅଛି" "ଅନ୍" - "ଅଫ୍" + "ବନ୍ଦ" "ନାଭିଗେଶନ୍ ବାର୍‍" "ଲେଆଉଟ୍" "ସମ୍ପୂର୍ଣ୍ଣ ବାମ ବଟନ୍‍ ପ୍ରକାର" @@ -908,8 +899,7 @@ "ଅନୁମତି ଦିଅନ୍ତୁ" "ଅସ୍ଵୀକାର କରନ୍ତୁ" "ବ୍ୟାଟେରୀ ସେଭର୍‌ ଅନ୍‌ ହେବାର ସମୟ ସେଟ୍‌ କରିବାକୁ ଟାପ୍‌ କରନ୍ତୁ" - - + "ବ୍ୟାଟେରୀ ସରିବାକୁ ଥିବା ସମୟରେ ଚାଲୁ କରନ୍ତୁ" "ନାହିଁ, ଥାଉ" "ଆଗରୁ ସେଟ୍‌ କରିଥିବା ସମୟ ଅନୁସାରେ ବ୍ୟାଟେରୀ ସେଭର୍‌ ଅନ୍‌ ହୋଇଛି" "ଚାର୍ଜ %d%%ରୁ କମ୍‌ ହେଲେ ବ୍ୟାଟେରୀ ସେଭର୍‌ ଆପେ ଅନ୍‌ ହୋଇଯିବ।" @@ -942,4 +932,8 @@ "ତଳ ବାମକୁ ନିଅନ୍ତୁ" "ତଳ ଡାହାଣକୁ ନିଅନ୍ତୁ" "ଖାରଜ କରନ୍ତୁ" + + + + diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index bb8bfb0f5784..86c04d4449b0 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -62,12 +62,10 @@ "USB ਡਿਬੱਗਿੰਗ ਦੀ ਆਗਿਆ ਨਹੀਂ" "The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user." "USB ਪੋਰਟ ਬੰਦ ਕੀਤਾ ਗਿਆ" - - + "ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨੂੰ ਪਾਣੀ ਅਤੇ ਧੂੜ-ਮਿੱਟੀ ਤੋਂ ਬਚਾਉਣ ਲਈ, USB ਪੋਰਟ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ ਅਤੇ ਕੋਈ ਵੀ ਐਕਸੈਸਰੀ ਪਛਾਣੀ ਨਹੀਂ ਜਾਵੇਗੀ।\n\nUSB ਪੋਰਟ ਨੂੰ ਦੁਬਾਰਾ ਵਰਤਣਾ ਠੀਕ ਹੋਣ \'ਤੇ ਤੁਹਾਨੂੰ ਸੂਚਿਤ ਕੀਤਾ ਜਾਵੇਗਾ।" "ਚਾਰਜਰਾਂ ਅਤੇ ਉਪਸਾਧਨਾਂ ਦੀ ਪਛਾਣ ਕਰਨ ਲਈ USB ਪੋਰਟ ਚਾਲੂ ਹੈ" "USB ਚਾਲੂ ਕਰੋ" - - + "ਹੋਰ ਜਾਣੋ" "ਸਕ੍ਰੀਨ ਭਰਨ ਲਈ ਜ਼ੂਮ ਕਰੋ" "ਸਕ੍ਰੀਨ ਭਰਨ ਲਈ ਸਟ੍ਰੈਚ ਕਰੋ" "ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਵੋ" @@ -458,10 +456,8 @@ "ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ" "ਸਭ ਕਲੀਅਰ ਕਰੋ" "ਪ੍ਰਬੰਧਨ ਕਰੋ" - - - - + "ਖਾਮੋਸ਼ ਸੂਚਨਾਵਾਂ" + "ਸਾਰੀਆਂ ਖਾਮੋਸ਼ ਸੂਚਨਾਵਾਂ ਕਲੀਅਰ ਕਰੋ" "\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਰੋਕਿਆ ਗਿਆ" "ਹੁਣ ਚਾਲੂ ਕਰੋ" "ਕੋਈ ਸੂਚਨਾਵਾਂ ਨਹੀਂ" @@ -645,21 +641,16 @@ "ਬਲਾਕ ਕਰੋ" "ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖੋ" "ਛੋਟਾ ਕਰੋ" - - + "ਖਾਮੋਸ਼" "ਚੁੱਪ ਰਹੋ" - - + "ਸੁਚੇਤਨਾ" "ਸੁਚੇਤ ਰਖੋ" "ਸੂਚਨਾਵਾਂ ਬੰਦ ਕਰੋ" "ਕੀ ਇਸ ਐਪ ਤੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?" - "ਸਰਲ" - "ਤਰਜੀਹੀ" - "ਸਿਰਫ਼ ਹੇਠਾਂ ਖਿੱਚੀ ਜਾਣ ਵਾਲੀ ਸੂਚੀ ਵਿਚਲੀਆਂ ਸੂਚਨਾਵਾਂ ਨਾਲ ਧਿਆਨ ਦੇਣ ਵਿੱਚ ਤੁਹਾਡੀ ਮਦਦ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਹਮੇਸ਼ਾਂ ਖਮੋਸ਼।" - "ਘੱਟ ਤਰਜੀਹ ਵਾਲੀਆਂ ਸੂਚਨਾਵਾਂ ਦਿਖਾਓ। ਹਮੇਸ਼ਾਂ ਖਮੋਸ਼।" - "ਘੱਟ ਤਰਜੀਹ ਵਾਲੀਆਂ ਸੂਚਨਾਵਾਂ ਦਿਖਾਓ। ਹਮੇਸ਼ਾਂ ਖਮੋਸ਼।" - "ਘੱਟ ਤਰਜੀਹ ਵਾਲੀਆਂ ਸੂਚਨਾਵਾਂ ਦਿਖਾਓ। ਹਮੇਸ਼ਾਂ ਖਮੋਸ਼।" - "ਧੁਨੀ ਅਤੇ ਸਥਿਤੀ ਪੱਟੀ ਪ੍ਰਤੀਕ ਨਾਲ ਤੁਹਾਡਾ ਧਿਆਨ ਖਿੱਚਦੀ ਹੈ। ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਖਾਓ।" + "ਖਮੋਸ਼" + "ਸੁਚੇਤਨਾ" + "ਤੁਹਾਨੂੰ ਬਿਨਾਂ ਧੁਨੀ ਅਤੇ ਥਰਥਰਾਹਟ ਦੇ ਫੋਕਸ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰਦਾ ਹੈ।" + "ਧੁਨੀ ਅਤੇ ਥਰਥਰਾਹਟ ਨਾਲ ਤੁਹਾਡਾ ਧਿਆਨ ਖਿੱਚਦੀ ਹੈ।" "ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸੋਧਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।" "ਇਹ ਸੂਚਨਾਵਾਂ ਦਾ ਗਰੁੱਪ ਇੱਥੇ ਸੰਰੂਪਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" "ਇੱਕ ਐਪ ਦੀ ਥਾਂ \'ਤੇ ਦੂਜੀ ਐਪ ਰਾਹੀਂ ਦਿੱਤੀ ਗਈ ਸੂਚਨਾ" @@ -908,8 +899,7 @@ "ਕਰਨ ਦਿਓ" "ਅਸਵੀਕਾਰ ਕਰੋ" "ਬੈਟਰੀ ਸੇਵਰ ਦੀ ਸਮਾਂ-ਸੂਚੀ ਤਿਆਰ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ" - - + "ਬੈਟਰੀ ਖਤਮ ਹੋਣ ਦੀ ਸੰਭਾਵਨਾ \'ਤੇ ਚਾਲੂ ਹੁੰਦਾ ਹੈ" "ਨਹੀਂ ਧੰਨਵਾਦ" "ਬੈਟਰੀ ਸੇਵਰ ਸਮਾਂ-ਸੂਚੀ ਚਾਲੂ ਕੀਤੀ ਗਈ" "ਬੈਟਰੀ ਦਾ ਪੱਧਰ %d%% ਤੋਂ ਘੱਟ ਹੋ ਜਾਣ \'ਤੇ ਬੈਟਰੀ ਸੇਵਰ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਚਾਲੂ ਹੋ ਜਾਵੇਗਾ।" @@ -942,4 +932,8 @@ "ਹੇਠਾਂ ਵੱਲ ਖੱਬੇ ਲਿਜਾਓ" "ਹੇਠਾਂ ਵੱਲ ਸੱਜੇ ਲਿਜਾਓ" "ਖਾਰਜ ਕਰੋ" + + + + diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index fdb4a3b60c80..ec055005aa04 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -62,12 +62,10 @@ "Debugowanie USB jest niedozwolone" "Użytkownik obecnie zalogowany na tym urządzeniu nie może włączyć debugowania USB. Aby użyć tej funkcji, przełącz się na użytkownika głównego." "Port USB wyłączony" - - + "Aby chronić urządzenie przed wilgocią i zanieczyszczeniami, port USB został wyłączony i nie wykryje żadnych akcesoriów.\n\nOtrzymasz powiadomienie, gdy będzie można znów używać portu." "Port USB włączony, by wykrywać ładowarki i akcesoria" "Włącz USB" - - + "Więcej informacji" "Powiększ, aby wypełnić ekran" "Rozciągnij, aby wypełnić ekran" "Zrzut ekranu" @@ -466,10 +464,8 @@ "Nie pokazuj ponownie" "Ukryj wszystkie" "Zarządzaj" - - - - + "Powiadomienia ciche" + "Wyczyść wszystkie ciche powiadomienia" "Powiadomienia wstrzymane przez tryb Nie przeszkadzać" "Rozpocznij teraz" "Brak powiadomień" @@ -653,21 +649,16 @@ "Zablokuj" "Pokazuj nadal" "Minimalizuj" - - + "Bez dźwięku" "Zachowaj wyciszenie" - - + "Alerty" "Powiadamiaj dalej" "Wyłącz powiadomienia" "Nadal pokazywać powiadomienia z tej aplikacji?" - "Subtelne" - "Priorytetowe" - "Pomaga Ci się skupić, wyświetlając powiadomienia tylko w obszarze powiadomień. Zawsze wyciszone." - "Wyświetla pod powiadomieniami priorytetowymi. Zawsze wyciszone." - "Wyświetla pod powiadomieniami priorytetowymi. Zawsze wyciszone." - "Wyświetla pod powiadomieniami priorytetowymi. Zawsze wyciszone." - "Zwraca Twoją uwagę dźwiękiem i ikoną na pasku stanu. Wyświetla na ekranie blokady." + "Bez dźwięku" + "Alert" + "Pomaga Ci się skupić, nie sygnalizując niczego dźwiękiem ani wibracjami." + "Przyciąga uwagę dźwiękiem lub wibracjami." "Tych powiadomień nie można zmodyfikować." "Tej grupy powiadomień nie można tu skonfigurować" "Powiadomienie w zastępstwie" @@ -920,8 +911,7 @@ "Zezwól" "Odmów" "Kliknij, by zaplanować działanie oszczędzania baterii" - - + "Oszczędzanie baterii włącza się, jeśli bateria jest prawie wyczerpana" "Nie" "Harmonogram oszczędzania baterii jest aktywny" "Oszczędzanie baterii włączy się automatycznie, gdy poziom naładowania baterii spadnie poniżej %d%%." @@ -954,4 +944,8 @@ "Przenieś w lewy dolny róg" "Przenieś w prawy dolny róg" "Zamknij" + + + + diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 6edbced561e7..a7d85ab8b524 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -62,12 +62,10 @@ "Depuração USB não permitida" "O usuário conectado a este dispositivo não pode ativar a depuração USB. Para usar esse recurso, mude para o usuário principal \"NAME\"." "Porta USB desativada" - - + "Para proteger seu dispositivo de líquidos e detritos, a porta USB está desativada e não detectará nenhum acessório.\n\nVocê receberá uma notificação quando for seguro usar a porta USB novamente." "Porta USB ativada para detectar carregadores e acessórios" "Ativar USB" - - + "Saiba mais" "Zoom p/ preencher a tela" "Ampliar p/ preencher tela" "Captura de tela" @@ -458,10 +456,8 @@ "Não mostrar novamente" "Limpar tudo" "Gerenciar" - - - - + "Notificações silenciosas" + "Apagar todas as notificações silenciosas" "Notificações pausadas pelo modo \"Não perturbe\"" "Iniciar agora" "Sem notificações" @@ -645,21 +641,16 @@ "Bloquear" "Continuar mostrando" "Minimizar" - - + "Silencioso" "Continuar sem som" - - + "Alertar" "Continuar alertando" "Desativar notificações" "Continuar mostrando notificações desse app?" - "Discreta" - "Priorizada" - "Ajuda você a se concentrar, já que as notificações são exibidas apenas na aba suspensa. Sempre silenciosa." - "Exibida abaixo das notificações prioritárias. Sempre silenciosa." - "Exibida abaixo das notificações prioritárias. Sempre silenciosa." - "Exibida abaixo das notificações prioritárias. Sempre silenciosa." - "Chama sua atenção com sons e um ícone na barra de status. Exibida na tela de bloqueio." + "Silenciosa" + "Alertar" + "Ajuda você a manter o foco sem som ou vibração." + "Chama sua atenção com som ou vibração." "Não é possível modificar essas notificações." "Não é possível configurar esse grupo de notificações aqui" "Notificação salva no proxy" @@ -908,8 +899,7 @@ "Permitir" "Negar" "Toque para programar o recurso Economia de bateria" - - + "Ativada quando há possibilidade de a bateria acabar" "Não" "Programação do recurso Economia de bateria ativada" "O recurso Economia de bateria será ativado automaticamente depois que a bateria ficar abaixo de %d%%." @@ -942,4 +932,8 @@ "Mover para canto inferior esquerdo" "Mover para canto inferior direito" "Dispensar" + + + + diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index e373b3bf2687..4260dc203991 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -62,12 +62,10 @@ "Depuração USB não permitida" "O utilizador com sessão iniciada atualmente neste dispositivo não pode ativar a depuração USB. Para utilizar esta funcionalidade, mude para o utilizador principal." "Porta USB desativada" - - + "Para proteger o dispositivo contra líquidos ou resíduos, a porta USB está desativada e não irá detetar quaisquer acessórios.\n\nSerá notificado quando for seguro utilizar a porta USB novamente." "Porta USB ativada para detetar carregadores e acessórios" "Ativar USB" - - + "Saiba mais" "Zoom para preencher o ecrã" "Esticar p. caber em ec. int." "Captura de ecrã" @@ -458,10 +456,8 @@ "Não mostrar de novo" "Limpar tudo" "Gerir" - - - - + "Notificações silenciosas" + "Limpar todas as notificações silenciosas" "Notificações colocadas em pausa pelo modo Não incomodar." "Começar agora" "Sem notificações" @@ -645,21 +641,16 @@ "Bloquear" "Continuar a mostrar" "Minimizar" - - + "Silencioso" "Continuar sem som" - - + "Alertar" "Continuar a alertar" "Desativar notificações" "Pretende continuar a ver notificações desta aplicação?" - "Discretas" - "Prioritárias" - "Ajuda-o a concentrar-se com notificações apenas no painel pendente. Sempre silenciosa." - "É apresentada abaixo das notificações prioritárias. Sempre silenciosa." - "É apresentada abaixo das notificações prioritárias. Sempre silenciosa." - "Apresentadas abaixo das notificações prioritárias. Sempre silenciosas." - "Chamam à atenção com som e ícones na barra de estado. Apresentadas no ecrã de bloqueio." + "Silencioso" + "Alertar" + "Ajuda-o a focar-se sem som ou vibração." + "Chama a sua atenção com som ou vibração." "Não é possível modificar estas notificações." "Não é possível configurar este grupo de notificações aqui." "Notificação de aplicação proxy" @@ -908,8 +899,7 @@ "Permitir" "Recusar" "Tocar para agendar a Poupança de bateria" - - + "Ativar quando for provável que a bateria se esgote" "Não, obrigado" "Poupança de bateria agendada ativada" "A Poupança de bateria é ativada automaticamente quando o nível de bateria está abaixo de %d%%." @@ -942,4 +932,8 @@ "Mover p/ parte infer. esquerda" "Mover parte inferior direita" "Ignorar" + + + + diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 6edbced561e7..a7d85ab8b524 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -62,12 +62,10 @@ "Depuração USB não permitida" "O usuário conectado a este dispositivo não pode ativar a depuração USB. Para usar esse recurso, mude para o usuário principal \"NAME\"." "Porta USB desativada" - - + "Para proteger seu dispositivo de líquidos e detritos, a porta USB está desativada e não detectará nenhum acessório.\n\nVocê receberá uma notificação quando for seguro usar a porta USB novamente." "Porta USB ativada para detectar carregadores e acessórios" "Ativar USB" - - + "Saiba mais" "Zoom p/ preencher a tela" "Ampliar p/ preencher tela" "Captura de tela" @@ -458,10 +456,8 @@ "Não mostrar novamente" "Limpar tudo" "Gerenciar" - - - - + "Notificações silenciosas" + "Apagar todas as notificações silenciosas" "Notificações pausadas pelo modo \"Não perturbe\"" "Iniciar agora" "Sem notificações" @@ -645,21 +641,16 @@ "Bloquear" "Continuar mostrando" "Minimizar" - - + "Silencioso" "Continuar sem som" - - + "Alertar" "Continuar alertando" "Desativar notificações" "Continuar mostrando notificações desse app?" - "Discreta" - "Priorizada" - "Ajuda você a se concentrar, já que as notificações são exibidas apenas na aba suspensa. Sempre silenciosa." - "Exibida abaixo das notificações prioritárias. Sempre silenciosa." - "Exibida abaixo das notificações prioritárias. Sempre silenciosa." - "Exibida abaixo das notificações prioritárias. Sempre silenciosa." - "Chama sua atenção com sons e um ícone na barra de status. Exibida na tela de bloqueio." + "Silenciosa" + "Alertar" + "Ajuda você a manter o foco sem som ou vibração." + "Chama sua atenção com som ou vibração." "Não é possível modificar essas notificações." "Não é possível configurar esse grupo de notificações aqui" "Notificação salva no proxy" @@ -908,8 +899,7 @@ "Permitir" "Negar" "Toque para programar o recurso Economia de bateria" - - + "Ativada quando há possibilidade de a bateria acabar" "Não" "Programação do recurso Economia de bateria ativada" "O recurso Economia de bateria será ativado automaticamente depois que a bateria ficar abaixo de %d%%." @@ -942,4 +932,8 @@ "Mover para canto inferior esquerdo" "Mover para canto inferior direito" "Dispensar" + + + + diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index db853a098fb9..31709b66f2e9 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -62,12 +62,10 @@ "Remedierea erorilor prin USB nu este permisă" "Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor prin USB. Pentru a folosi această funcție, comutați la utilizatorul principal." "Portul USB a fost dezactivat" - - + "Pentru a vă proteja dispozitivul de lichide sau reziduuri, portul USB este dezactivat și nu va detecta niciun accesoriu.\n\nVeți primi o notificare când puteți folosi din nou portul USB." "Portul USB a fost activat pentru a detecta încărcătoarele și accesoriile" "Activați USB" - - + "Mai multe" "Zoom pt. a umple ecranul" "Înt. pt. a umple ecranul" "Instantaneu" @@ -461,10 +459,8 @@ "Nu se mai afișează" "Ștergeți toate notificările" "Gestionați" - - - - + "Notificări silențioase" + "Ștergeți toate notificările silențioase" "Notificări întrerupte prin „Nu deranja”" "Începeți acum" "Nicio notificare" @@ -648,21 +644,16 @@ "Blocați" "Continuați afișarea" "Minimizați" - - + "Silențios" "Păstrați modul silențios" - - + "Alertare" "Păstrați alerta" "Dezactivați notificările" "Doriți să continuați afișarea notificărilor de la această aplicație?" - "Discret" - "Cu prioritate" - "Vă ajută să vă concentrați cu notificări doar în fereastra trasă în jos. Întotdeauna silențios." - "Se afișează sub notificările prioritare. Întotdeauna silențios." - "Se afișează sub notificările prioritare. Întotdeauna silențios." - "Se afișează sub notificările prioritare. Întotdeauna silențios." - "Vă atrage atenția cu sunete și o pictogramă în bara de stare. Se afișează pe ecranul de blocare." + "Silențios" + "Alertare" + "Vă ajută să vă concentrați fără sunet sau vibrare." + "Vă atrage atenția fără sunet sau vibrare." "Aceste notificări nu pot fi modificate." "Acest grup de notificări nu poate fi configurat aici" "Notificare prin proxy" @@ -913,8 +904,7 @@ "Permiteți" "Refuzați" "Atingeți pentru a programa Economisirea energiei" - - + "Porniți dacă este probabil ca bateria să se descarce" "Nu, mulțumesc" "S-a activat programarea pentru Economisirea bateriei" "Economisirea bateriei se va activa automat imediat ce bateria scade sub %d%%." @@ -947,4 +937,8 @@ "Mutați în stânga jos" "Mutați în dreapta jos" "Închideți" + + + + diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 98b18685e1d6..6c926f121a5f 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -62,12 +62,10 @@ "Отладка по USB запрещена" "В этом аккаунте нельзя включить отладку по USB. Перейдите в аккаунт основного пользователя." "USB-порт отключен" - - + "Чтобы внутрь устройства не попала вода или грязь, USB-порт был отключен. Сейчас через него нельзя подсоединять другие устройства.\n\nКогда USB-порт снова можно будет использовать, вы получите уведомление." "USB-порт активен и может распознавать аксессуары и зарядные устройства." "Включить USB-порт" - - + "Подробнее" "Подогнать по размерам экрана" "Растянуть на весь экран" "Скриншот" @@ -464,10 +462,8 @@ "Больше не показывать" "Очистить все" "Настроить" - - - - + "Беззвучные уведомления" + "Отклонить все беззвучные уведомления" "В режиме \"Не беспокоить\" уведомления заблокированы" "Начать" "Нет уведомлений" @@ -651,21 +647,16 @@ "Заблокировать" "Показывать" "Свернуть" - - + "Без звука" "Не включать звук" - - + "Присылать оповещения" "Присылать уведомления" "Выключить уведомления" "Показывать уведомления от этого приложения?" - "Беззвучные" - "Приоритетные" - "Уведомления появляются только на специальной панели, чтобы вы не отвлекались. Всегда без звука." - "Показ уведомлений с низким приоритетом. Всегда без звука." - "Показ уведомлений с низким приоритетом. Всегда без звука." - "Показ уведомлений с низким приоритетом. Всегда без звука." - "Со звуком и значком в строке состояния. Появляются на заблокированном экране." + "Без звука" + "Оповещения" + "Уведомления приходят без звука и вибрации" + "Уведомления приходят со звуком или вибрацией" "Эти уведомления нельзя изменить." "Эту группу уведомлений нельзя настроить здесь." "Уведомление отправлено через прокси-сервер." @@ -918,8 +909,7 @@ "Да" "Нет" "Нажмите, чтобы настроить режим энергосбережения" - - + "Включать, если высока вероятность, что батарея скоро разрядится" "Отмена" "Автоматический переход в режим энергосбережения включен" "Режим энергосбережения активируется при заряде батареи ниже %d %%." @@ -952,4 +942,8 @@ "Перенести в левый нижний угол" "Перенести в правый нижний угол" "Закрыть" + + + + diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index a2be25967b84..aee39fd0b10d 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -647,13 +647,10 @@ "අඟවමින් සිටින්න" "දැනුම්දීම් අක්‍රිය කරන්න" "මෙම යෙදුම වෙතින් දැනුම්දීම් පෙන්වමින් තබන්නද?" - "මෘදු" - "ප්‍රමුඛ කළ" - "ඔබට පහළට-ඇදීමේ වැස්මේ පමණක් දැනුම්දීම් සමඟ අවධානය යොමු කිරීමට උදවු කරයි. සැම විටම නිහඬයි." - "ප්‍රමුඛතා දැනුම්දීම්වලට පහළින් සංදර්ශනය වේ. සැම විටම නිහඬයි." - "ප්‍රමුඛතා දැනුම්දීම්වලට පහළින් සංදර්ශනය වේ. සැම විටම නිහඬයි." - "ප්‍රමුඛතා දැනුම්දීම්වලට පහළින් සංදර්ශනය වේ. සැම විටම නිහඬයි." - "ශබ්දයක් සහ තත්ත්ව තීරු නිරූපකයක් සමඟින් ඔබේ අවධානය ලබා ගනී. අගුළු තිරයෙහි පෙන්වයි." + "නිහඬ" + "ඇඟවීම" + "ඔබට ශබ්දය හෝ කම්පනය නොමැතිව අවධානය යොමු කිරීමට උදවු කරයි." + "ශබ්දය හෝ කම්පනය සමඟ ඔබේ අවධානය ලබා ගනී." "මෙම දැනුම්දීම් වෙනස් කළ නොහැක." "මෙම දැනුම්දීම් සමූහය මෙහි වින්‍යාස කළ නොහැක" "ප්‍රොක්සි කළ දැනුම්දීම" @@ -935,4 +932,8 @@ "පහළ වමට ගෙන යන්න" "පහළ දකුණට ගෙන යන්න" "ඉවතලන්න" + + + + diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index f4712e34d663..6bb9dfec5548 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -62,12 +62,10 @@ "Ladenie cez USB nie je povolené" "Používateľ, ktorý je práve prihlásený v tomto zariadení, nemôže zapnúť ladenie USB. Ak chcete použiť túto funkciu, prepnite na hlavného používateľa." "Port USB je deaktivovaný" - - + "Port USB je deaktivovaný na zaistenie ochrany zariadenia pred tekutinami alebo nečistotami a nerozpoznáva príslušenstvo.\n\nKeď ho budete môcť znova použiť, upozorníme vás." "Bol povolený port USB na zisťovanie nabíjačiek a príslušenstva" "Povoliť USB" - - + "Ďalšie informácie" "Priblížiť na celú obrazovku" "Na celú obrazovku" "Snímka" @@ -313,7 +311,7 @@ "Zvuk" "Náhlavná súprava" "Vstup" - "Načúvacie pomôcky" + "Načúvadlá" "Zapína sa…" "Jas" "Automatické otáčanie" @@ -464,10 +462,8 @@ "Nabudúce nezobrazovať" "Vymazať všetko" "Spravovať" - - - - + "Tiché upozornenia" + "Vymazať všetky tiché upozornenia" "Upozornenia sú pozastavené režimom bez vyrušení" "Spustiť" "Žiadne upozornenia" @@ -651,21 +647,16 @@ "Blokovať" "Naďalej zobrazovať" "Minimalizovať" - - + "Tichý" "Naďalej upozorňovať potichu" - - + "Upozorňovanie" "Naďalej upozorňovať" "Vypnúť upozornenia" "Majú sa upozornenia z tejto aplikácie naďalej zobrazovať?" - "Nenápadné" - "Prioritné" - "Pomáha sústrediť sa zobrazovaním upozornení iba v rozbaľovacom paneli. Vždy potichu." - "Zobrazuje sa pod prioritnými upozorneniami. Vždy potichu." - "Zobrazuje sa pod prioritnými upozorneniami. Vždy potichu." - "Zobrazuje sa pod prioritnými upozorneniami. Vždy potichu." - "Upúta zvukom a zobrazením ikony v stavovom riadku. Zobrazuje sa na uzamknutej obrazovke." + "Tiché" + "Varovné" + "Pomáha vám sústrediť sa bez zvukov či vibrácií." + "Upúta vás zvukom alebo vibráciami." "Tieto upozornenia sa nedajú upraviť." "Túto skupinu upozornení nejde na tomto mieste konfigurovať" "Približné upozornenie" @@ -918,8 +909,7 @@ "Povoliť" "Zamietnuť" "Klepnutím naplánujete aktivovanie Šetriča batérie" - - + "Zapnite, keď je batéria takmer vybitá" "Nie, vďaka" "Plánované aktivovanie Šetriča batérie bolo zapnuté" "Keď batéria klesne pod %d %%, automaticky sa aktivujte Šetrič batérie." @@ -952,4 +942,8 @@ "Presunúť doľava nadol" "Presunúť doprava nadol" "Zavrieť" + + + + diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 58ff0747691a..efd73d807b43 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -62,12 +62,10 @@ "Odpravljanje napak s povezavo USB ni dovoljeno" "Uporabnik, trenutno prijavljen v napravo, ne more vklopiti odpravljanja napak s povezavo USB. Če želite uporabljati to funkcijo, preklopite na primarnega uporabnika." "Vrata USB so onemogočena" - - + "Zaradi zaščite naprave pred tekočino ali umazanijo so vrata USB onemogočena in ne bodo zaznala nobene dodatne opreme.\n\nKo bo znova varno uporabljati vrata USB, boste obveščeni." "Vrata USB so omogočena za zaznavanje polnilnikov in dodatne opreme" "Omogoči USB" - - + "Več o tem" "Povečava čez cel zaslon" "Raztegnitev čez zaslon" "Posnetek" @@ -464,10 +462,8 @@ "Tega ne prikaži več" "Izbriši vse" "Upravljanje" - - - - + "Tiha obvestila" + "Brisanje vseh tihih obvestil" "Prikazovanje obvestil je začasno zaustavljeno z načinom »ne moti«" "Začni zdaj" "Ni obvestil" @@ -651,21 +647,16 @@ "Blokiraj" "Prikazuj še naprej" "Minimiraj" - - + "Tiho" "Še naprej prikazuj brez zvoka" - - + "Z zvočnim opozorilom" "Še naprej opozarjaj" "Izklopi obvestila" "Želite, da so obvestila te aplikacije še naprej prikazana?" - "Diskretno" - "Prednostno" - "Nemoteč prikaz samo na poteznem zaslonu z obvestili. Vedno tiho." - "Prikaz pod prednostnimi obvestili. Vedno tiho." - "Prikaz pod prednostnimi obvestili. Vedno tiho." - "Prikaz pod prednostnimi obvestili. Vedno tiho." - "Opozarjanje z zvokom in ikono v vrstici stanja. Prikaz na zaklenjenem zaslonu." + "Tiho" + "Z zvočnim opozorilom" + "Nemoteč prikaz brez zvoka ali vibriranja" + "Pritegnitev pozornosti z zvokom ali vibriranjem" "Za ta obvestila ni mogoče spremeniti nastavitev." "Te skupine obvestil ni mogoče konfigurirati tukaj" "Posredovano obvestilo" @@ -918,8 +909,7 @@ "Dovoli" "Zavrni" "Dotaknite se za načrtovanje varčevanja z energijo akumulatorja" - - + "Vklop, če je verjetno, da se bo akumulator izpraznil" "Ne, hvala" "Urnik varčevanja z energijo akumulatorja je vklopljen" "Varčevanje z energijo akumulatorja se bo samodejno vklopilo, ko bo energija akumulatorja pod %d %%." @@ -952,4 +942,8 @@ "Premakni spodaj levo" "Premakni spodaj desno" "Opusti" + + + + diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 592915bfcaa1..091c5402c339 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -62,12 +62,10 @@ "Korrigjimi i USB-së nuk lejohet" "Përdoruesi i identifikuar aktualisht në këtë pajisje nuk mund ta aktivizojë korrigjimin e USB-së. Për ta përdorur këtë funksion, kalo te përdoruesi parësor." "Porta e USB-së është çaktivizuar" - - + "Për të mbrojtur pajisjen tënde nga lëngjet apo papastërtitë, porta e USB-së është çaktivizuar dhe nuk do t\'i dallojë aksesorët.\n\nDo të njoftohesh kur të mos jetë problem përdorimi përsëri i portës USB." "Porta USB është aktivizuar për të zbuluar karikuesit dhe aksesorët" "Aktivizo USB-në" - - + "Mëso më shumë" "Zmadho për të mbushur ekranin" "Shtrije për të mbushur ekranin" "Pamja e ekranit" @@ -458,10 +456,8 @@ "Mos e shfaq sërish" "Pastroji të gjitha" "Menaxho" - - - - + "Njoftimet në heshtje" + "Pastro të gjitha njoftimet në heshtje" "Njoftimet janë vendosur në pauzë nga modaliteti \"Mos shqetëso\"" "Fillo tani" "Asnjë njoftim" @@ -645,21 +641,16 @@ "Blloko" "Vazhdo të shfaqësh" "Minimizo" - - + "Në heshtje" "Qëndro në heshtje" - - + "Sinjalizimi" "Vazhdo të sinjalizosh" "Çaktivizo njoftimet" "Do të vazhdosh t\'i shfaqësh njoftimet nga ky aplikacion?" - "Me rëndësi të ulët" - "Me prioritet" - "Të ndihmon të përqendrohesh me njoftimet vetëm në panelin zbritës. Gjithmonë në heshtje." - "Shfaqet nën njoftimet me përparësi. Gjithmonë në heshtje." - "Shfaqet nën njoftimet me përparësi. Gjithmonë në heshtje." - "Shfaqet nën njoftimet me përparësi. Gjithmonë në heshtje." - "Të tërheq vëmendjen me tingull dhe një ikonë në shiritin e statusit. Shfaqet në ekranin e kyçjes." + "Në heshtje" + "Sinjalizimi" + "Të ndihmon të fokusohesh pa tinguj ose dridhje." + "Të tërheq vëmendjen me tinguj ose dridhje." "Këto njoftime nuk mund të modifikohen." "Ky grup njoftimesh nuk mund të konfigurohet këtu" "Njoftim i dërguar me përfaqësues" @@ -908,8 +899,7 @@ "Lejo" "Refuzo" "Trokit për të planifikuar \"Kursyesin e baterisë\"" - - + "Aktivizoje kur bateria mund të mbarojë" "Jo" "Planifikimi i \"Kursyesit të baterisë\" është aktivizuar" "\"Kursyesi i baterisë\" do të aktivizohet automatikisht kur bateria të jetë nën %d%%." @@ -942,4 +932,8 @@ "Zhvendos poshtë majtas" "Lëvize poshtë djathtas" "Hiq" + + + + diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index c71bbf60462b..02986777cfb1 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -62,12 +62,10 @@ "Отклањање грешака на USB-у није дозвољено" "Корисник који је тренутно пријављен на овај уређај не може да укључи отклањање грешака на USB-у. Да бисте користили ову функцију, пребаците на примарног корисника." "USB порт је онемогућен" - - + "Да би се уређај заштитио од течности или нечистоће, USB порт је онемогућен и неће откривати додатну опрему.\n\nОбавестићемо вас када поново будете могли да користите USB порт." "USB порт је омогућен ради откривања пуњача и додатне опреме" "Омогући USB" - - + "Сазнајте више" "Зумирај на целом екрану" "Развуци на цео екран" "Снимак екрана" @@ -461,10 +459,8 @@ "Не приказуј поново" "Обриши све" "Управљајте" - - - - + "Нечујна обавештења" + "Обришите сва нечујна обавештења" "Обавештења су паузирана режимом Не узнемиравај" "Започни одмах" "Нема обавештења" @@ -648,21 +644,16 @@ "Блокирај" "Настави да приказујеш" "Умањи" - - + "Нечујно" "Не укључуј звук" - - + "Упозоравање" "Настави са обавештењима" "Искључи обавештења" "Желите ли да се обавештења из ове апликације и даље приказују?" - "Дискретно" - "Приоритетно" - "Помаже вам да се фокусирате. Обавештења су само на падајућој траци. Увек нечујно." - "Приказује се испод приоритетних обавештења. Увек нечујно." - "Приказује се испод приоритетних обавештења. Увек нечујно." - "Приказује се испод приоритетних обавештења. Увек нечујно." - "Привлачи вам пажњу помоћу звука и иконе статусне траке. Приказује се на закључаном екрану." + "Нечујно" + "Упозоравање" + "Помаже вам да се концентришете без звука или вибрације." + "Привлачи вам пажњу помоћу звука или вибрације." "Ова обавештења не могу да се мењају." "Ова група обавештења не може да се конфигурише овде" "Обавештење преко проксија" @@ -913,8 +904,7 @@ "Дозволи" "Одбиј" "Додирните да бисте направили распоред за уштеду батерије" - - + "Укључите ако ће батерија вероватно да се испразни" "Не, хвала" "Распоред за уштеду батерије је укључен" "Уштеда батерије ће се аутоматски укључивати када батерија падне испод %d%%." @@ -947,4 +937,8 @@ "Премести доле лево" "Премести доле десно" "Одбаци" + + + + diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 0f39fc2138dc..cca609b42a33 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -62,12 +62,10 @@ "USB-felsökning är inte tillåtet" "Användaren som är inloggad på enheten för närvarande kan inte aktivera USB-felsökning. Byt till den primära användaren om du vill använda den här funktionen." "USB-porten har inaktiverats" - - + "USB-porten har inaktiverats för att skydda enheten mot vätska eller smuts. Inga tillbehör kommer att hittas.\n\nDu meddelas när det går att använda USB-porten igen." "USB-porten har aktiverats för identifiering av laddare och tillbehör" "Aktivera USB" - - + "Läs mer" "Zooma för att fylla skärm" "Dra för att fylla skärmen" "Skärmdump" @@ -458,10 +456,8 @@ "Visa inte igen" "Rensa alla" "Hantera" - - - - + "Ljudlösa aviseringar" + "Rensa alla ljudlösa aviseringar" "Aviseringar har pausats via Stör ej" "Starta nu" "Inga aviseringar" @@ -645,21 +641,16 @@ "Blockera" "Fortsätt visa" "Minimera" - - + "Ljudlöst" "Fortsätt visa utan ljud" - - + "Med avisering" "Fortsätt meddela" "Inaktivera aviseringar" "Vill du fortsätta visa aviseringar för den här appen?" - "Utan avbrott" - "Prioriterade" - "Aviseringar visas bara på aviseringspanelen så att du kan fokusera på det viktigaste. Alltid tyst." - "Aviseringar med låg prioritet visas. Alltid tyst." - "Aviseringar med låg prioritet visas. Alltid tyst." - "Aviseringar med låg prioritet visas. Alltid tyst." - "Fångar din uppmärksamhet med ljud och en ikon i statusfältet. Visas på låsskärmen." + "Tyst" + "Påkallar uppmärksamhet" + "Inga ljud eller vibrationer som stör koncentrationen." + "Påkallar uppmärksamhet med ljud eller vibrationer." "Det går inte att ändra de här aviseringarna." "Den här aviseringsgruppen kan inte konfigureras här" "Avisering via proxy" @@ -908,8 +899,7 @@ "Tillåt" "Neka" "Tryck för att skapa ett schema för batterisparläget" - - + "Aktivera när batteriet håller på att ta slut" "Nej tack" "Schema för Batterisparläge aktiverat" "Batterisparläget aktiveras automatiskt när batterinivån är under %d %%." @@ -942,4 +932,8 @@ "Flytta längst ned till vänster" "Flytta längst ned till höger" "Stäng" + + + + diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index d91ba6d70a12..b4177fc1478d 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -62,12 +62,10 @@ "Utatuzi wa USB hauruhusiwi" "Mtumiaji aliyeingia katika akaunti kwa kutumia kifaa hiki kwa sasa hawezi kuwasha utatuzi wa USB. Ili utumie kipengele hiki, tumia akaunti ya mtumiaji wa msingi." "Mlango wa USB umezimwa" - - + "Ili ulinde kifaa chako dhidi ya vitu vyenye unyevu au uchafu, mlango wa USB umezimwa na hautatambua vifaa vyovyote.\n\nUtaarifiwa itapokuwa sawa kutumia mlango wa USB tena." "Mlango wa USB umewezeshwa ili utambue chaja na vifuasi" "Washa kipengele cha USB" - - + "Pata maelezo zaidi" "Kuza ili kujaza skrini" "Tanua ili kujaza skrini" "Pichaskrini" @@ -458,10 +456,8 @@ "Usionyeshe tena" "Futa zote" "Dhibiti" - - - - + "Arifa zisizo na sauti" + "Futa arifa zote zisizo na sauti" "Kipengele cha Usinisumbue kimesitisha arifa" "Anza sasa" "Hakuna arifa" @@ -645,21 +641,16 @@ "Zuia" "Endelea kuonyesha" "Punguza" - - + "Kimya" "Isitoe sauti" - - + "Kutoa arifa" "Endelea kutoa arifa" "Zima arifa" "Ungependa kuendelea kuonyesha arifa kutoka programu hii?" - "Bila sauti" - "Zilizopewa kipaumbele" - "Hukusaidia kuangazia arifa pekee kwenye orodha kunjuzi. Kimya kila wakati." - "Huonyeshwa chini ya arifa za kipaumbele. Kimya kila wakati." - "Huonyeshwa chini ya arifa za kipaumbele. Kimya kila wakati." - "Huonyeshwa chini ya arifa za kipaumbele. Kimya kila wakati." - "Hupata umakinifu wako kwa sauti na aikoni ya sehemu ya arifa. Huonyeshwa kwenye skrini iliyofungwa." + "Kimya" + "Kutoa arifa" + "Hukusaidia kuwa makini bila sauti au mtetemo." + "Hupata umakinifu wako kwa sauti na mtetemo." "Arifa hizi haziwezi kubadilishwa." "Kikundi hiki cha arifa hakiwezi kuwekewa mipangilio hapa" "Arifa wakilishi" @@ -908,8 +899,7 @@ "Ruhusu" "Kataa" "Gusa ili uratibu wakati wa kuwasha Kiokoa Betri" - - + "Washa wakati betri inakaribia kuisha" "Hapana, asante" "Ratiba ya Kiokoa Betri imewashwa" "Kiokoa Betri kitawaka kiotomatiki baada ya chaji ya betri kufika chini ya %d%%." @@ -942,4 +932,8 @@ "Sogeza chini kushoto" "Sogeza chini kulia" "Ondoa" + + + + diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 172b62cd27fe..bfca4766f17c 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -62,12 +62,10 @@ "USB பிழைதிருத்தம் அனுமதிக்கப்படவில்லை" "தற்போது இந்தச் சாதனத்தில் உள்நுழைந்துள்ள பயனரால் USB பிழைதிருத்தத்தை இயக்க முடியாது. இந்த அம்சத்தை இயக்க, முதன்மைப் பயனருக்கு மாறவும்." "USB போர்ட் முடக்கப்பட்டது" - - + "தேவையற்றவையில் இருந்து உங்கள் சாதனத்தைப் பாதுகாக்க USB போர்ட் முடக்கப்பட்டுள்ளது. மேலும் எந்தத் துணைக் கருவிகளையும் அது கண்டறியாது.\n\nUSB போர்ட்டை மீண்டும் எப்போது பயன்படுத்தலாம் என்பதைப் பற்றி உங்களுக்குத் தெரிவிக்கப்படும்." "சார்ஜர்களையும் துணைக்கருவிகளையும் கண்டறிவதற்காக USB போர்ட் இயக்கப்பட்டுள்ளது" "USBயை இயக்கு" - - + "மேலும் அறிக" "திரையை நிரப்ப அளவை மாற்று" "திரையை நிரப்ப இழு" "ஸ்கிரீன்ஷாட்" @@ -458,10 +456,8 @@ "மீண்டும் காட்டாதே" "எல்லாவற்றையும் அழி" "அறிவிப்புகளை நிர்வகி" - - - - + "ஒலியில்லாத அறிவிப்புகள்" + "ஒலியில்லாத அழைப்புகள் அனைத்தையும் அழிக்கும்" "\'தொந்தரவு செய்ய வேண்டாம்\' அம்சத்தின் மூலம் அறிவிப்புகள் இடைநிறுத்தப்பட்டுள்ளன" "இப்போது தொடங்கு" "அறிவிப்புகள் இல்லை" @@ -645,21 +641,16 @@ "தடு" "அறிவிப்புகளைத் தொடர்ந்து காட்டு" "சிறிதாக்கு" - - + "நிசப்தம்" "அறிவிப்புகளை ஒலியின்றிக் காட்டு" - - + "விழிப்பூட்டல்" "தொடர்ந்து விழிப்பூட்டு" "அறிவிப்புகளை முடக்கு" "இந்த ஆப்ஸின் அறிவிப்புகளைத் தொடர்ந்து காட்டவா?" - "ஜென்டில்" - "முன்னுரிமைப்படுத்தப்பட்டது" - "கீழ் இழுக்கும் ஷேடில் வரும் அறிவிப்புகளில் மட்டும் கவனம் செலுத்த உதவுகிறது. எப்போதும் நிசப்தம்." - "குறைந்த முன்னுரிமைப் பெற்ற அறிவிப்புகளைக் காட்டும். எப்போதும் நிசப்தம்." - "குறைந்த முன்னுரிமைப் பெற்ற அறிவிப்புகளைக் காட்டும். எப்போதும் நிசப்தம்." - "குறைந்த முன்னுரிமைப் பெற்ற அறிவிப்புகளைக் காட்டும். எப்போதும் நிசப்தம்." - "ஒலி & நிலைப் பட்டி ஐகான் மூலம் உங்கள் கவனத்தைப் பெறுகிறது. பூட்டுத் திரையில் காட்டும்." + "நிசப்தம்" + "விழிப்பூட்டல்" + "ஒலியோ அதிர்வோ இல்லாமல் முழு கவனம் செலுத்த உதவும்." + "ஒலியோ அதிர்வோ ஏற்படுத்தி உங்கள் கவனத்தை ஈர்க்கும்." "இந்த அறிவிப்புகளை மாற்ற இயலாது." "இந்த அறிவுப்புக் குழுக்களை இங்கே உள்ளமைக்க இயலாது" "ப்ராக்ஸியான அறிவிப்பு" @@ -908,8 +899,7 @@ "அனுமதி" "நிராகரி" "பேட்டரி சேமிப்பானை ஆன் செய்வது தொடர்பாகத் திட்டமிட, தட்டவும்" - - + "பேட்டரி தீர்ந்துபோகும் நிலையில் இருக்கும் போது ஆன் செய்யப்படும்" "வேண்டாம்" "திட்டமிட்ட பேட்டரி சேமிப்பான் ஆன் செய்யப்பட்டது" "பேட்டரியின் அளவு %d%%க்குக் கீழ் குறையும்போது, பேட்டரி சேமிப்பான் தானாகவே ஆன் செய்யப்படும்." @@ -942,4 +932,8 @@ "கீழே இடப்புறமாக நகர்த்து" "கீழே வலதுபுறமாக நகர்த்து" "மூடுக" + + + + diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 033fce46d8d5..657e57764e06 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -62,12 +62,10 @@ "USB డీబగ్గింగ్‌కి అనుమతి లేదు" "ఈ పరికరానికి ప్రస్తుతం సైన్ ఇన్ చేసిన వినియోగదారు USB డీబగ్గింగ్ ఆన్ చేయలేరు. ఈ ఫీచర్ ఉపయోగించడానికి, ప్రాథమిక వినియోగదారుకి మారాలి." "USB పోర్ట్‌ నిలిపివేయబడింది" - - + "మీ పరికరంలోకి నీరు లేదా చెత్తాచెదారం చేరిపోకుండా కాపాడటానికి, USB పోర్ట్ నిలిపివేయబడుతుంది, అలాగే యాక్సెసరీలు వేటిని గుర్తించదు.\n\nUSB పోర్ట్‌ను ఉపయోగించడం సురక్షితమేనని నిర్ధారించుకున్న తర్వాత, మళ్లీ మీకో నోటిఫికేషన్‌ రూపంలో తెలియజేయబడుతుంది." "ఛార్జర్‌లు, యాక్సెసరీలను గుర్తించే విధంగా USB పోర్ట్ ప్రారంభించబడింది" "USBని ప్రారంభించు" - - + "మరింత తెలుసుకోండి" "స్క్రీన్‌కు నింపేలా జూమ్ చేయండి" "స్క్రీన్‌కు నింపేలా విస్తరించండి" "స్క్రీన్‌షాట్" @@ -458,10 +456,8 @@ "మళ్లీ చూపవద్దు" "అన్నీ క్లియర్ చేయండి" "నిర్వహించండి" - - - - + "నిశ్శబ్ద నోటిఫికేషన్‌లు" + "అన్ని నిశ్శబ్ద నోటిఫికేషన్‌లను క్లియర్ చేస్తుంది" "అంతరాయం కలిగించవద్దు ద్వారా నోటిఫికేషన్‌లు పాజ్ చేయబడ్డాయి" "ఇప్పుడే ప్రారంభించు" "నోటిఫికేషన్‌లు లేవు" @@ -645,21 +641,16 @@ "బ్లాక్ చేయి" "చూపిస్తూనే ఉండు" "కుదించు" - - + "నిశ్శబ్దం" "నిశబ్దంగా తెలియజేయి" - - + "హెచ్చరించడం" "ఎప్పటికప్పుడు హెచ్చరించు" "నోటిఫికేషన్‌లను ఆఫ్ చేయి" "ఈ యాప్ నుండి నోటిఫికేషన్‌లను చూపిస్తూ ఉండాలా?" - "సాధారణ" - "ప్రాధాన్యం గలవి" - "కిందకు-లాగే షేడ్‌లో కనిపించే నోటిఫికేషన్‌ల మాత్రమే ద్వారా దృష్టి కేంద్రీకరించడానికి మీకు సహాయపడుతుంది. ఎల్లప్పుడూ నిశబ్దంగా ఉంచు." - "ప్రాధాన్యత గల నోటిఫికేషన్‌ల దిగువన ప్రదర్శిస్తుంది. ఎల్లప్పుడూ నిశబ్దంగా ఉంచు." - "ప్రాధాన్యత గల నోటిఫికేషన్‌ల దిగువన ప్రదర్శిస్తుంది. ఎల్లప్పుడూ నిశబ్దంగా ఉంచు." - "ప్రాధాన్యత గల నోటిఫికేషన్‌ల దిగువన ప్రదర్శిస్తుంది. ఎల్లప్పుడూ నిశబ్దంగా ఉంచు." - "శబ్దం & స్టేటస్ బార్ చిహ్నం ద్వారా మీరు దృష్టి సారించేలా చేస్తుంది. లాక్ స్క్రీన్‌‌పై చూపుతుంది." + "నిశ్శబ్దం" + "హెచ్చరించడం" + "శబ్దం లేదా వైబ్రేషన్ లేకుండా దృష్టి కేంద్రీకరించడానికి మీకు సహాయపడుతుంది." + "శబ్దం లేదా వైబ్రేషన్‌తో మీరు దృష్టి సారించేలా చేస్తుంది." "ఈ నోటిఫికేషన్‌లను సవరించడం వీలుపడదు." "ఈ నోటిఫికేషన్‌ల సమూహాన్ని ఇక్కడ కాన్ఫిగర్ చేయలేము" "ప్రాక్సీ చేయబడిన నోటిఫికేషన్" @@ -908,8 +899,7 @@ "అనుమతించు" "తిరస్కరించు" "బ్యాటరీ సేవర్‌ని షెడ్యూల్ చేయడానికి నొక్కండి" - - + "బ్యాటరీ ఛార్జింగ్ పూర్తిగా అయిపోతున్న తరుణంలో ఆన్ చేస్తుంది" "వద్దు, ధన్యవాదాలు" "బ్యాటరీ సేవర్ షెడ్యూల్ ఆన్ చేయబడింది" "బ్యాటరీ %d%% కంటే తగ్గినప్పుడు బ్యాటరీ సేవర్ ఆటోమేటిక్‌గా ఆన్ అవుతుంది." @@ -942,4 +932,8 @@ "దిగువ ఎడమవైపునకు తరలించు" "దిగవు కుడివైపునకు జరుపు" "విస్మరించు" + + + + diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 465a2b8b917b..f377c34f2416 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -62,12 +62,10 @@ "ไม่อนุญาตให้แก้ไขข้อบกพร่องผ่าน USB" "ผู้ใช้ที่ลงชื่อเข้าใช้อุปกรณ์อยู่ในขณะนี้ไม่สามารถเปิดการแก้ไขข้อบกพร่องผ่าน USB ได้ หากต้องการใช้ฟีเจอร์นี้ ให้เปลี่ยนไปเป็นผู้ใช้หลัก" "พอร์ต USB ถูกปิดใช้" - - + "พอร์ต USB ปิดใช้อยู่และจะไม่ตรวจหาอุปกรณ์เสริมใดๆ เพื่อปกป้องอุปกรณ์จากของเหลวและฝุ่นละออง \n\nคุณจะได้รับแจ้งเมื่อใช้พอร์ต USB ได้อีกครั้ง" "เปิดใช้พอร์ต USB แล้วเพื่อตรวจหาที่ชาร์จและอุปกรณ์เสริม" "เปิดใช้ USB" - - + "ดูข้อมูลเพิ่มเติม" "ขยายจนเต็มหน้าจอ" "ยืดจนเต็มหน้าจอ" "ภาพหน้าจอ" @@ -458,10 +456,8 @@ "ไม่ต้องแสดงข้อความนี้อีก" "ล้างทั้งหมด" "จัดการ" - - - - + "การแจ้งเตือนแบบไม่มีเสียง" + "ล้างการแจ้งเตือนแบบไม่มีเสียงทั้งหมด" "หยุดการแจ้งเตือนชั่วคราวโดย \"ห้ามรบกวน\"" "เริ่มเลย" "ไม่มีการแจ้งเตือน" @@ -645,21 +641,16 @@ "บล็อก" "แสดงต่อไป" "ย่อเล็กสุด" - - + "ปิดเสียง" "ปิดเสียงไว้" - - + "แจ้งเตือน" "แจ้งเตือนต่อไป" "ปิดการแจ้งเตือน" "แสดงการแจ้งเตือนจากแอปนี้ต่อไปไหม" - "แจ้งเตือนเบาๆ" - "สำคัญ" - "ช่วยให้คุณโฟกัสกับการแจ้งเตือนในหน้าต่างแบบเลื่อนลงเท่านั้น ปิดเสียงตลอดเวลา" - "แสดงใต้การแจ้งเตือนเรื่องสำคัญ ปิดเสียงตลอดเวลา" - "แสดงใต้การแจ้งเตือนเรื่องสำคัญ ปิดเสียงตลอดเวลา" - "แสดงใต้การแจ้งเตือนเรื่องสำคัญ ปิดเสียงตลอดเวลา" - "ดึงความสนใจของคุณด้วยเสียงและไอคอนในแถบสถานะ แสดงในหน้าจอล็อก" + "เงียบ" + "แจ้งเตือน" + "ช่วยรักษาสมาธิของคุณด้วยการไม่ส่งเสียงหรือสั่น" + "ดึงความสนใจของคุณด้วยเสียงและการสั่น" "แก้ไขการแจ้งเตือนเหล่านี้ไม่ได้" "การแจ้งเตือนกลุ่มนี้กำหนดค่าที่นี่ไม่ได้" "การแจ้งเตือนที่ผ่านพร็อกซี" @@ -908,8 +899,7 @@ "อนุญาต" "ปฏิเสธ" "แตะเพื่อตั้งเวลาโหมดประหยัดแบตเตอรี่" - - + "เปิดเมื่อมีแนวโน้มว่าแบตเตอรี่จะหมด" "ไม่เป็นไร" "เปิดใช้กำหนดเวลาโหมดประหยัดแบตเตอรี่อยู่" "โหมดประหยัดแบตเตอรี่จะเปิดโดยอัตโนมัติเมื่อแบตเตอรี่เหลือไม่ถึง %d%%" @@ -942,4 +932,8 @@ "ย้ายไปด้านซ้ายล่าง" "ย้ายไปด้านขาวล่าง" "ปิด" + + + + diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 8a832b0ccbf8..90c7ab76359a 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -62,12 +62,10 @@ "Hindi pinapayagan ang pagde-debug sa pamamagitan ng USB" "Hindi mao-on ng user na kasalukuyang naka-sign in sa device na ito ang pag-debug ng USB. Upang magamit ang feature na ito, lumipat sa pangunahing user." "Na-disable ang USB port" - - + "Para protektahan ang iyong device sa likido o dumi, na-disable ang USB port at hindi ito makaka-detect ng anumang accessory.\n\nAabisuhan ka kapag ayos nang gamitin ulit ang USB port." "Na-enable ang USB port para ma-detect ang mga charger at accessory" "I-enable ang USB" - - + "Matuto pa" "I-zoom upang punan screen" "I-stretch upang mapuno screen" "Screenshot" @@ -458,10 +456,8 @@ "Huwag ipakitang muli" "I-clear lahat" "Pamahalaan" - - - - + "Mga silent na notification" + "I-clear ang lahat ng silent na notification" "Mga notification na na-pause ng Huwag Istorbohin" "Magsimula ngayon" "Walang mga notification" @@ -645,21 +641,16 @@ "I-block" "Patuloy na ipakita" "I-minimize" - - + "Silent" "Manatiling naka-silent" - - + "Mag-alerto" "Patuloy na mag-alerto" "I-off ang mga notification" "Patuloy na ipakita ang mga notification mula sa app na ito?" - "Malumanay" - "Priyoridad" - "Nakakatulong para hindi ka maabala dahil sa pull-down na shade lang lalabas ang mga notification. Palaging naka-silent." - "Ipinapakita sa ibaba ng mga priyoridad na notification. Palaging naka-silent." - "Ipinapakita sa ibaba ng mga priyoridad na notification. Palaging naka-silent." - "Ipinapakita sa ibaba ng mga priyoridad na notification. Palaging naka-silent." - "Kinukuha ang iyong atensyon gamit ang tunog at icon sa status bar. Ipinapakita sa lock screen." + "Naka-silent" + "Mag-alerto" + "Nakakatulong sa iyong tumuon nang walang tunog o pag-vibrate." + "Kinukuha ang iyong atensyon sa pamamagitan ng tunog o pag-vibrate." "Hindi puwedeng baguhin ang mga notification na ito." "Hindi mako-configure dito ang pangkat na ito ng mga notification" "Na-proxy na notification" @@ -908,8 +899,7 @@ "Payagan" "Tanggihan" "I-tap para iiskedyul ang Pangtipid sa Baterya" - - + "I-on kapag malamang na maubos ang baterya" "Hindi, salamat na lang" "Na-on ang iskedyul ng Pangtipid sa Baterya" "Awtomatikong mao-on ang Pangtipid sa Baterya kapag mas mababa na sa %d%% ang baterya." @@ -942,4 +932,8 @@ "Ilipat sa kaliwa sa ibaba" "Ilipat sa kanan sa ibaba" "I-dismiss" + + + + diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index c91b55101f2b..4432b41dda26 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -62,12 +62,10 @@ "USB hata ayıklama işlevine izin verilmiyor" "Bu cihazda geçerli olarak oturum açmış olan kullanıcı, USB hata ayıklama özelliğini açamaz. Bu özelliği kullanmak için birincil kullanıcıya geçin." "USB bağlantı noktası devre dışı bırakıldı" - - + "Cihazınızı sıvılardan veya tozlardan korumak için USB bağlantı noktası devre dışı bırakıldı ve aksesuarları algılamayacak.\n\nUSB bağlantı noktasını tekrar sorunsuz kullanabileceğiniz zaman bilgilendirileceksiniz." "USB bağlantı noktası, şarj cihazlarını ve aksesuarları algılamak üzere etkinleştirildi" "USB\'yi etkinleştir" - - + "Daha fazla bilgi" "Yakınlaştır (ekranı kaplasın)" "Genişlet (ekran kapansın)" "Ekran görüntüsü" @@ -458,10 +456,8 @@ "Bir daha gösterme" "Tümünü temizle" "Yönet" - - - - + "Sessiz bildirimler" + "Sessiz bildirimlerin tümünü temizle" "Bildirimler, Rahatsız Etmeyin özelliği tarafından duraklatıldı" "Şimdi başlat" "Bildirim yok" @@ -645,21 +641,16 @@ "Engelle" "Göstermeye devam et" "Küçült" - - + "Sessiz" "Sessiz uyarı göster" - - + "Uyarı" "Uyarıda bulunmaya devam et" "Bildirimleri kapat" "Bu uygulamadan gelen bildirimler gösterilmeye devam edilsin mi?" - "Sessiz" - "Öncelikli" - "Bildirimleri yalnızca aşağıya açılır gölgede göstererek işinize odaklanmanızı sağlar. Her zaman sessizdir." - "Öncelikli bildirimlerin altında görüntülenir. Her zaman sessizdir." - "Öncelikli bildirimlerin altında görüntülenir. Her zaman sessizdir." - "Öncelikli bildirimlerin altında görüntülenir. Her zaman sessizdir." - "Ses ve bir durum çubuğu simgesiyle dikkatinizi çeker. Kilit ekranında gösterilir." + "Sessiz" + "Uyarı" + "Ses veya titreşim olmadan odaklanmanıza yardımcı olur." + "Ses veya titreşimle dikkatinizi çeker." "Bu bildirimler değiştirilemez." "Bu bildirim grubu burada yapılandırılamaz" "Proxy uygulanan bildirim" @@ -908,8 +899,7 @@ "İzin ver" "Reddet" "Pil Tasarrufunu programlamak için dokunun" - - + "Piliniz bitecek gibiyse bu özelliği açın" "Hayır, teşekkürler" "Pil Tasarruf programı açık" "Pil %%%d düzeyinin altına düştüğünde Pil Tasarrufu otomatik olarak açılacaktır." @@ -942,4 +932,8 @@ "Sol alta taşı" "Sağ alta taşı" "Kapat" + + + + diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 7af05cdeb2d0..171949a53761 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -62,12 +62,10 @@ "Ви не можете вмикати налагодження USB" "Користувач поточного облікового запису не може вмикати налагодження USB. Щоб увімкнути цю функцію, увійдіть в обліковий запис основного користувача." "USB-порт вимкнено" - - + "Щоб захистити ваш пристрій від рідини та сміття, USB-порт вимкнено. Він не виявлятиме жодних аксесуарів.\n\nКоли USB-порт можна буде використовувати, ви отримаєте сповіщення." "Порт USB виявлятиме зарядні пристрої та аксесуари" "Увімкнути USB" - - + "Докладніше" "Масштабув. на весь екран" "Розтягнути на весь екран" "Знімок екрана" @@ -464,10 +462,8 @@ "Більше не показувати" "Очистити все" "Керувати" - - - - + "Беззвучні сповіщення" + "Очистити всі беззвучні сповіщення" "Режим \"Не турбувати\" призупинив сповіщення" "Почати зараз" "Сповіщень немає" @@ -651,21 +647,16 @@ "Блокувати" "Показувати надалі" "Згорнути" - - + "Без звуку" "Без звуку" - - + "Сповіщення" "Отримувати сповіщення" "Вимкнути сповіщення" "Чи показувати сповіщення з цього додатка надалі?" - "Тихі сповіщення" - "Пріоритетні сповіщення" - "Сповіщення показуються лише на розкривній панелі, щоб не відволікати. Завжди без звуку." - "Показуються під пріоритетними сповіщеннями. Завжди без звуку." - "Показуються під пріоритетними сповіщеннями. Завжди без звуку." - "Показуються під пріоритетними сповіщеннями. Завжди без звуку." - "Привертають увагу сигналом і значком у рядку стану. Показуються на заблокованому екрані." + "Без звуку" + "Зі звуком" + "Не відволікає увагу звуковим сигналом або вібрацією." + "Привертає увагу звуковим сигналом або вібрацією." "Ці сповіщення не можна змінити." "Цю групу сповіщень не можна налаштувати тут" "Проксі-сповіщення" @@ -918,8 +909,7 @@ "Дозволити" "Відмовити" "Торкніться, щоб увімкнути автоматичний режим економії заряду акумулятора" - - + "Вмикати, коли заряд акумулятора закінчується" "Ні, дякую" "Автоматичний режим економії заряду акумулятора ввімкнено" "Режим економії заряду акумулятора вмикається автоматично, коли рівень заряду нижчий за %d%%." @@ -952,4 +942,8 @@ "Перемістити ліворуч униз" "Перемістити праворуч униз" "Закрити" + + + + diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 05f90f9a1b6a..7f37dea93be1 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -62,12 +62,10 @@ "‏USB ڈیبگ کرنے کی اجازت نہیں ہے" "‏اس آلہ پر فی الحال سائن ان کردہ صارف USB ڈیبگنگ آن نہیں کر سکتا۔ اس خصوصیت کا استعمال کرنے کیلئے، ابتدائی صارف پر سوئچ کریں۔" "‏USB پورٹ غیر فعال ہو گیا" - - + "‏آپ کے آلے کی سیال یا دھول سے حفاظت کرنے کے لیے، USB پورٹ کو غیر فعال کر دیا گیا ہے اور یہ کسی لوازم کا پتہ نہیں لگا پائے گا۔\n\nUSB پورٹ کا دوبارہ استعمال کرنا ٹھیک ہونے پر آپ کو مطلع کیا جائے گا۔" "‏چارجرز اور لوازمات کا پتا لگانے کے لیے USB پورٹ فعال ہے" "‏USB پورٹ فعال کریں" - - + "مزید جانیں" "پوری سکرین پر زوم کریں" "پوری سکرین پر پھیلائیں" "اسکرین شاٹ" @@ -458,10 +456,8 @@ "دوبارہ نہ دکھائیں" "سبھی کو صاف کریں" "نظم کریں" - - - - + "اطلاعات خاموش کریں" + "سبھی خاموش اطلاعات کو صاف کریں" "\'ڈسٹرب نہ کریں\' کے ذریعے اطلاعات کو موقوف کیا گیا" "ابھی شروع کریں" "کوئی اطلاعات نہیں ہیں" @@ -645,21 +641,16 @@ "مسدود کریں" "دکھانا جاری رکھیں" "چھوٹا کریں" - - + "خاموش کریں" "خاموش رہیں" - - + "الرٹ کرنا" "متنبہ کرنا جاری رکھیں" "اطلاعات کو آف کریں" "اس ایپ کی طرف سے اطلاعات دکھانا جاری رکھیں؟" - "لطیف" - "ترجیحی" - "صرف نیچے کی طرف کھینچیں شیڈ میں اطلاعات کے ساتھ فوکس کرنے میں آپ کی مدد کرتا ہے۔ ہمیشہ خاموش۔" - "کم ترجیحی اطلاعات ڈسپلے کرتا ہے۔ ہمیشہ خاموش۔" - "کم ترجیحی اطلاعات ڈسپلے کرتا ہے۔ ہمیشہ خاموش۔" - "کم ترجیحی اطلاعات ڈسپلے کرتا ہے۔ ہمیشہ خاموش۔" - "آواز اور اسٹیٹس بار کے آئیکن کے ساتھ آپ کی توجہ حاصل کرتا ہے۔ مقفل اسکرین پر دکھاتا ہے۔" + "خاموش" + "الرٹ کرنا" + "بغیر آواز یا وائبریشن کے آپ کو فوکس کرنے میں مدد کرتا ہے۔" + "آواز اور وائبریشن کے ذریعے آپ کی توجہ حاصل کرتا ہے۔" "ان اطلاعات کی ترمیم نہیں کی جا سکتی۔" "اطلاعات کے اس گروپ کو یہاں کنفیگر نہیں کیا جا سکتا" "پراکسی اطلاع" @@ -908,8 +899,7 @@ "اجازت دیں" "مسترد کریں" "بیٹری سیور شیڈول کرنے کے لیے تھپتھپائیں" - - + "جب بیٹری کے ختم ہونے کا امکان ہو تو آن کریں" "نہیں شکریہ" "بیٹری سیور شیڈول آن ہو گیا" "بیٹری کے %d%% سے کم ہونے پر بیٹری سیور خودکار طور پر آن ہو جائے گا۔" @@ -942,4 +932,8 @@ "نیچے بائیں جانب لے جائیں" "نیچے دائیں جانب لے جائیں" "برخاست کریں" + + + + diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 21615274d4d5..2dfbb6157c1c 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -62,12 +62,10 @@ "USB orqali nosozliklarni tuzatishga ruxsat berilmagan" "Ayni paytda ushbu qurilmaga o‘z hisobi bilan kirgan foydalanuvchi USB orqali nosozliklarni tuzatish funksiyasini yoqa olmaydi. Bu funksiyadan foydalanish uchun asosiy foydalanuvchi profiliga o‘ting." "USB port faolsizlashtirildi" - - + "Qurilmangizni suyuqlik va turli parchalardan himoya qilish uchun USB port faolsizlashtiriladi va hech qanday aksessuarni aniqlay olmaydi.\n\nUSB portdan xavfsiz foydalanish mumkin boʻlganda, sizga xabar beriladi." "Quvvatlash moslamalari va aksessuarlarni aniqlash uchun USB port yoqildi" "USB xususiyatini yoqish" - - + "Batafsil" "Ekranga moslashtirish" "Ekran hajmida cho‘zish" "Skrinshot" @@ -458,10 +456,8 @@ "Boshqa ko‘rsatilmasin" "Hammasini tozalash" "Boshqarish" - - - - + "Ovozsiz bildirishnomalar" + "Barcha tovushsiz bildirishnomalarni tozalash" "Bezovta qilinmasin rejimida bildirishnomalar pauza qilingan" "Boshlash" "Bildirishnomalar yo‘q" @@ -590,7 +586,7 @@ "Quvvat olmayotgan vaqtda batareya foizi holat qatorida chiqib turadi" "Tezkor sozlamalar" "Holat qatori" - "Umumiy ma’lumot" + "Umumiy" "Tizim interfeysi demo rejimi" "Demo rejimni yoqish" "Demo rejimni ko‘rsatish" @@ -645,21 +641,16 @@ "Bloklash" "Ha" "Kichraytirish" - - + "Tovushsiz" "Ovozsiz qolsin" - - + "Bildirishnoma yuborish" "Signal berishda davom etilsin" "Bildirishnoma kelmasin" "Bu ilovadan keladigan bildirishnomalar chiqaversinmi?" - "Tovushsiz" - "Muhim" - "Bildirishnomalar faqat maxsus panelda chiqadi. Doim tovushsiz." - "Muhimlik darajasi past bildirishnomalarning chiqishi. Doim tovushsiz." - "Muhimlik darajasi past bildirishnomalarning chiqishi. Doim tovushsiz." - "Muhimlik darajasi past bildirishnomalarning chiqishi. Doim tovushsiz." - "Kelgan bildirishnomalarni maxsus tovush va holat paneliga chiqadigan nishoncha orqali bilish mumkin. Bildirishnomalar ekran qulfida ham chiqadi." + "Tovushsiz" + "Bildirishnoma yuborish" + "Bildirishnomalar tovush va tebranishsiz keladi." + "Bildirishnomalar tovush va tebranish bilan keladi." "Bu bildirishnomalarni tahrirlash imkonsiz." "Ushbu bildirishnomalar guruhi bu yerda sozlanmaydi" "Ishonchli bildirishnoma" @@ -908,8 +899,7 @@ "Ruxsat" "Rad etish" "Quvvat tejash rejimini rejalashtirish uchun bosing" - - + "Batareya quvvati kamayishi aniqlanganda yoqilsin" "Kerak emas" "Quvvat tejash rejimi jadvali faollashtirildi" "Batareya quvvati %d%% ga tushsa, quvvat tejash rejimi avtomatik ravishda yoqiladi." @@ -942,4 +932,8 @@ "Quyi chapga surish" "Quyi oʻngga surish" "Yopish" + + + + diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index ace5215d7b8b..659cd694bf42 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -62,12 +62,10 @@ "Tính năng gỡ lỗi USB không được phép" "Người dùng hiện đã đăng nhập vào thiết bị này không thể bật tính năng gỡ lỗi USB. Để sử dụng tính năng này, hãy chuyển sang người dùng chính." "Đã tắt cổng USB" - - + "Để bảo vệ thiết bị của bạn khỏi chất lỏng hay mảnh vỡ, cổng USB sẽ tắt và không phát hiện được bất kỳ phụ kiện nào.\n\nBạn sẽ nhận được thông báo khi có thể sử dụng lại cổng USB." "Đã bật cổng USB để phát hiện bộ sạc và phụ kiện" "Bật USB" - - + "Tìm hiểu thêm" "T.phóng để lấp đầy m.hình" "Giãn ra để lấp đầy m.hình" "Chụp màn hình" @@ -458,10 +456,8 @@ "Không hiển thị lại" "Xóa tất cả" "Quản lý" - - - - + "Thông báo im lặng" + "Xóa tất cả thông báo im lặng" "Chế độ Không làm phiền đã tạm dừng thông báo" "Bắt đầu ngay" "Không có thông báo nào" @@ -645,21 +641,16 @@ "Chặn" "Tiếp tục hiển thị" "Thu nhỏ" - - + "Im lặng" "Tiếp tục chế độ im lặng" - - + "Cảnh báo" "Tiếp tục cảnh báo" "Tắt thông báo" "Tiếp tục hiển thị các thông báo từ ứng dụng này?" - "Nhẹ nhàng" - "Ưu tiên" - "Giúp bạn chỉ tập trung vào thông báo trong danh sách kéo xuống. Luôn im lặng." - "Hiển thị bên dưới thông báo mức độ ưu tiên. Luôn im lặng." - "Hiển thị bên dưới thông báo mức độ ưu tiên. Luôn im lặng." - "Hiển thị bên dưới thông báo mức độ ưu tiên. Luôn im lặng." - "Thu hút sự chú ý của bạn bằng biểu tượng thanh trạng thái và âm thanh. Hiển thị trên màn hình khóa." + "Im lặng" + "Cảnh báo" + "Giúp bạn tập trung bằng cách tắt tiếng hoặc không rung." + "Thu hút sự chú ý của bạn bằng cách bật tiếng hoặc rung." "Không thể sửa đổi các thông báo này." "Không thể định cấu hình nhóm thông báo này tại đây" "Thông báo đã xử lý qua máy chủ proxy" @@ -908,8 +899,7 @@ "Cho phép" "Từ chối" "Nhấn để lên lịch Trình tiết kiệm pin" - - + "Bật khi pin sắp hết" "Không, cảm ơn" "Đã bật Trình tiết kiệm pin được lên lịch" "Trình tiết kiệm pin sẽ tự động bật khi mức pin thấp hơn %d%%." @@ -942,4 +932,8 @@ "Chuyển tới dưới cùng bên trái" "Chuyển tới dưới cùng bên phải" "Loại bỏ" + + + + diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 8675e317b581..018777f14786 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -62,12 +62,10 @@ "不允许使用 USB 调试功能" "目前已登录此设备的用户无法开启 USB 调试功能。要使用此功能,请切换为主要用户的帐号。" "USB 端口已停用" - - + "为避免液体或碎屑导致您的设备受损,系统已停用 USB 端口,因此目前无法检测任何配件。\n\n系统会在重新允许使用 USB 端口时通知您。" "USB 端口已启用,可检测充电器和配件" "启用 USB" - - + "了解详情" "缩放以填满屏幕" "拉伸以填满屏幕" "屏幕截图" @@ -458,10 +456,8 @@ "不再显示" "全部清除" "管理" - - - - + "无声通知" + "清除所有无声通知" "勿扰模式暂停的通知" "立即开始" "没有通知" @@ -645,21 +641,16 @@ "屏蔽" "继续显示" "最小化" - - + "静音" "显示通知但不发出提示音" - - + "提醒" "继续提醒" "关闭通知" "要继续显示来自此应用的通知吗?" - "无声通知" - "已设为优先" - "只会在下拉通知栏中显示通知,引起您的注意。一律不发出提示音。" - "显示在优先通知下方。一律不发出提示音。" - "显示在优先通知下方。一律不发出提示音。" - "显示在优先通知下方。一律不发出提示音。" - "通过提示音和状态栏图标吸引您的注意。这类通知会显示在锁定屏幕上。" + "静音" + "提醒" + "不会发出提示音或振动,可帮助您保持专注。" + "通过提示音或振动吸引您的注意。" "无法修改这些通知。" "您无法在此处配置这组通知" "代理通知" @@ -908,8 +899,7 @@ "允许" "拒绝" "点按即可预设省电模式" - - + "在电池电量可能会耗尽时,系统会开启此模式" "不用了" "预设的省电模式已开启" "一旦电池电量降到 %d%% 以下,省电模式就会自动开启。" @@ -942,4 +932,8 @@ "移至左下角" "移至右下角" "关闭" + + + + diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 002e40ccb12a..cd674f50e413 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -62,12 +62,10 @@ "不允許 USB 偵錯" "目前登入此裝置的使用者無法啟用 USB 偵錯功能。如要使用此功能,請切換至主要使用者。" "已停用 USB 連接埠" - - + "為了保護您的裝置免受液體或碎片損害,USB 連接埠已停用,因此不會偵測到任何配件。\n\nUSB 連接埠可安全使用時,您會收到通知。" "已啟用 USB 連接埠以偵測充電器和配件" "啟用 USB" - - + "瞭解詳情" "放大為全螢幕" "放大為全螢幕" "螢幕截圖" @@ -458,10 +456,8 @@ "不用再顯示" "全部清除" "管理" - - - - + "靜音通知" + "清除所有靜音通知" "「請勿騷擾」模式已將通知暫停" "立即開始" "沒有通知" @@ -645,21 +641,16 @@ "封鎖" "繼續顯示" "最小化" - - + "靜音" "保持靜音" - - + "發出提醒" "繼續提示" "關閉通知" "要繼續顯示此應用程式的通知嗎?" - "低重要性" - "優先" - "協助您只查看下拉式通知欄中的通知。一律靜音。" - "顯示不重要的通知。一律靜音。" - "顯示不重要的通知。一律靜音。" - "顯示不重要的通知。一律靜音。" - "透過聲音和狀態列圖示引起您的注意,並在上鎖畫面顯示。" + "靜音" + "發出提醒" + "助您保持專注,不會發出聲音或震動。" + "發出聲音或震動來吸引您的注意。" "無法修改這些通知。" "無法在此設定這組通知" "代理通知" @@ -908,8 +899,7 @@ "允許" "拒絕" "輕按即可預定省電模式自動開啟時間" - - + "在電池電量可能耗盡前啟用「省電模式」" "不用了,謝謝" "已預定省電模式開啟時間" "省電模式將會在電量低於 %d%% 時自動開啟。" @@ -942,4 +932,8 @@ "移去左下角" "移去右下角" "關閉" + + + + diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 3824e2378db3..f16b21cad6a9 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -62,12 +62,10 @@ "無權使用 USB 偵錯功能" "目前登入這個裝置的使用者無法啟用 USB 偵錯功能。如要使用這項功能,請切換到主要使用者。" "USB 連接埠已停用" - - + "為了避免液體或灰塵導致你的裝置受損,系統已停用 USB 連接埠,因此目前無法偵測任何配件。\n\n系統會在可繼續使用 USB 連接埠時通知你。" "USB 通訊埠已啟用,可偵測充電器和配件" "啟用 USB 連接埠" - - + "瞭解詳情" "放大為全螢幕" "放大為全螢幕" "擷取螢幕畫面" @@ -458,10 +456,8 @@ "不要再顯示" "全部清除" "管理" - - - - + "無聲通知" + "清除所有無聲通知" "「零打擾」模式已將通知設為暫停" "立即開始" "沒有通知" @@ -645,21 +641,16 @@ "封鎖" "繼續顯示" "最小化" - - + "無聲" "繼續顯示通知但不發出音效" - - + "快訊" "繼續顯示通知" "關閉通知" "要繼續顯示這個應用程式的通知嗎?" - "無聲通知" - "已設為優先" - "只會在下拉式通知欄中顯示通知,且一律不發出音效。" - "顯示在優先通知下方,且一律不發出音效。" - "顯示在優先通知下方,且一律不發出音效。" - "顯示在優先通知下方,且一律不發出音效。" - "發出音效並顯示「狀態列」圖示吸引你的注意力。這類通知會顯示在螢幕鎖定畫面上。" + "靜音" + "快訊" + "協助你不受音效或震動干擾。" + "發出音效或震動吸引你的注意力。" "無法修改這些通知。" "無法在這裡設定這個通知群組" "經過 Proxy 處理的通知" @@ -726,7 +717,7 @@ "Num Lock 鍵" "數字鍵 %1$s" "系統" - "主畫面" + "主螢幕" "最近" "返回" "通知" @@ -908,8 +899,7 @@ "允許" "拒絕" "輕觸即可排定節約耗電量模式自動開啟的情況" - - + "在電池電量即將耗盡時開啟" "不用了,謝謝" "已按照排定開啟節約耗電量模式" "節約耗電量模式會在電量低於 %d%% 時自動開啟。" @@ -942,4 +932,8 @@ "移至左下方" "移至右下方" "關閉" + + + + diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 30b2e6e323c9..887bec0a7afa 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -647,13 +647,10 @@ "Qhubeka wazise" "Vala izaziso" "Qhubeka nokubonisa izaziso kusuka kulolu hlelo lokusebenza?" - "Okumnene" - "Okwenziwe kwabaluleka" - "Ikusiza ukuthi ugxile ngezaziso kuphela kumthunzi wokudonsela phansi. Ihlala ithulile." - "Ibonisa izaziso ezibalulekile ezingezansi. Ihlala ithulile." - "Ibonisa izaziso ezibalulekile ezingezansi. Ihlala ithulile." - "Ibonisa izaziso ezibalulekile ezingezansi. Ihlala ithulile." - "Yenza uyinake ngomsindo nesithonjana sebha yesimo. Iboniswa kusikrini sokukhiya." + "Kuthulile" + "Iyazisa" + "Ikusiza ukuthi ugxile ngaphandle komsindo noma ukudlidliza." + "Ithola ukunaka kwakho ngomsindo noma ukudlidliza." "Lezi zaziso azikwazi ukushintshwa." "Leli qembu lezaziso alikwazi ukulungiselelwa lapha" "Isaziso sommeli" @@ -935,4 +932,8 @@ "Hambisa inkinobho ngakwesokunxele" "Hambisa inkinobho ngakwesokudla" "Cashisa" + + + + -- GitLab From 62843c4a2ba9b76a5fbf3d4ab71db387198af421 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 1 Jun 2019 08:06:14 -0700 Subject: [PATCH 043/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I22883097259da8108e0685ba24b9062b8a522114 --- packages/SettingsLib/res/values-af/strings.xml | 2 ++ packages/SettingsLib/res/values-am/strings.xml | 2 ++ packages/SettingsLib/res/values-ar/strings.xml | 2 ++ packages/SettingsLib/res/values-as/strings.xml | 2 ++ packages/SettingsLib/res/values-az/strings.xml | 2 ++ .../SettingsLib/res/values-b+sr+Latn/strings.xml | 2 ++ packages/SettingsLib/res/values-be/strings.xml | 6 ++++-- packages/SettingsLib/res/values-bg/strings.xml | 4 +++- packages/SettingsLib/res/values-bn/strings.xml | 2 ++ packages/SettingsLib/res/values-bs/strings.xml | 6 ++++-- packages/SettingsLib/res/values-ca/strings.xml | 6 ++++-- packages/SettingsLib/res/values-cs/strings.xml | 6 ++++-- packages/SettingsLib/res/values-da/strings.xml | 4 +++- packages/SettingsLib/res/values-de/strings.xml | 8 +++++--- packages/SettingsLib/res/values-el/strings.xml | 2 ++ packages/SettingsLib/res/values-en-rAU/strings.xml | 2 ++ packages/SettingsLib/res/values-en-rCA/strings.xml | 2 ++ packages/SettingsLib/res/values-en-rGB/strings.xml | 2 ++ packages/SettingsLib/res/values-en-rIN/strings.xml | 2 ++ packages/SettingsLib/res/values-en-rXC/strings.xml | 2 ++ packages/SettingsLib/res/values-es-rUS/strings.xml | 6 ++++-- packages/SettingsLib/res/values-es/strings.xml | 2 ++ packages/SettingsLib/res/values-et/strings.xml | 2 ++ packages/SettingsLib/res/values-eu/strings.xml | 4 +++- packages/SettingsLib/res/values-fa/strings.xml | 6 ++++-- packages/SettingsLib/res/values-fi/strings.xml | 2 ++ packages/SettingsLib/res/values-fr-rCA/strings.xml | 4 +++- packages/SettingsLib/res/values-fr/strings.xml | 4 +++- packages/SettingsLib/res/values-gl/strings.xml | 2 ++ packages/SettingsLib/res/values-gu/strings.xml | 2 ++ packages/SettingsLib/res/values-hi/strings.xml | 6 ++++-- packages/SettingsLib/res/values-hr/strings.xml | 2 ++ packages/SettingsLib/res/values-hu/strings.xml | 2 ++ packages/SettingsLib/res/values-hy/strings.xml | 4 +++- packages/SettingsLib/res/values-in/strings.xml | 4 +++- packages/SettingsLib/res/values-is/strings.xml | 2 ++ packages/SettingsLib/res/values-it/strings.xml | 4 +++- packages/SettingsLib/res/values-iw/strings.xml | 4 +++- packages/SettingsLib/res/values-ja/strings.xml | 2 ++ packages/SettingsLib/res/values-ka/strings.xml | 2 ++ packages/SettingsLib/res/values-kk/strings.xml | 2 ++ packages/SettingsLib/res/values-km/strings.xml | 2 ++ packages/SettingsLib/res/values-kn/strings.xml | 2 ++ packages/SettingsLib/res/values-ko/strings.xml | 6 ++++-- packages/SettingsLib/res/values-ky/strings.xml | 6 ++++-- packages/SettingsLib/res/values-lo/strings.xml | 2 ++ packages/SettingsLib/res/values-lt/strings.xml | 2 ++ packages/SettingsLib/res/values-lv/strings.xml | 2 ++ packages/SettingsLib/res/values-mk/strings.xml | 2 ++ packages/SettingsLib/res/values-ml/strings.xml | 2 ++ packages/SettingsLib/res/values-mn/strings.xml | 2 ++ packages/SettingsLib/res/values-mr/strings.xml | 4 +++- packages/SettingsLib/res/values-ms/strings.xml | 2 ++ packages/SettingsLib/res/values-my/strings.xml | 12 +++++++----- packages/SettingsLib/res/values-nb/strings.xml | 2 ++ packages/SettingsLib/res/values-ne/strings.xml | 2 ++ packages/SettingsLib/res/values-nl/strings.xml | 4 +++- packages/SettingsLib/res/values-or/strings.xml | 4 +++- packages/SettingsLib/res/values-pa/strings.xml | 2 ++ packages/SettingsLib/res/values-pl/strings.xml | 2 ++ packages/SettingsLib/res/values-pt-rBR/strings.xml | 4 +++- packages/SettingsLib/res/values-pt-rPT/strings.xml | 2 ++ packages/SettingsLib/res/values-pt/strings.xml | 4 +++- packages/SettingsLib/res/values-ro/strings.xml | 4 +++- packages/SettingsLib/res/values-ru/strings.xml | 2 ++ packages/SettingsLib/res/values-si/strings.xml | 2 ++ packages/SettingsLib/res/values-sk/strings.xml | 8 +++++--- packages/SettingsLib/res/values-sl/strings.xml | 10 ++++++---- packages/SettingsLib/res/values-sq/strings.xml | 2 ++ packages/SettingsLib/res/values-sr/strings.xml | 2 ++ packages/SettingsLib/res/values-sv/strings.xml | 2 ++ packages/SettingsLib/res/values-sw/strings.xml | 8 +++++--- packages/SettingsLib/res/values-ta/strings.xml | 9 +++++---- packages/SettingsLib/res/values-te/strings.xml | 4 +++- packages/SettingsLib/res/values-th/strings.xml | 2 ++ packages/SettingsLib/res/values-tl/strings.xml | 2 ++ packages/SettingsLib/res/values-tr/strings.xml | 4 +++- packages/SettingsLib/res/values-uk/strings.xml | 4 +++- packages/SettingsLib/res/values-ur/strings.xml | 2 ++ packages/SettingsLib/res/values-uz/strings.xml | 2 ++ packages/SettingsLib/res/values-vi/strings.xml | 8 +++++--- packages/SettingsLib/res/values-zh-rCN/strings.xml | 2 ++ packages/SettingsLib/res/values-zh-rHK/strings.xml | 8 +++++--- packages/SettingsLib/res/values-zh-rTW/strings.xml | 2 ++ packages/SettingsLib/res/values-zu/strings.xml | 2 ++ 85 files changed, 233 insertions(+), 64 deletions(-) diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index 0116d0dc5f1a..4cedc93f4680 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -220,6 +220,7 @@ "Inligtingruiling" "Draadlose skermsertifisering" "Aktiveer Wi-Fi-woordryke aanmelding" + "Regulering van Wi-Fi-opsporing" "Mobiele data is altyd aktief" "Hardewareversnelling vir verbinding" "Wys Bluetooth-toestelle sonder name" @@ -246,6 +247,7 @@ "Kon nie koppel nie" "Wys opsies vir draadlose skermsertifisering" "Verhoog Wi-Fi-aantekeningvlak, wys per SSID RSSI in Wi‑Fi-kieser" + "Verlaag batteryverbruik en verbeter netwerk se werkverrigting" "Beperk" "Onbeperk" "Loggerbuffer se groottes" diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index b914b07df4a7..3b7abdbf1eec 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -220,6 +220,7 @@ "አውታረ መረብ" "የገመድ አልባ ማሳያ እውቅና ማረጋገጫ" "የWi‑Fi ተጨማሪ ቃላት ምዝግብ ማስታወሻ መያዝ" + "Wi‑Fi scan throttling" "የተንቀሳቃሽ ስልክ ውሂብ ሁልጊዜ ገቢር ነው" "የሃርድዌር ማቀላጠፊያን በማስተሳሰር ላይ" "የብሉቱዝ መሣሪያዎችን ያለ ስሞች አሳይ" @@ -246,6 +247,7 @@ "መገናኘት አልተቻለም" "የገመድ አልባ ማሳያ እውቅና ማረጋገጫ አማራጮችን አሳይ" "የWi‑Fi ምዝግብ ማስታወሻ አያያዝ ደረጃ ጨምር፣ በWi‑Fi መምረጫ ውስጥ በአንድ SSID RSSI አሳይ" + "የባትሪ መላሸቅን ይቀንሳል እንዲሁም የአውታረ መረብ አፈጻጸም ብቃትን ያሻሽላል" "የሚለካ" "ያልተለካ" "የምዝግብ ማስታወሻ ያዥ መጠኖች" diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 0a9edb50e2d2..df1ec30a0718 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -220,6 +220,7 @@ "الشبكات" "شهادة عرض شاشة لاسلكي" "‏تفعيل تسجيل Wi‑Fi Verbose" + "‏تقييد البحث عن شبكات Wi-Fi" "بيانات الجوّال نشطة دائمًا" "تسريع الأجهزة للتوصيل" "عرض أجهزة البلوتوث بدون أسماء" @@ -246,6 +247,7 @@ "تعذّر الاتصال" "عرض خيارات شهادة عرض شاشة لاسلكي" "‏زيادة مستوى تسجيل Wi-Fi، وعرض لكل SSID RSSI في منتقي Wi-Fi" + "لتقليل استنفاد البطارية وتحسين أداء الشبكة." "تفرض تكلفة استخدام" "بدون قياس" "أحجام ذاكرة التخزين المؤقت للتسجيل" diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index fddfb05d607d..9c25b66cb6aa 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -220,6 +220,7 @@ "নেটৱৰ্কিং" "বেতাঁৰ ডিছপ্লে’ প্ৰমাণীকৰণ" "ৱাই-ফাই ভাৰ্ব\'ছ লগিং সক্ষম কৰক" + "ৱাই-ফাই স্কেনৰ নিয়ন্ত্ৰণ" "ম’বাইল ডেটা সদা-সক্ৰিয়" "টেডাৰিং হাৰ্ডৱেৰ ত্বৰণ" "নামবিহীন ব্লুটুথ ডিভাইচসমূহ দেখুৱাওক" @@ -246,6 +247,7 @@ "সংযোগ কৰিব পৰা নগ\'ল" "বেতাঁৰ ডিছপ্লে’ প্ৰমাণপত্ৰৰ বাবে বিকল্পসমূহ দেখুৱাওক" "ৱাই-ফাই লগিঙৰ মাত্ৰা বঢ়াওক, Wi‑Fi পিকাৰত প্ৰতি SSID RSSI দেখুৱাওক" + "বেটাৰীৰ খৰচ কমায় আৰু নেটৱৰ্কৰ কাৰ্যক্ষমতা বৃদ্ধি কৰে" "নিৰিখ-নিৰ্দিষ্ট" "নিৰিখ অনিৰ্দিষ্ট" "লগাৰৰ বাফাৰৰ আকাৰ" diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index 642b81c64864..3a6d301b6f8d 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -220,6 +220,7 @@ "Şəbəkələşmə" "Simsiz displey sertifikatlaşması" "Wi‑Fi Çoxsözlü Girişə icazə verin" + "Wi‑Fi skanlamasının tənzimlənməsi" "Mobil data həmişə aktiv" "Birləşmə üçün avadanlıq akselerasiyası" "Bluetooth cihazlarını adsız göstərin" @@ -246,6 +247,7 @@ "Qoşulmaq mümkün olmadı" "Simsiz displey sertifikatlaşması üçün seçimləri göstərir" "Wi‑Fi giriş səviyyəsini qaldırın, Wi‑Fi seçəndə hər SSID RSSI üzrə göstərin" + "Batareya istifadəsini azaldır & şəbəkə performansını yaxşılaşdırır" "Ödənişli" "Limitsiz" "Logger bufer ölçüləri" diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 4fea77a07329..a8808fa42cca 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -220,6 +220,7 @@ "Umrežavanje" "Sertifikacija bežičnog ekrana" "Omogući detaljniju evidenciju za Wi‑Fi" + "Usporavanje Wi-Fi skeniranja" "Mobilni podaci su uvek aktivni" "Hardversko ubrzanje privezivanja" "Prikaži Bluetooth uređaje bez naziva" @@ -246,6 +247,7 @@ "Povezivanje nije uspelo" "Prikaz opcija za sertifikaciju bežičnog ekrana" "Povećava nivo evidentiranja za Wi‑Fi. Prikaz po SSID RSSI-u u biraču Wi‑Fi mreže" + "Smanjuje potrošnju baterije i poboljšava učinak mreže" "Sa ograničenjem" "Bez ograničenja" "Veličine bafera podataka u programu za evidentiranje" diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index 5013300944f6..05d9a5d2f5db 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -35,7 +35,7 @@ "Не ў зоне дасягальнасці" "Не будзе аўтаматычна падключацца" "Няма доступу да інтэрнэту" - "Хто захаваў: %1$s" + "Захавана праз: %1$s" "Аўтаматычна падключана праз %1$s" "Аўтаматычна падключана праз пастаўшчыка паслугі ацэнкі сеткі" "Падключана праз %1$s" @@ -220,6 +220,7 @@ "Сеткі" "Сертыфікацыя бесправаднога экрана" "Уключыць падрабязны журнал Wi‑Fi" + "Рэгуляванне пошуку сетак Wi‑Fi" "Мабільная перадача даных заўсёды актыўная" "Апаратнае паскарэнне ў рэжыме мадэма" "Паказваць прылады Bluetooth без назваў" @@ -246,6 +247,7 @@ "Не атрымалася падключыцца" "Паказаць опцыі сертыфікацыі бесправаднога экрана" "Пры выбары сеткі Wi-Fi указваць у журнале RSSI для кожнага SSID" + "Зніжае расход зараду акумулятара і павышае прадукцыйнасць мабільных сетак" "Сетка з улікам трафіка" "Сетка без уліку трафіка" "Памеры буфера журнала" @@ -407,7 +409,7 @@ "ідзе зарадка" "Не зараджаецца" "Падключана да сеткі сілкавання, зарадзіць зараз немагчыма" - "Поўная" + "Акумулятар зараджаны" "Кантралюецца адміністратарам" "Адключанае" "Дазволена" diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index 18bbc80beed2..7fa5b0639073 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -220,6 +220,7 @@ "Мрежи" "Безжичен дисплей" "„Многословно“ регистр. на Wi‑Fi: Актив." + "Ограничаване на сканирането за Wi-Fi" "Винаги активни мобилни данни" "Хардуерно ускорение за тетъринга" "Показване на устройствата с Bluetooth без имена" @@ -242,10 +243,11 @@ "Изкл." "Автоматично" "Име на хоста на доставчика на частния DNS" - "Въведете името на хоста на DNS доставчика" + "Въведете име на хоста на DNS доставчика" "Не можа да се установи връзка" "Показване на опциите за сертифициране на безжичния дисплей" "По-подробно регистр. на Wi‑Fi – данни за RSSI на SSID в инстр. за избор на Wi‑Fi" + "Намалява изразходването на батерията и подобрява ефективността на мрежата" "С отчитане" "Без отчитане" "Размери на регистрац. буфери" diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index 9f9bf04c71d4..bdbde46fd95a 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -220,6 +220,7 @@ "নেটওয়ার্কিং" "ওয়্যারলেস ডিসপ্লে সার্টিফিকেশন" "ওয়াই-ফাই ভারবোস লগিং সক্ষম করুন" + "ওয়াই-ফাই স্ক্যান থ্রোটলিং" "মোবাইল ডেটা সব সময় সক্রিয় থাক" "টিথারিং হার্ডওয়্যার অ্যাক্সিলারেশন" "নামহীন ব্লুটুথ ডিভাইসগুলি দেখুন" @@ -246,6 +247,7 @@ "কানেক্ট করা যায়নি" "ওয়্যারলেস প্রদর্শন সার্টিফিকেশন জন্য বিকল্পগুলি দেখান" "ওয়াই-ফাই লগিং স্তর বাড়ান, ওয়াই-ফাই চয়নকারীতে SSID RSSI অনুযায়ী দেখান" + "ব্যাটারির খরচ কমায় এবং নেটওয়ার্কের পারফর্ম্যান্স উন্নত করে" "মিটার্ড" "পরিমাপ করা নয়" "লগার বাফারের আকারগুলি" diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index bbc89d4e961f..02b2a8bd8480 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -21,9 +21,9 @@ "Ne može skenirati mreže" - "Nema" + "Ništa" "Sačuvano" - "Veza je prekinuta" + "Nije povezano" "Onemogućeno" "Greška u konfiguraciji IP-a" "Niste povezani zbog slabog kvaliteta mreže" @@ -220,6 +220,7 @@ "Umrežavanje" "Certifikacija bežičnog prikaza" "Omogući detaljni zapisnik za WiFi" + "Reguliranje skeniranja WiFi mreže" "Prijenos podataka na mobilnoj mreži je uvijek aktivan" "Hardversko ubrzavanje za povezivanje putem mobitela" "Prikaži Bluetooth uređaje bez naziva" @@ -246,6 +247,7 @@ "Povezivanje nije uspjelo" "Prikaz opcija za certifikaciju bežičnog prikaza" "Povećani nivo zapisnika za WiFi. Prikaz po SSID RSSI-ju u Biraču WiFi-ja" + "Smanjuje potrošnju baterije i poboljšava performanse mreže" "S naplatom" "Mreža bez naplate" "Veličine međumemorije zapisnika" diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 8a4ab91a2006..d464256f8f50 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -155,7 +155,7 @@ "Configuració de text a parla" "Sortida de text a parla" "Velocitat de parla" - "Velocitat de lectura del text" + "Velocitat a què s\'enuncia el text" "To" "Afecta el to de la veu sintetitzada" "Idioma" @@ -179,7 +179,7 @@ "Motor preferent" "General" "Restableix el to de la veu" - "Restableix el to predeterminat amb què es llegeix el text." + "Restableix a predeterminat el to amb què s\'enuncia el text." "Molt lenta" "Lenta" @@ -220,6 +220,7 @@ "Xarxes" "Certificació de pantalla sense fil" "Activa el registre Wi‑Fi detallat" + "Regulació de la cerca de xarxes Wi‑Fi" "Dades mòbils sempre actives" "Acceleració per maquinari per a compartició de xarxa" "Mostra els dispositius Bluetooth sense el nom" @@ -246,6 +247,7 @@ "No s\'ha pogut connectar" "Mostra les opcions per a la certificació de pantalla sense fil" "Augmenta nivell de registre Wi‑Fi, mostra\'l per SSID RSSI al selector de Wi‑Fi" + "Redueix el consum de bateria i millora el rendiment de la xarxa" "D\'ús mesurat" "D\'ús no mesurat" "Mides de la mem. intermèdia del registrador" diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index 0163382261a4..525639985c5b 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -220,6 +220,7 @@ "Sítě" "Certifikace bezdrát. displeje" "Podrobné protokolování Wi‑Fi" + "Přibrždění vyhledávání Wi‑Fi" "Mobilní data jsou vždy aktivní" "Hardwarová akcelerace tetheringu" "Zobrazovat zařízení Bluetooth bez názvů" @@ -246,6 +247,7 @@ "Nelze se připojit" "Zobrazit možnosti certifikace bezdrátového displeje" "Zvýšit úroveň protokolování Wi‑Fi zobrazenou v SSID a RSSI při výběru sítě Wi‑Fi." + "Snižuje vyčerpávání baterie a vylepšuje výkon sítě" "Měřená" "Neměřená" "Vyrovnávací paměť protokol. nástroje" @@ -419,8 +421,8 @@ "50 %" "100 %" - "před %1$s" - "Zbývající čas: %1$s" + "Před %1$s" + "zbývá: %1$s" "Malé" "Výchozí" "Velké" diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 04ef33dbee38..1884f645fcf1 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -78,7 +78,7 @@ "Aktivt – venstre: %1$s batteri. Højre: %2$s batteri" "%1$s batteri" "Venstre: %1$s batteri. Højre: %2$s batteri" - "Aktivt" + "Aktiv" "Medielyd" "Telefonopkald" "Filoverførsel" @@ -220,6 +220,7 @@ "Netværk" "Certificering af trådløs skærm" "Aktivér detaljeret Wi-Fi-logføring" + "Begrænsning af Wi-Fi-scanning" "Mobildata er altid aktiveret" "Hardwareacceleration ved netdeling" "Vis Bluetooth-enheder uden navne" @@ -246,6 +247,7 @@ "Der kunne ikke oprettes forbindelse" "Vis valgmuligheder for certificering af trådløs skærm" "Øg mængden af Wi‑Fi-logføring. Vis opdelt efter SSID RSSI i Wi‑Fi-vælgeren" + "Reducerer batteriforbruget og forbedrer netværkets effektivitet" "Forbrugsafregnet" "Ikke forbrugsafregnet" "Størrelser for Logger-buffer" diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index e705d82928ca..0347f2d5a3a0 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -113,7 +113,7 @@ "Koppeln" "KOPPELN" "Abbrechen" - "Über die Kopplung kann auf deine Kontakte und auf deinen Anrufverlauf zugegriffen werden, wenn eine Verbindung besteht." + "Über die Kopplung kann auf deine Kontakte und auf deine Anrufliste zugegriffen werden, wenn eine Verbindung besteht." "Kopplung mit %1$s war nicht möglich." "Kopplung mit %1$s war nicht möglich, weil die eingegebene PIN oder der Zugangscode falsch ist." "Kommunikation mit %1$s ist nicht möglich." @@ -153,7 +153,7 @@ "Einige Standardeinstellungen festgelegt" "Keine Standardeinstellungen festgelegt" "Sprachausgabe" - "Sprachausgabe-Einstellungen" + "Sprachausgabe" "Sprechgeschwindigkeit" "Geschwindigkeit, mit der der Text gesprochen wird" "Tonlage" @@ -220,6 +220,7 @@ "Netzwerke" "Zertifizierung für kabellose Übertragung" "Ausführliche WLAN-Protokollierung aktivieren" + "Drosselung der WLAN-Suche" "Mobile Datennutzung immer aktiviert" "Hardwarebeschleunigung für Tethering" "Bluetooth-Geräte ohne Namen anzeigen" @@ -246,6 +247,7 @@ "Verbindung nicht möglich" "Optionen zur Zertifizierung für kabellose Übertragung anzeigen" "WLAN-Protokollierungsebene erhöhen, in WiFi Picker pro SSID RSSI anzeigen" + "Verringert den Akkuverbrauch und verbessert die Netzwerkleistung" "Kostenpflichtig" "Kostenlos" "Logger-Puffergrößen" @@ -326,7 +328,7 @@ "Limit für Hintergrundprozesse" "Absturzmeldungen für Hintergrund-Apps anzeigen" "Bei Abstürzen von Hintergrund-Apps \"App reagiert nicht\"-Dialog anzeigen" - "Benachrichtigungskanal-Warnungen anzeigen" + "Benachrichtigungskanal- Warnungen anzeigen" "Bei Benachrichtigungen ohne gültigen Kanal wird eine Warnung angezeigt" "Sperrung des externen Speichers für alle Apps aufheben" "Jede App kann, ungeachtet der Manifestwerte, in den externen Speicher geschrieben werden" diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 031cd0d99b2a..b1b1be642eba 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -220,6 +220,7 @@ "Δικτύωση" "Πιστοποίηση ασύρματης οθόνης" "Ενεργοποίηση λεπτομερ. καταγραφής Wi-Fi" + "Περιορισμός σάρωσης Wi-Fi" "Πάντα ενεργά δεδομένα κινητής τηλεφωνίας" "Σύνδεση επιτάχυνσης υλικού" "Εμφάνιση συσκευών Bluetooth χωρίς ονόματα" @@ -246,6 +247,7 @@ "Δεν ήταν δυνατή η σύνδεση" "Εμφάνιση επιλογών για πιστοποίηση ασύρματης οθόνης" "Αύξηση επιπέδου καταγ. Wi-Fi, εμφάνιση ανά SSID RSSI στο εργαλείο επιλογής Wi-Fi" + "Περιορίζει την κατανάλωση της μπαταρίας και βελτιώνει την απόδοση του δικτύου" "Μέτρηση με βάση τη χρήση" "Χωρίς μέτρηση με βάση τη χρήση" "Μέγεθος προσωρινής μνήμης για τη λειτουργία καταγραφής" diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index 57288006b392..57f5d5a5f614 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -220,6 +220,7 @@ "Networking" "Wireless display certification" "Enable Wi‑Fi verbose logging" + "Wi‑Fi scan throttling" "Mobile data always active" "Tethering hardware acceleration" "Show Bluetooth devices without names" @@ -246,6 +247,7 @@ "Couldn\'t connect" "Show options for wireless display certification" "Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker" + "Reduces battery drain and improves network performance" "Metered" "Unmetered" "Logger buffer sizes" diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml index 57288006b392..57f5d5a5f614 100644 --- a/packages/SettingsLib/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/res/values-en-rCA/strings.xml @@ -220,6 +220,7 @@ "Networking" "Wireless display certification" "Enable Wi‑Fi verbose logging" + "Wi‑Fi scan throttling" "Mobile data always active" "Tethering hardware acceleration" "Show Bluetooth devices without names" @@ -246,6 +247,7 @@ "Couldn\'t connect" "Show options for wireless display certification" "Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker" + "Reduces battery drain and improves network performance" "Metered" "Unmetered" "Logger buffer sizes" diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index 57288006b392..57f5d5a5f614 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -220,6 +220,7 @@ "Networking" "Wireless display certification" "Enable Wi‑Fi verbose logging" + "Wi‑Fi scan throttling" "Mobile data always active" "Tethering hardware acceleration" "Show Bluetooth devices without names" @@ -246,6 +247,7 @@ "Couldn\'t connect" "Show options for wireless display certification" "Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker" + "Reduces battery drain and improves network performance" "Metered" "Unmetered" "Logger buffer sizes" diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index 57288006b392..57f5d5a5f614 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -220,6 +220,7 @@ "Networking" "Wireless display certification" "Enable Wi‑Fi verbose logging" + "Wi‑Fi scan throttling" "Mobile data always active" "Tethering hardware acceleration" "Show Bluetooth devices without names" @@ -246,6 +247,7 @@ "Couldn\'t connect" "Show options for wireless display certification" "Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker" + "Reduces battery drain and improves network performance" "Metered" "Unmetered" "Logger buffer sizes" diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml index 460442b7bcbe..e5a0bda2fee4 100644 --- a/packages/SettingsLib/res/values-en-rXC/strings.xml +++ b/packages/SettingsLib/res/values-en-rXC/strings.xml @@ -220,6 +220,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‎‎‎‏‏‎‎‏‎‏‎‏‏‎‎‎‎‏‎‏‏‎‏‏‎‎‏‎‏‎‎‎‏‏‏‎‎‎‎‎‏‏‏‎‎‏‏‏‏‏‏‎‎Networking‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‏‎‎‏‏‏‎‎‎‎‏‏‎‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‎‎‎‎‏‏‏‎‏‎‏‏‎‎‎‎‏‏‎‏‎Wireless display certification‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‎‏‏‎‏‎‏‎‎‏‎‏‏‏‏‏‎‎‎‎‏‏‎‏‏‎‎‎‏‏‏‎‏‏‏‏‎‏‏‏‎‏‎‎‎‏‏‎‏‎‎‎‎Enable Wi‑Fi Verbose Logging‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‏‎‎‎‏‏‏‎‎‎‎‏‏‏‏‏‎‎‎‎‏‎‎‏‎‏‏‎‎‎‏‎‎‎‎‏‏‏‎‎‏‎‎‏‎‏‎‎‎‎‎‏‏‎‎‎‏‏‎Wi‑Fi scan throttling‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‏‎‎‎‏‏‎‏‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‎‎‏‏‏‏‏‎‎‎‏‏‏‎‎‏‏‎‏‏‏‎‎‏‎‎Mobile data always active‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎‏‎‏‎‎‎‎‎‎‎‏‏‏‏‎‏‏‎‏‎‎‎‎‏‎‎‏‏‎‏‏‎‎Tethering hardware acceleration‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‏‎‏‏‏‏‏‎‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‎‏‏‏‏‎‎‎‏‎‏‎‎‎‏‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎Show Bluetooth devices without names‎‏‎‎‏‎" @@ -246,6 +247,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‏‏‎‎‏‏‎‏‏‏‏‎‏‎‎‏‏‎‏‏‎‎‏‎‎‏‏‎‎‎‏‎‎‏‏‏‏‎‎‏‎‏‏‎‎‏‎‎‏‏‎‎‏‏‎‏‏‏‎Couldn\'t connect‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‎‎‎‎‎‎‎‏‎‎‎‎‎‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‎‎‏‎‏‎‎‏‎‏‏‎‎‏‏‎‎‎‎‏‏‎‏‎‏‎‏‏‏‎‏‎Show options for wireless display certification‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‎‏‏‎‏‎‏‏‏‎‏‎‎‏‎‎‏‎‏‏‎‎‎‏‏‎‎‏‎‎‎‎‏‏‎‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‏‏‎‎Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‏‎‎‏‏‏‎‎‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‏‎‏‎‎‎‎‏‎‎‏‏‎Reduces battery drain & improves network performance‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‏‎‏‎‎‎‎‎‏‏‏‎‏‏‏‎‏‎‏‎‎‏‏‏‏‎‎‎‎‏‎‏‏‏‎‎‏‎‏‏‏‎‏‏‏‎‎‎‏‎‏‏‎‏‎Metered‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‏‎‏‎‏‏‎‎‎‏‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‏‏‎‎‎‏‎‎‏‏‏‎‎‎‏‏‎Unmetered‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‎‏‏‏‏‏‎‎‏‏‏‎‏‏‎‏‎‎‎‏‎‏‎‎‏‏‎‏‏‏‏‎‎‎‏‏‏‏‎‎‏‎‎‏‎‎‏‎‎‏‎‎‎Logger buffer sizes‎‏‎‎‏‎" diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 22d39c502445..beb1ac546949 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -141,9 +141,9 @@ "Aplicaciones eliminadas" "Aplicaciones y usuarios eliminados" "Actualizaciones del sistema" - "Conexión mediante USB" + "Conexión USB" "Hotspot portátil" - "Conexión mediante Bluetooth" + "Conexión Bluetooth" "Compartir conexión" "Hotspots y dispositivos portátiles" "Todas las apps de trabajo" @@ -220,6 +220,7 @@ "Redes" "Certificación de pantalla inalámbrica" "Habilitar registro detallado de Wi-Fi" + "Limitación de búsqueda de Wi-Fi" "Datos móviles siempre activados" "Aceleración de hardware de conexión mediante dispositivo portátil" "Mostrar dispositivos Bluetooth sin nombre" @@ -246,6 +247,7 @@ "No se pudo establecer conexión" "Mostrar opciones de certificación de pantalla inalámbrica" "Aumentar nivel de registro Wi-Fi; mostrar por SSID RSSI en el selector de Wi-Fi" + "Reduce el consumo de batería y mejora el rendimiento de la red" "Con uso medido" "Sin tarifa plana" "Tamaños de búfer de Logger" diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 533296c8ad63..e1277d862122 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -220,6 +220,7 @@ "Redes" "Certificación de pantalla inalámbrica" "Habilitar registro de Wi-Fi detallado" + "Limitación de búsqueda de redes Wi‑Fi" "Datos móviles siempre activos" "Aceleración por hardware para conexión compartida" "Mostrar dispositivos Bluetooth sin nombre" @@ -246,6 +247,7 @@ "No se ha podido establecer la conexión" "Mostrar opciones para la certificación de la pantalla inalámbrica" "Aumentar el nivel de registro de Wi-Fi y mostrar por SSID RSSI en el selector Wi-Fi" + "Reduce el consumo de batería y mejora el rendimiento de las redes" "Medida" "No medida" "Tamaños del búfer para registrar" diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index e5e8f56a840f..090b28da22f0 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -220,6 +220,7 @@ "Võrgundus" "Juhtmeta ekraaniühenduse sertifitseerimine" "Luba WiFi sõnaline logimine" + "WiFi-skannimise ahendamine" "Hoia mobiilne andmeside alati aktiivne" "Ühenduse jagamise riistvaraline kiirendus" "Kuva ilma nimedeta Bluetoothi seadmed" @@ -246,6 +247,7 @@ "Ühendamine ebaõnnestus" "Juhtmeta ekraaniühenduse sertifitseerimisvalikute kuvamine" "Suurenda WiFi logimistaset, kuva WiFi valijas SSID RSSI järgi" + "Aeglustab aku tühjenemist ja parandab võrgu toimivust" "Mahupõhine" "Mittemahupõhine" "Logija puhvri suurused" diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index 447b738dfae1..d2e3a3868a5f 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -220,6 +220,7 @@ "Sareak" "Hari gabe bistaratzeko ziurtagiria" "Gaitu wifi-sareetan saioa hasteko modu xehatua" + "Wifi-sareen bilaketaren muga" "Datu-konexioa beti aktibo" "Konexioa partekatzeko hardwarearen azelerazioa" "Erakutsi Bluetooth gailuak izenik gabe" @@ -246,8 +247,9 @@ "Ezin izan da konektatu" "Erakutsi hari gabe bistaratzeko ziurtagiriaren aukerak" "Erakutsi datu gehiago wifi-sareetan saioa hastean. Erakutsi sarearen identifikatzailea eta seinalearen indarra wifi-sareen hautagailuan." + "Bateria gutxiago kontsumituko da, eta sarearen errendimendua hobetuko." "Sare neurtua" - "Sare ez-mugatua" + "Neurtu gabeko sarea" "Erregistroen buffer-tamainak" "Hautatu erregistroen buffer-tamainak" "Erregistro iraunkorraren biltegia garbitu nahi duzu?" diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index c8f99a757fa0..6632752c629c 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -220,6 +220,7 @@ "شبکه" "گواهینامه نمایش بی‌سیم" "‏فعال کردن گزارش‌گیری طولانی Wi‑Fi" + "‏محدود کردن اسکن کردن Wi‑Fi" "داده تلفن همراه همیشه فعال باشد" "شتاب سخت‌افزاری اتصال به اینترنت با تلفن همراه" "نمایش دستگاه‌های بلوتوث بدون نام" @@ -246,6 +247,7 @@ "متصل نشد" "نمایش گزینه‌ها برای گواهینامه نمایش بی‌سیم" "‏افزایش سطح گزارش‌گیری Wi‑Fi، نمایش به ازای SSID RSSI در انتخاب‌کننده Wi‑Fi" + "تخلیه باتری راکاهش می‌دهد و عملکرد شبکه را بهبود می‌بخشد" "محدودشده" "محدودنشده" "اندازه‌های حافظه موقت ثبت‌کننده" @@ -454,8 +456,8 @@ "هرگز" "فقط اولویت‌دار" "%1$s. %2$s" - "صدای زنگ بعدی‌تان را در ساعت %1$s نخواهید شنید، مگر اینکه قبل از آن ساعت، این تنظیم را خاموش کنید" - "صدای زنگ بعدی‌تان را در ساعت %1$s نخواهید شنید" + "زنگ بعدی‌تان را در ساعت %1$s نخواهید شنید، مگر اینکه قبل‌از آن ساعت، این تنظیم را خاموش کنید" + "زنگ بعدی‌تان را در ساعت %1$s نخواهید شنید" "ساعت %1$s" "روز %1$s" "مدت" diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index b166cb0ae809..0d522c4015a4 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -220,6 +220,7 @@ "Yhteysominaisuudet" "Langattoman näytön sertifiointi" "Käytä Wi-Fin laajennettua lokikirjausta" + "Wi‑Fi-haun rajoitus" "Mobiilidata aina käytössä" "Laitteistokiihdytyksen yhteyden jakaminen" "Näytä nimettömät Bluetooth-laitteet" @@ -246,6 +247,7 @@ "Ei yhteyttä" "Näytä langattoman näytön sertifiointiin liittyvät asetukset." "Lisää Wi‑Fin lokikirjaustasoa, näytä SSID RSSI -kohtaisesti Wi‑Fi-valitsimessa." + "Vähentää virrankulutusta ja parantaa verkon toimintaa" "Maksullinen" "Maksuton" "Lokipuskurien koot" diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 99833375a372..1dde8632fbc9 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -153,7 +153,7 @@ "Certaines préférences par défaut définies" "Aucune préférence par défaut définie" "Synthèse vocale" - "Sortie de la synthèse vocale" + "Synthèse vocale" "Cadence" "Vitesse à laquelle le texte est énoncé" "Ton" @@ -220,6 +220,7 @@ "Réseautage" "Certification de l\'affichage sans fil" "Autoriser enreg. données Wi-Fi détaillées" + "Limiter la recherche de réseaux Wi-Fi" "Données cellulaires toujours actives" "Accélération matérielle pour le partage de connexion" "Afficher les appareils Bluetooth sans nom" @@ -246,6 +247,7 @@ "Impossible de se connecter" "Afficher les options pour la certification d\'affichage sans fil" "Détailler davantage les données Wi-Fi, afficher par SSID RSSI dans sélect. Wi-Fi" + "Réduit l\'utilisation de la pile et améliore les performances réseau" "Facturé à l\'usage" "Non mesuré" "Tailles des mémoires tampons d\'enregistreur" diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index e2bc2fea882e..3aa8db984c3d 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -220,6 +220,7 @@ "Mise en réseau" "Certification affichage sans fil" "Autoriser l\'enregistrement d\'infos Wi-Fi détaillées" + "Limiter la recherche Wi‑Fi" "Données mobiles toujours actives" "Accélération matérielle pour le partage de connexion" "Afficher les appareils Bluetooth sans nom" @@ -246,6 +247,7 @@ "Impossible de se connecter" "Afficher les options pour la certification de l\'affichage sans fil" "Détailler les infos Wi-Fi, afficher par RSSI de SSID dans l\'outil de sélection Wi-Fi" + "Réduit la décharge de la batterie et améliore les performances du réseau" "Facturé à l\'usage" "Non facturé à l\'usage" "Tailles des tampons de l\'enregistreur" @@ -404,7 +406,7 @@ "%1$s - %2$s jusqu\'à la charge complète" "Inconnu" "Batterie en charge" - "chargement…" + "en charge…" "Pas en charge" "Appareil branché, mais impossible de le charger pour le moment" "Pleine" diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index f41be397f25d..4bd1c785080c 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -220,6 +220,7 @@ "Redes" "Certificado de visualización sen fíos" "Activar rexistro detallado da wifi" + "Limitación da busca de wifi" "Datos móbiles sempre activados" "Aceleración de hardware para conexión compartida" "Mostrar dispositivos Bluetooth sen nomes" @@ -246,6 +247,7 @@ "Non se puido conectar" "Mostra opcións para o certificado de visualización sen fíos" "Aumenta o nivel de rexistro da wifi, móstrao por SSID RSSI no selector de wifi" + "Reduce o consumo de batería e mellora o rendemento da rede" "Sen tarifa plana" "Con tarifa plana" "Tamaño dos búfers do rexistrador" diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index a411a056de7c..cf0e2016736b 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -220,6 +220,7 @@ "નેટવર્કિંગ" "વાયરલેસ ડિસ્પ્લે પ્રમાણન" "વાઇ-ફાઇ વર્બોઝ લૉગિંગ ચાલુ કરો" + "વાઇ-ફાઇ સ્કૅનની ક્ષમતા મર્યાદિત કરવી" "મોબાઇલ ડેટા હંમેશાં સક્રિય" "ટિથરિંગ માટે હાર્ડવેર ગતિવૃદ્ધિ" "નામ વિનાના બ્લૂટૂથ ઉપકરણો બતાવો" @@ -246,6 +247,7 @@ "કનેક્ટ કરી શકાયું નથી" "વાયરલેસ ડિસ્પ્લે પ્રમાણપત્ર માટેના વિકલ્પો બતાવો" "વાઇ-ફાઇ લોગિંગ સ્તર વધારો, વાઇ-ફાઇ પીકરમાં SSID RSSI દીઠ બતાવો" + "બૅટરીનો ચાર્જ ઝડપથી ઓછો થવાનું ટાળે છે અને નેટવર્કની કાર્યક્ષમતામાં સુધારો કરે છે" "મીટર કરેલ" "મીટર ન કરેલ" "લોગર બફર કદ" diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 954c04ada091..8c6ff8e51f88 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -220,6 +220,7 @@ "नेटवर्किंग" "वायरलेस डिसप्ले सर्टिफ़िकेशन" "वाई-फ़ाई वर्बोस लॉगिंग चालू करें" + "वाई-फ़ाई के लिए स्कैन की संख्या कम करें" "मोबाइल डेटा हमेशा चालू" "हार्डवेयर से तेज़ी लाने के लिए टेदर करें" "बिना नाम वाले ब्लूटूथ डिवाइस दिखाएं" @@ -246,6 +247,7 @@ "कनेक्‍ट नहीं हो सका" "वायरलेस डिसप्ले सर्टिफ़िकेशन के विकल्प दिखाएं" "वाई-फ़ाई लॉगिंग का स्तर बढ़ाएं, वाई-फ़ाई पिकर में प्रति SSID RSSI दिखाएं" + "बैटरी की खपत कम और नेटवर्क की परफ़ॉर्मेंस बेहतर होती है" "डेटा इस्तेमाल करने की सीमा तय की गई है" "डेटा इस्तेमाल करने की सीमा तय नहीं की गई है" "लॉगर बफ़र आकार" @@ -282,7 +284,7 @@ "कुछ भी नहीं" "डीबगर का इंतज़ार करें" "डीबग किया गया ऐप्लिकेशन प्रोसेस के पहले डीबगर के अटैच होने का इंतज़ार करता है" - "हिंदी में लिखें" + "इनपुट" "ड्रॉइंग" "हार्डवेयर ऐक्सेलरेटेड रेंडरिंग" "मीडिया" @@ -434,7 +436,7 @@ "टाइप करने की सक्रीय पद्धतियां" "सिस्टम की भाषाओं का उपयोग करें" "%1$s के लिए सेटिंग खोलने में विफल रहा" - "यह इनपुट विधि, पासवर्ड और क्रेडिट कार्ड नंबर जैसे निजी डेटा सहित लिखे जाने वाले सभी लेख को एकत्र कर सकती है. यह %1$s ऐप्लिकेशन से आती है. इस इनपुट विधि का उपयोग करें?" + "इनपुट का यह तरीका, आपके पासवर्ड और क्रेडिट कार्ड नंबर जैसे निजी डेटा के साथ-साथ उस सभी डेटा को इकट्ठा कर सकता है जिसे आप लिखते हैं. यह %1$s ऐप्लिकेशन से आता है. इनपुट के इस तरीके का इस्तेमाल करें?" "नोट: पुनः बूट करने के बाद, यह ऐप्लिकेशन तब तक शुरू नहीं हो सकता है जब तक कि आप अपना फ़ोन अनलॉक ना कर लें" "IMS रजिस्ट्रेशन की स्थिति" "रजिस्टर है" diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index ea4a68871252..6d957dcf60f8 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -220,6 +220,7 @@ "Umrežavanje" "Certifikacija bežičnog prikaza" "Omogući opširnu prijavu na Wi-Fi" + "Usporavanje traženja Wi-Fija" "Mobilni podaci uvijek aktivni" "Hardversko ubrzanje za modemsko povezivanje" "Prikaži Bluetooth uređaje bez naziva" @@ -246,6 +247,7 @@ "Povezivanje nije moguće" "Prikaz opcija za certifikaciju bežičnog prikaza" "Povećana razina prijave na Wi‑Fi, prikaz po SSID RSSI-ju u Biraču Wi‑Fi-ja" + "Smanjuje potrošnju baterije i poboljšava rad mreže" "S ograničenim prometom" "Bez ograničenja prometa" "Veličine međuspremnika zapisnika" diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index d4fc9a7a1726..39b5da26f55f 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -220,6 +220,7 @@ "Hálózatok" "Vezeték nélküli kijelző tanúsítványa" "Részletes Wi-Fi-naplózás engedélyezése" + "Wi-Fi-hálózat szabályozása" "A mobilhálózati kapcsolat mindig aktív" "Internetmegosztás hardveres gyorsítása" "Név nélküli Bluetooth-eszközök megjelenítése" @@ -246,6 +247,7 @@ "Nem sikerült kapcsolódni" "Vezeték nélküli kijelző tanúsítványával kapcsolatos lehetőségek megjelenítése" "Wi‑Fi-naplózási szint növelése, RSSI/SSID megjelenítése a Wi‑Fi-választóban" + "Csökkenti az akkumulátorhasználatot, és javítja a hálózat teljesítményét" "Forgalomkorlátos" "Nem forgalomkorlátos" "Naplózási puffer mérete" diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index 836b70d39af6..bf587405c668 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -84,7 +84,7 @@ "Ֆայլերի փոխանցում" "Ներմուծման սարք" "Ինտերնետի հասանելիություն" - "Կոնտակտի համօգտագործում" + "Կոնտակտների փոխանակում" "Օգտագործել կոնտակտի համօգտագործման համար" "Ինտերնետ կապի տարածում" "SMS հաղորդագրություններ" @@ -220,6 +220,7 @@ "Ցանց" "Անլար էկրանների հավաստագրում" "Միացնել Wi‑Fi մանրամասն գրանցամատյանները" + "Wi‑Fi-ի որոնման սահմանափակում" "Բջջային ինտերնետը միշտ ակտիվ է" "Սարքակազմի արագացման միացում" "Ցուցադրել Bluetooth սարքերն առանց անունների" @@ -246,6 +247,7 @@ "Չհաջողվեց միանալ" "Ցույց տալ անլար էկրանների հավաստագրման ընտրանքները" "Բարձրացնել մակարդակը, Wi‑Fi ընտրիչում ամեն մի SSID-ի համար ցույց տալ RSSI" + "Նվազեցնում է մարտկոցի սպառումը և լավացնում ցանցի աշխատանքը" "Վճարովի թրաֆիկ" "Անսահմանափակ թրաֆիկ" "Մատյանի բուֆերի չափերը" diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 1b8304ed928d..0684b3d292a5 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -159,7 +159,7 @@ "Tinggi nada" "Memengaruhi nada ucapan yang disintesis" "Bahasa" - "Menggunakan bahasa sistem" + "Gunakan bahasa sistem" "Bahasa tidak dipilih" "Menyetel suara spesifik bahasa untuk teks lisan" "Dengarkan contoh" @@ -220,6 +220,7 @@ "Jaringan" "Sertifikasi layar nirkabel" "Aktifkan Pencatatan Log Panjang Wi-Fi" + "Pembatasan pemindaian Wi‑Fi" "Kuota selalu aktif" "Akselerasi hardware tethering" "Tampilkan perangkat Bluetooth tanpa nama" @@ -246,6 +247,7 @@ "Tidak dapat terhubung" "Tampilkan opsi untuk sertifikasi layar nirkabel" "Tingkatkan level pencatatan log Wi-Fi, tampilkan per SSID RSSI di Pemilih Wi‑Fi" + "Memperlambat kehabisan baterai & meningkatkan performa jaringan" "Berbayar" "Tidak berbayar" "Ukuran buffer pencatat log" diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml index 8333a59b277e..11d69571aeeb 100644 --- a/packages/SettingsLib/res/values-is/strings.xml +++ b/packages/SettingsLib/res/values-is/strings.xml @@ -220,6 +220,7 @@ "Netkerfi" "Vottun þráðlausra skjáa" "Kveikja á ítarlegri skráningu Wi-Fi" + "Hægja á Wi‑Fi leit" "Alltaf kveikt á farsímagögnum" "Vélbúnaðarhröðun fyrir tjóðrun" "Sýna Bluetooth-tæki án heita" @@ -246,6 +247,7 @@ "Tenging mistókst" "Sýna valkosti fyrir vottun þráðlausra skjáa" "Auka skráningarstig Wi-Fi, sýna RSSI fyrir hvert SSID í Wi-Fi vali" + "Dregur úr rafhlöðunotkun og eykur netafköst" "Mæld notkun" "Notkun ekki mæld" "Annálsritastærðir biðminna" diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index e1e06d297847..c5176b02a31a 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -83,7 +83,7 @@ "Telefonate" "Trasferimento file" "Dispositivo di input" - "Accesso Internet" + "Accesso a Internet" "Condivisione contatti" "Usa per condivisione contatti" "Condivisione connessione Internet" @@ -220,6 +220,7 @@ "Reti" "Certificazione display wireless" "Attiva logging dettagliato Wi-Fi" + "Limitazione della ricerca di reti Wi‑Fi" "Dati mobili sempre attivi" "Tethering accelerazione hardware" "Mostra dispositivi Bluetooth senza nome" @@ -246,6 +247,7 @@ "Impossibile collegarsi" "Mostra opzioni per la certificazione display wireless" "Aumenta livello di logging Wi-Fi, mostra SSID RSSI nel selettore Wi-Fi" + "Riduce il consumo della batteria e migliora le prestazioni della rete" "A consumo" "Non a consumo" "Dimensioni buffer logger" diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 9352479711d9..ead0bfb3fe7b 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -220,6 +220,7 @@ "תקשורת רשתות" "‏אישור של תצוגת WiFi" "‏הפעלת רישום מפורט של Wi‑Fi ביומן" + "‏ויסות סריקה לנקודות Wi-Fi" "חבילת הגלישה פעילה תמיד" "שיפור מהירות באמצעות חומרה לצורך שיתוף אינטרנט בין ניידים" "‏הצגת מכשירי Bluetooth ללא שמות" @@ -246,6 +247,7 @@ "לא ניתן היה להתחבר" "‏הצג אפשרויות עבור אישור של תצוגת WiFi" "‏העלה את רמת הרישום של Wi‑Fi ביומן, הצג לכל SSID RSSI ב-Wi‑Fi Picker" + "מפחית את קצב התרוקנות הסוללה ומשפר את ביצועי הרשת" "נמדדת" "לא נמדדת" "גדלי מאגר של יומן רישום" @@ -407,7 +409,7 @@ "בטעינה" "לא בטעינה" "המכשיר מחובר, אבל לא ניתן לטעון עכשיו" - "מלא" + "מלאה" "נמצא בשליטת מנהל מערכת" "מושבת" "מורשה" diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index b032aad4f5e8..e5d29bff8b65 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -220,6 +220,7 @@ "ネットワーク" "ワイヤレスディスプレイ認証" "Wi-Fi詳細ログの有効化" + "Wi‑Fi スキャン スロットリング" "モバイルデータを常に ON にする" "テザリング時のハードウェア アクセラレーション" "Bluetooth デバイスを名前なしで表示" @@ -246,6 +247,7 @@ "接続できませんでした" "ワイヤレスディスプレイ認証のオプションを表示" "Wi-Fiログレベルを上げて、Wi-Fi選択ツールでSSID RSSIごとに表示します" + "電池の消耗が軽減され、ネットワーク パフォーマンスが改善されます" "従量制" "定額制" "ログバッファのサイズ" diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index 2c1d7c05ccb4..8b9b6b653c6c 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -220,6 +220,7 @@ "ქსელი" "უსადენო ეკრანის სერტიფიცირება" "Wi‑Fi-ს დაწვრილებითი აღრიცხვის ჩართვა" + "Wi‑Fi სკანირების რეგულირება" "მობილური ინტერნეტის ყოველთვის გააქტიურება" "ტეტერინგის აპარატურული აჩქარება" "Bluetooth-მოწყობილობების ჩვენება სახელების გარეშე" @@ -246,6 +247,7 @@ "დაკავშირება ვერ მოხერხდა" "უსადენო ეკრანის სერტიფიცირების ვარიანტების ჩვენება" "Wi‑Fi-ს აღრიცხვის დონის გაზრდა, Wi‑Fi ამომრჩეველში ყოველ SSID RSSI-ზე ჩვენება" + "ამცირებს ბატარეის ხარჯვას და აუმჯობესებს ქსელის მუშაობას" "ლიმიტირებული" "არალიმიტირებული" "ჟურნალიზაციის ბუფერის ზომები" diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 5ae201e4bd91..1e572972a78f 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -220,6 +220,7 @@ "Желі орнату" "Сымсыз дисплей сертификаты" "Wi‑Fi егжей-тегжейлі журналы" + "Wi‑Fi іздеуін шектеу" "Мобильдік деректер әрқашан қосулы" "Тетеринг режиміндегі аппараттық жеделдету" "Bluetooth құрылғыларын атаусыз көрсету" @@ -246,6 +247,7 @@ "Қосылмады" "Сымсыз дисплей сертификаты опцияларын көрсету" "Wi‑Fi тіркеу деңгейін арттыру, Wi‑Fi таңдағанда әр SSID RSSI бойынша көрсету" + "Батарея зарядының шығынын азайтады және желі жұмысын жақсартады." "Трафик саналады" "Трафик саналмайды" "Журналға тіркеуші буферінің өлшемдері" diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index ed00b680bbe4..fb09c2f494a0 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -220,6 +220,7 @@ "ការភ្ជាប់បណ្ដាញ" "សេចក្តីបញ្ជាក់ការបង្ហាញ​ឥត​ខ្សែ" "បើក​កំណត់ហេតុ​រៀបរាប់​ Wi-Fi" + "ការពន្យឺតការស្កេន Wi‑Fi" "ទិន្នន័យទូរសព្ទចល័តដំណើរការជានិច្ច" "ការ​បង្កើនល្បឿន​ផ្នែករឹងសម្រាប់​ការភ្ជាប់" "បង្ហាញ​ឧបករណ៍​ប្ល៊ូធូស​គ្មានឈ្មោះ" @@ -246,6 +247,7 @@ "មិន​អាចភ្ជាប់​បានទេ" "បង្ហាញ​ជម្រើស​សម្រាប់​សេចក្តីបញ្ជាក់ការបង្ហាញ​ឥត​ខ្សែ" "បង្កើនកម្រិតកំណត់ហេតុ Wi-Fi បង្ហាញក្នុង SSID RSSI ក្នុងកម្មវិធីជ្រើសរើស Wi-Fi" + "កាត់បន្ថយ​ការប្រើប្រាស់ថ្ម និងកែលម្អប្រតិបត្តិការ​បណ្ដាញ" "មានការកំណត់" "មិនមានការកំណត់" "ទំហំកន្លែងផ្ទុករបស់ logger" diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 59adfb771d5a..97eed0fb40a4 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -220,6 +220,7 @@ "ನೆಟ್‌ವರ್ಕಿಂಗ್" "ವೈರ್‌ಲೆಸ್ ಪ್ರದರ್ಶನ ಪ್ರಮಾಣೀಕರಣ" "Wi‑Fi ವೆರ್ಬೋಸ್ ಲಾಗಿಂಗ್ ಸಕ್ರಿಯಗೊಳಿಸಿ" + "ವೈ-ಫೈ ಸ್ಕ್ಯಾನ್ ನಿರ್ಬಂಧಿಸಲಾಗುತ್ತಿದೆ" "ಮೊಬೈಲ್ ಡೇಟಾ ಯಾವಾಗಲೂ ಸಕ್ರಿಯ" "ಟೆಥರಿಂಗ್‍‍ಗಾಗಿ ಹಾರ್ಡ್‍ವೇರ್ ವೇಗವರ್ಧನೆ" "ಹೆಸರುಗಳಿಲ್ಲದ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳನ್ನು ತೋರಿಸಿ" @@ -246,6 +247,7 @@ "ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ" "ವೈರ್‌ಲೆಸ್‌‌‌ ಪ್ರದರ್ಶನ ಪ್ರಮಾಣೀಕರಣಕ್ಕಾಗಿ ಆಯ್ಕೆಗಳನ್ನು ತೋರಿಸು" "Wi‑Fi ಲಾಗಿಂಗ್ ಮಟ್ಟನ್ನು ಹೆಚ್ಚಿಸಿ, Wi‑Fi ಆಯ್ಕೆಯಲ್ಲಿ ಪ್ರತಿಯೊಂದು SSID RSSI ತೋರಿಸಿ" + "ಬ್ಯಾಟರಿ ಹೆಚ್ಚು ಬಾಳಿಕೆ ಬರುವಂತೆ ಮಾಡುತ್ತದೆ ಮತ್ತು ನೆಟ್‌ವರ್ಕ್‌ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಸುಧಾರಿಸುತ್ತದೆ" "ಮೀಟರ್ ಮಾಡಲಾಗಿದೆ" "ಮೀಟರ್ ಮಾಡಲಾಗಿಲ್ಲ" "ಲಾಗರ್ ಬಫರ್ ಗಾತ್ರಗಳು" diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 0ac0848f2a5b..abdfa041ada8 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -156,7 +156,7 @@ "TTS 출력" "말하는 속도" "텍스트를 읽어주는 속도" - "피치" + "음조" "합성 음성의 어조에 영향을 미침" "언어" "시스템 언어 사용" @@ -200,7 +200,7 @@ "이 사용자는 개발자 옵션을 사용할 수 없습니다." "이 사용자는 VPN 설정을 수정할 수 없습니다." "이 사용자는 테더링 설정을 수정할 수 없습니다." - "이 사용자는 액세스포인트 네임(APN) 설정을 수정할 수 없습니다." + "이 사용자는 액세스 포인트 이름(APN) 설정을 수정할 수 없습니다." "USB 디버깅" "USB가 연결된 경우 디버그 모드 사용" "USB 디버깅 권한 승인 취소" @@ -220,6 +220,7 @@ "네트워크" "무선 디스플레이 인증서" "Wi-Fi 상세 로깅 사용" + "Wi‑Fi 검색 제한" "항상 모바일 데이터 활성화" "테더링 하드웨어 가속" "이름이 없는 블루투스 기기 표시" @@ -246,6 +247,7 @@ "연결할 수 없음" "무선 디스플레이 인증서 옵션 표시" "Wi‑Fi 로깅 수준을 높이고, Wi‑Fi 선택도구에서 SSID RSSI당 값을 표시" + "배터리 소모를 줄이고 네트워크 성능을 개선합니다." "종량제 네트워크" "무제한 네트워크" "로거 버퍼 크기" diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index 4991ddbcaff2..435ce5357b60 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -142,10 +142,10 @@ "Өчүрүлгөн колдонмолор жана колдонуучулар" "Тутум жаңыртуулары" "USB модем" - "Ташыма кошулуу чекити" + "Wi-Fi байланыш түйүнү" "Bluetooth модем" "Жалгаштыруу" - "Жалгаштыруу жана ташыма чекит" + "Модем режими" "Жумуш профилинин колднмлр" "Конок" "Белгисиз" @@ -220,6 +220,7 @@ "Тармактар" "Зымсыз мониторлорду тастыктамалоо" "Wi‑Fi дайын-даректүү журналы" + "Wi‑Fi тармактарын издөөнү жөнгө салуу" "Мобилдик Интернет иштей берет" "Модем режиминде аппараттын иштешин тездетүү" "Аталышсыз Bluetooth түзмөктөрү көрсөтүлсүн" @@ -246,6 +247,7 @@ "Туташпай койду" "Зымсыз мониторлорду тастыктамалоо параметрлери көрүнүп турат" "Wi-Fi тандалганда ар бир SSID үчүн RSSI көрүнүп турат" + "Батареянын коротулушун чектеп, тармактын иштешин жакшыртат" "Трафик ченелет" "Чектелбеген тармак" "Журнал буферинин өлчөмү" diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index 59ad7ccd3817..ed88bc53890b 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -220,6 +220,7 @@ "ການ​ສ້າງເຄືອຂ່າຍ" "ສະແດງການຮັບຮອງຂອງລະບົບໄຮ້ສາຍ" "​ເປີດ​ນຳ​ໃຊ້ການ​ເກັບ​ປະ​ຫວັດ​ Verbose Wi‑Fi" + "ການຈຳກັດການສະແກນ Wi‑Fi" "ເປີດໃຊ້ອິນເຕີເນັດມືຖືຕະຫຼອດເວລາ" "ເປີດໃຊ້ການເລັ່ງຄວາມໄວດ້ວຍຮາດແວ" "ສະແດງອຸປະກອນ Bluetooth ທີ່ບໍ່ມີຊື່" @@ -246,6 +247,7 @@ "ບໍ່ສາມາດເຊື່ອມຕໍ່ໄດ້" "ສະແດງໂຕເລືອກສຳລັບການສະແດງການຮັບຮອງລະບົບໄຮ້ສາຍ" "ເພີ່ມ​ລະ​ດັບ​ການ​ເກັບ​ປະ​ຫວັດ Wi‑Fi, ສະ​ແດງ​ຕໍ່ SSID RSSI ​ໃນ​ Wi‑Fi Picker" + "ຫຼຸດການໃຊ້ແບັດເຕີຣີ ແລະ ປັບປຸງປະສິດທິພາບເຄືອຂ່າຍ" "ມີການວັດແທກ" "ບໍ່ໄດ້ວັດແທກ" "ຂະໜາດບັບເຟີຕົວບັນທຶກ" diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index bde71e304263..c10bd002eae7 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -220,6 +220,7 @@ "Tinklai" "Belaidžio rodymo sertifikavimas" "Įgal. „Wi‑Fi“ daugiaž. įraš. į žurnalą" + "„Wi‑Fi“ nuskaitymo ribojimas" "Mobiliojo ryšio duomenys visada suaktyvinti" "Įrenginio kaip modemo naudojimo aparatinės įrangos spartinimas" "Rodyti „Bluetooth“ įrenginius be pavadinimų" @@ -246,6 +247,7 @@ "Prisijungti nepavyko" "Rodyti belaidžio rodymo sertifikavimo parinktis" "Padidinti „Wi‑Fi“ įrašymo į žurnalą lygį, rodyti SSID RSSI „Wi-Fi“ rinkiklyje" + "Sumažinamas akumuliatoriaus eikvojimas ir patobulinamas tinklo našumas" "Matuojamas" "Neišmatuotas" "Registruotuvo buferio dydžiai" diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index 5a1805a4a8df..8feb5ab43ee4 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -220,6 +220,7 @@ "Tīklošana" "Bezvadu attēlošanas sertifikācija" "Iespējot Wi‑Fi detalizēto reģistrēšanu" + "Wi‑Fi meklēšanas ierobežošana" "Vienmēr aktīvs mobilo datu savienojums" "Paātrināta aparatūras darbība piesaistei" "Rādīt Bluetooth ierīces bez nosaukumiem" @@ -246,6 +247,7 @@ "Nevarēja izveidot savienojumu." "Rādīt bezvadu attēlošanas sertifikācijas iespējas" "Palieliniet Wi‑Fi reģistrēšanas līmeni; rādīt katram SSID RSSI Wi‑Fi atlasītājā." + "Samazina akumulatora izlādi un uzlabo tīkla veiktspēju" "Maksas" "Bezmaksas" "Reģistrētāja buferu lielumi" diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index 5be177defda1..8bed22f1e763 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -220,6 +220,7 @@ "Вмрежување" "Приказ на сертификација на безжична мрежа" "Овозможи преопширно пријавување Wi‑Fi" + "Регулирање на скенирањето за Wi‑Fi" "Мобилниот интернет е секогаш активен" "Хардверско забрзување за врзување" "Прикажувај уреди со Bluetooth без имиња" @@ -246,6 +247,7 @@ "Не може да се поврзе" "Покажи ги опциите за безжичен приказ на сертификат" "Зголеми Wi‑Fi ниво на пријавување, прикажи по SSID RSSI во Wi‑Fi бирач" + "Го намалува искористувањето на батеријата и ја подобрува изведбата на мрежата" "Со ограничен интернет" "Без ограничен интернет" "Величини на меѓумеморија за дневникот" diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml index d3ebd992a4b7..7016b7f1a6e8 100644 --- a/packages/SettingsLib/res/values-ml/strings.xml +++ b/packages/SettingsLib/res/values-ml/strings.xml @@ -220,6 +220,7 @@ "നെറ്റ്‍വര്‍ക്കിംഗ്" "വയർലെസ് ഡിസ്‌പ്ലേ സർട്ടിഫിക്കേഷൻ" "വൈഫൈ വെർബോസ് ലോഗിംഗ് പ്രവർത്തനക്ഷമമാക്കുക" + "വൈഫൈ സ്‌കാൻ പ്രവർത്തനരഹിതമാക്കുന്നു" "മൊബൈൽ ഡാറ്റ എല്ലായ്‌പ്പോഴും സജീവം" "ടെതറിംഗ് ഹാർഡ്‌വെയർ ത്വരിതപ്പെടുത്തൽ" "പേരില്ലാത്ത Bluetooth ഉപകരണങ്ങൾ കാണിക്കുക" @@ -246,6 +247,7 @@ "കണക്റ്റ് ചെയ്യാനായില്ല" "വയർലെസ് ഡിസ്‌പ്ലേ സർട്ടിഫിക്കേഷനായി ഓപ്‌ഷനുകൾ ദൃശ്യമാക്കുക" "വൈഫൈ പിക്കറിൽ ഓരോ SSID RSSI പ്രകാരം കാണിക്കാൻ വൈഫൈ ലോഗിംഗ് നില വർദ്ധിപ്പിക്കുക" + "ബാറ്ററി ചാർജ് വേഗത്തിൽ തീരുന്ന അവസ്ഥ കുറച്ച് നെറ്റ്‌വർക്ക് പ്രകടനം മെച്ചപ്പെടുത്തുന്നു" "മീറ്റർചെയ്ത" "മീറ്റർമാപകമല്ലാത്തത്" "ലോഗർ ബഫർ വലുപ്പം" diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 46029c7f998f..80e78a364db1 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -220,6 +220,7 @@ "Сүлжээ" "Утасгүй дэлгэцийн сертификат" "Wi‑Fi дэлгэрэнгүй лог-г идэвхжүүлэх" + "Wi‑Fi скан бууруулалт" "Мобайл дата байнга идэвхтэй" "Модем болгох техник хангамжийн хурдасгуур" "Нэргүй Bluetooth төхөөрөмжийг харуулах" @@ -246,6 +247,7 @@ "Холбогдож чадсангүй" "Утасгүй дэлгэцийн сертификатын сонголтыг харуулах" "Wi‑Fi лог-н түвшинг нэмэгдүүлэх, Wi‑Fi Сонгогч дээрх SSID-д ногдох RSSI-г харуулах" + "Батарей зарцуулалтыг бууруулж, сүлжээний гүйцэтгэлийг сайжруулдаг" "Хязгаартай" "Хязгааргүй" "Логгерын буферын хэмжээ" diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index 5f6acf10df0e..367b13d4ce09 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -78,7 +78,7 @@ "अॅक्टिव्ह, L: %1$s बॅटरी, R: %2$s बॅटरी" "%1$s बॅटरी" "L: %1$s बॅटरी, R: %2$s बॅटरी" - "अॅक्टिव्ह" + "अ‍ॅक्टिव्ह" "मीडिया ऑडिओ" "फोन कॉल" "फाइल स्थानांतरण" @@ -220,6 +220,7 @@ "नेटवर्किंग" "वायरलेस डिस्प्ले प्रमाणीकरण" "वाय-फाय व्हर्बोझ लॉगिंग सुरू करा" + "वाय-फाय स्कॅन थ्रॉटलिंग" "मोबाइल डेटा नेहमी सक्रिय" "टेदरिंग हार्डवेअर प्रवेग" "नावांशिवाय ब्‍लूटूथ डिव्‍हाइस दाखवा" @@ -246,6 +247,7 @@ "कनेक्ट करू शकलो नाही" "वायरलेस डिस्प्ले प्रमाणिकरणाचे पर्याय दाखवा" "वाय-फाय लॉगिंग स्‍तर वाढवा, वाय-फाय सिलेक्टरमध्‍ये प्रति SSID RSSI दर्शवा" + "बॅटरी जलदरीतीने संपण्यापासून रोखते आणि नेटवर्क परफॉर्मन्समध्ये सुधारणा करते" "मीटरने मोजलेले" "मीटरने न मोजलेले" "लॉगर बफर आकार" diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index 03ff0bbcb98a..3841a3b3f6b5 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -220,6 +220,7 @@ "Perangkaian" "Pensijilan paparan wayarles" "Dayakan Pengelogan Berjela-jela Wi-Fi" + "Pendikitan pengimbasan Wi-Fi" "Data mudah alih sentiasa aktif" "Pecutan perkakasan penambatan" "Tunjukkan peranti Bluetooth tanpa nama" @@ -246,6 +247,7 @@ "Tidak dapat menyambung" "Tunjukkan pilihan untuk pensijilan paparan wayarles" "Tingkatkan tahap pengelogan Wi-Fi, tunjuk setiap SSID RSSI dalam Pemilih Wi-Fi" + "Mengurangkan penyusutan bateri & meningkatkan prestasi rangkaian" "Bermeter" "Tidak bermeter" "Saiz penimbal pengelog" diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index 4500209ecd85..38f128a8cb46 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -21,7 +21,7 @@ "ကွန်ယက်များကို စကင်မလုပ်နိုင်ပါ" - "တစ်ခုမျှ မဟုတ်ပါ" + "မရှိ" "သိမ်းဆည်းပြီး" "ချိတ်ဆက်မထားပါ" "ပိတ်ထားသည်" @@ -35,7 +35,7 @@ "စက်ကွင်းထဲတွင် မဟုတ်ပါ" "အလိုအလျောက်ချိတ်ဆက်မည်မဟုတ်ပါ" "အင်တာနက် ချိတ်ဆက်မှု မရှိပါ" - "%1$s မှသိမ်းဆည်းခဲ့သည်" + "%1$s က သိမ်းဆည်းခဲ့သည်" "%1$s မှတစ်ဆင့် အလိုအလျောက် ချိတ်ဆက်ထားပါသည်" "ကွန်ရက်အဆင့်သတ်မှတ်ပေးသူ မှတစ်ဆင့် အလိုအလျောက် ချိတ်ဆက်ထားပါသည်" "%1$s မှတစ်ဆင့် ချိတ်ဆက်ထားသည်" @@ -148,12 +148,12 @@ "တဆင့်ချိတ်ဆက်ခြင်း၊ ဟော့စပေါ့" "အလုပ်သုံးအက်ပ်များအားလုံး" "ဧည့်သည်" - "မသိပါ" + "မသိ" "အသုံးပြုသူ- %1$s" "မူရင်းအချို့ သတ်မှတ်ပြီး" "ပုံမှန်သတ်မှတ်ထားခြင်းမရှိ" "စာသားမှစကားပြောပြောင်း ဆက်တင်များ" - "စာသားမှ အသံထွက်စေခြင်း" + "စာသားမှ စကားပြောသို့ အထွက်" "စကားပြောနှုန်း" "စာတမ်းအားပြောဆိုသော အမြန်နှုန်း" "အသံအနိမ့်အမြင့်" @@ -220,6 +220,7 @@ "ချိတ်ဆက်ဆောင်ရွက်ခြင်း" "ကြိုးမဲ့ပြသမှု အသိအမှတ်ပြုလက်မှတ်" "Wi‑Fi Verbose မှတ်တမ်းတင်ခြင်းအား ဖွင့်မည်" + "Wi‑Fi ရှာဖွေခြင်း ထိန်းချုပ်မှု" "မိုဘိုင်းဒေတာကို အမြဲဖွင့်ထားရန်" "ဖုန်းကို မိုဒမ်အဖြစ်အသုံးပြုမှု စက်ပစ္စည်းဖြင့် အရှိန်မြှင့်တင်ခြင်း" "အမည်မရှိသော ဘလူးတုသ်စက်ပစ္စည်းများကို ပြသရန်" @@ -246,6 +247,7 @@ "ချိတ်ဆက်၍ မရပါ" "ကြိုးမဲ့ အခင်းအကျင်း အသိအမှတ်ပြုလက်မှတ်အတွက် ရွေးချယ်စရာများပြရန်" "Wi‑Fi မှတ်တမ်းတင်ခြင်း နှုန်းအားမြင့်ကာ၊ Wi‑Fi ရွေးရာတွင် SSID RSSI ဖြင့်ပြပါ" + "ဘက်ထရီ အသုံးပြုမှုကို လျှော့ကျစေပြီး ကွန်ရက်စွမ်းဆောင်ရည်ကို ပိုမိုကောင်းမွန်စေသည်" "အခမဲ့ မဟုတ်ပါ" "အခမဲ့" "မှတ်တမ်းကြားခံနယ် အရွယ်အစားများ" @@ -402,7 +404,7 @@ "%1$s - %2$s" "အားပြည့်ရန် %1$s လိုပါသည်" "%1$s − အားပြည့်ရန် %2$s ကျန်သည်" - "မသိပါ" + "မသိ" "အားသွင်းနေပါသည်" "အားသွင်းနေပါသည်" "အားသွင်းမနေပါ" diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index abb3410df2a2..144d4c249dac 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -220,6 +220,7 @@ "Nettverk" "Trådløs skjermsertifisering" "Slå på detaljert Wi-Fi-loggføring" + "Begrensning av Wi‑Fi-skanning" "Mobildata er alltid aktiv" "Maskinvareakselerasjon for internettdeling" "Vis Bluetooth-enheter uten navn" @@ -246,6 +247,7 @@ "Kunne ikke koble til" "Vis alternativer for sertifisering av trådløs skjerm" "Øk Wi-Fi-loggenivå – vis per SSID RSSI i Wi-Fi-velgeren" + "Reduserer batteriforbruket og forbedrer nettverksytelsen" "Med datamåling" "Uten datamåling" "Bufferstørrelser for logg" diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index 7d71fdc3c8eb..fd45cb0a1f3c 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -220,6 +220,7 @@ "नेटवर्किङ" "ताररहित प्रदर्शन प्रमाणीकरण" "Wi-Fi वर्बोज लग सक्षम पार्नुहोस्" + "Wi‑Fi स्क्यान थ्रोटलिङ" "मोबाइल डेटा सधैँ सक्रिय राख्नुहोस्" "टेदरिङको लागि हार्डवेयरको प्रवेग" "नामकरण नगरिएका ब्लुटुथ यन्त्रहरू देखाउनुहोस्" @@ -246,6 +247,7 @@ "जडान गर्न सकिएन" "ताररहित प्रदर्शन प्रमाणीकरणका लागि विकल्पहरू देखाउनुहोस्" "Wi-Fi लग स्तर बढाउनुहोस्, Wi-Fi चयनकर्तामा प्रति SSID RSSI देखाइन्छ" + "ब्याट्रीको खपत कम गरी नेटवर्कको कार्यसम्पादनमा सुधार गर्दछ" "मिटर गरिएको जडान भनी चिन्ह लगाइएको" "मिटर नगरिएको" "लगर बफर आकारहरू" diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index d8154acc2ba1..c50b43a04724 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -37,7 +37,7 @@ "Geen internettoegang" "Opgeslagen door \'%1$s\'" "Automatisch verbonden via %1$s" - "Automatisch verbonden via provider van netwerkbeoordelingen" + "Automatisch verbonden via netwerkbeoordelaar" "Verbonden via %1$s" "Verbonden via %1$s" "Beschikbaar via %1$s" @@ -220,6 +220,7 @@ "Netwerken" "Certificering van draadloze weergave" "Uitgebreide wifi-logregistratie insch." + "Wifi-scannen beperken" "Mobiele data altijd actief" "Hardwareversnelling voor tethering" "Bluetooth-apparaten zonder namen weergeven" @@ -246,6 +247,7 @@ "Kan geen verbinding maken" "Opties weergeven voor certificering van draadloze weergave" "Logniveau voor wifi verhogen, weergeven per SSID RSSI in wifi-kiezer" + "Verlaagt het batterijverbruik en verbetert de netwerkprestaties" "Met datalimiet" "Gratis" "Logger-buffergrootten" diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index 0ca4e3ed7d3e..648cc4a99b4e 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -220,6 +220,7 @@ "ନେଟ୍‌ୱର୍କିଙ୍ଗ" "ୱାୟରଲେସ୍‌ ଡିସ୍‌ପ୍ଲେ ସାର୍ଟିଫିକେସନ୍" "ୱାଇ-ଫାଇ ଭର୍ବୋସ୍‌ ଲଗିଙ୍ଗ ସକ୍ଷମ କରନ୍ତୁ" + "ୱାଇ-ଫାଇ ସ୍କାନ୍ ନିୟନ୍ତ୍ରଣ" "ମୋବାଇଲ୍‌ ଡାଟା ସର୍ବଦା ସକ୍ରିୟ" "ଟିଥରିଙ୍ଗ ହାର୍ଡୱେର ଆକ୍ସିଲିରେସନ୍" "ବ୍ଲୁଟୂଥ୍‍‌ ଡିଭାଇସ୍‌ଗୁଡ଼ିକୁ ନାମ ବିନା ଦେଖନ୍ତୁ" @@ -246,6 +247,7 @@ "କନେକ୍ଟ କରିହେଲା ନାହିଁ" "ୱେୟାରଲେସ୍‌ ଡିସ୍‌ପ୍ଲେ ସାର୍ଟିଫିକେସନ୍ ପାଇଁ ବିକଳ୍ପ ଦେଖାନ୍ତୁ" "ୱାଇ-ଫାଇ ଲଗିଙ୍ଗ ସ୍ତର ବଢ଼ାନ୍ତୁ, ୱାଇ-ଫାଇ ପିକର୍‌ରେ ପ୍ରତି SSID RSSI ଦେଖାନ୍ତୁ" + "ବ୍ୟାଟେରୀ ଖର୍ଚ୍ଚ କମ୍ ଏବଂ ନେଟ୍‌ୱାର୍କ ପ୍ରଦର୍ଶନ ଉନ୍ନତ କରିଥାଏ" "ମପାଯାଉଥିବା" "ମପାଯାଉନଥିବା" "ଲଗର୍‌ ବଫର୍‌ ସାଇଜ୍" @@ -460,7 +462,7 @@ "%1$s ବେଳେ" "ଅବଧି" "ପ୍ରତ୍ୟେକ ଥର ପଚାରନ୍ତୁ" - "ଆପଣ ବନ୍ଦ ନକରିବା ପର୍ଯ୍ୟନ୍ତ DND ଅନ୍‌ ରହିବ" + "ଆପଣ ବନ୍ଦ ନକରିବା ପର୍ଯ୍ୟନ୍ତ" "ଏହିକ୍ଷଣି" "ଏହି ଡିଭାଇସ୍‍" diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index 6fff4d8633d6..7967c71669c2 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -220,6 +220,7 @@ "ਨੈੱਟਵਰਕਿੰਗ" "ਵਾਇਰਲੈੱਸ ਡਿਸਪਲੇ ਪ੍ਰਮਾਣੀਕਰਨ" "ਵਾਈ-ਫਾਈ ਵਰਬੋਸ ਲੌਗਿੰਗ ਚਾਲੂ ਕਰੋ" + "ਸੀਮਤ ਵਾਈ‑ਫਾਈ ਸਕੈਨ" "ਮੋਬਾਈਲ ਡਾਟਾ ਹਮੇਸ਼ਾਂ ਕਿਰਿਆਸ਼ੀਲ" "ਟੈਦਰਿੰਗ ਹਾਰਡਵੇਅਰ ਐਕਸੈੱਲਰੇਸ਼ਨ" "ਅਨਾਮ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਦਿਖਾਓ" @@ -246,6 +247,7 @@ "ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ" "ਵਾਇਰਲੈੱਸ ਡਿਸਪਲੇ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚੋਣਾਂ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ" "ਵਾਈ‑ਫਾਈ ਲੌਗਿੰਗ ਪੱਧਰ ਵਧਾਓ, ਵਾਈ‑ਫਾਈ Picker ਵਿੱਚ ਪ੍ਰਤੀ SSID RSSI ਦਿਖਾਓ" + "ਬੈਟਰੀ ਦੀ ਵਰਤੋਂ ਘਟਾ ਕੇ ਨੈੱਟਵਰਕ ਕਾਰਗੁਜ਼ਾਰੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਂਦਾ ਹੈ" "ਮੀਟਰਬੱਧ ਕੀਤਾ ਗਿਆ" "ਗੈਰ-ਮੀਟਰਬੱਧ ਕੀਤਾ ਗਿਆ" "ਲੌਗਰ ਬਫ਼ਰ ਆਕਾਰ" diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index bed4d634351c..60a4c53c6a62 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -220,6 +220,7 @@ "Sieci" "Wyświetlacz bezprzewodowy" "Szczegółowy dziennik Wi-Fi" + "Ograniczanie skanowania Wi-Fi" "Mobilna transmisja danych zawsze aktywna" "Akceleracja sprzętowa tetheringu" "Pokaż urządzenia Bluetooth bez nazw" @@ -246,6 +247,7 @@ "Nie udało się połączyć" "Pokaż opcje certyfikacji wyświetlacza bezprzewodowego" "Zwiększ poziom rejestrowania Wi‑Fi, pokazuj według RSSI SSID w selektorze Wi‑Fi" + "Zmniejsza zużycie baterii i zwiększa wydajność sieci" "Użycie danych jest mierzone" "Użycie danych nie jest mierzone" "Rozmiary bufora rejestratora" diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index 134871575841..dd0a75bbbc62 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -23,7 +23,7 @@ "Não é possível verificar a existência de redes" "Nenhuma" "Salva" - "Desconectado" + "Desconectada" "Desativado" "Falha de configuração de IP" "Não conectado devido à baixa qualidade da rede" @@ -220,6 +220,7 @@ "Redes" "Certificação de Display sem fio" "Ativar registro detalhado de Wi-Fi" + "Limitar busca por Wi-Fi" "Dados móveis sempre ativos" "Aceleração de hardware de tethering" "Mostrar dispositivos Bluetooth sem nomes" @@ -246,6 +247,7 @@ "Não foi possível conectar" "Mostrar opções de certificação de Display sem fio" "Aumentar o nível de registro de Wi-Fi; mostrar conforme o RSSI do SSID no seletor de Wi-Fi" + "Reduz o consumo de bateria e melhora o desempenho da rede" "Limitada" "Ilimitada" "Tamanhos de buffer de logger" diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 3b0b86c33b5c..501cf5049f09 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -220,6 +220,7 @@ "Redes" "Certificação de display sem fios" "Ativar o registo verboso de Wi-Fi" + "Controlo da procura de Wi‑Fi" "Dados móveis sempre ativos" "Aceleração de hardware para ligação (à Internet) via telemóvel" "Mostrar dispositivos Bluetooth sem nomes" @@ -246,6 +247,7 @@ "Não foi possível estabelecer ligação" "Mostrar opções da certificação de display sem fios" "Aumentar o nível de reg. de Wi-Fi, mostrar por RSSI de SSID no Selec. de Wi-Fi" + "Reduz o consumo rápido da bateria e melhora o desempenho da rede" "Acesso limitado" "Acesso ilimitado" "Tamanhos da memória intermédia do registo" diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index 134871575841..dd0a75bbbc62 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -23,7 +23,7 @@ "Não é possível verificar a existência de redes" "Nenhuma" "Salva" - "Desconectado" + "Desconectada" "Desativado" "Falha de configuração de IP" "Não conectado devido à baixa qualidade da rede" @@ -220,6 +220,7 @@ "Redes" "Certificação de Display sem fio" "Ativar registro detalhado de Wi-Fi" + "Limitar busca por Wi-Fi" "Dados móveis sempre ativos" "Aceleração de hardware de tethering" "Mostrar dispositivos Bluetooth sem nomes" @@ -246,6 +247,7 @@ "Não foi possível conectar" "Mostrar opções de certificação de Display sem fio" "Aumentar o nível de registro de Wi-Fi; mostrar conforme o RSSI do SSID no seletor de Wi-Fi" + "Reduz o consumo de bateria e melhora o desempenho da rede" "Limitada" "Ilimitada" "Tamanhos de buffer de logger" diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 1cbd70bf760a..fb020e219cd1 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -83,7 +83,7 @@ "Apeluri telefonice" "Transfer de fișiere" "Dispozitiv de intrare" - "Acces internet" + "Acces la internet" "Acces la Agendă" "Utilizați pentru a permite accesul la Agendă" "Distribuirea conexiunii la internet" @@ -220,6 +220,7 @@ "Conectare la rețele" "Certificare Ecran wireless" "Înregistrare prin Wi-Fi de volume mari de date" + "Limitare căutare de rețele Wi-Fi" "Date mobile permanent active" "Accelerare hardware pentru tethering" "Afișați dispozitivele Bluetooth fără nume" @@ -246,6 +247,7 @@ "Nu s-a putut conecta" "Afișați opțiunile pentru certificarea Ecran wireless" "Măriți niv. de înr. prin Wi‑Fi, afișați în fcț. de SSID RSSI în Selectorul Wi‑Fi" + "Reduce descărcarea bateriei și îmbunătățește performanța rețelei" "Contorizată" "Necontorizată" "Dimensiunile memoriei temporare a jurnalului" diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index 657e6a90111a..db43c7562dbc 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -220,6 +220,7 @@ "Сети" "Серт. беспроводн. мониторов" "Подробный журнал Wi‑Fi" + "Регулирование поиска сетей Wi‑Fi" "Не отключать мобильный Интернет" "Аппаратное ускорение в режиме модема" "Показывать Bluetooth-устройства без названий" @@ -246,6 +247,7 @@ "Ошибка подключения" "Показывать параметры сертификации беспроводных мониторов" "Вести подробный журнал, показывать RSSI для каждого SSID при выборе сети" + "Уменьшает расход заряда батареи и улучшает работу сетей." "Сеть с тарификацией трафика" "Сеть без тарификации трафика" "Размер буфера журнала" diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index f4992534d4a2..925d5b48ac21 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -220,6 +220,7 @@ "ජාලකරණය" "නොරැහැන් සංදර්ශක සහතිකය" "විස්තරාත්මක Wi‑Fi ලොග් කිරීම සබල කරන්න" + "Wi‑Fi ස්කෑන් අවකරණය" "ජංගම දත්ත සැමවිට ක්‍රියාකාරීය" "ටෙදරින් දෘඪාංග ත්වරණය" "නම් නොමැති බ්ලූටූත් උපාංග පෙන්වන්න" @@ -246,6 +247,7 @@ "සම්බන්ධ වීමට නොහැකි විය" "නොරැහැන් සංදර්ශක සහතිකය සඳහා විකල්ප පෙන්වන්න" "Wi‑Fi ලොග් මට්ටම වැඩි කරන්න, Wi‑Fi තෝරනයෙහි SSID RSSI අනුව පෙන්වන්න" + "බැටරි බැසීම අඩු කරන අතර ජාල කාර්ය සාධනය වැඩි දියුණු කරයි" "මනිනු ලැබේ" "මනින්නේ නැත" "ලෝගයේ අන්තරාවක ප්‍රමාණය" diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index a7895c4e06cf..e28825c052e7 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -91,8 +91,8 @@ "Prístup k SIM karte" "HD zvuk: %1$s" "HD zvuk" - "Načúvacie pomôcky" - "Pripojené k načúvacím pomôckam" + "Načúvadlá" + "Pripojené k načúvadlám" "Pripojené ku zvukovému médiu" "Pripojené ku zvuku telefónu" "Pripojené na server pre prenos údajov" @@ -109,7 +109,7 @@ "Použiť pre zvuk telefónu" "Použiť na prenos súborov" "Použiť pre vstup" - "Použiť pre načúvacie pomôcky" + "Použiť pre načúvadlá" "Párovať" "PÁROVAŤ" "Zrušiť" @@ -220,6 +220,7 @@ "Siete" "Certifikácia bezdrôtového zobrazenia" "Podrobné denníky Wi‑Fi" + "Pribrzdenie vyhľadávania sietí Wi‑Fi" "Mobilné dáta ponechať vždy aktívne" "Hardvérová akcelerácia tetheringu" "Zobrazovať zariadenia Bluetooth bez názvov" @@ -246,6 +247,7 @@ "Nepodarilo sa pripojiť" "Zobraziť možnosti certifikácie bezdrôtového zobrazenia" "Zvýšiť úroveň denníkov Wi‑Fi, zobrazovať podľa SSID RSSI pri výbere siete Wi‑Fi" + "Znižuje používanie batérie a zlepšuje výkon siete" "Merané" "Bez merania dát" "Vyrovnávacia pamäť nástroja denníkov" diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index d21e3ade0f7e..213b28557142 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -219,7 +219,8 @@ "Aplikacija za simulirano lokacijo: %1$s" "Omrežja" "Potrdilo brezžičnega zaslona" - "Omogoči podrob. zapis. dnevnika za Wi-Fi" + "Omogoči podrobno zapisovanje dnevnika za Wi-Fi" + "Omejevanje iskanja omrežij Wi-Fi" "Prenos podatkov v mobilnem omrežju je vedno aktiven" "Strojno pospeševanje za internetno povezavo prek mobilnega telefona" "Prikaži naprave Bluetooth brez imen" @@ -246,6 +247,7 @@ "Povezave ni bilo mogoče vzpostaviti" "Pokaži možnosti za potrdilo brezžičnega zaslona" "Povečaj raven zapis. dnev. za Wi-Fi; v izbir. Wi‑Fi-ja pokaži glede na SSID RSSI" + "Zmanjša porabo energije akumulatorja in izboljša delovanje omrežja" "Omejen prenos podatkov" "Z neomejenim prenosom podatkov" "Velikosti medpomnilnikov zapisovalnika dnevnika" @@ -297,7 +299,7 @@ "Ob posodobitvi osveži celotne površine oken" "Prikaži posodob. pogleda" "Osveži poglede v oknih pri risanju" - "Pokaži pos. sl. str. opr." + "Pokaži posodobitve slojev strojne opreme" "Obarvaj sloje strojne opreme zeleno ob posodobitvi" "Prekoračitev območja GPE" "Onem. strojni medp." @@ -315,7 +317,7 @@ "Odpravljanje težav s postopki nepravokotnega izrezovanja" "Upodob. profilov s HWUI" "Omog. sloje odpr. nap. GPE" - "Apl. za odpr. nap. dovoli nal. sloj. odpr. nap. GPE" + "Aplikacijam za odpravljanje napak dovoli nalaganje slojev za odpravljanje napak GPE" "Merilo animacije okna" "Merilo animacije prehoda" "Merilo trajanja animacije" @@ -334,7 +336,7 @@ "Poskrbi, da je ne glede na vrednosti v manifestu mogoče vsem aktivnostim spremeniti velikost za način z več okni." "Omogočanje oken svobodne oblike" "Omogočanje podpore za poskusna okna svobodne oblike" - "Geslo za varn. kop. namizja" + "Geslo za varnostno kopijo namizja" "Popolne varnostne kopije namizja trenutno niso zaščitene" "Dotaknite se, če želite spremeniti ali odstraniti geslo za popolno varnostno kopiranje namizja" "Novo geslo je nastavljeno" diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index b5f93e471879..4b38383545e5 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -220,6 +220,7 @@ "Rrjetet" "Certifikimi i ekranit valor" "Aktivizo hyrjen Wi-Fi Verbose" + "Përshpejtimi i skanimit të Wi‑Fi" "Të dhënat celulare gjithmonë aktive" "Përshpejtimi i harduerit për ndarjen e lidhjes (internet)" "Shfaq pajisjet me Bluetooth pa emra" @@ -246,6 +247,7 @@ "Nuk mund të lidhej" "Shfaq opsionet për certifikimin e ekranit valor" "Rrit nivelin regjistrues të Wi‑Fi duke shfaqur SSID RSSI-në te Zgjedhësi i Wi‑Fi" + "Zvogëlon shkarkimin e baterisë dhe përmirëson cilësinë e funksionimit të rrjetit" "Me matje" "Pa matje" "Madhësitë e regjistruesit" diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index 2a6e328a76f0..0edc9850a26b 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -220,6 +220,7 @@ "Умрежавање" "Сертификација бежичног екрана" "Омогући детаљнију евиденцију за Wi‑Fi" + "Успоравање Wi-Fi скенирања" "Мобилни подаци су увек активни" "Хардверско убрзање привезивања" "Прикажи Bluetooth уређаје без назива" @@ -246,6 +247,7 @@ "Повезивање није успело" "Приказ опција за сертификацију бежичног екрана" "Повећава ниво евидентирања за Wi‑Fi. Приказ по SSID RSSI-у у бирачу Wi‑Fi мреже" + "Смањује потрошњу батерије и побољшава учинак мреже" "Са ограничењем" "Без ограничења" "Величине бафера података у програму за евидентирање" diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 977851608e33..862fc6cad0d4 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -220,6 +220,7 @@ "Nätverk" "Certifiering för Wi-Fi-skärmdelning" "Aktivera utförlig loggning för Wi-Fi" + "Begränsning av Wi-Fi-sökning" "Mobildata alltid aktiverad" "Maskinvaruacceleration för internetdelning" "Visa namnlösa Bluetooth-enheter" @@ -246,6 +247,7 @@ "Kan inte ansluta" "Visa certifieringsalternativ för Wi-Fi-skärmdelning" "Öka loggningsnivån för Wi-Fi, visa per SSID RSSI i Wi‑Fi Picker" + "Sänker batteriförbrukningen och förbättrar nätverksprestandan" "Med datapriser" "Utan datapriser" "Buffertstorlekar för logg" diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 0b486f759e5a..12922ca2b13e 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -78,12 +78,12 @@ "Inatumika, L: %1$s ya betri, R: %2$s ya betri" "Chaji ya betri ni %1$s" "L: %1$s ya betri, R: %2$s ya betri" - "Unaendelea" + "Kimeunganishwa" "Media ya sauti" "Simu" "Uhamishaji wa faili" "Kifaa cha kuingiza" - "Ufikivu wa mtandao" + "Ufikiaji wa mtandao" "Kushiriki anwani" "Tumia kwa kushiriki anwani" "Kushiriki muunganisho wa tovuti" @@ -137,7 +137,7 @@ "Nguvu kamili ya mtandao wa Wifi." "Mtandao unaotumiwa na mtu yeyote" "Mtandao salama" - "OS ya Android" + "Mfumo wa Uendeshaji wa Android" "Programu zilizoondolewa" "Watumiaji na programu ziilizoondolewa" "Masasisho ya mfumo" @@ -220,6 +220,7 @@ "Mtandao" "Chaguo za cheti cha kuonyesha pasiwaya" "Washa Uwekaji kumbukumbu za WiFi kutumia Sauti" + "Kudhibiti utafutaji wa Wi-Fi" "Iendelee kutumia data ya simu" "Kuongeza kasi kwa kutumia maunzi ili kusambaza mtandao" "Onyesha vifaa vya Bluetooth visivyo na majina" @@ -246,6 +247,7 @@ "Imeshindwa kuunganisha" "Onyesha chaguo za cheti cha kuonyesha pasiwaya" "Ongeza hatua ya uwekaji kumbukumbu ya Wi-Fi, onyesha kwa kila SSID RSSI kwenye Kichukuzi cha Wi-Fi" + "Hupunguza matumizi ya chaji ya betri na kuboresha utendaji wa mtandao" "Mtandao unapima data" "Mtandao usiopima data" "Ukubwa wa kiweka bafa ya kumbukumbu" diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index 13741e075cb3..cf442b73e721 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -23,8 +23,7 @@ "நெட்வொர்க்குகளுக்கு ஸ்கேன் செய்யப்படவில்லை" "ஏதுமில்லை" "சேமிக்கப்பட்டது" - - + "தொடர்பு துண்டிக்கப்பட்டது" "முடக்கப்பட்டது" "IP உள்ளமைவில் தோல்வி" "தரம் குறைவான நெட்வொர்க்கின் காரணமாக, இணைக்கப்படவில்லை" @@ -197,7 +196,7 @@ "பணியிடம்" "டெவெலப்பர் விருப்பங்கள்" "டெவெலப்பர் விருப்பங்களை இயக்கு" - "பயன்பாட்டின் மேம்பாட்டிற்காக விருப்பங்களை அமை" + "ஆப்ஸின் மேம்பாட்டிற்காக விருப்பங்களை அமை" "இவருக்கு, டெவெலப்பர் விருப்பங்கள் இல்லை" "இவரால் VPN அமைப்புகளை மாற்ற முடியாது" "இவரால் இணைப்புமுறை அமைப்புகளை மாற்ற முடியாது" @@ -221,6 +220,7 @@ "நெட்வொர்க்கிங்" "வயர்லெஸ் காட்சிக்கான சான்றிதழ்" "வைஃபை அதிவிவர நுழைவை இயக்கு" + "வைஃபை ஸ்கேனிங்கை வரம்பிடுதல்" "மொபைல் டேட்டாவை எப்போதும் இயக்கத்திலேயே வை" "வன்பொருள் விரைவுப்படுத்துதல் இணைப்பு முறை" "பெயர்கள் இல்லாத புளூடூத் சாதனங்களைக் காட்டு" @@ -247,6 +247,7 @@ "இணைக்க முடியவில்லை" "வயர்லெஸ் காட்சி சான்றுக்கான விருப்பங்களைக் காட்டு" "வைஃபை நுழைவு அளவை அதிகரித்து, வைஃபை தேர்வியில் ஒவ்வொன்றிற்கும் SSID RSSI ஐ காட்டுக" + "பேட்டரி தீர்ந்துபோவதைக் குறைத்து நெட்வொர்க்கின் செயல்திறனை மேம்படுத்தும்" "கட்டண நெட்வொர்க்" "கட்டணமில்லா நெட்வொர்க்" "லாகர் பஃபர் அளவுகள்" @@ -355,7 +356,7 @@ "காத்திருப்பில் உள்ள ஆப்ஸ்" "செயலில் இல்லை. மாற்ற, தட்டவும்." "செயலில் உள்ளது. மாற்ற, தட்டவும்." - "காத்திருப்பில் உள்ள பயன்பாட்டின் நிலை: %s" + "காத்திருப்பில் உள்ள ஆப்ஸின் நிலை: %s" "இயங்கும் சேவைகள்" "தற்போது இயக்கத்தில் இருக்கும் சேவைகளைப் பார்த்து கட்டுப்படுத்து" "WebView செயல்படுத்தல்" diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 99affe422be6..83636dc19beb 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -220,6 +220,7 @@ "నెట్‌వర్కింగ్" "వైర్‌లెస్ ప్రదర్శన ప్రామాణీకరణ" "Wi‑Fi విశదీకృత లాగింగ్‌ను ప్రారంభించండి" + "Wi‑Fi స్కాన్ కుదింపు" "మొబైల్ డేటాని ఎల్లప్పుడూ యాక్టివ్‌గా ఉంచు" "టెథెరింగ్ హార్డ్‌వేర్ వేగవృద్ధి" "పేర్లు లేని బ్లూటూత్ పరికరాలు చూపించు" @@ -246,6 +247,7 @@ "కనెక్ట్ చేయడం సాధ్యపడలేదు" "వైర్‌లెస్ ప్రదర్శన సర్టిఫికెట్ కోసం ఎంపికలను చూపు" "Wi‑Fi ఎంపికలో SSID RSSI ప్రకారం చూపబడే Wi‑Fi లాగింగ్ స్థాయిని పెంచండి" + "బ్యాటరీ శక్తి వినియోగాన్ని తగ్గించి & నెట్‌వర్క్ పనితీరును మెరుగుపరుస్తుంది" "గణించబడుతోంది" "గణించబడటం లేదు" "లాగర్ బఫర్ పరిమాణాలు" @@ -451,7 +453,7 @@ "సరే" "ఆన్ చేయండి" "అంతరాయం కలిగించవద్దును ఆన్ చేయండి" - "ఎప్పటికీ" + "ఎప్పటికీ వ‌ద్దు" "ప్రాధాన్యత మాత్రమే" "%1$s. %2$s" "మీరు %1$s సెట్ చేసిన మీ తర్వాత అలారం మీరు ఆ లోపల దీన్ని ఆఫ్ చేయకుంటే వినిపించదు" diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 4f8b9e4aeabf..910b94ecdf03 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -220,6 +220,7 @@ "เครือข่าย" "การรับรองการแสดงผลแบบไร้สาย" "เปิดใช้การบันทึกรายละเอียด Wi-Fi" + "การควบคุมการสแกนหา Wi‑Fi" "เปิดใช้เน็ตมือถือเสมอ" "การเร่งฮาร์ดแวร์การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ" "แสดงอุปกรณ์บลูทูธที่ไม่มีชื่อ" @@ -246,6 +247,7 @@ "เชื่อมต่อไม่ได้" "แสดงตัวเลือกสำหรับการรับรองการแสดงผล แบบไร้สาย" "เพิ่มระดับการบันทึก Wi‑Fi แสดงต่อ SSID RSSI ในตัวเลือก Wi‑Fi" + "ลดการหมดเปลืองแบตเตอรี่และเพิ่มประสิทธิภาพเครือข่าย" "มีการวัดปริมาณอินเทอร์เน็ต" "ไม่มีการวัดปริมาณอินเทอร์เน็ต" "ขนาดบัฟเฟอร์ของตัวบันทึก" diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index bc3350985c5a..85b64381308f 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -220,6 +220,7 @@ "Networking" "Certification ng wireless display" "I-enable ang Pagla-log sa Wi‑Fi Verbose" + "Pag-throttle ng pag-scan ng Wi‑Fi" "Palaging aktibo ang mobile data" "Hardware acceleration para sa pag-tether" "Ipakita ang mga Bluetooth device na walang pangalan" @@ -246,6 +247,7 @@ "Hindi makakonekta" "Ipakita ang mga opsyon para sa certification ng wireless display" "Pataasin ang antas ng Wi‑Fi logging, ipakita sa bawat SSID RSSI sa Wi‑Fi Picker" + "Binabawasan ang pagkaubos ng baterya at pinapahusay ang performance ng network" "Nakametro" "Hindi Nakametro" "Mga laki ng buffer ng Logger" diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 7afb78a06635..6031ecaf6ed4 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -220,6 +220,7 @@ "Ağ işlemleri" "Kablosuz ekran sertifikası" "Kablosuz Ayrıntılı Günlük Kaydını etkinleştir" + "Kablosuz ağ taramasını kısma" "Mobil veri her zaman etkin" "Tethering donanım hızlandırıcısı" "Adsız Bluetooth cihazlarını göster" @@ -246,6 +247,7 @@ "Bağlanılamadı" "Kablosuz ekran sertifikası seçeneklerini göster" "Kablosuz günlük kaydı seviyesini artır. Kablosuz Seçici\'de her bir SSID RSSI için göster." + "Pili daha az harcar ve ağ performansını iyileştirir" "Sayaçlı" "Sayaçsız" "Günlük Kaydedici arabellek boyutları" @@ -448,7 +450,7 @@ "Daha uzun süre." "Daha kısa süre." "İptal" - "TAMAM" + "Tamam" "Aç" "Rahatsız Etmeyin\'i açın" "Hiçbir zaman" diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 08084561cce8..5f3c6a6b20a3 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -220,6 +220,7 @@ "Мережі" "Сертифікація бездрот. екрана" "Докладний запис у журнал Wi-Fi" + "Зменшити радіус пошуку мереж Wi‑Fi" "Не вимикати мобільне передавання даних" "Апаратне прискорення під час використання телефона в режимі модема" "Показувати пристрої Bluetooth без назв" @@ -238,7 +239,7 @@ "Активувати LDAC для аудіо Bluetooth\nВибір кодека: якість відтворення" "Трансляція: %1$s" "Приватна DNS" - "Виберіть режим \"Приватна DNS\"" + "Режим приватної системи DNS" "Вимкнено" "Автоматично" "Ім’я хосту приватного постачальника послуг DNS" @@ -246,6 +247,7 @@ "Не вдалося під’єднатися" "Показати параметри сертифікації бездротового екрана" "Показувати в журналі RSSI для кожного SSID під час вибору Wi-Fi" + "Зменшує споживання заряду акумулятора й підвищує ефективність роботи мережі" "З тарифікацією трафіку" "Без тарифікації трафіку" "Розміри буфера журналу" diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index 8ab1c235a028..82d9b3fb57f8 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -220,6 +220,7 @@ "نیٹ ورکنگ" "وائرلیس ڈسپلے سرٹیفیکیشن" "‏Wi‑Fi وربوس لاگنگ فعال کریں" + "‏Wi‑Fi اسکین کو زبردستی روکا جا رہا ہے" "موبائل ڈیٹا ہمیشہ فعال رکھیں" "ٹیدرنگ ہارڈویئر سرعت کاری" "بغیر نام والے بلوٹوتھ آلات دکھائیں" @@ -246,6 +247,7 @@ "منسلک نہیں ہو سکا" "وائرلیس ڈسپلے سرٹیفیکیشن کیلئے اختیارات دکھائیں" "‏Wi‑Fi لاگنگ لیول میں اضافہ کریں، Wi‑Fi منتخب کنندہ میں فی SSID RSSI دکھائیں" + "بیٹری ڈرین کم کرتا ہے اور نیٹ ورک کارکردگی کو بہتر بناتا ہے" "میٹرڈ" "غیر میٹر شدہ" "لاگر بفر کے سائز" diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index 2bcb450dbc27..5dca4759a629 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -220,6 +220,7 @@ "Tarmoqlar" "Simsiz monitor sertifikatlari" "Batafsil Wi-Fi jurnali" + "Wi‑Fi tarmoqni taqsimlab skanlash" "Mobil internet doim yoniq tursin" "Modem rejimida apparatli tezlashtirish" "Bluetooth qurilmalarini nomlarisiz ko‘rsatish" @@ -246,6 +247,7 @@ "Ulanmadi" "Simsiz monitorlarni sertifikatlash parametrini ko‘rsatish" "Wi-Fi ulanishini tanlashda har bir SSID uchun jurnalda ko‘rsatilsin" + "Batareya sarfini tejaydi va tarmoq samaradorligini oshiradi" "Trafik hisoblanadigan tarmoq" "Trafik hisobi yuritilmaydigan tarmoq" "Jurnal buferi hajmi" diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index 2ac9a9bc2045..4e2d6fa76ad0 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -35,7 +35,7 @@ "Ngoài vùng phủ sóng" "Sẽ không tự động kết nối" "Không có quyền truy cập Internet" - "Được lưu bởi %1$s" + "Do %1$s lưu" "Tự động được kết nối qua %1$s" "Tự động được kết nối qua nhà cung cấp dịch vụ xếp hạng mạng" "Được kết nối qua %1$s" @@ -88,7 +88,7 @@ "Sử dụng để chia sẻ liên hệ" "Chia sẻ kết nối internet" "Tin nhắn văn bản" - "Quyền truy cập SIM" + "Truy cập SIM" "Âm thanh HD: %1$s" "Âm thanh HD" "Thiết bị trợ thính" @@ -153,7 +153,7 @@ "Đã đặt một số ứng dụng chạy mặc định" "Chưa đặt mặc định" "Cài đặt chuyển văn bản sang lời nói" - "Đầu ra văn bản thành giọng nói" + "Chuyển văn bản sang lời nói" "Tốc độ lời nói" "Tốc độ đọc văn bản" "Độ cao" @@ -220,6 +220,7 @@ "Mạng" "Chứng nhận hiển thị không dây" "Bật ghi nhật ký chi tiết Wi‑Fi" + "Hạn chế quét tìm Wi-Fi" "Dữ liệu di động luôn hoạt động" "Tăng tốc phần cứng khi chia sẻ kết nối" "Hiển thị các thiết bị Bluetooth không có tên" @@ -246,6 +247,7 @@ "Không thể kết nối" "Hiển thị tùy chọn chứng nhận hiển thị không dây" "Tăng mức ghi nhật ký Wi‑Fi, hiển thị mỗi SSID RSSI trong bộ chọn Wi‑Fi" + "Giảm hao pin và cải thiện hiệu suất mạng" "Đo lượng dữ liệu" "Không đo lượng dữ liệu" "Kích thước bộ đệm của trình ghi nhật ký" diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 8685c10ca00c..460142c6d738 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -220,6 +220,7 @@ "网络" "无线显示认证" "启用 WLAN 详细日志记录功能" + "WLAN 扫描调节" "始终开启移动数据网络" "网络共享硬件加速" "显示没有名称的蓝牙设备" @@ -246,6 +247,7 @@ "无法连接" "显示无线显示认证选项" "提升 WLAN 日志记录级别(在 WLAN 选择器中显示每个 SSID 的 RSSI)" + "降低耗电量以及改善网络性能" "按流量计费" "不按流量计费" "日志记录器缓冲区大小" diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 653a39b3b695..286765d99282 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -220,6 +220,7 @@ "網絡" "無線螢幕分享認證" "啟用 Wi‑Fi 詳細記錄" + "Wi‑Fi 掃瞄限流" "一律保持啟用流動數據" "網絡共享硬件加速" "顯示沒有名稱的藍牙裝置" @@ -238,14 +239,15 @@ "觸發藍牙音訊 LDAC\n編解碼器選項:播放品質" "正在串流:%1$s" "私人 DNS" - "選取私人網域名稱系統 (DNS) 模式" + "選取私人 DNS 模式" "停用" "自動" - "私人網域名稱系統 (DNS) 供應商主機名稱" - "輸入網域名稱系統 (DNS) 供應商的主機名稱" + "私人 DNS 供應商主機名稱" + "輸入 DNS 供應商主機名稱" "無法連線" "顯示無線螢幕分享認證的選項" "讓 Wi‑Fi 記錄功能升級,在 Wi‑Fi 選擇器中依每個 SSID RSSI 顯示 Wi‑Fi 詳細紀錄" + "減低耗電量並改善網絡表現" "按用量收費" "不限數據用量收費" "記錄器緩衝區空間" diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index 1201938ca616..e85199f9ca0d 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -220,6 +220,7 @@ "網路連線" "無線螢幕分享認證" "啟用 Wi‑Fi 詳細記錄設定" + "Wi-Fi 掃描調節" "行動數據連線一律保持啟用狀態" "數據連線硬體加速" "顯示沒有名稱的藍牙裝置" @@ -246,6 +247,7 @@ "無法連線" "顯示無線螢幕分享認證的選項" "讓 Wi‑Fi 記錄功能升級,在 Wi‑Fi 選擇器中依每個 SSID RSSI 顯示 Wi‑Fi 詳細記錄" + "降低耗電量以及改善網路效能" "計量付費" "非計量付費" "記錄器緩衝區空間" diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index 9ea73fafb0a1..1bfbf07d49ef 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -220,6 +220,7 @@ "Ukunethiwekha" "Ukunikezwa isitifiketi sokubukeka okungenantambo" "Nika amandlaukungena kwe-Wi-Fi Verbose" + "I-throttling yokuskena kwe-Wi-Fi" "Idatha yeselula ihlala isebenza" "I-Tethering hardware acceleration" "Bonisa amadivayisi e-Bluetooth ngaphandle kwamagama" @@ -246,6 +247,7 @@ "Ayikwazanga ukuxhuma" "Bonisa izinketho zokunikeza isitifiketi ukubukeka okungenantambo" "khuphula izinga lokungena le-Wi-Fi, bonisa nge-SSID RSSI engayodwana kusikhethi se-Wi-Fi" + "Yehlisa ukuphela kwebhethri futhi ithuthukise ukusebenza kwenethiwekhi" "Kulinganisiwe" "Akulinganiselwa" "Amasayizi weloga ngebhafa" -- GitLab From e06624716da2ff8753a35995ff79e39bf824cbd4 Mon Sep 17 00:00:00 2001 From: Qingxi Li Date: Fri, 17 May 2019 15:16:21 -0700 Subject: [PATCH 044/620] Remove all eSIM Invisible Profiles during FDR Bug: 132360644 Test: E2E Change-Id: Ic4e58ed7c8cf5892d8f49605e268c3d131b35ea9 (cherry picked from commit 1854f47f80e5eafaa56d688658550cc19f85f3c1) --- core/java/android/os/RecoverySystem.java | 129 +++++++++++++++++- core/java/android/provider/Settings.java | 10 ++ .../android/provider/SettingsBackupTest.java | 1 + .../telephony/SubscriptionManager.java | 4 +- 4 files changed, 137 insertions(+), 7 deletions(-) diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java index 1b41694e7d48..8938dddeadfa 100644 --- a/core/java/android/os/RecoverySystem.java +++ b/core/java/android/os/RecoverySystem.java @@ -32,6 +32,8 @@ import android.content.IntentFilter; import android.content.pm.PackageManager; import android.os.storage.IStorageManager; import android.provider.Settings; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; import android.telephony.euicc.EuiccManager; import android.text.TextUtils; import android.text.format.DateFormat; @@ -59,10 +61,12 @@ import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashSet; +import java.util.List; import java.util.Locale; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; @@ -90,11 +94,14 @@ public class RecoverySystem { private static final long PUBLISH_PROGRESS_INTERVAL_MS = 500; private static final long DEFAULT_EUICC_FACTORY_RESET_TIMEOUT_MILLIS = 30000L; // 30 s - private static final long MIN_EUICC_FACTORY_RESET_TIMEOUT_MILLIS = 5000L; // 5 s - private static final long MAX_EUICC_FACTORY_RESET_TIMEOUT_MILLIS = 60000L; // 60 s + private static final long DEFAULT_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS = + 45000L; // 45 s + private static final long MIN_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS = 15000L; // 15 s + private static final long MAX_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS = 90000L; // 90 s + /** Used to communicate with recovery. See bootable/recovery/recovery.cpp. */ private static final File RECOVERY_DIR = new File("/cache/recovery"); private static final File LOG_FILE = new File(RECOVERY_DIR, "log"); @@ -102,9 +109,14 @@ public class RecoverySystem { private static final String LAST_PREFIX = "last_"; private static final String ACTION_EUICC_FACTORY_RESET = "com.android.internal.action.EUICC_FACTORY_RESET"; + private static final String ACTION_EUICC_REMOVE_INVISIBLE_SUBSCRIPTIONS = + "com.android.internal.action.EUICC_REMOVE_INVISIBLE_SUBSCRIPTIONS"; - /** used in {@link #wipeEuiccData} as package name of callback intent */ - private static final String PACKAGE_NAME_WIPING_EUICC_DATA_CALLBACK = "android"; + /** + * Used in {@link #wipeEuiccData} & {@link #removeEuiccInvisibleSubs} as package name of + * callback intent. + */ + private static final String PACKAGE_NAME_EUICC_DATA_MANAGEMENT_CALLBACK = "android"; /** * The recovery image uses this file to identify the location (i.e. blocks) @@ -757,8 +769,11 @@ public class RecoverySystem { // Block until the ordered broadcast has completed. condition.block(); + EuiccManager euiccManager = context.getSystemService(EuiccManager.class); if (wipeEuicc) { - wipeEuiccData(context, PACKAGE_NAME_WIPING_EUICC_DATA_CALLBACK); + wipeEuiccData(context, PACKAGE_NAME_EUICC_DATA_MANAGEMENT_CALLBACK); + } else { + removeEuiccInvisibleSubs(context, euiccManager); } String shutdownArg = null; @@ -854,6 +869,110 @@ public class RecoverySystem { return false; } + private static void removeEuiccInvisibleSubs( + Context context, EuiccManager euiccManager) { + ContentResolver cr = context.getContentResolver(); + if (Settings.Global.getInt(cr, Settings.Global.EUICC_PROVISIONED, 0) == 0) { + // If the eUICC isn't provisioned, there's no need to remove euicc invisible profiles, + // as there's nothing to be removed. + Log.i(TAG, "Skip removing eUICC invisible profiles as it is not provisioned."); + return; + } else if (euiccManager == null || !euiccManager.isEnabled()) { + Log.i(TAG, "Skip removing eUICC invisible profiles as eUICC manager is not available."); + return; + } + SubscriptionManager subscriptionManager = + context.getSystemService(SubscriptionManager.class); + List availableSubs = + subscriptionManager.getAvailableSubscriptionInfoList(); + if (availableSubs == null || availableSubs.isEmpty()) { + Log.i(TAG, "Skip removing eUICC invisible profiles as no available profiles found."); + return; + } + List invisibleSubs = new ArrayList<>(); + for (SubscriptionInfo sub : availableSubs) { + if (sub.isEmbedded() && !subscriptionManager.isSubscriptionVisible(sub)) { + invisibleSubs.add(sub); + } + } + removeEuiccInvisibleSubs(context, invisibleSubs, euiccManager); + } + + private static boolean removeEuiccInvisibleSubs( + Context context, List subscriptionInfos, EuiccManager euiccManager) { + if (subscriptionInfos == null || subscriptionInfos.isEmpty()) { + Log.i(TAG, "There are no eUICC invisible profiles needed to be removed."); + return true; + } + CountDownLatch removeSubsLatch = new CountDownLatch(subscriptionInfos.size()); + final AtomicInteger removedSubsCount = new AtomicInteger(0); + + BroadcastReceiver removeEuiccSubsReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (ACTION_EUICC_REMOVE_INVISIBLE_SUBSCRIPTIONS.equals(intent.getAction())) { + if (getResultCode() != EuiccManager.EMBEDDED_SUBSCRIPTION_RESULT_OK) { + int detailedCode = intent.getIntExtra( + EuiccManager.EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE, 0); + Log.e(TAG, "Error removing euicc opportunistic profile, Detailed code = " + + detailedCode); + } else { + Log.e(TAG, "Successfully remove euicc opportunistic profile."); + removedSubsCount.incrementAndGet(); + } + removeSubsLatch.countDown(); + } + } + }; + + Intent intent = new Intent(ACTION_EUICC_REMOVE_INVISIBLE_SUBSCRIPTIONS); + intent.setPackage(PACKAGE_NAME_EUICC_DATA_MANAGEMENT_CALLBACK); + PendingIntent callbackIntent = PendingIntent.getBroadcastAsUser( + context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT, UserHandle.SYSTEM); + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(ACTION_EUICC_REMOVE_INVISIBLE_SUBSCRIPTIONS); + HandlerThread euiccHandlerThread = + new HandlerThread("euiccRemovingSubsReceiverThread"); + euiccHandlerThread.start(); + Handler euiccHandler = new Handler(euiccHandlerThread.getLooper()); + context.getApplicationContext() + .registerReceiver( + removeEuiccSubsReceiver, intentFilter, null, euiccHandler); + for (SubscriptionInfo subscriptionInfo : subscriptionInfos) { + Log.i( + TAG, + "Remove invisible subscription " + subscriptionInfo.getSubscriptionId() + + " from card " + subscriptionInfo.getCardId()); + euiccManager.createForCardId(subscriptionInfo.getCardId()) + .deleteSubscription(subscriptionInfo.getSubscriptionId(), callbackIntent); + } + try { + long waitingTimeMillis = Settings.Global.getLong( + context.getContentResolver(), + Settings.Global.EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS, + DEFAULT_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS); + if (waitingTimeMillis < MIN_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS) { + waitingTimeMillis = MIN_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS; + } else if (waitingTimeMillis > MAX_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS) { + waitingTimeMillis = MAX_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS; + } + if (!removeSubsLatch.await(waitingTimeMillis, TimeUnit.MILLISECONDS)) { + Log.e(TAG, "Timeout removing invisible euicc profiles."); + return false; + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + Log.e(TAG, "Removing invisible euicc profiles interrupted", e); + return false; + } finally { + context.getApplicationContext().unregisterReceiver(removeEuiccSubsReceiver); + if (euiccHandlerThread != null) { + euiccHandlerThread.quit(); + } + } + return removedSubsCount.get() == subscriptionInfos.size(); + } + /** {@hide} */ public static void rebootPromptAndWipeUserData(Context context, String reason) throws IOException { diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 0db5c36eb961..0271b883f623 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -13550,6 +13550,16 @@ public final class Settings { public static final String LOCATION_SETTINGS_LINK_TO_PERMISSIONS_ENABLED = "location_settings_link_to_permissions_enabled"; + /** + * Flag to set the waiting time for removing invisible euicc profiles inside System > + * Settings. + * Type: long + * + * @hide + */ + public static final String EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS = + "euicc_removing_invisible_profiles_timeout_millis"; + /** * Flag to set the waiting time for euicc factory reset inside System > Settings * Type: long diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index fda37c8783ff..a76804fcad08 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -265,6 +265,7 @@ public class SettingsBackupTest { Settings.Global.EUICC_PROVISIONED, Settings.Global.EUICC_SUPPORTED_COUNTRIES, Settings.Global.EUICC_FACTORY_RESET_TIMEOUT_MILLIS, + Settings.Global.EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS, Settings.Global.FANCY_IME_ANIMATIONS, Settings.Global.FORCE_ALLOW_ON_EXTERNAL, Settings.Global.FORCED_APP_STANDBY_ENABLED, diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 65db458df159..a9521e36c0d5 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -2976,10 +2976,10 @@ public class SubscriptionManager { * @param info the subscriptionInfo to check against. * @return true if this subscription should be visible to the API caller. * + * @hide */ - private boolean isSubscriptionVisible(SubscriptionInfo info) { + public boolean isSubscriptionVisible(SubscriptionInfo info) { if (info == null) return false; - // If subscription is NOT grouped opportunistic subscription, it's visible. if (info.getGroupUuid() == null || !info.isOpportunistic()) return true; -- GitLab From 940e490753fe1258a1bd3c42ad3559c57ec39e2e Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Mon, 3 Jun 2019 15:43:20 -0700 Subject: [PATCH 045/620] Do not hide media metadata when bypassing LS Bug: 130327302 Test: manual Test: atest KeyguardSliceProviderTest Change-Id: I50bfd88d8d812ce7b64294a7bc68d8b28e9a6a0d --- .../keyguard/KeyguardSliceProvider.java | 10 ++++++++-- .../systemui/statusbar/phone/StatusBar.java | 3 ++- .../keyguard/KeyguardSliceProviderTest.java | 20 +++++++++++++++++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java index d4c73668d0ed..0205bbfc6c1b 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java @@ -52,6 +52,7 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.R; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationMediaManager; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.NextAlarmControllerImpl; import com.android.systemui.statusbar.policy.ZenModeController; @@ -118,6 +119,7 @@ public class KeyguardSliceProvider extends SliceProvider implements private PendingIntent mPendingIntent; protected NotificationMediaManager mMediaManager; private StatusBarStateController mStatusBarStateController; + private KeyguardBypassController mKeyguardBypassController; private CharSequence mMediaTitle; private CharSequence mMediaArtist; protected boolean mDozing; @@ -194,11 +196,13 @@ public class KeyguardSliceProvider extends SliceProvider implements */ public void initDependencies( NotificationMediaManager mediaManager, - StatusBarStateController statusBarStateController) { + StatusBarStateController statusBarStateController, + KeyguardBypassController keyguardBypassController) { mMediaManager = mediaManager; mMediaManager.addCallback(this); mStatusBarStateController = statusBarStateController; mStatusBarStateController.addCallback(this); + mKeyguardBypassController = keyguardBypassController; } @AnyThread @@ -223,7 +227,9 @@ public class KeyguardSliceProvider extends SliceProvider implements } protected boolean needsMediaLocked() { - return !TextUtils.isEmpty(mMediaTitle) && mMediaIsVisible && mDozing; + boolean isBypass = mKeyguardBypassController != null + && mKeyguardBypassController.getBypassEnabled(); + return !TextUtils.isEmpty(mMediaTitle) && mMediaIsVisible && (mDozing || isBypass); } protected void addMediaLocked(ListBuilder listBuilder) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 5fca4f8478cb..e60a30af81a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -660,7 +660,8 @@ public class StatusBar extends SystemUI implements DemoMode, mActivityIntentHelper = new ActivityIntentHelper(mContext); KeyguardSliceProvider sliceProvider = KeyguardSliceProvider.getAttachedInstance(); if (sliceProvider != null) { - sliceProvider.initDependencies(mMediaManager, mStatusBarStateController); + sliceProvider.initDependencies(mMediaManager, mStatusBarStateController, + mKeyguardBypassController); } else { Log.w(TAG, "Cannot init KeyguardSliceProvider dependencies"); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java index 355e26071b2a..c6923591f54b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java @@ -48,6 +48,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationMediaManager; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import org.junit.Assert; import org.junit.Before; @@ -73,6 +74,8 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { private NotificationMediaManager mNotificationMediaManager; @Mock private StatusBarStateController mStatusBarStateController; + @Mock + private KeyguardBypassController mKeyguardBypassController; private TestableKeyguardSliceProvider mProvider; private boolean mIsZenMode; @@ -82,7 +85,8 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { mIsZenMode = false; mProvider = new TestableKeyguardSliceProvider(); mProvider.attachInfo(getContext(), null); - mProvider.initDependencies(mNotificationMediaManager, mStatusBarStateController); + mProvider.initDependencies(mNotificationMediaManager, mStatusBarStateController, + mKeyguardBypassController); SliceProvider.setSpecs(new HashSet<>(Arrays.asList(SliceSpecs.LIST))); } @@ -102,7 +106,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { } @Test - public void onBindSlice_readsMedia() { + public void onBindSlice_readsMedia_withoutBypass() { MediaMetadata metadata = mock(MediaMetadata.class); when(metadata.getText(any())).thenReturn("metadata"); mProvider.onDozingChanged(true); @@ -113,6 +117,18 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { verify(mNotificationMediaManager).getMediaIcon(); } + @Test + public void onBindSlice_readsMedia_withBypass_notDozing() { + MediaMetadata metadata = mock(MediaMetadata.class); + when(metadata.getText(any())).thenReturn("metadata"); + when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true); + mProvider.onMetadataOrStateChanged(metadata, PlaybackState.STATE_PLAYING); + mProvider.onBindSlice(mProvider.getUri()); + verify(metadata).getText(eq(MediaMetadata.METADATA_KEY_TITLE)); + verify(metadata).getText(eq(MediaMetadata.METADATA_KEY_ARTIST)); + verify(mNotificationMediaManager).getMediaIcon(); + } + @Test public void cleansDateFormat() { mProvider.mKeyguardUpdateMonitorCallback.onTimeZoneChanged(null); -- GitLab From e6f9fdbc5edfb6c1a0c2fbae532f706590244487 Mon Sep 17 00:00:00 2001 From: Alex Salo Date: Thu, 30 May 2019 13:55:54 -0700 Subject: [PATCH 046/620] Update attention config Bug: 134433577 Test: manually Change-Id: Iff0d039b5399ca1a7d622d2c9f5f0556ea471e2a --- core/res/res/values/config.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index acaa2027cbef..aa250744d21d 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2283,7 +2283,7 @@ effectively and terminate the dream. Use -1 to disable this safety feature. --> 5 - 240000 + 330000 2000 -- GitLab From 49489768aba0d90645a4771ee002efa590c50883 Mon Sep 17 00:00:00 2001 From: Alex Salo Date: Mon, 3 Jun 2019 16:23:30 -0700 Subject: [PATCH 047/620] Don't check attention when in lockscreen Bug: 132394213 Test: atest AttentionDetectorTest Change-Id: I43c530c88acf128fcc5ebb703c5c489b00fb509e --- .../android/server/power/AttentionDetector.java | 17 +++++++++-------- .../server/power/AttentionDetectorTest.java | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/power/AttentionDetector.java b/services/core/java/com/android/server/power/AttentionDetector.java index ed11fd45ec39..b2e035c9b93a 100644 --- a/services/core/java/com/android/server/power/AttentionDetector.java +++ b/services/core/java/com/android/server/power/AttentionDetector.java @@ -40,6 +40,7 @@ import android.util.StatsLog; import com.android.internal.annotations.VisibleForTesting; import com.android.server.LocalServices; +import com.android.server.wm.WindowManagerInternal; import java.io.PrintWriter; import java.util.concurrent.atomic.AtomicBoolean; @@ -101,6 +102,9 @@ public class AttentionDetector { @VisibleForTesting protected AttentionManagerInternal mAttentionManager; + @VisibleForTesting + protected WindowManagerInternal mWindowManager; + @VisibleForTesting protected PackageManager mPackageManager; @@ -142,6 +146,7 @@ public class AttentionDetector { mPackageManager = context.getPackageManager(); mContentResolver = context.getContentResolver(); mAttentionManager = LocalServices.getService(AttentionManagerInternal.class); + mWindowManager = LocalServices.getService(WindowManagerInternal.class); mMaximumExtensionMillis = context.getResources().getInteger( com.android.internal.R.integer.config_attentionMaximumExtension); mMaxAttentionApiTimeoutMillis = context.getResources().getInteger( @@ -165,14 +170,10 @@ public class AttentionDetector { } public long updateUserActivity(long nextScreenDimming) { - if (nextScreenDimming == mLastActedOnNextScreenDimming) { - return nextScreenDimming; - } - if (!mIsSettingEnabled) { - return nextScreenDimming; - } - - if (!isAttentionServiceSupported()) { + if (nextScreenDimming == mLastActedOnNextScreenDimming + || !mIsSettingEnabled + || !isAttentionServiceSupported() + || mWindowManager.isKeyguardShowingAndNotOccluded()) { return nextScreenDimming; } diff --git a/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java b/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java index a63f49b1fe3d..44769180824e 100644 --- a/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java +++ b/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java @@ -42,6 +42,8 @@ import android.service.attention.AttentionService; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; +import com.android.server.wm.WindowManagerInternal; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -57,6 +59,8 @@ public class AttentionDetectorTest extends AndroidTestCase { @Mock private AttentionManagerInternal mAttentionManagerInternal; @Mock + private WindowManagerInternal mWindowManagerInternal; + @Mock private Runnable mOnUserAttention; private TestableAttentionDetector mAttentionDetector; private long mAttentionTimeout; @@ -71,6 +75,7 @@ public class AttentionDetectorTest extends AndroidTestCase { PackageManager.PERMISSION_GRANTED); when(mAttentionManagerInternal.checkAttention(anyLong(), any())) .thenReturn(true); + when(mWindowManagerInternal.isKeyguardShowingAndNotOccluded()).thenReturn(false); mAttentionDetector = new TestableAttentionDetector(); mAttentionDetector.onWakefulnessChangeStarted(PowerManagerInternal.WAKEFULNESS_AWAKE); mAttentionDetector.setAttentionServiceSupported(true); @@ -116,6 +121,15 @@ public class AttentionDetectorTest extends AndroidTestCase { assertThat(mNextDimming).isEqualTo(when); } + @Test + public void testOnUserActivity_doesntCheckIfInLockscreen() { + when(mWindowManagerInternal.isKeyguardShowingAndNotOccluded()).thenReturn(true); + + long when = registerAttention(); + verify(mAttentionManagerInternal, never()).checkAttention(anyLong(), any()); + assertThat(mNextDimming).isEqualTo(when); + } + @Test public void testOnUserActivity_doesntCheckIfNotSufficientPermissions() { when(mPackageManager.checkPermission(any(), any())).thenReturn( @@ -299,6 +313,7 @@ public class AttentionDetectorTest extends AndroidTestCase { TestableAttentionDetector() { super(AttentionDetectorTest.this.mOnUserAttention, new Object()); mAttentionManager = mAttentionManagerInternal; + mWindowManager = mWindowManagerInternal; mPackageManager = AttentionDetectorTest.this.mPackageManager; mContentResolver = getContext().getContentResolver(); mMaximumExtensionMillis = 10000L; -- GitLab From 206fe56062a0fb47277c3ef90b9e4631a98378c4 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Fri, 31 May 2019 14:36:42 -0700 Subject: [PATCH 048/620] Disable bypass if there aren't enrolled faces Bug: 130327302 Test: manual Test: BiometricsUnlockControllerTest Change-Id: I699bae45a2a9ce21bdca5a9ca177c97a91ba5f5a --- .../keyguard/KeyguardSecurityContainer.java | 6 +++-- .../phone/KeyguardBypassController.kt | 24 +++++++++++-------- .../statusbar/phone/UnlockMethodCache.java | 13 ++++++---- .../phone/BiometricsUnlockControllerTest.java | 4 ++-- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index eef61dbb0949..b6f42df2ab3c 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -46,6 +46,7 @@ import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.systemui.Dependency; import com.android.systemui.SystemUIFactory; +import com.android.systemui.statusbar.phone.UnlockMethodCache; import com.android.systemui.util.InjectionInflationController; public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSecurityView { @@ -90,6 +91,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe private final SpringAnimation mSpringAnimation; private final VelocityTracker mVelocityTracker = VelocityTracker.obtain(); private final KeyguardUpdateMonitor mUpdateMonitor; + private final UnlockMethodCache mUnlockMethodCache; private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class); private float mLastTouchY = -1; @@ -129,6 +131,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe mSpringAnimation = new SpringAnimation(this, DynamicAnimation.Y); mInjectionInflationController = new InjectionInflationController( SystemUIFactory.getInstance().getRootComponent()); + mUnlockMethodCache = UnlockMethodCache.getInstance(context); mViewConfiguration = ViewConfiguration.get(context); } @@ -265,8 +268,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe */ private void updateBiometricRetry() { SecurityMode securityMode = getSecurityMode(); - int userId = KeyguardUpdateMonitor.getCurrentUser(); - mSwipeUpToRetry = mUpdateMonitor.isUnlockWithFacePossible(userId) + mSwipeUpToRetry = mUnlockMethodCache.isUnlockingWithFacePossible() && securityMode != SecurityMode.SimPin && securityMode != SecurityMode.SimPuk && securityMode != SecurityMode.None diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt index 5abf39e781f3..c9dd4613b946 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt @@ -29,9 +29,18 @@ import javax.inject.Singleton @Singleton class KeyguardBypassController { + /** + * If face unlock dismisses the lock screen or keeps user on keyguard for the current user. + */ + var bypassEnabled: Boolean = false + get() = field && unlockMethodCache.isUnlockingWithFacePossible + private set + + private val unlockMethodCache: UnlockMethodCache + @Inject - constructor(context: Context, - tunerService: TunerService) { + constructor(context: Context, tunerService: TunerService) { + unlockMethodCache = UnlockMethodCache.getInstance(context) val faceManager = context.getSystemService(FaceManager::class.java) if (faceManager?.isHardwareDetected != true) { return @@ -52,13 +61,8 @@ class KeyguardBypassController { } @VisibleForTesting - constructor(bypassEnabled: Boolean) { - this.bypassEnabled = bypassEnabled; + constructor(bypassEnabled: Boolean, unlockMethodCache: UnlockMethodCache) { + this.bypassEnabled = bypassEnabled + this.unlockMethodCache = unlockMethodCache } - - /** - * If face unlock dismisses the lock screen or keeps user on keyguard for the current user. - */ - var bypassEnabled: Boolean = false - private set } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java index 39bf7283e1be..78eb394e3336 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java @@ -16,18 +16,14 @@ package com.android.systemui.statusbar.phone; -import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.hardware.biometrics.BiometricSourceType; -import android.media.AudioManager; import android.os.Build; import android.os.Trace; -import android.telephony.TelephonyManager; -import com.android.internal.telephony.TelephonyIntents; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; @@ -55,6 +51,7 @@ public class UnlockMethodCache { private boolean mTrustManaged; private boolean mTrusted; private boolean mDebugUnlocked = false; + private boolean mIsUnlockingWithFacePossible; private UnlockMethodCache(Context ctx) { mLockPatternUtils = new LockPatternUtils(ctx); @@ -110,6 +107,10 @@ public class UnlockMethodCache { mListeners.remove(listener); } + public boolean isUnlockingWithFacePossible() { + return mIsUnlockingWithFacePossible; + } + private void update(boolean updateAlways) { Trace.beginSection("UnlockMethodCache#update"); int user = KeyguardUpdateMonitor.getCurrentUser(); @@ -118,13 +119,15 @@ public class UnlockMethodCache { || (Build.IS_DEBUGGABLE && DEBUG_AUTH_WITH_ADB && mDebugUnlocked); boolean trustManaged = mKeyguardUpdateMonitor.getUserTrustIsManaged(user); boolean trusted = mKeyguardUpdateMonitor.getUserHasTrust(user); + boolean hasEnrolledFaces = mKeyguardUpdateMonitor.isUnlockWithFacePossible(user); boolean changed = secure != mSecure || canSkipBouncer != mCanSkipBouncer || - trustManaged != mTrustManaged; + trustManaged != mTrustManaged || mIsUnlockingWithFacePossible != hasEnrolledFaces; if (changed || updateAlways) { mSecure = secure; mCanSkipBouncer = canSkipBouncer; mTrusted = trusted; mTrustManaged = trustManaged; + mIsUnlockingWithFacePossible = hasEnrolledFaces; notifyListeners(); } Trace.endSection(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java index fdc2cd3483ca..9b8d09e7aee8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java @@ -37,7 +37,6 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.statusbar.NotificationMediaManager; -import com.android.systemui.tuner.TunerService; import org.junit.Before; import org.junit.Test; @@ -79,6 +78,7 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { MockitoAnnotations.initMocks(this); when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true); when(mUpdateMonitor.isDeviceInteractive()).thenReturn(true); + when(mUnlockMethodCache.isUnlockingWithFacePossible()).thenReturn(true); mContext.addMockSystemService(PowerManager.class, mPowerManager); mDependency.injectTestDependency(NotificationMediaManager.class, mMediaManager); mDependency.injectTestDependency(StatusBarWindowController.class, @@ -191,7 +191,7 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { super(mContext, mDozeScrimController, mKeyguardViewMediator, mScrimController, mStatusBar, mUnlockMethodCache, mHandler, mUpdateMonitor, 0 /* wakeUpDelay */, - new KeyguardBypassController(faceDismissesKeyguard)); + new KeyguardBypassController(faceDismissesKeyguard, mUnlockMethodCache)); } } } -- GitLab From 6cf1277a827095e6c816bcf1c3185bde67adacb7 Mon Sep 17 00:00:00 2001 From: joshmccloskey Date: Thu, 30 May 2019 17:09:40 -0700 Subject: [PATCH 049/620] Fixed talkback issue Test: Flashed to device and verified that user can scroll past gray face icon when accessibility mode is enabled. Fixes: 132298701 Change-Id: I5412f21c8834118b15ef96bf8cf31d6c39326987 --- .../biometrics/BiometricDialogView.java | 33 ++++++++++++++++--- .../systemui/biometrics/FaceDialogView.java | 5 +++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java index 5717a54fd8a0..499fe8d47345 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java @@ -16,6 +16,8 @@ package com.android.systemui.biometrics; +import static android.view.accessibility.AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE; + import android.app.admin.DevicePolicyManager; import android.content.Context; import android.graphics.PixelFormat; @@ -36,6 +38,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; +import android.view.accessibility.AccessibilityEvent; import android.view.animation.Interpolator; import android.widget.Button; import android.widget.ImageView; @@ -280,6 +283,7 @@ public abstract class BiometricDialogView extends LinearLayout { final CharSequence subtitleText = mBundle.getCharSequence(BiometricPrompt.KEY_SUBTITLE); if (TextUtils.isEmpty(subtitleText)) { mSubtitleText.setVisibility(View.GONE); + announceAccessibilityEvent(); } else { mSubtitleText.setVisibility(View.VISIBLE); mSubtitleText.setText(subtitleText); @@ -289,6 +293,7 @@ public abstract class BiometricDialogView extends LinearLayout { mBundle.getCharSequence(BiometricPrompt.KEY_DESCRIPTION); if (TextUtils.isEmpty(descriptionText)) { mDescriptionText.setVisibility(View.GONE); + announceAccessibilityEvent(); } else { mDescriptionText.setVisibility(View.VISIBLE); mDescriptionText.setText(descriptionText); @@ -447,12 +452,14 @@ public abstract class BiometricDialogView extends LinearLayout { if (newState == STATE_PENDING_CONFIRMATION) { mHandler.removeMessages(MSG_RESET_MESSAGE); mErrorText.setVisibility(View.INVISIBLE); + announceAccessibilityEvent(); mPositiveButton.setVisibility(View.VISIBLE); mPositiveButton.setEnabled(true); } else if (newState == STATE_AUTHENTICATED) { mPositiveButton.setVisibility(View.GONE); mNegativeButton.setVisibility(View.GONE); mErrorText.setVisibility(View.INVISIBLE); + announceAccessibilityEvent(); } if (newState == STATE_PENDING_CONFIRMATION || newState == STATE_AUTHENTICATED) { @@ -471,14 +478,20 @@ public abstract class BiometricDialogView extends LinearLayout { public void restoreState(Bundle bundle) { mRestoredState = bundle; - mTryAgainButton.setVisibility(bundle.getInt(KEY_TRY_AGAIN_VISIBILITY)); - mPositiveButton.setVisibility(bundle.getInt(KEY_CONFIRM_VISIBILITY)); + final int tryAgainVisibility = bundle.getInt(KEY_TRY_AGAIN_VISIBILITY); + mTryAgainButton.setVisibility(tryAgainVisibility); + final int confirmVisibility = bundle.getInt(KEY_CONFIRM_VISIBILITY); + mPositiveButton.setVisibility(confirmVisibility); mState = bundle.getInt(KEY_STATE); mErrorText.setText(bundle.getCharSequence(KEY_ERROR_TEXT_STRING)); mErrorText.setContentDescription(bundle.getCharSequence(KEY_ERROR_TEXT_STRING)); - mErrorText.setVisibility(bundle.getInt(KEY_ERROR_TEXT_VISIBILITY)); + final int errorTextVisibility = bundle.getInt(KEY_ERROR_TEXT_VISIBILITY); + mErrorText.setVisibility(errorTextVisibility); + if (errorTextVisibility == View.INVISIBLE || tryAgainVisibility == View.INVISIBLE + || confirmVisibility == View.INVISIBLE) { + announceAccessibilityEvent(); + } mErrorText.setTextColor(bundle.getInt(KEY_ERROR_TEXT_COLOR)); - if (bundle.getBoolean(KEY_ERROR_TEXT_IS_TEMPORARY)) { mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_RESET_MESSAGE), BiometricPrompt.HIDE_DIALOG_DELAY); @@ -501,4 +514,16 @@ public abstract class BiometricDialogView extends LinearLayout { lp.token = mWindowToken; return lp; } + + // Every time a view becomes invisible we need to announce an accessibility event. + // This is due to an issue in the framework, b/132298701 recommended this workaround. + protected void announceAccessibilityEvent() { + AccessibilityEvent event = AccessibilityEvent.obtain(); + event.setEventType(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); + event.setContentChangeTypes(CONTENT_CHANGE_TYPE_SUBTREE); + mDialog.sendAccessibilityEventUnchecked(event); + mDialog.notifySubtreeAccessibilityStateChanged(mDialog, mDialog, + CONTENT_CHANGE_TYPE_SUBTREE); + event.recycle(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java index 8f26f1847779..91124cb443be 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java @@ -149,6 +149,7 @@ public class FaceDialogView extends BiometricDialogView { private final Runnable mErrorToIdleAnimationRunnable = () -> { updateState(STATE_IDLE); mErrorText.setVisibility(View.INVISIBLE); + announceAccessibilityEvent(); }; public FaceDialogView(Context context, @@ -188,6 +189,7 @@ public class FaceDialogView extends BiometricDialogView { mDialog.invalidateOutline(); mSize = newSize; + announceAccessibilityEvent(); } else if (mSize == SIZE_SMALL && newSize == SIZE_BIG) { mSize = SIZE_GROWING; @@ -294,6 +296,7 @@ public class FaceDialogView extends BiometricDialogView { mErrorText.setVisibility(View.VISIBLE); } else { mErrorText.setVisibility(View.INVISIBLE); + announceAccessibilityEvent(); } } @@ -368,11 +371,13 @@ public class FaceDialogView extends BiometricDialogView { mTryAgainButton.setVisibility(View.VISIBLE); } else { mTryAgainButton.setVisibility(View.GONE); + announceAccessibilityEvent(); } } if (show) { mPositiveButton.setVisibility(View.GONE); + announceAccessibilityEvent(); } } -- GitLab From 10a8b519f30b3f9a07185298fe84d8bc47a4d829 Mon Sep 17 00:00:00 2001 From: Amin Shaikh Date: Mon, 3 Jun 2019 15:58:02 -0400 Subject: [PATCH 050/620] Update themed icons. Fixes: 132808864 Fixes: 131238809 Test: mp droid; manually check icons Change-Id: Idffc547c971c90031f14dc0b2fa1b6337586e61f --- core/res/res/drawable/ic_qs_ui_mode_night.xml | 8 +-- .../res/values/overlayable_icons_test.xml | 1 + .../res/values/overlayable_icons_test.xml | 2 + .../res/drawable/ic_qs_ui_mode_night.xml | 27 ++++++++ .../res/drawable/ic_scan_24dp.xml | 55 +++++++++++++++++ .../res/drawable/ic_volume_odi_captions.xml | 51 ++++++++++++++++ .../ic_volume_odi_captions_disabled.xml | 56 +++++++++++++++++ .../res/drawable/ic_bluetooth_share_icon.xml | 2 +- .../res/drawable/ic_qs_ui_mode_night.xml | 25 ++++++++ .../res/drawable/ic_settings_bluetooth.xml | 2 +- .../res/drawable/ic_scan_24dp.xml | 27 ++++++++ .../res/drawable/ic_volume_odi_captions.xml | 31 ++++++++++ .../ic_volume_odi_captions_disabled.xml | 29 +++++++++ .../res/drawable/ic_qs_ui_mode_night.xml | 27 ++++++++ .../res/drawable/ic_find_in_page_24px.xml | 2 +- .../res/drawable/ic_scan_24dp.xml | 55 +++++++++++++++++ .../res/drawable/ic_volume_odi_captions.xml | 51 ++++++++++++++++ .../ic_volume_odi_captions_disabled.xml | 61 +++++++++++++++++++ 18 files changed, 505 insertions(+), 7 deletions(-) create mode 100644 packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml create mode 100644 packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_scan_24dp.xml create mode 100644 packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml create mode 100644 packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml create mode 100644 packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml create mode 100644 packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_scan_24dp.xml create mode 100644 packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml create mode 100644 packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml create mode 100644 packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml create mode 100644 packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_scan_24dp.xml create mode 100644 packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml create mode 100644 packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml diff --git a/core/res/res/drawable/ic_qs_ui_mode_night.xml b/core/res/res/drawable/ic_qs_ui_mode_night.xml index 72278272e330..34b535bd40c3 100644 --- a/core/res/res/drawable/ic_qs_ui_mode_night.xml +++ b/core/res/res/drawable/ic_qs_ui_mode_night.xml @@ -15,11 +15,11 @@ ~ limitations under the License --> - \ No newline at end of file + diff --git a/core/tests/coretests/res/values/overlayable_icons_test.xml b/core/tests/coretests/res/values/overlayable_icons_test.xml index 285db5005187..ce209ce90905 100644 --- a/core/tests/coretests/res/values/overlayable_icons_test.xml +++ b/core/tests/coretests/res/values/overlayable_icons_test.xml @@ -48,6 +48,7 @@ @*android:drawable/ic_qs_dnd @*android:drawable/ic_qs_flashlight @*android:drawable/ic_qs_night_display_on + @*android:drawable/ic_qs_ui_mode_night @*android:drawable/ic_restart @*android:drawable/ic_screenshot @*android:drawable/ic_settings_bluetooth diff --git a/packages/SystemUI/tests/res/values/overlayable_icons_test.xml b/packages/SystemUI/tests/res/values/overlayable_icons_test.xml index ba651ac82dc9..24cd8cb23ed8 100644 --- a/packages/SystemUI/tests/res/values/overlayable_icons_test.xml +++ b/packages/SystemUI/tests/res/values/overlayable_icons_test.xml @@ -59,6 +59,8 @@ @drawable/ic_volume_bt_sco @drawable/ic_volume_media @drawable/ic_volume_media_mute + @drawable/ic_volume_odi_captions + @drawable/ic_volume_odi_captions_disabled @drawable/ic_volume_ringer @drawable/ic_volume_ringer_mute @drawable/ic_volume_ringer_vibrate diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml new file mode 100644 index 000000000000..3cf7541219f0 --- /dev/null +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_scan_24dp.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_scan_24dp.xml new file mode 100644 index 000000000000..f160fe9cdd1e --- /dev/null +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_scan_24dp.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml new file mode 100644 index 000000000000..e210bcb04849 --- /dev/null +++ b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml new file mode 100644 index 000000000000..660f64a8cead --- /dev/null +++ b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_bluetooth_share_icon.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_bluetooth_share_icon.xml index df79827ce624..8ff3c1cf06f5 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_bluetooth_share_icon.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_bluetooth_share_icon.xml @@ -22,5 +22,5 @@ android:width="24dp" > + android:pathData="M13.51,12l3.75-3.74c0.41-0.41,0.41-1.07,0-1.48l-4.47-4.47l-0.03-0.03c-0.42-0.39-1.08-0.37-1.48,0.05 C11.1,2.52,11,2.78,11,3.04v6.44L6.95,5.43c-0.41-0.41-1.06-0.41-1.47,0c-0.41,0.41-0.41,1.06,0,1.47l5.09,5.1l-5.09,5.09 c-0.41,0.41-0.41,1.06,0,1.47c0.41,0.41,1.06,0.41,1.47,0L11,14.51v6.45c0,0.57,0.47,1.04,1.04,1.04c0.26,0,0.52-0.1,0.71-0.28 l0.05-0.05l4.46-4.46c0.41-0.41,0.41-1.07,0-1.48L13.51,12z M12.99,5.37l2.15,2.15l-2.15,2.15V5.37z M12.99,18.62v-4.3l2.15,2.15 L12.99,18.62z" /> \ No newline at end of file diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml new file mode 100644 index 000000000000..5eea8895aaa1 --- /dev/null +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_settings_bluetooth.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_settings_bluetooth.xml index 58800c8d29be..18a60d82faed 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_settings_bluetooth.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_settings_bluetooth.xml @@ -22,5 +22,5 @@ android:width="24dp" > + android:pathData="M13.51,12l3.75-3.74c0.41-0.41,0.41-1.07,0-1.48l-4.47-4.47l-0.03-0.03c-0.42-0.39-1.08-0.37-1.48,0.05 C11.1,2.52,11,2.78,11,3.04v6.44L6.95,5.43c-0.41-0.41-1.06-0.41-1.47,0c-0.41,0.41-0.41,1.06,0,1.47l5.09,5.1l-5.09,5.09 c-0.41,0.41-0.41,1.06,0,1.47c0.41,0.41,1.06,0.41,1.47,0L11,14.51v6.45c0,0.57,0.47,1.04,1.04,1.04c0.26,0,0.52-0.1,0.71-0.28 l0.05-0.05l4.46-4.46c0.41-0.41,0.41-1.07,0-1.48L13.51,12z M12.99,5.37l2.15,2.15l-2.15,2.15V5.37z M12.99,18.62v-4.3l2.15,2.15 L12.99,18.62z" /> \ No newline at end of file diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_scan_24dp.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_scan_24dp.xml new file mode 100644 index 000000000000..146e20fc68d0 --- /dev/null +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_scan_24dp.xml @@ -0,0 +1,27 @@ + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml new file mode 100644 index 000000000000..42ef41cfe9c0 --- /dev/null +++ b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml @@ -0,0 +1,31 @@ + + + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml new file mode 100644 index 000000000000..f164ba877096 --- /dev/null +++ b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml @@ -0,0 +1,29 @@ + + + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml new file mode 100644 index 000000000000..3cf7541219f0 --- /dev/null +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_find_in_page_24px.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_find_in_page_24px.xml index a54c0f080b5e..36d5c7cf4cbf 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_find_in_page_24px.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_find_in_page_24px.xml @@ -26,7 +26,7 @@ \ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_scan_24dp.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_scan_24dp.xml new file mode 100644 index 000000000000..3d79f7946b31 --- /dev/null +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_scan_24dp.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml new file mode 100644 index 000000000000..ad79132bb0f8 --- /dev/null +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml new file mode 100644 index 000000000000..2ea41f22943a --- /dev/null +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + \ No newline at end of file -- GitLab From 6418e974a13aa580de3827caec72bab83837ea22 Mon Sep 17 00:00:00 2001 From: Govinda Wasserman Date: Mon, 3 Jun 2019 12:37:43 -0400 Subject: [PATCH 051/620] Refactors logging into its own function This will allow logging behavior to be overridden. Test: Tested locally BUG:128982146 Change-Id: Iaabc4ad0b44147732e05b4b9317e49bcee91683d --- .../android/systemui/assist/AssistManager.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java index 67fcd68339e2..c7c10f1c2211 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java @@ -259,11 +259,7 @@ public class AssistManager implements ConfigurationChangedReceiver { int phoneState = mPhoneStateMonitor.getPhoneState(); args.putInt(INVOCATION_PHONE_STATE_KEY, phoneState); args.putLong(INVOCATION_TIME_MS_KEY, SystemClock.uptimeMillis()); - // Logs assistant start with invocation type. - MetricsLogger.action( - new LogMaker(MetricsEvent.ASSISTANT) - .setType(MetricsEvent.TYPE_OPEN) - .setSubtype(toLoggingSubType(invocationType, phoneState))); + logStartAssist(invocationType, phoneState); startAssistInternal(args, assistComponent, isService); } @@ -449,7 +445,14 @@ public class AssistManager implements ConfigurationChangedReceiver { return toLoggingSubType(invocationType, mPhoneStateMonitor.getPhoneState()); } - private int toLoggingSubType(int invocationType, int phoneState) { + protected void logStartAssist(int invocationType, int phoneState) { + MetricsLogger.action( + new LogMaker(MetricsEvent.ASSISTANT) + .setType(MetricsEvent.TYPE_OPEN) + .setSubtype(toLoggingSubType(invocationType, phoneState))); + } + + protected final int toLoggingSubType(int invocationType, int phoneState) { // Note that this logic will break if the number of Assistant invocation types exceeds 7. // There are currently 5 invocation types, but we will be migrating to the new logging // framework in the next update. -- GitLab From 2f33abb673e0d6b38d982cd0eeeccc6573b9c69d Mon Sep 17 00:00:00 2001 From: Robert Snoeberger Date: Mon, 3 Jun 2019 17:33:09 -0400 Subject: [PATCH 052/620] Prevent clock-lock overlap with pulsing on AOD. Bug: 133458665 Test: manual Change-Id: I807577e52fdc372ba98114061f3c4bb533a0404d --- .../src/com/android/keyguard/clock/SmallClockPosition.java | 3 ++- .../statusbar/phone/KeyguardClockPositionAlgorithm.java | 4 ++-- .../com/android/keyguard/clock/SmallClockPositionTest.kt | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/clock/SmallClockPosition.java b/packages/SystemUI/src/com/android/keyguard/clock/SmallClockPosition.java index 9b15dc6d5063..60ca945278f6 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/SmallClockPosition.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/SmallClockPosition.java @@ -67,7 +67,8 @@ class SmallClockPosition { */ int getPreferredY() { // On AOD, clock needs to appear below the status bar with enough room for pixel shifting - int aodY = mStatusBarHeight + mKeyguardLockPadding + mBurnInOffsetY; + int aodY = mStatusBarHeight + mKeyguardLockHeight + 2 * mKeyguardLockPadding + + mBurnInOffsetY; // On lock screen, clock needs to appear below the lock icon int lockY = mStatusBarHeight + mKeyguardLockHeight + 2 * mKeyguardLockPadding; return (int) MathUtils.lerp(lockY, aodY, mDarkAmount); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java index 579d1abe7650..c477162ca761 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java @@ -176,7 +176,7 @@ public class KeyguardClockPositionAlgorithm { } private int getExpandedPreferredClockY() { - return (mHasCustomClock && !mHasVisibleNotifs) ? getPreferredClockY() + return (mHasCustomClock && (!mHasVisibleNotifs || mPositionLikeDark)) ? getPreferredClockY() : getExpandedClockPosition(); } @@ -218,7 +218,7 @@ public class KeyguardClockPositionAlgorithm { float clockY = MathUtils.lerp(clockYBouncer, clockYRegular, shadeExpansion); clockYDark = MathUtils.lerp(clockYBouncer, clockYDark, shadeExpansion); - float darkAmount = mPositionLikeDark ? 1.0f : mDarkAmount; + float darkAmount = mPositionLikeDark && !mHasCustomClock ? 1.0f : mDarkAmount; return (int) (MathUtils.lerp(clockY, clockYDark, darkAmount) + mEmptyDragAmount); } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/SmallClockPositionTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/clock/SmallClockPositionTest.kt index f4d59ccb372e..456f32b4bd40 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/clock/SmallClockPositionTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/SmallClockPositionTest.kt @@ -52,8 +52,8 @@ class SmallClockPositionTest : SysuiTestCase() { fun darkPosition() { // GIVEN on AOD position.setDarkAmount(1f) - // THEN Y position is statusBarHeight + lockPadding + burnInY (100 + 15 + 20 = 135) - assertThat(position.preferredY).isEqualTo(135) + // THEN Y is sum of statusBarHeight, lockPadding, lockHeight, lockPadding, burnInY + assertThat(position.preferredY).isEqualTo(185) } @Test @@ -64,4 +64,4 @@ class SmallClockPositionTest : SysuiTestCase() { // (100 + 15 + 35 + 15 = 165) assertThat(position.preferredY).isEqualTo(165) } -} \ No newline at end of file +} -- GitLab From 53ceaf677afad7852903f847c75fb786dcdb3848 Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Tue, 4 Jun 2019 16:21:46 +0000 Subject: [PATCH 053/620] DO NOT MERGE Revert "DO NOT MERGE Remove Privacy Indicators" This reverts commit ec3e0ecacaa659d06e520d207d8e817b7563bfcb. Reason for revert: Re-enable Privacy Indicators in qt-r1-dev Bug: 133257910 Change-Id: I7c778dd76c0aff3f483cf06f1dd96fd067145c12 --- .../sysui/SystemUiDeviceConfigFlags.java | 7 + .../SystemUI/res/drawable/privacy_chip_bg.xml | 23 ++ .../res/layout/ongoing_privacy_chip.xml | 41 +++ .../res/layout/ongoing_privacy_text_item.xml | 24 ++ .../quick_status_bar_header_system_icons.xml | 27 ++ .../src/com/android/systemui/Dependency.java | 3 + .../systemui/appops/AppOpsControllerImpl.java | 65 +++- .../systemui/privacy/OngoingPrivacyChip.kt | 110 +++++++ .../systemui/privacy/PrivacyDialogBuilder.kt | 56 ++++ .../android/systemui/privacy/PrivacyItem.kt | 80 +++++ .../systemui/privacy/PrivacyItemController.kt | 294 ++++++++++++++++++ .../systemui/qs/QuickStatusBarHeader.java | 127 +++++++- .../statusbar/phone/PhoneStatusBarPolicy.java | 64 +++- .../systemui/appops/AppOpsControllerTest.java | 23 ++ .../privacy/PrivacyDialogBuilderTest.kt | 77 +++++ .../privacy/PrivacyItemControllerTest.kt | 293 +++++++++++++++++ 16 files changed, 1305 insertions(+), 9 deletions(-) create mode 100644 packages/SystemUI/res/drawable/privacy_chip_bg.xml create mode 100644 packages/SystemUI/res/layout/ongoing_privacy_chip.xml create mode 100644 packages/SystemUI/res/layout/ongoing_privacy_text_item.xml create mode 100644 packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyChip.kt create mode 100644 packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogBuilder.kt create mode 100644 packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt create mode 100644 packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt create mode 100644 packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogBuilderTest.kt create mode 100644 packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 9b3fb0b8a3e8..f1a1d44ea58b 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -106,6 +106,13 @@ public final class SystemUiDeviceConfigFlags { */ public static final String HASH_SALT_MAX_DAYS = "hash_salt_max_days"; + // Flag related to Privacy Indicators + + /** + * Whether the Permissions Hub is showing. + */ + public static final String PROPERTY_PERMISSIONS_HUB_ENABLED = "permissions_hub_enabled"; + // Flags related to Assistant Handles /** diff --git a/packages/SystemUI/res/drawable/privacy_chip_bg.xml b/packages/SystemUI/res/drawable/privacy_chip_bg.xml new file mode 100644 index 000000000000..b7b21fa53b62 --- /dev/null +++ b/packages/SystemUI/res/drawable/privacy_chip_bg.xml @@ -0,0 +1,23 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/layout/ongoing_privacy_chip.xml b/packages/SystemUI/res/layout/ongoing_privacy_chip.xml new file mode 100644 index 000000000000..dce9ce16e9cd --- /dev/null +++ b/packages/SystemUI/res/layout/ongoing_privacy_chip.xml @@ -0,0 +1,41 @@ + + + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/layout/ongoing_privacy_text_item.xml b/packages/SystemUI/res/layout/ongoing_privacy_text_item.xml new file mode 100644 index 000000000000..5595b130e041 --- /dev/null +++ b/packages/SystemUI/res/layout/ongoing_privacy_text_item.xml @@ -0,0 +1,24 @@ + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml index 54fb2168dfa9..cd9f780ca249 100644 --- a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml +++ b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml @@ -22,11 +22,19 @@ android:layout_height="@*android:dimen/quick_qs_offset_height" android:clipChildren="false" android:clipToPadding="false" + android:gravity="center" android:orientation="horizontal" android:clickable="true" android:paddingStart="@dimen/status_bar_padding_start" android:paddingEnd="@dimen/status_bar_padding_end" > + + + + + + + + + + + diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index 9f4a4e08bbfd..7a82402fda13 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -48,6 +48,7 @@ import com.android.systemui.plugins.VolumeDialogController; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.power.EnhancedEstimates; import com.android.systemui.power.PowerUI; +import com.android.systemui.privacy.PrivacyItemController; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.shared.system.ActivityManagerWrapper; @@ -286,6 +287,7 @@ public class Dependency extends SystemUI { @Inject Lazy mSensorPrivacyManager; @Inject Lazy mAutoHideController; @Inject Lazy mForegroundServiceNotificationListener; + @Inject Lazy mPrivacyItemController; @Inject @Named(BG_LOOPER_NAME) Lazy mBgLooper; @Inject @Named(BG_HANDLER_NAME) Lazy mBgHandler; @Inject @Named(MAIN_HANDLER_NAME) Lazy mMainHandler; @@ -470,6 +472,7 @@ public class Dependency extends SystemUI { mProviders.put(ForegroundServiceNotificationListener.class, mForegroundServiceNotificationListener::get); mProviders.put(ClockManager.class, mClockManager::get); + mProviders.put(PrivacyItemController.class, mPrivacyItemController::get); mProviders.put(ActivityManagerWrapper.class, mActivityManagerWrapper::get); mProviders.put(DevicePolicyManagerWrapper.class, mDevicePolicyManagerWrapper::get); mProviders.put(PackageManagerWrapper.class, mPackageManagerWrapper::get); diff --git a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java index afb8e7421412..49bd5bd09220 100644 --- a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java @@ -20,6 +20,7 @@ import static com.android.systemui.Dependency.BG_LOOPER_NAME; import android.app.AppOpsManager; import android.content.Context; +import android.content.pm.PackageManager; import android.os.Handler; import android.os.Looper; import android.os.UserHandle; @@ -209,6 +210,59 @@ public class AppOpsControllerImpl implements AppOpsController, mBGHandler.scheduleRemoval(item, NOTED_OP_TIME_DELAY_MS); } + /** + * Does the app-op code refer to a user sensitive permission for the specified user id + * and package. Only user sensitive permission should be shown to the user by default. + * + * @param appOpCode The code of the app-op. + * @param uid The uid of the user. + * @param packageName The name of the package. + * + * @return {@code true} iff the app-op item is user sensitive + */ + private boolean isUserSensitive(int appOpCode, int uid, String packageName) { + String permission = AppOpsManager.opToPermission(appOpCode); + if (permission == null) { + return false; + } + int permFlags = mContext.getPackageManager().getPermissionFlags(permission, + packageName, UserHandle.getUserHandleForUid(uid)); + return (permFlags & PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED) != 0; + } + + /** + * Does the app-op item refer to an operation that should be shown to the user. + * Only specficic ops (like SYSTEM_ALERT_WINDOW) or ops that refer to user sensitive + * permission should be shown to the user by default. + * + * @param item The item + * + * @return {@code true} iff the app-op item should be shown to the user + */ + private boolean isUserVisible(AppOpItem item) { + return isUserVisible(item.getCode(), item.getUid(), item.getPackageName()); + } + + + /** + * Does the app-op, uid and package name, refer to an operation that should be shown to the + * user. Only specficic ops (like {@link AppOpsManager.OP_SYSTEM_ALERT_WINDOW}) or + * ops that refer to user sensitive permission should be shown to the user by default. + * + * @param item The item + * + * @return {@code true} iff the app-op for should be shown to the user + */ + private boolean isUserVisible(int appOpCode, int uid, String packageName) { + // currently OP_SYSTEM_ALERT_WINDOW does not correspond to a platform permission + // which may be user senstive, so for now always show it to the user. + if (appOpCode == AppOpsManager.OP_SYSTEM_ALERT_WINDOW) { + return true; + } + + return isUserSensitive(appOpCode, uid, packageName); + } + /** * Returns a copy of the list containing all the active AppOps that the controller tracks. * @@ -232,8 +286,8 @@ public class AppOpsControllerImpl implements AppOpsController, final int numActiveItems = mActiveItems.size(); for (int i = 0; i < numActiveItems; i++) { AppOpItem item = mActiveItems.get(i); - if ((userId == UserHandle.USER_ALL - || UserHandle.getUserId(item.getUid()) == userId)) { + if ((userId == UserHandle.USER_ALL || UserHandle.getUserId(item.getUid()) == userId) + && isUserVisible(item)) { list.add(item); } } @@ -242,8 +296,8 @@ public class AppOpsControllerImpl implements AppOpsController, final int numNotedItems = mNotedItems.size(); for (int i = 0; i < numNotedItems; i++) { AppOpItem item = mNotedItems.get(i); - if ((userId == UserHandle.USER_ALL - || UserHandle.getUserId(item.getUid()) == userId)) { + if ((userId == UserHandle.USER_ALL || UserHandle.getUserId(item.getUid()) == userId) + && isUserVisible(item)) { list.add(item); } } @@ -269,7 +323,8 @@ public class AppOpsControllerImpl implements AppOpsController, } private void notifySuscribers(int code, int uid, String packageName, boolean active) { - if (mCallbacksByCode.containsKey(code)) { + if (mCallbacksByCode.containsKey(code) + && isUserVisible(code, uid, packageName)) { for (Callback cb: mCallbacksByCode.get(code)) { cb.onActiveStateChanged(code, uid, packageName, active); } diff --git a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyChip.kt b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyChip.kt new file mode 100644 index 000000000000..a5a915b88cad --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyChip.kt @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2018 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.privacy + +import android.content.Context +import android.util.AttributeSet +import android.view.Gravity +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.LinearLayout +import com.android.systemui.R + +class OngoingPrivacyChip @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttrs: Int = 0, + defStyleRes: Int = 0 +) : LinearLayout(context, attrs, defStyleAttrs, defStyleRes) { + + private val iconMarginExpanded = context.resources.getDimensionPixelSize( + R.dimen.ongoing_appops_chip_icon_margin_expanded) + private val iconMarginCollapsed = context.resources.getDimensionPixelSize( + R.dimen.ongoing_appops_chip_icon_margin_collapsed) + private val iconSize = + context.resources.getDimensionPixelSize(R.dimen.ongoing_appops_chip_icon_size) + private val iconColor = context.resources.getColor( + R.color.status_bar_clock_color, context.theme) + private val sidePadding = + context.resources.getDimensionPixelSize(R.dimen.ongoing_appops_chip_side_padding) + private val backgroundDrawable = context.getDrawable(R.drawable.privacy_chip_bg) + private lateinit var iconsContainer: LinearLayout + private lateinit var back: FrameLayout + var expanded = false + set(value) { + if (value != field) { + field = value + updateView() + } + } + + var builder = PrivacyDialogBuilder(context, emptyList()) + var privacyList = emptyList() + set(value) { + field = value + builder = PrivacyDialogBuilder(context, value) + updateView() + } + + override fun onFinishInflate() { + super.onFinishInflate() + + back = findViewById(R.id.background) + iconsContainer = findViewById(R.id.icons_container) + } + + // Should only be called if the builder icons or app changed + private fun updateView() { + back.background = if (expanded) backgroundDrawable else null + val padding = if (expanded) sidePadding else 0 + back.setPaddingRelative(padding, 0, padding, 0) + fun setIcons(dialogBuilder: PrivacyDialogBuilder, iconsContainer: ViewGroup) { + iconsContainer.removeAllViews() + dialogBuilder.generateIcons().forEachIndexed { i, it -> + it.mutate() + it.setTint(iconColor) + val image = ImageView(context).apply { + setImageDrawable(it) + scaleType = ImageView.ScaleType.CENTER_INSIDE + } + iconsContainer.addView(image, iconSize, iconSize) + if (i != 0) { + val lp = image.layoutParams as MarginLayoutParams + lp.marginStart = if (expanded) iconMarginExpanded else iconMarginCollapsed + image.layoutParams = lp + } + } + } + + if (!privacyList.isEmpty()) { + generateContentDescription() + setIcons(builder, iconsContainer) + val lp = iconsContainer.layoutParams as FrameLayout.LayoutParams + lp.gravity = Gravity.CENTER_VERTICAL or + (if (expanded) Gravity.CENTER_HORIZONTAL else Gravity.END) + iconsContainer.layoutParams = lp + } else { + iconsContainer.removeAllViews() + } + requestLayout() + } + + private fun generateContentDescription() { + val typesText = builder.joinTypes() + contentDescription = context.getString( + R.string.ongoing_privacy_chip_content_multiple_apps, typesText) + } +} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogBuilder.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogBuilder.kt new file mode 100644 index 000000000000..d08a3733703b --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyDialogBuilder.kt @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2018 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.privacy + +import android.content.Context +import android.graphics.drawable.Drawable +import com.android.systemui.R + +class PrivacyDialogBuilder(private val context: Context, itemsList: List) { + + val appsAndTypes: List>> + val types: List + private val separator = context.getString(R.string.ongoing_privacy_dialog_separator) + private val lastSeparator = context.getString(R.string.ongoing_privacy_dialog_last_separator) + + init { + appsAndTypes = itemsList.groupBy({ it.application }, { it.privacyType }) + .toList() + .sortedWith(compareBy({ -it.second.size }, // Sort by number of AppOps + { it.second.min() })) // Sort by "smallest" AppOpp (Location is largest) + types = itemsList.map { it.privacyType }.distinct().sorted() + } + + fun generateIconsForApp(types: List): List { + return types.sorted().map { it.getIcon(context) } + } + + fun generateIcons() = types.map { it.getIcon(context) } + + private fun List.joinWithAnd(): StringBuilder { + return subList(0, size - 1).joinTo(StringBuilder(), separator = separator).apply { + append(lastSeparator) + append(this@joinWithAnd.last()) + } + } + + fun joinTypes(): String { + return when (types.size) { + 0 -> "" + 1 -> types[0].getName(context) + else -> types.map { it.getName(context) }.joinWithAnd().toString() + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt new file mode 100644 index 000000000000..290942412eed --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2018 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.privacy + +import android.content.Context +import android.content.pm.ApplicationInfo +import android.content.pm.PackageManager +import android.graphics.drawable.Drawable +import android.os.UserHandle +import android.util.IconDrawableFactory +import com.android.systemui.R + +typealias Privacy = PrivacyType + +enum class PrivacyType(private val nameId: Int, val iconId: Int) { + // This is uses the icons used by the corresponding permission groups in the AndroidManifest + TYPE_CAMERA(R.string.privacy_type_camera, + com.android.internal.R.drawable.perm_group_camera), + TYPE_MICROPHONE(R.string.privacy_type_microphone, + com.android.internal.R.drawable.perm_group_microphone), + TYPE_LOCATION(R.string.privacy_type_location, + com.android.internal.R.drawable.perm_group_location); + + fun getName(context: Context) = context.resources.getString(nameId) + + fun getIcon(context: Context) = context.resources.getDrawable(iconId, context.theme) +} + +data class PrivacyItem( + val privacyType: PrivacyType, + val application: PrivacyApplication +) + +data class PrivacyApplication(val packageName: String, val uid: Int, val context: Context) + : Comparable { + + override fun compareTo(other: PrivacyApplication): Int { + return applicationName.compareTo(other.applicationName) + } + + private val applicationInfo: ApplicationInfo? by lazy { + try { + val userHandle = UserHandle.getUserHandleForUid(uid) + context.createPackageContextAsUser(packageName, 0, userHandle).getPackageManager() + .getApplicationInfo(packageName, 0) + } catch (_: PackageManager.NameNotFoundException) { + null + } + } + val icon: Drawable by lazy { + applicationInfo?.let { + try { + val iconFactory = IconDrawableFactory.newInstance(context, true) + iconFactory.getBadgedIcon(it, UserHandle.getUserId(uid)) + } catch (_: Exception) { + null + } + } ?: context.getDrawable(android.R.drawable.sym_def_app_icon) + } + + val applicationName: String by lazy { + applicationInfo?.let { + context.packageManager.getApplicationLabel(it) as String + } ?: packageName + } + + override fun toString() = "PrivacyApplication(packageName=$packageName, uid=$uid)" +} diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt new file mode 100644 index 000000000000..82a2c1fb43fb --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt @@ -0,0 +1,294 @@ +/* + * Copyright (C) 2018 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.privacy + +import android.app.ActivityManager +import android.app.AppOpsManager +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Handler +import android.os.Looper +import android.os.Message +import android.os.UserHandle +import android.os.UserManager +import android.provider.DeviceConfig +import com.android.internal.annotations.VisibleForTesting +import com.android.internal.config.sysui.SystemUiDeviceConfigFlags +import com.android.systemui.Dependency.BG_HANDLER_NAME +import com.android.systemui.Dependency.MAIN_HANDLER_NAME +import com.android.systemui.R +import com.android.systemui.appops.AppOpItem +import com.android.systemui.appops.AppOpsController +import com.android.systemui.Dumpable +import java.io.FileDescriptor +import java.io.PrintWriter +import java.lang.ref.WeakReference +import javax.inject.Inject +import javax.inject.Named +import javax.inject.Singleton + +fun isPermissionsHubEnabled() = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, + SystemUiDeviceConfigFlags.PROPERTY_PERMISSIONS_HUB_ENABLED, false) + +@Singleton +class PrivacyItemController @Inject constructor( + val context: Context, + private val appOpsController: AppOpsController, + @Named(MAIN_HANDLER_NAME) private val uiHandler: Handler, + @Named(BG_HANDLER_NAME) private val bgHandler: Handler +) : Dumpable { + + @VisibleForTesting + internal companion object { + val OPS = intArrayOf(AppOpsManager.OP_CAMERA, + AppOpsManager.OP_RECORD_AUDIO, + AppOpsManager.OP_COARSE_LOCATION, + AppOpsManager.OP_FINE_LOCATION) + val intents = listOf(Intent.ACTION_USER_FOREGROUND, + Intent.ACTION_MANAGED_PROFILE_ADDED, + Intent.ACTION_MANAGED_PROFILE_REMOVED) + const val TAG = "PrivacyItemController" + const val SYSTEM_UID = 1000 + const val MSG_ADD_CALLBACK = 0 + const val MSG_REMOVE_CALLBACK = 1 + const val MSG_UPDATE_LISTENING_STATE = 2 + } + + @VisibleForTesting + internal var privacyList = emptyList() + @Synchronized get() = field.toList() // Returns a shallow copy of the list + @Synchronized set + + private val userManager = context.getSystemService(UserManager::class.java) + private var currentUserIds = emptyList() + private var listening = false + val systemApp = + PrivacyApplication(context.getString(R.string.device_services), SYSTEM_UID, context) + private val callbacks = mutableListOf>() + private val messageHandler = H(WeakReference(this), uiHandler.looper) + + private val notifyChanges = Runnable { + val list = privacyList + callbacks.forEach { it.get()?.privacyChanged(list) } + } + + private val updateListAndNotifyChanges = Runnable { + updatePrivacyList() + uiHandler.post(notifyChanges) + } + + private var indicatorsAvailable = isPermissionsHubEnabled() + @VisibleForTesting + internal val devicePropertyChangedListener = + object : DeviceConfig.OnPropertyChangedListener { + override fun onPropertyChanged(namespace: String, name: String, value: String?) { + if (DeviceConfig.NAMESPACE_PRIVACY.equals(namespace) && + SystemUiDeviceConfigFlags.PROPERTY_PERMISSIONS_HUB_ENABLED.equals(name)) { + indicatorsAvailable = java.lang.Boolean.parseBoolean(value) + messageHandler.removeMessages(MSG_UPDATE_LISTENING_STATE) + messageHandler.sendEmptyMessage(MSG_UPDATE_LISTENING_STATE) + } + } + } + + private val cb = object : AppOpsController.Callback { + override fun onActiveStateChanged( + code: Int, + uid: Int, + packageName: String, + active: Boolean + ) { + val userId = UserHandle.getUserId(uid) + if (userId in currentUserIds) { + update(false) + } + } + } + + @VisibleForTesting + internal var userSwitcherReceiver = Receiver() + set(value) { + context.unregisterReceiver(field) + field = value + registerReceiver() + } + + init { + DeviceConfig.addOnPropertyChangedListener( + DeviceConfig.NAMESPACE_PRIVACY, context.mainExecutor, devicePropertyChangedListener) + } + + private fun unregisterReceiver() { + context.unregisterReceiver(userSwitcherReceiver) + } + + private fun registerReceiver() { + context.registerReceiverAsUser(userSwitcherReceiver, UserHandle.ALL, IntentFilter().apply { + intents.forEach { + addAction(it) + } + }, null, null) + } + + private fun update(updateUsers: Boolean) { + if (updateUsers) { + val currentUser = ActivityManager.getCurrentUser() + currentUserIds = userManager.getProfiles(currentUser).map { it.id } + } + bgHandler.post(updateListAndNotifyChanges) + } + + /** + * Updates listening status based on whether there are callbacks and the indicators are enabled + * + * This is only called from private (add/remove)Callback and from the config listener, all in + * main thread. + */ + private fun setListeningState() { + val listen = !callbacks.isEmpty() and indicatorsAvailable + if (listening == listen) return + listening = listen + if (listening) { + appOpsController.addCallback(OPS, cb) + registerReceiver() + update(true) + } else { + appOpsController.removeCallback(OPS, cb) + unregisterReceiver() + // Make sure that we remove all indicators and notify listeners if we are not + // listening anymore due to indicators being disabled + update(false) + } + } + + private fun addCallback(callback: WeakReference) { + callbacks.add(callback) + if (callbacks.isNotEmpty() && !listening) { + messageHandler.removeMessages(MSG_UPDATE_LISTENING_STATE) + messageHandler.sendEmptyMessage(MSG_UPDATE_LISTENING_STATE) + } + // Notify this callback if we didn't set to listening + else if (listening) uiHandler.post(NotifyChangesToCallback(callback.get(), privacyList)) + } + + private fun removeCallback(callback: WeakReference) { + // Removes also if the callback is null + callbacks.removeIf { it.get()?.equals(callback.get()) ?: true } + if (callbacks.isEmpty()) { + messageHandler.removeMessages(MSG_UPDATE_LISTENING_STATE) + messageHandler.sendEmptyMessage(MSG_UPDATE_LISTENING_STATE) + } + } + + fun addCallback(callback: Callback) { + messageHandler.obtainMessage(MSG_ADD_CALLBACK, callback).sendToTarget() + } + + fun removeCallback(callback: Callback) { + messageHandler.obtainMessage(MSG_REMOVE_CALLBACK, callback).sendToTarget() + } + + private fun updatePrivacyList() { + if (!listening) { + privacyList = emptyList() + return + } + val list = currentUserIds.flatMap { appOpsController.getActiveAppOpsForUser(it) } + .mapNotNull { toPrivacyItem(it) }.distinct() + privacyList = list + } + + private fun toPrivacyItem(appOpItem: AppOpItem): PrivacyItem? { + val type: PrivacyType = when (appOpItem.code) { + AppOpsManager.OP_CAMERA -> PrivacyType.TYPE_CAMERA + AppOpsManager.OP_COARSE_LOCATION -> PrivacyType.TYPE_LOCATION + AppOpsManager.OP_FINE_LOCATION -> PrivacyType.TYPE_LOCATION + AppOpsManager.OP_RECORD_AUDIO -> PrivacyType.TYPE_MICROPHONE + else -> return null + } + if (appOpItem.uid == SYSTEM_UID) return PrivacyItem(type, systemApp) + val app = PrivacyApplication(appOpItem.packageName, appOpItem.uid, context) + return PrivacyItem(type, app) + } + + // Used by containing class to get notified of changes + interface Callback { + fun privacyChanged(privacyItems: List) + } + + internal inner class Receiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + if (intent?.action in intents) { + update(true) + } + } + } + + private class NotifyChangesToCallback( + private val callback: Callback?, + private val list: List + ) : Runnable { + override fun run() { + callback?.privacyChanged(list) + } + } + + override fun dump(fd: FileDescriptor?, pw: PrintWriter?, args: Array?) { + pw?.println("PrivacyItemController state:") + pw?.println(" Listening: $listening") + pw?.println(" Current user ids: $currentUserIds") + pw?.println(" Privacy Items:") + privacyList.forEach { + pw?.print(" ") + pw?.println(it.toString()) + } + pw?.println(" Callbacks:") + callbacks.forEach { + it.get()?.let { + pw?.print(" ") + pw?.println(it.toString()) + } + } + } + + private class H( + private val outerClass: WeakReference, + looper: Looper + ) : Handler(looper) { + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + when (msg.what) { + MSG_UPDATE_LISTENING_STATE -> outerClass.get()?.setListeningState() + + MSG_ADD_CALLBACK -> { + if (msg.obj !is PrivacyItemController.Callback) return + outerClass.get()?.addCallback( + WeakReference(msg.obj as PrivacyItemController.Callback)) + } + + MSG_REMOVE_CALLBACK -> { + if (msg.obj !is PrivacyItemController.Callback) return + outerClass.get()?.removeCallback( + WeakReference(msg.obj as PrivacyItemController.Callback)) + } + else -> {} + } + } + } +} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index d59e251563c7..410a13ee4730 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -32,24 +32,30 @@ import android.graphics.Color; import android.graphics.Rect; import android.media.AudioManager; import android.os.Handler; +import android.os.Looper; import android.provider.AlarmClock; +import android.provider.DeviceConfig; import android.provider.Settings; import android.service.notification.ZenModeConfig; import android.text.format.DateUtils; import android.util.AttributeSet; import android.util.Log; import android.util.Pair; +import android.util.StatsLog; import android.view.ContextThemeWrapper; import android.view.DisplayCutout; import android.view.View; import android.view.WindowInsets; import android.widget.FrameLayout; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.RelativeLayout; +import android.widget.Space; import android.widget.TextView; import androidx.annotation.VisibleForTesting; +import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.settingslib.Utils; import com.android.systemui.BatteryMeterView; import com.android.systemui.DualToneHandler; @@ -57,6 +63,11 @@ import com.android.systemui.R; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; +import com.android.systemui.privacy.OngoingPrivacyChip; +import com.android.systemui.privacy.PrivacyDialogBuilder; +import com.android.systemui.privacy.PrivacyItem; +import com.android.systemui.privacy.PrivacyItemController; +import com.android.systemui.privacy.PrivacyItemControllerKt; import com.android.systemui.qs.QSDetail.Callback; import com.android.systemui.statusbar.phone.PhoneStatusBarView; import com.android.systemui.statusbar.phone.StatusBarIconController; @@ -67,6 +78,8 @@ import com.android.systemui.statusbar.policy.DateView; import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.ZenModeController; +import java.util.ArrayList; +import java.util.List; import java.util.Locale; import java.util.Objects; @@ -108,6 +121,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements private TintedIconManager mIconManager; private TouchAnimator mStatusIconsAlphaAnimator; private TouchAnimator mHeaderTextContainerAlphaAnimator; + private TouchAnimator mPrivacyChipAlphaAnimator; private DualToneHandler mDualToneHandler; private View mSystemIconsView; @@ -127,7 +141,12 @@ public class QuickStatusBarHeader extends RelativeLayout implements private View mRingerContainer; private Clock mClockView; private DateView mDateView; + private OngoingPrivacyChip mPrivacyChip; + private Space mSpace; private BatteryMeterView mBatteryRemainingIcon; + private boolean mPermissionsHubEnabled; + + private PrivacyItemController mPrivacyItemController; private final BroadcastReceiver mRingerReceiver = new BroadcastReceiver() { @Override @@ -137,17 +156,41 @@ public class QuickStatusBarHeader extends RelativeLayout implements } }; private boolean mHasTopCutout = false; + private boolean mPrivacyChipLogged = false; + + private final DeviceConfig.OnPropertyChangedListener mPropertyListener = + new DeviceConfig.OnPropertyChangedListener() { + @Override + public void onPropertyChanged(String namespace, String name, String value) { + if (DeviceConfig.NAMESPACE_PRIVACY.equals(namespace) + && SystemUiDeviceConfigFlags.PROPERTY_PERMISSIONS_HUB_ENABLED.equals( + name)) { + mPermissionsHubEnabled = Boolean.valueOf(value); + StatusIconContainer iconContainer = findViewById(R.id.statusIcons); + iconContainer.setIgnoredSlots(getIgnoredIconSlots()); + } + } + }; + + private PrivacyItemController.Callback mPICCallback = new PrivacyItemController.Callback() { + @Override + public void privacyChanged(List privacyItems) { + mPrivacyChip.setPrivacyList(privacyItems); + setChipVisibility(!privacyItems.isEmpty()); + } + }; @Inject public QuickStatusBarHeader(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, NextAlarmController nextAlarmController, ZenModeController zenModeController, StatusBarIconController statusBarIconController, - ActivityStarter activityStarter) { + ActivityStarter activityStarter, PrivacyItemController privacyItemController) { super(context, attrs); mAlarmController = nextAlarmController; mZenController = zenModeController; mStatusBarIconController = statusBarIconController; mActivityStarter = activityStarter; + mPrivacyItemController = privacyItemController; mDualToneHandler = new DualToneHandler( new ContextThemeWrapper(context, R.style.QSHeaderTheme)); } @@ -160,6 +203,8 @@ public class QuickStatusBarHeader extends RelativeLayout implements mSystemIconsView = findViewById(R.id.quick_status_bar_system_icons); mQuickQsStatusIcons = findViewById(R.id.quick_qs_status_icons); StatusIconContainer iconContainer = findViewById(R.id.statusIcons); + // Ignore privacy icons because they show in the space above QQS + iconContainer.addIgnoredSlots(getIgnoredIconSlots()); iconContainer.setShouldRestrictIcons(false); mIconManager = new TintedIconManager(iconContainer); @@ -173,6 +218,9 @@ public class QuickStatusBarHeader extends RelativeLayout implements mRingerModeIcon = findViewById(R.id.ringer_mode_icon); mRingerModeTextView = findViewById(R.id.ringer_mode_text); mRingerContainer = findViewById(R.id.ringer_container); + mRingerContainer.setOnClickListener(this::onClick); + mPrivacyChip = findViewById(R.id.privacy_chip); + mPrivacyChip.setOnClickListener(this::onClick); mCarrierGroup = findViewById(R.id.carrier_group); @@ -195,6 +243,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements mClockView = findViewById(R.id.clock); mClockView.setOnClickListener(this); mDateView = findViewById(R.id.date); + mSpace = findViewById(R.id.space); // Tint for the battery icons are handled in setupHost() mBatteryRemainingIcon = findViewById(R.id.batteryRemainingIcon); @@ -205,6 +254,26 @@ public class QuickStatusBarHeader extends RelativeLayout implements mBatteryRemainingIcon.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE); mRingerModeTextView.setSelected(true); mNextAlarmTextView.setSelected(true); + + mPermissionsHubEnabled = PrivacyItemControllerKt.isPermissionsHubEnabled(); + // Change the ignored slots when DeviceConfig flag changes + DeviceConfig.addOnPropertyChangedListener(DeviceConfig.NAMESPACE_PRIVACY, + mContext.getMainExecutor(), mPropertyListener); + + } + + private List getIgnoredIconSlots() { + ArrayList ignored = new ArrayList<>(); + ignored.add(mContext.getResources().getString( + com.android.internal.R.string.status_bar_camera)); + ignored.add(mContext.getResources().getString( + com.android.internal.R.string.status_bar_microphone)); + if (mPermissionsHubEnabled) { + ignored.add(mContext.getResources().getString( + com.android.internal.R.string.status_bar_location)); + } + + return ignored; } private void updateStatusText() { @@ -218,6 +287,21 @@ public class QuickStatusBarHeader extends RelativeLayout implements } } + private void setChipVisibility(boolean chipVisible) { + if (chipVisible && mPermissionsHubEnabled) { + mPrivacyChip.setVisibility(View.VISIBLE); + // Makes sure that the chip is logged as viewed at most once each time QS is opened + // mListening makes sure that the callback didn't return after the user closed QS + if (!mPrivacyChipLogged && mListening) { + mPrivacyChipLogged = true; + StatsLog.write(StatsLog.PRIVACY_INDICATORS_INTERACTED, + StatsLog.PRIVACY_INDICATORS_INTERACTED__TYPE__CHIP_VIEWED); + } + } else { + mPrivacyChip.setVisibility(View.GONE); + } + } + private boolean updateRingerStatus() { boolean isOriginalVisible = mRingerModeTextView.getVisibility() == View.VISIBLE; CharSequence originalRingerText = mRingerModeTextView.getText(); @@ -324,6 +408,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements updateStatusIconAlphaAnimator(); updateHeaderTextContainerAlphaAnimator(); + updatePrivacyChipAlphaAnimator(); } private void updateStatusIconAlphaAnimator() { @@ -338,6 +423,12 @@ public class QuickStatusBarHeader extends RelativeLayout implements .build(); } + private void updatePrivacyChipAlphaAnimator() { + mPrivacyChipAlphaAnimator = new TouchAnimator.Builder() + .addFloat(mPrivacyChip, "alpha", 1, 0, 1) + .build(); + } + public void setExpanded(boolean expanded) { if (mExpanded == expanded) return; mExpanded = expanded; @@ -376,6 +467,10 @@ public class QuickStatusBarHeader extends RelativeLayout implements mHeaderTextContainerView.setVisibility(INVISIBLE); } } + if (mPrivacyChipAlphaAnimator != null) { + mPrivacyChip.setExpanded(expansionFraction > 0.5); + mPrivacyChipAlphaAnimator.setPosition(keyguardExpansionFraction); + } } public void disable(int state1, int state2, boolean animate) { @@ -408,6 +503,21 @@ public class QuickStatusBarHeader extends RelativeLayout implements mSystemIconsView.setPadding(padding.first, 0, padding.second, 0); } + LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mSpace.getLayoutParams(); + if (cutout != null) { + Rect topCutout = cutout.getBoundingRectTop(); + if (topCutout.isEmpty()) { + mHasTopCutout = false; + lp.width = 0; + mSpace.setVisibility(View.GONE); + } else { + mHasTopCutout = true; + lp.width = topCutout.width(); + mSpace.setVisibility(View.VISIBLE); + } + } + mSpace.setLayoutParams(lp); + setChipVisibility(mPrivacyChip.getVisibility() == View.VISIBLE); return super.onApplyWindowInsets(insets); } @@ -432,10 +542,13 @@ public class QuickStatusBarHeader extends RelativeLayout implements mAlarmController.addCallback(this); mContext.registerReceiver(mRingerReceiver, new IntentFilter(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION)); + mPrivacyItemController.addCallback(mPICCallback); } else { mZenController.removeCallback(this); mAlarmController.removeCallback(this); + mPrivacyItemController.removeCallback(mPICCallback); mContext.unregisterReceiver(mRingerReceiver); + mPrivacyChipLogged = false; } } @@ -453,6 +566,18 @@ public class QuickStatusBarHeader extends RelativeLayout implements mActivityStarter.postStartActivityDismissingKeyguard(new Intent( AlarmClock.ACTION_SHOW_ALARMS), 0); } + } else if (v == mPrivacyChip) { + // Makes sure that the builder is grabbed as soon as the chip is pressed + PrivacyDialogBuilder builder = mPrivacyChip.getBuilder(); + if (builder.getAppsAndTypes().size() == 0) return; + Handler mUiHandler = new Handler(Looper.getMainLooper()); + StatsLog.write(StatsLog.PRIVACY_INDICATORS_INTERACTED, + StatsLog.PRIVACY_INDICATORS_INTERACTED__TYPE__CHIP_CLICKED); + mUiHandler.post(() -> { + mActivityStarter.postStartActivityDismissingKeyguard( + new Intent(Intent.ACTION_REVIEW_ONGOING_PERMISSION_USAGE), 0); + mHost.collapsePanels(); + }); } else if (v == mRingerContainer && mRingerContainer.isVisibleToUser()) { mActivityStarter.postStartActivityDismissingKeyguard(new Intent( Settings.ACTION_SOUND_SETTINGS), 0); 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 17c200eaef6a..ee4387952792 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -42,6 +42,10 @@ import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.SysUiServiceProvider; import com.android.systemui.UiOffloadThread; +import com.android.systemui.privacy.PrivacyItem; +import com.android.systemui.privacy.PrivacyItemController; +import com.android.systemui.privacy.PrivacyItemControllerKt; +import com.android.systemui.privacy.PrivacyType; import com.android.systemui.qs.tiles.DndTile; import com.android.systemui.qs.tiles.RotationLockTile; import com.android.systemui.statusbar.CommandQueue; @@ -62,6 +66,9 @@ import com.android.systemui.statusbar.policy.SensorPrivacyController; import com.android.systemui.statusbar.policy.UserInfoController; import com.android.systemui.statusbar.policy.ZenModeController; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.List; import java.util.Locale; /** @@ -76,12 +83,12 @@ public class PhoneStatusBarPolicy ZenModeController.Callback, DeviceProvisionedListener, KeyguardMonitor.Callback, + PrivacyItemController.Callback, LocationController.LocationChangeCallback { private static final String TAG = "PhoneStatusBarPolicy"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - public static final int LOCATION_STATUS_ICON_ID = - com.android.internal.R.drawable.perm_group_location; + public static final int LOCATION_STATUS_ICON_ID = PrivacyType.TYPE_LOCATION.getIconId(); private final String mSlotCast; private final String mSlotHotspot; @@ -95,6 +102,8 @@ public class PhoneStatusBarPolicy private final String mSlotHeadset; private final String mSlotDataSaver; private final String mSlotLocation; + private final String mSlotMicrophone; + private final String mSlotCamera; private final String mSlotSensorsOff; private final Context mContext; @@ -112,6 +121,7 @@ public class PhoneStatusBarPolicy private final DeviceProvisionedController mProvisionedController; private final KeyguardMonitor mKeyguardMonitor; private final LocationController mLocationController; + private final PrivacyItemController mPrivacyItemController; private final UiOffloadThread mUiOffloadThread = Dependency.get(UiOffloadThread.class); private final SensorPrivacyController mSensorPrivacyController; @@ -144,6 +154,7 @@ public class PhoneStatusBarPolicy mProvisionedController = Dependency.get(DeviceProvisionedController.class); mKeyguardMonitor = Dependency.get(KeyguardMonitor.class); mLocationController = Dependency.get(LocationController.class); + mPrivacyItemController = Dependency.get(PrivacyItemController.class); mSensorPrivacyController = Dependency.get(SensorPrivacyController.class); mSlotCast = context.getString(com.android.internal.R.string.status_bar_cast); @@ -159,6 +170,8 @@ public class PhoneStatusBarPolicy mSlotHeadset = context.getString(com.android.internal.R.string.status_bar_headset); mSlotDataSaver = context.getString(com.android.internal.R.string.status_bar_data_saver); mSlotLocation = context.getString(com.android.internal.R.string.status_bar_location); + mSlotMicrophone = context.getString(com.android.internal.R.string.status_bar_microphone); + mSlotCamera = context.getString(com.android.internal.R.string.status_bar_camera); mSlotSensorsOff = context.getString(com.android.internal.R.string.status_bar_sensors_off); // listen for broadcasts @@ -218,6 +231,13 @@ public class PhoneStatusBarPolicy context.getString(R.string.accessibility_data_saver_on)); mIconController.setIconVisibility(mSlotDataSaver, false); + // privacy items + mIconController.setIcon(mSlotMicrophone, PrivacyType.TYPE_MICROPHONE.getIconId(), + PrivacyType.TYPE_MICROPHONE.getName(mContext)); + mIconController.setIconVisibility(mSlotMicrophone, false); + mIconController.setIcon(mSlotCamera, PrivacyType.TYPE_CAMERA.getIconId(), + PrivacyType.TYPE_CAMERA.getName(mContext)); + mIconController.setIconVisibility(mSlotCamera, false); mIconController.setIcon(mSlotLocation, LOCATION_STATUS_ICON_ID, mContext.getString(R.string.accessibility_location_active)); mIconController.setIconVisibility(mSlotLocation, false); @@ -237,6 +257,7 @@ public class PhoneStatusBarPolicy mNextAlarmController.addCallback(mNextAlarmCallback); mDataSaver.addCallback(this); mKeyguardMonitor.addCallback(this); + mPrivacyItemController.addCallback(this); mSensorPrivacyController.addCallback(mSensorPrivacyListener); mLocationController.addCallback(this); @@ -580,9 +601,46 @@ public class PhoneStatusBarPolicy mIconController.setIconVisibility(mSlotDataSaver, isDataSaving); } + @Override // PrivacyItemController.Callback + public void privacyChanged(List privacyItems) { + updatePrivacyItems(privacyItems); + } + + private void updatePrivacyItems(List items) { + boolean showCamera = false; + boolean showMicrophone = false; + boolean showLocation = false; + for (PrivacyItem item : items) { + if (item == null /* b/124234367 */) { + if (DEBUG) { + Log.e(TAG, "updatePrivacyItems - null item found"); + StringWriter out = new StringWriter(); + mPrivacyItemController.dump(null, new PrintWriter(out), null); + Log.e(TAG, out.toString()); + } + continue; + } + switch (item.getPrivacyType()) { + case TYPE_CAMERA: + showCamera = true; + break; + case TYPE_LOCATION: + showLocation = true; + break; + case TYPE_MICROPHONE: + showMicrophone = true; + break; + } + } + + mIconController.setIconVisibility(mSlotCamera, showCamera); + mIconController.setIconVisibility(mSlotMicrophone, showMicrophone); + mIconController.setIconVisibility(mSlotLocation, showLocation); + } + @Override public void onLocationActiveChanged(boolean active) { - updateLocation(); + if (!PrivacyItemControllerKt.isPermissionsHubEnabled()) updateLocation(); } // Updates the status view based on the current state of location requests. diff --git a/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java index bd7f897dc1c0..cc31531c90a7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java @@ -25,9 +25,11 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.app.AppOpsManager; import android.content.pm.PackageManager; @@ -53,6 +55,7 @@ public class AppOpsControllerTest extends SysuiTestCase { private static final String TEST_PACKAGE_NAME = "test"; private static final int TEST_UID = UserHandle.getUid(0, 0); private static final int TEST_UID_OTHER = UserHandle.getUid(1, 0); + private static final int TEST_UID_NON_USER_SENSITIVE = UserHandle.getUid(2, 0); @Mock private AppOpsManager mAppOpsManager; @@ -71,6 +74,18 @@ public class AppOpsControllerTest extends SysuiTestCase { getContext().addMockSystemService(AppOpsManager.class, mAppOpsManager); + // All permissions of TEST_UID and TEST_UID_OTHER are user sensitive. None of + // TEST_UID_NON_USER_SENSITIVE are user sensitive. + getContext().setMockPackageManager(mPackageManager); + when(mPackageManager.getPermissionFlags(anyString(), anyString(), + eq(UserHandle.getUserHandleForUid(TEST_UID)))).thenReturn( + PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED); + when(mPackageManager.getPermissionFlags(anyString(), anyString(), + eq(UserHandle.getUserHandleForUid(TEST_UID_OTHER)))).thenReturn( + PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED); + when(mPackageManager.getPermissionFlags(anyString(), anyString(), + eq(UserHandle.getUserHandleForUid(TEST_UID_NON_USER_SENSITIVE)))).thenReturn(0); + mController = new AppOpsControllerImpl(mContext, Dependency.get(Dependency.BG_LOOPER)); } @@ -162,6 +177,14 @@ public class AppOpsControllerTest extends SysuiTestCase { mController.getActiveAppOpsForUser(UserHandle.getUserId(TEST_UID_OTHER)).size()); } + @Test + public void nonUserSensitiveOpsAreIgnored() { + mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO, + TEST_UID_NON_USER_SENSITIVE, TEST_PACKAGE_NAME, true); + assertEquals(0, mController.getActiveAppOpsForUser( + UserHandle.getUserId(TEST_UID_NON_USER_SENSITIVE)).size()); + } + @Test public void opNotedScheduledForRemoval() { mController.setBGHandler(mMockHandler); diff --git a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogBuilderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogBuilderTest.kt new file mode 100644 index 000000000000..6302f9d56dc3 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogBuilderTest.kt @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2018 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.privacy + +import androidx.test.filters.SmallTest +import androidx.test.runner.AndroidJUnit4 +import com.android.systemui.SysuiTestCase +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +@SmallTest +class PrivacyDialogBuilderTest : SysuiTestCase() { + + companion object { + val TEST_UID = 1 + } + + @Test + fun testGenerateAppsList() { + val bar2 = PrivacyItem(Privacy.TYPE_CAMERA, PrivacyApplication( + "Bar", TEST_UID, context)) + val bar3 = PrivacyItem(Privacy.TYPE_LOCATION, PrivacyApplication( + "Bar", TEST_UID, context)) + val foo0 = PrivacyItem(Privacy.TYPE_MICROPHONE, PrivacyApplication( + "Foo", TEST_UID, context)) + val baz1 = PrivacyItem(Privacy.TYPE_CAMERA, PrivacyApplication( + "Baz", TEST_UID, context)) + + val items = listOf(bar2, foo0, baz1, bar3) + + val textBuilder = PrivacyDialogBuilder(context, items) + + val list = textBuilder.appsAndTypes + assertEquals(3, list.size) + val appsList = list.map { it.first } + val typesList = list.map { it.second } + // List is sorted by number of types and then by types + assertEquals(listOf("Bar", "Baz", "Foo"), appsList.map { it.packageName }) + assertEquals(listOf(Privacy.TYPE_CAMERA, Privacy.TYPE_LOCATION), typesList[0]) + assertEquals(listOf(Privacy.TYPE_CAMERA), typesList[1]) + assertEquals(listOf(Privacy.TYPE_MICROPHONE), typesList[2]) + } + + @Test + fun testOrder() { + // We want location to always go last, so it will go in the "+ other apps" + val appCamera = PrivacyItem(PrivacyType.TYPE_CAMERA, + PrivacyApplication("Camera", TEST_UID, context)) + val appMicrophone = + PrivacyItem(PrivacyType.TYPE_MICROPHONE, + PrivacyApplication("Microphone", TEST_UID, context)) + val appLocation = + PrivacyItem(PrivacyType.TYPE_LOCATION, + PrivacyApplication("Location", TEST_UID, context)) + + val items = listOf(appLocation, appMicrophone, appCamera) + val textBuilder = PrivacyDialogBuilder(context, items) + val appList = textBuilder.appsAndTypes.map { it.first }.map { it.packageName } + assertEquals(listOf("Camera", "Microphone", "Location"), appList) + } +} \ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt new file mode 100644 index 000000000000..e2e0bb151228 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt @@ -0,0 +1,293 @@ +/* + * Copyright (C) 2018 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.privacy + +import android.app.ActivityManager +import android.app.AppOpsManager +import android.content.Context +import android.content.Intent +import android.content.pm.UserInfo +import android.os.Handler +import android.os.UserHandle +import android.os.UserManager +import android.provider.DeviceConfig +import android.provider.Settings.RESET_MODE_PACKAGE_DEFAULTS +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.testing.TestableLooper.RunWithLooper +import androidx.test.filters.SmallTest +import com.android.internal.config.sysui.SystemUiDeviceConfigFlags +import com.android.systemui.Dependency +import com.android.systemui.R +import com.android.systemui.SysuiTestCase +import com.android.systemui.appops.AppOpItem +import com.android.systemui.appops.AppOpsController +import org.hamcrest.Matchers.hasItem +import org.hamcrest.Matchers.not +import org.hamcrest.Matchers.nullValue +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Assert.assertThat +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor +import org.mockito.ArgumentMatchers.any +import org.mockito.ArgumentMatchers.anyInt +import org.mockito.ArgumentMatchers.anyList +import org.mockito.ArgumentMatchers.eq +import org.mockito.Captor +import org.mockito.Mock +import org.mockito.Mockito.atLeastOnce +import org.mockito.Mockito.doReturn +import org.mockito.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.Mockito.verifyNoMoreInteractions +import org.mockito.MockitoAnnotations + +@RunWith(AndroidTestingRunner::class) +@SmallTest +@RunWithLooper +class PrivacyItemControllerTest : SysuiTestCase() { + + companion object { + val CURRENT_USER_ID = ActivityManager.getCurrentUser() + val TEST_UID = CURRENT_USER_ID * UserHandle.PER_USER_RANGE + const val SYSTEM_UID = 1000 + const val TEST_PACKAGE_NAME = "test" + const val DEVICE_SERVICES_STRING = "Device services" + const val TAG = "PrivacyItemControllerTest" + fun capture(argumentCaptor: ArgumentCaptor): T = argumentCaptor.capture() + } + + @Mock + private lateinit var appOpsController: AppOpsController + @Mock + private lateinit var callback: PrivacyItemController.Callback + @Mock + private lateinit var userManager: UserManager + @Captor + private lateinit var argCaptor: ArgumentCaptor> + @Captor + private lateinit var argCaptorCallback: ArgumentCaptor + + private lateinit var testableLooper: TestableLooper + private lateinit var privacyItemController: PrivacyItemController + private lateinit var handler: Handler + + fun PrivacyItemController(context: Context) = + PrivacyItemController(context, appOpsController, handler, handler) + + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + testableLooper = TestableLooper.get(this) + handler = Handler(testableLooper.looper) + + appOpsController = mDependency.injectMockDependency(AppOpsController::class.java) + mDependency.injectTestDependency(Dependency.BG_HANDLER, handler) + mDependency.injectTestDependency(Dependency.MAIN_HANDLER, handler) + mContext.addMockSystemService(UserManager::class.java, userManager) + mContext.getOrCreateTestableResources().addOverride(R.string.device_services, + DEVICE_SERVICES_STRING) + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_PRIVACY, + SystemUiDeviceConfigFlags.PROPERTY_PERMISSIONS_HUB_ENABLED, + "true", false) + + doReturn(listOf(object : UserInfo() { + init { + id = CURRENT_USER_ID + } + })).`when`(userManager).getProfiles(anyInt()) + + privacyItemController = PrivacyItemController(mContext) + } + + @After + fun tearDown() { + DeviceConfig.resetToDefaults(RESET_MODE_PACKAGE_DEFAULTS, DeviceConfig.NAMESPACE_PRIVACY) + } + + @Test + fun testSetListeningTrueByAddingCallback() { + privacyItemController.addCallback(callback) + testableLooper.processAllMessages() + verify(appOpsController).addCallback(eq(PrivacyItemController.OPS), + any(AppOpsController.Callback::class.java)) + testableLooper.processAllMessages() + verify(callback).privacyChanged(anyList()) + } + + @Test + fun testSetListeningFalseByRemovingLastCallback() { + privacyItemController.addCallback(callback) + testableLooper.processAllMessages() + verify(appOpsController, never()).removeCallback(any(IntArray::class.java), + any(AppOpsController.Callback::class.java)) + privacyItemController.removeCallback(callback) + testableLooper.processAllMessages() + verify(appOpsController).removeCallback(eq(PrivacyItemController.OPS), + any(AppOpsController.Callback::class.java)) + verify(callback).privacyChanged(emptyList()) + } + + @Test + fun testDistinctItems() { + doReturn(listOf(AppOpItem(AppOpsManager.OP_CAMERA, TEST_UID, "", 0), + AppOpItem(AppOpsManager.OP_CAMERA, TEST_UID, "", 1))) + .`when`(appOpsController).getActiveAppOpsForUser(anyInt()) + + privacyItemController.addCallback(callback) + testableLooper.processAllMessages() + verify(callback).privacyChanged(capture(argCaptor)) + assertEquals(1, argCaptor.value.size) + } + + @Test + fun testSystemApps() { + doReturn(listOf(AppOpItem(AppOpsManager.OP_COARSE_LOCATION, SYSTEM_UID, TEST_PACKAGE_NAME, + 0))).`when`(appOpsController).getActiveAppOpsForUser(anyInt()) + privacyItemController.addCallback(callback) + testableLooper.processAllMessages() + verify(callback).privacyChanged(capture(argCaptor)) + assertEquals(1, argCaptor.value.size) + assertEquals(context.getString(R.string.device_services), + argCaptor.value[0].application.applicationName) + } + + @Test + fun testRegisterReceiver_allUsers() { + val spiedContext = spy(mContext) + val itemController = PrivacyItemController(spiedContext) + itemController.addCallback(callback) + testableLooper.processAllMessages() + verify(spiedContext, atLeastOnce()).registerReceiverAsUser( + eq(itemController.userSwitcherReceiver), eq(UserHandle.ALL), any(), eq(null), + eq(null)) + verify(spiedContext, never()).unregisterReceiver(eq(itemController.userSwitcherReceiver)) + } + + @Test + fun testReceiver_ACTION_USER_FOREGROUND() { + privacyItemController.userSwitcherReceiver.onReceive(context, + Intent(Intent.ACTION_USER_FOREGROUND)) + verify(userManager).getProfiles(anyInt()) + } + + @Test + fun testReceiver_ACTION_MANAGED_PROFILE_ADDED() { + privacyItemController.userSwitcherReceiver.onReceive(context, + Intent(Intent.ACTION_MANAGED_PROFILE_ADDED)) + verify(userManager).getProfiles(anyInt()) + } + + @Test + fun testReceiver_ACTION_MANAGED_PROFILE_REMOVED() { + privacyItemController.userSwitcherReceiver.onReceive(context, + Intent(Intent.ACTION_MANAGED_PROFILE_REMOVED)) + verify(userManager).getProfiles(anyInt()) + } + + @Test + fun testAddMultipleCallbacks() { + val otherCallback = mock(PrivacyItemController.Callback::class.java) + privacyItemController.addCallback(callback) + testableLooper.processAllMessages() + verify(callback).privacyChanged(anyList()) + + privacyItemController.addCallback(otherCallback) + testableLooper.processAllMessages() + verify(otherCallback).privacyChanged(anyList()) + // Adding a callback should not unnecessarily call previous ones + verifyNoMoreInteractions(callback) + } + + @Test + fun testMultipleCallbacksAreUpdated() { + doReturn(emptyList()).`when`(appOpsController).getActiveAppOpsForUser(anyInt()) + + val otherCallback = mock(PrivacyItemController.Callback::class.java) + privacyItemController.addCallback(callback) + privacyItemController.addCallback(otherCallback) + testableLooper.processAllMessages() + reset(callback) + reset(otherCallback) + + verify(appOpsController).addCallback(any(), capture(argCaptorCallback)) + argCaptorCallback.value.onActiveStateChanged(0, TEST_UID, "", true) + testableLooper.processAllMessages() + verify(callback).privacyChanged(anyList()) + verify(otherCallback).privacyChanged(anyList()) + } + + @Test + fun testRemoveCallback() { + doReturn(emptyList()).`when`(appOpsController).getActiveAppOpsForUser(anyInt()) + val otherCallback = mock(PrivacyItemController.Callback::class.java) + privacyItemController.addCallback(callback) + privacyItemController.addCallback(otherCallback) + testableLooper.processAllMessages() + reset(callback) + reset(otherCallback) + + verify(appOpsController).addCallback(any(), capture(argCaptorCallback)) + privacyItemController.removeCallback(callback) + argCaptorCallback.value.onActiveStateChanged(0, TEST_UID, "", true) + testableLooper.processAllMessages() + verify(callback, never()).privacyChanged(anyList()) + verify(otherCallback).privacyChanged(anyList()) + } + + @Test + fun testListShouldNotHaveNull() { + doReturn(listOf(AppOpItem(AppOpsManager.OP_ACTIVATE_VPN, TEST_UID, "", 0), + AppOpItem(AppOpsManager.OP_COARSE_LOCATION, TEST_UID, "", 0))) + .`when`(appOpsController).getActiveAppOpsForUser(anyInt()) + privacyItemController.addCallback(callback) + testableLooper.processAllMessages() + + verify(callback).privacyChanged(capture(argCaptor)) + assertEquals(1, argCaptor.value.size) + assertThat(argCaptor.value, not(hasItem(nullValue()))) + } + + @Test + fun testListShouldBeCopy() { + val list = listOf(PrivacyItem(PrivacyType.TYPE_CAMERA, + PrivacyApplication("", TEST_UID, mContext))) + privacyItemController.privacyList = list + val privacyList = privacyItemController.privacyList + assertEquals(list, privacyList) + assertTrue(list !== privacyList) + } + + @Test + fun testNotListeningWhenIndicatorsDisabled() { + privacyItemController.devicePropertyChangedListener.onPropertyChanged( + DeviceConfig.NAMESPACE_PRIVACY, + SystemUiDeviceConfigFlags.PROPERTY_PERMISSIONS_HUB_ENABLED, + "false") + privacyItemController.addCallback(callback) + testableLooper.processAllMessages() + verify(appOpsController, never()).addCallback(eq(PrivacyItemController.OPS), + any(AppOpsController.Callback::class.java)) + } +} \ No newline at end of file -- GitLab From 6445e6846e4c1b10a0108046ab6a950c64d4ef0a Mon Sep 17 00:00:00 2001 From: Govinda Wasserman Date: Tue, 4 Jun 2019 09:37:32 -0400 Subject: [PATCH 054/620] Fixes timestamp passed to the Assistant Test: Tested locally BUG:134204043 Change-Id: Ib7d94c3d548ede8cad4f9458b3cf361662ff239d FIX:134204043 --- .../SystemUI/src/com/android/systemui/assist/AssistManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java index c7c10f1c2211..97b6e7c58440 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java @@ -258,7 +258,7 @@ public class AssistManager implements ConfigurationChangedReceiver { } int phoneState = mPhoneStateMonitor.getPhoneState(); args.putInt(INVOCATION_PHONE_STATE_KEY, phoneState); - args.putLong(INVOCATION_TIME_MS_KEY, SystemClock.uptimeMillis()); + args.putLong(INVOCATION_TIME_MS_KEY, SystemClock.elapsedRealtime()); logStartAssist(invocationType, phoneState); startAssistInternal(args, assistComponent, isService); } -- GitLab From be267ef868a4c96995b3bb5b3411171db6ac3de1 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Tue, 4 Jun 2019 11:42:58 -0700 Subject: [PATCH 055/620] Use real gatekeeper HAT for resetting lockout The code is slightly confusing in that synthetic password response also contains a gatekeeper response. This is not the actual response that contains the challenge. Instead, we should be using the second response from gateeper, which is the real gatekeeper auth token. Fixes: 133444358 Test: Before change, get locked out, enter password, user stays locked out After change, get locked out, enter password, lockout is reset Change-Id: Ia869fe5d1ebdb91263b3494da2fba5f3c6304047 --- .../com/android/server/locksettings/LockSettingsService.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index 107e1fbbf760..1e0a3d5cea4c 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -2548,9 +2548,8 @@ public class LockSettingsService extends ILockSettings.Stub { // Reset lockout only if user has enrolled templates if (mInjector.hasEnrolledBiometrics()) { BiometricManager bm = mContext.getSystemService(BiometricManager.class); - Slog.i(TAG, "Resetting lockout, length: " - + authResult.gkResponse.getPayload().length); - bm.resetLockout(authResult.gkResponse.getPayload()); + Slog.i(TAG, "Resetting lockout, length: " + response.getPayload().length); + bm.resetLockout(response.getPayload()); if (!hasChallenge && pm.hasSystemFeature(PackageManager.FEATURE_FACE)) { mContext.getSystemService(FaceManager.class).revokeChallenge(); -- GitLab From cd564d488230f2f2f6b9671d6515e1a76941d2c0 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Tue, 4 Jun 2019 03:18:12 +0000 Subject: [PATCH 056/620] Revert "[DO NOT MERGE] Handle config override via settings correctly" This reverts commit aa5ba4f75ff8391ce14f8b357450ca4be98c589c. Reason for revert: Breaks presubmits. Bootloops blueline on qt-dev. Bug: 134445287 Change-Id: I6ad17fa66a1ddc681339966acd007ebd43d7ba3b (cherry picked from commit 69a015931e1d4ccaf4510d9c3f8a82d6c7d20c76) --- .../server/appop/HistoricalRegistry.java | 147 ++++-------------- 1 file changed, 30 insertions(+), 117 deletions(-) diff --git a/services/core/java/com/android/server/appop/HistoricalRegistry.java b/services/core/java/com/android/server/appop/HistoricalRegistry.java index 805cac755fd5..69a1c9f584cb 100644 --- a/services/core/java/com/android/server/appop/HistoricalRegistry.java +++ b/services/core/java/com/android/server/appop/HistoricalRegistry.java @@ -108,12 +108,6 @@ import java.util.concurrent.TimeUnit; * must be called with the mInMemoryLock, xxxDMLocked suffix means the method * must be called with the mOnDiskLock and mInMemoryLock locks acquired in that * exact order. - *

- * INITIALIZATION: We can initialize persistence only after the system is ready - * as we need to check the optional configuration override from the settings - * database which is not initialized at the time the app ops service is created. - * This means that all entry points that touch persistence should be short - * circuited via isPersistenceInitialized() check. */ // TODO (bug:122218838): Make sure we handle start of epoch time // TODO (bug:122218838): Validate changed time is handled correctly @@ -183,33 +177,14 @@ final class HistoricalRegistry { // Object managing persistence (read/write) @GuardedBy("mOnDiskLock") - private Persistence mPersistence; + private Persistence mPersistence = new Persistence(mBaseSnapshotInterval, + mIntervalCompressionMultiplier); HistoricalRegistry(@NonNull Object lock) { mInMemoryLock = lock; - } - - void systemReady(@NonNull ContentResolver resolver) { - final Uri uri = Settings.Global.getUriFor(Settings.Global.APPOP_HISTORY_PARAMETERS); - resolver.registerContentObserver(uri, false, new ContentObserver( - FgThread.getHandler()) { - @Override - public void onChange(boolean selfChange) { - updateParametersFromSetting(resolver); - } - }); - - updateParametersFromSetting(resolver); - - synchronized (mOnDiskLock) { - synchronized (mInMemoryLock) { - if (mMode != AppOpsManager.HISTORICAL_MODE_DISABLED) { - // Can be uninitialized if there is no config in the settings table. - if (!isPersistenceInitializedMLocked()) { - mPersistence = new Persistence(mBaseSnapshotInterval, - mIntervalCompressionMultiplier); - } - + if (mMode != AppOpsManager.HISTORICAL_MODE_DISABLED) { + synchronized (mOnDiskLock) { + synchronized (mInMemoryLock) { // When starting always adjust history to now. final long lastPersistTimeMills = mPersistence.getLastPersistTimeMillisDLocked(); @@ -222,8 +197,16 @@ final class HistoricalRegistry { } } - private boolean isPersistenceInitializedMLocked() { - return mPersistence != null; + void systemReady(@NonNull ContentResolver resolver) { + updateParametersFromSetting(resolver); + final Uri uri = Settings.Global.getUriFor(Settings.Global.APPOP_HISTORY_PARAMETERS); + resolver.registerContentObserver(uri, false, new ContentObserver( + FgThread.getHandler()) { + @Override + public void onChange(boolean selfChange) { + updateParametersFromSetting(resolver); + } + }); } private void updateParametersFromSetting(@NonNull ContentResolver resolver) { @@ -291,11 +274,6 @@ final class HistoricalRegistry { makeRelativeToEpochStart(currentOps, nowMillis); currentOps.accept(visitor); - if(isPersistenceInitializedMLocked()) { - Slog.e(LOG_TAG, "Interaction before persistence initialized"); - return; - } - final List ops = mPersistence.readHistoryDLocked(); if (ops != null) { // TODO (bug:122218838): Make sure this is properly dumped @@ -324,21 +302,12 @@ final class HistoricalRegistry { void getHistoricalOpsFromDiskRaw(int uid, @NonNull String packageName, @Nullable String[] opNames, long beginTimeMillis, long endTimeMillis, @OpFlags int flags, @NonNull RemoteCallback callback) { - synchronized (mOnDiskLock) { - synchronized (mInMemoryLock) { - if (!isPersistenceInitializedMLocked()) { - Slog.e(LOG_TAG, "Interaction before persistence initialized"); - callback.sendResult(new Bundle()); - return; - } - final HistoricalOps result = new HistoricalOps(beginTimeMillis, endTimeMillis); - mPersistence.collectHistoricalOpsDLocked(result, uid, packageName, opNames, - beginTimeMillis, endTimeMillis, flags); - final Bundle payload = new Bundle(); - payload.putParcelable(AppOpsManager.KEY_HISTORICAL_OPS, result); - callback.sendResult(payload); - } - } + final HistoricalOps result = new HistoricalOps(beginTimeMillis, endTimeMillis); + mPersistence.collectHistoricalOpsDLocked(result, uid, packageName, opNames, + beginTimeMillis, endTimeMillis, flags); + final Bundle payload = new Bundle(); + payload.putParcelable(AppOpsManager.KEY_HISTORICAL_OPS, result); + callback.sendResult(payload); } void getHistoricalOps(int uid, @NonNull String packageName, @@ -362,12 +331,6 @@ final class HistoricalRegistry { boolean collectOpsFromDisk; synchronized (mInMemoryLock) { - if (!isPersistenceInitializedMLocked()) { - Slog.e(LOG_TAG, "Interaction before persistence initialized"); - callback.sendResult(new Bundle()); - return; - } - currentOps = getUpdatedPendingHistoricalOpsMLocked(currentTimeMillis); if (!(inMemoryAdjBeginTimeMillis >= currentOps.getEndTimeMillis() || inMemoryAdjEndTimeMillis <= currentOps.getBeginTimeMillis())) { @@ -411,10 +374,6 @@ final class HistoricalRegistry { @UidState int uidState, @OpFlags int flags) { synchronized (mInMemoryLock) { if (mMode == AppOpsManager.HISTORICAL_MODE_ENABLED_ACTIVE) { - if (!isPersistenceInitializedMLocked()) { - Slog.e(LOG_TAG, "Interaction before persistence initialized"); - return; - } getUpdatedPendingHistoricalOpsMLocked(System.currentTimeMillis()) .increaseAccessCount(op, uid, packageName, uidState, flags, 1); } @@ -425,10 +384,6 @@ final class HistoricalRegistry { @UidState int uidState, @OpFlags int flags) { synchronized (mInMemoryLock) { if (mMode == AppOpsManager.HISTORICAL_MODE_ENABLED_ACTIVE) { - if (!isPersistenceInitializedMLocked()) { - Slog.e(LOG_TAG, "Interaction before persistence initialized"); - return; - } getUpdatedPendingHistoricalOpsMLocked(System.currentTimeMillis()) .increaseRejectCount(op, uid, packageName, uidState, flags, 1); } @@ -439,10 +394,6 @@ final class HistoricalRegistry { @UidState int uidState, @OpFlags int flags, long increment) { synchronized (mInMemoryLock) { if (mMode == AppOpsManager.HISTORICAL_MODE_ENABLED_ACTIVE) { - if (!isPersistenceInitializedMLocked()) { - Slog.e(LOG_TAG, "Interaction before persistence initialized"); - return; - } getUpdatedPendingHistoricalOpsMLocked(System.currentTimeMillis()) .increaseAccessDuration(op, uid, packageName, uidState, flags, increment); } @@ -453,8 +404,6 @@ final class HistoricalRegistry { long baseSnapshotInterval, long intervalCompressionMultiplier) { synchronized (mOnDiskLock) { synchronized (mInMemoryLock) { - // NOTE: We allow this call if persistence is not initialized as - // it is a part of the persistence initialization process. boolean resampleHistory = false; Slog.i(LOG_TAG, "New history parameters: mode:" + AppOpsManager.historicalModeToString(mMode) + " baseSnapshotInterval:" @@ -463,7 +412,7 @@ final class HistoricalRegistry { if (mMode != mode) { mMode = mode; if (mMode == AppOpsManager.HISTORICAL_MODE_DISABLED) { - clearHistoryOnDiskDLocked(); + clearHistoryOnDiskLocked(); } } if (mBaseSnapshotInterval != baseSnapshotInterval) { @@ -484,10 +433,6 @@ final class HistoricalRegistry { void offsetHistory(long offsetMillis) { synchronized (mOnDiskLock) { synchronized (mInMemoryLock) { - if (!isPersistenceInitializedMLocked()) { - Slog.e(LOG_TAG, "Interaction before persistence initialized"); - return; - } final List history = mPersistence.readHistoryDLocked(); clearHistory(); if (history != null) { @@ -508,10 +453,6 @@ final class HistoricalRegistry { void addHistoricalOps(HistoricalOps ops) { final List pendingWrites; synchronized (mInMemoryLock) { - if (!isPersistenceInitializedMLocked()) { - Slog.e(LOG_TAG, "Interaction before persistence initialized"); - return; - } // The history files start from mBaseSnapshotInterval - take this into account. ops.offsetBeginAndEndTime(mBaseSnapshotInterval); mPendingWrites.offerFirst(ops); @@ -527,10 +468,6 @@ final class HistoricalRegistry { } void resetHistoryParameters() { - if (!isPersistenceInitializedMLocked()) { - Slog.e(LOG_TAG, "Interaction before persistence initialized"); - return; - } setHistoryParameters(DEFAULT_MODE, DEFAULT_SNAPSHOT_INTERVAL_MILLIS, DEFAULT_COMPRESSION_STEP); } @@ -538,10 +475,6 @@ final class HistoricalRegistry { void clearHistory(int uid, String packageName) { synchronized (mOnDiskLock) { synchronized (mInMemoryLock) { - if (!isPersistenceInitializedMLocked()) { - Slog.e(LOG_TAG, "Interaction before persistence initialized"); - return; - } if (mMode != AppOpsManager.HISTORICAL_MODE_ENABLED_ACTIVE) { return; } @@ -560,17 +493,11 @@ final class HistoricalRegistry { void clearHistory() { synchronized (mOnDiskLock) { - synchronized (mInMemoryLock) { - if (!isPersistenceInitializedMLocked()) { - Slog.e(LOG_TAG, "Interaction before persistence initialized"); - return; - } - clearHistoryOnDiskDLocked(); - } + clearHistoryOnDiskLocked(); } } - private void clearHistoryOnDiskDLocked() { + private void clearHistoryOnDiskLocked() { BackgroundThread.getHandler().removeMessages(MSG_WRITE_PENDING_HISTORY); synchronized (mInMemoryLock) { mCurrentHistoricalOps = null; @@ -791,28 +718,14 @@ final class HistoricalRegistry { baseDir = mHistoricalAppOpsDir.startRead(); final File[] files = baseDir.listFiles(); if (files != null && files.length > 0) { - File shortestFile = null; - for (File candidate : files) { - final String candidateName = candidate.getName(); - if (!candidateName.endsWith(HISTORY_FILE_SUFFIX)) { - continue; - } - if (shortestFile == null) { - shortestFile = candidate; - } else if (candidateName.length() < shortestFile.getName().length()) { - shortestFile = candidate; + final Set historyFiles = new ArraySet<>(); + Collections.addAll(historyFiles, files); + for (int i = 0;; i++) { + final File file = generateFile(baseDir, i); + if (historyFiles.contains(file)) { + return file.lastModified(); } } - if (shortestFile == null) { - return 0; - } - final String shortestNameNoExtension = shortestFile.getName() - .replace(HISTORY_FILE_SUFFIX, ""); - try { - return Long.parseLong(shortestNameNoExtension); - } catch (NumberFormatException e) { - return 0; - } } mHistoricalAppOpsDir.finishRead(); } catch (Throwable e) { -- GitLab From 95cbc93ab951477d241c00ba1e90066d01891b22 Mon Sep 17 00:00:00 2001 From: Wale Ogunwale Date: Tue, 4 Jun 2019 13:44:14 +0000 Subject: [PATCH 057/620] Revert "Collect NeededUriGrants without holding locks." This reverts commit 344ce7ce703f806f50ea253047d6dbbb10eaa424. Bug: 115619667 Bug: 134494852 Reason for revert: Causes "Permission Denial: opening provider" error Change-Id: I9986618b6e338fef9843b2103da6a728a36c6ea6 (cherry picked from commit 586a8ee7864d0530a3a0b6eb6079f8ab1e72128d) --- .../server/uri/UriGrantsManagerInternal.java | 4 +- .../server/uri/UriGrantsManagerService.java | 13 +-- .../com/android/server/wm/ActivityRecord.java | 8 +- .../com/android/server/wm/ActivityStack.java | 96 ++++++++------- .../server/wm/ActivityStackSupervisor.java | 24 ++-- .../server/wm/ActivityStartController.java | 2 +- .../android/server/wm/ActivityStarter.java | 110 ++++-------------- .../server/wm/ActivityTaskManagerService.java | 53 +++------ .../com/android/server/wm/TaskRecord.java | 10 +- .../server/wm/WindowProcessController.java | 2 +- .../android/server/wm/ActivityStackTests.java | 3 +- .../wm/ActivityStartControllerTests.java | 4 +- 12 files changed, 111 insertions(+), 218 deletions(-) diff --git a/services/core/java/com/android/server/uri/UriGrantsManagerInternal.java b/services/core/java/com/android/server/uri/UriGrantsManagerInternal.java index 94a1baa49deb..2f50fcb08c02 100644 --- a/services/core/java/com/android/server/uri/UriGrantsManagerInternal.java +++ b/services/core/java/com/android/server/uri/UriGrantsManagerInternal.java @@ -43,14 +43,14 @@ public interface UriGrantsManagerInternal { int callingUid, String targetPkg, Uri uri, int modeFlags, int userId); NeededUriGrants checkGrantUriPermissionFromIntent(int callingUid, String targetPkg, Intent intent, int mode, NeededUriGrants needed, int targetUserId); - NeededUriGrants checkGrantUriPermissionFromIntent(int callingUid, - Intent intent, String targetPkg, int targetUserId); /** * Grant Uri permissions from one app to another. This method only extends * permission grants if {@code callingUid} has permission to them. */ void grantUriPermissionFromIntent(int callingUid, String targetPkg, Intent intent, int targetUserId); + void grantUriPermissionFromIntent(int callingUid, + String targetPkg, Intent intent, UriPermissionOwner owner, int targetUserId); void grantUriPermissionUncheckedFromIntent( NeededUriGrants needed, UriPermissionOwner owner); IBinder newUriPermissionOwner(String name); diff --git a/services/core/java/com/android/server/uri/UriGrantsManagerService.java b/services/core/java/com/android/server/uri/UriGrantsManagerService.java index 04f7c7ee8574..8b332d271a3a 100644 --- a/services/core/java/com/android/server/uri/UriGrantsManagerService.java +++ b/services/core/java/com/android/server/uri/UriGrantsManagerService.java @@ -1362,21 +1362,20 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { } @Override - public NeededUriGrants checkGrantUriPermissionFromIntent(int callingUid, Intent intent, - String targetPkg, int targetUserId) { + public void grantUriPermissionFromIntent(int callingUid, String targetPkg, Intent intent, + int targetUserId) { synchronized (mLock) { - final int mode = (intent != null) ? intent.getFlags() : 0; - return UriGrantsManagerService.this.checkGrantUriPermissionFromIntent( - callingUid, targetPkg, intent, mode, null, targetUserId); + UriGrantsManagerService.this.grantUriPermissionFromIntent( + callingUid, targetPkg, intent, null, targetUserId); } } @Override public void grantUriPermissionFromIntent(int callingUid, String targetPkg, Intent intent, - int targetUserId) { + UriPermissionOwner owner, int targetUserId) { synchronized (mLock) { UriGrantsManagerService.this.grantUriPermissionFromIntent( - callingUid, targetPkg, intent, null, targetUserId); + callingUid, targetPkg, intent, owner, targetUserId); } } diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 7c4b5711cbe6..1344727ab36d 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -215,7 +215,6 @@ import com.android.server.AttributeCache; import com.android.server.AttributeCache.Entry; import com.android.server.am.AppTimeTracker; import com.android.server.am.PendingIntentRecord; -import com.android.server.uri.NeededUriGrants; import com.android.server.uri.UriPermissionOwner; import com.android.server.wm.ActivityMetricsLogger.WindowingModeTransitionInfoSnapshot; import com.android.server.wm.ActivityStack.ActivityState; @@ -1600,11 +1599,10 @@ final class ActivityRecord extends ConfigurationContainer { * Deliver a new Intent to an existing activity, so that its onNewIntent() * method will be called at the proper time. */ - final void deliverNewIntentLocked(int callingUid, Intent intent, NeededUriGrants intentGrants, - String referrer) { + final void deliverNewIntentLocked(int callingUid, Intent intent, String referrer) { // The activity now gets access to the data associated with this Intent. - mAtmService.mUgmInternal.grantUriPermissionUncheckedFromIntent(intentGrants, - getUriPermissionsLocked()); + mAtmService.mUgmInternal.grantUriPermissionFromIntent(callingUid, packageName, + intent, getUriPermissionsLocked(), mUserId); final ReferrerIntent rintent = new ReferrerIntent(intent, referrer); boolean unsent = true; final boolean isTopActivityWhileSleeping = isTopRunningActivity() && isSleeping(); diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 94c4a61e4159..b3b6efed1a37 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -163,7 +163,6 @@ import com.android.server.am.ActivityManagerService.ItemMatcher; import com.android.server.am.AppTimeTracker; import com.android.server.am.EventLogTags; import com.android.server.am.PendingIntentRecord; -import com.android.server.uri.NeededUriGrants; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -2782,7 +2781,7 @@ class ActivityStack extends ConfigurationContainer { if (DEBUG_STATES) Slog.d(TAG_STATES, "no-history finish of " + mLastNoHistoryActivity + " on new resume"); requestFinishActivityLocked(mLastNoHistoryActivity.appToken, Activity.RESULT_CANCELED, - null, null, "resume-no-history", false); + null, "resume-no-history", false); mLastNoHistoryActivity = null; } @@ -3016,7 +3015,7 @@ class ActivityStack extends ConfigurationContainer { // If any exception gets thrown, toss away this // activity and try the next one. Slog.w(TAG, "Exception thrown during resume of " + next, e); - requestFinishActivityLocked(next.appToken, Activity.RESULT_CANCELED, null, null, + requestFinishActivityLocked(next.appToken, Activity.RESULT_CANCELED, null, "resume-exception", true); return true; } @@ -3426,7 +3425,7 @@ class ActivityStack extends ConfigurationContainer { if (DEBUG_TASKS) Slog.w(TAG_TASKS, "resetTaskIntendedTask: calling finishActivity on " + p); if (finishActivityLocked( - p, Activity.RESULT_CANCELED, null, null, "reset-task", false)) { + p, Activity.RESULT_CANCELED, null, "reset-task", false)) { end--; srcPos--; } @@ -3505,7 +3504,7 @@ class ActivityStack extends ConfigurationContainer { continue; } finishActivityLocked( - p, Activity.RESULT_CANCELED, null, null, "move-affinity", false); + p, Activity.RESULT_CANCELED, null, "move-affinity", false); } } else { if (taskInsertionPoint < 0) { @@ -3539,8 +3538,8 @@ class ActivityStack extends ConfigurationContainer { if (targetNdx > 0) { ActivityRecord p = taskActivities.get(targetNdx - 1); if (p.intent.getComponent().equals(target.intent.getComponent())) { - finishActivityLocked(p, Activity.RESULT_CANCELED, null, null, - "replace", false); + finishActivityLocked(p, Activity.RESULT_CANCELED, null, "replace", + false); } } } @@ -3600,21 +3599,22 @@ class ActivityStack extends ConfigurationContainer { return taskTop; } - void sendActivityResultLocked(int callingUid, ActivityRecord r, String resultWho, - int requestCode, int resultCode, Intent resultData, NeededUriGrants resultGrants) { + void sendActivityResultLocked(int callingUid, ActivityRecord r, + String resultWho, int requestCode, int resultCode, Intent data) { + if (callingUid > 0) { - mService.mUgmInternal.grantUriPermissionUncheckedFromIntent(resultGrants, - r.getUriPermissionsLocked()); + mService.mUgmInternal.grantUriPermissionFromIntent(callingUid, r.packageName, + data, r.getUriPermissionsLocked(), r.mUserId); } if (DEBUG_RESULTS) Slog.v(TAG, "Send activity result to " + r + " : who=" + resultWho + " req=" + requestCode - + " res=" + resultCode + " data=" + resultData); + + " res=" + resultCode + " data=" + data); if (mResumedActivity == r && r.attachedToProcess()) { try { ArrayList list = new ArrayList(); list.add(new ResultInfo(resultWho, requestCode, - resultCode, resultData)); + resultCode, data)); mService.getLifecycleManager().scheduleTransaction(r.app.getThread(), r.appToken, ActivityResultItem.obtain(list)); return; @@ -3623,7 +3623,7 @@ class ActivityStack extends ConfigurationContainer { } } - r.addResultLocked(null, resultWho, requestCode, resultCode, resultData); + r.addResultLocked(null, resultWho, requestCode, resultCode, data); } /** Returns true if the task is one of the task finishing on-top of the top running task. */ @@ -3730,8 +3730,8 @@ class ActivityStack extends ConfigurationContainer { if (!r.finishing) { if (!shouldSleepActivities()) { if (DEBUG_STATES) Slog.d(TAG_STATES, "no-history finish of " + r); - if (requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, - null, null, "stop-no-history", false)) { + if (requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, + "stop-no-history", false)) { // If {@link requestFinishActivityLocked} returns {@code true}, // {@link adjustFocusedActivityStack} would have been already called. r.resumeKeyDispatchingLocked(); @@ -3787,7 +3787,7 @@ class ActivityStack extends ConfigurationContainer { * some reason it is being left as-is. */ final boolean requestFinishActivityLocked(IBinder token, int resultCode, - Intent resultData, NeededUriGrants resultGrants, String reason, boolean oomAdj) { + Intent resultData, String reason, boolean oomAdj) { ActivityRecord r = isInStackLocked(token); if (DEBUG_RESULTS || DEBUG_STATES) Slog.v(TAG_STATES, "Finishing activity token=" + token + " r=" @@ -3797,7 +3797,7 @@ class ActivityStack extends ConfigurationContainer { return false; } - finishActivityLocked(r, resultCode, resultData, resultGrants, reason, oomAdj); + finishActivityLocked(r, resultCode, resultData, reason, oomAdj); return true; } @@ -3809,8 +3809,8 @@ class ActivityStack extends ConfigurationContainer { if (r.resultTo == self && r.requestCode == requestCode) { if ((r.resultWho == null && resultWho == null) || (r.resultWho != null && r.resultWho.equals(resultWho))) { - finishActivityLocked(r, Activity.RESULT_CANCELED, null, null, - "request-sub", false); + finishActivityLocked(r, Activity.RESULT_CANCELED, null, "request-sub", + false); } } } @@ -3840,7 +3840,7 @@ class ActivityStack extends ConfigurationContainer { int activityNdx = task.mActivities.indexOf(r); getDisplay().mDisplayContent.prepareAppTransition( TRANSIT_CRASHING_ACTIVITY_CLOSE, false /* alwaysKeepCurrent */); - finishActivityLocked(r, Activity.RESULT_CANCELED, null, null, reason, false); + finishActivityLocked(r, Activity.RESULT_CANCELED, null, reason, false); finishedTask = task; // Also terminate any activities below it that aren't yet // stopped, to avoid a situation where one will get @@ -3861,7 +3861,7 @@ class ActivityStack extends ConfigurationContainer { if (!r.isActivityTypeHome() || mService.mHomeProcess != r.app) { Slog.w(TAG, " Force finishing activity " + r.intent.getComponent().flattenToShortString()); - finishActivityLocked(r, Activity.RESULT_CANCELED, null, null, reason, false); + finishActivityLocked(r, Activity.RESULT_CANCELED, null, reason, false); } } } @@ -3877,8 +3877,8 @@ class ActivityStack extends ConfigurationContainer { for (int activityNdx = tr.mActivities.size() - 1; activityNdx >= 0; --activityNdx) { ActivityRecord r = tr.mActivities.get(activityNdx); if (!r.finishing) { - finishActivityLocked(r, Activity.RESULT_CANCELED, null, null, - "finish-voice", false); + finishActivityLocked(r, Activity.RESULT_CANCELED, null, "finish-voice", + false); didOne = true; } } @@ -3914,14 +3914,12 @@ class ActivityStack extends ConfigurationContainer { if (!Objects.equals(cur.taskAffinity, r.taskAffinity)) { break; } - finishActivityLocked(cur, Activity.RESULT_CANCELED, null, null, - "request-affinity", true); + finishActivityLocked(cur, Activity.RESULT_CANCELED, null, "request-affinity", true); } return true; } - private void finishActivityResultsLocked(ActivityRecord r, int resultCode, Intent resultData, - NeededUriGrants resultGrants) { + private void finishActivityResultsLocked(ActivityRecord r, int resultCode, Intent resultData) { // send the result ActivityRecord resultTo = r.resultTo; if (resultTo != null) { @@ -3934,8 +3932,9 @@ class ActivityStack extends ConfigurationContainer { } } if (r.info.applicationInfo.uid > 0) { - mService.mUgmInternal.grantUriPermissionUncheckedFromIntent(resultGrants, - resultTo.getUriPermissionsLocked()); + mService.mUgmInternal.grantUriPermissionFromIntent(r.info.applicationInfo.uid, + resultTo.packageName, resultData, + resultTo.getUriPermissionsLocked(), resultTo.mUserId); } resultTo.addResultLocked(r, r.resultWho, r.requestCode, resultCode, resultData); r.resultTo = null; @@ -3951,10 +3950,12 @@ class ActivityStack extends ConfigurationContainer { r.icicle = null; } + /** + * See {@link #finishActivityLocked(ActivityRecord, int, Intent, String, boolean, boolean)} + */ final boolean finishActivityLocked(ActivityRecord r, int resultCode, Intent resultData, - NeededUriGrants resultGrants, String reason, boolean oomAdj) { - return finishActivityLocked(r, resultCode, resultData, resultGrants, reason, oomAdj, - !PAUSE_IMMEDIATELY); + String reason, boolean oomAdj) { + return finishActivityLocked(r, resultCode, resultData, reason, oomAdj, !PAUSE_IMMEDIATELY); } /** @@ -3962,7 +3963,7 @@ class ActivityStack extends ConfigurationContainer { * list, or false if it is still in the list and will be removed later. */ final boolean finishActivityLocked(ActivityRecord r, int resultCode, Intent resultData, - NeededUriGrants resultGrants, String reason, boolean oomAdj, boolean pauseImmediately) { + String reason, boolean oomAdj, boolean pauseImmediately) { if (r.finishing) { Slog.w(TAG, "Duplicate finish request for " + r); return false; @@ -3992,7 +3993,7 @@ class ActivityStack extends ConfigurationContainer { adjustFocusedActivityStack(r, "finishActivity"); - finishActivityResultsLocked(r, resultCode, resultData, resultGrants); + finishActivityResultsLocked(r, resultCode, resultData); final boolean endTask = index <= 0 && !task.isClearingToReuseTask(); final int transit = endTask ? TRANSIT_TASK_CLOSE : TRANSIT_ACTIVITY_CLOSE; @@ -4225,9 +4226,8 @@ class ActivityStack extends ConfigurationContainer { return false; } - final boolean navigateUpToLocked(ActivityRecord srec, Intent destIntent, - NeededUriGrants destGrants, int resultCode, Intent resultData, - NeededUriGrants resultGrants) { + final boolean navigateUpToLocked(ActivityRecord srec, Intent destIntent, int resultCode, + Intent resultData) { final TaskRecord task = srec.getTaskRecord(); final ArrayList activities = task.mActivities; final int start = activities.indexOf(srec); @@ -4274,8 +4274,7 @@ class ActivityStack extends ConfigurationContainer { final long origId = Binder.clearCallingIdentity(); for (int i = start; i > finishTo; i--) { ActivityRecord r = activities.get(i); - requestFinishActivityLocked(r.appToken, resultCode, resultData, resultGrants, - "navigate-up", true); + requestFinishActivityLocked(r.appToken, resultCode, resultData, "navigate-up", true); // Only return the supplied result for the first activity finished resultCode = Activity.RESULT_CANCELED; resultData = null; @@ -4289,7 +4288,7 @@ class ActivityStack extends ConfigurationContainer { parentLaunchMode == ActivityInfo.LAUNCH_SINGLE_TOP || (destIntentFlags & Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { parent.deliverNewIntentLocked(srec.info.applicationInfo.uid, destIntent, - destGrants, srec.packageName); + srec.packageName); } else { try { ActivityInfo aInfo = AppGlobals.getPackageManager().getActivityInfo( @@ -4313,7 +4312,7 @@ class ActivityStack extends ConfigurationContainer { foundParentInTask = false; } requestFinishActivityLocked(parent.appToken, resultCode, - resultData, resultGrants, "navigate-top", true); + resultData, "navigate-top", true); } } Binder.restoreCallingIdentity(origId); @@ -4398,7 +4397,7 @@ class ActivityStack extends ConfigurationContainer { } private void removeActivityFromHistoryLocked(ActivityRecord r, String reason) { - finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null, null); + finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null); r.makeFinishingLocked(); if (DEBUG_ADD_REMOVE) Slog.i(TAG_ADD_REMOVE, "Removing activity " + r + " from stack callers=" + Debug.getCallers(5)); @@ -5130,8 +5129,7 @@ class ActivityStack extends ConfigurationContainer { for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { final ActivityRecord r = activities.get(activityNdx); if ((r.info.flags&ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS) != 0) { - finishActivityLocked(r, Activity.RESULT_CANCELED, null, null, - "close-sys", true); + finishActivityLocked(r, Activity.RESULT_CANCELED, null, "close-sys", true); } } } @@ -5175,8 +5173,8 @@ class ActivityStack extends ConfigurationContainer { didSomething = true; Slog.i(TAG, " Force finishing activity " + r); lastTask = r.getTaskRecord(); - finishActivityLocked(r, Activity.RESULT_CANCELED, null, null, - "force-stop", true); + finishActivityLocked(r, Activity.RESULT_CANCELED, null, "force-stop", + true); } } } @@ -5230,8 +5228,8 @@ class ActivityStack extends ConfigurationContainer { final ArrayList activities = mTaskHistory.get(top).mActivities; int activityTop = activities.size() - 1; if (activityTop >= 0) { - finishActivityLocked(activities.get(activityTop), Activity.RESULT_CANCELED, - null, null, "unhandled-back", true); + finishActivityLocked(activities.get(activityTop), Activity.RESULT_CANCELED, null, + "unhandled-back", true); } } } diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java index 8d2a92acc91f..c992a69c2ecb 100644 --- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java @@ -140,7 +140,6 @@ import com.android.internal.util.function.pooled.PooledLambda; import com.android.server.am.ActivityManagerService; import com.android.server.am.EventLogTags; import com.android.server.am.UserState; -import com.android.server.uri.NeededUriGrants; import java.io.FileDescriptor; import java.io.IOException; @@ -404,17 +403,14 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { final int startFlags; final ActivityStack stack; final WindowProcessController callerApp; - final NeededUriGrants neededGrants; - PendingActivityLaunch(ActivityRecord r, ActivityRecord sourceRecord, - int startFlags, ActivityStack stack, WindowProcessController callerApp, - NeededUriGrants neededGrants) { - this.r = r; - this.sourceRecord = sourceRecord; - this.startFlags = startFlags; - this.stack = stack; - this.callerApp = callerApp; - this.neededGrants = neededGrants; + PendingActivityLaunch(ActivityRecord _r, ActivityRecord _sourceRecord, + int _startFlags, ActivityStack _stack, WindowProcessController app) { + r = _r; + sourceRecord = _sourceRecord; + startFlags = _startFlags; + stack = _stack; + callerApp = app; } void sendErrorResult(String message) { @@ -878,8 +874,8 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { Slog.e(TAG, "Second failure launching " + r.intent.getComponent().flattenToShortString() + ", giving up", e); proc.appDied(); - stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, - null, null, "2nd-crash", false); + stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, + "2nd-crash", false); return false; } @@ -1024,7 +1020,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { if (resultRecord != null) { resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode, - Activity.RESULT_CANCELED, null, null); + Activity.RESULT_CANCELED, null); } final String msg; if (actionRestriction == ACTIVITY_RESTRICTION_PERMISSION) { diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java index 738d143280d9..919141c13622 100644 --- a/services/core/java/com/android/server/wm/ActivityStartController.java +++ b/services/core/java/com/android/server/wm/ActivityStartController.java @@ -462,7 +462,7 @@ public class ActivityStartController { "pendingActivityLaunch"); try { starter.startResolvedActivity(pal.r, pal.sourceRecord, null, null, pal.startFlags, - resume, pal.r.pendingOptions, null, pal.neededGrants); + resume, pal.r.pendingOptions, null); } catch (Exception e) { Slog.e(TAG, "Exception during pending activity launch pal=" + pal, e); pal.sendErrorResult(e.getMessage()); diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index fb18569ba637..1718ac634b10 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -127,7 +127,6 @@ import com.android.internal.app.IVoiceInteractor; import com.android.server.am.EventLogTags; import com.android.server.am.PendingIntentRecord; import com.android.server.pm.InstantAppResolver; -import com.android.server.uri.NeededUriGrants; import com.android.server.wm.ActivityStackSupervisor.PendingActivityLaunch; import com.android.server.wm.LaunchParamsController.LaunchParams; @@ -550,8 +549,7 @@ class ActivityStarter { */ int startResolvedActivity(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, - int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask, - NeededUriGrants neededGrants) { + int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask) { try { mSupervisor.getActivityMetricsLogger().notifyActivityLaunching(r.intent); mLastStartReason = "startResolvedActivity"; @@ -559,7 +557,7 @@ class ActivityStarter { mLastStartActivityRecord[0] = r; mLastStartActivityResult = startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags, doResume, options, inTask, mLastStartActivityRecord, - false /* restrictedBgActivity */, neededGrants); + false /* restrictedBgActivity */); mSupervisor.getActivityMetricsLogger().notifyActivityLaunched(mLastStartActivityResult, mLastStartActivityRecord[0]); return mLastStartActivityResult; @@ -578,33 +576,6 @@ class ActivityStarter { boolean allowPendingRemoteAnimationRegistryLookup, PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart) { - // Carefully collect grants without holding lock - NeededUriGrants neededGrants = null; - if (aInfo != null) { - neededGrants = mService.mUgmInternal.checkGrantUriPermissionFromIntent( - resolveCallingUid(mRequest.caller), intent, aInfo.applicationInfo.packageName, - UserHandle.getUserId(aInfo.applicationInfo.uid)); - } - - return startActivity(caller, intent, ephemeralIntent, resolvedType, aInfo, rInfo, - voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid, - callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options, - ignoreTargetSecurity, componentSpecified, outActivity, inTask, reason, - allowPendingRemoteAnimationRegistryLookup, originatingPendingIntent, - allowBackgroundActivityStart, neededGrants); - } - - private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent, - String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo, - IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, - IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid, - String callingPackage, int realCallingPid, int realCallingUid, int startFlags, - SafeActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified, - ActivityRecord[] outActivity, TaskRecord inTask, String reason, - boolean allowPendingRemoteAnimationRegistryLookup, - PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart, - NeededUriGrants neededGrants) { - if (TextUtils.isEmpty(reason)) { throw new IllegalArgumentException("Need to specify a reason."); } @@ -617,7 +588,7 @@ class ActivityStarter { callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options, ignoreTargetSecurity, componentSpecified, mLastStartActivityRecord, inTask, allowPendingRemoteAnimationRegistryLookup, originatingPendingIntent, - allowBackgroundActivityStart, neededGrants); + allowBackgroundActivityStart); if (outActivity != null) { // mLastStartActivityRecord[0] is set in the call to startActivity above. @@ -648,8 +619,7 @@ class ActivityStarter { SafeActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity, TaskRecord inTask, boolean allowPendingRemoteAnimationRegistryLookup, - PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart, - NeededUriGrants neededGrants) { + PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart) { mSupervisor.getActivityMetricsLogger().notifyActivityLaunching(intent); int err = ActivityManager.START_SUCCESS; // Pull the optional Ephemeral Installer-only bundle out of the options early. @@ -784,7 +754,7 @@ class ActivityStarter { if (err != START_SUCCESS) { if (resultRecord != null) { resultStack.sendActivityResultLocked( - -1, resultRecord, resultWho, requestCode, RESULT_CANCELED, null, null); + -1, resultRecord, resultWho, requestCode, RESULT_CANCELED, null); } SafeActivityOptions.abort(options); return err; @@ -844,16 +814,12 @@ class ActivityStarter { callingPid = mInterceptor.mCallingPid; callingUid = mInterceptor.mCallingUid; checkedOptions = mInterceptor.mActivityOptions; - - // The interception target shouldn't get any permission grants - // intended for the original destination - neededGrants = null; } if (abort) { if (resultRecord != null) { resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode, - RESULT_CANCELED, null, null); + RESULT_CANCELED, null); } // We pretend to the caller that it was really started, but // they will just get a cancel result. @@ -909,10 +875,6 @@ class ActivityStarter { aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, null /*profilerInfo*/); - // The permissions review target shouldn't get any permission - // grants intended for the original destination - neededGrants = null; - if (DEBUG_PERMISSIONS_REVIEW) { final ActivityStack focusedStack = mRootActivityContainer.getTopDisplayFocusedStack(); @@ -935,10 +897,6 @@ class ActivityStarter { callingPid = realCallingPid; aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, null /*profilerInfo*/); - - // The ephemeral installer shouldn't get any permission grants - // intended for the original destination - neededGrants = null; } ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid, @@ -965,7 +923,7 @@ class ActivityStarter { realCallingPid, realCallingUid, "Activity start")) { if (!(restrictedBgActivity && handleBackgroundActivityAbort(r))) { mController.addPendingActivityLaunch(new PendingActivityLaunch(r, - sourceRecord, startFlags, stack, callerApp, neededGrants)); + sourceRecord, startFlags, stack, callerApp)); } ActivityOptions.abort(checkedOptions); return ActivityManager.START_SWITCHES_CANCELED; @@ -976,8 +934,7 @@ class ActivityStarter { mController.doPendingActivityLaunches(false); final int res = startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags, - true /* doResume */, checkedOptions, inTask, outActivity, restrictedBgActivity, - neededGrants); + true /* doResume */, checkedOptions, inTask, outActivity, restrictedBgActivity); mSupervisor.getActivityMetricsLogger().notifyActivityLaunched(res, outActivity[0]); return res; } @@ -1275,15 +1232,9 @@ class ActivityStarter { } } } - // Collect information about the target of the Intent. ActivityInfo aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, profilerInfo); - // Carefully collect grants without holding lock - NeededUriGrants neededGrants = mService.mUgmInternal.checkGrantUriPermissionFromIntent( - resolveCallingUid(mRequest.caller), intent, aInfo.applicationInfo.packageName, - UserHandle.getUserId(aInfo.applicationInfo.uid)); - synchronized (mService.mGlobalLock) { final ActivityStack stack = mRootActivityContainer.getTopDisplayFocusedStack(); stack.mConfigWillChange = globalConfig != null @@ -1360,7 +1311,7 @@ class ActivityStarter { callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options, ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason, allowPendingRemoteAnimationRegistryLookup, originatingPendingIntent, - allowBackgroundActivityStart, neededGrants); + allowBackgroundActivityStart); Binder.restoreCallingIdentity(origId); @@ -1455,16 +1406,14 @@ class ActivityStarter { private int startActivity(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, - int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask, - ActivityRecord[] outActivity, boolean restrictedBgActivity, - NeededUriGrants neededGrants) { + int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask, + ActivityRecord[] outActivity, boolean restrictedBgActivity) { int result = START_CANCELED; final ActivityStack startedActivityStack; try { mService.mWindowManager.deferSurfaceLayout(); result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor, - startFlags, doResume, options, inTask, outActivity, restrictedBgActivity, - neededGrants); + startFlags, doResume, options, inTask, outActivity, restrictedBgActivity); } finally { final ActivityStack currentStack = r.getActivityStack(); startedActivityStack = currentStack != null ? currentStack : mTargetStack; @@ -1489,8 +1438,7 @@ class ActivityStarter { final ActivityStack stack = mStartActivity.getActivityStack(); if (stack != null) { stack.finishActivityLocked(mStartActivity, RESULT_CANCELED, - null /* resultData */, null /* resultGrants */, - "startActivity", true /* oomAdj */); + null /* intentResultData */, "startActivity", true /* oomAdj */); } } mService.mWindowManager.continueSurfaceLayout(); @@ -1519,7 +1467,7 @@ class ActivityStarter { if (resultRecord != null) { ActivityStack resultStack = resultRecord.getActivityStack(); resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode, - RESULT_CANCELED, null, null); + RESULT_CANCELED, null); } // We pretend to the caller that it was really started to make it backward compatible, but // they will just get a cancel result. @@ -1531,8 +1479,7 @@ class ActivityStarter { private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask, - ActivityRecord[] outActivity, boolean restrictedBgActivity, - NeededUriGrants neededGrants) { + ActivityRecord[] outActivity, boolean restrictedBgActivity) { setInitialState(r, options, inTask, doResume, startFlags, sourceRecord, voiceSession, voiceInteractor, restrictedBgActivity); @@ -1682,7 +1629,7 @@ class ActivityStarter { if (sourceStack != null) { sourceStack.sendActivityResultLocked(-1 /* callingUid */, mStartActivity.resultTo, mStartActivity.resultWho, mStartActivity.requestCode, RESULT_CANCELED, - null /* resultData */, null /* resultGrants */); + null /* data */); } ActivityOptions.abort(mOptions); return START_CLASS_NOT_FOUND; @@ -1749,8 +1696,8 @@ class ActivityStarter { return result; } - mService.mUgmInternal.grantUriPermissionUncheckedFromIntent(neededGrants, - mStartActivity.getUriPermissionsLocked()); + mService.mUgmInternal.grantUriPermissionFromIntent(mCallingUid, mStartActivity.packageName, + mIntent, mStartActivity.getUriPermissionsLocked(), mStartActivity.mUserId); mService.getPackageManagerInternalLocked().grantEphemeralAccess( mStartActivity.mUserId, mIntent, UserHandle.getAppId(mStartActivity.appInfo.uid), UserHandle.getAppId(mCallingUid)); @@ -1986,7 +1933,7 @@ class ActivityStarter { Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result."); sourceStack.sendActivityResultLocked(-1 /* callingUid */, mStartActivity.resultTo, mStartActivity.resultWho, mStartActivity.requestCode, RESULT_CANCELED, - null /* resultData */, null /* resultGrants */); + null /* data */); mStartActivity.resultTo = null; } } @@ -2415,13 +2362,8 @@ class ActivityStarter { } ActivityStack.logStartActivity(AM_NEW_INTENT, activity, activity.getTaskRecord()); - - Intent intent = mStartActivity.intent; - NeededUriGrants intentGrants = mService.mUgmInternal.checkGrantUriPermissionFromIntent( - mCallingUid, intent, activity.packageName, activity.mUserId); - activity.deliverNewIntentLocked(mCallingUid, intent, intentGrants, + activity.deliverNewIntentLocked(mCallingUid, mStartActivity.intent, mStartActivity.launchedFromPackage); - mIntentDelivered = true; } @@ -2800,18 +2742,6 @@ class ActivityStarter { } } - private int resolveCallingUid(IApplicationThread caller) { - if (caller != null) { - synchronized (mService.mGlobalLock) { - final WindowProcessController callerApp = mService.getProcessController(caller); - if (callerApp != null) { - return callerApp.mInfo.uid; - } - } - } - return -1; - } - private boolean isLaunchModeOneOf(int mode1, int mode2) { return mode1 == mLaunchMode || mode2 == mLaunchMode; } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index b123aa5d20c7..444e2190aba4 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -265,7 +265,6 @@ import com.android.server.appop.AppOpsService; import com.android.server.firewall.IntentFirewall; import com.android.server.pm.UserManagerService; import com.android.server.policy.PermissionPolicyInternal; -import com.android.server.uri.NeededUriGrants; import com.android.server.uri.UriGrantsManagerInternal; import com.android.server.vr.VrManagerInternal; @@ -1541,19 +1540,11 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { throw new IllegalArgumentException("File descriptors passed in Intent"); } - final ActivityRecord r; synchronized (mGlobalLock) { - r = ActivityRecord.isInStackLocked(token); + ActivityRecord r = ActivityRecord.isInStackLocked(token); if (r == null) { return true; } - } - - // Carefully collect grants without holding lock - final NeededUriGrants resultGrants = mUgmInternal.checkGrantUriPermissionFromIntent( - Binder.getCallingUid(), resultData, r.packageName, r.mUserId); - - synchronized (mGlobalLock) { // Keep track of the root activity of the task before we finish it final TaskRecord tr = r.getTaskRecord(); ActivityRecord rootR = tr.getRootActivity(); @@ -1615,7 +1606,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { r.mRelaunchReason = RELAUNCH_REASON_NONE; } else { res = tr.getStack().requestFinishActivityLocked(token, resultCode, - resultData, resultGrants, "app-request", true); + resultData, "app-request", true); if (!res) { Slog.i(TAG, "Failed to finish by app-request"); } @@ -2141,23 +2132,14 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public boolean navigateUpTo(IBinder token, Intent destIntent, int resultCode, Intent resultData) { - final ActivityRecord r; - synchronized (mGlobalLock) { - r = ActivityRecord.isInStackLocked(token); - if (r == null) { - return false; - } - } - - // Carefully collect grants without holding lock - final NeededUriGrants destGrants = mUgmInternal.checkGrantUriPermissionFromIntent( - Binder.getCallingUid(), destIntent, r.packageName, r.mUserId); - final NeededUriGrants resultGrants = mUgmInternal.checkGrantUriPermissionFromIntent( - Binder.getCallingUid(), resultData, r.packageName, r.mUserId); synchronized (mGlobalLock) { - return r.getActivityStack().navigateUpToLocked( - r, destIntent, destGrants, resultCode, resultData, resultGrants); + final ActivityRecord r = ActivityRecord.forTokenLocked(token); + if (r != null) { + return r.getActivityStack().navigateUpToLocked( + r, destIntent, resultCode, resultData); + } + return false; } } @@ -6615,23 +6597,14 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public void sendActivityResult(int callingUid, IBinder activityToken, String resultWho, - int requestCode, int resultCode, Intent resultData) { - final ActivityRecord r; + int requestCode, int resultCode, Intent data) { synchronized (mGlobalLock) { - r = ActivityRecord.isInStackLocked(activityToken); - if (r == null || r.getActivityStack() == null) { - return; + final ActivityRecord r = ActivityRecord.isInStackLocked(activityToken); + if (r != null && r.getActivityStack() != null) { + r.getActivityStack().sendActivityResultLocked(callingUid, r, resultWho, + requestCode, resultCode, data); } } - - // Carefully collect grants without holding lock - final NeededUriGrants resultGrants = mUgmInternal.checkGrantUriPermissionFromIntent( - Binder.getCallingUid(), resultData, r.packageName, r.mUserId); - - synchronized (mGlobalLock) { - r.getActivityStack().sendActivityResultLocked(callingUid, r, resultWho, - requestCode, resultCode, resultData, resultGrants); - } } @Override diff --git a/services/core/java/com/android/server/wm/TaskRecord.java b/services/core/java/com/android/server/wm/TaskRecord.java index 4a0bf02ab517..298b302a17fb 100644 --- a/services/core/java/com/android/server/wm/TaskRecord.java +++ b/services/core/java/com/android/server/wm/TaskRecord.java @@ -1442,7 +1442,7 @@ class TaskRecord extends ConfigurationContainer { mActivities.remove(activityNdx); --activityNdx; --numActivities; - } else if (mStack.finishActivityLocked(r, Activity.RESULT_CANCELED, null, null, + } else if (mStack.finishActivityLocked(r, Activity.RESULT_CANCELED, null, reason, false, pauseImmediately)) { --activityNdx; --numActivities; @@ -1497,8 +1497,8 @@ class TaskRecord extends ConfigurationContainer { if (opts != null) { ret.updateOptionsLocked(opts); } - if (mStack != null && mStack.finishActivityLocked(r, Activity.RESULT_CANCELED, - null, null, "clear-task-stack", false)) { + if (mStack != null && mStack.finishActivityLocked( + r, Activity.RESULT_CANCELED, null, "clear-task-stack", false)) { --activityNdx; --numActivities; } @@ -1512,8 +1512,8 @@ class TaskRecord extends ConfigurationContainer { && !ActivityStarter.isDocumentLaunchesIntoExisting(launchFlags)) { if (!ret.finishing) { if (mStack != null) { - mStack.finishActivityLocked(ret, Activity.RESULT_CANCELED, - null, null, "clear-task-top", false); + mStack.finishActivityLocked( + ret, Activity.RESULT_CANCELED, null, "clear-task-top", false); } return null; } diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index fbd4ec7ff536..2ad25cf123e2 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -623,7 +623,7 @@ public class WindowProcessController extends ConfigurationContainer Date: Tue, 4 Jun 2019 18:20:12 -0700 Subject: [PATCH 058/620] Add isEnabled to AttentionDetector dumpsys And a corresponding state to AMS dumpsys. Bug: 134531724 Test: adb shell dumpsys power | attention Change-Id: Id33c8ec4682b1fdb82c6f340b4dca65c4986258e --- .../com/android/server/attention/AttentionManagerService.java | 2 +- .../core/java/com/android/server/power/AttentionDetector.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/attention/AttentionManagerService.java b/services/core/java/com/android/server/attention/AttentionManagerService.java index 3b19d0875f5f..95770fbf313b 100644 --- a/services/core/java/com/android/server/attention/AttentionManagerService.java +++ b/services/core/java/com/android/server/attention/AttentionManagerService.java @@ -377,7 +377,7 @@ public class AttentionManagerService extends SystemService { private void dumpInternal(IndentingPrintWriter ipw) { ipw.println("Attention Manager Service (dumpsys attention) state:\n"); - + ipw.println("isServiceEnabled=" + isServiceEnabled()); ipw.println("AttentionServicePackageName=" + getServiceConfigPackage(mContext)); ipw.println("Resolved component:"); if (mComponentName != null) { diff --git a/services/core/java/com/android/server/power/AttentionDetector.java b/services/core/java/com/android/server/power/AttentionDetector.java index ed11fd45ec39..8e4c34a883dc 100644 --- a/services/core/java/com/android/server/power/AttentionDetector.java +++ b/services/core/java/com/android/server/power/AttentionDetector.java @@ -297,6 +297,7 @@ public class AttentionDetector { public void dump(PrintWriter pw) { pw.println("AttentionDetector:"); + pw.println(" mIsSettingEnabled=" + mIsSettingEnabled); pw.println(" mMaximumExtensionMillis=" + mMaximumExtensionMillis); pw.println(" mMaxAttentionApiTimeoutMillis=" + mMaxAttentionApiTimeoutMillis); pw.println(" mLastUserActivityTime(excludingAttention)=" + mLastUserActivityTime); -- GitLab From 877adf1dfd1810aa590a9d7d659c6efe5ef17d36 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Tue, 4 Jun 2019 18:56:49 -0700 Subject: [PATCH 059/620] Lock screen string change Test: manual Fixes: 133876098 Change-Id: Ie45c68098b7e4cf4605c33ea4767444ddc85537e --- packages/SystemUI/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 3fe24929a778..fdf0bc949ae0 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -953,8 +953,8 @@ Tap again to open - - Swipe up to unlock + + Swipe up to open This device is managed by your organization -- GitLab From 7825b944b7ff956578f89cb9d19128afa76809d7 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Mon, 3 Jun 2019 20:22:39 -0700 Subject: [PATCH 060/620] Longer bouncer delay and simpler delay logic Delay it for a little longer and always delay bouncer even if auth didn't start yet. Test: atest KeyguardBouncerTest Test: swipe up from bouncer twice (before and after face auth) Test: reboot, swipe up, observe no delay Fixes: 134064323 Change-Id: I723e3ae72a6ba34c05ce41fa989c186c399f3ada --- .../src/com/android/keyguard/KeyguardUpdateMonitor.java | 5 +++++ .../src/com/android/systemui/SystemUIFactory.java | 5 +++-- .../systemui/statusbar/phone/KeyguardBouncer.java | 9 ++++++--- .../systemui/statusbar/phone/KeyguardBouncerTest.java | 6 ++++-- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 26d3d86778e4..9feca3d2865a 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -933,6 +933,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { == LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN; } + public boolean userNeedsStrongAuth() { + return mStrongAuthTracker.getStrongAuthForUser(getCurrentUser()) + != LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED; + } + public boolean needsSlowUnlockTransition() { return mNeedsSlowUnlockTransition; } diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java index 0fdab014439b..34cc70c1c42d 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java @@ -60,6 +60,7 @@ import com.android.systemui.statusbar.phone.ScrimState; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; +import com.android.systemui.statusbar.phone.UnlockMethodCache; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.util.InjectionInflationController; import com.android.systemui.util.leak.GarbageMonitor; @@ -130,8 +131,8 @@ public class SystemUIFactory { KeyguardBouncer.BouncerExpansionCallback expansionCallback) { return new KeyguardBouncer(context, callback, lockPatternUtils, container, dismissCallbackRegistry, FalsingManagerFactory.getInstance(context), - expansionCallback, KeyguardUpdateMonitor.getInstance(context), - new Handler(Looper.getMainLooper())); + expansionCallback, UnlockMethodCache.getInstance(context), + KeyguardUpdateMonitor.getInstance(context), new Handler(Looper.getMainLooper())); } public ScrimController createScrimController(ScrimView scrimBehind, ScrimView scrimInFront, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index 0b994ff46f29..f5d058c32f0b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -54,7 +54,7 @@ import java.io.PrintWriter; public class KeyguardBouncer { private static final String TAG = "KeyguardBouncer"; - static final long BOUNCER_FACE_DELAY = 800; + static final long BOUNCER_FACE_DELAY = 1200; static final float ALPHA_EXPANSION_THRESHOLD = 0.95f; static final float EXPANSION_HIDDEN = 1f; static final float EXPANSION_VISIBLE = 0f; @@ -68,6 +68,7 @@ public class KeyguardBouncer { private final Handler mHandler; private final BouncerExpansionCallback mExpansionCallback; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; + private final UnlockMethodCache mUnlockMethodCache; private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { @Override @@ -95,7 +96,7 @@ public class KeyguardBouncer { public KeyguardBouncer(Context context, ViewMediatorCallback callback, LockPatternUtils lockPatternUtils, ViewGroup container, DismissCallbackRegistry dismissCallbackRegistry, FalsingManager falsingManager, - BouncerExpansionCallback expansionCallback, + BouncerExpansionCallback expansionCallback, UnlockMethodCache unlockMethodCache, KeyguardUpdateMonitor keyguardUpdateMonitor, Handler handler) { mContext = context; mCallback = callback; @@ -106,6 +107,7 @@ public class KeyguardBouncer { mDismissCallbackRegistry = dismissCallbackRegistry; mExpansionCallback = expansionCallback; mHandler = handler; + mUnlockMethodCache = unlockMethodCache; mKeyguardUpdateMonitor.registerCallback(mUpdateMonitorCallback); } @@ -168,7 +170,8 @@ public class KeyguardBouncer { // Split up the work over multiple frames. DejankUtils.removeCallbacks(mResetRunnable); - if (mKeyguardUpdateMonitor.isFaceDetectionRunning()) { + if (mUnlockMethodCache.isUnlockingWithFacePossible() && !needsFullscreenBouncer() + && !mKeyguardUpdateMonitor.userNeedsStrongAuth()) { mHandler.postDelayed(mShowRunnable, BOUNCER_FACE_DELAY); } else { DejankUtils.postAfterTraversal(mShowRunnable); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java index 3bc5f3e62aaa..4e0ef56ad830 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java @@ -82,6 +82,8 @@ public class KeyguardBouncerTest extends SysuiTestCase { @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor; @Mock + private UnlockMethodCache mUnlockMethodCache; + @Mock private Handler mHandler; private KeyguardBouncer mBouncer; @@ -96,7 +98,7 @@ public class KeyguardBouncerTest extends SysuiTestCase { when(mKeyguardHostView.getHeight()).thenReturn(500); mBouncer = new KeyguardBouncer(getContext(), mViewMediatorCallback, mLockPatternUtils, container, mDismissCallbackRegistry, mFalsingManager, - mExpansionCallback, mKeyguardUpdateMonitor, mHandler) { + mExpansionCallback, mUnlockMethodCache, mKeyguardUpdateMonitor, mHandler) { @Override protected void inflateView() { super.inflateView(); @@ -377,7 +379,7 @@ public class KeyguardBouncerTest extends SysuiTestCase { @Test public void testShow_delaysIfFaceAuthIsRunning() { - when(mKeyguardUpdateMonitor.isFaceDetectionRunning()).thenReturn(true); + when(mUnlockMethodCache.isUnlockingWithFacePossible()).thenReturn(true); mBouncer.show(true /* reset */); ArgumentCaptor showRunnable = ArgumentCaptor.forClass(Runnable.class); -- GitLab From 5febf7eb6b9627142e18b6d7eb83167a19a2a40e Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Tue, 4 Jun 2019 17:34:37 -0700 Subject: [PATCH 061/620] Fix flaky test Test was registering a listener, and events could come from wallpaper manager making it unstable. Fixes: 134485306 Test: atest SysuiColorExtractorTests Change-Id: Ie838cbee0887f3503ce328d5c5b5603c413d5458 --- .../colorextraction/ColorExtractor.java | 16 ++++++---------- .../colorextraction/SysuiColorExtractor.java | 19 +++++++++---------- .../SysuiColorExtractorTests.java | 7 +++++-- .../colorextraction/ColorExtractorTest.java | 11 +++++++---- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/core/java/com/android/internal/colorextraction/ColorExtractor.java b/core/java/com/android/internal/colorextraction/ColorExtractor.java index d9fd3b5bd6d8..a6286c0f03f7 100644 --- a/core/java/com/android/internal/colorextraction/ColorExtractor.java +++ b/core/java/com/android/internal/colorextraction/ColorExtractor.java @@ -53,11 +53,13 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener protected WallpaperColors mLockColors; public ColorExtractor(Context context) { - this(context, new Tonal(context), true /* immediately */); + this(context, new Tonal(context), true /* immediately */, + context.getSystemService(WallpaperManager.class)); } @VisibleForTesting - public ColorExtractor(Context context, ExtractionType extractionType, boolean immediately) { + public ColorExtractor(Context context, ExtractionType extractionType, boolean immediately, + WallpaperManager wallpaperManager) { mContext = context; mExtractionType = extractionType; @@ -71,14 +73,8 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener } mOnColorsChangedListeners = new ArrayList<>(); - - WallpaperManager wallpaperManager = mContext.getSystemService(WallpaperManager.class); - if (wallpaperManager == null) { - Log.w(TAG, "Can't listen to color changes!"); - } else { - wallpaperManager.addOnColorsChangedListener(this, null /* handler */); - initExtractColors(wallpaperManager, immediately); - } + wallpaperManager.addOnColorsChangedListener(this, null /* handler */); + initExtractColors(wallpaperManager, immediately); } private void initExtractColors(WallpaperManager wallpaperManager, boolean immediately) { diff --git a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java index 835ffc976e9f..6579c0b6de27 100644 --- a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java +++ b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java @@ -59,13 +59,15 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable, @Inject public SysuiColorExtractor(Context context, ConfigurationController configurationController) { - this(context, new Tonal(context), configurationController, true); + this(context, new Tonal(context), configurationController, true, + context.getSystemService(WallpaperManager.class)); } @VisibleForTesting public SysuiColorExtractor(Context context, ExtractionType type, - ConfigurationController configurationController, boolean registerVisibility) { - super(context, type, false /* immediately */); + ConfigurationController configurationController, boolean registerVisibility, + WallpaperManager wallpaperManager) { + super(context, type, false /* immediately */, wallpaperManager); mTonal = type instanceof Tonal ? (Tonal) type : new Tonal(context); mWpHiddenColors = new GradientColors(); configurationController.addCallback(this); @@ -91,13 +93,10 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable, } } - WallpaperManager wallpaperManager = context.getSystemService(WallpaperManager.class); - if (wallpaperManager != null) { - // Listen to all users instead of only the current one. - wallpaperManager.removeOnColorsChangedListener(this); - wallpaperManager.addOnColorsChangedListener(this, null /* handler */, - UserHandle.USER_ALL); - } + // Listen to all users instead of only the current one. + wallpaperManager.removeOnColorsChangedListener(this); + wallpaperManager.addOnColorsChangedListener(this, null /* handler */, + UserHandle.USER_ALL); } private void updateDefaultGradients(WallpaperColors colors) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java index 9c2c82257173..e3a162c7b10d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java +++ b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java @@ -40,6 +40,7 @@ import com.android.systemui.statusbar.policy.ConfigurationController; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.MockitoAnnotations; /** @@ -57,6 +58,8 @@ public class SysuiColorExtractorTests extends SysuiTestCase { ColorExtractor.TYPE_DARK, ColorExtractor.TYPE_EXTRA_DARK}; + @Mock + private WallpaperManager mWallpaperManager; private ColorExtractor.GradientColors mColors; private SysuiColorExtractor mColorExtractor; @@ -72,7 +75,7 @@ public class SysuiColorExtractorTests extends SysuiTestCase { outGradientColorsNormal.set(mColors); outGradientColorsDark.set(mColors); outGradientColorsExtraDark.set(mColors); - }, mock(ConfigurationController.class), false); + }, mock(ConfigurationController.class), false, mWallpaperManager); } @Test @@ -127,7 +130,7 @@ public class SysuiColorExtractorTests extends SysuiTestCase { Tonal tonal = mock(Tonal.class); ConfigurationController configurationController = mock(ConfigurationController.class); SysuiColorExtractor sysuiColorExtractor = new SysuiColorExtractor(getContext(), - tonal, configurationController, false /* registerVisibility */); + tonal, configurationController, false /* registerVisibility */, mWallpaperManager); verify(configurationController).addCallback(eq(sysuiColorExtractor)); reset(tonal); diff --git a/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java b/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java index 17fa93135c7d..f88a7c41c02b 100644 --- a/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java +++ b/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java @@ -47,17 +47,19 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class ColorExtractorTest { - Context mContext; + private Context mContext; + private WallpaperManager mWallpaperManager; @Before public void setup() { mContext = InstrumentationRegistry.getContext(); + mWallpaperManager = mock(WallpaperManager.class); } @Test public void ColorExtractor_extractWhenInitialized() { ExtractionType type = mock(Tonal.class); - new ColorExtractor(mContext, type, true); + new ColorExtractor(mContext, type, true, mWallpaperManager); // 1 for lock and 1 for system verify(type, times(2)) .extractInto(any(), any(), any(), any()); @@ -84,7 +86,7 @@ public class ColorExtractorTest { outGradientColorsDark.set(colorsExpectedDark); outGradientColorsExtraDark.set(colorsExpectedExtraDark); }; - ColorExtractor extractor = new ColorExtractor(mContext, type, true); + ColorExtractor extractor = new ColorExtractor(mContext, type, true, mWallpaperManager); GradientColors colors = extractor.getColors(WallpaperManager.FLAG_SYSTEM, ColorExtractor.TYPE_NORMAL); @@ -99,7 +101,8 @@ public class ColorExtractorTest { public void addOnColorsChangedListener_invokesListener() { ColorExtractor.OnColorsChangedListener mockedListeners = mock(ColorExtractor.OnColorsChangedListener.class); - ColorExtractor extractor = new ColorExtractor(mContext, new Tonal(mContext), true); + ColorExtractor extractor = new ColorExtractor(mContext, new Tonal(mContext), true, + mWallpaperManager); extractor.addOnColorsChangedListener(mockedListeners); extractor.onColorsChanged(new WallpaperColors(Color.valueOf(Color.RED), null, null), -- GitLab From 9bae9c2dc6d2e507594a0195d1c74a7ed57cb8e8 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Tue, 4 Jun 2019 16:37:40 -0700 Subject: [PATCH 062/620] Avoid unwanted wakeAndUnLock mode for face Test: press power repeatedly on lock screen Bug: 132846921 Fixes: 130766403 Bug: 130327302 Change-Id: Ic11914ad220a0c8f81f0d28d5f999fcf970ccdeb --- .../keyguard/KeyguardUpdateMonitor.java | 4 ++++ .../phone/BiometricUnlockController.java | 15 ++++++++++--- .../phone/KeyguardBypassController.kt | 7 ------ .../phone/BiometricsUnlockControllerTest.java | 22 ++++++------------- 4 files changed, 23 insertions(+), 25 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 26d3d86778e4..5d1f8b1f196d 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -748,6 +748,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private void handleFaceAuthenticated(int authUserId) { Trace.beginSection("KeyGuardUpdateMonitor#handlerFaceAuthenticated"); try { + if (mGoingToSleep) { + Log.d(TAG, "Aborted successful auth because device is going to sleep."); + return; + } final int userId; try { userId = ActivityManager.getService().getCurrentUser().id; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index d67795210f0c..aa78a5d63f7e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -365,16 +365,23 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { private int calculateMode(BiometricSourceType biometricSourceType) { boolean unlockingAllowed = mUpdateMonitor.isUnlockingWithBiometricAllowed(); boolean deviceDreaming = mUpdateMonitor.isDreaming(); - boolean faceStayingOnKeyguard = biometricSourceType == BiometricSourceType.FACE - && !mKeyguardBypassController.getBypassEnabled(); + boolean face = biometricSourceType == BiometricSourceType.FACE; + boolean faceStayingOnKeyguard = face && !mKeyguardBypassController.getBypassEnabled(); if (!mUpdateMonitor.isDeviceInteractive()) { if (!mStatusBarKeyguardViewManager.isShowing()) { return MODE_ONLY_WAKE; } else if (mDozeScrimController.isPulsing() && unlockingAllowed) { return faceStayingOnKeyguard ? MODE_NONE : MODE_WAKE_AND_UNLOCK_PULSING; - } else if (unlockingAllowed || !mUnlockMethodCache.isMethodSecure()) { + } else if (!face && (unlockingAllowed || !mUnlockMethodCache.isMethodSecure())) { return MODE_WAKE_AND_UNLOCK; + } else if (face) { + if (!(mDozeScrimController.isPulsing() && !unlockingAllowed)) { + Log.wtf(TAG, "Face somehow arrived when the device was not interactive"); + } + // We could theoretically return MODE_NONE, but this means that the device + // would be not interactive, unlocked, and the user would not see the device state. + return MODE_ONLY_WAKE; } else { return MODE_SHOW_BOUNCER; } @@ -389,6 +396,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { return MODE_DISMISS_BOUNCER; } else if (unlockingAllowed) { return faceStayingOnKeyguard ? MODE_ONLY_WAKE : MODE_UNLOCK; + } else if (face) { + return MODE_NONE; } else if (!mStatusBarKeyguardViewManager.isBouncerShowing()) { return MODE_SHOW_BOUNCER; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt index c9dd4613b946..124206a5a369 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt @@ -19,7 +19,6 @@ package com.android.systemui.statusbar.phone import android.content.Context import android.hardware.face.FaceManager import android.provider.Settings -import com.android.internal.annotations.VisibleForTesting import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.tuner.TunerService @@ -59,10 +58,4 @@ class KeyguardBypassController { } }, Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD) } - - @VisibleForTesting - constructor(bypassEnabled: Boolean, unlockMethodCache: UnlockMethodCache) { - this.bypassEnabled = bypassEnabled - this.unlockMethodCache = unlockMethodCache - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java index 9b8d09e7aee8..eb3f56a19c9e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java @@ -71,6 +71,8 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { private UnlockMethodCache mUnlockMethodCache; @Mock private Handler mHandler; + @Mock + private KeyguardBypassController mKeyguardBypassController; private BiometricUnlockController mBiometricUnlockController; @Before @@ -83,8 +85,9 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { mDependency.injectTestDependency(NotificationMediaManager.class, mMediaManager); mDependency.injectTestDependency(StatusBarWindowController.class, mStatusBarWindowController); - mBiometricUnlockController = new TestableBiometricUnlockController( - false /* faceDismissesKeyguard */); + mBiometricUnlockController = new BiometricUnlockController(mContext, mDozeScrimController, + mKeyguardViewMediator, mScrimController, mStatusBar, mUnlockMethodCache, + mHandler, mUpdateMonitor, 0 /* wakeUpDelay */, mKeyguardBypassController); mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); } @@ -139,9 +142,8 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { } @Test - public void onBiometricAuthenticated_whenFace_dismissingKeyguard() { - mBiometricUnlockController = new TestableBiometricUnlockController( - true /* faceDismissesKeyguard */); + public void onBiometricAuthenticated_whenFace_andBypass_dismissKeyguard() { + when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true); mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true); @@ -184,14 +186,4 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { mBiometricUnlockController.onFinishedGoingToSleep(-1); verify(mHandler).post(any()); } - - private class TestableBiometricUnlockController extends BiometricUnlockController { - - TestableBiometricUnlockController(boolean faceDismissesKeyguard) { - super(mContext, mDozeScrimController, - mKeyguardViewMediator, mScrimController, mStatusBar, mUnlockMethodCache, - mHandler, mUpdateMonitor, 0 /* wakeUpDelay */, - new KeyguardBypassController(faceDismissesKeyguard, mUnlockMethodCache)); - } - } } -- GitLab From db8b7f34b020c733146ab41a78490fae39596487 Mon Sep 17 00:00:00 2001 From: Robert Snoeberger Date: Wed, 5 Jun 2019 15:29:18 -0400 Subject: [PATCH 063/620] Translate custom clock names Bug: 134097995 Test: none Change-Id: Iab1212f1ddc130baffd7556c21c66c7f52377ec2 --- packages/SystemUI/res-keyguard/values/strings.xml | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/SystemUI/res-keyguard/values/strings.xml b/packages/SystemUI/res-keyguard/values/strings.xml index 9b47e1436ede..0fe7084bb145 100644 --- a/packages/SystemUI/res-keyguard/values/strings.xml +++ b/packages/SystemUI/res-keyguard/values/strings.xml @@ -407,14 +407,11 @@ number">%d remaining attempt before SIM becomes permanently unusable. number">%d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. - - Default - - Bubble - - Analog + + Default + + Bubble + + Analog -- GitLab From 791f1ddaa3961593a4456c6445b0d78dea69bd6b Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Wed, 5 Jun 2019 14:03:26 -0700 Subject: [PATCH 064/620] Only announce for accessibility if accessibility is enabled Otherwise SystemUI will crash. Also, do not recycle events for now due to b/134608331. Otherwise SystemUI will crash as well. Fixes: 134603979 Bug: 134608331 Test: Do not enable talkback, successful auth does not crash now Test: Enable talkback, successful auth also works Change-Id: I5779a1a79a6504520d592e688ff9a48b6ea277d3 --- .../android/systemui/biometrics/BiometricDialogView.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java index 499fe8d47345..25c4bfa772ed 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java @@ -39,6 +39,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityManager; import android.view.animation.Interpolator; import android.widget.Button; import android.widget.ImageView; @@ -75,6 +76,7 @@ public abstract class BiometricDialogView extends LinearLayout { protected static final int STATE_PENDING_CONFIRMATION = 3; protected static final int STATE_AUTHENTICATED = 4; + private final AccessibilityManager mAccessibilityManager; private final IBinder mWindowToken = new Binder(); private final Interpolator mLinearOutSlowIn; private final WindowManager mWindowManager; @@ -153,6 +155,7 @@ public abstract class BiometricDialogView extends LinearLayout { super(context); mCallback = callback; mLinearOutSlowIn = Interpolators.LINEAR_OUT_SLOW_IN; + mAccessibilityManager = mContext.getSystemService(AccessibilityManager.class); mWindowManager = mContext.getSystemService(WindowManager.class); mUserManager = mContext.getSystemService(UserManager.class); mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class); @@ -518,12 +521,14 @@ public abstract class BiometricDialogView extends LinearLayout { // Every time a view becomes invisible we need to announce an accessibility event. // This is due to an issue in the framework, b/132298701 recommended this workaround. protected void announceAccessibilityEvent() { + if (!mAccessibilityManager.isEnabled()) { + return; + } AccessibilityEvent event = AccessibilityEvent.obtain(); event.setEventType(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); event.setContentChangeTypes(CONTENT_CHANGE_TYPE_SUBTREE); mDialog.sendAccessibilityEventUnchecked(event); mDialog.notifySubtreeAccessibilityStateChanged(mDialog, mDialog, CONTENT_CHANGE_TYPE_SUBTREE); - event.recycle(); } } -- GitLab From 4e97d2c105ff7bf235214f7a92ea7aa233b40e66 Mon Sep 17 00:00:00 2001 From: Nazanin Bakhshi Date: Fri, 31 May 2019 16:34:10 -0700 Subject: [PATCH 065/620] Store subscriber ID / IMSI into telephony database Bug: 131916175 Test: manual Change-Id: I64cd12a6737b7ef7fb31b851c1cbb5b7f46e6ca7 Merged-In: I64cd12a6737b7ef7fb31b851c1cbb5b7f46e6ca7 --- telephony/java/android/telephony/SubscriptionManager.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index a9521e36c0d5..5fb1bb5e7b07 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -790,6 +790,14 @@ public class SubscriptionManager { @SystemApi public static final int PROFILE_CLASS_DEFAULT = PROFILE_CLASS_UNSET; + /** + * IMSI (International Mobile Subscriber Identity). + *

Type: TEXT

+ * @hide + */ + //TODO: add @SystemApi + public static final String IMSI = "imsi"; + /** * Broadcast Action: The user has changed one of the default subs related to * data, phone calls, or sms

-- GitLab From f2af120f5bf9e215ec437fd172e21e64b8a31210 Mon Sep 17 00:00:00 2001 From: Robert Snoeberger Date: Wed, 5 Jun 2019 14:38:01 -0400 Subject: [PATCH 066/620] Darker accent color on custom clock over light wallpaper. Fixes: 134441011 Test: visual -- checked clock on light lock screen wallpaper Test: Added ClockPaletteTest Change-Id: I98768d0ef2acaf6f33aa5e47bc94e0bb1266b3ec --- .../keyguard/clock/AnalogClockController.java | 26 +++-- .../keyguard/clock/BubbleClockController.java | 27 ++++-- .../android/keyguard/clock/ClockPalette.kt | 73 ++++++++++++++ .../clock/AnalogClockControllerTest.java | 5 +- .../clock/BubbleClockControllerTest.java | 5 +- .../keyguard/clock/ClockPaletteTest.kt | 97 +++++++++++++++++++ 6 files changed, 212 insertions(+), 21 deletions(-) create mode 100644 packages/SystemUI/src/com/android/keyguard/clock/ClockPalette.kt create mode 100644 packages/SystemUI/tests/src/com/android/keyguard/clock/ClockPaletteTest.kt diff --git a/packages/SystemUI/src/com/android/keyguard/clock/AnalogClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/AnalogClockController.java index f468ecaae4c1..3837f75e01e4 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/AnalogClockController.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/AnalogClockController.java @@ -74,6 +74,11 @@ public class AnalogClockController implements ClockPlugin { private View mView; private TextClock mLockClock; + /** + * Helper to extract colors from wallpaper palette for clock face. + */ + private final ClockPalette mPalette = new ClockPalette(); + /** * Create a BubbleClockController instance. * @@ -162,17 +167,21 @@ public class AnalogClockController implements ClockPlugin { public void setStyle(Style style) {} @Override - public void setTextColor(int color) { } + public void setTextColor(int color) { + updateColor(); + } @Override public void setColorPalette(boolean supportsDarkText, int[] colorPalette) { - if (colorPalette == null || colorPalette.length == 0) { - return; - } - final int length = colorPalette.length; - mLockClock.setTextColor(colorPalette[Math.max(0, length - 2)]); - mAnalogClock.setClockColors(colorPalette[Math.max(0, length - 5)], - colorPalette[Math.max(0, length - 2)]); + mPalette.setColorPalette(supportsDarkText, colorPalette); + updateColor(); + } + + private void updateColor() { + final int primary = mPalette.getPrimaryColor(); + final int secondary = mPalette.getSecondaryColor(); + mLockClock.setTextColor(secondary); + mAnalogClock.setClockColors(primary, secondary); } @Override @@ -184,6 +193,7 @@ public class AnalogClockController implements ClockPlugin { @Override public void setDarkAmount(float darkAmount) { + mPalette.setDarkAmount(darkAmount); mClockPosition.setDarkAmount(darkAmount); mBigClockView.setDarkAmount(darkAmount); } diff --git a/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java index bd1e64a5f1c6..a648893b2e3b 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java @@ -74,6 +74,11 @@ public class BubbleClockController implements ClockPlugin { private View mLockClockContainer; private TextClock mLockClock; + /** + * Helper to extract colors from wallpaper palette for clock face. + */ + private final ClockPalette mPalette = new ClockPalette(); + /** * Create a BubbleClockController instance. * @@ -162,22 +167,26 @@ public class BubbleClockController implements ClockPlugin { public void setStyle(Style style) {} @Override - public void setTextColor(int color) { } + public void setTextColor(int color) { + updateColor(); + } @Override public void setColorPalette(boolean supportsDarkText, int[] colorPalette) { - if (colorPalette == null || colorPalette.length == 0) { - return; - } - final int length = colorPalette.length; - final int primaryColor = colorPalette[Math.max(0, length - 2)]; - final int secondaryColor = colorPalette[Math.max(0, length - 5)]; - mLockClock.setTextColor(primaryColor); - mAnalogClock.setClockColors(secondaryColor, primaryColor); + mPalette.setColorPalette(supportsDarkText, colorPalette); + updateColor(); + } + + private void updateColor() { + final int primary = mPalette.getPrimaryColor(); + final int secondary = mPalette.getSecondaryColor(); + mLockClock.setTextColor(secondary); + mAnalogClock.setClockColors(primary, secondary); } @Override public void setDarkAmount(float darkAmount) { + mPalette.setDarkAmount(darkAmount); mClockPosition.setDarkAmount(darkAmount); mView.setDarkAmount(darkAmount); } diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockPalette.kt b/packages/SystemUI/src/com/android/keyguard/clock/ClockPalette.kt new file mode 100644 index 000000000000..5c5493a0c200 --- /dev/null +++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockPalette.kt @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.keyguard.clock + +import android.graphics.Color +import android.util.MathUtils + +private const val PRIMARY_INDEX = 5 +private const val SECONDARY_DARK_INDEX = 8 +private const val SECONDARY_LIGHT_INDEX = 2 + +/** + * A helper class to extract colors from a clock face. + */ +class ClockPalette { + + private var darkAmount: Float = 0f + private var accentPrimary: Int = Color.WHITE + private var accentSecondaryLight: Int = Color.WHITE + private var accentSecondaryDark: Int = Color.BLACK + private val lightHSV: FloatArray = FloatArray(3) + private val darkHSV: FloatArray = FloatArray(3) + private val hsv: FloatArray = FloatArray(3) + + /** Returns a color from the palette as an RGB packed int. */ + fun getPrimaryColor(): Int { + return accentPrimary + } + + /** Returns either a light or dark color from the palette as an RGB packed int. */ + fun getSecondaryColor(): Int { + Color.colorToHSV(accentSecondaryLight, lightHSV) + Color.colorToHSV(accentSecondaryDark, darkHSV) + for (i in 0..2) { + hsv[i] = MathUtils.lerp(darkHSV[i], lightHSV[i], darkAmount) + } + return Color.HSVToColor(hsv) + } + + /** See {@link ClockPlugin#setColorPalette}. */ + fun setColorPalette(supportsDarkText: Boolean, colorPalette: IntArray?) { + if (colorPalette == null || colorPalette.isEmpty()) { + accentPrimary = Color.WHITE + accentSecondaryLight = Color.WHITE + accentSecondaryDark = if (supportsDarkText) Color.BLACK else Color.WHITE + return + } + val length = colorPalette.size + accentPrimary = colorPalette[Math.max(0, length - PRIMARY_INDEX)] + accentSecondaryLight = colorPalette[Math.max(0, length - SECONDARY_LIGHT_INDEX)] + accentSecondaryDark = colorPalette[Math.max(0, + length - if (supportsDarkText) SECONDARY_DARK_INDEX else SECONDARY_LIGHT_INDEX)] + } + + /** See {@link ClockPlugin#setDarkAmount}. */ + fun setDarkAmount(darkAmount: Float) { + this.darkAmount = darkAmount + } +} diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/AnalogClockControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/AnalogClockControllerTest.java index 3f48ea7e23ad..ef3af8a3c9bc 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/clock/AnalogClockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/AnalogClockControllerTest.java @@ -18,6 +18,7 @@ package com.android.keyguard.clock; import static com.google.common.truth.Truth.assertThat; import android.content.res.Resources; +import android.graphics.Color; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; @@ -67,9 +68,9 @@ public final class AnalogClockControllerTest extends SysuiTestCase { public void setColorPalette_setDigitalClock() { ViewGroup smallClock = (ViewGroup) mClockController.getView(); // WHEN color palette is set - mClockController.setColorPalette(true, new int[]{42}); + mClockController.setColorPalette(true, new int[]{Color.RED}); // THEN child of small clock should have text color set. TextView digitalClock = (TextView) smallClock.getChildAt(0); - assertThat(digitalClock.getCurrentTextColor()).isEqualTo(42); + assertThat(digitalClock.getCurrentTextColor()).isEqualTo(Color.RED); } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java index 90083b42749e..b56986eb80d0 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java @@ -18,6 +18,7 @@ package com.android.keyguard.clock; import static com.google.common.truth.Truth.assertThat; import android.content.res.Resources; +import android.graphics.Color; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; @@ -66,9 +67,9 @@ public final class BubbleClockControllerTest extends SysuiTestCase { public void setColorPalette_setDigitalClock() { ViewGroup smallClock = (ViewGroup) mClockController.getView(); // WHEN text color is set - mClockController.setColorPalette(true, new int[]{42}); + mClockController.setColorPalette(true, new int[]{Color.RED}); // THEN child of small clock should have text color set. TextView digitalClock = (TextView) smallClock.getChildAt(0); - assertThat(digitalClock.getCurrentTextColor()).isEqualTo(42); + assertThat(digitalClock.getCurrentTextColor()).isEqualTo(Color.RED); } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockPaletteTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockPaletteTest.kt new file mode 100644 index 000000000000..347b26deacd4 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockPaletteTest.kt @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.keyguard.clock + +import android.graphics.Color +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidTestingRunner::class) +@SmallTest +class ClockPaletteTest : SysuiTestCase() { + + private lateinit var clockPalette: ClockPalette + private lateinit var colors: IntArray + + @Before + fun setUp() { + clockPalette = ClockPalette() + // colors used are reds from light to dark. + val hsv: FloatArray = FloatArray(3) + Color.colorToHSV(Color.RED, hsv) + colors = IntArray(10) + val step: Float = (0f - hsv[2]) / colors.size + for (i in 0 until colors.size) { + hsv[2] += step + colors[i] = Color.HSVToColor(hsv) + } + } + + @Test + fun testDark() { + // GIVEN on AOD + clockPalette.setDarkAmount(1f) + // AND GIVEN that wallpaper doesn't support dark text + clockPalette.setColorPalette(false, colors) + // THEN the secondary color should be lighter than the primary color + assertThat(value(clockPalette.getPrimaryColor())) + .isGreaterThan(value(clockPalette.getSecondaryColor())) + } + + @Test + fun testDarkText() { + // GIVEN on lock screen + clockPalette.setDarkAmount(0f) + // AND GIVEN that wallpaper supports dark text + clockPalette.setColorPalette(true, colors) + // THEN the secondary color should be darker the primary color + assertThat(value(clockPalette.getPrimaryColor())) + .isLessThan(value(clockPalette.getSecondaryColor())) + } + + @Test + fun testLightText() { + // GIVEN on lock screen + clockPalette.setDarkAmount(0f) + // AND GIVEN that wallpaper doesn't support dark text + clockPalette.setColorPalette(false, colors) + // THEN the secondary color should be darker than the primary color + assertThat(value(clockPalette.getPrimaryColor())) + .isGreaterThan(value(clockPalette.getSecondaryColor())) + } + + @Test + fun testNullColors() { + // GIVEN on AOD + clockPalette.setDarkAmount(1f) + // AND GIVEN that wallpaper colors are null + clockPalette.setColorPalette(false, null) + // THEN the primary color should be whilte + assertThat(clockPalette.getPrimaryColor()).isEqualTo(Color.WHITE) + } + + private fun value(color: Int): Float { + val hsv: FloatArray = FloatArray(3) + Color.colorToHSV(color, hsv) + return hsv[2] + } +} -- GitLab From 4c53c8a7262e677621f068bf6f3b8fe3493fef59 Mon Sep 17 00:00:00 2001 From: Amin Shaikh Date: Thu, 6 Jun 2019 18:22:07 +0000 Subject: [PATCH 067/620] Revert "For 1 sim devices, hide signal empty state" This reverts commit 4c16eb501216996e54e6feb3d84e186748f71270. Reason for revert: breaks carrier testing Fixes: 133402064 Change-Id: I554a4a7fd9e7b327343c618b2ca8c4fd0d3353a5 --- .../android/settingslib/graph/SignalDrawable.java | 15 ++++----------- .../statusbar/phone/StatusBarSignalPolicy.java | 11 ++--------- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java index 7ce713b2f296..98eb57300f0b 100644 --- a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java +++ b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java @@ -60,7 +60,6 @@ public class SignalDrawable extends DrawableWrapper { private static final int NUM_LEVEL_MASK = 0xff << NUM_LEVEL_SHIFT; private static final int STATE_SHIFT = 16; private static final int STATE_MASK = 0xff << STATE_SHIFT; - private static final int STATE_EMPTY = 1; private static final int STATE_CUT = 2; private static final int STATE_CARRIER_CHANGE = 3; @@ -204,7 +203,7 @@ public class SignalDrawable extends DrawableWrapper { drawDotAndPadding(x - dotSpacing * 2, y, dotPadding, dotSize, 0); canvas.drawPath(mCutoutPath, mTransparentPaint); canvas.drawPath(mForegroundPath, mForegroundPaint); - } else if (isInState(STATE_CUT) || isInState(STATE_EMPTY)) { + } else if (isInState(STATE_CUT)) { float cut = (CUT_OUT * width); mCutoutPath.moveTo(width - padding, height - padding); mCutoutPath.rLineTo(-cut, 0); @@ -269,14 +268,13 @@ public class SignalDrawable extends DrawableWrapper { /** * Returns whether this drawable is in the specified state. * - * @param state must be one of {@link #STATE_CARRIER_CHANGE}, {@link #STATE_CUT}, - * or {@link #STATE_EMPTY}. + * @param state must be one of {@link #STATE_CARRIER_CHANGE} or {@link #STATE_CUT} */ private boolean isInState(int state) { return getState(getLevel()) == state; } - private static int getState(int fullState) { + public static int getState(int fullState) { return (fullState & STATE_MASK) >> STATE_SHIFT; } @@ -288,12 +286,7 @@ public class SignalDrawable extends DrawableWrapper { /** Returns the state representing empty mobile signal with the given number of levels. */ public static int getEmptyState(int numLevels) { - return (STATE_EMPTY << STATE_SHIFT) | (numLevels << NUM_LEVEL_SHIFT); - } - - /** Returns whether fullState corresponds to the empty state. */ - public static boolean isEmptyState(int fullState) { - return getState(fullState) == STATE_EMPTY; + return getState(0, numLevels, true); } /** Returns the state representing carrier change with the given number of levels. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java index 2558d77bbb48..8286d26e9999 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java @@ -22,7 +22,6 @@ import android.telephony.SubscriptionInfo; import android.util.ArraySet; import android.util.Log; -import com.android.settingslib.graph.SignalDrawable; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.statusbar.policy.NetworkController; @@ -187,8 +186,8 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba // Visibility of the data type indicator changed boolean typeChanged = statusType != state.typeId && (statusType == 0 || state.typeId == 0); - state.visible = statusIcon.visible && !mBlockMobile - && !isInEmptyStateOnSingleSimDevice(subId, statusIcon.icon); + + state.visible = statusIcon.visible && !mBlockMobile; state.strengthId = statusIcon.icon; state.typeId = statusType; state.contentDescription = statusIcon.contentDescription; @@ -210,12 +209,6 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba } } - private boolean isInEmptyStateOnSingleSimDevice(int subId, int icon) { - return mMobileStates.size() == 1 - && mMobileStates.get(0).subId == subId - && SignalDrawable.isEmptyState(icon); - } - private MobileIconState getState(int subId) { for (MobileIconState state : mMobileStates) { if (state.subId == subId) { -- GitLab From 195dfc5db60fc913d060a692dc4ee7b0b02ece68 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Thu, 30 May 2019 19:35:05 -0700 Subject: [PATCH 068/620] Not rendering the dark icons with the shelf anymore Instead it is rendered by a dedicated container. This will help with a lot of the transitions that are necessary for the bypass and also fixes the coloring of the notification icons on the lockscreen. Fixes: 133869048 Bug: 130327302 Bug: 133182504 Test: atest SystemUITests Change-Id: I422b3da488fdac6577173d41b26c67f81c7826c5 --- .../layout/keyguard_status_view.xml | 9 +- packages/SystemUI/res/values/dimens.xml | 4 +- .../systemui/bubbles/BubbleExpandedView.java | 2 +- .../systemui/statusbar/NotificationShelf.java | 57 +----- .../systemui/statusbar/StatusBarIconView.java | 45 ++--- .../notification/NotificationDozeHelper.java | 7 +- .../NotificationWakeUpCoordinator.kt | 28 +-- .../collection/NotificationEntry.java | 17 +- .../row/ActivatableNotificationView.java | 18 +- .../row/ExpandableNotificationRow.java | 12 +- .../notification/row/ExpandableView.java | 14 +- .../row/NotificationContentView.java | 10 +- .../row/NotificationGutsManager.java | 2 +- .../notification/row/NotificationMenuRow.java | 2 +- .../notification/stack/AmbientState.java | 33 ++-- .../notification/stack/AnimationFilter.java | 10 +- .../stack/ExpandableViewState.java | 12 +- .../stack/NotificationChildrenContainer.java | 2 +- .../stack/NotificationStackScrollLayout.java | 177 ++++++------------ .../stack/StackScrollAlgorithm.java | 4 +- .../stack/StackStateAnimator.java | 2 +- .../phone/NotificationIconAreaController.java | 150 ++++++++++++--- .../phone/NotificationIconContainer.java | 27 +-- .../phone/NotificationPanelView.java | 20 +- .../NotificationsQuickSettingsContainer.java | 69 ++++--- .../systemui/statusbar/phone/StatusBar.java | 8 +- .../statusbar/phone/StatusBarWindowView.java | 1 - .../row/ExpandableNotificationRowTest.java | 6 +- .../row/NotificationContentViewTest.java | 4 +- .../NotificationStackScrollLayoutTest.java | 7 +- .../NotificationIconAreaControllerTest.java | 11 +- 31 files changed, 421 insertions(+), 349 deletions(-) diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml index 04d6afc1935f..a983b05620b4 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml @@ -25,14 +25,11 @@ android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" - androidprv:layout_maxWidth="@dimen/keyguard_security_width" - androidprv:layout_maxHeight="@dimen/keyguard_security_height" android:gravity="center_horizontal|top"> + diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index c5e4662f6d45..afe6d9c2552b 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -258,8 +258,8 @@ @*android:dimen/notification_header_icon_size_ambient - - 16dp + + 16dp 90% diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java index 09d4b0585541..7b58c5de4813 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java @@ -515,7 +515,7 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList viewState.gone = false; viewState.hidden = false; viewState.dimmed = false; - viewState.dark = false; + viewState.dozing = false; viewState.alpha = 1f; viewState.notGoneIndex = -1; viewState.xTranslation = 0; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 1779b325359e..9ffb78c10939 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -63,15 +63,12 @@ public class NotificationShelf extends ActivatableNotificationView implements = SystemProperties.getBoolean("debug.icon_scroll_animations", true); private static final int TAG_CONTINUOUS_CLIPPING = R.id.continuous_clipping_tag; private static final String TAG = "NotificationShelf"; - private static final long SHELF_IN_TRANSLATION_DURATION = 200; private NotificationIconContainer mShelfIcons; private int[] mTmp = new int[2]; private boolean mHideBackground; private int mIconAppearTopPadding; - private int mShelfAppearTranslation; - private float mDarkShelfPadding; - private float mDarkShelfIconSize; + private float mHiddenShelfIconSize; private int mStatusBarHeight; private int mStatusBarPaddingStart; private AmbientState mAmbientState; @@ -140,8 +137,6 @@ public class NotificationShelf extends ActivatableNotificationView implements mStatusBarHeight = res.getDimensionPixelOffset(R.dimen.status_bar_height); mStatusBarPaddingStart = res.getDimensionPixelOffset(R.dimen.status_bar_padding_start); mPaddingBetweenElements = res.getDimensionPixelSize(R.dimen.notification_divider_height); - mShelfAppearTranslation = res.getDimensionPixelSize(R.dimen.shelf_appear_translation); - mDarkShelfPadding = res.getDimensionPixelSize(R.dimen.widget_bottom_separator_padding); ViewGroup.LayoutParams layoutParams = getLayoutParams(); layoutParams.height = res.getDimensionPixelOffset(R.dimen.notification_shelf_height); @@ -152,7 +147,7 @@ public class NotificationShelf extends ActivatableNotificationView implements mScrollFastThreshold = res.getDimensionPixelOffset(R.dimen.scroll_fast_threshold); mShowNotificationShelf = res.getBoolean(R.bool.config_showNotificationShelf); mIconSize = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_icon_size); - mDarkShelfIconSize = res.getDimensionPixelOffset(R.dimen.dark_shelf_icon_size); + mHiddenShelfIconSize = res.getDimensionPixelOffset(R.dimen.hidden_shelf_icon_size); mGapHeight = res.getDimensionPixelSize(R.dimen.qs_notification_padding); if (!mShowNotificationShelf) { @@ -166,33 +161,6 @@ public class NotificationShelf extends ActivatableNotificationView implements initDimens(); } - @Override - public void setDark(boolean dark, boolean fade, long delay) { - if (mDark == dark) return; - super.setDark(dark, fade, delay); - mShelfIcons.setDark(dark, fade, delay); - updateInteractiveness(); - updateOutline(); - } - - /** - * Alpha animation with translation played when this view is visible on AOD. - */ - public void fadeInTranslating() { - mShelfIcons.setTranslationY(-mShelfAppearTranslation); - mShelfIcons.setAlpha(0); - mShelfIcons.animate() - .setInterpolator(Interpolators.DECELERATE_QUINT) - .translationY(0) - .setDuration(SHELF_IN_TRANSLATION_DURATION) - .start(); - mShelfIcons.animate() - .alpha(1) - .setInterpolator(Interpolators.LINEAR) - .setDuration(SHELF_IN_TRANSLATION_DURATION) - .start(); - } - @Override protected View getContentView() { return mShelfIcons; @@ -219,11 +187,8 @@ public class NotificationShelf extends ActivatableNotificationView implements viewState.copyFrom(lastViewState); viewState.height = getIntrinsicHeight(); - float awakenTranslation = Math.max(Math.min(viewEnd, maxShelfEnd) - viewState.height, + viewState.yTranslation = Math.max(Math.min(viewEnd, maxShelfEnd) - viewState.height, getFullyClosedTranslation()); - float yRatio = mAmbientState.hasPulsingNotifications() ? - 0 : mAmbientState.getDarkAmount(); - viewState.yTranslation = awakenTranslation + mDarkShelfPadding * yRatio; viewState.zTranslation = ambientState.getBaseZHeight(); // For the small display size, it's not enough to make the icon not covered by // the top cutout so the denominator add the height of cutout. @@ -452,7 +417,7 @@ public class NotificationShelf extends ActivatableNotificationView implements } StatusBarIconView icon = row.getEntry().expandedIcon; float shelfIconPosition = getTranslationY() + icon.getTop() + icon.getTranslationY(); - if (shelfIconPosition < maxTop && !mAmbientState.isFullyDark()) { + if (shelfIconPosition < maxTop && !mAmbientState.isFullyHidden()) { int top = (int) (maxTop - shelfIconPosition); Rect clipRect = new Rect(0, top, icon.getWidth(), Math.max(top, icon.getHeight())); icon.setClipBounds(clipRect); @@ -666,8 +631,8 @@ public class NotificationShelf extends ActivatableNotificationView implements iconState.translateContent = false; } float transitionAmount; - if (mAmbientState.isDarkAtAll() && !row.isInShelf()) { - transitionAmount = mAmbientState.isFullyDark() ? 1 : 0; + if (mAmbientState.isHiddenAtAll() && !row.isInShelf()) { + transitionAmount = mAmbientState.isFullyHidden() ? 1 : 0; } else if (isLastChild || !USE_ANIMATIONS_WHEN_OPENING || iconState.useFullTransitionAmount || iconState.useLinearTransitionAmount) { transitionAmount = iconTransitionAmount; @@ -717,7 +682,7 @@ public class NotificationShelf extends ActivatableNotificationView implements } notificationIconPosition += iconTopPadding; float shelfIconPosition = getTranslationY() + icon.getTop(); - float iconSize = mDark ? mDarkShelfIconSize : mIconSize; + float iconSize = mDozing ? mHiddenShelfIconSize : mIconSize; shelfIconPosition += (icon.getHeight() - icon.getIconScale() * iconSize) / 2.0f; float iconYTranslation = NotificationUtils.interpolate( notificationIconPosition - shelfIconPosition, @@ -794,12 +759,12 @@ public class NotificationShelf extends ActivatableNotificationView implements @Override protected boolean needsOutline() { - return !mHideBackground && !mDark && super.needsOutline(); + return !mHideBackground && super.needsOutline(); } @Override protected boolean shouldHideBackground() { - return super.shouldHideBackground() || mHideBackground || mDark; + return super.shouldHideBackground() || mHideBackground; } @Override @@ -910,8 +875,7 @@ public class NotificationShelf extends ActivatableNotificationView implements } private void updateInteractiveness() { - mInteractive = mStatusBarState == StatusBarState.KEYGUARD && mHasItemsInStableShelf - && !mDark; + mInteractive = mStatusBarState == StatusBarState.KEYGUARD && mHasItemsInStableShelf; setClickable(mInteractive); setFocusable(mInteractive); setImportantForAccessibility(mInteractive ? View.IMPORTANT_FOR_ACCESSIBILITY_YES @@ -929,7 +893,6 @@ public class NotificationShelf extends ActivatableNotificationView implements public void setAnimationsEnabled(boolean enabled) { mAnimationsEnabled = enabled; - mCollapsedIcons.setAnimationsEnabled(enabled); if (!enabled) { // we need to wait with enabling the animations until the first frame has passed mShelfIcons.setAnimationsEnabled(false); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index 6552fe671794..f4af9ae21b75 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -112,7 +112,7 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi }; private boolean mAlwaysScaleIcon; - private int mStatusBarIconDrawingSizeDark = 1; + private int mStatusBarIconDrawingSizeIncreased = 1; private int mStatusBarIconDrawingSize = 1; private int mStatusBarIconSize = 1; private StatusBarIcon mIcon; @@ -139,7 +139,7 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi private int mDrawableColor; private int mIconColor; private int mDecorColor; - private float mDarkAmount; + private float mDozeAmount; private ValueAnimator mColorAnimator; private int mCurrentSetColor = NO_COLOR; private int mAnimationStartColor = NO_COLOR; @@ -158,6 +158,7 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi private Runnable mLayoutRunnable; private boolean mDismissed; private Runnable mOnDismissListener; + private boolean mIncreasedSize; public StatusBarIconView(Context context, String slot, StatusBarNotification sbn) { this(context, slot, sbn, false); @@ -196,12 +197,10 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi } private void updateIconScaleForNotifications() { - final float imageBounds = NotificationUtils.interpolate( - mStatusBarIconDrawingSize, - mStatusBarIconDrawingSizeDark, - mDarkAmount); + final float imageBounds = mIncreasedSize ? + mStatusBarIconDrawingSizeIncreased : mStatusBarIconDrawingSize; final int outerBounds = mStatusBarIconSize; - mIconScale = (float)imageBounds / (float)outerBounds; + mIconScale = imageBounds / (float)outerBounds; updatePivot(); } @@ -225,8 +224,8 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi } } - public float getIconScaleFullyDark() { - return (float) mStatusBarIconDrawingSizeDark / mStatusBarIconDrawingSize; + public float getIconScaleIncreased() { + return (float) mStatusBarIconDrawingSizeIncreased / mStatusBarIconDrawingSize; } public float getIconScale() { @@ -256,7 +255,7 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi Resources res = getResources(); mStaticDotRadius = res.getDimensionPixelSize(R.dimen.overflow_dot_radius); mStatusBarIconSize = res.getDimensionPixelSize(R.dimen.status_bar_icon_size); - mStatusBarIconDrawingSizeDark = + mStatusBarIconDrawingSizeIncreased = res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size_dark); mStatusBarIconDrawingSize = res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size); @@ -584,7 +583,7 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi } private void updateDecorColor() { - int color = NotificationUtils.interpolateColors(mDecorColor, Color.WHITE, mDarkAmount); + int color = NotificationUtils.interpolateColors(mDecorColor, Color.WHITE, mDozeAmount); if (mDotPaint.getColor() != color) { mDotPaint.setColor(color); @@ -618,13 +617,13 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi mMatrixColorFilter = new ColorMatrixColorFilter(mMatrix); } int color = NotificationUtils.interpolateColors( - mCurrentSetColor, Color.WHITE, mDarkAmount); - updateTintMatrix(mMatrix, color, DARK_ALPHA_BOOST * mDarkAmount); + mCurrentSetColor, Color.WHITE, mDozeAmount); + updateTintMatrix(mMatrix, color, DARK_ALPHA_BOOST * mDozeAmount); mMatrixColorFilter.setColorMatrixArray(mMatrix); setColorFilter(null); // setColorFilter only invalidates if the instance changed. setColorFilter(mMatrixColorFilter); } else { - mDozer.updateGrayscale(this, mDarkAmount); + mDozer.updateGrayscale(this, mDozeAmount); } } @@ -855,19 +854,18 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi mOnVisibilityChangedListener = listener; } - public void setDark(boolean dark, boolean fade, long delay) { - mDozer.setIntensityDark(f -> { - mDarkAmount = f; - maybeUpdateIconScaleDimens(); + public void setDozing(boolean dozing, boolean fade, long delay) { + mDozer.setDozing(f -> { + mDozeAmount = f; updateDecorColor(); updateIconColor(); updateAllowAnimation(); - }, dark, fade, delay, this); + }, dozing, fade, delay, this); } private void updateAllowAnimation() { - if (mDarkAmount == 0 || mDarkAmount == 1) { - setAllowAnimation(mDarkAmount == 0); + if (mDozeAmount == 0 || mDozeAmount == 1) { + setAllowAnimation(mDozeAmount == 0); } } @@ -949,6 +947,11 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi return mBlocked; } + public void setIncreasedSize(boolean increasedSize) { + mIncreasedSize = increasedSize; + maybeUpdateIconScaleDimens(); + } + public interface OnVisibilityChangedListener { void onVisibilityChanged(int newVisibility); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java index ef042bab7625..63bb73ab7f13 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java @@ -79,10 +79,11 @@ public class NotificationDozeHelper { animator.start(); } - public void setIntensityDark(Consumer listener, boolean dark, + public void setDozing(Consumer listener, boolean dozing, boolean animate, long delay, View view) { if (animate) { - startIntensityAnimation(a -> listener.accept((Float) a.getAnimatedValue()), dark, delay, + startIntensityAnimation(a -> listener.accept((Float) a.getAnimatedValue()), dozing, + delay, new AnimatorListenerAdapter() { @Override @@ -100,7 +101,7 @@ public class NotificationDozeHelper { if (animator != null) { animator.cancel(); } - listener.accept(dark ? 1f : 0f); + listener.accept(dozing ? 1f : 0f); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt index 3613f9f3ea5f..0fa6842ca9b1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt @@ -28,6 +28,7 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll import com.android.systemui.statusbar.notification.stack.StackStateAnimator import com.android.systemui.statusbar.phone.DozeParameters import com.android.systemui.statusbar.phone.KeyguardBypassController +import com.android.systemui.statusbar.phone.NotificationIconAreaController import javax.inject.Inject import javax.inject.Singleton @@ -59,7 +60,7 @@ class NotificationWakeUpCoordinator @Inject constructor( private var mNotificationVisibleAmount = 0.0f private var mNotificationsVisible = false private var mNotificationsVisibleForExpansion = false - private var mDarkAnimator: ObjectAnimator? = null + private var mVisibilityAnimator: ObjectAnimator? = null private var mVisibilityAmount = 0.0f private var mLinearVisibilityAmount = 0.0f private var mWakingUp = false @@ -72,6 +73,8 @@ class NotificationWakeUpCoordinator @Inject constructor( } } + lateinit var iconAreaController : NotificationIconAreaController + var pulsing: Boolean = false set(value) { field = value @@ -129,7 +132,7 @@ class NotificationWakeUpCoordinator @Inject constructor( return } mNotificationsVisible = visible - mDarkAnimator?.cancel(); + mVisibilityAnimator?.cancel(); if (animate) { notifyAnimationStart(visible) startVisibilityAnimation(increaseSpeed) @@ -155,7 +158,7 @@ class NotificationWakeUpCoordinator @Inject constructor( mLinearDozeAmount = linear mDozeAmount = eased mStackScroller.setDozeAmount(mDozeAmount) - updateDarkAmount() + updateHideAmount() if (changed && linear == 0.0f) { setNotificationsVisible(visible = false, animate = false, increaseSpeed = false); setNotificationsVisibleForExpansion(visible = false, animate = false, @@ -188,15 +191,15 @@ class NotificationWakeUpCoordinator @Inject constructor( Interpolators.FAST_OUT_SLOW_IN_REVERSE } val target = if (mNotificationsVisible) 1.0f else 0.0f - val darkAnimator = ObjectAnimator.ofFloat(this, mNotificationVisibility, target) - darkAnimator.setInterpolator(Interpolators.LINEAR) + val visibilityAnimator = ObjectAnimator.ofFloat(this, mNotificationVisibility, target) + visibilityAnimator.setInterpolator(Interpolators.LINEAR) var duration = StackStateAnimator.ANIMATION_DURATION_WAKEUP.toLong() if (increaseSpeed) { duration = (duration.toFloat() / 1.5F).toLong(); } - darkAnimator.setDuration(duration) - darkAnimator.start() - mDarkAnimator = darkAnimator + visibilityAnimator.setDuration(duration) + visibilityAnimator.start() + mVisibilityAnimator = visibilityAnimator } private fun setVisibilityAmount(visibilityAmount: Float) { @@ -204,7 +207,7 @@ class NotificationWakeUpCoordinator @Inject constructor( mVisibilityAmount = mVisibilityInterpolator.getInterpolation( visibilityAmount) handleAnimationFinished(); - updateDarkAmount() + updateHideAmount() } private fun handleAnimationFinished() { @@ -218,14 +221,15 @@ class NotificationWakeUpCoordinator @Inject constructor( return mStackScroller.pulseHeight } - private fun updateDarkAmount() { + private fun updateHideAmount() { val linearAmount = Math.min(1.0f - mLinearVisibilityAmount, mLinearDozeAmount) val amount = Math.min(1.0f - mVisibilityAmount, mDozeAmount) - mStackScroller.setDarkAmount(linearAmount, amount) + mStackScroller.setHideAmount(linearAmount, amount) + iconAreaController.setFullyHidden(linearAmount == 1.0f); } private fun notifyAnimationStart(awake: Boolean) { - mStackScroller.notifyDarkAnimationStart(!awake) + mStackScroller.notifyHideAnimationStart(!awake) } override fun onDozingChanged(isDozing: Boolean) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index 92c261c4cad7..5371bd9e0d3a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -96,6 +96,7 @@ public final class NotificationEntry { public StatusBarIconView icon; public StatusBarIconView expandedIcon; public StatusBarIconView centeredIcon; + public StatusBarIconView aodIcon; private boolean interruption; public boolean autoRedacted; // whether the redacted notification was generated by us public int targetSdk; @@ -336,6 +337,12 @@ public final class NotificationEntry { sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId()), sbn); expandedIcon.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + // Construct the expanded icon. + aodIcon = new StatusBarIconView(context, + sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId()), sbn); + aodIcon.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + aodIcon.setIncreasedSize(true); + final StatusBarIcon ic = new StatusBarIcon( sbn.getUser(), sbn.getPackageName(), @@ -344,10 +351,11 @@ public final class NotificationEntry { n.number, StatusBarIconView.contentDescForNotification(context, n)); - if (!icon.set(ic) || !expandedIcon.set(ic)) { + if (!icon.set(ic) || !expandedIcon.set(ic) || !aodIcon.set(ic)) { icon = null; expandedIcon = null; centeredIcon = null; + aodIcon = null; throw new InflationException("Couldn't create icon: " + ic); } expandedIcon.setVisibility(View.INVISIBLE); @@ -380,6 +388,10 @@ public final class NotificationEntry { if (centeredIcon != null) { centeredIcon.setTag(key, tag); } + + if (aodIcon != null) { + aodIcon.setTag(key, tag); + } } /** @@ -403,7 +415,8 @@ public final class NotificationEntry { StatusBarIconView.contentDescForNotification(context, n)); icon.setNotification(sbn); expandedIcon.setNotification(sbn); - if (!icon.set(ic) || !expandedIcon.set(ic)) { + aodIcon.setNotification(sbn); + if (!icon.set(ic) || !expandedIcon.set(ic) || !aodIcon.set(ic)) { throw new InflationException("Couldn't update icon: " + ic); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java index 94face2581b3..11321cffd25b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java @@ -52,7 +52,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView private static final int BACKGROUND_ANIMATION_LENGTH_MS = 220; private static final int ACTIVATE_ANIMATION_LENGTH = 220; - private static final long DARK_ANIMATION_LENGTH = StackStateAnimator.ANIMATION_DURATION_WAKEUP; /** * The amount of width, which is kept in the end when performing a disappear animation (also @@ -84,11 +83,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView */ private static final float VERTICAL_ANIMATION_START = 1.0f; - /** - * Scale for the background to animate from when exiting dark mode. - */ - private static final float DARK_EXIT_SCALE_START = 0.93f; - /** * A sentinel value when no color should be used. Can be used with {@link #setTintColor(int)} * or {@link #setOverrideTintColor(int, float)}. @@ -105,7 +99,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView private final DoubleTapHelper mDoubleTapHelper; private boolean mDimmed; - protected boolean mDark; + protected boolean mDozing; protected int mBgTint = NO_COLOR; private float mBgAlpha = 1f; @@ -440,12 +434,12 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView return true; } - public void setDark(boolean dark, boolean fade, long delay) { - super.setDark(dark, fade, delay); - if (mDark == dark) { + public void setDozing(boolean dozing, boolean fade, long delay) { + super.setDozing(dozing, fade, delay); + if (mDozing == dozing) { return; } - mDark = dark; + mDozing = dozing; updateBackground(); updateBackgroundTint(false); } @@ -542,7 +536,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView * used and the background color not at all. */ public void setOverrideTintColor(int color, float overrideAmount) { - if (mDark) { + if (mDozing) { color = NO_COLOR; overrideAmount = 0; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index d625b318487d..a27c15b80276 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -2051,18 +2051,18 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } @Override - public void setDark(boolean dark, boolean fade, long delay) { - if (mDark == dark) { + public void setDozing(boolean dozing, boolean fade, long delay) { + if (mDozing == dozing) { return; } - super.setDark(dark, fade, delay); + super.setDozing(dozing, fade, delay); if (!mIsAmbientPulsing) { // Only fade the showing view of the pulsing notification. fade = false; } final NotificationContentView showing = getShowingLayout(); if (showing != null) { - showing.setDark(dark, fade, delay); + showing.setDozing(dozing, fade, delay); } updateShelfIconColor(); } @@ -2180,7 +2180,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView */ @Override public boolean isSoundEffectsEnabled() { - final boolean mute = mDark && mSecureStateProvider != null && + final boolean mute = mDozing && mSecureStateProvider != null && !mSecureStateProvider.getAsBoolean(); return !mute && super.isSoundEffectsEnabled(); } @@ -2563,7 +2563,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView showingLayout.updateBackgroundColor(animated); mPrivateLayout.updateExpandButtons(isExpandable()); updateShelfIconColor(); - showingLayout.setDark(isDark(), false /* animate */, 0 /* delay */); + showingLayout.setDozing(isDozing(), false /* animate */, 0 /* delay */); mShowingPublicInitialized = true; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java index cac41da52120..30b53383bb74 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java @@ -49,7 +49,7 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable { protected int mClipBottomAmount; protected int mMinimumHeightForClipping = 0; protected float mExtraWidthForClipping = 0; - private boolean mDark; + private boolean mDozing; private ArrayList mMatchParentViews = new ArrayList(); private static Rect mClipRect = new Rect(); private boolean mWillBeGone; @@ -213,18 +213,18 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable { } /** - * Sets the notification as dark. The default implementation does nothing. + * Sets the notification as dozing. The default implementation does nothing. * - * @param dark Whether the notification should be dark. + * @param dozing Whether the notification should be dozing. * @param fade Whether an animation should be played to change the state. * @param delay If fading, the delay of the animation. */ - public void setDark(boolean dark, boolean fade, long delay) { - mDark = dark; + public void setDozing(boolean dozing, boolean fade, long delay) { + mDozing = dozing; } - public boolean isDark() { - return mDark; + public boolean isDozing() { + return mDozing; } public boolean isRemoved() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index 354ed2d00d32..ef11c7aacc3a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -103,7 +103,7 @@ public class NotificationContentView extends FrameLayout { private int mClipTopAmount; private int mContentHeight; private int mVisibleType = VISIBLE_TYPE_CONTRACTED; - private boolean mDark; + private boolean mDozing; private boolean mAnimate; private boolean mIsHeadsUp; private boolean mLegacy; @@ -1130,12 +1130,12 @@ public class NotificationContentView extends FrameLayout { return mIsContentExpandable; } - public void setDark(boolean dark, boolean fade, long delay) { + public void setDozing(boolean dozing, boolean fade, long delay) { if (mContractedChild == null) { return; } - mDark = dark; - selectLayout(!dark && fade /* animate */, false /* force */); + mDozing = dozing; + selectLayout(!dozing && fade /* animate */, false /* force */); } public void setHeadsUp(boolean headsUp) { @@ -1208,7 +1208,7 @@ public class NotificationContentView extends FrameLayout { applyMediaTransfer(entry); updateLegacy(); mForceSelectNextLayout = true; - setDark(mDark, false /* animate */, 0 /* delay */); + setDozing(mDozing, false /* animate */, 0 /* delay */); mPreviousExpandedRemoteInputIntent = null; mPreviousHeadsUpRemoteInputIntent = null; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java index fe890fb3b471..caad0f5be7a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java @@ -386,7 +386,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx } final ExpandableNotificationRow row = (ExpandableNotificationRow) view; - if (row.isDark()) { + if (row.isDozing()) { return false; } view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java index d911e1a05029..7bde92f1427f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java @@ -346,7 +346,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl if (mShouldShowMenu && !NotificationStackScrollLayout.isPinnedHeadsUp(getParent()) && !mParent.areGutsExposed() - && !mParent.isDark() + && !mParent.isDozing() && !mParent.showingAmbientPulsing() && (mCheckForDrag == null || !mHandler.hasCallbacks(mCheckForDrag))) { // Only show the menu if we're not a heads up view and guts aren't exposed. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java index d9162c0d6071..d8bda6cbbf83 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java @@ -79,7 +79,7 @@ public class AmbientState { private int mIntrinsicPadding; private int mExpandAnimationTopChange; private ExpandableNotificationRow mExpandingNotification; - private float mDarkAmount; + private float mHideAmount; private boolean mAppearing; private float mPulseHeight = MAX_PULSE_HEIGHT; private float mDozeAmount = 0.0f; @@ -180,23 +180,23 @@ public class AmbientState { mDimmed = dimmed; } - /** In dark mode, we draw as little as possible, assuming a black background */ + /** While dozing, we draw as little as possible, assuming a black background */ public void setDozing(boolean dozing) { mDozing = dozing; } - /** Dark ratio of the status bar **/ - public void setDarkAmount(float darkAmount) { - if (darkAmount == 1.0f && mDarkAmount != darkAmount) { - // Whenever we are fully dark, let's reset the pulseHeight again + /** Hide ratio of the status bar **/ + public void setHideAmount(float hidemount) { + if (hidemount == 1.0f && mHideAmount != hidemount) { + // Whenever we are fully hidden, let's reset the pulseHeight again mPulseHeight = MAX_PULSE_HEIGHT; } - mDarkAmount = darkAmount; + mHideAmount = hidemount; } - /** Returns the dark ratio of the status bar */ - public float getDarkAmount() { - return mDarkAmount; + /** Returns the hide ratio of the status bar */ + public float getHideAmount() { + return mHideAmount; } public void setHideSensitive(boolean hideSensitive) { @@ -295,7 +295,7 @@ public class AmbientState { } public boolean isPulseExpanding() { - return mPulseHeight != MAX_PULSE_HEIGHT && mDozeAmount != 0.0f && mDarkAmount != 1.0f; + return mPulseHeight != MAX_PULSE_HEIGHT && mDozeAmount != 0.0f && mHideAmount != 1.0f; } public boolean isShadeExpanded() { @@ -481,14 +481,15 @@ public class AmbientState { } /** - * @return {@code true } when shade is completely dark: in AOD or ambient display. + * @return {@code true } when shade is completely hidden: in AOD, ambient display or when + * bypassing. */ - public boolean isFullyDark() { - return mDarkAmount == 1; + public boolean isFullyHidden() { + return mHideAmount == 1; } - public boolean isDarkAtAll() { - return mDarkAmount != 0; + public boolean isHiddenAtAll() { + return mHideAmount != 0; } public void setAppearing(boolean appearing) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java index a471d8784c54..bc9e71a72b72 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java @@ -36,7 +36,7 @@ public class AnimationFilter { boolean animateHeight; boolean animateTopInset; boolean animateDimmed; - boolean animateDark; + boolean animateDozing; boolean animateHideSensitive; boolean hasDelays; boolean hasGoToFullShadeEvent; @@ -89,8 +89,8 @@ public class AnimationFilter { return this; } - public AnimationFilter animateDark() { - animateDark = true; + public AnimationFilter animateDozing() { + animateDozing = true; return this; } @@ -145,7 +145,7 @@ public class AnimationFilter { animateHeight |= filter.animateHeight; animateTopInset |= filter.animateTopInset; animateDimmed |= filter.animateDimmed; - animateDark |= filter.animateDark; + animateDozing |= filter.animateDozing; animateHideSensitive |= filter.animateHideSensitive; hasDelays |= filter.hasDelays; mAnimatedProperties.addAll(filter.mAnimatedProperties); @@ -160,7 +160,7 @@ public class AnimationFilter { animateHeight = false; animateTopInset = false; animateDimmed = false; - animateDark = false; + animateDozing = false; animateHideSensitive = false; hasDelays = false; hasGoToFullShadeEvent = false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java index f28e556229ce..af26c7c23222 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java @@ -85,7 +85,7 @@ public class ExpandableViewState extends ViewState { public int height; public boolean dimmed; - public boolean dark; + public boolean dozing; public boolean hideSensitive; public boolean belowSpeedBump; public boolean inShelf; @@ -121,7 +121,7 @@ public class ExpandableViewState extends ViewState { ExpandableViewState svs = (ExpandableViewState) viewState; height = svs.height; dimmed = svs.dimmed; - dark = svs.dark; + dozing = svs.dozing; hideSensitive = svs.hideSensitive; belowSpeedBump = svs.belowSpeedBump; clipTopAmount = svs.clipTopAmount; @@ -158,8 +158,8 @@ public class ExpandableViewState extends ViewState { // apply below shelf speed bump expandableView.setBelowSpeedBump(this.belowSpeedBump); - // apply dark - expandableView.setDark(this.dark, false /* animate */, 0 /* delay */); + // apply dozing + expandableView.setDozing(this.dozing, false /* animate */, 0 /* delay */); // apply clipping float oldClipTopAmount = expandableView.getClipTopAmount(); @@ -209,8 +209,8 @@ public class ExpandableViewState extends ViewState { expandableView.setHideSensitive(this.hideSensitive, animationFilter.animateHideSensitive, properties.delay, properties.duration); - // start dark animation - expandableView.setDark(this.dark, animationFilter.animateDark, properties.delay); + // start dozing animation + expandableView.setDozing(this.dozing, animationFilter.animateDozing, properties.delay); if (properties.wasAdded(child) && !hidden) { expandableView.performAddAnimation(properties.delay, properties.duration, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java index 6632ae63d944..5425c8e613a2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java @@ -567,7 +567,7 @@ public class NotificationChildrenContainer extends ViewGroup { ? parentState.zTranslation : 0; childState.dimmed = parentState.dimmed; - childState.dark = parentState.dark; + childState.dozing = parentState.dozing; childState.hideSensitive = parentState.hideSensitive; childState.belowSpeedBump = parentState.belowSpeedBump; childState.clipTopAmount = 0; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index aae4cafe1f5b..1f0e545ecb0f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -126,7 +126,6 @@ import com.android.systemui.statusbar.notification.row.NotificationGuts; import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.row.NotificationSnooze; import com.android.systemui.statusbar.notification.row.StackScrollerDecorView; -import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.HeadsUpAppearanceController; import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; import com.android.systemui.statusbar.phone.HeadsUpTouchHelper; @@ -267,8 +266,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private boolean mTopPaddingNeedsAnimation; private boolean mDimmedNeedsAnimation; private boolean mHideSensitiveNeedsAnimation; - private boolean mDarkNeedsAnimation; - private int mDarkAnimationOriginIndex; + private boolean mDozingNeedsAnimation; private boolean mActivateNeedsAnimation; private boolean mGoToFullShadeNeedsAnimation; private boolean mIsExpanded = true; @@ -409,9 +407,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private final ViewOutlineProvider mOutlineProvider = new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { - if (mAmbientState.isDarkAtAll()) { - float xProgress = mDarkXInterpolator.getInterpolation( - (1 - mLinearDarkAmount) * mBackgroundXFactor); + if (mAmbientState.isHiddenAtAll()) { + float xProgress = mHideXInterpolator.getInterpolation( + (1 - mLinearHideAmount) * mBackgroundXFactor); outline.setRoundRect(mBackgroundAnimationRect, MathUtils.lerp(mCornerRadius / 2.0f, mCornerRadius, xProgress)); @@ -427,14 +425,14 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private View mForcedScroll; /** - * @see #setDarkAmount(float, float) + * @see #setHideAmount(float, float) */ - private float mInterpolatedDarkAmount = 0f; + private float mInterpolatedHideAmount = 0f; /** - * @see #setDarkAmount(float, float) + * @see #setHideAmount(float, float) */ - private float mLinearDarkAmount = 0f; + private float mLinearHideAmount = 0f; /** * How fast the background scales in the X direction as a factor of the Y expansion. @@ -495,16 +493,13 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd Dependency.get(VisualStabilityManager.class); protected boolean mClearAllEnabled; - private Interpolator mDarkXInterpolator = Interpolators.FAST_OUT_SLOW_IN; + private Interpolator mHideXInterpolator = Interpolators.FAST_OUT_SLOW_IN; private NotificationPanelView mNotificationPanel; private final ShadeController mShadeController = Dependency.get(ShadeController.class); private final NotificationGutsManager mNotificationGutsManager = Dependency.get(NotificationGutsManager.class); private final NotificationSectionsManager mSectionsManager; - /** - * If the {@link NotificationShelf} should be visible when dark. - */ private boolean mAnimateBottomOnLayout; @Inject @@ -571,7 +566,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd blockingHelperManager.setNotificationShadeExpanded(height); }); - updateWillNotDraw(); + boolean willDraw = mShouldDrawNotificationBackground || DEBUG; + setWillNotDraw(!willDraw); mBackgroundPaint.setAntiAlias(true); if (DEBUG) { mDebugPaint = new Paint(); @@ -814,17 +810,17 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd int lockScreenRight = getWidth() - mSidePaddings; int lockScreenTop = mSections[0].getCurrentBounds().top; int lockScreenBottom = mSections[NUM_SECTIONS - 1].getCurrentBounds().bottom; - int darkLeft = getWidth() / 2; - int darkTop = mTopPadding; + int hiddenLeft = getWidth() / 2; + int hiddenTop = mTopPadding; - float yProgress = 1 - mInterpolatedDarkAmount; - float xProgress = mDarkXInterpolator.getInterpolation( - (1 - mLinearDarkAmount) * mBackgroundXFactor); + float yProgress = 1 - mInterpolatedHideAmount; + float xProgress = mHideXInterpolator.getInterpolation( + (1 - mLinearHideAmount) * mBackgroundXFactor); - int left = (int) MathUtils.lerp(darkLeft, lockScreenLeft, xProgress); - int right = (int) MathUtils.lerp(darkLeft, lockScreenRight, xProgress); - int top = (int) MathUtils.lerp(darkTop, lockScreenTop, yProgress); - int bottom = (int) MathUtils.lerp(darkTop, lockScreenBottom, yProgress); + int left = (int) MathUtils.lerp(hiddenLeft, lockScreenLeft, xProgress); + int right = (int) MathUtils.lerp(hiddenLeft, lockScreenRight, xProgress); + int top = (int) MathUtils.lerp(hiddenTop, lockScreenTop, yProgress); + int bottom = (int) MathUtils.lerp(hiddenTop, lockScreenBottom, yProgress); mBackgroundAnimationRect.set( left, top, @@ -940,7 +936,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd // Interpolate between semi-transparent notification panel background color // and white AOD separator. float colorInterpolation = MathUtils.smoothStep(0.4f /* start */, 1f /* end */, - mLinearDarkAmount); + mLinearHideAmount); int color = ColorUtils.blendARGB(mBgColor, Color.WHITE, colorInterpolation); if (mCachedBackgroundColor != color) { @@ -1361,11 +1357,12 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd mIsClipped = clipped; } - if (!mAmbientPulseManager.hasNotifications() && mAmbientState.isFullyDark()) { - setClipBounds(null); - } else if (mAmbientState.isDarkAtAll()) { + if (mAmbientState.isHiddenAtAll()) { clipToOutline = true; invalidateOutline(); + if (isFullyHidden()) { + setClipBounds(null); + } } else if (clipped) { setClipBounds(mRequestedClipBounds); } else { @@ -2434,7 +2431,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) private void updateBackground() { // No need to update the background color if it's not being drawn. - if (!mShouldDrawNotificationBackground || mAmbientState.isFullyDark()) { + if (!mShouldDrawNotificationBackground) { return; } @@ -3356,7 +3353,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd generateActivateEvent(); generateDimmedEvent(); generateHideSensitiveEvent(); - generateDarkEvent(); + generateDozingEvent(); generateGoToFullShadeEvent(); generateViewResizeEvent(); generateGroupExpansionEvent(); @@ -3571,17 +3568,16 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) - private void generateDarkEvent() { - if (mDarkNeedsAnimation) { + private void generateDozingEvent() { + if (mDozingNeedsAnimation) { AnimationEvent ev = new AnimationEvent(null, - AnimationEvent.ANIMATION_TYPE_DARK, + AnimationEvent.ANIMATION_TYPE_DOZING, new AnimationFilter() - .animateDark() + .animateDozing() .animateY(mShelf)); - ev.darkAnimationOriginIndex = mDarkAnimationOriginIndex; mAnimationEvents.add(ev); } - mDarkNeedsAnimation = false; + mDozingNeedsAnimation = false; } @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) @@ -4711,18 +4707,16 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } mAmbientState.setDozing(dozing); if (animate && mAnimationsEnabled) { - mDarkNeedsAnimation = true; - mDarkAnimationOriginIndex = findDarkAnimationOriginIndex(touchWakeUpScreenLocation); + mDozingNeedsAnimation = true; mNeedsAnimation = true; } requestChildrenUpdate(); - updateWillNotDraw(); notifyHeightChangeListener(mShelf); } @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) private void updatePanelTranslation() { - setTranslationX(mHorizontalPanelTranslation + mAntiBurnInOffsetX * mInterpolatedDarkAmount); + setTranslationX(mHorizontalPanelTranslation + mAntiBurnInOffsetX * mInterpolatedHideAmount); } @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) @@ -4732,49 +4726,30 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } /** - * Updates whether or not this Layout will perform its own custom drawing (i.e. whether or - * not {@link #onDraw(Canvas)} is called). This method should be called whenever the - * {@link #mAmbientState}'s dark mode is toggled. - */ - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - private void updateWillNotDraw() { - boolean willDraw = mShouldDrawNotificationBackground || DEBUG; - setWillNotDraw(!willDraw); - } - - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - private void setDarkAmount(float darkAmount) { - setDarkAmount(darkAmount, darkAmount); - } - - /** - * Sets the current dark amount. + * Sets the current hide amount. * - * @param linearDarkAmount The dark amount that follows linear interpoloation in the + * @param linearHideAmount The hide amount that follows linear interpoloation in the * animation, * i.e. animates from 0 to 1 or vice-versa in a linear manner. - * @param interpolatedDarkAmount The dark amount that follows the actual interpolation of the + * @param interpolatedHideAmount The hide amount that follows the actual interpolation of the * animation curve. */ @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public void setDarkAmount(float linearDarkAmount, float interpolatedDarkAmount) { - mLinearDarkAmount = linearDarkAmount; - mInterpolatedDarkAmount = interpolatedDarkAmount; - boolean wasFullyDark = mAmbientState.isFullyDark(); - boolean wasDarkAtAll = mAmbientState.isDarkAtAll(); - mAmbientState.setDarkAmount(interpolatedDarkAmount); - boolean nowFullyDark = mAmbientState.isFullyDark(); - boolean nowDarkAtAll = mAmbientState.isDarkAtAll(); - if (nowFullyDark != wasFullyDark) { - updateContentHeight(); - if (nowFullyDark) { - updateDarkShelfVisibility(); - } - } - if (!wasDarkAtAll && nowDarkAtAll) { + public void setHideAmount(float linearHideAmount, float interpolatedHideAmount) { + mLinearHideAmount = linearHideAmount; + mInterpolatedHideAmount = interpolatedHideAmount; + boolean wasFullyHidden = mAmbientState.isFullyHidden(); + boolean wasHiddenAtAll = mAmbientState.isHiddenAtAll(); + mAmbientState.setHideAmount(interpolatedHideAmount); + boolean nowFullyHidden = mAmbientState.isFullyHidden(); + boolean nowHiddenAtAll = mAmbientState.isHiddenAtAll(); + if (nowFullyHidden != wasFullyHidden) { + setVisibility(mAmbientState.isFullyHidden() ? View.INVISIBLE : View.VISIBLE); + } + if (!wasHiddenAtAll && nowHiddenAtAll) { resetExposedMenuView(true /* animate */, true /* animate */); } - if (nowFullyDark != wasFullyDark || wasDarkAtAll != nowDarkAtAll) { + if (nowFullyHidden != wasFullyHidden || wasHiddenAtAll != nowHiddenAtAll) { invalidateOutline(); } updateAlgorithmHeightAndPadding(); @@ -4783,42 +4758,18 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd requestChildrenUpdate(); } - private void updateDarkShelfVisibility() { - DozeParameters dozeParameters = DozeParameters.getInstance(mContext); - if (dozeParameters.shouldControlScreenOff()) { - mShelf.fadeInTranslating(); - } - updateClipping(); - } - @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) - public void notifyDarkAnimationStart(boolean dark) { - // We only swap the scaling factor if we're fully dark or fully awake to avoid + public void notifyHideAnimationStart(boolean hide) { + // We only swap the scaling factor if we're fully hidden or fully awake to avoid // interpolation issues when playing with the power button. - if (mInterpolatedDarkAmount == 0 || mInterpolatedDarkAmount == 1) { - mBackgroundXFactor = dark ? 1.8f : 1.5f; - mDarkXInterpolator = dark + if (mInterpolatedHideAmount == 0 || mInterpolatedHideAmount == 1) { + mBackgroundXFactor = hide ? 1.8f : 1.5f; + mHideXInterpolator = hide ? Interpolators.FAST_OUT_SLOW_IN_REVERSE : Interpolators.FAST_OUT_SLOW_IN; } } - @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) - private int findDarkAnimationOriginIndex(@Nullable PointF screenLocation) { - if (screenLocation == null || screenLocation.y < mTopPadding) { - return AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_ABOVE; - } - if (screenLocation.y > getBottomMostNotificationBottom()) { - return AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_BELOW; - } - View child = getClosestChildAtRawPosition(screenLocation.x, screenLocation.y); - if (child != null) { - return getNotGoneIndex(child); - } else { - return AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_ABOVE; - } - } - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) private int getNotGoneIndex(View child) { int count = getChildCount(); @@ -5416,8 +5367,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public boolean isFullyDark() { - return mAmbientState.isFullyDark(); + public boolean isFullyHidden() { + return mAmbientState.isFullyHidden(); } /** @@ -5661,7 +5612,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } /** - * Set the amount how much we're dozing. This is different from how dark the shade is, when + * Set the amount how much we're dozing. This is different from how hidden the shade is, when * the notification is pulsing. */ public void setDozeAmount(float dozeAmount) { @@ -5880,7 +5831,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd .animateY() .animateZ(), - // ANIMATION_TYPE_DARK + // ANIMATION_TYPE_DOZING null, // Unused // ANIMATION_TYPE_GO_TO_FULL_SHADE @@ -5944,7 +5895,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd // ANIMATION_TYPE_EVERYTHING new AnimationFilter() .animateAlpha() - .animateDark() + .animateDozing() .animateDimmed() .animateHideSensitive() .animateHeight() @@ -5976,7 +5927,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd // ANIMATION_TYPE_CHANGE_POSITION StackStateAnimator.ANIMATION_DURATION_STANDARD, - // ANIMATION_TYPE_DARK + // ANIMATION_TYPE_DOZING StackStateAnimator.ANIMATION_DURATION_WAKEUP, // ANIMATION_TYPE_GO_TO_FULL_SHADE @@ -6014,7 +5965,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd static final int ANIMATION_TYPE_ACTIVATED_CHILD = 4; static final int ANIMATION_TYPE_DIMMED = 5; static final int ANIMATION_TYPE_CHANGE_POSITION = 6; - static final int ANIMATION_TYPE_DARK = 7; + static final int ANIMATION_TYPE_DOZING = 7; static final int ANIMATION_TYPE_GO_TO_FULL_SHADE = 8; static final int ANIMATION_TYPE_HIDE_SENSITIVE = 9; static final int ANIMATION_TYPE_VIEW_RESIZE = 10; @@ -6025,16 +5976,12 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd static final int ANIMATION_TYPE_HEADS_UP_OTHER = 15; static final int ANIMATION_TYPE_EVERYTHING = 16; - static final int DARK_ANIMATION_ORIGIN_INDEX_ABOVE = -1; - static final int DARK_ANIMATION_ORIGIN_INDEX_BELOW = -2; - final long eventStartTime; final ExpandableView mChangingView; final int animationType; final AnimationFilter filter; final long length; View viewAfterChangingView; - int darkAnimationOriginIndex; boolean headsUpFromBottom; AnimationEvent(ExpandableView view, int type) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index 2980ee4ac45e..ccee2a1d9b9f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -213,7 +213,7 @@ public class StackScrollAlgorithm { private void updateDimmedActivatedHideSensitive(AmbientState ambientState, StackScrollAlgorithmState algorithmState) { boolean dimmed = ambientState.isDimmed(); - boolean dark = ambientState.isFullyDark(); + boolean hidden = ambientState.isFullyHidden(); boolean hideSensitive = ambientState.isHideSensitive(); View activatedChild = ambientState.getActivatedChild(); int childCount = algorithmState.visibleChildren.size(); @@ -221,7 +221,7 @@ public class StackScrollAlgorithm { ExpandableView child = algorithmState.visibleChildren.get(i); ExpandableViewState childViewState = child.getViewState(); childViewState.dimmed = dimmed; - childViewState.dark = dark; + childViewState.dozing = hidden; childViewState.hideSensitive = hideSensitive; boolean isActivatedChild = activatedChild == child; if (dimmed && isActivatedChild) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java index 7332b034b9bf..ea1ceec4e3b3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java @@ -172,7 +172,7 @@ public class StackStateAnimator { || viewState.alpha != child.getAlpha() || viewState.height != child.getActualHeight() || viewState.clipTopAmount != child.getClipTopAmount() - || viewState.dark != child.isDark())) { + || viewState.dozing != child.isDozing())) { mAnimationProperties.delay = mCurrentAdditionalDelay + calculateChildAnimationDelay(viewState); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index e8ca3eef24de..177b72a01f85 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -15,7 +15,9 @@ import androidx.collection.ArrayMap; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.statusbar.StatusBarIcon; import com.android.internal.util.ContrastColorUtil; +import com.android.settingslib.Utils; import com.android.systemui.Dependency; +import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; @@ -24,6 +26,7 @@ import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.StatusBarIconView; +import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -41,12 +44,14 @@ public class NotificationIconAreaController implements DarkReceiver, StatusBarStateController.StateListener { public static final String LOW_PRIORITY = "low_priority"; + private static final long AOD_ICONS_APPEAR_DURATION = 200; private final ContrastColorUtil mContrastColorUtil; private final NotificationEntryManager mEntryManager; private final Runnable mUpdateStatusBarIcons = this::updateStatusBarIcons; private final StatusBarStateController mStatusBarStateController; private final NotificationMediaManager mMediaManager; + private final DozeParameters mDozeParameters; @VisibleForTesting final NotificationListener.NotificationSettingsListener mSettingsListener = new NotificationListener.NotificationSettingsListener() { @@ -72,17 +77,17 @@ public class NotificationIconAreaController implements DarkReceiver, private NotificationIconContainer mShelfIcons; protected View mCenteredIconArea; private NotificationIconContainer mCenteredIcon; + private NotificationIconContainer mAodIcons; private StatusBarIconView mCenteredIconView; private final Rect mTintArea = new Rect(); private ViewGroup mNotificationScrollLayout; private Context mContext; - private boolean mFullyDark; private boolean mShowLowPriority = true; + private int mAodIconAppearTranslation; - /** - * Ratio representing being awake or in ambient mode, where 1 is dark and 0 awake. - */ - private float mDarkAmount; + private boolean mAnimationsEnabled; + private int mAodIconTint; + private boolean mFullyHidden; public NotificationIconAreaController(Context context, StatusBar statusBar, StatusBarStateController statusBarStateController, @@ -96,8 +101,10 @@ public class NotificationIconAreaController implements DarkReceiver, mStatusBarStateController.addCallback(this); mMediaManager = notificationMediaManager; notificationListener.addNotificationSettingsListener(mSettingsListener); + mDozeParameters = DozeParameters.getInstance(mContext); initializeNotificationAreaViews(context); + reloadAodColor(); } protected View inflateIconArea(LayoutInflater inflater) { @@ -118,6 +125,24 @@ public class NotificationIconAreaController implements DarkReceiver, mCenteredIconArea = layoutInflater.inflate(R.layout.center_icon_area, null); mCenteredIcon = mCenteredIconArea.findViewById(R.id.centeredIcon); + + initAodIcons(); + } + + public void initAodIcons() { + boolean changed = mAodIcons != null; + if (changed) { + mAodIcons.setAnimationsEnabled(false); + mAodIcons.removeAllViews(); + } + mAodIcons = mStatusBar.getStatusBarWindow().findViewById( + R.id.clock_notification_icon_container); + mAodIcons.setOnLockScreen(true); + updateAodIconsVisibility(); + updateAnimations(); + if (changed) { + updateAodIcons(); + } } public void setupShelf(NotificationShelf shelf) { @@ -140,6 +165,10 @@ public class NotificationIconAreaController implements DarkReceiver, View child = mCenteredIcon.getChildAt(i); child.setLayoutParams(params); } + for (int i = 0; i < mAodIcons.getChildCount(); i++) { + View child = mAodIcons.getChildAt(i); + child.setLayoutParams(params); + } } @NonNull @@ -152,6 +181,8 @@ public class NotificationIconAreaController implements DarkReceiver, Resources res = context.getResources(); mIconSize = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_icon_size); mIconHPadding = res.getDimensionPixelSize(R.dimen.status_bar_icon_padding); + mAodIconAppearTranslation = res.getDimensionPixelSize( + R.dimen.shelf_appear_translation); } /** @@ -236,7 +267,7 @@ public class NotificationIconAreaController implements DarkReceiver, return false; } // showAmbient == show in shade but not shelf - if ((!showAmbient || mFullyDark) && entry.shouldSuppressStatusBar()) { + if (!showAmbient && entry.shouldSuppressStatusBar()) { return false; } return true; @@ -249,6 +280,7 @@ public class NotificationIconAreaController implements DarkReceiver, updateStatusBarIcons(); updateShelfIcons(); updateCenterIcon(); + updateAodIcons(); applyNotificationIconsTint(); } @@ -256,10 +288,10 @@ public class NotificationIconAreaController implements DarkReceiver, private void updateShelfIcons() { updateIconsForLayout(entry -> entry.expandedIcon, mShelfIcons, true /* showAmbient */, - !mFullyDark /* showLowPriority */, + true /* showLowPriority */, false /* hideDismissed */, - mFullyDark /* hideRepliedMessages */, - mFullyDark /* hideCurrentMedia */, + false /* hideRepliedMessages */, + false /* hideCurrentMedia */, true /* hide centered icon */); } @@ -276,13 +308,23 @@ public class NotificationIconAreaController implements DarkReceiver, private void updateCenterIcon() { updateIconsForLayout(entry -> entry.centeredIcon, mCenteredIcon, false /* showAmbient */, - !mFullyDark /* showLowPriority */, + true /* showLowPriority */, false /* hideDismissed */, false /* hideRepliedMessages */, - mFullyDark /* hideCurrentMedia */, + false /* hideCurrentMedia */, false /* hide centered icon */); } + public void updateAodIcons() { + updateIconsForLayout(entry -> entry.aodIcon, mAodIcons, + false /* showAmbient */, + mShowLowPriority /* showLowPriority */, + true /* hideDismissed */, + true /* hideRepliedMessages */, + true /* hideCurrentMedia */, + true /* hide centered icon */); + } + @VisibleForTesting boolean shouldShouldLowPriorityIcons() { return mShowLowPriority; @@ -424,6 +466,8 @@ public class NotificationIconAreaController implements DarkReceiver, iv.executeOnLayout(() -> updateTintForIcon(iv, mCenteredIconTint)); } } + + updateAodIconColors(); } private void updateTintForIcon(StatusBarIconView v, int tint) { @@ -437,12 +481,6 @@ public class NotificationIconAreaController implements DarkReceiver, v.setDecorColor(tint); } - public void setDark(boolean dark) { - mNotificationIcons.setDark(dark, false, 0); - mShelfIcons.setDark(dark, false, 0); - mCenteredIcon.setDark(dark, false, 0); - } - /** * Shows the icon view given in the center. */ @@ -463,12 +501,78 @@ public class NotificationIconAreaController implements DarkReceiver, } @Override - public void onDozeAmountChanged(float linear, float eased) { - mDarkAmount = linear; - boolean fullyDark = mDarkAmount == 1f; - if (mFullyDark != fullyDark) { - mFullyDark = fullyDark; - updateShelfIcons(); + public void onDozingChanged(boolean isDozing) { + boolean animate = mDozeParameters.getAlwaysOn() + && !mDozeParameters.getDisplayNeedsBlanking(); + mAodIcons.setDozing(isDozing, animate, 0); + } + + public void setAnimationsEnabled(boolean enabled) { + mAnimationsEnabled = enabled; + updateAnimations(); + } + + @Override + public void onStateChanged(int newState) { + updateAnimations(); + } + + private void updateAnimations() { + boolean inShade = mStatusBarStateController.getState() == StatusBarState.SHADE; + mAodIcons.setAnimationsEnabled(mAnimationsEnabled && !inShade); + mCenteredIcon.setAnimationsEnabled(mAnimationsEnabled && inShade); + mNotificationIcons.setAnimationsEnabled(mAnimationsEnabled && inShade); + } + + public void onThemeChanged() { + reloadAodColor(); + updateAodIconColors(); + } + + public void appearAodIcons() { + DozeParameters dozeParameters = DozeParameters.getInstance(mContext); + if (dozeParameters.shouldControlScreenOff()) { + mAodIcons.setTranslationY(-mAodIconAppearTranslation); + mAodIcons.setAlpha(0); + mAodIcons.animate() + .setInterpolator(Interpolators.DECELERATE_QUINT) + .translationY(0) + .setDuration(AOD_ICONS_APPEAR_DURATION) + .start(); + mAodIcons.animate() + .alpha(1) + .setInterpolator(Interpolators.LINEAR) + .setDuration(AOD_ICONS_APPEAR_DURATION) + .start(); } } + + private void reloadAodColor() { + mAodIconTint = Utils.getColorAttrDefaultColor(mContext, + R.attr.wallpaperTextColor); + } + private void updateAodIconColors() { + for (int i = 0; i < mAodIcons.getChildCount(); i++) { + final StatusBarIconView iv = (StatusBarIconView) mAodIcons.getChildAt(i); + if (iv.getWidth() != 0) { + updateTintForIcon(iv, mAodIconTint); + } else { + iv.executeOnLayout(() -> updateTintForIcon(iv, mAodIconTint)); + } + } + } + + public void setFullyHidden(boolean fullyHidden) { + if (mFullyHidden != fullyHidden) { + mFullyHidden = fullyHidden; + if (fullyHidden) { + appearAodIcons(); + } + updateAodIconsVisibility(); + } + } + + private void updateAodIconsVisibility() { + mAodIcons.setVisibility(mFullyHidden ? View.VISIBLE : View.INVISIBLE); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java index 009afca5b034..e51baf306328 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java @@ -128,7 +128,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { } }.setDuration(CONTENT_FADE_DURATION); - private static final int MAX_VISIBLE_ICONS_WHEN_DARK = 5; + private static final int MAX_VISIBLE_ICONS_ON_LOCK = 5; public static final int MAX_STATIC_ICONS = 4; private static final int MAX_DOTS = 1; @@ -141,7 +141,8 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { private int mActualLayoutWidth = NO_VALUE; private float mActualPaddingEnd = NO_VALUE; private float mActualPaddingStart = NO_VALUE; - private boolean mDark; + private boolean mDozing; + private boolean mOnLockScreen; private boolean mChangingViewPositions; private int mAddAnimationStartIndex = -1; private int mCannedAnimationStartIndex = -1; @@ -288,7 +289,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { } } if (child instanceof StatusBarIconView) { - ((StatusBarIconView) child).setDark(mDark, false, 0); + ((StatusBarIconView) child).setDozing(mDozing, false, 0); } } @@ -315,7 +316,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { @Override public void onViewRemoved(View child) { super.onViewRemoved(child); - if (child instanceof StatusBarIconView) { + if (mAnimationsEnabled && child instanceof StatusBarIconView) { boolean isReplacingIcon = isReplacingIcon(child); final StatusBarIconView icon = (StatusBarIconView) child; if (icon.getVisibleState() != StatusBarIconView.STATE_HIDDEN @@ -372,7 +373,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { float translationX = getActualPaddingStart(); int firstOverflowIndex = -1; int childCount = getChildCount(); - int maxVisibleIcons = mDark ? MAX_VISIBLE_ICONS_WHEN_DARK : + int maxVisibleIcons = mOnLockScreen ? MAX_VISIBLE_ICONS_ON_LOCK : mIsStaticLayout ? MAX_STATIC_ICONS : childCount; float layoutEnd = getLayoutEnd(); float overflowStart = getMaxOverflowStart(); @@ -389,8 +390,8 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { boolean forceOverflow = mSpeedBumpIndex != -1 && i >= mSpeedBumpIndex && iconState.iconAppearAmount > 0.0f || i >= maxVisibleIcons; boolean noOverflowAfter = i == childCount - 1; - float drawingScale = mDark && view instanceof StatusBarIconView - ? ((StatusBarIconView) view).getIconScaleFullyDark() + float drawingScale = mOnLockScreen && view instanceof StatusBarIconView + ? ((StatusBarIconView) view).getIconScaleIncreased() : 1f; if (mOpenedAmount != 0.0f) { noOverflowAfter = noOverflowAfter && !hasAmbient && !forceOverflow; @@ -437,7 +438,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { mFirstVisibleIconState = mIconStates.get(getChildAt(0)); } - boolean center = mDark; + boolean center = mOnLockScreen; if (center && translationX < getLayoutEnd()) { float initialTranslation = mFirstVisibleIconState == null ? 0 : mFirstVisibleIconState.xTranslation; @@ -557,13 +558,13 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { mChangingViewPositions = changingViewPositions; } - public void setDark(boolean dark, boolean fade, long delay) { - mDark = dark; + public void setDozing(boolean dozing, boolean fade, long delay) { + mDozing = dozing; mDisallowNextAnimation |= !fade; for (int i = 0; i < getChildCount(); i++) { View view = getChildAt(i); if (view instanceof StatusBarIconView) { - ((StatusBarIconView) view).setDark(dark, fade, delay); + ((StatusBarIconView) view).setDozing(dozing, fade, delay); } } } @@ -667,6 +668,10 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { } } + public void setOnLockScreen(boolean onLockScreen) { + mOnLockScreen = onLockScreen; + } + public class IconState extends ViewState { public static final int NO_VALUE = NotificationIconContainer.NO_VALUE; public float iconAppearAmount = 1.0f; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index b3cbf083e4a8..b2c5965066e3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -345,6 +345,9 @@ public class NotificationPanelView extends PanelView implements private int mThemeResId; private KeyguardIndicationController mKeyguardIndicationController; private Consumer mAffordanceLaunchListener; + private int mShelfHeight; + private Runnable mOnReinflationListener; + private int mDarkIconSize; @Inject public NotificationPanelView(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, @@ -452,6 +455,9 @@ public class NotificationPanelView extends PanelView implements R.dimen.keyguard_indication_bottom_padding); mQsNotificationTopPadding = getResources().getDimensionPixelSize( R.dimen.qs_notification_padding); + mShelfHeight = getResources().getDimensionPixelSize(R.dimen.notification_shelf_height); + mDarkIconSize = getResources().getDimensionPixelSize( + R.dimen.status_bar_icon_drawing_size_dark); } /** @@ -544,6 +550,9 @@ public class NotificationPanelView extends PanelView implements setKeyguardStatusViewVisibility(mBarState, false, false); setKeyguardBottomAreaVisibility(mBarState, false); + if (mOnReinflationListener != null) { + mOnReinflationListener.run(); + } } private void initBottomArea() { @@ -674,7 +683,8 @@ public class NotificationPanelView extends PanelView implements mNotificationStackScroller.getIntrinsicContentHeight(), getExpandedFraction(), totalHeight, - mKeyguardStatusView.getHeight(), + (int) (mKeyguardStatusView.getHeight() + - mShelfHeight / 2.0f - mDarkIconSize / 2.0f), clockPreferredY, hasCustomClock(), mNotificationStackScroller.getVisibleNotificationCount() != 0, @@ -3062,10 +3072,6 @@ public class NotificationPanelView extends PanelView implements return mNotificationStackScroller.hasPulsingNotifications(); } - public boolean isFullyDark() { - return mNotificationStackScroller.isFullyDark(); - } - public ActivatableNotificationView getActivatedChild() { return mNotificationStackScroller.getActivatedChild(); } @@ -3113,6 +3119,10 @@ public class NotificationPanelView extends PanelView implements mAnimateNextPositionUpdate = true; } + public void setOnReinflationListener(Runnable onReinflationListener) { + mOnReinflationListener = onReinflationListener; + } + /** * Panel and QS expansion callbacks. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java index ca762cdf07f3..27c94d277cc4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java @@ -36,6 +36,9 @@ import com.android.systemui.plugins.qs.QS; import com.android.systemui.statusbar.notification.AboveShelfObserver; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; +import java.util.ArrayList; +import java.util.Comparator; + /** * The container with notification stack scroller and quick settings inside. */ @@ -54,6 +57,9 @@ public class NotificationsQuickSettingsContainer extends FrameLayout private int mBottomPadding; private int mStackScrollerMargin; private boolean mHasViewsAboveShelf; + private ArrayList mDrawingOrderedChildren = new ArrayList<>(); + private ArrayList mLayoutDrawingOrder = new ArrayList<>(); + private final Comparator mIndexComparator = Comparator.comparingInt(this::indexOfChild); public NotificationsQuickSettingsContainer(Context context, AttributeSet attrs) { super(context, attrs); @@ -107,35 +113,44 @@ public class NotificationsQuickSettingsContainer extends FrameLayout } @Override - protected boolean drawChild(Canvas canvas, View child, long drawingTime) { - boolean userSwitcherVisible = mInflated && mUserSwitcher.getVisibility() == View.VISIBLE; - boolean statusBarVisible = mKeyguardStatusBar.getVisibility() == View.VISIBLE; - - final boolean qsBottom = mHasViewsAboveShelf; - View stackQsTop = qsBottom ? mStackScroller : mQsFrame; - View stackQsBottom = !qsBottom ? mStackScroller : mQsFrame; + protected void dispatchDraw(Canvas canvas) { // Invert the order of the scroll view and user switcher such that the notifications receive // touches first but the panel gets drawn above. - if (child == mQsFrame) { - return super.drawChild(canvas, userSwitcherVisible && statusBarVisible ? mUserSwitcher - : statusBarVisible ? mKeyguardStatusBar - : userSwitcherVisible ? mUserSwitcher - : stackQsBottom, drawingTime); - } else if (child == mStackScroller) { - return super.drawChild(canvas, - userSwitcherVisible && statusBarVisible ? mKeyguardStatusBar - : statusBarVisible || userSwitcherVisible ? stackQsBottom - : stackQsTop, - drawingTime); - } else if (child == mUserSwitcher) { - return super.drawChild(canvas, - userSwitcherVisible && statusBarVisible ? stackQsBottom - : stackQsTop, - drawingTime); - } else if (child == mKeyguardStatusBar) { - return super.drawChild(canvas, - stackQsTop, - drawingTime); + mDrawingOrderedChildren.clear(); + mLayoutDrawingOrder.clear(); + if (mInflated && mUserSwitcher.getVisibility() == View.VISIBLE) { + mDrawingOrderedChildren.add(mUserSwitcher); + mLayoutDrawingOrder.add(mUserSwitcher); + } + if (mKeyguardStatusBar.getVisibility() == View.VISIBLE) { + mDrawingOrderedChildren.add(mKeyguardStatusBar); + mLayoutDrawingOrder.add(mKeyguardStatusBar); + } + if (mStackScroller.getVisibility() == View.VISIBLE) { + mDrawingOrderedChildren.add(mStackScroller); + mLayoutDrawingOrder.add(mStackScroller); + } + if (mQsFrame.getVisibility() == View.VISIBLE) { + mDrawingOrderedChildren.add(mQsFrame); + mLayoutDrawingOrder.add(mQsFrame); + } + + if (mHasViewsAboveShelf) { + // StackScroller needs to be on top + mDrawingOrderedChildren.remove(mStackScroller); + mDrawingOrderedChildren.add(mStackScroller); + } + + // Let's now find the order that the view has when drawing regulary by sorting + mLayoutDrawingOrder.sort(mIndexComparator); + super.dispatchDraw(canvas); + } + + @Override + protected boolean drawChild(Canvas canvas, View child, long drawingTime) { + int layoutIndex = mLayoutDrawingOrder.indexOf(child); + if (layoutIndex >= 0) { + return super.drawChild(canvas, mDrawingOrderedChildren.get(layoutIndex), drawingTime); } else { return super.drawChild(canvas, child, drawingTime); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 7f20d8c40ab8..0341186f049e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -816,8 +816,10 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationIconAreaController = SystemUIFactory.getInstance() .createNotificationIconAreaController(context, this, mStatusBarStateController, mNotificationListener); + mWakeUpCoordinator.setIconAreaController(mNotificationIconAreaController); inflateShelf(); mNotificationIconAreaController.setupShelf(mNotificationShelf); + mNotificationPanel.setOnReinflationListener(mNotificationIconAreaController::initAodIcons); Dependency.get(DarkIconDispatcher.class).addDarkReceiver(mNotificationIconAreaController); // Allow plugins to reference DarkIconDispatcher and StatusBarStateController @@ -1194,6 +1196,7 @@ public class StatusBar extends SystemUI implements DemoMode, if (mAmbientIndicationContainer instanceof AutoReinflateContainer) { ((AutoReinflateContainer) mAmbientIndicationContainer).inflateLayout(); } + mNotificationIconAreaController.onThemeChanged(); } @Override @@ -3676,8 +3679,9 @@ public class StatusBar extends SystemUI implements DemoMode, private void updateNotificationPanelTouchState() { boolean goingToSleepWithoutAnimation = isGoingToSleep() && !DozeParameters.getInstance(mContext).shouldControlScreenOff(); - mNotificationPanel.setTouchAndAnimationDisabled((!mDeviceInteractive && !mPulsing) - || goingToSleepWithoutAnimation); + boolean disabled = (!mDeviceInteractive && !mPulsing) || goingToSleepWithoutAnimation; + mNotificationPanel.setTouchAndAnimationDisabled(disabled); + mNotificationIconAreaController.setAnimationsEnabled(!disabled); } final ScreenLifecycle.Observer mScreenObserver = new ScreenLifecycle.Observer() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index 7d5f23bc1e58..de266592533d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -415,7 +415,6 @@ public class StatusBarWindowView extends FrameLayout { } boolean intercept = false; if (mNotificationPanel.isFullyExpanded() - && stackScrollLayout.getVisibility() == View.VISIBLE && mStatusBarStateController.getState() == StatusBarState.KEYGUARD && !mService.isBouncerShowing() && !mService.isDozing()) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java index 8077e3fbaa0a..8d3c54988001 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java @@ -37,9 +37,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AppOpsManager; -import android.app.Notification; import android.app.NotificationChannel; -import android.os.UserHandle; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; @@ -140,7 +138,7 @@ public class ExpandableNotificationRowTest extends SysuiTestCase { @Test public void testIconColorShouldBeUpdatedWhenSettingDark() throws Exception { ExpandableNotificationRow row = spy(mNotificationTestHelper.createRow()); - row.setDark(true, false, 0); + row.setDozing(true, false, 0); verify(row).updateShelfIconColor(); } @@ -212,7 +210,7 @@ public class ExpandableNotificationRowTest extends SysuiTestCase { @Test public void testClickSound() throws Exception { assertTrue("Should play sounds by default.", mGroupRow.isSoundEffectsEnabled()); - mGroupRow.setDark(true /* dark */, false /* fade */, 0 /* delay */); + mGroupRow.setDozing(true /* dark */, false /* fade */, 0 /* delay */); mGroupRow.setSecureStateProvider(()-> false); assertFalse("Shouldn't play sounds when dark and trusted.", mGroupRow.isSoundEffectsEnabled()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java index 5cd0ca7efa9e..377aa0bacd36 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java @@ -83,8 +83,8 @@ public class NotificationContentViewTest extends SysuiTestCase { @UiThreadTest public void animationStartType_getsClearedAfterUpdatingVisibilitiesWithoutAnimation() { mView.setHeadsUp(true); - mView.setDark(true, false, 0); - mView.setDark(false, true, 0); + mView.setDozing(true, false, 0); + mView.setDozing(false, true, 0); mView.setHeadsUpAnimatingAway(true); assertFalse(mView.isAnimatingVisibleType()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index 662edd2d58cd..c1780467daf9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -173,7 +173,6 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { doNothing().when(mGroupManager).collapseAllGroups(); doNothing().when(mExpandHelper).cancelImmediately(); doNothing().when(notificationShelf).setAnimationsEnabled(anyBoolean()); - doNothing().when(notificationShelf).fadeInTranslating(); } @After @@ -194,9 +193,9 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { public void testAntiBurnInOffset() { final int burnInOffset = 30; mStackScroller.setAntiBurnInOffsetX(burnInOffset); - mStackScroller.setDarkAmount(0.0f, 0.0f); + mStackScroller.setHideAmount(0.0f, 0.0f); Assert.assertEquals(0 /* expected */, mStackScroller.getTranslationX(), 0.01 /* delta */); - mStackScroller.setDarkAmount(1.0f, 1.0f); + mStackScroller.setHideAmount(1.0f, 1.0f); Assert.assertEquals(burnInOffset /* expected */, mStackScroller.getTranslationX(), 0.01 /* delta */); } @@ -386,7 +385,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { NotificationSwipeHelper swipeActionHelper = (NotificationSwipeHelper) mStackScroller.getSwipeActionHelper(); swipeActionHelper.setExposedMenuView(new View(mContext)); - mStackScroller.setDarkAmount(0.1f, 0.1f); + mStackScroller.setHideAmount(0.1f, 0.1f); assertNull(swipeActionHelper.getExposedMenuView()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java index 7f7a3e7e7cd6..61b753079f0b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java @@ -20,6 +20,7 @@ import static android.provider.Settings.Secure.NOTIFICATION_NEW_INTERRUPTION_MOD import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.when; import android.provider.Settings; import android.testing.AndroidTestingRunner; @@ -27,6 +28,7 @@ import android.testing.TestableLooper; import androidx.test.filters.SmallTest; +import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationListener; @@ -36,6 +38,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; @SmallTest @@ -48,6 +51,10 @@ public class NotificationIconAreaControllerTest extends SysuiTestCase { @Mock StatusBar mStatusBar; @Mock + StatusBarWindowView mStatusBarWindowView; + @Mock + NotificationIconContainer mIconContainer; + @Mock StatusBarStateController mStatusBarStateController; @Mock private NotificationMediaManager mMediaManager; @@ -56,7 +63,9 @@ public class NotificationIconAreaControllerTest extends SysuiTestCase { @Before public void setup() { MockitoAnnotations.initMocks(this); - + when(mStatusBar.getStatusBarWindow()).thenReturn(mStatusBarWindowView); + when(mStatusBarWindowView.findViewById(R.id.clock_notification_icon_container)).thenReturn( + mIconContainer); mController = new NotificationIconAreaController(mContext, mStatusBar, mStatusBarStateController, mListener, mMediaManager); } -- GitLab From b207de5d6a950f0e5e59005c25d46093ca4c66df Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Tue, 4 Jun 2019 16:37:40 -0700 Subject: [PATCH 069/620] Avoid unwanted wakeAndUnLock mode for face Test: press power repeatedly on lock screen Bug: 132846921 Fixes: 130766403 Bug: 130327302 Change-Id: Ic11914ad220a0c8f81f0d28d5f999fcf970ccdeb (cherry picked from commit 9bae9c2dc6d2e507594a0195d1c74a7ed57cb8e8) --- .../keyguard/KeyguardUpdateMonitor.java | 4 ++++ .../phone/BiometricUnlockController.java | 15 ++++++++++--- .../phone/KeyguardBypassController.kt | 7 ------ .../phone/BiometricsUnlockControllerTest.java | 22 ++++++------------- 4 files changed, 23 insertions(+), 25 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 9feca3d2865a..3c119a622b66 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -748,6 +748,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private void handleFaceAuthenticated(int authUserId) { Trace.beginSection("KeyGuardUpdateMonitor#handlerFaceAuthenticated"); try { + if (mGoingToSleep) { + Log.d(TAG, "Aborted successful auth because device is going to sleep."); + return; + } final int userId; try { userId = ActivityManager.getService().getCurrentUser().id; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index d67795210f0c..aa78a5d63f7e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -365,16 +365,23 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { private int calculateMode(BiometricSourceType biometricSourceType) { boolean unlockingAllowed = mUpdateMonitor.isUnlockingWithBiometricAllowed(); boolean deviceDreaming = mUpdateMonitor.isDreaming(); - boolean faceStayingOnKeyguard = biometricSourceType == BiometricSourceType.FACE - && !mKeyguardBypassController.getBypassEnabled(); + boolean face = biometricSourceType == BiometricSourceType.FACE; + boolean faceStayingOnKeyguard = face && !mKeyguardBypassController.getBypassEnabled(); if (!mUpdateMonitor.isDeviceInteractive()) { if (!mStatusBarKeyguardViewManager.isShowing()) { return MODE_ONLY_WAKE; } else if (mDozeScrimController.isPulsing() && unlockingAllowed) { return faceStayingOnKeyguard ? MODE_NONE : MODE_WAKE_AND_UNLOCK_PULSING; - } else if (unlockingAllowed || !mUnlockMethodCache.isMethodSecure()) { + } else if (!face && (unlockingAllowed || !mUnlockMethodCache.isMethodSecure())) { return MODE_WAKE_AND_UNLOCK; + } else if (face) { + if (!(mDozeScrimController.isPulsing() && !unlockingAllowed)) { + Log.wtf(TAG, "Face somehow arrived when the device was not interactive"); + } + // We could theoretically return MODE_NONE, but this means that the device + // would be not interactive, unlocked, and the user would not see the device state. + return MODE_ONLY_WAKE; } else { return MODE_SHOW_BOUNCER; } @@ -389,6 +396,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { return MODE_DISMISS_BOUNCER; } else if (unlockingAllowed) { return faceStayingOnKeyguard ? MODE_ONLY_WAKE : MODE_UNLOCK; + } else if (face) { + return MODE_NONE; } else if (!mStatusBarKeyguardViewManager.isBouncerShowing()) { return MODE_SHOW_BOUNCER; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt index c9dd4613b946..124206a5a369 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt @@ -19,7 +19,6 @@ package com.android.systemui.statusbar.phone import android.content.Context import android.hardware.face.FaceManager import android.provider.Settings -import com.android.internal.annotations.VisibleForTesting import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.tuner.TunerService @@ -59,10 +58,4 @@ class KeyguardBypassController { } }, Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD) } - - @VisibleForTesting - constructor(bypassEnabled: Boolean, unlockMethodCache: UnlockMethodCache) { - this.bypassEnabled = bypassEnabled - this.unlockMethodCache = unlockMethodCache - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java index 9b8d09e7aee8..eb3f56a19c9e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java @@ -71,6 +71,8 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { private UnlockMethodCache mUnlockMethodCache; @Mock private Handler mHandler; + @Mock + private KeyguardBypassController mKeyguardBypassController; private BiometricUnlockController mBiometricUnlockController; @Before @@ -83,8 +85,9 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { mDependency.injectTestDependency(NotificationMediaManager.class, mMediaManager); mDependency.injectTestDependency(StatusBarWindowController.class, mStatusBarWindowController); - mBiometricUnlockController = new TestableBiometricUnlockController( - false /* faceDismissesKeyguard */); + mBiometricUnlockController = new BiometricUnlockController(mContext, mDozeScrimController, + mKeyguardViewMediator, mScrimController, mStatusBar, mUnlockMethodCache, + mHandler, mUpdateMonitor, 0 /* wakeUpDelay */, mKeyguardBypassController); mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); } @@ -139,9 +142,8 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { } @Test - public void onBiometricAuthenticated_whenFace_dismissingKeyguard() { - mBiometricUnlockController = new TestableBiometricUnlockController( - true /* faceDismissesKeyguard */); + public void onBiometricAuthenticated_whenFace_andBypass_dismissKeyguard() { + when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true); mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true); @@ -184,14 +186,4 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { mBiometricUnlockController.onFinishedGoingToSleep(-1); verify(mHandler).post(any()); } - - private class TestableBiometricUnlockController extends BiometricUnlockController { - - TestableBiometricUnlockController(boolean faceDismissesKeyguard) { - super(mContext, mDozeScrimController, - mKeyguardViewMediator, mScrimController, mStatusBar, mUnlockMethodCache, - mHandler, mUpdateMonitor, 0 /* wakeUpDelay */, - new KeyguardBypassController(faceDismissesKeyguard, mUnlockMethodCache)); - } - } } -- GitLab From 31292aad8afce9f01eb7c8900aaccde29df90e88 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Thu, 30 May 2019 19:35:05 -0700 Subject: [PATCH 070/620] Not rendering the dark icons with the shelf anymore Instead it is rendered by a dedicated container. This will help with a lot of the transitions that are necessary for the bypass and also fixes the coloring of the notification icons on the lockscreen. Fixes: 133869048 Bug: 130327302 Bug: 133182504 Test: atest SystemUITests Change-Id: I422b3da488fdac6577173d41b26c67f81c7826c5 (cherry picked from commit 195dfc5db60fc913d060a692dc4ee7b0b02ece68) --- .../layout/keyguard_status_view.xml | 9 +- packages/SystemUI/res/values/dimens.xml | 4 +- .../systemui/bubbles/BubbleExpandedView.java | 2 +- .../systemui/statusbar/NotificationShelf.java | 57 +----- .../systemui/statusbar/StatusBarIconView.java | 45 ++--- .../notification/NotificationDozeHelper.java | 7 +- .../NotificationWakeUpCoordinator.kt | 28 +-- .../collection/NotificationEntry.java | 17 +- .../row/ActivatableNotificationView.java | 18 +- .../row/ExpandableNotificationRow.java | 12 +- .../notification/row/ExpandableView.java | 14 +- .../row/NotificationContentView.java | 10 +- .../row/NotificationGutsManager.java | 2 +- .../notification/row/NotificationMenuRow.java | 2 +- .../notification/stack/AmbientState.java | 33 ++-- .../notification/stack/AnimationFilter.java | 10 +- .../stack/ExpandableViewState.java | 12 +- .../stack/NotificationChildrenContainer.java | 2 +- .../stack/NotificationStackScrollLayout.java | 177 ++++++------------ .../stack/StackScrollAlgorithm.java | 4 +- .../stack/StackStateAnimator.java | 2 +- .../phone/NotificationIconAreaController.java | 150 ++++++++++++--- .../phone/NotificationIconContainer.java | 27 +-- .../phone/NotificationPanelView.java | 20 +- .../NotificationsQuickSettingsContainer.java | 69 ++++--- .../systemui/statusbar/phone/StatusBar.java | 8 +- .../statusbar/phone/StatusBarWindowView.java | 1 - .../row/ExpandableNotificationRowTest.java | 6 +- .../row/NotificationContentViewTest.java | 4 +- .../NotificationStackScrollLayoutTest.java | 7 +- .../NotificationIconAreaControllerTest.java | 11 +- 31 files changed, 421 insertions(+), 349 deletions(-) diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml index 04d6afc1935f..a983b05620b4 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml @@ -25,14 +25,11 @@ android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" - androidprv:layout_maxWidth="@dimen/keyguard_security_width" - androidprv:layout_maxHeight="@dimen/keyguard_security_height" android:gravity="center_horizontal|top"> + diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index c5e4662f6d45..afe6d9c2552b 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -258,8 +258,8 @@ @*android:dimen/notification_header_icon_size_ambient - - 16dp + + 16dp 90% diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java index 09d4b0585541..7b58c5de4813 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java @@ -515,7 +515,7 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList viewState.gone = false; viewState.hidden = false; viewState.dimmed = false; - viewState.dark = false; + viewState.dozing = false; viewState.alpha = 1f; viewState.notGoneIndex = -1; viewState.xTranslation = 0; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 1779b325359e..9ffb78c10939 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -63,15 +63,12 @@ public class NotificationShelf extends ActivatableNotificationView implements = SystemProperties.getBoolean("debug.icon_scroll_animations", true); private static final int TAG_CONTINUOUS_CLIPPING = R.id.continuous_clipping_tag; private static final String TAG = "NotificationShelf"; - private static final long SHELF_IN_TRANSLATION_DURATION = 200; private NotificationIconContainer mShelfIcons; private int[] mTmp = new int[2]; private boolean mHideBackground; private int mIconAppearTopPadding; - private int mShelfAppearTranslation; - private float mDarkShelfPadding; - private float mDarkShelfIconSize; + private float mHiddenShelfIconSize; private int mStatusBarHeight; private int mStatusBarPaddingStart; private AmbientState mAmbientState; @@ -140,8 +137,6 @@ public class NotificationShelf extends ActivatableNotificationView implements mStatusBarHeight = res.getDimensionPixelOffset(R.dimen.status_bar_height); mStatusBarPaddingStart = res.getDimensionPixelOffset(R.dimen.status_bar_padding_start); mPaddingBetweenElements = res.getDimensionPixelSize(R.dimen.notification_divider_height); - mShelfAppearTranslation = res.getDimensionPixelSize(R.dimen.shelf_appear_translation); - mDarkShelfPadding = res.getDimensionPixelSize(R.dimen.widget_bottom_separator_padding); ViewGroup.LayoutParams layoutParams = getLayoutParams(); layoutParams.height = res.getDimensionPixelOffset(R.dimen.notification_shelf_height); @@ -152,7 +147,7 @@ public class NotificationShelf extends ActivatableNotificationView implements mScrollFastThreshold = res.getDimensionPixelOffset(R.dimen.scroll_fast_threshold); mShowNotificationShelf = res.getBoolean(R.bool.config_showNotificationShelf); mIconSize = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_icon_size); - mDarkShelfIconSize = res.getDimensionPixelOffset(R.dimen.dark_shelf_icon_size); + mHiddenShelfIconSize = res.getDimensionPixelOffset(R.dimen.hidden_shelf_icon_size); mGapHeight = res.getDimensionPixelSize(R.dimen.qs_notification_padding); if (!mShowNotificationShelf) { @@ -166,33 +161,6 @@ public class NotificationShelf extends ActivatableNotificationView implements initDimens(); } - @Override - public void setDark(boolean dark, boolean fade, long delay) { - if (mDark == dark) return; - super.setDark(dark, fade, delay); - mShelfIcons.setDark(dark, fade, delay); - updateInteractiveness(); - updateOutline(); - } - - /** - * Alpha animation with translation played when this view is visible on AOD. - */ - public void fadeInTranslating() { - mShelfIcons.setTranslationY(-mShelfAppearTranslation); - mShelfIcons.setAlpha(0); - mShelfIcons.animate() - .setInterpolator(Interpolators.DECELERATE_QUINT) - .translationY(0) - .setDuration(SHELF_IN_TRANSLATION_DURATION) - .start(); - mShelfIcons.animate() - .alpha(1) - .setInterpolator(Interpolators.LINEAR) - .setDuration(SHELF_IN_TRANSLATION_DURATION) - .start(); - } - @Override protected View getContentView() { return mShelfIcons; @@ -219,11 +187,8 @@ public class NotificationShelf extends ActivatableNotificationView implements viewState.copyFrom(lastViewState); viewState.height = getIntrinsicHeight(); - float awakenTranslation = Math.max(Math.min(viewEnd, maxShelfEnd) - viewState.height, + viewState.yTranslation = Math.max(Math.min(viewEnd, maxShelfEnd) - viewState.height, getFullyClosedTranslation()); - float yRatio = mAmbientState.hasPulsingNotifications() ? - 0 : mAmbientState.getDarkAmount(); - viewState.yTranslation = awakenTranslation + mDarkShelfPadding * yRatio; viewState.zTranslation = ambientState.getBaseZHeight(); // For the small display size, it's not enough to make the icon not covered by // the top cutout so the denominator add the height of cutout. @@ -452,7 +417,7 @@ public class NotificationShelf extends ActivatableNotificationView implements } StatusBarIconView icon = row.getEntry().expandedIcon; float shelfIconPosition = getTranslationY() + icon.getTop() + icon.getTranslationY(); - if (shelfIconPosition < maxTop && !mAmbientState.isFullyDark()) { + if (shelfIconPosition < maxTop && !mAmbientState.isFullyHidden()) { int top = (int) (maxTop - shelfIconPosition); Rect clipRect = new Rect(0, top, icon.getWidth(), Math.max(top, icon.getHeight())); icon.setClipBounds(clipRect); @@ -666,8 +631,8 @@ public class NotificationShelf extends ActivatableNotificationView implements iconState.translateContent = false; } float transitionAmount; - if (mAmbientState.isDarkAtAll() && !row.isInShelf()) { - transitionAmount = mAmbientState.isFullyDark() ? 1 : 0; + if (mAmbientState.isHiddenAtAll() && !row.isInShelf()) { + transitionAmount = mAmbientState.isFullyHidden() ? 1 : 0; } else if (isLastChild || !USE_ANIMATIONS_WHEN_OPENING || iconState.useFullTransitionAmount || iconState.useLinearTransitionAmount) { transitionAmount = iconTransitionAmount; @@ -717,7 +682,7 @@ public class NotificationShelf extends ActivatableNotificationView implements } notificationIconPosition += iconTopPadding; float shelfIconPosition = getTranslationY() + icon.getTop(); - float iconSize = mDark ? mDarkShelfIconSize : mIconSize; + float iconSize = mDozing ? mHiddenShelfIconSize : mIconSize; shelfIconPosition += (icon.getHeight() - icon.getIconScale() * iconSize) / 2.0f; float iconYTranslation = NotificationUtils.interpolate( notificationIconPosition - shelfIconPosition, @@ -794,12 +759,12 @@ public class NotificationShelf extends ActivatableNotificationView implements @Override protected boolean needsOutline() { - return !mHideBackground && !mDark && super.needsOutline(); + return !mHideBackground && super.needsOutline(); } @Override protected boolean shouldHideBackground() { - return super.shouldHideBackground() || mHideBackground || mDark; + return super.shouldHideBackground() || mHideBackground; } @Override @@ -910,8 +875,7 @@ public class NotificationShelf extends ActivatableNotificationView implements } private void updateInteractiveness() { - mInteractive = mStatusBarState == StatusBarState.KEYGUARD && mHasItemsInStableShelf - && !mDark; + mInteractive = mStatusBarState == StatusBarState.KEYGUARD && mHasItemsInStableShelf; setClickable(mInteractive); setFocusable(mInteractive); setImportantForAccessibility(mInteractive ? View.IMPORTANT_FOR_ACCESSIBILITY_YES @@ -929,7 +893,6 @@ public class NotificationShelf extends ActivatableNotificationView implements public void setAnimationsEnabled(boolean enabled) { mAnimationsEnabled = enabled; - mCollapsedIcons.setAnimationsEnabled(enabled); if (!enabled) { // we need to wait with enabling the animations until the first frame has passed mShelfIcons.setAnimationsEnabled(false); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index 6552fe671794..f4af9ae21b75 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -112,7 +112,7 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi }; private boolean mAlwaysScaleIcon; - private int mStatusBarIconDrawingSizeDark = 1; + private int mStatusBarIconDrawingSizeIncreased = 1; private int mStatusBarIconDrawingSize = 1; private int mStatusBarIconSize = 1; private StatusBarIcon mIcon; @@ -139,7 +139,7 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi private int mDrawableColor; private int mIconColor; private int mDecorColor; - private float mDarkAmount; + private float mDozeAmount; private ValueAnimator mColorAnimator; private int mCurrentSetColor = NO_COLOR; private int mAnimationStartColor = NO_COLOR; @@ -158,6 +158,7 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi private Runnable mLayoutRunnable; private boolean mDismissed; private Runnable mOnDismissListener; + private boolean mIncreasedSize; public StatusBarIconView(Context context, String slot, StatusBarNotification sbn) { this(context, slot, sbn, false); @@ -196,12 +197,10 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi } private void updateIconScaleForNotifications() { - final float imageBounds = NotificationUtils.interpolate( - mStatusBarIconDrawingSize, - mStatusBarIconDrawingSizeDark, - mDarkAmount); + final float imageBounds = mIncreasedSize ? + mStatusBarIconDrawingSizeIncreased : mStatusBarIconDrawingSize; final int outerBounds = mStatusBarIconSize; - mIconScale = (float)imageBounds / (float)outerBounds; + mIconScale = imageBounds / (float)outerBounds; updatePivot(); } @@ -225,8 +224,8 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi } } - public float getIconScaleFullyDark() { - return (float) mStatusBarIconDrawingSizeDark / mStatusBarIconDrawingSize; + public float getIconScaleIncreased() { + return (float) mStatusBarIconDrawingSizeIncreased / mStatusBarIconDrawingSize; } public float getIconScale() { @@ -256,7 +255,7 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi Resources res = getResources(); mStaticDotRadius = res.getDimensionPixelSize(R.dimen.overflow_dot_radius); mStatusBarIconSize = res.getDimensionPixelSize(R.dimen.status_bar_icon_size); - mStatusBarIconDrawingSizeDark = + mStatusBarIconDrawingSizeIncreased = res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size_dark); mStatusBarIconDrawingSize = res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size); @@ -584,7 +583,7 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi } private void updateDecorColor() { - int color = NotificationUtils.interpolateColors(mDecorColor, Color.WHITE, mDarkAmount); + int color = NotificationUtils.interpolateColors(mDecorColor, Color.WHITE, mDozeAmount); if (mDotPaint.getColor() != color) { mDotPaint.setColor(color); @@ -618,13 +617,13 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi mMatrixColorFilter = new ColorMatrixColorFilter(mMatrix); } int color = NotificationUtils.interpolateColors( - mCurrentSetColor, Color.WHITE, mDarkAmount); - updateTintMatrix(mMatrix, color, DARK_ALPHA_BOOST * mDarkAmount); + mCurrentSetColor, Color.WHITE, mDozeAmount); + updateTintMatrix(mMatrix, color, DARK_ALPHA_BOOST * mDozeAmount); mMatrixColorFilter.setColorMatrixArray(mMatrix); setColorFilter(null); // setColorFilter only invalidates if the instance changed. setColorFilter(mMatrixColorFilter); } else { - mDozer.updateGrayscale(this, mDarkAmount); + mDozer.updateGrayscale(this, mDozeAmount); } } @@ -855,19 +854,18 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi mOnVisibilityChangedListener = listener; } - public void setDark(boolean dark, boolean fade, long delay) { - mDozer.setIntensityDark(f -> { - mDarkAmount = f; - maybeUpdateIconScaleDimens(); + public void setDozing(boolean dozing, boolean fade, long delay) { + mDozer.setDozing(f -> { + mDozeAmount = f; updateDecorColor(); updateIconColor(); updateAllowAnimation(); - }, dark, fade, delay, this); + }, dozing, fade, delay, this); } private void updateAllowAnimation() { - if (mDarkAmount == 0 || mDarkAmount == 1) { - setAllowAnimation(mDarkAmount == 0); + if (mDozeAmount == 0 || mDozeAmount == 1) { + setAllowAnimation(mDozeAmount == 0); } } @@ -949,6 +947,11 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi return mBlocked; } + public void setIncreasedSize(boolean increasedSize) { + mIncreasedSize = increasedSize; + maybeUpdateIconScaleDimens(); + } + public interface OnVisibilityChangedListener { void onVisibilityChanged(int newVisibility); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java index ef042bab7625..63bb73ab7f13 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java @@ -79,10 +79,11 @@ public class NotificationDozeHelper { animator.start(); } - public void setIntensityDark(Consumer listener, boolean dark, + public void setDozing(Consumer listener, boolean dozing, boolean animate, long delay, View view) { if (animate) { - startIntensityAnimation(a -> listener.accept((Float) a.getAnimatedValue()), dark, delay, + startIntensityAnimation(a -> listener.accept((Float) a.getAnimatedValue()), dozing, + delay, new AnimatorListenerAdapter() { @Override @@ -100,7 +101,7 @@ public class NotificationDozeHelper { if (animator != null) { animator.cancel(); } - listener.accept(dark ? 1f : 0f); + listener.accept(dozing ? 1f : 0f); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt index 3613f9f3ea5f..0fa6842ca9b1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt @@ -28,6 +28,7 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll import com.android.systemui.statusbar.notification.stack.StackStateAnimator import com.android.systemui.statusbar.phone.DozeParameters import com.android.systemui.statusbar.phone.KeyguardBypassController +import com.android.systemui.statusbar.phone.NotificationIconAreaController import javax.inject.Inject import javax.inject.Singleton @@ -59,7 +60,7 @@ class NotificationWakeUpCoordinator @Inject constructor( private var mNotificationVisibleAmount = 0.0f private var mNotificationsVisible = false private var mNotificationsVisibleForExpansion = false - private var mDarkAnimator: ObjectAnimator? = null + private var mVisibilityAnimator: ObjectAnimator? = null private var mVisibilityAmount = 0.0f private var mLinearVisibilityAmount = 0.0f private var mWakingUp = false @@ -72,6 +73,8 @@ class NotificationWakeUpCoordinator @Inject constructor( } } + lateinit var iconAreaController : NotificationIconAreaController + var pulsing: Boolean = false set(value) { field = value @@ -129,7 +132,7 @@ class NotificationWakeUpCoordinator @Inject constructor( return } mNotificationsVisible = visible - mDarkAnimator?.cancel(); + mVisibilityAnimator?.cancel(); if (animate) { notifyAnimationStart(visible) startVisibilityAnimation(increaseSpeed) @@ -155,7 +158,7 @@ class NotificationWakeUpCoordinator @Inject constructor( mLinearDozeAmount = linear mDozeAmount = eased mStackScroller.setDozeAmount(mDozeAmount) - updateDarkAmount() + updateHideAmount() if (changed && linear == 0.0f) { setNotificationsVisible(visible = false, animate = false, increaseSpeed = false); setNotificationsVisibleForExpansion(visible = false, animate = false, @@ -188,15 +191,15 @@ class NotificationWakeUpCoordinator @Inject constructor( Interpolators.FAST_OUT_SLOW_IN_REVERSE } val target = if (mNotificationsVisible) 1.0f else 0.0f - val darkAnimator = ObjectAnimator.ofFloat(this, mNotificationVisibility, target) - darkAnimator.setInterpolator(Interpolators.LINEAR) + val visibilityAnimator = ObjectAnimator.ofFloat(this, mNotificationVisibility, target) + visibilityAnimator.setInterpolator(Interpolators.LINEAR) var duration = StackStateAnimator.ANIMATION_DURATION_WAKEUP.toLong() if (increaseSpeed) { duration = (duration.toFloat() / 1.5F).toLong(); } - darkAnimator.setDuration(duration) - darkAnimator.start() - mDarkAnimator = darkAnimator + visibilityAnimator.setDuration(duration) + visibilityAnimator.start() + mVisibilityAnimator = visibilityAnimator } private fun setVisibilityAmount(visibilityAmount: Float) { @@ -204,7 +207,7 @@ class NotificationWakeUpCoordinator @Inject constructor( mVisibilityAmount = mVisibilityInterpolator.getInterpolation( visibilityAmount) handleAnimationFinished(); - updateDarkAmount() + updateHideAmount() } private fun handleAnimationFinished() { @@ -218,14 +221,15 @@ class NotificationWakeUpCoordinator @Inject constructor( return mStackScroller.pulseHeight } - private fun updateDarkAmount() { + private fun updateHideAmount() { val linearAmount = Math.min(1.0f - mLinearVisibilityAmount, mLinearDozeAmount) val amount = Math.min(1.0f - mVisibilityAmount, mDozeAmount) - mStackScroller.setDarkAmount(linearAmount, amount) + mStackScroller.setHideAmount(linearAmount, amount) + iconAreaController.setFullyHidden(linearAmount == 1.0f); } private fun notifyAnimationStart(awake: Boolean) { - mStackScroller.notifyDarkAnimationStart(!awake) + mStackScroller.notifyHideAnimationStart(!awake) } override fun onDozingChanged(isDozing: Boolean) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index 92c261c4cad7..5371bd9e0d3a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -96,6 +96,7 @@ public final class NotificationEntry { public StatusBarIconView icon; public StatusBarIconView expandedIcon; public StatusBarIconView centeredIcon; + public StatusBarIconView aodIcon; private boolean interruption; public boolean autoRedacted; // whether the redacted notification was generated by us public int targetSdk; @@ -336,6 +337,12 @@ public final class NotificationEntry { sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId()), sbn); expandedIcon.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + // Construct the expanded icon. + aodIcon = new StatusBarIconView(context, + sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId()), sbn); + aodIcon.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + aodIcon.setIncreasedSize(true); + final StatusBarIcon ic = new StatusBarIcon( sbn.getUser(), sbn.getPackageName(), @@ -344,10 +351,11 @@ public final class NotificationEntry { n.number, StatusBarIconView.contentDescForNotification(context, n)); - if (!icon.set(ic) || !expandedIcon.set(ic)) { + if (!icon.set(ic) || !expandedIcon.set(ic) || !aodIcon.set(ic)) { icon = null; expandedIcon = null; centeredIcon = null; + aodIcon = null; throw new InflationException("Couldn't create icon: " + ic); } expandedIcon.setVisibility(View.INVISIBLE); @@ -380,6 +388,10 @@ public final class NotificationEntry { if (centeredIcon != null) { centeredIcon.setTag(key, tag); } + + if (aodIcon != null) { + aodIcon.setTag(key, tag); + } } /** @@ -403,7 +415,8 @@ public final class NotificationEntry { StatusBarIconView.contentDescForNotification(context, n)); icon.setNotification(sbn); expandedIcon.setNotification(sbn); - if (!icon.set(ic) || !expandedIcon.set(ic)) { + aodIcon.setNotification(sbn); + if (!icon.set(ic) || !expandedIcon.set(ic) || !aodIcon.set(ic)) { throw new InflationException("Couldn't update icon: " + ic); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java index 94face2581b3..11321cffd25b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java @@ -52,7 +52,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView private static final int BACKGROUND_ANIMATION_LENGTH_MS = 220; private static final int ACTIVATE_ANIMATION_LENGTH = 220; - private static final long DARK_ANIMATION_LENGTH = StackStateAnimator.ANIMATION_DURATION_WAKEUP; /** * The amount of width, which is kept in the end when performing a disappear animation (also @@ -84,11 +83,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView */ private static final float VERTICAL_ANIMATION_START = 1.0f; - /** - * Scale for the background to animate from when exiting dark mode. - */ - private static final float DARK_EXIT_SCALE_START = 0.93f; - /** * A sentinel value when no color should be used. Can be used with {@link #setTintColor(int)} * or {@link #setOverrideTintColor(int, float)}. @@ -105,7 +99,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView private final DoubleTapHelper mDoubleTapHelper; private boolean mDimmed; - protected boolean mDark; + protected boolean mDozing; protected int mBgTint = NO_COLOR; private float mBgAlpha = 1f; @@ -440,12 +434,12 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView return true; } - public void setDark(boolean dark, boolean fade, long delay) { - super.setDark(dark, fade, delay); - if (mDark == dark) { + public void setDozing(boolean dozing, boolean fade, long delay) { + super.setDozing(dozing, fade, delay); + if (mDozing == dozing) { return; } - mDark = dark; + mDozing = dozing; updateBackground(); updateBackgroundTint(false); } @@ -542,7 +536,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView * used and the background color not at all. */ public void setOverrideTintColor(int color, float overrideAmount) { - if (mDark) { + if (mDozing) { color = NO_COLOR; overrideAmount = 0; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index d625b318487d..a27c15b80276 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -2051,18 +2051,18 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } @Override - public void setDark(boolean dark, boolean fade, long delay) { - if (mDark == dark) { + public void setDozing(boolean dozing, boolean fade, long delay) { + if (mDozing == dozing) { return; } - super.setDark(dark, fade, delay); + super.setDozing(dozing, fade, delay); if (!mIsAmbientPulsing) { // Only fade the showing view of the pulsing notification. fade = false; } final NotificationContentView showing = getShowingLayout(); if (showing != null) { - showing.setDark(dark, fade, delay); + showing.setDozing(dozing, fade, delay); } updateShelfIconColor(); } @@ -2180,7 +2180,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView */ @Override public boolean isSoundEffectsEnabled() { - final boolean mute = mDark && mSecureStateProvider != null && + final boolean mute = mDozing && mSecureStateProvider != null && !mSecureStateProvider.getAsBoolean(); return !mute && super.isSoundEffectsEnabled(); } @@ -2563,7 +2563,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView showingLayout.updateBackgroundColor(animated); mPrivateLayout.updateExpandButtons(isExpandable()); updateShelfIconColor(); - showingLayout.setDark(isDark(), false /* animate */, 0 /* delay */); + showingLayout.setDozing(isDozing(), false /* animate */, 0 /* delay */); mShowingPublicInitialized = true; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java index cac41da52120..30b53383bb74 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java @@ -49,7 +49,7 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable { protected int mClipBottomAmount; protected int mMinimumHeightForClipping = 0; protected float mExtraWidthForClipping = 0; - private boolean mDark; + private boolean mDozing; private ArrayList mMatchParentViews = new ArrayList(); private static Rect mClipRect = new Rect(); private boolean mWillBeGone; @@ -213,18 +213,18 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable { } /** - * Sets the notification as dark. The default implementation does nothing. + * Sets the notification as dozing. The default implementation does nothing. * - * @param dark Whether the notification should be dark. + * @param dozing Whether the notification should be dozing. * @param fade Whether an animation should be played to change the state. * @param delay If fading, the delay of the animation. */ - public void setDark(boolean dark, boolean fade, long delay) { - mDark = dark; + public void setDozing(boolean dozing, boolean fade, long delay) { + mDozing = dozing; } - public boolean isDark() { - return mDark; + public boolean isDozing() { + return mDozing; } public boolean isRemoved() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index 354ed2d00d32..ef11c7aacc3a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -103,7 +103,7 @@ public class NotificationContentView extends FrameLayout { private int mClipTopAmount; private int mContentHeight; private int mVisibleType = VISIBLE_TYPE_CONTRACTED; - private boolean mDark; + private boolean mDozing; private boolean mAnimate; private boolean mIsHeadsUp; private boolean mLegacy; @@ -1130,12 +1130,12 @@ public class NotificationContentView extends FrameLayout { return mIsContentExpandable; } - public void setDark(boolean dark, boolean fade, long delay) { + public void setDozing(boolean dozing, boolean fade, long delay) { if (mContractedChild == null) { return; } - mDark = dark; - selectLayout(!dark && fade /* animate */, false /* force */); + mDozing = dozing; + selectLayout(!dozing && fade /* animate */, false /* force */); } public void setHeadsUp(boolean headsUp) { @@ -1208,7 +1208,7 @@ public class NotificationContentView extends FrameLayout { applyMediaTransfer(entry); updateLegacy(); mForceSelectNextLayout = true; - setDark(mDark, false /* animate */, 0 /* delay */); + setDozing(mDozing, false /* animate */, 0 /* delay */); mPreviousExpandedRemoteInputIntent = null; mPreviousHeadsUpRemoteInputIntent = null; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java index fe890fb3b471..caad0f5be7a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java @@ -386,7 +386,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx } final ExpandableNotificationRow row = (ExpandableNotificationRow) view; - if (row.isDark()) { + if (row.isDozing()) { return false; } view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java index d911e1a05029..7bde92f1427f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java @@ -346,7 +346,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl if (mShouldShowMenu && !NotificationStackScrollLayout.isPinnedHeadsUp(getParent()) && !mParent.areGutsExposed() - && !mParent.isDark() + && !mParent.isDozing() && !mParent.showingAmbientPulsing() && (mCheckForDrag == null || !mHandler.hasCallbacks(mCheckForDrag))) { // Only show the menu if we're not a heads up view and guts aren't exposed. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java index d9162c0d6071..d8bda6cbbf83 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java @@ -79,7 +79,7 @@ public class AmbientState { private int mIntrinsicPadding; private int mExpandAnimationTopChange; private ExpandableNotificationRow mExpandingNotification; - private float mDarkAmount; + private float mHideAmount; private boolean mAppearing; private float mPulseHeight = MAX_PULSE_HEIGHT; private float mDozeAmount = 0.0f; @@ -180,23 +180,23 @@ public class AmbientState { mDimmed = dimmed; } - /** In dark mode, we draw as little as possible, assuming a black background */ + /** While dozing, we draw as little as possible, assuming a black background */ public void setDozing(boolean dozing) { mDozing = dozing; } - /** Dark ratio of the status bar **/ - public void setDarkAmount(float darkAmount) { - if (darkAmount == 1.0f && mDarkAmount != darkAmount) { - // Whenever we are fully dark, let's reset the pulseHeight again + /** Hide ratio of the status bar **/ + public void setHideAmount(float hidemount) { + if (hidemount == 1.0f && mHideAmount != hidemount) { + // Whenever we are fully hidden, let's reset the pulseHeight again mPulseHeight = MAX_PULSE_HEIGHT; } - mDarkAmount = darkAmount; + mHideAmount = hidemount; } - /** Returns the dark ratio of the status bar */ - public float getDarkAmount() { - return mDarkAmount; + /** Returns the hide ratio of the status bar */ + public float getHideAmount() { + return mHideAmount; } public void setHideSensitive(boolean hideSensitive) { @@ -295,7 +295,7 @@ public class AmbientState { } public boolean isPulseExpanding() { - return mPulseHeight != MAX_PULSE_HEIGHT && mDozeAmount != 0.0f && mDarkAmount != 1.0f; + return mPulseHeight != MAX_PULSE_HEIGHT && mDozeAmount != 0.0f && mHideAmount != 1.0f; } public boolean isShadeExpanded() { @@ -481,14 +481,15 @@ public class AmbientState { } /** - * @return {@code true } when shade is completely dark: in AOD or ambient display. + * @return {@code true } when shade is completely hidden: in AOD, ambient display or when + * bypassing. */ - public boolean isFullyDark() { - return mDarkAmount == 1; + public boolean isFullyHidden() { + return mHideAmount == 1; } - public boolean isDarkAtAll() { - return mDarkAmount != 0; + public boolean isHiddenAtAll() { + return mHideAmount != 0; } public void setAppearing(boolean appearing) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java index a471d8784c54..bc9e71a72b72 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java @@ -36,7 +36,7 @@ public class AnimationFilter { boolean animateHeight; boolean animateTopInset; boolean animateDimmed; - boolean animateDark; + boolean animateDozing; boolean animateHideSensitive; boolean hasDelays; boolean hasGoToFullShadeEvent; @@ -89,8 +89,8 @@ public class AnimationFilter { return this; } - public AnimationFilter animateDark() { - animateDark = true; + public AnimationFilter animateDozing() { + animateDozing = true; return this; } @@ -145,7 +145,7 @@ public class AnimationFilter { animateHeight |= filter.animateHeight; animateTopInset |= filter.animateTopInset; animateDimmed |= filter.animateDimmed; - animateDark |= filter.animateDark; + animateDozing |= filter.animateDozing; animateHideSensitive |= filter.animateHideSensitive; hasDelays |= filter.hasDelays; mAnimatedProperties.addAll(filter.mAnimatedProperties); @@ -160,7 +160,7 @@ public class AnimationFilter { animateHeight = false; animateTopInset = false; animateDimmed = false; - animateDark = false; + animateDozing = false; animateHideSensitive = false; hasDelays = false; hasGoToFullShadeEvent = false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java index f28e556229ce..af26c7c23222 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java @@ -85,7 +85,7 @@ public class ExpandableViewState extends ViewState { public int height; public boolean dimmed; - public boolean dark; + public boolean dozing; public boolean hideSensitive; public boolean belowSpeedBump; public boolean inShelf; @@ -121,7 +121,7 @@ public class ExpandableViewState extends ViewState { ExpandableViewState svs = (ExpandableViewState) viewState; height = svs.height; dimmed = svs.dimmed; - dark = svs.dark; + dozing = svs.dozing; hideSensitive = svs.hideSensitive; belowSpeedBump = svs.belowSpeedBump; clipTopAmount = svs.clipTopAmount; @@ -158,8 +158,8 @@ public class ExpandableViewState extends ViewState { // apply below shelf speed bump expandableView.setBelowSpeedBump(this.belowSpeedBump); - // apply dark - expandableView.setDark(this.dark, false /* animate */, 0 /* delay */); + // apply dozing + expandableView.setDozing(this.dozing, false /* animate */, 0 /* delay */); // apply clipping float oldClipTopAmount = expandableView.getClipTopAmount(); @@ -209,8 +209,8 @@ public class ExpandableViewState extends ViewState { expandableView.setHideSensitive(this.hideSensitive, animationFilter.animateHideSensitive, properties.delay, properties.duration); - // start dark animation - expandableView.setDark(this.dark, animationFilter.animateDark, properties.delay); + // start dozing animation + expandableView.setDozing(this.dozing, animationFilter.animateDozing, properties.delay); if (properties.wasAdded(child) && !hidden) { expandableView.performAddAnimation(properties.delay, properties.duration, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java index 6632ae63d944..5425c8e613a2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java @@ -567,7 +567,7 @@ public class NotificationChildrenContainer extends ViewGroup { ? parentState.zTranslation : 0; childState.dimmed = parentState.dimmed; - childState.dark = parentState.dark; + childState.dozing = parentState.dozing; childState.hideSensitive = parentState.hideSensitive; childState.belowSpeedBump = parentState.belowSpeedBump; childState.clipTopAmount = 0; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index aae4cafe1f5b..1f0e545ecb0f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -126,7 +126,6 @@ import com.android.systemui.statusbar.notification.row.NotificationGuts; import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.row.NotificationSnooze; import com.android.systemui.statusbar.notification.row.StackScrollerDecorView; -import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.HeadsUpAppearanceController; import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; import com.android.systemui.statusbar.phone.HeadsUpTouchHelper; @@ -267,8 +266,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private boolean mTopPaddingNeedsAnimation; private boolean mDimmedNeedsAnimation; private boolean mHideSensitiveNeedsAnimation; - private boolean mDarkNeedsAnimation; - private int mDarkAnimationOriginIndex; + private boolean mDozingNeedsAnimation; private boolean mActivateNeedsAnimation; private boolean mGoToFullShadeNeedsAnimation; private boolean mIsExpanded = true; @@ -409,9 +407,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private final ViewOutlineProvider mOutlineProvider = new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { - if (mAmbientState.isDarkAtAll()) { - float xProgress = mDarkXInterpolator.getInterpolation( - (1 - mLinearDarkAmount) * mBackgroundXFactor); + if (mAmbientState.isHiddenAtAll()) { + float xProgress = mHideXInterpolator.getInterpolation( + (1 - mLinearHideAmount) * mBackgroundXFactor); outline.setRoundRect(mBackgroundAnimationRect, MathUtils.lerp(mCornerRadius / 2.0f, mCornerRadius, xProgress)); @@ -427,14 +425,14 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private View mForcedScroll; /** - * @see #setDarkAmount(float, float) + * @see #setHideAmount(float, float) */ - private float mInterpolatedDarkAmount = 0f; + private float mInterpolatedHideAmount = 0f; /** - * @see #setDarkAmount(float, float) + * @see #setHideAmount(float, float) */ - private float mLinearDarkAmount = 0f; + private float mLinearHideAmount = 0f; /** * How fast the background scales in the X direction as a factor of the Y expansion. @@ -495,16 +493,13 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd Dependency.get(VisualStabilityManager.class); protected boolean mClearAllEnabled; - private Interpolator mDarkXInterpolator = Interpolators.FAST_OUT_SLOW_IN; + private Interpolator mHideXInterpolator = Interpolators.FAST_OUT_SLOW_IN; private NotificationPanelView mNotificationPanel; private final ShadeController mShadeController = Dependency.get(ShadeController.class); private final NotificationGutsManager mNotificationGutsManager = Dependency.get(NotificationGutsManager.class); private final NotificationSectionsManager mSectionsManager; - /** - * If the {@link NotificationShelf} should be visible when dark. - */ private boolean mAnimateBottomOnLayout; @Inject @@ -571,7 +566,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd blockingHelperManager.setNotificationShadeExpanded(height); }); - updateWillNotDraw(); + boolean willDraw = mShouldDrawNotificationBackground || DEBUG; + setWillNotDraw(!willDraw); mBackgroundPaint.setAntiAlias(true); if (DEBUG) { mDebugPaint = new Paint(); @@ -814,17 +810,17 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd int lockScreenRight = getWidth() - mSidePaddings; int lockScreenTop = mSections[0].getCurrentBounds().top; int lockScreenBottom = mSections[NUM_SECTIONS - 1].getCurrentBounds().bottom; - int darkLeft = getWidth() / 2; - int darkTop = mTopPadding; + int hiddenLeft = getWidth() / 2; + int hiddenTop = mTopPadding; - float yProgress = 1 - mInterpolatedDarkAmount; - float xProgress = mDarkXInterpolator.getInterpolation( - (1 - mLinearDarkAmount) * mBackgroundXFactor); + float yProgress = 1 - mInterpolatedHideAmount; + float xProgress = mHideXInterpolator.getInterpolation( + (1 - mLinearHideAmount) * mBackgroundXFactor); - int left = (int) MathUtils.lerp(darkLeft, lockScreenLeft, xProgress); - int right = (int) MathUtils.lerp(darkLeft, lockScreenRight, xProgress); - int top = (int) MathUtils.lerp(darkTop, lockScreenTop, yProgress); - int bottom = (int) MathUtils.lerp(darkTop, lockScreenBottom, yProgress); + int left = (int) MathUtils.lerp(hiddenLeft, lockScreenLeft, xProgress); + int right = (int) MathUtils.lerp(hiddenLeft, lockScreenRight, xProgress); + int top = (int) MathUtils.lerp(hiddenTop, lockScreenTop, yProgress); + int bottom = (int) MathUtils.lerp(hiddenTop, lockScreenBottom, yProgress); mBackgroundAnimationRect.set( left, top, @@ -940,7 +936,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd // Interpolate between semi-transparent notification panel background color // and white AOD separator. float colorInterpolation = MathUtils.smoothStep(0.4f /* start */, 1f /* end */, - mLinearDarkAmount); + mLinearHideAmount); int color = ColorUtils.blendARGB(mBgColor, Color.WHITE, colorInterpolation); if (mCachedBackgroundColor != color) { @@ -1361,11 +1357,12 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd mIsClipped = clipped; } - if (!mAmbientPulseManager.hasNotifications() && mAmbientState.isFullyDark()) { - setClipBounds(null); - } else if (mAmbientState.isDarkAtAll()) { + if (mAmbientState.isHiddenAtAll()) { clipToOutline = true; invalidateOutline(); + if (isFullyHidden()) { + setClipBounds(null); + } } else if (clipped) { setClipBounds(mRequestedClipBounds); } else { @@ -2434,7 +2431,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) private void updateBackground() { // No need to update the background color if it's not being drawn. - if (!mShouldDrawNotificationBackground || mAmbientState.isFullyDark()) { + if (!mShouldDrawNotificationBackground) { return; } @@ -3356,7 +3353,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd generateActivateEvent(); generateDimmedEvent(); generateHideSensitiveEvent(); - generateDarkEvent(); + generateDozingEvent(); generateGoToFullShadeEvent(); generateViewResizeEvent(); generateGroupExpansionEvent(); @@ -3571,17 +3568,16 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) - private void generateDarkEvent() { - if (mDarkNeedsAnimation) { + private void generateDozingEvent() { + if (mDozingNeedsAnimation) { AnimationEvent ev = new AnimationEvent(null, - AnimationEvent.ANIMATION_TYPE_DARK, + AnimationEvent.ANIMATION_TYPE_DOZING, new AnimationFilter() - .animateDark() + .animateDozing() .animateY(mShelf)); - ev.darkAnimationOriginIndex = mDarkAnimationOriginIndex; mAnimationEvents.add(ev); } - mDarkNeedsAnimation = false; + mDozingNeedsAnimation = false; } @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) @@ -4711,18 +4707,16 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } mAmbientState.setDozing(dozing); if (animate && mAnimationsEnabled) { - mDarkNeedsAnimation = true; - mDarkAnimationOriginIndex = findDarkAnimationOriginIndex(touchWakeUpScreenLocation); + mDozingNeedsAnimation = true; mNeedsAnimation = true; } requestChildrenUpdate(); - updateWillNotDraw(); notifyHeightChangeListener(mShelf); } @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) private void updatePanelTranslation() { - setTranslationX(mHorizontalPanelTranslation + mAntiBurnInOffsetX * mInterpolatedDarkAmount); + setTranslationX(mHorizontalPanelTranslation + mAntiBurnInOffsetX * mInterpolatedHideAmount); } @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) @@ -4732,49 +4726,30 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } /** - * Updates whether or not this Layout will perform its own custom drawing (i.e. whether or - * not {@link #onDraw(Canvas)} is called). This method should be called whenever the - * {@link #mAmbientState}'s dark mode is toggled. - */ - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - private void updateWillNotDraw() { - boolean willDraw = mShouldDrawNotificationBackground || DEBUG; - setWillNotDraw(!willDraw); - } - - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - private void setDarkAmount(float darkAmount) { - setDarkAmount(darkAmount, darkAmount); - } - - /** - * Sets the current dark amount. + * Sets the current hide amount. * - * @param linearDarkAmount The dark amount that follows linear interpoloation in the + * @param linearHideAmount The hide amount that follows linear interpoloation in the * animation, * i.e. animates from 0 to 1 or vice-versa in a linear manner. - * @param interpolatedDarkAmount The dark amount that follows the actual interpolation of the + * @param interpolatedHideAmount The hide amount that follows the actual interpolation of the * animation curve. */ @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public void setDarkAmount(float linearDarkAmount, float interpolatedDarkAmount) { - mLinearDarkAmount = linearDarkAmount; - mInterpolatedDarkAmount = interpolatedDarkAmount; - boolean wasFullyDark = mAmbientState.isFullyDark(); - boolean wasDarkAtAll = mAmbientState.isDarkAtAll(); - mAmbientState.setDarkAmount(interpolatedDarkAmount); - boolean nowFullyDark = mAmbientState.isFullyDark(); - boolean nowDarkAtAll = mAmbientState.isDarkAtAll(); - if (nowFullyDark != wasFullyDark) { - updateContentHeight(); - if (nowFullyDark) { - updateDarkShelfVisibility(); - } - } - if (!wasDarkAtAll && nowDarkAtAll) { + public void setHideAmount(float linearHideAmount, float interpolatedHideAmount) { + mLinearHideAmount = linearHideAmount; + mInterpolatedHideAmount = interpolatedHideAmount; + boolean wasFullyHidden = mAmbientState.isFullyHidden(); + boolean wasHiddenAtAll = mAmbientState.isHiddenAtAll(); + mAmbientState.setHideAmount(interpolatedHideAmount); + boolean nowFullyHidden = mAmbientState.isFullyHidden(); + boolean nowHiddenAtAll = mAmbientState.isHiddenAtAll(); + if (nowFullyHidden != wasFullyHidden) { + setVisibility(mAmbientState.isFullyHidden() ? View.INVISIBLE : View.VISIBLE); + } + if (!wasHiddenAtAll && nowHiddenAtAll) { resetExposedMenuView(true /* animate */, true /* animate */); } - if (nowFullyDark != wasFullyDark || wasDarkAtAll != nowDarkAtAll) { + if (nowFullyHidden != wasFullyHidden || wasHiddenAtAll != nowHiddenAtAll) { invalidateOutline(); } updateAlgorithmHeightAndPadding(); @@ -4783,42 +4758,18 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd requestChildrenUpdate(); } - private void updateDarkShelfVisibility() { - DozeParameters dozeParameters = DozeParameters.getInstance(mContext); - if (dozeParameters.shouldControlScreenOff()) { - mShelf.fadeInTranslating(); - } - updateClipping(); - } - @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) - public void notifyDarkAnimationStart(boolean dark) { - // We only swap the scaling factor if we're fully dark or fully awake to avoid + public void notifyHideAnimationStart(boolean hide) { + // We only swap the scaling factor if we're fully hidden or fully awake to avoid // interpolation issues when playing with the power button. - if (mInterpolatedDarkAmount == 0 || mInterpolatedDarkAmount == 1) { - mBackgroundXFactor = dark ? 1.8f : 1.5f; - mDarkXInterpolator = dark + if (mInterpolatedHideAmount == 0 || mInterpolatedHideAmount == 1) { + mBackgroundXFactor = hide ? 1.8f : 1.5f; + mHideXInterpolator = hide ? Interpolators.FAST_OUT_SLOW_IN_REVERSE : Interpolators.FAST_OUT_SLOW_IN; } } - @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) - private int findDarkAnimationOriginIndex(@Nullable PointF screenLocation) { - if (screenLocation == null || screenLocation.y < mTopPadding) { - return AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_ABOVE; - } - if (screenLocation.y > getBottomMostNotificationBottom()) { - return AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_BELOW; - } - View child = getClosestChildAtRawPosition(screenLocation.x, screenLocation.y); - if (child != null) { - return getNotGoneIndex(child); - } else { - return AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_ABOVE; - } - } - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) private int getNotGoneIndex(View child) { int count = getChildCount(); @@ -5416,8 +5367,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public boolean isFullyDark() { - return mAmbientState.isFullyDark(); + public boolean isFullyHidden() { + return mAmbientState.isFullyHidden(); } /** @@ -5661,7 +5612,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } /** - * Set the amount how much we're dozing. This is different from how dark the shade is, when + * Set the amount how much we're dozing. This is different from how hidden the shade is, when * the notification is pulsing. */ public void setDozeAmount(float dozeAmount) { @@ -5880,7 +5831,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd .animateY() .animateZ(), - // ANIMATION_TYPE_DARK + // ANIMATION_TYPE_DOZING null, // Unused // ANIMATION_TYPE_GO_TO_FULL_SHADE @@ -5944,7 +5895,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd // ANIMATION_TYPE_EVERYTHING new AnimationFilter() .animateAlpha() - .animateDark() + .animateDozing() .animateDimmed() .animateHideSensitive() .animateHeight() @@ -5976,7 +5927,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd // ANIMATION_TYPE_CHANGE_POSITION StackStateAnimator.ANIMATION_DURATION_STANDARD, - // ANIMATION_TYPE_DARK + // ANIMATION_TYPE_DOZING StackStateAnimator.ANIMATION_DURATION_WAKEUP, // ANIMATION_TYPE_GO_TO_FULL_SHADE @@ -6014,7 +5965,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd static final int ANIMATION_TYPE_ACTIVATED_CHILD = 4; static final int ANIMATION_TYPE_DIMMED = 5; static final int ANIMATION_TYPE_CHANGE_POSITION = 6; - static final int ANIMATION_TYPE_DARK = 7; + static final int ANIMATION_TYPE_DOZING = 7; static final int ANIMATION_TYPE_GO_TO_FULL_SHADE = 8; static final int ANIMATION_TYPE_HIDE_SENSITIVE = 9; static final int ANIMATION_TYPE_VIEW_RESIZE = 10; @@ -6025,16 +5976,12 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd static final int ANIMATION_TYPE_HEADS_UP_OTHER = 15; static final int ANIMATION_TYPE_EVERYTHING = 16; - static final int DARK_ANIMATION_ORIGIN_INDEX_ABOVE = -1; - static final int DARK_ANIMATION_ORIGIN_INDEX_BELOW = -2; - final long eventStartTime; final ExpandableView mChangingView; final int animationType; final AnimationFilter filter; final long length; View viewAfterChangingView; - int darkAnimationOriginIndex; boolean headsUpFromBottom; AnimationEvent(ExpandableView view, int type) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index 2980ee4ac45e..ccee2a1d9b9f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -213,7 +213,7 @@ public class StackScrollAlgorithm { private void updateDimmedActivatedHideSensitive(AmbientState ambientState, StackScrollAlgorithmState algorithmState) { boolean dimmed = ambientState.isDimmed(); - boolean dark = ambientState.isFullyDark(); + boolean hidden = ambientState.isFullyHidden(); boolean hideSensitive = ambientState.isHideSensitive(); View activatedChild = ambientState.getActivatedChild(); int childCount = algorithmState.visibleChildren.size(); @@ -221,7 +221,7 @@ public class StackScrollAlgorithm { ExpandableView child = algorithmState.visibleChildren.get(i); ExpandableViewState childViewState = child.getViewState(); childViewState.dimmed = dimmed; - childViewState.dark = dark; + childViewState.dozing = hidden; childViewState.hideSensitive = hideSensitive; boolean isActivatedChild = activatedChild == child; if (dimmed && isActivatedChild) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java index 7332b034b9bf..ea1ceec4e3b3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java @@ -172,7 +172,7 @@ public class StackStateAnimator { || viewState.alpha != child.getAlpha() || viewState.height != child.getActualHeight() || viewState.clipTopAmount != child.getClipTopAmount() - || viewState.dark != child.isDark())) { + || viewState.dozing != child.isDozing())) { mAnimationProperties.delay = mCurrentAdditionalDelay + calculateChildAnimationDelay(viewState); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index e8ca3eef24de..177b72a01f85 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -15,7 +15,9 @@ import androidx.collection.ArrayMap; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.statusbar.StatusBarIcon; import com.android.internal.util.ContrastColorUtil; +import com.android.settingslib.Utils; import com.android.systemui.Dependency; +import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; @@ -24,6 +26,7 @@ import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.StatusBarIconView; +import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -41,12 +44,14 @@ public class NotificationIconAreaController implements DarkReceiver, StatusBarStateController.StateListener { public static final String LOW_PRIORITY = "low_priority"; + private static final long AOD_ICONS_APPEAR_DURATION = 200; private final ContrastColorUtil mContrastColorUtil; private final NotificationEntryManager mEntryManager; private final Runnable mUpdateStatusBarIcons = this::updateStatusBarIcons; private final StatusBarStateController mStatusBarStateController; private final NotificationMediaManager mMediaManager; + private final DozeParameters mDozeParameters; @VisibleForTesting final NotificationListener.NotificationSettingsListener mSettingsListener = new NotificationListener.NotificationSettingsListener() { @@ -72,17 +77,17 @@ public class NotificationIconAreaController implements DarkReceiver, private NotificationIconContainer mShelfIcons; protected View mCenteredIconArea; private NotificationIconContainer mCenteredIcon; + private NotificationIconContainer mAodIcons; private StatusBarIconView mCenteredIconView; private final Rect mTintArea = new Rect(); private ViewGroup mNotificationScrollLayout; private Context mContext; - private boolean mFullyDark; private boolean mShowLowPriority = true; + private int mAodIconAppearTranslation; - /** - * Ratio representing being awake or in ambient mode, where 1 is dark and 0 awake. - */ - private float mDarkAmount; + private boolean mAnimationsEnabled; + private int mAodIconTint; + private boolean mFullyHidden; public NotificationIconAreaController(Context context, StatusBar statusBar, StatusBarStateController statusBarStateController, @@ -96,8 +101,10 @@ public class NotificationIconAreaController implements DarkReceiver, mStatusBarStateController.addCallback(this); mMediaManager = notificationMediaManager; notificationListener.addNotificationSettingsListener(mSettingsListener); + mDozeParameters = DozeParameters.getInstance(mContext); initializeNotificationAreaViews(context); + reloadAodColor(); } protected View inflateIconArea(LayoutInflater inflater) { @@ -118,6 +125,24 @@ public class NotificationIconAreaController implements DarkReceiver, mCenteredIconArea = layoutInflater.inflate(R.layout.center_icon_area, null); mCenteredIcon = mCenteredIconArea.findViewById(R.id.centeredIcon); + + initAodIcons(); + } + + public void initAodIcons() { + boolean changed = mAodIcons != null; + if (changed) { + mAodIcons.setAnimationsEnabled(false); + mAodIcons.removeAllViews(); + } + mAodIcons = mStatusBar.getStatusBarWindow().findViewById( + R.id.clock_notification_icon_container); + mAodIcons.setOnLockScreen(true); + updateAodIconsVisibility(); + updateAnimations(); + if (changed) { + updateAodIcons(); + } } public void setupShelf(NotificationShelf shelf) { @@ -140,6 +165,10 @@ public class NotificationIconAreaController implements DarkReceiver, View child = mCenteredIcon.getChildAt(i); child.setLayoutParams(params); } + for (int i = 0; i < mAodIcons.getChildCount(); i++) { + View child = mAodIcons.getChildAt(i); + child.setLayoutParams(params); + } } @NonNull @@ -152,6 +181,8 @@ public class NotificationIconAreaController implements DarkReceiver, Resources res = context.getResources(); mIconSize = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_icon_size); mIconHPadding = res.getDimensionPixelSize(R.dimen.status_bar_icon_padding); + mAodIconAppearTranslation = res.getDimensionPixelSize( + R.dimen.shelf_appear_translation); } /** @@ -236,7 +267,7 @@ public class NotificationIconAreaController implements DarkReceiver, return false; } // showAmbient == show in shade but not shelf - if ((!showAmbient || mFullyDark) && entry.shouldSuppressStatusBar()) { + if (!showAmbient && entry.shouldSuppressStatusBar()) { return false; } return true; @@ -249,6 +280,7 @@ public class NotificationIconAreaController implements DarkReceiver, updateStatusBarIcons(); updateShelfIcons(); updateCenterIcon(); + updateAodIcons(); applyNotificationIconsTint(); } @@ -256,10 +288,10 @@ public class NotificationIconAreaController implements DarkReceiver, private void updateShelfIcons() { updateIconsForLayout(entry -> entry.expandedIcon, mShelfIcons, true /* showAmbient */, - !mFullyDark /* showLowPriority */, + true /* showLowPriority */, false /* hideDismissed */, - mFullyDark /* hideRepliedMessages */, - mFullyDark /* hideCurrentMedia */, + false /* hideRepliedMessages */, + false /* hideCurrentMedia */, true /* hide centered icon */); } @@ -276,13 +308,23 @@ public class NotificationIconAreaController implements DarkReceiver, private void updateCenterIcon() { updateIconsForLayout(entry -> entry.centeredIcon, mCenteredIcon, false /* showAmbient */, - !mFullyDark /* showLowPriority */, + true /* showLowPriority */, false /* hideDismissed */, false /* hideRepliedMessages */, - mFullyDark /* hideCurrentMedia */, + false /* hideCurrentMedia */, false /* hide centered icon */); } + public void updateAodIcons() { + updateIconsForLayout(entry -> entry.aodIcon, mAodIcons, + false /* showAmbient */, + mShowLowPriority /* showLowPriority */, + true /* hideDismissed */, + true /* hideRepliedMessages */, + true /* hideCurrentMedia */, + true /* hide centered icon */); + } + @VisibleForTesting boolean shouldShouldLowPriorityIcons() { return mShowLowPriority; @@ -424,6 +466,8 @@ public class NotificationIconAreaController implements DarkReceiver, iv.executeOnLayout(() -> updateTintForIcon(iv, mCenteredIconTint)); } } + + updateAodIconColors(); } private void updateTintForIcon(StatusBarIconView v, int tint) { @@ -437,12 +481,6 @@ public class NotificationIconAreaController implements DarkReceiver, v.setDecorColor(tint); } - public void setDark(boolean dark) { - mNotificationIcons.setDark(dark, false, 0); - mShelfIcons.setDark(dark, false, 0); - mCenteredIcon.setDark(dark, false, 0); - } - /** * Shows the icon view given in the center. */ @@ -463,12 +501,78 @@ public class NotificationIconAreaController implements DarkReceiver, } @Override - public void onDozeAmountChanged(float linear, float eased) { - mDarkAmount = linear; - boolean fullyDark = mDarkAmount == 1f; - if (mFullyDark != fullyDark) { - mFullyDark = fullyDark; - updateShelfIcons(); + public void onDozingChanged(boolean isDozing) { + boolean animate = mDozeParameters.getAlwaysOn() + && !mDozeParameters.getDisplayNeedsBlanking(); + mAodIcons.setDozing(isDozing, animate, 0); + } + + public void setAnimationsEnabled(boolean enabled) { + mAnimationsEnabled = enabled; + updateAnimations(); + } + + @Override + public void onStateChanged(int newState) { + updateAnimations(); + } + + private void updateAnimations() { + boolean inShade = mStatusBarStateController.getState() == StatusBarState.SHADE; + mAodIcons.setAnimationsEnabled(mAnimationsEnabled && !inShade); + mCenteredIcon.setAnimationsEnabled(mAnimationsEnabled && inShade); + mNotificationIcons.setAnimationsEnabled(mAnimationsEnabled && inShade); + } + + public void onThemeChanged() { + reloadAodColor(); + updateAodIconColors(); + } + + public void appearAodIcons() { + DozeParameters dozeParameters = DozeParameters.getInstance(mContext); + if (dozeParameters.shouldControlScreenOff()) { + mAodIcons.setTranslationY(-mAodIconAppearTranslation); + mAodIcons.setAlpha(0); + mAodIcons.animate() + .setInterpolator(Interpolators.DECELERATE_QUINT) + .translationY(0) + .setDuration(AOD_ICONS_APPEAR_DURATION) + .start(); + mAodIcons.animate() + .alpha(1) + .setInterpolator(Interpolators.LINEAR) + .setDuration(AOD_ICONS_APPEAR_DURATION) + .start(); } } + + private void reloadAodColor() { + mAodIconTint = Utils.getColorAttrDefaultColor(mContext, + R.attr.wallpaperTextColor); + } + private void updateAodIconColors() { + for (int i = 0; i < mAodIcons.getChildCount(); i++) { + final StatusBarIconView iv = (StatusBarIconView) mAodIcons.getChildAt(i); + if (iv.getWidth() != 0) { + updateTintForIcon(iv, mAodIconTint); + } else { + iv.executeOnLayout(() -> updateTintForIcon(iv, mAodIconTint)); + } + } + } + + public void setFullyHidden(boolean fullyHidden) { + if (mFullyHidden != fullyHidden) { + mFullyHidden = fullyHidden; + if (fullyHidden) { + appearAodIcons(); + } + updateAodIconsVisibility(); + } + } + + private void updateAodIconsVisibility() { + mAodIcons.setVisibility(mFullyHidden ? View.VISIBLE : View.INVISIBLE); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java index 009afca5b034..e51baf306328 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java @@ -128,7 +128,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { } }.setDuration(CONTENT_FADE_DURATION); - private static final int MAX_VISIBLE_ICONS_WHEN_DARK = 5; + private static final int MAX_VISIBLE_ICONS_ON_LOCK = 5; public static final int MAX_STATIC_ICONS = 4; private static final int MAX_DOTS = 1; @@ -141,7 +141,8 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { private int mActualLayoutWidth = NO_VALUE; private float mActualPaddingEnd = NO_VALUE; private float mActualPaddingStart = NO_VALUE; - private boolean mDark; + private boolean mDozing; + private boolean mOnLockScreen; private boolean mChangingViewPositions; private int mAddAnimationStartIndex = -1; private int mCannedAnimationStartIndex = -1; @@ -288,7 +289,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { } } if (child instanceof StatusBarIconView) { - ((StatusBarIconView) child).setDark(mDark, false, 0); + ((StatusBarIconView) child).setDozing(mDozing, false, 0); } } @@ -315,7 +316,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { @Override public void onViewRemoved(View child) { super.onViewRemoved(child); - if (child instanceof StatusBarIconView) { + if (mAnimationsEnabled && child instanceof StatusBarIconView) { boolean isReplacingIcon = isReplacingIcon(child); final StatusBarIconView icon = (StatusBarIconView) child; if (icon.getVisibleState() != StatusBarIconView.STATE_HIDDEN @@ -372,7 +373,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { float translationX = getActualPaddingStart(); int firstOverflowIndex = -1; int childCount = getChildCount(); - int maxVisibleIcons = mDark ? MAX_VISIBLE_ICONS_WHEN_DARK : + int maxVisibleIcons = mOnLockScreen ? MAX_VISIBLE_ICONS_ON_LOCK : mIsStaticLayout ? MAX_STATIC_ICONS : childCount; float layoutEnd = getLayoutEnd(); float overflowStart = getMaxOverflowStart(); @@ -389,8 +390,8 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { boolean forceOverflow = mSpeedBumpIndex != -1 && i >= mSpeedBumpIndex && iconState.iconAppearAmount > 0.0f || i >= maxVisibleIcons; boolean noOverflowAfter = i == childCount - 1; - float drawingScale = mDark && view instanceof StatusBarIconView - ? ((StatusBarIconView) view).getIconScaleFullyDark() + float drawingScale = mOnLockScreen && view instanceof StatusBarIconView + ? ((StatusBarIconView) view).getIconScaleIncreased() : 1f; if (mOpenedAmount != 0.0f) { noOverflowAfter = noOverflowAfter && !hasAmbient && !forceOverflow; @@ -437,7 +438,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { mFirstVisibleIconState = mIconStates.get(getChildAt(0)); } - boolean center = mDark; + boolean center = mOnLockScreen; if (center && translationX < getLayoutEnd()) { float initialTranslation = mFirstVisibleIconState == null ? 0 : mFirstVisibleIconState.xTranslation; @@ -557,13 +558,13 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { mChangingViewPositions = changingViewPositions; } - public void setDark(boolean dark, boolean fade, long delay) { - mDark = dark; + public void setDozing(boolean dozing, boolean fade, long delay) { + mDozing = dozing; mDisallowNextAnimation |= !fade; for (int i = 0; i < getChildCount(); i++) { View view = getChildAt(i); if (view instanceof StatusBarIconView) { - ((StatusBarIconView) view).setDark(dark, fade, delay); + ((StatusBarIconView) view).setDozing(dozing, fade, delay); } } } @@ -667,6 +668,10 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { } } + public void setOnLockScreen(boolean onLockScreen) { + mOnLockScreen = onLockScreen; + } + public class IconState extends ViewState { public static final int NO_VALUE = NotificationIconContainer.NO_VALUE; public float iconAppearAmount = 1.0f; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 1d1ae3746b38..1ee1c42c81d0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -345,6 +345,9 @@ public class NotificationPanelView extends PanelView implements private int mThemeResId; private KeyguardIndicationController mKeyguardIndicationController; private Consumer mAffordanceLaunchListener; + private int mShelfHeight; + private Runnable mOnReinflationListener; + private int mDarkIconSize; @Inject public NotificationPanelView(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, @@ -452,6 +455,9 @@ public class NotificationPanelView extends PanelView implements R.dimen.keyguard_indication_bottom_padding); mQsNotificationTopPadding = getResources().getDimensionPixelSize( R.dimen.qs_notification_padding); + mShelfHeight = getResources().getDimensionPixelSize(R.dimen.notification_shelf_height); + mDarkIconSize = getResources().getDimensionPixelSize( + R.dimen.status_bar_icon_drawing_size_dark); } /** @@ -544,6 +550,9 @@ public class NotificationPanelView extends PanelView implements setKeyguardStatusViewVisibility(mBarState, false, false); setKeyguardBottomAreaVisibility(mBarState, false); + if (mOnReinflationListener != null) { + mOnReinflationListener.run(); + } } private void initBottomArea() { @@ -674,7 +683,8 @@ public class NotificationPanelView extends PanelView implements mNotificationStackScroller.getIntrinsicContentHeight(), getExpandedFraction(), totalHeight, - mKeyguardStatusView.getHeight(), + (int) (mKeyguardStatusView.getHeight() + - mShelfHeight / 2.0f - mDarkIconSize / 2.0f), clockPreferredY, hasCustomClock(), mNotificationStackScroller.getVisibleNotificationCount() != 0, @@ -3063,10 +3073,6 @@ public class NotificationPanelView extends PanelView implements return mNotificationStackScroller.hasPulsingNotifications(); } - public boolean isFullyDark() { - return mNotificationStackScroller.isFullyDark(); - } - public ActivatableNotificationView getActivatedChild() { return mNotificationStackScroller.getActivatedChild(); } @@ -3114,6 +3120,10 @@ public class NotificationPanelView extends PanelView implements mAnimateNextPositionUpdate = true; } + public void setOnReinflationListener(Runnable onReinflationListener) { + mOnReinflationListener = onReinflationListener; + } + /** * Panel and QS expansion callbacks. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java index ca762cdf07f3..27c94d277cc4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java @@ -36,6 +36,9 @@ import com.android.systemui.plugins.qs.QS; import com.android.systemui.statusbar.notification.AboveShelfObserver; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; +import java.util.ArrayList; +import java.util.Comparator; + /** * The container with notification stack scroller and quick settings inside. */ @@ -54,6 +57,9 @@ public class NotificationsQuickSettingsContainer extends FrameLayout private int mBottomPadding; private int mStackScrollerMargin; private boolean mHasViewsAboveShelf; + private ArrayList mDrawingOrderedChildren = new ArrayList<>(); + private ArrayList mLayoutDrawingOrder = new ArrayList<>(); + private final Comparator mIndexComparator = Comparator.comparingInt(this::indexOfChild); public NotificationsQuickSettingsContainer(Context context, AttributeSet attrs) { super(context, attrs); @@ -107,35 +113,44 @@ public class NotificationsQuickSettingsContainer extends FrameLayout } @Override - protected boolean drawChild(Canvas canvas, View child, long drawingTime) { - boolean userSwitcherVisible = mInflated && mUserSwitcher.getVisibility() == View.VISIBLE; - boolean statusBarVisible = mKeyguardStatusBar.getVisibility() == View.VISIBLE; - - final boolean qsBottom = mHasViewsAboveShelf; - View stackQsTop = qsBottom ? mStackScroller : mQsFrame; - View stackQsBottom = !qsBottom ? mStackScroller : mQsFrame; + protected void dispatchDraw(Canvas canvas) { // Invert the order of the scroll view and user switcher such that the notifications receive // touches first but the panel gets drawn above. - if (child == mQsFrame) { - return super.drawChild(canvas, userSwitcherVisible && statusBarVisible ? mUserSwitcher - : statusBarVisible ? mKeyguardStatusBar - : userSwitcherVisible ? mUserSwitcher - : stackQsBottom, drawingTime); - } else if (child == mStackScroller) { - return super.drawChild(canvas, - userSwitcherVisible && statusBarVisible ? mKeyguardStatusBar - : statusBarVisible || userSwitcherVisible ? stackQsBottom - : stackQsTop, - drawingTime); - } else if (child == mUserSwitcher) { - return super.drawChild(canvas, - userSwitcherVisible && statusBarVisible ? stackQsBottom - : stackQsTop, - drawingTime); - } else if (child == mKeyguardStatusBar) { - return super.drawChild(canvas, - stackQsTop, - drawingTime); + mDrawingOrderedChildren.clear(); + mLayoutDrawingOrder.clear(); + if (mInflated && mUserSwitcher.getVisibility() == View.VISIBLE) { + mDrawingOrderedChildren.add(mUserSwitcher); + mLayoutDrawingOrder.add(mUserSwitcher); + } + if (mKeyguardStatusBar.getVisibility() == View.VISIBLE) { + mDrawingOrderedChildren.add(mKeyguardStatusBar); + mLayoutDrawingOrder.add(mKeyguardStatusBar); + } + if (mStackScroller.getVisibility() == View.VISIBLE) { + mDrawingOrderedChildren.add(mStackScroller); + mLayoutDrawingOrder.add(mStackScroller); + } + if (mQsFrame.getVisibility() == View.VISIBLE) { + mDrawingOrderedChildren.add(mQsFrame); + mLayoutDrawingOrder.add(mQsFrame); + } + + if (mHasViewsAboveShelf) { + // StackScroller needs to be on top + mDrawingOrderedChildren.remove(mStackScroller); + mDrawingOrderedChildren.add(mStackScroller); + } + + // Let's now find the order that the view has when drawing regulary by sorting + mLayoutDrawingOrder.sort(mIndexComparator); + super.dispatchDraw(canvas); + } + + @Override + protected boolean drawChild(Canvas canvas, View child, long drawingTime) { + int layoutIndex = mLayoutDrawingOrder.indexOf(child); + if (layoutIndex >= 0) { + return super.drawChild(canvas, mDrawingOrderedChildren.get(layoutIndex), drawingTime); } else { return super.drawChild(canvas, child, drawingTime); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 8ad25bfc1f4d..3cde49300d93 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -811,8 +811,10 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationIconAreaController = SystemUIFactory.getInstance() .createNotificationIconAreaController(context, this, mStatusBarStateController, mNotificationListener); + mWakeUpCoordinator.setIconAreaController(mNotificationIconAreaController); inflateShelf(); mNotificationIconAreaController.setupShelf(mNotificationShelf); + mNotificationPanel.setOnReinflationListener(mNotificationIconAreaController::initAodIcons); Dependency.get(DarkIconDispatcher.class).addDarkReceiver(mNotificationIconAreaController); // Allow plugins to reference DarkIconDispatcher and StatusBarStateController @@ -1189,6 +1191,7 @@ public class StatusBar extends SystemUI implements DemoMode, if (mAmbientIndicationContainer instanceof AutoReinflateContainer) { ((AutoReinflateContainer) mAmbientIndicationContainer).inflateLayout(); } + mNotificationIconAreaController.onThemeChanged(); } @Override @@ -3666,8 +3669,9 @@ public class StatusBar extends SystemUI implements DemoMode, private void updateNotificationPanelTouchState() { boolean goingToSleepWithoutAnimation = isGoingToSleep() && !DozeParameters.getInstance(mContext).shouldControlScreenOff(); - mNotificationPanel.setTouchAndAnimationDisabled((!mDeviceInteractive && !mPulsing) - || goingToSleepWithoutAnimation); + boolean disabled = (!mDeviceInteractive && !mPulsing) || goingToSleepWithoutAnimation; + mNotificationPanel.setTouchAndAnimationDisabled(disabled); + mNotificationIconAreaController.setAnimationsEnabled(!disabled); } final ScreenLifecycle.Observer mScreenObserver = new ScreenLifecycle.Observer() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index 7d5f23bc1e58..de266592533d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -415,7 +415,6 @@ public class StatusBarWindowView extends FrameLayout { } boolean intercept = false; if (mNotificationPanel.isFullyExpanded() - && stackScrollLayout.getVisibility() == View.VISIBLE && mStatusBarStateController.getState() == StatusBarState.KEYGUARD && !mService.isBouncerShowing() && !mService.isDozing()) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java index 8077e3fbaa0a..8d3c54988001 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java @@ -37,9 +37,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AppOpsManager; -import android.app.Notification; import android.app.NotificationChannel; -import android.os.UserHandle; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; @@ -140,7 +138,7 @@ public class ExpandableNotificationRowTest extends SysuiTestCase { @Test public void testIconColorShouldBeUpdatedWhenSettingDark() throws Exception { ExpandableNotificationRow row = spy(mNotificationTestHelper.createRow()); - row.setDark(true, false, 0); + row.setDozing(true, false, 0); verify(row).updateShelfIconColor(); } @@ -212,7 +210,7 @@ public class ExpandableNotificationRowTest extends SysuiTestCase { @Test public void testClickSound() throws Exception { assertTrue("Should play sounds by default.", mGroupRow.isSoundEffectsEnabled()); - mGroupRow.setDark(true /* dark */, false /* fade */, 0 /* delay */); + mGroupRow.setDozing(true /* dark */, false /* fade */, 0 /* delay */); mGroupRow.setSecureStateProvider(()-> false); assertFalse("Shouldn't play sounds when dark and trusted.", mGroupRow.isSoundEffectsEnabled()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java index 5cd0ca7efa9e..377aa0bacd36 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java @@ -83,8 +83,8 @@ public class NotificationContentViewTest extends SysuiTestCase { @UiThreadTest public void animationStartType_getsClearedAfterUpdatingVisibilitiesWithoutAnimation() { mView.setHeadsUp(true); - mView.setDark(true, false, 0); - mView.setDark(false, true, 0); + mView.setDozing(true, false, 0); + mView.setDozing(false, true, 0); mView.setHeadsUpAnimatingAway(true); assertFalse(mView.isAnimatingVisibleType()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index 662edd2d58cd..c1780467daf9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -173,7 +173,6 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { doNothing().when(mGroupManager).collapseAllGroups(); doNothing().when(mExpandHelper).cancelImmediately(); doNothing().when(notificationShelf).setAnimationsEnabled(anyBoolean()); - doNothing().when(notificationShelf).fadeInTranslating(); } @After @@ -194,9 +193,9 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { public void testAntiBurnInOffset() { final int burnInOffset = 30; mStackScroller.setAntiBurnInOffsetX(burnInOffset); - mStackScroller.setDarkAmount(0.0f, 0.0f); + mStackScroller.setHideAmount(0.0f, 0.0f); Assert.assertEquals(0 /* expected */, mStackScroller.getTranslationX(), 0.01 /* delta */); - mStackScroller.setDarkAmount(1.0f, 1.0f); + mStackScroller.setHideAmount(1.0f, 1.0f); Assert.assertEquals(burnInOffset /* expected */, mStackScroller.getTranslationX(), 0.01 /* delta */); } @@ -386,7 +385,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { NotificationSwipeHelper swipeActionHelper = (NotificationSwipeHelper) mStackScroller.getSwipeActionHelper(); swipeActionHelper.setExposedMenuView(new View(mContext)); - mStackScroller.setDarkAmount(0.1f, 0.1f); + mStackScroller.setHideAmount(0.1f, 0.1f); assertNull(swipeActionHelper.getExposedMenuView()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java index 7f7a3e7e7cd6..61b753079f0b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java @@ -20,6 +20,7 @@ import static android.provider.Settings.Secure.NOTIFICATION_NEW_INTERRUPTION_MOD import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.when; import android.provider.Settings; import android.testing.AndroidTestingRunner; @@ -27,6 +28,7 @@ import android.testing.TestableLooper; import androidx.test.filters.SmallTest; +import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationListener; @@ -36,6 +38,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; @SmallTest @@ -48,6 +51,10 @@ public class NotificationIconAreaControllerTest extends SysuiTestCase { @Mock StatusBar mStatusBar; @Mock + StatusBarWindowView mStatusBarWindowView; + @Mock + NotificationIconContainer mIconContainer; + @Mock StatusBarStateController mStatusBarStateController; @Mock private NotificationMediaManager mMediaManager; @@ -56,7 +63,9 @@ public class NotificationIconAreaControllerTest extends SysuiTestCase { @Before public void setup() { MockitoAnnotations.initMocks(this); - + when(mStatusBar.getStatusBarWindow()).thenReturn(mStatusBarWindowView); + when(mStatusBarWindowView.findViewById(R.id.clock_notification_icon_container)).thenReturn( + mIconContainer); mController = new NotificationIconAreaController(mContext, mStatusBar, mStatusBarStateController, mListener, mMediaManager); } -- GitLab From d10e8f29a2a452beb9b1300f9f4c69cd248e1486 Mon Sep 17 00:00:00 2001 From: Al Sutton Date: Fri, 7 Jun 2019 09:31:14 +0100 Subject: [PATCH 071/620] Reconcile the backup OWNERS files with the internal repo. This CL addresses a specific branch where a merge conflict is happening. Change-Id: I03d72ecec447304866d96e2f0908acbc2a1796b6 Merged-In: I42c27dfc0f3f792c46fe60e0f6807e51a2c3f21e Test: build/make/tools/checkowners.py -c -v OWNERS Bug: 134730213 --- core/java/android/app/backup/OWNERS | 3 +++ services/backup/OWNERS | 3 +++ 2 files changed, 6 insertions(+) diff --git a/core/java/android/app/backup/OWNERS b/core/java/android/app/backup/OWNERS index 673d85fe79c5..9c21e8fe5e45 100644 --- a/core/java/android/app/backup/OWNERS +++ b/core/java/android/app/backup/OWNERS @@ -1,6 +1,9 @@ +alsutton@google.com anniemeng@google.com brufino@google.com bryanmawhinney@google.com ctate@google.com jorlow@google.com +nathch@google.com +rthakohov@google.com diff --git a/services/backup/OWNERS b/services/backup/OWNERS index d1dbbffc6708..ec694dfae144 100644 --- a/services/backup/OWNERS +++ b/services/backup/OWNERS @@ -1,5 +1,8 @@ +alsutton@google.com anniemeng@google.com brufino@google.com bryanmawhinney@google.com ctate@google.com jorlow@google.com +nathch@google.com +rthakohov@google.com -- GitLab From b3449019986a4bd336cfc8e871cd26a7dbdabead Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 7 Jun 2019 08:28:26 -0700 Subject: [PATCH 072/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: If91dff5bded1e78b56a3b20998025a0540e8d558 --- core/res/res/values-af/strings.xml | 11 +++++++---- core/res/res/values-am/strings.xml | 11 +++++++---- core/res/res/values-ar/strings.xml | 11 +++++++---- core/res/res/values-as/strings.xml | 12 ++++++++---- core/res/res/values-az/strings.xml | 11 +++++++---- core/res/res/values-b+sr+Latn/strings.xml | 11 +++++++---- core/res/res/values-be/strings.xml | 11 +++++++---- core/res/res/values-bg/strings.xml | 11 +++++++---- core/res/res/values-bn/strings.xml | 11 +++++++---- core/res/res/values-bs/strings.xml | 11 +++++++---- core/res/res/values-ca/strings.xml | 11 +++++++---- core/res/res/values-cs/strings.xml | 11 +++++++---- core/res/res/values-da/strings.xml | 13 ++++++++----- core/res/res/values-de/strings.xml | 11 +++++++---- core/res/res/values-el/strings.xml | 11 +++++++---- core/res/res/values-en-rAU/strings.xml | 11 +++++++---- core/res/res/values-en-rCA/strings.xml | 11 +++++++---- core/res/res/values-en-rGB/strings.xml | 11 +++++++---- core/res/res/values-en-rIN/strings.xml | 11 +++++++---- core/res/res/values-en-rXC/strings.xml | 11 +++++++---- core/res/res/values-es-rUS/strings.xml | 11 +++++++---- core/res/res/values-es/strings.xml | 11 +++++++---- core/res/res/values-et/strings.xml | 11 +++++++---- core/res/res/values-eu/strings.xml | 15 +++++++++------ core/res/res/values-fa/strings.xml | 11 +++++++---- core/res/res/values-fi/strings.xml | 11 +++++++---- core/res/res/values-fr-rCA/strings.xml | 11 +++++++---- core/res/res/values-fr/strings.xml | 11 +++++++---- core/res/res/values-gl/strings.xml | 11 +++++++---- core/res/res/values-gu/strings.xml | 11 +++++++---- core/res/res/values-hi/strings.xml | 11 +++++++---- core/res/res/values-hr/strings.xml | 11 +++++++---- core/res/res/values-hu/strings.xml | 11 +++++++---- core/res/res/values-hy/strings.xml | 11 +++++++---- core/res/res/values-in/strings.xml | 11 +++++++---- core/res/res/values-is/strings.xml | 11 +++++++---- core/res/res/values-it/strings.xml | 11 +++++++---- core/res/res/values-iw/strings.xml | 11 +++++++---- core/res/res/values-ja/strings.xml | 11 +++++++---- core/res/res/values-ka/strings.xml | 11 +++++++---- core/res/res/values-kk/strings.xml | 11 +++++++---- core/res/res/values-km/strings.xml | 13 ++++++++----- core/res/res/values-kn/strings.xml | 11 +++++++---- core/res/res/values-ko/strings.xml | 11 +++++++---- core/res/res/values-ky/strings.xml | 11 +++++++---- core/res/res/values-lo/strings.xml | 11 +++++++---- core/res/res/values-lt/strings.xml | 11 +++++++---- core/res/res/values-lv/strings.xml | 11 +++++++---- core/res/res/values-mk/strings.xml | 11 +++++++---- core/res/res/values-ml/strings.xml | 11 +++++++---- core/res/res/values-mn/strings.xml | 11 +++++++---- core/res/res/values-mr/strings.xml | 11 +++++++---- core/res/res/values-ms/strings.xml | 11 +++++++---- core/res/res/values-my/strings.xml | 11 +++++++---- core/res/res/values-nb/strings.xml | 11 +++++++---- core/res/res/values-ne/strings.xml | 11 +++++++---- core/res/res/values-nl/strings.xml | 11 +++++++---- core/res/res/values-or/strings.xml | 11 +++++++---- core/res/res/values-pa/strings.xml | 11 +++++++---- core/res/res/values-pl/strings.xml | 11 +++++++---- core/res/res/values-pt-rBR/strings.xml | 11 +++++++---- core/res/res/values-pt-rPT/strings.xml | 11 +++++++---- core/res/res/values-pt/strings.xml | 11 +++++++---- core/res/res/values-ro/strings.xml | 11 +++++++---- core/res/res/values-ru/strings.xml | 11 +++++++---- core/res/res/values-si/strings.xml | 11 +++++++---- core/res/res/values-sk/strings.xml | 17 ++++++++++------- core/res/res/values-sl/strings.xml | 11 +++++++---- core/res/res/values-sq/strings.xml | 11 +++++++---- core/res/res/values-sr/strings.xml | 11 +++++++---- core/res/res/values-sv/strings.xml | 13 ++++++++----- core/res/res/values-sw/strings.xml | 11 +++++++---- core/res/res/values-ta/strings.xml | 12 ++++++++---- core/res/res/values-te/strings.xml | 11 +++++++---- core/res/res/values-th/strings.xml | 11 +++++++---- core/res/res/values-tl/strings.xml | 11 +++++++---- core/res/res/values-tr/strings.xml | 11 +++++++---- core/res/res/values-uk/strings.xml | 11 +++++++---- core/res/res/values-ur/strings.xml | 11 +++++++---- core/res/res/values-uz/strings.xml | 11 +++++++---- core/res/res/values-vi/strings.xml | 11 +++++++---- core/res/res/values-zh-rCN/strings.xml | 11 +++++++---- core/res/res/values-zh-rHK/strings.xml | 11 +++++++---- core/res/res/values-zh-rTW/strings.xml | 11 +++++++---- core/res/res/values-zu/strings.xml | 11 +++++++---- 85 files changed, 605 insertions(+), 348 deletions(-) diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index a38c784e94ca..bcba305e4000 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -131,6 +131,7 @@ "%s-Wi-Fi-oproepe" + "%s-Wi-Fi-oproepe" "WLAN-oproep" "%s-WLAN-oproep" "%s-Wi-Fi" @@ -1611,8 +1612,6 @@ "Oorlegger #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", veilig" - "Hierdie begin van agtergrondaktiwiteit vanaf %1$s sal in toekomstige Q-bouweergawes geblokkeer word. Sien g.co/dev/bgblock." - "Begin van agtergrondaktiwiteit vanaf %1$s word geblokkeer. Sien g.co/dev/bgblock." "Het jy die patroon vergeet?" "Verkeerde patroon" "Verkeerde wagwoord" @@ -1666,8 +1665,12 @@ "Toeganklikheidskortpad het %1$s aangeskakel" "Toeganklikheidskortpad het %1$s afgeskakel" "Druk en hou albei volumesleutels drie sekondes lank om %1$s te gebruik" - "Kies \'n kenmerk om te gebruik wanneer jy op die Toeganklikheid-knoppie tik:" - "Raak en hou die Toeganklikheid-knoppie om kenmerke te verander." + "Kies \'n diens om te gebruik wanneer jy op die toeganklikheidknoppie tik:" + "Kies \'n diens om te gebruik saam met die toeganklikheidgebaar (swiep met twee vingers op van die onderkant van die skerm af):" + "Kies \'n diens om te gebruik saam met die toeganklikheidgebaar (swiep met drie vingers op van die onderkant van die skerm af):" + "Raak en hou die toeganklikheidknoppie om tussen dienste te wissel." + "Swiep op met twee vingers en hou om tussen dienste te wissel." + "Swiep op met drie vingers en hou om tussen dienste te wissel." "Vergroting" "Huidige gebruiker %1$s ." "Skakel tans oor na %1$s …" diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 6c30f6b1f3c1..478fabf64e4d 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -131,6 +131,7 @@ "%s የWi-Fi ጥሪ አደራረግ" + "%s የWi-Fi ጥሪ" "የWLAN ጥሪ" "%s የWLAN ጥሪ" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "ተደራቢ #%1$d" "%1$s%2$dx%3$d%4$d dpi" "፣ የተጠበቀ" - "ይህ የ%1$s የበስተጀርባ እንቅስቃሴ ጅምር በወደፊት የQ ግንቦች ላይ ይታገዳል። g.co/dev/bgblock ይመልከቱ።" - "የ%1$s የበስተጀርባ እንቅስቃሴ ጅምር ታግዷል። g.co/dev/bgblock ይመልከቱ።" "ስርዓተ ጥለቱን እርሳ" "የተሳሳተ ስርዓተ ጥለት" "የተሳሳተ ይለፍ ቃል" @@ -1666,8 +1665,12 @@ "የተደራሽነት አቋራጭ %1$sን አብርቶታል" "የተደራሽነት አቋራጭ %1$sን አጥፍቶታል" "%1$sን ለመጠቀም ለሦስት ሰከንዶች ሁለቱንም የድምፅ ቁልፎች ተጭነው ይያዙ" - "የተደራሽነት አዝራርን መታ በሚያደርጉበት ጊዜ ጥቅም ላይ የሚውለውን ባህሪ ይምረጡ፦" - "ባህሪያትን ለመለወጥ የተደራሽነት አዝራሩን ይንኩ እና ይያዙት።" + "የተደራሽነት አዝራርን መታ በሚያደርጉበት ጊዜ ጥቅም ላይ የሚውለውን አገልግሎት ይምረጡ፦" + "ከተደራሽነት ጣት ምልክት ጋር የሚጠቀሙበት አአገልግሎት ይምረጡ (በሁለት ጣቶች ከማያ ገጹ ግርጌ ወደ ላይ ይጥረጉ)፦" + "ከተደራሽነት ጣት ምልክት ጋር አብረው የሚጠቀሙበት አገልግሎት ይምረጡ (በሶስት ጣቶች ከማያ ገጹ ግርጌ ወደ ላይ ይጥረጉ)፦" + "በአገልግሎቶች መካከል ለመቀያየር የተደራሽነት አዝራሩን ነክተው ይያዙ።" + "በአገልግሎቶች መካከል ለመቀያየር በሁለት ጣቶች ወደ ላይ ጠርገው ይያዙ።" + "በአገልግሎቶች መካከል ለመቀያየር በሶስት ጣቶች ወደ ላይ ጠርገው ይያዙ።" "ማጉላት" "የአሁኑ ተጠቃሚ %1$s።" "ወደ %1$s በመቀየር ላይ…" diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 3ea8779d387a..0d46ffb975f1 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -135,6 +135,7 @@ "‏الاتصال عبر شبكة Wi-Fi التابعة لـ %s" + "‏الاتصال عبر Wi-Fi ضمن شبكة %s" "‏مكالمة عبر شبكة WLAN" "‏مكالمة عبر شبكة WLAN التابعة لـ %s" "‏شبكة Wi-Fi التابعة لـ %s" @@ -1703,8 +1704,6 @@ "المركب #%1$d" "‏%1$s: %2$dx%3$d، %4$d نقطة لكل بوصة" "آمن" - "‏سيتم حظر بدء نشاط الخلفية هذا من %1$s في إصدارات Q القادمة. اطّلع على g.co/dev/bgblock." - "‏تم حظر بدء نشاط الخلفية من %1$s. اطّلع على g.co/dev/bgblock." "نسيت النقش" "النقش غير صحيح" "كلمة مرور خاطئة" @@ -1762,8 +1761,12 @@ "شغَّل اختصار إمكانية الوصول خدمة %1$s" "أوقف اختصار إمكانية الوصول خدمة %1$s" "اضغط مع الاستمرار على مفتاحي مستوى الصوت لمدة 3 ثوانٍ لاستخدام %1$s." - "يمكنك اختيار إحدى الميزات لاستخدامها عند النقر على زر إمكانية الوصول:" - "لتغيير الميزات، يمكنك لمس زر \"إمكانية الوصول\" مع الاستمرار." + "يمكنك اختيار إحدى الخدمات لاستخدامها عند النقر على زر سهولة الاستخدام:" + "يمكنك اختيار إحدى الخدمات لاستخدامها مع إيماءة سهولة الاستخدام (مرّر سريعًا لأعلى من أسفل الشاشة باستخدام إصبعين):" + "يمكنك اختيار إحدى الخدمات لاستخدامها مع إيماءة سهولة الاستخدام (مرّر سريعًا لأعلى من أسفل الشاشة باستخدام ثلاثة أصابع):" + "للتبديل بين الخدمات، يمكنك لمس زر سهولة الاستخدام مع الاستمرار." + "للتبديل بين الخدمات، يمكنك التمرير سريعًا لأعلى باستخدام إصبعين مع الاستمرار." + "للتبديل بين الخدمات، يمكنك التمرير سريعًا لأعلى باستخدام ثلاثة أصابع مع الاستمرار." "التكبير" "المستخدم الحالي %1$s." "جارٍ التبديل إلى %1$s…" diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 3213774ab3e7..1ab299404527 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -131,6 +131,8 @@ "%s ৱাই- ফাই কলিং" + + "WLAN কল" "%s WLAN কল" "%s ৱাই-ফাই" @@ -1611,8 +1613,6 @@ "অ\'ভাৰলে\' #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", সুৰক্ষিত" - "%1$sৰ পৰা নেপথ্যত আৰম্ভ হোৱা এই কাৰ্যকলাপটো ভৱিষ্যতে Q বিল্ডত অৱৰোধ কৰা হ’ব। g.co/dev/bgblock চাওক।" - "%1$sৰ পৰা নেপথ্যত আৰম্ভ হোৱা কাৰ্যকলাপ অৱৰোধ কৰা হৈছে। g.co/dev/bgblock চাওক।" "আৰ্হি পাহৰিলেনে" "ভুল আৰ্হি" "ভুল পাছৱৰ্ড" @@ -1666,8 +1666,12 @@ "দিব্যাংগসকলৰ সুবিধাৰ শ্বৰ্টকাটটোৱে %1$sক অন কৰিছে" "দিব্যাংগসকলৰ সুবিধাৰ শ্বৰ্টকাটটোৱে %1$sক অফ কৰিছে" "%1$s ব্যৱহাৰ কৰিবলৈ দুয়োটা ভলিউম বুটাম তিনি ছেকেণ্ডৰ বাবে হেঁচি ৰাখক" - "আপুনি দিব্যাংগসকলৰ সুবিধাৰ বুটামটো টিপিলে ব্যৱহাৰ কৰিবলগীয়া কোনো সুবিধা বাছক:" - "সুবিধাসমূহ সলনি কৰিবলৈ দিব্যাংগসকলৰ সুবিধাৰ বুটামটো স্পৰ্শ কৰি থাকক।" + "আপুনি সাধ্য সুবিধাৰ বুটামটো টিপিলে ব্যৱহাৰ কৰিবলৈ এটা সেৱা বাছনি কৰক:" + "সাধ্য সুবিধা ভংগিমাৰ সৈতে ব্যৱহাৰ কৰিবলৈ এটা সেৱা বাছনি কৰক (দুটা আঙুলিৰে স্ক্রীণখনৰ একেবাৰে তলিৰ পৰা ওপৰলৈ ছোৱাইপ কৰক):" + "সাধ্য সুবিধা ভংগিমাৰ সৈতে ব্যৱহাৰ কৰিবলৈ এটা সেৱা বাছনি কৰক (তিনিটা আঙুলিৰে স্ক্রীণখনৰ একেবাৰে তলিৰ পৰা ওপৰলৈ ছোৱাইপ কৰক):" + "সেৱাসমূহ সালসলনিকৈ ব্যৱহাৰ কৰিবলৈ সাধ্য সুবিধাৰ বুটামটো স্পৰ্শ কৰি ধৰি ৰাখক।" + "সেৱাসমূহ সালসলনিকৈ ব্যৱহাৰ কৰিবলৈ দুটা আঙুলিৰে ওপৰলৈ ছোৱাইপ কৰি ধৰি ৰাখক।" + "সেৱাসমূহ সালসলনিকৈ ব্যৱহাৰ কৰিবলৈ তিনিটা আঙুলিৰে ওপৰলৈ ছোৱাইপ কৰি ধৰি ৰাখক।" "বিবৰ্ধন" "বৰ্তমানৰ ব্যৱহাৰকাৰী %1$s।" "%1$sলৈ সলনি কৰি থকা হৈছে…" diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 815cf722661e..2005b4eba9ae 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi Zəngi" + "%s WiFi Zəngi" "WLAN Zəngi" "%s WLAN Zəngi" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "Örtük #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", təhlükəsiz" - "%1$s ünvanından olan bu arxa fon fəaliyyəti növbəti Q versiyalarında blok ediləcək. G.co/dev/bgblock ünvanına baxın." - "%1$s ünvanından olan arxa fon fəaliyyəti blok edildi. G.co/dev/bgblock ünvanına baxın." "Şablonu unutmuşam" "Yanlış Model" "Yanlış Şifrə" @@ -1666,8 +1665,12 @@ "Əlçatımlıq Qısayolu %1$s xidmətini aktiv etdi" "Əlçatımlıq Qısayolu %1$s xidmətini deaktiv etdi" "%1$s istifadə etmək üçün hər iki səs düyməsini üç saniyə basıb saxlayın" - "Əlçatımlılıq düyməsinə kliklədikdə istifadə etmək üçün funksiya seçin:" - "Funksiyaları dəyişmək üçün Əlçatımlılıq düyməsinə basıb saxlayın." + "Əlçatımlılıq düyməsinə toxunduqda istifadə etmək üçün xidmət seçin:" + "Əlçatımlılıq jestləri (iki barmağınızla ekranın aşağısından yuxarı doğru sürüşdürün) ilə istifadə etmək üçün xidmət seçin:" + "Əlçatımlılıq jestləri (üç barmağınızla ekranın aşağısından yuxarı doğru sürüşdürün) ilə istifadə etmək üçün xidmət seçin:" + "Xidmətlər arasında keçid etmək üçün əlçatımlılıq düyməsinə basın & saxlayın." + "Xidmətlər arasında keçid etmək üçün ekranı iki barmağınızla yuxarı sürüşdürüb saxlayın." + "Xidmətlər arasında keçid etmək üçün ekranı üç barmağınızla yuxarı sürüşdürüb saxlayın." "Böyütmə" "Cari istifadəçi %1$s." "%1$s adına keçirilir…" diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 8f1bb2c95059..402422c24cd7 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -132,6 +132,7 @@ "%s pozivanje preko Wi-Fi-ja" + "%s – pozivanje preko Wi-Fi-ja" "WLAN poziv" "%s WLAN poziv" "%s Wi-Fi" @@ -1634,8 +1635,6 @@ "Postavljeni element br. %1$d" "%1$s: %2$d×%3$d, %4$d dpi" ", bezbedno" - "Ovo pokretanje aktivnosti u pozadini sa %1$s biće blokirano u budućim Q verzijama. Pogledajte g.co/dev/bgblock." - "Pokretanje aktivnosti u pozadini sa %1$s je blokirano. Pogledajte g.co/dev/bgblock." "Zaboravljeni šablon" "Pogrešan šablon" "Pogrešna lozinka" @@ -1690,8 +1689,12 @@ "Prečica za pristupačnost je uključila uslugu %1$s" "Prečica za pristupačnost je isključila uslugu %1$s" "Pritisnite i zadržite oba tastera za jačinu zvuka tri sekunde da biste koristili %1$s" - "Izaberite funkciju koja će se koristiti kada dodirnete dugme za pristupačnost:" - "Pritisnite i zadržite dugme za pristupačnost da biste menjali funkcije." + "Odaberite uslugu koja će se koristiti kada dodirnete dugme za pristupačnost:" + "Odaberite funkciju koja će se koristiti pomoću pokreta za pristupačnost (pomoću dva prsta prevucite nagore od dna ekrana):" + "Odaberite uslugu koja će se koristiti pomoću pokreta za pristupačnost (pomoću tri prsta prevucite nagore od dna ekrana):" + "Da biste prelazili sa jedne usluge na drugu, dodirnite i zadržite dugme za pristupačnost." + "Da biste prelazili sa jedne usluge na drugu, prevucite nagore pomoću dva prsta i zadržite." + "Da biste prelazili sa jedne usluge na drugu, prevucite nagore pomoću tri prsta i zadržite." "Uvećanje" "Aktuelni korisnik %1$s." "Prebacivanje na %1$s…" diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 6d8bafaa132f..1ab4fbbd37fb 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -133,6 +133,7 @@ "Wi-Fi-тэлефанія ад %s" + "Wi-Fi-тэлефанія ад аператара \"%s\"" "Выклік праз WLAN" "Выклік праз WLAN ад %s" "Wi-Fi ад %s" @@ -1657,8 +1658,6 @@ "Оверлей # %1$d" "%1$s: %2$dx%3$d, %4$d кр. на цалю" ", бяспечны" - "Запуск дзеянняў у фонавым рэжыме з пакета \"%1$s\" будзе заблакіраваны ў будучых Q-зборках. Глядзіце g.co/dev/bgblock." - "Запуск дзеянняў у фонавым рэжыме з пакета \"%1$s\" заблакіраваны. Глядзіце g.co/dev/bgblock." "Забылі ключ" "Няправільны ўзор" "Няправiльны пароль" @@ -1714,8 +1713,12 @@ "%1$s быў уключаны з дапамогай камбінацыі хуткага доступу для спецыяльных магчымасцей" "%1$s быў адключаны з дапамогай камбінацыі хуткага доступу для спецыяльных магчымасцей" "Каб карыстацца сэрвісам \"%1$s\", націсніце і ўтрымлівайце на працягу трох секунд абедзве клавішы гучнасці" - "Выберыце функцыю для выкарыстання пры націску кнопкі \"Спецыяльныя магчымасці\":" - "Каб змяняць функцыі, краніце і ўтрымлівайце кнопку \"Спецыяльныя магчымасці\"." + "Выберыце службу для выкарыстання пры націску кнопкі \"Спецыяльныя магчымасці\":" + "З дапамогай жэста спецыяльных магчымасцей (правядзіце двума пальцамі па экране знізу ўверх) выберыце службу для выкарыстання:" + "З дапамогай жэста спецыяльных магчымасцей (правядзіце трыма пальцамі па экране знізу ўверх) выберыце службу для выкарыстання:" + "Каб пераключыцца на другую службу, націсніце і ўтрымлівайце кнопку спецыяльных магчымасцей." + "Каб пераключыцца на другую службу, правядзіце ўверх двума пальцамі, утрымліваючы іх на экране." + "Каб пераключыцца на другую службу, правядзіце ўверх трыма пальцамі, утрымліваючы іх на экране." "Павелічэнне" "Бягучы карыстальнік %1$s." "Пераход да %1$s..." diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 9b36914a7d12..bad1db222436 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -131,6 +131,7 @@ "Обаждания през Wi-Fi от %s" + "Обаждания през Wi-Fi от %s" "Обаждане през WLAN" "Обаждане през WLAN от %s" "Wi-Fi от %s" @@ -1611,8 +1612,6 @@ "Наслагване №%1$d" "„%1$s“: %2$d x %3$d, %4$d dpi" ", защитено" - "Стартирането на активност на заден план от %1$s ще бъде блокирано в бъдещите компилации под Q. Разгледайте g.co/dev/bgblock." - "Стартирането на активност на заден план от %1$s е блокирано. Разгледайте g.co/dev/bgblock." "Забравена фигура" "Грешна фигура" "Грешна парола" @@ -1666,8 +1665,12 @@ "Прекият път за достъпност включи %1$s" "Прекият път за достъпност изключи %1$s" "За да използвате %1$s, натиснете двата бутона за силата на звука и ги задръжте за 3 секунди" - "Изберете функция, която да използвате, когато докоснете бутона за достъпност:" - "За да промените функции, докоснете и задръжте бутона за достъпност." + "Изберете коя услуга да се използва при докосване на бутона за достъпност:" + "Изберете коя услуга да се използва с жеста за достъпност (прекарване на два пръста нагоре от долната част на екрана):" + "Изберете коя услуга да се използва с жеста за достъпност (прекарване на три пръста нагоре от долната част на екрана):" + "За превключване между услугите докоснете и задръжте бутона за достъпност." + "За превключване между услугите прекарайте два пръста нагоре и задръжте." + "За превключване между услугите прекарайте три пръста нагоре и задръжте." "Ниво на мащаба" "Текущ потребител %1$s." "Превключва се към %1$s…" diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 19b0103bb750..ffffb3d2cede 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -131,6 +131,7 @@ "%s ওয়াই-ফাই কলিং" + "%s Wi‑Fi কলিং" "WLAN কল" "%s WLAN কল" "%s ওয়াই-ফাই" @@ -1612,8 +1613,6 @@ "আচ্ছাদন #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", নিরাপদ" - "%1$s-এর ব্যাকগ্রাউন্ড অ্যাক্টিভিটি ভবিষ্যতে Q বিল্ড ভার্সনে ব্লক করা হবে। g.co/dev/bgblock লিঙ্ক দেখুন।" - "%1$s-এর ব্যাকগ্রাউন্ড অ্যাক্টিভিটি ব্লক করা হয়েছে। g.co/dev/bgblock লিঙ্ক দেখুন।" "প্যাটার্ন ভুলে গেছেন" "ভুল প্যাটার্ন" "ভুল পাসওয়ার্ড" @@ -1667,8 +1666,12 @@ "অ্যাক্সেসযোগ্যতা শর্টকাট %1$s কে চালু করেছে" "অ্যাক্সেসযোগ্যতা শর্টকাট %1$s কে বন্ধ করেছে" "%1$s ব্যবহার করতে ভলিউম কী বোতাম ৩ সেকেন্ডের জন্য চেপে ধরে রাখুন" - "অ্যাক্সেসযোগ্যতা বোতামের সাহায্যে যে বৈশিষ্ট্যটি নিয়ন্ত্রণ করতে চান, সেটি বেছে নিন:" - "বৈশিষ্ট্যগুলি পরিবর্তন করতে অ্যাক্সেসযোগ্যতা বোতামটি ট্যাপ করে ধরে রাখুন।" + "অ্যাক্সেসিবিলিটি বোতামে ট্যাপ করে ব্যবহার করার জন্য এই পরিষেবাটি বেছে নিন:" + "অ্যাক্সেসিবিলিটি জেসচারের সাহায্যে ব্যবহার করার জন্য এই পরিষেবা বেছে নিন (দুটি আঙুল দিয়ে স্ক্রিনের নিচ থেকে উপরের দিকে সোয়াইপ করুন):" + "অ্যাক্সেসিবিলিটি জেসচারের সাহায্যে ব্যবহার করার জন্য এই পরিষেবা বেছে নিন (তিনটি আঙুল দিয়ে স্ক্রিনের নিচ থেকে উপরের দিকে সোয়াইপ করুন):" + "একটি পরিষেবা থেকে অন্য পরিষেবায় পাল্টাতে অ্যাক্সেসিবিলিটি বোতামটি টাচ করে & ধরে রাখুন।" + "একটি পরিষেবা থেকে অন্য পরিষেবায় পাল্টাতে, দুটি আঙ্গুল দিয়ে উপরের দিকে সোয়াইপ করে ধরে রাখুন।" + "একটি পরিষেবা থেকে অন্য পরিষেবায় পাল্টাতে, তিনটি আঙ্গুল দিয়ে উপরের দিকে সোয়াইপ করে ধরে রাখুন।" "বড় করে দেখা" "বর্তমান ব্যবহারকারী %1$s৷" "%1$s নামের ব্যবহারকারীতে যাচ্ছে…" diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index cd04c6f9497d..2fe93a62346f 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -132,6 +132,7 @@ "%s Pozivanje putem WiFi-ja" + "%s Pozivanje putem WiFi-ja" "WLAN poziv" "%s WLAN poziv" "%s WiFi" @@ -1636,8 +1637,6 @@ "Nadsloj #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", osigurano" - "Pokretanje aktivnosti u pozadini na web lokaciji %1$s blokirat će se u budućim Q verzijama. Pogledajte g.co/dev/bgblock." - "Blokirano je pokretanje aktivnosti u pozadini na web lokaciji %1$s. Pogledajte g.co/dev/bgblock." "Zaboravili ste uzorak?" "Pogrešan uzorak" "Pogrešna lozinka" @@ -1692,8 +1691,12 @@ "Prečica za pristupačnost je uključila uslugu %1$s" "Prečica za pristupačnost je isključila uslugu %1$s" "Pritisnite obje tipke za podešavanje jačine zvuka i držite ih pritisnutim tri sekunde da koristite uslugu %1$s" - "Odaberite funkciju koja će se koristiti kada dodirnete dugme Pristupačnost:" - "Da promijenite funkcije, dodirnite i držite dugme Pristupačnost." + "Odaberite uslugu koja će se koristiti kada dodirnete dugme za pristupačnost:" + "Odaberite uslugu koja će se koristiti kada izvedete pokret za pristupačnost (s dva prsta prevucite prema gore s dna ekrana):" + "Odaberite uslugu koja će se koristiti kada izvedete pokret za pristupačnost (s tri prsta prevucite prema gore s dna ekrana):" + "Za prebacivanje između usluga dodirnite i zadržite dugme za pristupačnost." + "Za prebacivanje između usluga s dva prsta prevucite prema gore i zadržite." + "Za prebacivanje između usluga s tri prsta prevucite prema gore i zadržite." "Uvećanje" "Trenutni korisnik %1$s." "Prebacivanje na korisnika %1$s..." diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 8f3a1c778272..dfc5ff9a139f 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -131,6 +131,7 @@ "Trucades per Wi‑Fi (%s)" + "Trucades per Wi-Fi (%s)" "Trucada per WLAN" "Trucada per WLAN (%s)" "Wi‑Fi (%s)" @@ -1611,8 +1612,6 @@ "Superposa #%1$d" "%1$s: %2$d x %3$d, %4$d dpi" ", segur" - "A les futures compilacions de Q, es bloquejarà aquest inici d\'activitat en segon pla del paquet %1$s. Consulta g.co/dev/bgblock." - "S\'ha bloquejat l\'inici d\'activitat en segon pla del paquet %1$s. Consulta g.co/dev/bgblock." "He oblidat el patró" "Patró incorrecte" "Contrasenya incorrecta" @@ -1666,8 +1665,12 @@ "La drecera d\'accessibilitat ha activat %1$s" "La drecera d\'accessibilitat ha desactivat %1$s" "Mantén premudes les dues tecles de volum durant 3 segons per fer servir %1$s" - "Tria la funció que s\'utilitzarà quan toquis el botó Accessibilitat:" - "Per canviar les funcions, toca i mantén premut el botó Accessibilitat." + "Tria el servei que s\'utilitzarà quan toquis el botó d\'accessibilitat:" + "Tria el servei que s\'utilitzarà amb el gest d\'accessibilitat (fes lliscar dos dits cap amunt des de la part inferior de la pantalla)." + "Tria el servei que s\'utilitzarà amb el gest d\'accessibilitat (fes lliscar tres dits cap amunt des de la part inferior de la pantalla)." + "Per canviar de servei, mantén premut el botó d\'accessibilitat." + "Per canviar de servei, fes lliscar dos dits i mantén premut." + "Per canviar de servei, fes lliscar tres dits i mantén premut." "Ampliació" "Usuari actual: %1$s." "S\'està canviant a %1$s…" diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index ecb0d6ce13e5..af22c8ca4b7d 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -133,6 +133,7 @@ "%s: volání přes Wi-Fi" + "Volání přes Wi-Fi – %s" "Volání přes WLAN" "%s: volání přes WLAN" "%s: Wi-Fi" @@ -1657,8 +1658,6 @@ "Překryvná vrstva č. %1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", zabezpečené" - "Zahájení této aktivity na pozadí ze zdroje %1$s bude v budoucích sestaveních Q zablokováno. Další informace: g.co/dev/bgblock." - "Zahájení aktivity na pozadí ze zdroje %1$s bylo zablokováno. Další informace: g.co/dev/bgblock." "Zapomenuté gesto" "Nesprávné gesto" "Nesprávné heslo" @@ -1714,8 +1713,12 @@ "Zkratka přístupnosti zapnula službu %1$s" "Zkratka přístupnosti vypnula službu %1$s" "Chcete-li používat službu %1$s, tři sekundy podržte stisknutá obě tlačítka hlasitosti" - "Určete, jakou funkci aktivujete klepnutím na tlačítko Přístupnost:" - "Chcete-li vybrat jinou funkci, podržte tlačítko Přístupnost." + "Určete, jakou službu aktivujete klepnutím na tlačítko Přístupnost:" + "Určete, jakou službu aktivujete pomocí gesta přístupnosti (přejetí dvěma prsty ze spodní části obrazovky nahoru):" + "Určete, jakou službu aktivujete pomocí gesta přístupnosti (přejetí třemi prsty ze spodní části obrazovky nahoru):" + "Chcete-li přepnout mezi službami, podržte tlačítko Přístupnost." + "Chcete-li přepnout mezi službami, přejeďte nahoru dvěma prsty a podržte je." + "Chcete-li přepnout mezi službami, přejeďte nahoru třemi prsty a podržte je." "Zvětšení" "Aktuální uživatel je %1$s." "Přepínání na účet %1$s…" diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 32ee7712020c..e06ea02750e4 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -131,6 +131,7 @@ "Wi-Fi-opkald via %s" + "%s-opkald via Wi-Fi" "WLAN-opkald" "WLAN-opkald via %s" "Wi-Fi via %s" @@ -1611,8 +1612,6 @@ "Overlejring nr. %1$d" "%1$s: %2$d x %3$d, %4$d dpi" ", sikker" - "Denne opstart af aktivitet i baggrunden fra %1$s blokeres i fremtidige Q-builds. Se g.co/dev/bgblock." - "Opstart af aktivitet i baggrunden fra %1$s er blokeret. Se g.co/dev/bgblock." "Glemt mønster" "Forkert mønster" "Forkert adgangskode" @@ -1666,8 +1665,12 @@ "Genvejen til hjælpefunktioner aktiverede %1$s" "Genvejen til hjælpefunktioner deaktiverede %1$s" "Hold begge lydstyrkeknapper nede i tre sekunder for at bruge %1$s" - "Vælg, hvilken funktion du vil bruge, når du trykker på knappen Hjælpefunktioner:" - "Tryk på knappen Hjælpefunktioner, og hold fingeren nede for at skifte funktion." + "Vælg, hvilken funktion du vil bruge, når du trykker på knappen Hjælpefunktioner:" + "Vælg, hvilken funktion du vil bruge, når du laver bevægelsen for hjælpefunktioner (stryger opad fra bunden af skærmen med to fingre):" + "Vælg, hvilken funktion du vil bruge, når du laver bevægelsen for hjælpefunktioner (stryger opad fra bunden af skærmen med tre fingre):" + "Du kan skifte mellem funktioner ved at holde knappen Hjælpefunktioner nede." + "Du kan skifte mellem funktioner ved at stryge opad med to fingre og holde dem nede." + "Du kan skifte mellem funktioner ved at stryge opad med tre fingre og holde dem nede." "Forstørrelse" "Nuværende bruger %1$s." "Skifter til %1$s…" @@ -1885,7 +1888,7 @@ "Vil du give %1$s tilladelse til at oprette en ny bruger med %2$s (der findes allerede en bruger med denne konto)?" "Tilføj et sprog" "Områdeindstilling" - "Angiv sprogets navn" + "Angiv sprog" "Foreslået" "Alle sprog" "Alle områder" diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 6d94a77fdc26..9379e83ac6d6 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -131,6 +131,7 @@ "%s WLAN-Telefonie" + "%s WLAN-Telefonie" "WLAN-Anruf" "%s WLAN-Anruf" "%s WLAN" @@ -1611,8 +1612,6 @@ "Overlay-Nr. %1$d" "%1$s: %2$d x %3$d, %4$d dpi" ", sicher" - "Der Start dieser Hintergrundaktivität aus %1$s wird in künftigen Q-Builds blockiert. Weitere Informationen findest du unter g.co/dev/bgblock." - "Der Start der Hintergrundaktivität aus %1$s wurde blockiert. Weitere Informationen findest du unter g.co/dev/bgblock." "Muster vergessen" "Falsches Muster" "Falsches Passwort" @@ -1666,8 +1665,12 @@ "%1$s wurde durch die Bedienungshilfenverknüpfung aktiviert" "%1$s wurde durch die Bedienungshilfenverknüpfung deaktiviert" "Halten Sie beide Lautstärketasten drei Sekunden lang gedrückt, um %1$s zu verwenden" - "Wähle eine Funktion aus, die verwendet wird, wenn du auf die Schaltfläche für die Bedienungshilfen tippst:" - "Um die Funktionen zu ändern, halte die Schaltfläche für die Bedienungshilfen gedrückt." + "Wähle einen Dienst aus, der verwendet wird, wenn du auf die Schaltfläche für die Bedienungshilfen tippst:" + "Wähle einen Dienst aus, der mit der Bewegung für die Bedienungshilfen verwendet wird (mit zwei Fingern vom unteren Bildschirmrand nach oben wischen):" + "Wähle einen Dienst aus, der mit der Bewegung für die Bedienungshilfen verwendet wird (mit drei Fingern vom unteren Bildschirmrand nach oben wischen):" + "Wenn du zwischen den Diensten wechseln möchtest, halte die Schaltfläche für die Bedienungshilfen gedrückt." + "Wenn du zwischen den Diensten wechseln möchtest, wische mit zwei Fingern nach oben und halte sie gedrückt." + "Wenn du zwischen den Diensten wechseln möchtest, wische mit drei Fingern nach oben und halte sie gedrückt." "Vergrößerung" "Aktueller Nutzer %1$s" "Wechseln zu %1$s…" diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 192388dd5690..12a6b7cd5f0b 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -131,6 +131,7 @@ "Κλήση Wi-Fi %s" + "Κλήση Wi-Fi %s" "Κλήση μέσω WLAN" "Κλήση μέσω WLAN %s" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "Επικάλυψη #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", ασφαλές" - "Αυτή η έναρξη δραστηριότητας παρασκηνίου από το %1$s θα αποκλειστεί σε μελλοντικές εκδόσεις του Q. Ανατρέξτε στο g.co/dev/bgblock." - "Η έναρξη δραστηριότητας παρασκηνίου από το %1$s αποκλείστηκε. Ανατρέξτε στο g.co/dev/bgblock." "Ξεχάσατε το μοτίβο" "Λάθος μοτίβο" "Λανθασμένος κωδικός πρόσβασης" @@ -1666,8 +1665,12 @@ "Η συντόμευση προσβασιμότητας ενεργοποίησε την υπηρεσία %1$s" "Η συντόμευση προσβασιμότητας απενεργοποίησε την υπηρεσία %1$s" "Πατήστε παρατεταμένα και τα δύο κουμπιά έντασης ήχου για τρία δευτερόλεπτα, ώστε να χρησιμοποιήσετε την υπηρεσία %1$s" - "Επιλέξτε μια λειτουργία που θα χρησιμοποιείται κατά το πάτημα του κουμπιού \"Προσβασιμότητα\"." - "Για να αλλάξετε λειτουργίες, αγγίξτε παρατεταμένα το κουμπί \"Προσβασιμότητα\"." + "Επιλέξτε μια υπηρεσία που θα χρησιμοποιείται κατά το πάτημα του κουμπιού προσβασιμότητας:" + "Επιλέξτε μια υπηρεσία που θα χρησιμοποιείται με την κίνηση προσβασιμότητας (σύρετε με δύο δάχτυλα προς τα επάνω από το κάτω μέρος της οθόνης):" + "Επιλέξτε μια υπηρεσία που θα χρησιμοποιείται με την κίνηση προσβασιμότητας (σύρετε με τρία δάχτυλα προς τα επάνω από το κάτω μέρος της οθόνης):" + "Για εναλλαγή μεταξύ υπηρεσιών, αγγίξτε παρατεταμένα το κουμπί προσβασιμότητας." + "Για εναλλαγή μεταξύ υπηρεσιών, σύρετε παρατεταμένα με δύο δάχτυλα προς τα επάνω." + "Για εναλλαγή μεταξύ υπηρεσιών, σύρετε παρατεταμένα με τρία δάχτυλα προς τα επάνω." "Μεγιστοποίηση" "Τρέχων χρήστης %1$s." "Εναλλαγή σε %1$s…" diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 84f1fafa49be..4782c296fb32 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi Calling" + "%s Wi-Fi calling" "WLAN call" "%s WLAN Call" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "Overlay #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", secure" - "This background activity start from %1$s will be blocked in future Q builds. See g.co/dev/bgblock." - "Background activity start from %1$s blocked. See g.co/dev/bgblock." "Forgot Pattern" "Wrong Pattern" "Wrong Password" @@ -1666,8 +1665,12 @@ "Accessibility Shortcut turned %1$s on" "Accessibility Shortcut turned %1$s off" "Press and hold both volume keys for three seconds to use %1$s" - "Choose a feature to use when you tap the Accessibility button:" - "To change features, touch & hold the Accessibility button." + "Choose a service to use when you tap the accessibility button:" + "Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with two fingers):" + "Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with three fingers):" + "To switch between services, touch & hold the accessibility button." + "To switch between services, swipe up with two fingers and hold." + "To switch between services, swipe up with three fingers and hold." "Magnification" "Current user %1$s." "Switching to %1$s…" diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 19b64c82d693..7c4176282b1e 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi Calling" + "%s Wi-Fi calling" "WLAN call" "%s WLAN Call" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "Overlay #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", secure" - "This background activity start from %1$s will be blocked in future Q builds. See g.co/dev/bgblock." - "Background activity start from %1$s blocked. See g.co/dev/bgblock." "Forgot Pattern" "Wrong Pattern" "Wrong Password" @@ -1666,8 +1665,12 @@ "Accessibility Shortcut turned %1$s on" "Accessibility Shortcut turned %1$s off" "Press and hold both volume keys for three seconds to use %1$s" - "Choose a feature to use when you tap the Accessibility button:" - "To change features, touch & hold the Accessibility button." + "Choose a service to use when you tap the accessibility button:" + "Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with two fingers):" + "Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with three fingers):" + "To switch between services, touch & hold the accessibility button." + "To switch between services, swipe up with two fingers and hold." + "To switch between services, swipe up with three fingers and hold." "Magnification" "Current user %1$s." "Switching to %1$s…" diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 84f1fafa49be..4782c296fb32 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi Calling" + "%s Wi-Fi calling" "WLAN call" "%s WLAN Call" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "Overlay #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", secure" - "This background activity start from %1$s will be blocked in future Q builds. See g.co/dev/bgblock." - "Background activity start from %1$s blocked. See g.co/dev/bgblock." "Forgot Pattern" "Wrong Pattern" "Wrong Password" @@ -1666,8 +1665,12 @@ "Accessibility Shortcut turned %1$s on" "Accessibility Shortcut turned %1$s off" "Press and hold both volume keys for three seconds to use %1$s" - "Choose a feature to use when you tap the Accessibility button:" - "To change features, touch & hold the Accessibility button." + "Choose a service to use when you tap the accessibility button:" + "Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with two fingers):" + "Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with three fingers):" + "To switch between services, touch & hold the accessibility button." + "To switch between services, swipe up with two fingers and hold." + "To switch between services, swipe up with three fingers and hold." "Magnification" "Current user %1$s." "Switching to %1$s…" diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 84f1fafa49be..4782c296fb32 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi Calling" + "%s Wi-Fi calling" "WLAN call" "%s WLAN Call" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "Overlay #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", secure" - "This background activity start from %1$s will be blocked in future Q builds. See g.co/dev/bgblock." - "Background activity start from %1$s blocked. See g.co/dev/bgblock." "Forgot Pattern" "Wrong Pattern" "Wrong Password" @@ -1666,8 +1665,12 @@ "Accessibility Shortcut turned %1$s on" "Accessibility Shortcut turned %1$s off" "Press and hold both volume keys for three seconds to use %1$s" - "Choose a feature to use when you tap the Accessibility button:" - "To change features, touch & hold the Accessibility button." + "Choose a service to use when you tap the accessibility button:" + "Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with two fingers):" + "Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with three fingers):" + "To switch between services, touch & hold the accessibility button." + "To switch between services, swipe up with two fingers and hold." + "To switch between services, swipe up with three fingers and hold." "Magnification" "Current user %1$s." "Switching to %1$s…" diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 0002e13f1183..276488d92273 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -131,6 +131,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‏‎‎‎‏‏‎‎‏‎‏‏‎‎‎‎‏‏‎‏‎‏‏‏‎‎‏‎‎‎‏‎‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‏‎‎‏‎‎‎‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ Wi-Fi Calling‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‏‎‏‏‎‏‏‏‏‎‎‏‏‎‎‎‎‏‎‏‎‎‏‏‎‏‎‎‎‏‎‎‏‎‎‎‏‏‏‏‎‎‏‏‎‏‎‎‏‎‎‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ WiFi Calling‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‏‎‏‎‎‎‎‏‎‏‎‏‏‏‏‎‎‏‎‎‏‏‏‎‎‏‎‏‎‏‏‏‏‎‎‏‎‎‎‏‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎WLAN Call‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‎‎‎‏‎‏‏‎‎‎‏‎‏‎‏‏‎‎‎‏‏‎‎‏‎‏‎‏‏‎‎‏‎‎‎‏‎‎‏‎‎‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ WLAN Call‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‏‎‎‏‏‏‎‎‎‏‏‎‎‏‏‎‎‎‏‏‏‏‎‏‏‏‎‎‎‏‏‎‏‏‎‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‏‎‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ Wi-Fi‎‏‎‎‏‎" @@ -1611,8 +1612,6 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‎‏‏‏‎‏‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‏‏‎‎‎‏‏‏‎‎‏‎‏‏‎‏‎‎‏‎‎‎‏‏‎‎‏‏‎‏‏‎‎‎Overlay #‎‏‎‎‏‏‎%1$d‎‏‎‎‏‏‏‎‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‏‎‎‏‏‎‎‏‏‏‏‏‏‎‎‏‎‏‏‎‎‏‏‎‎‎‏‎‎‏‎‏‏‎‏‏‎‎‎‎‏‏‎‏‎‎‏‎‏‎‎‎‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎: ‎‏‎‎‏‏‎%2$d‎‏‎‎‏‏‏‎x‎‏‎‎‏‏‎%3$d‎‏‎‎‏‏‏‎, ‎‏‎‎‏‏‎%4$d‎‏‎‎‏‏‏‎ dpi‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‏‎‎‏‎‏‏‎‏‏‏‎‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‏‎‎‎‎‎‏‏‏‎‏‎‎‏‏‎‏‏‏‎‏‏‎‎‎‎‎, secure‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‎‏‎‎‏‏‏‎‏‎‎‏‏‎‏‎‏‎‎‏‎‎‎‎‏‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‏‏‏‏‎‎‏‏‏‏‎‎This background activity start from ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ will be blocked in future Q builds. See g.co/dev/bgblock.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‎‏‎‏‏‎‏‎‎‎‎‎‎‏‏‎‎‎‏‏‎‎‏‎‏‎‏‎‏‏‎‎‏‎‏‏‎‏‎‏‏‏‎‏‏‎‎‏‏‎‏‎‏‎Background activity start from ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ blocked. See g.co/dev/bgblock.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‎‏‎‏‏‎‎‏‎‏‎‏‎‎‎‎‎‎‎‎‎‎‎‎‎‎‏‏‎‏‎‏‎‏‏‎‎‏‏‎‎‏‏‎‎‎‎‎‎‎Forgot Pattern‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‎‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‏‎‎‎‎‏‎‏‏‏‏‏‎‎‏‎‎‎‎‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎Wrong Pattern‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‏‎‏‏‎‎‏‏‎‏‎‎‎‎‎‎‎‏‎‎‎‏‎‏‏‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‏‎Wrong Password‎‏‎‎‏‎" @@ -1666,8 +1665,12 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‏‎‏‏‎‎‏‎‏‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‏‎‏‎‎‎‎‏‎‏‏‏‎‏‏‎‎‎‎‎‏‏‎‎‏‏‎‎‎Accessibility Shortcut turned ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ on‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‏‎‎‎‎‎‎‎‏‎‏‎‏‏‎‏‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‏‎‏‎‏‏‏‎‏‎‏‏‏‏‎‏‎Accessibility Shortcut turned ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ off‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‏‏‎‎‏‏‏‏‎‏‎‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‏‏‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‎‎‏‎‎Press and hold both volume keys for three seconds to use ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‎‏‎‎‎‎‏‎‏‎‏‎‏‎‏‏‏‎‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‎‏‏‎‏‏‏‎‏‎‏‏‏‎‏‎‏‏‎Choose a feature to use when you tap the Accessibility button:‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‎‏‏‎‎‎‎‎‎‎‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‎‏‎‏‏‏‎‏‎‏‏‏‎‎‏‎‎‏‏‏‎‎‏‎To change features, touch & hold the Accessibility button.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‏‎‎‎‏‎‏‎‏‎‎‏‎‏‎‏‏‎‎‏‎‎‏‏‎‏‏‎‏‏‏‎‏‎‎‎‏‎‎‎‏‎‏‎‏‎‎‎‏‎‎‎Choose a service to use when you tap the accessibility button:‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎‎‏‏‏‏‎‎‏‏‎‎‎‎‎‎‎‎‏‎‏‎‏‏‎‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with two fingers):‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‏‏‏‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‏‏‎‎‎‏‎‏‎‏‎‎‎‏‏‏‏‎‏‎‎‎‎‎‎‎‏‏‏‏‎‎‎‏‎Choose a service to use with the accessibility gesture (swipe up from the bottom of the screen with three fingers):‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‎‎‎‎‎‏‏‎‏‎‎‎‏‏‏‎‎‏‏‏‎‏‎‎‏‏‎‏‏‏‎‏‎‏‎‎‎‏‎‎‏‏‏‎‏‏‏‏‎‎‎‏‎To switch between services, touch & hold the accessibility button.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‎‏‎‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‏‎‏‎‎‎‎‏‎‏‏‎‏‏‏‏‏‏‎‎‏‎‎‏‎‏‏‎‎‎‎‏‏‎‎To switch between services, swipe up with two fingers and hold.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‏‏‎‏‏‏‎‎‎‎‎‏‏‏‎‏‏‏‏‎‏‏‎‎‎‏‎‎‎‏‏‎‎‏‏‎‏‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‏‎‎To switch between services, swipe up with three fingers and hold.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎‏‏‏‏‎‏‏‎‎‏‏‎‏‏‏‎‏‎‏‎‎‎‎‏‎‏‏‎‏‎‏‏‏‎‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‎‏‎Magnification‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‎‎‏‎‏‎‏‎‏‎‎‏‏‎‎‎‏‏‎‏‎‎‏‎‎‏‏‏‎‏‏‏‏‎‏‏‏‎‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎Current user ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‎‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‎‏‎‏‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‏‏‏‎Switching to ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎…‎‏‎‎‏‎" diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 96e358015889..e733a50dde72 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -131,6 +131,7 @@ "Llamada por Wi-Fi de %s" + "Llamada por Wi-Fi de %s" "Llamada por WLAN" "Llamada por WLAN de %s" "Wi-Fi de %s" @@ -1611,8 +1612,6 @@ "Superposición #%1$d" "%1$s: %2$d x %3$d, %4$d ppp" ", segura" - "En las próximas compilaciones de Q, se bloqueará el inicio de la actividad en segundo plano de %1$s. Consulta g.co/dev/bgblock." - "Se bloqueó el inicio de la actividad en segundo plano de %1$s. Consulta g.co/dev/bgblock." "¿Olvidaste el patrón?" "Patrón incorrecto" "Contraseña incorrecta" @@ -1666,8 +1665,12 @@ "El acceso directo de accesibilidad activó %1$s" "El acceso directo de accesibilidad desactivó %1$s" "Mantén presionadas ambas teclas de volumen durante tres segundos para usar %1$s" - "Elige una función para usar cuando presionas el botón Accesibilidad:" - "Para cambiar funciones, mantén presionado el botón Accesibilidad." + "Elige un servicio para usar cuando presiones el botón de accesibilidad:" + "Elige un servicio para usar cuando realices el gesto de accesibilidad (deslizar dos dedos hacia arriba desde la parte inferior de la pantalla):" + "Elige un servicio para usar cuando realices el gesto de accesibilidad (deslizar tres dedos hacia arriba desde la parte inferior de la pantalla):" + "Para cambiar de servicio, mantén presionado el botón de accesibilidad." + "Para cambiar de servicio, desliza dos dedos hacia arriba y mantén presionado." + "Para cambiar de servicio, desliza tres dedos hacia arriba y mantén presionado." "Ampliación" "Usuario actual: %1$s" "Cambiando a %1$s…" diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 0e4108cad1fc..277a5e8e0ace 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -131,6 +131,7 @@ "Llamada por Wi‑Fi de %s" + "%s Llamada por Wi‑Fi" "Llamada por WLAN" "Llamada por WLAN de %s" "Wi‑Fi de %s" @@ -1611,8 +1612,6 @@ "Superposición #%1$d" "%1$s: %2$d x %3$d, %4$d dpi" ", seguro" - "El inicio de la actividad en segundo plano de %1$s se bloqueará en las próximas compilaciones de Q. Accede a g.co/dev/bgblock." - "Se ha bloqueado el inicio de la actividad en segundo plano de %1$s. Accede a g.co/dev/bgblock." "¿Has olvidado el patrón?" "El patrón es incorrecto" "Contraseña incorrecta" @@ -1666,8 +1665,12 @@ "El acceso directo a accesibilidad ha activado %1$s" "El acceso directo a accesibilidad ha desactivado %1$s" "Para utilizar %1$s, mantén pulsadas ambas teclas de volumen durante 3 segundos" - "Selecciona la función que se utilizará cuando toques el botón Accesibilidad:" - "Para cambiar las funciones, mantén pulsado el botón Accesibilidad." + "Selecciona el servicio que se utilizará cuando toques el botón Accesibilidad:" + "Elige el servicio que se utilizará con el gesto de accesibilidad (desliza dos dedos hacia arriba desde la parte inferior de la pantalla):" + "Elige el servicio que se utilizará con el gesto de accesibilidad (desliza tres dedos hacia arriba desde la parte inferior de la pantalla):" + "Para cambiar de un servicio a otro, mantén pulsado el botón de accesibilidad." + "Para cambiar de un servicio a otro, desliza dos dedos hacia arriba y mantén pulsada la pantalla." + "Para cambiar de un servicio a otro, desliza tres dedos hacia arriba y mantén pulsada la pantalla." "Ampliar" "Usuario actual: %1$s" "Cambiando a %1$s…" diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index b447922d2b90..06bffd19f03f 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -131,6 +131,7 @@ "%s: WiFi-kõned" + "%s: WiFi-kõned" "WLAN-kõne" "%s: WLAN-kõne" "%s: WiFi" @@ -1611,8 +1612,6 @@ "Ülekate nr .%1$d" "%1$s: %2$d x %3$d, %4$d dpi" ", turvaline" - "See taustategevuse käivitamine paketist %1$s blokeeritakse tulevaste Q järkude puhul. Vt g.co/dev/bgblock." - "Taustategevuse käivitamine paketist %1$s blokeeriti. Vt g.co/dev/bgblock." "Unustasin mustri" "Vale muster" "Vale parool" @@ -1666,8 +1665,12 @@ "Juurdepääsetavuse otsetee lülitas teenuse %1$s sisse" "Juurdepääsetavuse otsetee lülitas teenuse %1$s välja" "Teenuse %1$s kasutamiseks hoidke kolm sekundit all mõlemat helitugevuse klahvi" - "Valige, millist funktsiooni kasutada, kui vajutate nuppu Juurdepääsetavus:" - "Funktsioonide muutmiseks puudutage pikalt nuppu Juurdepääsetavus." + "Valige, millist teenust kasutada, kui puudutate juurdepääsetavuse nuppu:" + "Valige, millist teenust kasutada koos juurdepääsetavuse liigutusega (pühkige kahe sõrmega ekraanikuval alt üles):" + "Valige, millist teenust kasutada koos juurdepääsetavuse liigutusega (pühkige kolme sõrmega ekraanikuval alt üles):" + "Teenuste vahel vahetamiseks vajutage pikalt juurdepääsetavuse nuppu." + "Teenuste vahel vahetamiseks pühkige kahe sõrmega üles ja hoidke." + "Teenuste vahel vahetamiseks pühkige kolme sõrmega üles ja hoidke." "Suurendus" "Praegune kasutaja %1$s." "Üleminek kasutajale %1$s ..." diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 0e8e66b14422..f0a6ccf7711f 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi bidezko deiak" + "%s operadorearen wifi bidezko deiak" "WLAN bidezko deia" "%s WLAN bidezko deia" "%s wifia" @@ -1545,8 +1546,8 @@ "Barneko biltegiratze partekatua" "SD txartela" "%s SD txartela" - "USB unitatea" - "%s USB unitatea" + "USB bidezko unitatea" + "%s enpresaren USB bidezko unitatea" "USB memoria" "Editatu" "Datuen erabileraren abisua" @@ -1612,8 +1613,6 @@ "%1$d. gainjartzea" "%1$s: %2$d x %3$d, %4$d dpi" ", segurua" - "%1$s paketearen atzeko planoko jardueraren abio hau blokeatu egingo da Q bertsioaren etorkizuneko konpilazioetan. Joan g.co/dev/bgblock helbidera." - "Blokeatu da %1$s paketearen atzeko planoko jardueraren abioa. Joan g.co/dev/bgblock helbidera." "Eredua ahaztu zaizu" "Eredu okerra" "Pasahitz okerra" @@ -1667,8 +1666,12 @@ "Erabilerraztasun-lasterbideak %1$s aktibatu du" "Erabilerraztasun-lasterbideak %1$s desaktibatu du" "%1$s erabiltzeko, eduki sakatuta bolumen-tekla biak hiru segundoz" - "Aukeratu zein eginbide erabili nahi duzun Erabilerraztasuna botoia sakatzean:" - "Eginbideak aldatzeko, eduki sakatuta Erabilerraztasuna botoia." + "Aukeratu zer zerbitzu erabili nahi duzun Erabilerraztasuna botoia sakatzean:" + "Aukeratu zer zerbitzu erabili nahi duzun erabilerraztasun-keinua egitean (hau da, bi hatz pantailaren behealdetik gora pasatuz gero):" + "Aukeratu zer zerbitzu erabili nahi duzun erabilerraztasun-keinua egitean (hau da, hiru hatz pantailaren behealdetik gora pasatuz gero):" + "Zerbitzu batetik bestera aldatzeko, eduki sakatuta Erabilerraztasuna botoia." + "Zerbitzu batetik bestera aldatzeko, pasatu bi hatz pantailaren behealdetik gora eta eduki sakatuta une batez." + "Zerbitzu batetik bestera aldatzeko, pasatu hiru hatz pantailaren behealdetik gora eta eduki sakatuta une batez." "Lupa" "Uneko erabiltzailea: %1$s." "%1$s erabiltzailera aldatzen…" diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 17604d0e637f..6d4181dd7b44 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -131,6 +131,7 @@ "‏تماس ازطریق Wi-Fi %s" + "‏تماس Wi‑Fi %s" "‏تماس ازطریق WLAN" "‏تماس ازطریق WLAN %s" "Wi-Fi %s" @@ -1611,8 +1612,6 @@ "هم‌پوشانی #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" "، امن" - "‏شروع فعالیت پس‌زمینه%1$s در نسخه‌های Q آینده مسدود خواهد شد. به g.co/dev/bgblock مراجعه کنید." - "‏شروع فعالیت پس‌زمینه %1$s مسدود شده است. به g.co/dev/bgblock مراجعه کنید." "الگو را فراموش کرده‌اید" "الگوی اشتباه" "گذرواژه اشتباه" @@ -1666,8 +1665,12 @@ "«میان‌بر دسترس‌پذیری» %1$s را روشن کرد" "«میان‌بر دسترس‌پذیری» %1$s را خاموش کرد" "برای استفاده از %1$s، هر دو کلید صدا را فشار دهید و سه ثانیه نگه دارید" - "قابلیتی را انتخاب کنید که هنگام ضربه زدن روی دکمه «دسترس‌پذیری» استفاده می‌شود:" - "برای تغییر دادن قابلیت‌ها، دکمه «دسترس‌پذیری» را لمس کنید و نگه‌دارید." + "سرویسی را انتخاب کنید که هنگام ضربه زدن روی دکمه دسترس‌پذیری استفاده می‌شود:" + "سرویسی را برای استفاده با اشاره دسترس‌پذیری انتخاب کنید (با دو انگشت صفحه را از پایین تند به بالا بکشید):" + "سرویسی را برای استفاده با اشاره دسترس‌پذیری انتخاب کنید (با سه انگشت صفحه را از پایین تند به بالا بکشید):" + "برای جابه‌جایی بین سرویس‌ها، دکمه دسترس‌پذیری را لمس کنید و نگه‌دارید." + "برای جابه‌جایی بین سرویس‌ها، با دو انگشت صفحه را تند به بالا بکشید و نگه‌دارید." + "برای جابه‌جایی بین سرویس‌ها، با سه انگشت صفحه را تند به بالا بکشید و نگه‌دارید." "درشت‌نمایی" "کاربر کنونی %1$s." "در حالت تغییر به %1$s…" diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index b51bb81f1f73..9b4c5e456064 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -131,6 +131,7 @@ "Wi-Fi-puhelut (%s)" + "%s Wi-Fi-puhelut" "WLAN-puhelu" "WLAN-puhelu (%s)" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "Peittokuva # %1$d" "%1$s: %2$d x %3$d, %4$d dpi" ", suojattu" - "Tämä taustatoiminnan käynnistys kohteesta %1$s estetään tulevissa Q-versioissa. Siirry osoitteeseen g.co/dev/bgblock." - "Taustatoiminnan käynnistys kohteesta %1$s estettiin. Siirry osoitteeseen g.co/dev/bgblock." "Unohtunut kuvio" "Väärä kuvio" "Väärä salasana" @@ -1666,8 +1665,12 @@ "%1$s otettiin käyttöön esteettömyystilan pikanäppäimellä." "%1$s poistettiin käytöstä esteettömyystilan pikanäppäimellä." "Voit käyttää palvelua %1$s painamalla molempia äänenvoimakkuuspainikkeita kolmen sekunnin ajan" - "Valitse toiminto, jonka Esteettömyys-painike aktivoi:" - "Jos haluat muokata ominaisuuksia, kosketa Esteettömyys-painiketta pitkään." + "Valitse palvelu, jonka esteettömyyspainike aktivoi:" + "Valitse palvelu, jota käytetään esteettömyyseleellä (pyyhkäise näytön alalaidasta ylös kahdella sormella):" + "Valitse palvelu, jota käytetään esteettömyyseleellä (pyyhkäise näytön alalaidasta ylös kolmella sormella):" + "Vaihda palveluiden välillä painamalla painiketta pitkään." + "Vaihda palveluiden välillä pyyhkäisemällä ylös kahdella sormella ja koskettamalla pitkään." + "Vaihda palveluiden välillä pyyhkäisemällä ylös kolmella sormella ja koskettamalla pitkään." "Suurennus" "Nykyinen käyttäjä: %1$s." "Vaihdetaan käyttäjään %1$s…" diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index a24756b3c07b..de74cd70787c 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -131,6 +131,7 @@ "Appels Wi-Fi %s" + "Appels Wi-Fi : %s" "Appel WLAN" "Appel WLAN %s" "Wi-Fi %s" @@ -1611,8 +1612,6 @@ "Superposition n° %1$d" "%1$s : %2$d x %3$d, %4$d ppp" ", sécurisé" - "Ce lancement d\'activité en arrière-plan par %1$s sera bloqué dans les versions futures de Q. Consultez la page g.co/dev/bgblock." - "Le lancement d\'une activité en arrière-plan par %1$s a été bloqué. Consultez la page g.co/dev/bgblock." "J\'ai oublié le schéma" "Schéma incorrect." "Mot de passe incorrect." @@ -1666,8 +1665,12 @@ "Le raccourci d\'accessibilité a activé la fonction %1$s" "Le raccourci d\'accessibilité a désactivé la fonction %1$s" "Maintenez enfoncées les deux touches de volume pendant trois secondes pour utiliser %1$s" - "Choisissez une fonctionnalité à utiliser lorsque vous touchez le bouton d\'accessibilité :" - "Pour changer des fonctionnalités, maintenez le doigt sur le bouton d\'accessibilité." + "Choisissez un service à utiliser lorsque vous touchez le bouton d\'accessibilité :" + "Choisissez un service à utiliser lorsque vous utilisez le geste d\'accessibilité (balayer deux doigts du bas de l\'écran vers le haut) :" + "Choisissez un service à utiliser lorsque vous utilisez le geste d\'accessibilité (balayer trois doigts du bas de l\'écran vers le haut) :" + "Pour basculer entre les services, maintenez le doigt sur le bouton d\'accessibilité." + "Pour basculer entre les services, balayez deux doigts vers le haut et maintenez-les sur l\'écran." + "Pour basculer entre les services, balayez trois doigts vers le haut et maintenez-les sur l\'écran." "Zoom" "Utilisateur actuel : %1$s" "Changement d\'utilisateur (%1$s) en cours…" diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index e78ceda1e6c7..b62619eab5ef 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -131,6 +131,7 @@ "Appels Wi-Fi %s" + "Appels Wi-Fi %s" "Appel WLAN" "Appel WLAN %s" "Wi-Fi %s" @@ -1611,8 +1612,6 @@ "Superposition n° %1$d" "%1$s : %2$d x %3$d, %4$d dpi" ", sécurisé" - "Le démarrage de cette activité en arrière-plan de %1$s sera bloqué dans les prochaines builds Q. Consultez g.co/dev/bgblock." - "Le démarrage de l\'activité en arrière-plan de %1$s a été bloqué. Consultez g.co/dev/bgblock." "J\'ai oublié le schéma" "Schéma incorrect." "Mot de passe incorrect." @@ -1666,8 +1665,12 @@ "Le raccourci d\'accessibilité a activé %1$s" "Le raccourci d\'accessibilité a désactivé %1$s" "Appuyez de manière prolongée sur les deux touches de volume pendant trois secondes pour utiliser %1$s" - "Choisissez une fonctionnalité à utiliser lorsque vous appuyez sur le bouton Accessibilité :" - "Pour changer de fonctionnalités, appuyez de manière prolongée sur le bouton Accessibilité." + "Choisissez un service à utiliser lorsque vous appuyez sur le bouton Accessibilité :" + "Choisissez un service à utiliser avec le geste d\'accessibilité (balayez l\'écran de bas en haut avec deux doigts) :" + "Choisissez un service à utiliser avec le geste d\'accessibilité (balayez l\'écran de bas en haut avec trois doigts) :" + "Pour changer de service, appuyez de manière prolongée sur le bouton Accessibilité." + "Pour changer de service, balayez l\'écran vers le haut avec deux doigts et appuyez de manière prolongée." + "Pour changer de service, balayez l\'écran vers le haut avec trois doigts et appuyez de manière prolongée." "Agrandissement" "Utilisateur actuel : %1$s" "Chargement du profil de %1$s..." diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index f740edfec0b5..bb75dc46a696 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -131,6 +131,7 @@ "Chamadas por wifi de %s" + "Chamadas por wifi con %s" "Chamada por WLAN" "Chamada por WLAN de %s" "Wifi de %s" @@ -1612,8 +1613,6 @@ "Superposición n.º %1$d" "%1$s: %2$d x %3$d, %4$d ppp" ", segura" - "O inicio desta actividade en segundo plano desde %1$s bloquearase en futuras compilacións de Q. Consulta g.co/dev/bgblock." - "Bloqueouse o inicio da actividade en segundo plano desde %1$s. Consulta g.co/dev/bgblock." "Esqueciches o padrón" "Padrón incorrecto" "Contrasinal incorrecto" @@ -1667,8 +1666,12 @@ "O atallo de accesibilidade activou %1$s" "O atallo de accesibilidade desactivou %1$s" "Mantén premidas as teclas do volume durante tres segudos para usar %1$s" - "Escolle que función queres utilizar cando toques o botón Accesibilidade:" - "Para cambiar as funcións, mantén premido o botón Accesibilidade." + "Escolle o servizo que queres utilizar cando toques o botón de accesibilidade:" + "Escolle o servizo que queres usar co xesto de accesibilidade (pasa dous dedos cara arriba desde a parte inferior da pantalla):" + "Escolle o servizo que queres usar co xesto de accesibilidade (pasa tres dedos cara arriba desde a parte inferior da pantalla):" + "Para cambiar de servizo, mantén premido o botón de accesibilidade." + "Para cambiar de servizo, pasa dous dedos cara arriba e mantén premida a pantalla." + "Para cambiar de servizo, pasa tres dedos cara arriba e mantén premida a pantalla." "Ampliación" "Usuario actual %1$s." "Cambiando a %1$s…" diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index dc23dcdb276c..e3ac63198b4d 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -131,6 +131,7 @@ "%s વાઇ-ફાઇ કૉલિંગ" + "%s વાઇ-ફાઇ કૉલિંગ" "WLAN કૉલ" "%s WLAN કૉલ" "%s વાઇ-ફાઇ" @@ -1612,8 +1613,6 @@ "#%1$d ઓવરલે કરો" "%1$s: %2$dx%3$d, %4$d dpi" ", સુરક્ષિત" - "%1$sમાંથી શરૂ થયેલી આ બૅકગ્રાઉન્ડ પ્રવૃત્તિને ભાવિ Q બિલ્ડમાં બ્લૉક કરવામાં આવશે. g.co/dev/bgblock જુઓ." - "%1$sમાંથી શરૂ થયેલી બૅકગ્રાઉન્ડ પ્રવૃત્તિ બ્લૉક કરી છે. g.co/dev/bgblock જુઓ." "પૅટર્ન ભૂલી ગયાં" "ખોટી પૅટર્ન" "ખોટો પાસવર્ડ" @@ -1667,8 +1666,12 @@ "ઍક્સેસિબિલિટી શૉર્ટકટે %1$s ચાલુ કરી" "ઍક્સેસિબિલિટી શૉર્ટકટે %1$s બંધ કરી" "%1$sનો ઉપયોગ કરવા માટે બન્ને વૉલ્યૂમ કીને ત્રણ સેકન્ડ સુધી દબાવી રાખો" - "જ્યારે તમે ઍક્સેસિબિલિટી બટન પર ટૅપ કરો, ત્યારે ઉપયોગ કરવાની સુવિધા પસંદ કરો:" - "સુવિધાઓ બદલવા માટે, ઍક્સેસિબિલિટી બટન દબાવી રાખો." + "જ્યારે તમે ઍક્સેસિબિલિટી બટન પર ટૅપ કરો, ત્યારે ઉપયોગ કરવાની સેવા પસંદ કરો:" + "ઍક્સેસિબિલિટી સંકેત સાથે ઉપયોગ કરવાની સેવા પસંદ કરો (બે આંગળીઓ વડે સ્ક્રીનના નીચેના ભાગથી ઉપરની તરફ સ્વાઇપ કરવા માટે):" + "ઍક્સેસિબિલિટી સંકેત સાથે ઉપયોગ કરવાની સેવા પસંદ કરો (ત્રણ આંગળીઓ વડે સ્ક્રીનના નીચેના ભાગથી ઉપરની તરફ સ્વાઇપ કરવા માટે):" + "કોઈ એક સેવાથી બીજી સેવા પર સ્વિચ કરવા માટે, ઍક્સેસિબિલિટી બટનને ટચ કરીને દબાવી રાખો." + "કોઈ એક સેવાથી બીજી સેવા પર સ્વિચ કરવા માટે, બે આંગળીઓ વડે સ્ક્રીનની ઉપરની તરફ સ્વાઇપ કરીને દબાવી રાખો." + "કોઈ એક સેવાથી બીજી સેવા પર સ્વિચ કરવા માટે, ત્રણ આંગળીઓ વડે સ્ક્રીનની ઉપરની તરફ સ્વાઇપ કરીને દબાવી રાખો." "વિસ્તૃતીકરણ" "વર્તમાન વપરાશકર્તા %1$s." "%1$s પર સ્વિચ કરી રહ્યાં છે…" diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 4a4bdf959dda..1afc78801b99 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -131,6 +131,7 @@ "%s वाई-फ़ाई कॉलिंग" + "वाई-फ़ाई के ज़रिए कॉल करते समय %s" "WLAN कॉल" "%s WLAN कॉल" "%s वाई-फ़ाई" @@ -1611,8 +1612,6 @@ "ओवरले #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", सुरक्षित" - "आने वाले Q बिल्ड में %1$s के बैकग्राउंड में गतिविधि शुरू करने पर रोक लगा दी जाएगी. इस बारे में जानने के लिए g.co/dev/bgblock पर जाएं." - "%1$s के बैकग्राउंड में गतिविधि शुरू करने पर रोक लगा दी गई है. इस बारे में जानने के लिए g.co/dev/bgblock पर जाएं." "आकार भूल गए" "गलत पैटर्न डाला गया है" "गलत पासवर्ड" @@ -1666,8 +1665,12 @@ "सुलभता शॉर्टकट ने %1$s को चालू किया" "सुलभता शॉर्टकट ने %1$s को बंद किया" "%1$s इस्तेमाल करने के लिए आवाज़ वाले दोनों बटन तीन सेकंड तक दबाकर रखें" - "सुलभता बटन पर टैप करते समय इस्तेमाल की जाने वाली सुविधा चुनें:" - "सुविधाओं में बदलाव करने के लिए, सुलभता बटन को दबाकर रखें." + "\'सुलभता\' बटन पर टैप करके इस्तेमाल करने के लिए सेवा चुनें:" + "सुलभता वाले जेस्चर के साथ इस्तेमाल करने के लिए सेवा चुनें (दो उंगलियों से स्क्रीन पर सबसे नीचे से ऊपर की ओर स्वाइप करें):" + "सुलभता वाले जेस्चर के साथ इस्तेमाल करने के लिए सेवा चुनें (तीन उंगलियों से स्क्रीन पर सबसे नीचे से ऊपर की ओर स्वाइप करें):" + "एक सेवा से दूसरी सेवा पर जाने के लिए, \'सुलभता\' बटन को कुछ देर दबाकर रखें." + "एक सेवा से दूसरी सेवा पर जाने के लिए, स्क्रीन पर दो उंगलियों से ऊपर की ओर स्वाइप करें और थोड़ी देर तक स्क्रीन पर उंगलियां रखे रहें." + "एक सेवा से दूसरी सेवा पर जाने के लिए, स्क्रीन पर तीन उंगलियों से ऊपर की ओर स्वाइप करें और थोड़ी देर तक स्क्रीन पर उंगलियां रखे रहें." "बड़ा करना" "मौजूदा उपयोगकर्ता %1$s." "%1$s पर स्विच किया जा रहा है…" diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index d68895fac6b7..7eb1699ff752 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -132,6 +132,7 @@ "%s Wi-Fi pozivi" + "%s Wi-Fi pozivi" "Poziv putem WLAN-a" "%s poziv putem WLAN-a" "%s Wi-Fi" @@ -1634,8 +1635,6 @@ "Preklapanje br. %1$d" "%1$s: %2$d x %3$d, %4$d dpi" ", sigurno" - "Pokretanje aktivnosti u pozadini iz aplikacije %1$s blokirat će se u budućim međuverzijama Q. Pogledajte g.co/dev/bgblock." - "Blokirano je pokretanje aktivnosti u pozadini iz aplikacije %1$s. Pogledajte g.co/dev/bgblock." "Zaboravili ste obrazac" "Pogrešan obrazac" "Pogrešna zaporka" @@ -1690,8 +1689,12 @@ "Prečac pristupačnosti uključio je uslugu %1$s" "Prečac pristupačnosti isključio je uslugu %1$s" "Pritisnite i zadržite tipke za glasnoću na tri sekunde da biste koristili uslugu %1$s" - "Odaberite značajku koju ćete upotrebljavati kada dodirnete gumb Pristupačnost:" - "Da biste promijenili značajke, dodirnite i zadržite gumb Pristupačnost." + "Odaberite uslugu koju ćete upotrebljavati kad dodirnete gumb pristupačnosti:" + "Odaberite uslugu koju ćete upotrebljavati uz pokret pristupačnosti (prelazak s dva prsta prema gore od dna zaslona):" + "Odaberite uslugu koju ćete upotrebljavati uz pokret pristupačnosti (prelazak s tri prsta prema gore od dna zaslona):" + "Da biste prešli na neku drugu uslugu, dodirnite i zadržite gumb pristupačnosti." + "Da biste prešli na neku drugu uslugu, prijeđite s dva prsta prema gore i zadržite." + "Da biste prešli na neku drugu uslugu, prijeđite s tri prsta prema gore i zadržite." "Povećavanje" "Trenutačni korisnik %1$s." "Prebacivanje na korisnika %1$s…" diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 98c93f6cdbe4..f52ee89fcf32 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi-hívás" + "%s Wi‑Fi-hívás" "WLAN-hívás" "%s WLAN-hívás" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "%1$d. fedvény" "%1$s: %2$d x %3$d, %4$d képpont" ", biztonságos" - "Ez a háttértevékenység-indítás le lesz tiltva a(z) %1$s számára a jövőbeni Q-buildeknél. Lásd: g.co/dev/bgblock." - "A(z) %1$s számára le van tiltva a háttértevékenységek indítása. Lásd: g.co/dev/bgblock." "Elfelejtett minta" "Helytelen minta" "Helytelen jelszó" @@ -1666,8 +1665,12 @@ "A Kisegítő lehetőségek gyorsparancsa bekapcsolta a következő szolgáltatást: %1$s" "A Kisegítő lehetőségek gyorsparancsa kikapcsolta a következő szolgáltatást: %1$s" "A(z) %1$s használatához tartsa lenyomva három másodpercig a két hangerőgombot" - "Válassza ki a Kisegítő lehetőségek gombra koppintáskor használni kívánt funkciót:" - "A funkciók módosításához tartsa lenyomva a Kisegítő lehetőségek gombot." + "Válassza ki a kisegítő lehetőségek gombra koppintáskor használni kívánt szolgáltatást:" + "Válassza ki a kisegítő kézmozdulattal használni kívánt szolgáltatást (csúsztassa felfelé két ujját a képernyő aljáról):" + "Válassza ki a kisegítő kézmozdulattal használni kívánt szolgáltatást (csúsztassa felfelé három ujját a képernyő aljáról):" + "A szolgáltatások közötti váltáshoz tartsa lenyomva a kisegítő lehetőségek gombot." + "A szolgáltatások közötti váltáshoz csúsztassa felfelé két ujját, és ne engedje el a képernyőt." + "A szolgáltatások közötti váltáshoz csúsztassa felfelé három ujját, és ne engedje el a képernyőt." "Nagyítás" "%1$s az aktuális felhasználó." "Átváltás erre: %1$s..." diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 5008bda423fa..1e70ad026163 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi-ի միջոցով զանգեր" + "%s Զանգեր Wi-Fi-ի միջոցով" "Զանգ WLAN ցանցով" "%s WLAN ցանցով զանգեր" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "Վերածածկ #%1$d" "%1$s. %2$dx%3$d, %4$d կմվ" ", անվտանգ" - "%1$s հավելվածի գործողությունները ֆոնային ռեժիմում կարգելափակվեն Android Q-ի հաջորդ կառուցումներում։ Մանրամասն տեղեկություններ կարող եք գտնել g.co/dev/bgblock էջում։" - "%1$s հավելվածի գործողությունները ֆոնային ռեժիմում արգելափակվեցին։ Մանրամասն տեղեկություններ կարող եք գտնել g.co/dev/bgblock էջում։" "Մոռացել եմ սխեման" "Սխալ սխեմա" "Սխալ գաղտնաբառ" @@ -1666,8 +1665,12 @@ "Մատչելիության դյուրանցումն միացրել է %1$s ծառայությունը" "Մատչելիության դյուրանցումն անջատել է %1$s ծառայությունը" %1$s» ծառայությունն օգտագործելու համար սեղմեք և 3 վայրկյան պահեք ձայնի ուժգնության երկու կոճակները" - "Ընտրեք որևէ գործառույթ, որը կօգտագործվի Հատուկ գործառույթներ կոճակին հպելու դեպքում՝" - "Գործառույթները փոխելու համար հպեք և պահեք Հատուկ գործառույթներ կոճակը։" + "Ընտրեք գործառույթ, որը կգործարկվի «Հատուկ գործառույթներ» կոճակին հպելու դեպքում՝" + "Ընտրեք գործառույթ, որը կգործարկվի հատուկ գործառույթների ժեստն անելու դեպքում (երկու մատը էկրանի ներքևից սահեցրեք վերև)՝" + "Ընտրեք գործառույթ, որը կգործարկվի հատուկ գործառույթների ժեստն անելու դեպքում (երեք մատը էկրանի ներքևից սահեցրեք վերև)՝" + "Մեկ գործառույթից մյուսն անցնելու համար հպեք «Հատուկ գործառույթներ» կոճակին և պահեք:" + "Մեկ գործառույթից մյուսն անցնելու համար երկու մատը սահեցրեք վերև և պահեք:" + "Մեկ գործառույթից մյուսն անցնելու համար երեք մատը սահեցրեք վերև և պահեք:" "Խոշորացում" "Ներկայիս օգտատերը %1$s:" "Փոխարկվում է %1$s-ին..." diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 0908926a793c..4bebc3ec50f8 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -131,6 +131,7 @@ "Panggilan Wi-Fi %s" + "Panggilan Wi-Fi %s" "Panggilan WLAN" "Panggilan WLAN %s" "Wi-Fi %s" @@ -1611,8 +1612,6 @@ "Hamparan #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", aman" - "Aktivitas latar belakang yang dimulai dari %1$s akan diblokir di build Q di masa mendatang. Lihat g.co/dev/bgblock." - "Aktivitas latar belakang yang dimulai dari %1$s diblokir. Lihat g.co/dev/bgblock." "Lupa Pola?" "Pola Salah" "Sandi Salah" @@ -1666,8 +1665,12 @@ "Pintasan Aksesibilitas mengaktifkan %1$s" "Pintasan Aksesibilitas menonaktifkan %1$s" "Tekan dan tahan kedua tombol volume selama tiga detik untuk menggunakan %1$s" - "Pilih fitur yang akan digunakan saat menge-tap tombol Aksesibilitas:" - "Untuk mengubah fitur, sentuh & tahan tombol Aksesibilitas." + "Pilih layanan yang akan digunakan saat menge-tap tombol aksesibilitas:" + "Pilih layanan yang akan digunakan dengan gestur aksesibilitas (geser ke atas dari bawah layar dengan dua jari):" + "Pilih layanan yang akan digunakan dengan gestur aksesibilitas (geser ke atas dari bawah layar dengan tiga jari):" + "Sentuh & tahan tombol aksesibilitas untuk beralih layanan." + "Geser dengan dua jari dan tahan untuk beralih layanan." + "Geser ke atas dengan tiga jari dan tahan untuk beralih layanan." "Pembesaran" "Pengguna saat ini %1$s." "Beralih ke %1$s…" diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index faf065e5923f..f647c1db10ad 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi símtöl" + "Wi-Fi símtöl með %s" "WLAN-símtal" "%s WLAN-símtal" "%s Wi-Fi" @@ -1612,8 +1613,6 @@ "Yfirlögn #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", öruggur" - "Framvegis verður lokað á þessa bakgrunnsvirkni frá %1$s í Q-smíði. Sjá g.co/dev/bgblock." - "Lokað á bakgrunnsvirkni frá %1$s. Sjá g.co/dev/bgblock." "Man ekki mynstrið" "Rangt mynstur" "Rangt aðgangsorð" @@ -1667,8 +1666,12 @@ "Flýtileið aðgengisstillingar kveikti á %1$s" "Flýtileið aðgengisstillingar slökkti á %1$s" "Haltu báðum hljóðstyrkstökkunum inni í þrjár sekúndur til að nota %1$s" - "Veldu eiginleika sem á að nota þegar ýtt er á aðgengishnappinn:" - "Haltu fingri á aðgengishnappinum til að breyta eiginleikum." + "Veldu þjónustu sem á að nota þegar ýtt er á aðgengishnappinn:" + "Veldu þjónustu sem á að nota með aðgengisbendingunni (strjúka upp frá neðri hluta skjásins með tveimur fingrum):" + "Veldu þjónustu sem á að nota með aðgengisbendingunni (strjúka upp frá neðri hluta skjásins með þremur fingrum):" + "Til að skipta á milli þjónusta skaltu halda aðgengishnappinum inni." + "Til að skipta á milli þjónusta skaltu strjúka upp með tveimur fingrum og halda inni." + "Til að skipta á milli þjónusta skaltu strjúka upp með þremur fingrum og halda inni." "Stækkun" "Núverandi notandi %1$s." "Skiptir yfir á %1$s…" diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index e54d305e3738..650ff56e6ad8 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -131,6 +131,7 @@ "Chiamate Wi-Fi %s" + "Chiamate Wi-Fi %s" "Chiamata WLAN" "Chiamata WLAN %s" "Wi-Fi %s" @@ -1611,8 +1612,6 @@ "Overlay n. %1$d" "%1$s: %2$d x %3$d, %4$d dpi" ", opzione sicura" - "L\'avvio di questa attività in background da %1$s verrà bloccato nelle future build Q. Visita la pagina g.co/dev/bgblock." - "Avvio delle attività in background da %1$s bloccato. Visita la pagina g.co/dev/bgblock." "Sequenza dimenticata" "Sequenza sbagliata" "Password sbagliata" @@ -1666,8 +1665,12 @@ "La scorciatoia Accessibilità ha attivato %1$s" "La scorciatoia Accessibilità ha disattivato %1$s" "Tieni premuti entrambi i tasti del volume per tre secondi per utilizzare %1$s" - "Scegli una funzione da usare quando tocchi il pulsante Accessibilità:" - "Per cambiare le funzioni, tocca e tieni premuto il pulsante Accessibilità." + "Scegli un servizio da usare quando tocchi il pulsante Accessibilità:" + "Scegli un servizio da usare con il gesto di accessibilità (scorrimento verso l\'alto dalla parte inferiore dello schermo con due dita):" + "Scegli un servizio da usare con il gesto di accessibilità (scorrimento verso l\'alto dalla parte inferiore dello schermo con tre dita):" + "Per spostarti tra i servizi, tocca e tieni premuto il pulsante Accessibilità." + "Per spostarti tra i servizi, scorri verso l\'alto con due dita e tieni premuto." + "Per spostarti tra i servizi, scorri verso l\'alto con tre dita e tieni premuto." "Ingrandimento" "Utente corrente %1$s." "Passaggio a %1$s…" diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 3bec6d0f11b1..1998afe7d0ac 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -133,6 +133,7 @@ "‏שיחות Wi-Fi %s" + "‏שיחות Wi-Fi באמצעות %s" "שיחה ברשת אלחוטית" "‏שיחת WLAN %s" "Wi-Fi %s" @@ -1657,8 +1658,6 @@ "שכבת-על #%1$d" "‏%1$s: ‎%2$dx%3$d‎, ‏%4$d dpi" ", מאובטח" - "‏התחלה זו של פעילות ברקע מ-%1$s תיחסם בגרסאות build עתידיות של Q. ניתן לעיין בכתובת g.co/dev/bgblock." - "‏נחסמה התחלה של פעילות ברקע מ-%1$s. ניתן לעיין בכתובת g.co/dev/bgblock." "שכחת את קו ביטול הנעילה?" "קו ביטול נעילה שגוי" "סיסמה שגויה" @@ -1714,8 +1713,12 @@ "%1$s הופעל על-ידי קיצור הדרך לנגישות" "%1$s הושבת על-ידי קיצור הדרך לנגישות" "יש ללחוץ לחיצה ארוכה על שני לחצני עוצמת הקול למשך שלוש שניות כדי להשתמש בשירות %1$s" - "בחר תכונה שתופעל כשתלחץ על הלחצן \'נגישות\':" - "כדי להחליף תכונה, יש ללחוץ לחיצה ארוכה על הלחצן \'נגישות\'." + "יש לבחור שירות שיופעל באמצעות הקשה על לחצן הנגישות:" + "יש לבחור שירות שיופעל באמצעות תנועת הנגישות (החלקה למעלה מתחתית המסך בעזרת שתי אצבעות):" + "יש לבחור שירות שיופעל באמצעות תנועת הנגישות (החלקה למעלה מתחתית המסך בעזרת שלוש אצבעות):" + "כדי לעבור בין שירותים, יש ללחוץ לחיצה ארוכה על לחצן הנגישות." + "כדי לעבור בין שירותים, יש להחליק כלפי מעלה בעזרת שתי אצבעות ולהחזיק." + "כדי לעבור בין שירותים, יש להחליק כלפי מעלה בעזרת שלוש אצבעות ולהחזיק." "הגדלה" "המשתמש הנוכחי %1$s." "עובר אל %1$s…" diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 439c64e442ca..dfb1f57705c1 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi 通話" + "%s Wi-Fi 通話" "WLAN 通話" "%s WLAN 通話" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "オーバーレイ第%1$d" "%1$s: %2$dx%3$d%4$d dpi" "、セキュア" - "%1$s からのこのバックグラウンド アクティビティの開始は今後の Q ビルドではブロックされます。g.co/dev/bgblock をご覧ください。" - "%1$s からのバックグラウンド アクティビティの開始がブロックされました。g.co/dev/bgblock をご覧ください。" "パターンを忘れた場合" "パターンが正しくありません" "パスワードが正しくありません" @@ -1666,8 +1665,12 @@ "ユーザー補助機能のショートカットにより %1$s は ON になっています" "ユーザー補助機能のショートカットにより %1$s は OFF になっています" "%1$s を使用するには、音量大と音量小の両方のボタンを 3 秒間長押ししてください" - "ユーザー補助機能ボタンをタップした場合に使用する機能を選択してください。" - "機能を変更するには、ユーザー補助機能ボタンを長押ししてください。" + "ユーザー補助機能ボタンをタップした場合に使用するサービスを選択してください。" + "ユーザー補助操作(2 本の指で画面の下から上にスワイプ)で使用するサービスを選択してください。" + "ユーザー補助操作(3 本の指で画面の下から上にスワイプ)で使用するサービスを選択してください。" + "サービスを切り替えるには、ユーザー補助機能ボタンを長押しします。" + "サービスを切り替えるには、2 本の指で上にスワイプしたまま長押しします。" + "サービスを切り替えるには、3 本の指で上にスワイプしたまま長押しします。" "拡大" "現在のユーザーは%1$sです。" "%1$sに切り替えています…" diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 2856d0398632..f1f47a68654e 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi დარეკვა" + "%s Wi-Fi დარეკვა" "WLAN ზარი" "%s WLAN ზარი" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "გადაფარვა #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", დაცული" - "%1$s-დან ამ ფონური აქტივობის გაშვება დაიბლოკება Q-ის მომდევნო ანაწყობებში. იხილეთ g.co/dev/bgblock." - "%1$s-დან ფონური აქტივობის გაშვება დაიბლოკა. იხილეთ g.co/dev/bgblock." "დაგავიწყდათ ნიმუში" "არასწორი ნიმუში" "არასწორი პაროლი" @@ -1666,8 +1665,12 @@ "მარტივი წვდომის მალსახმობმა ჩართო %1$s" "მარტივი წვდომის მალსახმობმა გამორთო %1$s" "%1$s რომ გამოიყენოთ, დააჭირეთ ხმის ორივე ღილაკზე 3 წამის განმავლობაში" - "აირჩიეთ მარტივი წვდომის ღილაკზე შეხებისას გამოსაყენებელი ფუნქცია:" - "ფუნქციების შესაცვლელად ხანგრძლივად შეეხეთ მარტივი წვდომის ღილაკს." + "აირჩიეთ მარტივი წვდომის ღილაკზე შეხებისას გამოსაყენებელი სერვისი:" + "აირჩიეთ მარტივი წვდომის ჟესტთან (ორი თითით გადაფურცვლა ეკრანის ქვედა კიდიდან ზემოთ) გამოსაყენებელი სერვისი:" + "აირჩიეთ მარტივი წვდომის ჟესტთან (სამი თითით გადაფურცვლა ეკრანის ქვედა კიდიდან ზემოთ) გამოსაყენებელი სერვისი:" + "სერვისების გადასართავად, ხანგრძლივად შეეხეთ მარტივი წვდომის ღილაკს." + "სერვისების გადასართავად, ორი თითით გადაფურცლეთ ზემოთ და დააყოვნეთ." + "სერვისების გადასართავად, სამი თითით გადაფურცლეთ ზემოთ და დააყოვნეთ." "გადიდება" "ამჟამინდელი მომხმარებელი %1$s." "%1$s-ზე გადართვა…" diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 09d2c9bf2a5d..88a8087fb66b 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi қоңыраулары" + "%s Wi-Fi қоңырауы" "WLAN қоңырауы" "%s WLAN қоңырауы" "%s Wi-Fi" @@ -1612,8 +1613,6 @@ "№%1$d қабаттама" "%1$s: %2$dx%3$d, %4$d dpi" ", қауіпсіз" - "Алдағы Q құрамаларында %1$s сайтындағы фондық әрекеттерге тыйым салынады. g.co/dev/bgblock бетін қараңыз." - "%1$s сайтындағы фондық әрекеттерге тыйым салынған. g.co/dev/bgblock бетін қараңыз." "Кескінді ұмытып қалу" "Қате өрнек" "Қате кілтсөз" @@ -1667,8 +1666,12 @@ "Арнайы мүмкіндіктер таңбашасы %1$s қызметін қосты" "Арнайы мүмкіндіктер таңбашасы %1$s қызметін өшірді" "%1$s қызметін пайдалану үшін дыбыс деңгейін реттейтін екі түймені де 3 секунд басып тұрыңыз" - "\"Арнайы мүмкіндіктер\" түймесін түрткенде пайдаланатын мүмкіндікті таңдаңыз:" - "Мүмкіндіктерді өзгерту үшін \"Арнайы мүмкіндіктер\" түймесін басып тұрыңыз." + "\"Арнайы мүмкіндіктер\" түймесін түрткенде пайдаланатын қызметті таңдаңыз:" + "Арнайы мүмкіндіктер қимылымен пайдаланатын қызметті таңдаңыз (екі саусақпен экранның төменгі жағынан жоғары қарай сырғытыңыз):" + "Арнайы мүмкіндіктер қимылымен пайдаланатын қызметті таңдаңыз (үш саусақпен экранның төменгі жағынан жоғары қарай сырғытыңыз):" + "Бір қызметтен екінші қызметке ауысу үшін арнайы мүмкіндіктер түймесін түртіп, оны ұстап тұрыңыз." + "Бір қызметтен екінші қызметке ауысу үшін екі саусақпен жоғары қарай сырғытып, ұстап тұрыңыз." + "Бір қызметтен екінші қызметке ауысу үшін үш саусақпен жоғары қарай сырғытып, ұстап тұрыңыз." "Ұлғайту" "Ағымдағы пайдаланушы %1$s." "%1$s ауысу орындалуда…" diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index d70469aa0fa5..3440ee686f18 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -131,6 +131,7 @@ "%s ការហៅតាម Wi-Fi" + "%s ការហៅ​តាម Wi-Fi" "ការហៅ​តាម WLAN" "%s ការហៅតាម WLAN" "%s Wi-Fi" @@ -1070,7 +1071,7 @@ "កណ្ដាល​អធ្រាត្រ​" "%1$02d:%2$02d" "%1$d:%2$02d:%3$02d" - "ជ្រើស​ទាំងអស់" + "ជ្រើសរើស​ទាំងអស់" "កាត់" "ចម្លង" "មិនអាច​ចម្លងទៅ​អង្គចងចាំទេ" @@ -1613,8 +1614,6 @@ "#%1$d ត្រួត​គ្នា" "%1$s: %2$dx%3$d, %4$d dpi" ", សុវត្ថិភាព" - "មុខងារចាប់ផ្ដើម​សកម្មភាព​នៅផ្ទៃខាងក្រោយ​ពី %1$s នេះ​នឹងត្រូវ​ទប់ស្កាត់​នៅក្នុង​កំណែបង្កើត Q នាពេលអនាគត។ សូមមើល g.co/dev/bgblock ។" - "បានទប់ស្កាត់​មុខងារចាប់ផ្ដើម​សកម្មភាព​នៅផ្ទៃខាងក្រោយ​ពី %1$s ។ សូមមើល g.co/dev/bgblock ។" "ភ្លេច​​លំនាំ" "លំនាំ​មិន​ត្រឹមត្រូវ" "ពាក្យ​សម្ងាត់​មិន​ត្រឹមត្រូវ" @@ -1668,8 +1667,12 @@ "ផ្លូវកាត់​ភាព​ងាយ​ស្រួល​បាន​បើក %1$s" "ផ្លូវកាត់​ភាព​ងាយ​ស្រួល​បាន​បិទ %1$s" "ចុចគ្រាប់ចុច​កម្រិត​សំឡេងទាំងពីរ​ឱ្យជាប់រយៈពេលបីវិនាទី ដើម្បីប្រើ %1$s" - "ជ្រើសរើស​មុខងារ​ដែលត្រូវ​ប្រើ នៅពេល​ដែល​អ្នកចុច​ប៊ូតុង​ភាពងាយស្រួល៖" - "ដើម្បី​ផ្លាស់ប្តូរ​មុខងារ សូម​ចុច​ប៊ូតុង​ភាព​ងាយស្រួល​ឲ្យ​ជាប់។" + "ជ្រើសរើស​សេវាកម្ម​ដែលត្រូវ​ប្រើ នៅពេល​ដែល​អ្នក​ចុច​ប៊ូតុង​ភាពងាយស្រួល៖" + "ជ្រើសរើស​សេវាកម្ម​ដែលត្រូវប្រើជាមួយចលនា​ភាពងាយស្រួល (អូស​ឡើងលើ​ពី​ផ្នែកខាងក្រោម​នៃ​អេក្រង់​ដោយប្រើ​ម្រាមដៃ​ពីរ)៖" + "ជ្រើសរើស​សេវាកម្ម​ដែលត្រូវប្រើជាមួយ​ចលនា​ភាពងាយស្រួល (អូស​ឡើងលើ​ពី​ផ្នែកខាងក្រោម​នៃ​អេក្រង់​ដោយប្រើ​ម្រាមដៃ​បី)៖" + "ដើម្បី​ប្ដូរឆ្លាស់​រវាង​សេវាកម្មផ្សេងៗ សូមចុច​ប៊ូតុង​ភាពងាយស្រួល​ឱ្យជាប់។" + "ដើម្បី​ប្ដូរឆ្លាស់​រវាង​សេវាកម្មផ្សេងៗ សូមអូស​ឡើងលើ​ដោយប្រើ​ម្រាមដៃ​ពីរ ហើយ​សង្កត់ឱ្យជាប់។" + "ដើម្បី​ប្ដូរឆ្លាស់​រវាង​សេវាកម្មផ្សេងៗ សូមអូស​ឡើងលើ​ដោយប្រើ​ម្រាមដៃ​បី ហើយ​សង្កត់ឱ្យជាប់។" "ការ​ពង្រីក" "អ្នក​ប្រើ​បច្ចុប្បន្ន %1$s ។" "កំពុង​ប្ដូរ​ទៅ %1$s…" diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index fa42a603ce89..172436a8152d 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -131,6 +131,7 @@ "%s ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ" + "%s ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ" "WLAN ಕರೆ" "%s WLAN ಕರೆ" "%s ವೈ-ಫೈ" @@ -1612,8 +1613,6 @@ "ಓವರ್‌ಲೇ #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", ಸುರಕ್ಷಿತ" - "ಭವಿಷ್ಯದ Q ಬಿಲ್ಡ್‌ಗಳಲ್ಲಿ %1$s ನಿಂದ ಪ್ರಾರಂಭವಾಗುವ ಈ ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆಯನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗುತ್ತದೆ. g.co/dev/bgblock ಅನ್ನು ನೋಡಿ." - "%1$s ನಿಂದ ಪ್ರಾರಂಭವಾಗುವ ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆಯನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ. g.co/dev/bgblock ಅನ್ನು ನೋಡಿ." "ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ಮರೆತಿರುವಿರಿ" "ತಪ್ಪು ಪ್ಯಾಟರ್ನ್" "ತಪ್ಪು ಪಾಸ್‌ವರ್ಡ್" @@ -1667,8 +1666,12 @@ "ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್‌ಕಟ್‌, %1$s ಅನ್ನು ಆನ್ ಮಾಡಿದೆ" "ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್‌ಕಟ್‌, %1$s ಅನ್ನು ಆಫ್ ಮಾಡಿದೆ" "%1$s ಅನ್ನು ಬಳಸಲು ಎರಡೂ ಧ್ವನಿ ಕೀಗಳನ್ನು ಮೂರು ಸೆಕೆಂಡ್‌ಗಳ ಕಾಲ ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ" - "ನೀವು ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಟ್ಯಾಪ್ ಮಾಡಿದಾಗ ಬಳಸುವುದಕ್ಕಾಗಿ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಆರಿಸಿ:" - "ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಬದಲಾಯಿಸಲು, ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಒತ್ತಿಹಿಡಿದುಕೊಳ್ಳಿ." + "ನೀವು ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಟ್ಯಾಪ್ ಮಾಡಿದಾಗ ಬಳಸುವುದಕ್ಕಾಗಿ ಸೇವೆಯೊಂದನ್ನು ಆರಿಸಿ:" + "ಪ್ರವೇಶಿಸುವಿಕೆ ಗೆಸ್ಚರ್‌ನೊಂದಿಗೆ ಬಳಸಲು ಸೇವೆಯೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ (ಎರಡು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಪರದೆಯ ಕೆಳಭಾಗದಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ):" + "ಪ್ರವೇಶಿಸುವಿಕೆ ಗೆಸ್ಚರ್‌ನೊಂದಿಗೆ ಬಳಸಲು ಸೇವೆಯೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ (ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಪರದೆಯ ಕೆಳಭಾಗದಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ):" + "ಸೇವೆಗಳ ನಡುವೆ ಬದಲಿಸಲು, ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಅನ್ನು ಒತ್ತಿ ಹಿಡಿಯಿರಿ." + "ಸೇವೆಗಳ ನಡುವೆ ಬದಲಿಸಲು, ಎರಡು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿಯಿರಿ." + "ಸೇವೆಗಳ ನಡುವೆ ಬದಲಿಸಲು, ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿಯಿರಿ." "ಹಿಗ್ಗಿಸುವಿಕೆ" "ಪ್ರಸ್ತುತ ಬಳಕೆದಾರರು %1$s." "%1$s ಗೆ ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ…" diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 65ccadb56c6a..4d4020c8c582 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi 통화" + "%s Wi-Fi 통화" "WLAN 통화" "%s WLAN 통화" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "%1$d번째 오버레이" "%1$s: %2$dx%3$d, %4$d dpi" ", 보안" - "%1$s의 백그라운드 활동 시작은 향후 Q 빌드에서 차단됩니다. g.co/dev/bgblock을 참조하세요." - "%1$s의 백그라운드 활동 시작이 차단되었습니다. g.co/dev/bgblock을 참조하세요." "패턴을 잊음" "잘못된 패턴" "잘못된 비밀번호" @@ -1666,8 +1665,12 @@ "접근성 단축키로 인해 %1$s이(가) 사용 설정되었습니다." "접근성 단축키로 인해 %1$s이(가) 사용 중지되었습니다." "%1$s 서비스를 사용하려면 두 볼륨 키를 3초 동안 길게 누르세요" - "접근성 버튼을 탭할 때 사용할 기능을 선택하세요." - "기능을 변경하려면 접근성 버튼을 길게 터치하세요." + "접근성 버튼을 탭했을 때 실행할 서비스를 선택하세요." + "접근성 동작(두 손가락을 사용하여 화면 하단에서 위로 스와이프)으로 실행할 서비스를 선택하세요." + "접근성 동작(세 손가락을 사용하여 화면 하단에서 위로 스와이프)으로 실행할 서비스를 선택하세요." + "서비스 간에 전환하려면 접근성 버튼을 길게 터치합니다." + "서비스 간에 전환하려면 두 손가락을 사용하여 위로 스와이프한 다음 잠시 기다립니다." + "서비스 간에 전환하려면 세 손가락을 사용하여 위로 스와이프한 다음 잠시 기다립니다." "확대" "현재 사용자는 %1$s님입니다." "%1$s(으)로 전환하는 중…" diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 77176802a2c3..5e4d9eead760 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi аркылуу чалуу" + "%s аркылуу Wi-Fi менен чалуу" "WLAN аркылуу чалуу" "%s WLAN аркылуу чалуу" "%s Wi-Fi" @@ -1613,8 +1614,6 @@ "Катмар №%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", корголгон" - "%1$s сайтынын фондук режимде иштеши Q курамдарында бөгөттөлүп турат. Төмөнкүгө өтүңүз: g.co/dev/bgblock." - "%1$s сайтынын фондук режимде иштеши бөгөттөлдү. Төмөнкүгө өтүңүз: g.co/dev/bgblock." "Үлгү унутулду" "Графикалык ачкыч туура эмес" "Сырсөз туура эмес" @@ -1668,8 +1667,12 @@ "Атайын мүмкүнчүлүктөр кыска жолу %1$s кызматын күйгүздү" "Атайын мүмкүнчүлүктөр кыска жолу %1$s кызматын өчүрдү" "%1$s кызматын колдонуу үчүн үнүн чоңойтуп/кичирейтүү баскычтарын үч секунд коё бербей басып туруңуз" - "Атайын мүмкүнчүлүктөр баскычын таптаганыңызда иштей турган функцияны тандаңыз:" - "Функцияларды өзгөртүү үчүн Атайын мүмкүнчүлүктөр баскычын басып, кармап туруңуз." + "Атайын мүмкүнчүлүктөр баскычын таптаганыңызда иштей турган кызматты тандаңыз:" + "Атайын мүмкүнчүлүктөр жаңсоосу үчүн кызматты тандаңыз (эки манжаңыз менен экрандын ылдый жагынан өйдө карай сүрүңүз):" + "Атайын мүмкүнчүлүктөр жаңсоосу үчүн кызматты тандаңыз (үч манжаңыз менен экрандын ылдый жагынан өйдө карай сүрүңүз):" + "Кызматтарды которуштуруу үчүн Атайын мүмкүнчүлүктөр баскычын басып, кармап туруңуз." + "Кызматтарды которуштуруу үчүн эки манжаңыз менен өйдө сүрүп, кармап туруңуз." + "Кызматтарды которуштуруу үчүн үч манжаңыз менен өйдө сүрүп, кармап туруңуз." "Чоңойтуу" "Учурдагы колдонуучу %1$s." "%1$s дегенге которулууда…" diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index fd614f31362a..b4e5a0e9e456 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi Calling" + "%s ການໂທ Wi-Fi" "WLAN Call" "%s WLAN Call" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "ການວາງຊ້ອນ #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", ປອດໄພ" - "ການເລີ່ມການເຄື່ອນໄຫວໃນພື້ນຫຼັງນີ້ຈາກ %1$s ຈະຖືກບລັອກໄວ້ໃນ Q ເວີຊັນອະນາຄົດ. ກະລຸນາອ່ານ g.co/dev/bgblock." - "ບລັອກການເຄື່ອນໄຫວພື້ນຫຼັງຈາກ %1$s ໄວ້ແລ້ວ. ກະລຸນາອ່ານ g.co/dev/bgblock." "ລືມຮູບແບບປົດລັອກ?" "ຮູບແບບຜິດ" "ລະຫັດຜ່ານບໍ່ຖືກຕ້ອງ" @@ -1666,8 +1665,12 @@ "Accessibility Shortcut turned %1$s on" "Accessibility Shortcut turned %1$s off" "ກົດປຸ່ມສຽງທັງສອງພ້ອມກັນຄ້າງໄວ້ສາມວິນາທີເພື່ອໃຊ້ %1$s" - "ເລືອກຄຸນສົມບັດທີ່ຈະໃຊ້ເມື່ອທ່ານແຕະປຸ່ມການຊ່ວຍເຂົ້າເຖິງ:" - "ເພື່ອປ່ຽນຄຸນສົມບັດ, ໃຫ້ແຕະປຸ່ມການຊ່ວຍເຂົ້າເຖິງຄ້າງໄວ້." + "ເລືອກບໍລິການເພື່ອໃຊ້ເມື່ອທ່ານແຕະໃສ່ປຸ່ມການຊ່ວຍເຂົ້າເຖິງ:" + "ເລືອກບໍລິການເພື່ອໃຊ້ກັບທ່າທາງການຊ່ວຍເຂົ້າເຖິງ (ປັດຂຶ້ນຈາກລຸ່ມສຸດຂອງໜ້າຈໍດ້ວຍສອງນິ້ວ):" + "ເລືອກບໍລິການເພື່ອໃຊ້ກັບທ່າທາງການຊ່ວຍເຂົ້າເຖິງ (ປັດຂຶ້ນຈາກລຸ່ມສຸດຂອງໜ້າຈໍດ້ວຍສາມນິ້ວ):" + "ເພື່ອສະຫຼັບລະຫວ່າງບໍລິການຕ່າງໆ, ໃຫ້ແຕະໃສ່ປຸ່ມການຊ່ວຍເຂົ້າເຖິງຄ້າງໄວ້." + "ເພື່ອສະຫຼັບລະຫວ່າງບໍລິການຕ່າງໆ, ໃຫ້ປັດຂຶ້ນດ້ວຍສອງນິ້ວຄ້າງໄວ້." + "ເພື່ອສະຫຼັບລະຫວ່າງບໍລິການຕ່າງໆ, ໃຫ້ປັດຂຶ້ນດ້ວຍສາມນິ້ວຄ້າງໄວ້." "ການຂະຫຍາຍ" "ຜູ່ໃຊ້ປັດຈຸບັນ %1$s ." "ກຳ​ລັງ​ສະ​ລັບ​​ໄປ​ຫາ %1$s…" diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 18ecae4df5be..8988c5dc48eb 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -133,6 +133,7 @@ "%s „Wi-Fi“ skambinimas" + "%s „Wi-Fi“ skambinimas" "WLAN skambutis" "%s WLAN skambutis" "%s „Wi-Fi“" @@ -1657,8 +1658,6 @@ "Perdanga nr. %1$d" "„%1$s“: %2$d x %3$d, %4$d tašk. colyje" ", saugu" - "Šios fono veiklos paleidimas iš „%1$s“ bus užblokuotas būsimose Q versijose. Žr. g.co/dev/bgblock." - "Fono veiklos paleidimas iš „%1$s“ užblokuotas. Žr. g.co/dev/bgblock." "Pamiršau atrakinimo piešinį" "Netinkamas atrakinimo piešinys" "Netinkamas slaptažodis" @@ -1714,8 +1713,12 @@ "Pritaikymo neįgaliesiems sparčiuoju klavišu buvo įjungta „%1$s“" "Pritaikymo neįgaliesiems sparčiuoju klavišu buvo išjungta „%1$s“" "Jei norite naudoti „%1$s“, paspauskite abu garsumo klavišus ir palaikykite tris sekundes" - "Pasirinkite funkciją, kuri bus naudojama, kai paliesite pritaikymo neįgaliesiems mygtuką:" - "Jei norite pakeisti funkcijas, palieskite ir palaikykite pritaikymo neįgaliesiems mygtuką." + "Pasirinkite paslaugą, kuri bus naudojama, kai paliesite pritaikomumo mygtuką:" + "Pasirinkite paslaugą, kuri bus naudojama su pritaikomumo gestu (perbraukimas aukštyn dviem pirštais iš ekrano apačios):" + "Pasirinkite paslaugą, kuri bus naudojama su pritaikomumo gestu (perbraukimas aukštyn trimis pirštais iš ekrano apačios):" + "Norėdami perjungti paslaugas, palieskite ir palaikykite pritaikomumo mygtuką." + "Norėdami perjungti paslaugas, perbraukite aukštyn dviem pirštais ir palaikykite." + "Norėdami perjungti paslaugas, perbraukite aukštyn trimis pirštais ir palaikykite." "Didinimas" "Dabartinis naudotojas: %1$s." "Perjungiama į %1$s…" diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 11abc5f46e3a..8f72a3457aa8 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -132,6 +132,7 @@ "%s Wi-Fi zvani" + "%s Wi-Fi zvani" "WLAN zvans" "%s WLAN zvans" "%s Wi-Fi" @@ -1634,8 +1635,6 @@ "Pārklājums Nr. %1$d" "%1$s: %2$d x %3$d, %4$d dpi" ", drošs" - "Šīs fona darbības sākšana no pakotnes %1$s tiks bloķēta turpmākajās Q versijās. Skatiet rakstu g.co/dev/bgblock." - "Fona darbības sākšana no pakotnes %1$s bloķēta. Skatiet rakstu g.co/dev/bgblock." "Aizmirsu kombināciju" "Nepareiza kombinācija" "Nepareiza parole" @@ -1690,8 +1689,12 @@ "Pieejamības saīsne aktivizēja lietotni %1$s" "Pieejamības saīsne deaktivizēja lietotni %1$s" "Lai izmantotu pakalpojumu %1$s, nospiediet abus skaļuma taustiņus un turiet tos trīs sekundes." - "Izvēlieties funkciju, ko izmantot, kad pieskaraties pogai Pieejamība." - "Lai mainītu funkcijas, pieskarieties pogai Pieejamība un turiet to." + "Izvēlieties pakalpojumu, ko izmantot, kad pieskaraties pieejamības pogai." + "Izvēlieties pakalpojumu, ko izmantot ar pieejamības žestu (vilkšana ar diviem pirkstiem augšup no ekrāna apakšdaļas)." + "Izvēlieties pakalpojumu, ko izmantot ar pieejamības žestu (vilkšana ar trīs pirkstiem augšup no ekrāna apakšdaļas)." + "Lai pārslēgtu pakalpojumus, pieskarieties pieejamības pogai un turiet to." + "Lai pārslēgtu pakalpojumus, velciet ar diviem pirkstiem augšup un turiet." + "Lai pārslēgtu pakalpojumus, velciet ar trīs pirkstiem augšup un turiet." "Palielinājums" "Pašreizējais lietotājs: %1$s." "Notiek pāriešana uz: %1$s" diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index d0f04c2e316a..e2f2d834290b 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -131,6 +131,7 @@ "Повици преку Wi-Fi на %s" + "Повикување преку Wi-Fi на %s" "Повик преку WLAN" "Повик преку WLAN на %s" "Wi-Fi на %s" @@ -1614,8 +1615,6 @@ "Прекривка #%1$d" "%1$s : %2$dх%3$d, %4$d dpi" ", безбедно" - "Ова стартување активност во заднина од %1$s ќе се блокира во идните верзии на Q. Видете g.co/dev/bgblock." - "Блокирано е стартување активност во заднина од %1$s. Видете g.co/dev/bgblock." "Заборавив шема" "Погрешна шема" "Погрешна лозинка" @@ -1669,8 +1668,12 @@ "Кратенката за пристапност ја вклучи %1$s" "Кратенката за пристапност ја исклучи %1$s" "Притиснете ги и задржете ги двете копчиња за јачина на звукот во траење од три секунди за да користите %1$s" - "Изберете функција за користење кога ќе го допрете копчето за „Пристапност“." - "За променување функции, допрете го и задржете го копчето за „Пристапност“." + "Изберете ја услугата што ќе ја користите кога ќе го допрете копчето за пристапност:" + "Изберете ја услугата што ќе ја користите со движењето за пристапност (повлекување нагоре од дното на екранот со два прста):" + "Изберете ја услугата што ќе ја користите со движењето за пристапност (повлекување нагоре од дното на екранот со три прста):" + "За да се префрлате помеѓу услуги, допрете и задржете го копчето за пристапност." + "За да се префрлате помеѓу услуги, лизгајте нагоре со два прста и задржете." + "За да се префрлате помеѓу услуги, лизгајте нагоре со три прста и задржете." "Зголемување" "Тековен корисник %1$s." "Се префрла на %1$s…" diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 644ca2f0f48e..a42fcb30487e 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -131,6 +131,7 @@ "%s വൈഫൈ കോളിംഗ്" + "%s വൈഫൈ കോളിംഗ്" "WLAN കോൾ" "%s WLAN കോൾ" "%s വൈഫൈ" @@ -1612,8 +1613,6 @@ "ഓവർലേ #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", സുരക്ഷിതമാക്കുക" - "%1$s എന്നതിൽ നിന്ന് ഈ പശ്ചാത്തല ആക്റ്റിവിറ്റി ആരംഭിക്കുന്നത് ഭാവിയിലെ Q ബിൽഡുകളിൽ ബ്ലോക്ക് ചെയ്യപ്പെടും. g.co/dev/bgblock കാണുക." - "%1$s എന്നതിൽ നിന്ന് പശ്ചാത്തല ആക്റ്റിവിറ്റി ആരംഭിക്കുന്നത് ബ്ലോക്ക് ചെയ്‌തു. g.co/dev/bgblock കാണുക." "പാറ്റേൺ മറന്നു" "പാറ്റേൺ തെറ്റാണ്" "പാസ്‌വേഡ് തെറ്റാണ്" @@ -1667,8 +1666,12 @@ "ഉപയോഗസഹായിക്കുള്ള കുറുക്കുവഴി %1$s ഓൺ ചെയ്തിരിക്കുന്നു" "ഉപയോഗസഹായിക്കുള്ള കുറുക്കുവഴി %1$s ഓഫ് ചെയ്തിരിക്കുന്നു" "%1$s ഉപയോഗിക്കാൻ, രണ്ട് വോളിയം കീകളും മൂന്ന് സെക്കൻഡ് അമർത്തിപ്പിടിക്കുക" - "നിങ്ങൾ ഉപയോഗസഹായി ബട്ടൺ ടാപ്പ് ചെയ്യുമ്പോൾ ഉപയോഗിക്കുന്നതിന് ഒരു ഫീച്ചർ തിരഞ്ഞെടുക്കുക:" - "ഫീച്ചറുകൾ മാറ്റുന്നതിന് ഉപയോഗസഹായി ബട്ടൺ സ്‌പർശിച്ചുപിടിക്കുക." + "നിങ്ങൾ ഉപയോഗസഹായി ബട്ടൺ ടാപ്പ് ചെയ്യുമ്പോൾ ഉപയോഗിക്കാൻ ഒരു ഫീച്ചർ തിരഞ്ഞെടുക്കുക:" + "ഉപയോഗസഹായി വിരൽചലനത്തോടൊപ്പം ഉപയോഗിക്കാൻ ഒരു സർവീസ് തിരഞ്ഞെടുക്കുക (രണ്ട് വിരലുകളുപയോഗിച്ച് സ്‌ക്രീനിന്റെ താഴെ നിന്ന് മുകളിലോട്ട് സ്വൈപ്പ് ചെയ്യുക):" + "ഉപയോഗസഹായി വിരൽചലനത്തോടൊപ്പം ഉപയോഗിക്കാൻ ഒരു സർവീസ് തിരഞ്ഞെടുക്കുക (മൂന്ന് വിരലുകളുപയോഗിച്ച് സ്‌ക്രീനിന്റെ താഴെ നിന്ന് മുകളിലോട്ട് സ്വൈപ്പ് ചെയ്യുക):" + "സർവീസുകൾക്കിടയിൽ മാറാൻ, ഉപയോഗസഹായി ബട്ടൺ സ്‌പർശിച്ചുപിടിക്കുക." + "സർവീസുകൾക്കിടയിൽ മാറാൻ, രണ്ട് വിരലുകളുപയോഗിച്ച് മുകളിലോട്ട് സ്വൈപ്പ് ചെയ്‌ത് പിടിക്കുക." + "സർവീസുകൾക്കിടയിൽ മാറാൻ, മൂന്ന് വിരലുകളുപയോഗിച്ച് മുകളിലോട്ട് സ്വൈപ്പ് ചെയ്‌ത് പിടിക്കുക." "മാഗ്നിഫിക്കേഷൻ" "നിലവിലെ ഉപയോക്താവ് %1$s ആണ്." "%1$s എന്ന ഉപയോക്താവിലേക്ക് മാറുന്നു…" diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 1c4ae79deef1..b4243e543f36 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi дуудлага" + "%s Wi-Fi Дуудлага" "WLAN дуудлага" "%s WLAN дуудлага" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "Давхарга #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", найдвартай" - "%1$s-с эхлэх арын энэ үйл ажиллагааг цаашдын Q боловсруулагдсан программд хориглоно. Та g.co/dev/bgblock холбоосыг харна уу." - "%1$s-с эхлэх арын үйл ажиллагааг хориглосон. Та g.co/dev/bgblock холбоосыг харна уу." "Хээг мартсан" "Буруу хээ" "Нууц үг буруу" @@ -1666,8 +1665,12 @@ "Хүртээмжийн товчлол %1$s-г асаасан" "Хүртээмжийн товчлол %1$s-г унтраасан" "%1$s-г ашиглахын тулд дууны түвшнийг ихэсгэх, багасгах түлхүүрийг 3 секундийн турш зэрэг дарна уу" - "Хүртээмжийн товчлуурыг товших үедээ ашиглах онцлогийг сонгоно уу:" - "Онцлогийг өөрчлөхийн тулд Хүртээмжийн товчлуурыг дараад хүлээнэ үү." + "Хүртээмжийн товчлуурыг товшихдоо ашиглах үйлчилгээг сонгоно уу:" + "Хүртээмжийн зангаатай ашиглах үйлчилгээг сонгоно уу (хоёр хуруугаараа дэлгэцийн доороос дээш шударна уу):" + "Хүртээмжийн зангаатай ашиглах үйлчилгээг сонгоно уу (гурван хуруугаараа дэлгэцийн доороос дээш шударна уу):" + "Үйлчилгээнүүд хооронд сэлгэхийн тулд хүртээмжийн товчлуурт хүрээд удаан дарна уу." + "Үйлчилгээнүүд хооронд сэлгэхийн тулд хоёр хуруугаараа дээш шудраад удаан дарна уу." + "Үйлчилгээнүүд хооронд сэлгэхийн тулд гурван хуруугаараа дээш шудраад удаан дарна уу." "Томруулах" "Одоогийн хэрэглэгч %1$s." "%1$s руу сэлгэж байна…" diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 3ecc71f966b3..6a03e5a5a574 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -131,6 +131,7 @@ "%s वाय-फाय कॉलिंग" + "%s वाय-फाय कॉलिंग" "WLAN कॉल" "%s WLAN कॉल" "%s वाय-फाय" @@ -1612,8 +1613,6 @@ "ओव्हरले #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", सुरक्षित" - "%1$s पासून सुरू होणारी ही बॅकग्राउंड अ‍ॅक्टिव्हिटी भविष्यातील Q बिल्डमध्ये ब्लॉक केली जाईल. g.co/dev/bgblock पाहा." - "%1$s वरून सुरू होणारी बॅकग्राउंड अ‍ॅक्टिव्हिटी ब्लॉक केली आहे. g.co/dev/bgblock पाहा." "पॅटर्न विसरलात" "चुकीचा पॅटर्न" "चुकीचा पासवर्ड" @@ -1667,8 +1666,12 @@ "प्रवेशयोग्यता शॉर्टकटने %1$s चालू केली" "प्रवेशयोग्यता शॉर्टकटने %1$s बंद केली" "%1$s वापरण्यासाठी दोन्ही व्हॉल्युम की तीन सेकंद दाबा आणि धरून ठेवा" - "तुम्ही प्रवेशयोग्यता बटण दाबल्यावर वापरण्यासाठी वैशिष्ट्य निवडा:" - "वैशिष्ट्ये बदलण्यासाठी, प्रवेशयोग्यता बटणाला स्पर्श करा आणि धरून ठेवा." + "तुम्ही अ‍ॅक्सेसिबिलिटी बटण दाबल्यावर वापरण्यासाठी वैशिष्ट्य निवडा:" + "अ‍ॅक्सेसिबिलिटी जेश्चर ज्या सोबत वापराचे आहे अशी सेवा निवडा (स्क्रीनच्या खालच्या बाजूने दोन बोटांनी स्वाइप करा):" + "अ‍ॅक्सेसिबिलिटी जेश्चर ज्या सोबत वापराचे आहे अशी सेवा निवडा (स्क्रीनच्या खालच्या बाजूने तीन बोटांनी स्वाइप करा):" + "सेवांदरम्यान स्विच करण्यासाठी, अ‍ॅक्सेसिबिलिटी बटणाला स्पर्श करा आणि धरून ठेवा." + "सेवांदरम्यान स्विच करण्यासाठी, दोन बोटांनी वरच्या दिशेला स्वाइप करा आणि धरून ठेवा." + "सेवांदरम्यान स्विच करण्यासाठी, तीन बोटांनी वरच्या दिशेला स्वाइप करा आणि धरून ठेवा." "मोठे करणे" "वर्तमान वापरकर्ता %1$s." "%1$s वर स्विच करत आहे…" diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 0124af413349..938d574dad1b 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -131,6 +131,7 @@ "Panggilan Wi-Fi %s" + "Panggilan Wi-Fi %s" "Panggilan WLAN" "Panggilan WLAN %s" "Wi-Fi %s" @@ -1611,8 +1612,6 @@ "Tindih #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", selamat" - "Permulaan aktiviti latar belakang daripada %1$s ini akan disekat dalam binaan Q pada masa hadapan. Lihat g.co/dev/bgblock." - "Permulaan aktiviti latar belakang daripada %1$s disekat. Lihat g.co/dev/bgblock." "Lupa Corak" "Corak Salah" "Kata Laluan Salah" @@ -1666,8 +1665,12 @@ "Pintasan kebolehaksesan menghidupkan %1$s" "Pintasan Kebolehaksesan mematikan %1$s" "Tekan dan tahan kedua-dua kekunci kelantangan selama tiga saat untuk menggunakan %1$s" - "Pilih ciri yang hendak digunakan apabila anda mengetik butang Kebolehaksesan:" - "Untuk menukar ciri, sentuh & tahan butang Kebolehaksesan." + "Pilih perkhidmatan yang hendak digunakan apabila anda mengetik butang kebolehaksesan:" + "Pilih perkhidmatan untuk digunakan dengan gerak isyarat kebolehaksesan (leret ke atas dari bahagian bawah skrin menggunakan dua jari):" + "Pilih perkhidmatan untuk digunakan dengan gerak isyarat kebolehaksesan (leret ke atas dari bahagian bawah skrin menggunakan tiga jari):" + "Untuk beralih antara perkhidmatan, sentuh & tahan butang kebolehaksesan." + "Untuk beralih antara perkhidmatan, leret ke atas menggunakan dua jari dan tahan." + "Untuk beralih antara perkhidmatan, leret ke atas menggunakan tiga jari dan tahan." "Pembesaran" "Pengguna semasa %1$s." "Bertukar kepada %1$s…" diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 9090c1ddad5e..a54ee4af7e96 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi ခေါ်ဆိုမှု" + "%sWi-Fi ခေါ်ဆိုမှု" "WLAN ခေါ်ဆိုမှု" "%s WLAN ခေါ်ဆိုမှု" "%s Wi-Fi" @@ -1612,8 +1613,6 @@ "အပေါ်မှ ထပ်သောအရာ #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", လုံခြုံသော" - "%1$s မှစတင်သော ဤနောက်ခံလုပ်ဆောင်ချက်ကို အနာဂတ် Q တည်ဆောက်ပုံများတွင် ပိတ်ထားပါမည်။ g.co/dev/bgblock ကိုကြည့်ပါ။" - "%1$s မှစတင်သော နောက်ခံလုပ်ဆောင်ချက်ကို ပိတ်ထားသည်။ g.co/dev/bgblock ကိုကြည့်ပါ။" "ပုံဖော်မှုအား မေ့လျော့ခြင်း" "ပုံဆွဲအမှား" "စကားဝှက်အမှား" @@ -1667,8 +1666,12 @@ "အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်သည် %1$s ကို ဖွင့်လိုက်ပါသည်" "အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်သည် %1$s ကို ပိတ်လိုက်ပါသည်" "%1$s ကို သုံးရန် အသံအတိုးအလျှော့ ခလုတ်နှစ်ခုလုံးကို သုံးစက္ကန့်ကြာ ဖိထားပါ" - "အများသုံးစွဲနိုင်မှု ခလုတ်ကို တို့သည့်အခါ အသုံးပြုမည့် ဝန်ဆောင်မှုကို ရွေးချယ်ပါ−" - "ဝန်ဆောင်မှုများကို ပြောင်းလဲရန် အများသုံးစွဲနိုင်မှု ခလုတ်ကို တို့၍ ထိထားပါ။" + "အများသုံးစွဲနိုင်မှု ခလုတ်ကို တို့သည့်အခါ အသုံးပြုမည့် ဝန်ဆောင်မှုကို ရွေးချယ်ပါ−" + "အများသုံးစွဲနိုင်မှုလက်ဟန်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုတစ်ခုကို ရွေးပါ (မျက်နှာပြင်အောက်ခြေမှနေ၍ လက်နှစ်ချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ)-" + "အများသုံးစွဲနိုင်မှုလက်ဟန်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုတစ်ခုကို ရွေးပါ (မျက်နှာပြင်အောက်ခြေမှနေ၍ လက်သုံးချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ)-" + "ဝန်ဆောင်မှုများအကြား ပြောင်းရန် အများသုံးစွဲနိုင်မှုခလုတ်ကို ဖိထားပါ။" + "ဝန်ဆောင်မှုများအကြား ပြောင်းရန် လက်နှစ်ချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပြီး ဖိထားပါ။" + "ဝန်ဆောင်မှုများအကြား ပြောင်းရန် လက်သုံးချေင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပြီး ဖိထားပါ။" "ချဲ့ခြင်း" "လက်ရှိအသုံးပြုနေသူ %1$s." "%1$sသို့ ပြောင်းနေ…" diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index c19b1b025957..b57baf6294a2 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi-anrop" + "%s-Wi-Fi-anrop" "WLAN-anrop" "%s WLAN-anrop" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "Overlegg #%1$d" "%1$s: %2$d x %3$d, %4$d dpi" ", sikker" - "Denne bakgrunnsaktiviteten som starter fra %1$s, blir blokkert i fremtidige Q-delversjoner. Se g.co/dev/bgblock." - "Bakgrunnsaktivitet som starter fra %1$s, er blokkert. Se g.co/dev/bgblock." "Har du glemt mønsteret?" "Feil mønster" "Feil passord" @@ -1666,8 +1665,12 @@ "Snarveien for tilgjengelighet slo på %1$s" "Snarveien for tilgjengelighet slo av %1$s" "Trykk og hold inne begge volumtastene i tre sekunder for å bruke %1$s" - "Velg en funksjon du vil bruke når du trykker på Tilgjengelighet-knappen:" - "For å endre funksjoner, trykk på og hold inne Tilgjengelighet-knappen." + "Velg en tjeneste du vil bruke når du trykker på Tilgjengelighet-knappen:" + "Velg en tjeneste du vil bruke med tilgjengelighetsbevegelsen (sveip opp fra bunnen av skjermen med to fingre):" + "Velg en tjeneste du vil bruke med tilgjengelighetsbevegelsen (sveip opp fra bunnen av skjermen med tre fingre):" + "For å bytte mellom tjenester, trykk og hold på Tilgjengelighet-knappen." + "For å bytte mellom tjenester, sveip opp med to fingre og hold." + "For å bytte mellom tjenester, sveip opp med tre fingre og hold." "Forstørring" "Gjeldende bruker: %1$s." "Bytter til %1$s …" diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 0210b6c27dce..9fa3f9181fd1 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi कलिङ" + "%s Wi-Fi कलिङ" "WLAN कल" "%s WLAN कल" "%s Wi-Fi" @@ -1617,8 +1618,6 @@ "आवरण #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", सुरक्षित" - "यो पृष्ठभूमिमा चल्ने क्रियाकलापलाई %1$s बाट भविष्यका Q build हरूमा रोक लगाइने छ। g.co/dev/bgblock हेर्नुहोस्।" - "%1$s माथि रोक लगाएपछि पृष्ठभूमिको क्रियाकलाप सुरु हुन्छ। g.co/dev/bgblock हेर्नुहोस्।" "ढाँचा बिर्सनु भयो" "गलत ढाँचा" "गलत पासवर्ड" @@ -1672,8 +1671,12 @@ "पहुँचको सर्टकटले %1$s लाई सक्रिय पार्‍यो" "पहुँचको सर्टकटले %1$s लाई निष्क्रिय पार्‍यो" "%1$s प्रयोग गर्न दुवै भोल्युम कुञ्जीहरूलाई तीन सेकेन्डसम्म थिचिराख्नुहोस्" - "तपाईंले पहुँच सम्बन्धी बटनलाई ट्याप गर्दा प्रयोग गर्नुपर्ने सुविधा रोज्नुहोस्:" - "सुविधाहरूलाई बदल्न, पहुँच सम्बन्धी बटनलाई छोएर थिची राख्नुहोस्।" + "तपाईंले पहुँचसम्बन्धी बटन ट्याप गर्दा प्रयोग गर्नु पर्ने सुविधा रोज्नुहोस्:" + "पहुँचसम्बन्धी इसारासँगै प्रयोग गर्नु पर्ने कुनै सेवा छनौट गर्नुहोस् (दुईवटा औँलाले स्क्रिनको फेदबाट माथितिर स्वाइप गर्नुहोस्):" + "पहुँचसम्बन्धी इसारासँगै प्रयोग गर्नु पर्ने कुनै सेवा छनौट गर्नुहोस् (तीनवटा औँलाले स्क्रिनको फेदबाट माथितिर स्वाइप गर्नुहोस्):" + "एउटा सेवाबाट अर्को सेवामा जान पहुँचसम्बन्धी बटनमा छोइराख्नुहोस्।" + "एउटा सेवाबाट अर्को सेवामा जान दुईवटा औँलाले माथितिर स्वाइप गरी थिचिराख्नुहोस्।" + "एउटा सेवाबाट अर्को सेवामा जान तीनवटा औँलाले माथितिर स्वाइप गरी थिचिराख्नुहोस्।" "म्याग्निफिकेसन" "अहिलेको प्रयोगकर्ता %1$s।" "%1$s मा स्विच गर्दै..." diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index e77adf435c46..032c3f3d672e 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -131,6 +131,7 @@ "Bellen via wifi van %s" + "Bellen via wifi met %s" "Bellen via WLAN" "Bellen via WLAN van %s" "Wifi van %s" @@ -1611,8 +1612,6 @@ "Overlay %1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", beveiligd" - "Het starten van deze achtergrondactiviteit voor %1$s wordt geblokkeerd in toekomstige Q-builds. Ga naar g.co/dev/bgblock." - "Starten van achtergrondactiviteit voor %1$s is geblokkeerd. Ga naar g.co/dev/bgblock." "Patroon vergeten" "Onjuist patroon" "Onjuist wachtwoord" @@ -1666,8 +1665,12 @@ "\'Snelle link voor toegankelijkheid\' heeft %1$s ingeschakeld" "\'Snelle link voor toegankelijkheid\' heeft %1$s uitgeschakeld" "Houd beide volumetoetsen drie seconden ingedrukt om %1$s te gebruiken" - "Kies een functie om te gebruiken wanneer je op de knop Toegankelijkheid tikt:" - "Als je functies wilt wijzigen, tik je op de knop Toegankelijkheid en houd je deze vast." + "Kies een service om te gebruiken wanneer je op de toegankelijkheidsknop tikt:" + "Kies een service om te gebruiken met het toegankelijkheidsgebaar (veeg met twee vingers omhoog vanaf de onderkant van het scherm):" + "Kies een service om te gebruiken met het toegankelijkheidsgebaar (veeg met drie vingers omhoog vanaf de onderkant van het scherm):" + "Tik op de toegankelijkheidsknop en houd deze vast om tussen services te schakelen." + "Veeg met twee vingers omhoog en houd vast om tussen services te schakelen." + "Veeg met drie vingers omhoog en houd vast om tussen services te schakelen." "Vergroting" "Huidige gebruiker %1$s." "Overschakelen naar %1$s…" diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 231950269c9c..b8b908cb05ed 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -131,6 +131,7 @@ "%s ୱାଇ-ଫାଇ କଲିଂ" + "%s ୱାଇଫାଇ କଲିଂ" "WLAN କଲ୍‍" "%s WLAN କଲ୍‍" "%s ୱାଇ-ଫାଇ" @@ -1611,8 +1612,6 @@ "ପ୍ରାୟତଃ #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", ସୁରକ୍ଷିତ" - "%1$s ଠାରୁ ଆରମ୍ଭ ହୋଇଥିବା ପୃଷ୍ଠଭୂମି କାର୍ଯ୍ୟକଳାପ ଆଗାମୀ Q ବିଲ୍ଡରେ ବ୍ଲକ୍ କରାଯିବ। g.co/dev/bgblock ଦେଖନ୍ତୁ।" - "%1$sଠାରୁ ଆରମ୍ଭ ହୋଇଥିବା ପୃଷ୍ଠଭୂମି କାର୍ଯ୍ୟକଳାପ ବ୍ଲକ୍ କରାଯାଇଛି। g.co/dev/bgblock ଦେଖନ୍ତୁ।" "ପାଟର୍ନ ଭୁଲି ଯାଇଛନ୍ତି" "ଭୁଲ ପାଟର୍ନ" "ଭୁଲ ପାସ୍‌ୱର୍ଡ" @@ -1666,8 +1665,12 @@ "ଆକ୍ସେସିବିଲିଟୀ ଶର୍ଟକଟ୍‍ %1$s ଅନ୍‍ କରାଯାଇଛି" "ଆକ୍ସେସିବିଲିଟୀ ଶର୍ଟକଟ୍‍ %1$s ଅଫ୍‍ କରାଯାଇଛି" "%1$s ବ୍ୟବହାର କରିବାକୁ ତିନି ସେକେଣ୍ଡ ପାଇଁ ଉଭୟ ଭଲ୍ୟୁମ୍‍ କୀ ଦବାଇ ଧରି ରଖନ୍ତୁ" - "ଆପଣ ଆକ୍ସେସବିଲିଟି ବଟନ୍‍ ଟାପ୍‍ କରିବା ବେଳେ ଏକ ବୈଶିଷ୍ଟ୍ୟ ବ୍ୟବହାର କରିବାକୁ ବାଛନ୍ତୁ:" - "ବୈଶିଷ୍ଟ୍ୟ ବଦଳାଇବାକୁ, ଆକ୍ସେସବିଲିଟି ବଟନ୍‍ ସ୍ପର୍ଶ କରନ୍ତୁ ଓ ଧରିରଖନ୍ତୁ।" + "ଆପଣ ଆକ୍ସେସିବିଲିଟୀ ବଟନ୍ ଟାପ୍ କରିବା ସମୟରେ ଏକ ସେବା ବ୍ୟବହାର କରିବା ପାଇଁ ବାଛନ୍ତୁ:" + "ଆକ୍ସେସିବିଲିଟୀ ଜେଶ୍ଚର୍ ବ୍ୟବହାର କରିବା ପାଇଁ ଏକ ସେବା ବାଛନ୍ତୁ (ଦୁଇଟି ଆଙ୍ଗୁଠିରେ ସ୍କ୍ରିନ୍‍ର ତଳୁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ):" + "ଆକ୍ସେସିବିଲିଟୀ ଜେଶ୍ଚର୍ ବ୍ୟବହାର କରିବା ପାଇଁ ଏକ ସେବା ବାଛନ୍ତୁ (ତିନିଟି ଆଙ୍ଗୁଠିରେ ସ୍କ୍ରିନ୍‍ର ତଳୁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ):" + "ସେବାଗୁଡ଼ିକ ମଧ୍ୟରେ ସ୍ୱିଚ୍ କରିବା ପାଇଁ ଆକ୍ସେସିବିଲିଟୀ ବଟନ୍ ସ୍ପର୍ଶ ଓ ଧରି ରଖନ୍ତୁ।" + "ସେବାଗୁଡ଼ିକ ମଧ୍ୟରେ ସ୍ୱିଚ୍ କରିବା ପାଇଁ ଦୁଇଟି ଆଙ୍ଗୁଠିରେ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ ଏବଂ ଧରି ରଖନ୍ତୁ।" + "ସେବାଗୁଡ଼ିକ ମଧ୍ୟରେ ସ୍ୱିଚ୍ କରିବା ପାଇଁ ତିନିଟି ଆଙ୍ଗୁଠିରେ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ ଏବଂ ଧରି ରଖନ୍ତୁ।" "ମ୍ୟାଗ୍ନିଫିକେସନ୍‍" "ବର୍ତ୍ତମାନର ୟୁଜର୍‌ ହେଉଛନ୍ତି %1$s।" "%1$s ରେ ସୁଇଚ୍ କରନ୍ତୁ…" diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 7b31b8390e0b..2a87e0c65aff 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -131,6 +131,7 @@ "%s ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ" + "%s ਵਾਈ-ਫਾਈ Calling" "WLAN ਕਾਲ" "%s WLAN ਕਾਲ" "%s ਵਾਈ-ਫਾਈ" @@ -1612,8 +1613,6 @@ "ਓਵਰਲੇ #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", ਸੁਰੱਖਿਅਤ" - "ਇਹ ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ %1$s ਤੋਂ ਸ਼ੁਰੂ ਹੋ ਕੇ ਭਵਿੱਖ ਦੇ Q ਬਿਲਡ ਵਿੱਚ ਬਲਾਕ ਕੀਤੀ ਜਾਵੇਗੀ। g.co/dev/bgblock ਦੇਖੋ।" - "%1$s ਬਲਾਕ ਕਰਕੇ ਬੈਕਗ੍ਰਾਊਂਡ ਸਰਗਰਮੀ ਸ਼ੁਰੂ ਕੀਤੀ ਗਈ। g.co/dev/bgblock ਦੇਖੋ।" "ਪੈਟਰਨ ਭੁੱਲ ਗਏ" "ਗ਼ਲਤ ਪੈਟਰਨ" "ਗਲਤ ਪਾਸਵਰਡ" @@ -1667,8 +1666,12 @@ "ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਨੇ %1$s ਨੂੰ ਚਾਲੂ ਕੀਤਾ" "ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਨੇ %1$s ਨੂੰ ਬੰਦ ਕੀਤਾ" "%1$s ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਦੋਵੇਂ ਅਵਾਜ਼ ਕੁੰਜੀਆਂ ਨੂੰ 3 ਸਕਿੰਟਾਂ ਲਈ ਦਬਾਈ ਰੱਖੋ" - "ਤੁਹਾਡੇ ਵੱਲੋਂ ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ ਨੂੰ ਟੈਪ ਕੀਤੇ ਜਾਣ \'ਤੇ ਵਰਤਣ ਲਈ ਕੋਈ ਵਿਸ਼ੇਸ਼ਤਾ ਚੁਣੋ:" - "ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਬਦਲਣ ਲਈ, ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ।" + "ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ \'ਤੇ ਟੈਪ ਕਰਕੇ ਵਰਤਣ ਲਈ ਕੋਈ ਸੇਵਾ ਚੁਣੋ:" + "ਪਹੁੰਚਯੋਗਤਾ ਸੰਕੇਤ ਨਾਲ ਵਰਤਣ ਲਈ ਕੋਈ ਸੇਵਾ ਚੁਣੋ (ਦੋ ਉਂਗਲਾਂ ਨਾਲ ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਾਂ ਤੋਂ ਉੱਪਰ ਵੱਲ ਸਕ੍ਰੋਲ ਕਰੋ):" + "ਪਹੁੰਚਯੋਗਤਾ ਸੰਕੇਤ ਨਾਲ ਵਰਤਣ ਲਈ ਕੋਈ ਸੇਵਾ ਚੁਣੋ (ਤਿੰਨ ਉਂਗਲਾਂ ਨਾਲ ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਾਂ ਤੋਂ ਉੱਪਰ ਵੱਲ ਸਕ੍ਰੋਲ ਕਰੋ):" + "ਸੇਵਾਵਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ, ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ \'ਤੇ ਸਪਰਸ਼ ਕਰਕੇ ਰੱਖੋ।" + "ਸੇਵਾਵਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ, ਦੋ ਉਂਗਲਾਂ ਨਾਲ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।" + "ਸੇਵਾਵਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ, ਤਿੰਨ ਉਂਗਲਾਂ ਨਾਲ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।" "ਵੱਡਦਰਸ਼ੀਕਰਨ" "ਮੌਜੂਦਾ ਉਪਭੋਗਤਾ %1$s।" "%1$s ਤੇ ਸਵਿਚ ਕਰ ਰਿਹਾ ਹੈ…" diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 2dedf9dcffea..6541f252d017 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -133,6 +133,7 @@ "%s, połączenia przez Wi-Fi" + "%s, połączenia przez Wi-Fi" "Połączenie przez WLAN" "%s, połączenie przez WLAN" "%s, Wi-Fi" @@ -1657,8 +1658,6 @@ "Nakładka nr %1$d" "%1$s: %2$d x %3$d, %4$d dpi" ", bezpieczny" - "Rozpoczęcie tej aktywności w tle przez pakiet %1$s zostanie zablokowane w przyszłych kompilacjach Q. Patrz g.co/dev/bgblock." - "Rozpoczęcie aktywności w tle przez pakiet %1$s zostało zablokowane. Patrz g.co/dev/bgblock." "Nie pamiętam wzoru" "Nieprawidłowy wzór" "Nieprawidłowe hasło" @@ -1714,8 +1713,12 @@ "Skrót ułatwień dostępu wyłączył usługę %1$s" "Skrót ułatwień dostępu wyłączył usługę %1$s" "Naciśnij i przytrzymaj oba przyciski głośności przez trzy sekundy, by użyć usługi %1$s" - "Wybierz funkcję używaną po kliknięciu przycisku ułatwień dostępu." - "Aby zmienić funkcje, kliknij i przytrzymaj przycisk ułatwień dostępu." + "Wybierz usługę używaną po kliknięciu przycisku ułatwień dostępu:" + "Wybierz usługę używaną w przypadku gestu ułatwień dostępu (przesunięcie dwoma palcami z dołu ekranu w górę):" + "Wybierz usługę używaną w przypadku gestu ułatwień dostępu (przesunięcie trzema palcami z dołu ekranu w górę):" + "Aby przełączać usługi, kliknij i przytrzymaj przycisk ułatwień dostępu." + "Aby przełączać usługi, przesuń dwoma palcami w górę i przytrzymaj." + "Aby przełączać usługi, przesuń trzema palcami w górę i przytrzymaj." "Powiększenie" "Bieżący użytkownik: %1$s." "Przełączam na użytkownika %1$s…" diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index d873d2051dbe..d51c32992543 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -131,6 +131,7 @@ "Chamada no Wi-Fi de %s" + "Chamada no Wi-Fi de %s" "Chamada por WLAN" "Chamada por WLAN de %s" "Wi-Fi de %s" @@ -1611,8 +1612,6 @@ "Sobreposição nº %1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", seguro" - "Esse início de atividade em segundo plano a partir de %1$s será bloqueado nas versões futuras do Android Q. Acesse g.co/dev/bgblock." - "O início da atividade em segundo plano a partir de %1$s foi bloqueado. Acesse g.co/dev/bgblock." "Esqueci o padrão" "Padrão incorreto" "Senha incorreta" @@ -1666,8 +1665,12 @@ "O atalho de acessibilidade ativou o %1$s" "O atalho de acessibilidade desativou o %1$s" "Toque nos dois botões de volume e os mantenha pressionados por três segundo para usar o %1$s" - "Escolha um recurso a ser usado quando você toca no botão Acessibilidade:" - "Para alterar os recursos, mantenha o botão Acessibilidade pressionado." + "Escolha um serviço a ser usado quando você toca no botão Acessibilidade:" + "Escolha um serviço a ser usado com o gesto de acessibilidade (deslizar de baixo para cima na tela com dois dedos):" + "Escolha um serviço a ser usado com o gesto de acessibilidade (deslizar de baixo para cima na tela com três dedos):" + "Para alternar entre serviços, toque no botão de acessibilidade e mantenha-o pressionado." + "Para alternar entre serviços, deslize de baixo para cima na tela com dois dedos e mantenha-a pressionada." + "Para alternar entre serviços, deslize de baixo para cima na tela com três dedos e mantenha-a pressionada." "Ampliação" "Usuário atual %1$s." "Alternando para %1$s…" diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index c2c5d8397acb..6b22edd8896c 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -131,6 +131,7 @@ "Chamadas Wi-Fi %s" + "Chamadas Wi-Fi de %s" "Chamada WLAN" "Chamada WLAN %s" "Wi-Fi %s" @@ -1611,8 +1612,6 @@ "Sobreposição #%1$d" "%1$s: %2$dx%3$d, %4$d ppp" ", protegido" - "Este início da atividade em segundo plano do pacote %1$s será bloqueado em compilações futuras do Q. Aceda a g.co/dev/bgblock." - "Início da atividade em segundo plano do pacote %1$s bloqueado. Aceda a g.co/dev/bgblock." "Esqueceu-se da Sequência" "Padrão Incorreto" "Palavra-passe Incorreta" @@ -1666,8 +1665,12 @@ "O Atalho de acessibilidade ativou o serviço %1$s" "O Atalho de acessibilidade desativou o serviço %1$s" "Prima sem soltar as teclas de volume durante três segundos para utilizar o serviço %1$s." - "Escolha uma funcionalidade para utilizar quando tocar no botão Acessibilidade:" - "Para alterar as funcionalidades, toque sem soltar no botão Acessibilidade." + "Escolha o serviço a utilizar quando tocar no botão de acessibilidade:" + "Escolha o serviço a utilizar com o gesto de acessibilidade (deslize rapidamente com dois dedos para cima a partir da parte inferior do ecrã):" + "Escolha o serviço a utilizar com o gesto de acessibilidade (deslize rapidamente com três dedos para cima a partir da parte inferior do ecrã):" + "Para alternar entre serviços, toque sem soltar no botão de acessibilidade." + "Para alternar entre serviços, deslize rapidamente com dois dedos para cima sem soltar." + "Para alternar entre serviços, deslize rapidamente com três dedos para cima sem soltar." "Ampliação" "%1$s do utilizador atual." "A mudar para %1$s…" diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index d873d2051dbe..d51c32992543 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -131,6 +131,7 @@ "Chamada no Wi-Fi de %s" + "Chamada no Wi-Fi de %s" "Chamada por WLAN" "Chamada por WLAN de %s" "Wi-Fi de %s" @@ -1611,8 +1612,6 @@ "Sobreposição nº %1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", seguro" - "Esse início de atividade em segundo plano a partir de %1$s será bloqueado nas versões futuras do Android Q. Acesse g.co/dev/bgblock." - "O início da atividade em segundo plano a partir de %1$s foi bloqueado. Acesse g.co/dev/bgblock." "Esqueci o padrão" "Padrão incorreto" "Senha incorreta" @@ -1666,8 +1665,12 @@ "O atalho de acessibilidade ativou o %1$s" "O atalho de acessibilidade desativou o %1$s" "Toque nos dois botões de volume e os mantenha pressionados por três segundo para usar o %1$s" - "Escolha um recurso a ser usado quando você toca no botão Acessibilidade:" - "Para alterar os recursos, mantenha o botão Acessibilidade pressionado." + "Escolha um serviço a ser usado quando você toca no botão Acessibilidade:" + "Escolha um serviço a ser usado com o gesto de acessibilidade (deslizar de baixo para cima na tela com dois dedos):" + "Escolha um serviço a ser usado com o gesto de acessibilidade (deslizar de baixo para cima na tela com três dedos):" + "Para alternar entre serviços, toque no botão de acessibilidade e mantenha-o pressionado." + "Para alternar entre serviços, deslize de baixo para cima na tela com dois dedos e mantenha-a pressionada." + "Para alternar entre serviços, deslize de baixo para cima na tela com três dedos e mantenha-a pressionada." "Ampliação" "Usuário atual %1$s." "Alternando para %1$s…" diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 0d5cff4467c3..6c873a83f9e1 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -132,6 +132,7 @@ "Apelare prin Wi-Fi %s" + "Apelare prin Wi-Fi %s" "Apel WLAN" "Apel WLAN %s" "Wi-Fi %s" @@ -1634,8 +1635,6 @@ "Suprapunerea %1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", securizat" - "Începerea activității în fundal de la %1$s va fi blocată în versiunile Q viitoare. Consultați g.co/dev/bgblock." - "Începerea activității din fundal de la %1$s este blocată. Consultați g.co/dev/bgblock." "Model uitat" "Model greșit" "Parolă greșită" @@ -1690,8 +1689,12 @@ "Comanda rapidă de accesibilitate a activat %1$s" "Comanda rapidă de accesibilitate a dezactivat %1$s" "Apăsați ambele butoane de volum timp de trei secunde pentru a folosi %1$s" - "Alegeți o funcție pe care să o folosiți când atingeți butonul Accesibilitate:" - "Pentru a schimba funcțiile, atingeți lung butonul Accesibilitate." + "Alegeți un serviciu pe care să îl folosiți când atingeți butonul de accesibilitate:" + "Alegeți un serviciu pe care să îl folosiți cu gestul de accesibilitate (glisați în sus cu două degete din partea de jos a ecranului):" + "Alegeți un serviciu pe care să îl folosiți cu gestul de accesibilitate (glisați în sus cu trei degete din partea de jos a ecranului):" + "Pentru a comuta între servicii, atingeți lung butonul de accesibilitate." + "Pentru a comuta între servicii, glisați în sus cu două degete și țineți lung." + "Pentru a comuta între servicii, glisați în sus cu trei degete și țineți lung." "Mărire" "Utilizator curent: %1$s." "Se comută la %1$s…" diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 2c17d59c1d4f..9beb40f7e995 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -133,6 +133,7 @@ "%s Звонки по Wi-Fi" + "Звонок по Wi-Fi через оператора \"%s\"" "Вызов WLAN" "%s Вызов WLAN" "%s Wi-Fi" @@ -1657,8 +1658,6 @@ "Наложение № %1$d" "%1$s: %2$d х %3$d, %4$d тчк/дюйм" ", безопасный" - "Действия приложения \"%1$s\" в фоновом режиме будут блокироваться в следующих сборках Android Q. Подробную информацию можно найти на странице g.co/dev/bgblock." - "Действие приложения \"%1$s\" в фоновом режиме заблокировано. Подробную информацию можно найти на странице g.co/dev/bgblock." "Забыли графический ключ?" "Неправильный графический ключ" "Неправильный пароль" @@ -1714,8 +1713,12 @@ "Сервис %1$s включен" "Сервис %1$s отключен" "Чтобы использовать сервис \"%1$s\", нажмите и удерживайте обе клавиши громкости в течение трех секунд." - "Выберите функцию, которая запускается при нажатии кнопки специальных возможностей:" - "Чтобы изменить функцию, удерживайте кнопку специальных возможностей." + "Выберите сервис, который будет запускаться при нажатии кнопки специальных возможностей:" + "Выберите сервис, который будет запускаться жестом для доступа к специальным возможностям (провести по экрану снизу вверх двумя пальцами):" + "Выберите сервис, который будет запускаться жестом для доступа к специальным возможностям (провести по экрану снизу вверх тремя пальцами):" + "Для переключения между сервисами нажмите и удерживайте кнопку специальных возможностей." + "Для переключения между сервисами проведите по экрану снизу вверх двумя пальцами и задержите их." + "Для переключения между сервисами проведите по экрану снизу вверх тремя пальцами и задержите их." "Увеличение" "Выбран аккаунт пользователя %1$s." "Смена профиля на %1$s…" diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index fc7f3ea978eb..1e531be3e713 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi ඇමතුම්" + "%s WiFi ඇමතුම" "WLAN ඇමතුම" "%s WLAN ඇමතුම්" "%s Wi-Fi" @@ -1613,8 +1614,6 @@ "උඩැතිරිය #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", ආරක්‍ෂිත" - "%1$s සිට ඇරඹෙන මෙම පසුබිම් ක්‍රියාකාරකම අනාගත Q නිමැවුම්වල අවහිර කෙරේ. g.co/dev/bgblock බලන්න." - "%1$s සිට ඇරඹෙන පසුබිම් ක්‍රියාකාරකම අවහිරයි. g.co/dev/bgblock බලන්න." "රටාව අමතකයි" "වැරදි රටාවකි" "වැරදි මුරපදය" @@ -1668,8 +1667,12 @@ "ප්‍රවේශ්‍යතා කෙටි මග %1$s ක්‍රියාත්මක කරන ලදී" "ප්‍රවේශ්‍යතා කෙටි මග %1$s ක්‍රියාවිරහිත කරන ලදී" "%1$s භාවිත කිරීමට හඬ පරිමා යතුරු දෙකම තත්පර තුනකට ඔබාගෙන සිටින්න" - "ඔබ ප්‍රවේශ්‍යතා බොත්තම තට්ටු කරන විට භාවිතා කිරීමට අංගයක් තෝරාගන්න:" - "අංග වෙනස් කිරීමට ප්‍රවේශ්‍යතා බොත්තම ස්පර්ශ කර අල්ලා ගෙන සිටින්න." + "ඔබ ප්‍රවේශ්‍යතා බොත්තම තට්ටු කරන විට භාවිතයට සේවාවක් තෝරා ගන්න:" + "ප්‍රවේශ්‍යතා ඉංගිතය සමඟ භාවිතයට සේවාවක් තෝරා ගන්න (ඇඟිලි දෙකක් සමඟින් තිරයේ පහළින් උඩට ස්වයිප් කරන්න):" + "ප්‍රවේශ්‍යතා ඉංගිතය සමඟ භාවිතයට සේවාවක් තෝරා ගන්න (ඇඟිලි තුනක් සමඟින් තිරයේ පහළින් උඩට ස්වයිප් කරන්න):" + "සේවා අතර මාරු වීමට, ප්‍රවේශ්‍යතා බොත්තම ස්පර්ශ කර අල්ලා සිටින්න." + "සේවා අතර මාරු වීමට, ඇඟිලි දෙකක් සමඟින් උඩට ස්වයිප් කර අල්ලා සිටින්න." + "සේවා අතර මාරු වීමට, ඇඟිලි තුනක් සමඟින් උඩට ස්වයිප් කර අල්ලා සිටින්න." "විශාලනය" "දැනට සිටින පරිශීලකයා %1$s." "%1$s වෙත මාරු කරමින්…" diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index cb12d4196a26..9cdab87c2b88 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -133,6 +133,7 @@ "%s volanie cez Wi-Fi" + "%s Volanie cez Wi‑Fi" "Volanie cez WLAN" "%s volanie cez WLAN" "%s Wi-Fi" @@ -301,7 +302,7 @@ "Povoliť aplikácii <b>%1$s</b> používať fotky, médiá a súbory v zariadení?" "Mikrofón" "nahrávanie zvuku" - "Povoliť aplikácii <b>%1$s</b> zaznamenávať zvuk?" + "Chcete povoliť aplikácii <b>%1$s</b> nahrávať zvuk?" "Fyzická aktivita" "prístup k vašej fyzickej aktivite" "Povoliť aplikácii <b>%1$s</b> prístup k vašej fyzickej aktivite?" @@ -430,7 +431,7 @@ "meniť nastavenia zvuku" "Umožňuje aplikácii upraviť globálne nastavenia zvuku, ako je hlasitosť, alebo určiť, z ktorého reproduktora bude zvuk vychádzať." "nahrávať zvuk" - "Táto aplikácia môže kedykoľvek zaznamenávať zvuk pomocou mikrofónu." + "Táto aplikácia môže kedykoľvek nahrávať zvuk pomocou mikrofónu." "posielanie príkazov do SIM karty" "Umožňuje aplikácii odosielať príkazy na SIM kartu. Toto je veľmi nebezpečné povolenie." "rozpoznávanie fyzickej aktivity" @@ -1580,7 +1581,7 @@ "Aplikáciu %s nie je možné spustiť" "Zdieľať s" "Zdieľať s aplikáciou %s" - "Posuvné tlačidlo. Dotknite sa a podržte." + "Posuvník. Pridržte." "Posunom odomknúť." "Prejsť na plochu" "Prejsť na" @@ -1657,8 +1658,6 @@ "Prekrytie č. %1$d" "%1$s: %2$d x %3$d, %4$d dpi" ", zabezpečené" - "Toto spustenie aktivity na pozadí v režime %1$s bude blokované v budúcich zostavách Q. Pozrite si informácie na g.co/dev/bgblock." - "Spustenie aktivity na pozadí v režime %1$s je blokované. Pozrite si informácie na g.co/dev/bgblock." "Nepamätám si vzor" "Nesprávny vzor" "Nesprávne heslo" @@ -1714,8 +1713,12 @@ "Skratka dostupnosti zapla službu %1$s" "Skratka dostupnosti vypla službu %1$s" "Ak chcete používať službu %1$s, pridržte tri sekundy oba klávesy hlasitosti" - "Klepnutím na tlačidlo dostupnosti vyberte požadovanú funkciu:" - "Ak chcete zmeniť funkcie, klepnite na tlačidlo dostupnosti a podržte ho" + "Vyberte službu, ktorú chcete používať po klepnutí na tlačidlo dostupnosti:" + "Vyberte službu, ktorú chcete používať s daným gestom dostupnosti (potiahnutím dvoma prstami z dolnej časti obrazovky smerom nahor):" + "Vyberte službu, ktorú chcete používať s daným gestom dostupnosti (potiahnutím troma prstami z dolnej časti obrazovky smerom nahor):" + "Služby prepnete pridržaním tlačidla dostupnosti." + "Služby prepnete potiahnutím dvoma prstami smerom nahor a pridržaním." + "Služby prepnete potiahnutím troma prstami smerom nahor a pridržaním." "Priblíženie" "Aktuálny používateľ je %1$s." "Prepína sa na účet %1$s…" diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 088eb48b6103..cbe6eb5a5da9 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -133,6 +133,7 @@ "Klicanje prek Wi-Fi-ja operaterja %s" + "Klicanje prek Wi‑Fi-ja pri operaterju %s" "Klic prek omrežja WLAN" "Klic prek omrežja WLAN operaterja %s" "Wi-Fi operaterja %s" @@ -1657,8 +1658,6 @@ "Prekrivanje #%1$d" "%1$s: %2$d x %3$d, %4$d pik na palec" ", varen" - "Ta zagon dejavnosti v ozadju za paket %1$s bo blokiran v prihodnjih različicah Androida Q. Za več informacij obiščite g.co/dev/bgblock." - "Zagon dejavnosti v ozadju za paket %1$s je bil blokiran. Za več informacij obiščite g.co/dev/bgblock." "Pozabljen vzorec" "Napačen vzorec" "Napačno geslo" @@ -1714,8 +1713,12 @@ "Bližnjica funkcij za ljudi s posebnimi potrebami je vklopila %1$s" "Bližnjica funkcij za ljudi s posebnimi potrebami je izklopila %1$s" "Za uporabo storitve %1$s pritisnite obe tipki za glasnost in ju pridržite tri sekunde" - "Izberite funkcijo, ki jo želite uporabljati, ko se dotaknete gumba »Dostopnost«:" - "Če želite spremeniti funkcije, se dotaknite gumba »Dostopnost« in ga pridržite." + "Izberite storitev, ki jo želite uporabljati, ko se dotaknete gumba za funkcije za ljudi s posebnimi potrebami:" + "Izberite storitev, ki jo želite zagnati s potezo za ljudi s posebnimi potrebami (vlečenje z dvema prstoma z dna zaslona navzgor):" + "Izberite storitev, ki jo želite zagnati s potezo za ljudi s posebnimi potrebami (vlečenje s tremi prsti z dna zaslona navzgor):" + "Če želite preklopiti med storitvami, pridržite gumb za funkcije za ljudi s posebnimi potrebami." + "Če želite preklopiti med storitvami, z dvema prstoma povlecite navzgor in pridržite." + "Če želite preklopiti med storitvami, s tremi prsti povlecite navzgor in pridržite." "Povečava" "Trenutni uporabnik %1$s." "Preklop na uporabnika %1$s …" diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 4c2543c7e16d..6071bb8a37fd 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -131,6 +131,7 @@ "Telefonatë me Wi-Fi në %s" + "Telefonatat me WiFi me %s" "Telefonatë me WLAN" "Telefonatë me WLAN në %s" "Wi-Fi në %s" @@ -1612,8 +1613,6 @@ "Mbivendosja #%1$d" "%1$s: %2$dx%3$d, %4$d ppi" ", i sigurt" - "Kjo nisje e aktivitetit në sfond nga %1$s do të bllokohet në ndërtimet e ardhshme të Q. Shiko g.co/dev/bgblock." - "Nisja e aktivitetit në sfond nga %1$s u bllokua. Shiko g.co/dev/bgblock." "Harrova motivin" "Motivi është i gabuar" "Fjalëkalim i gabuar" @@ -1667,8 +1666,12 @@ "Shkurtorja e qasshmërisë e aktivizoi %1$s" "Shkurtorja e qasshmërisë e çaktivizoi %1$s" "Shtyp dhe mbaj shtypur të dy butonat e volumit për tre sekonda për të përdorur %1$s" - "Zgjidh një funksion për ta përdorur kur troket butonin e \"Qasshmërisë\":" - "Për të ndryshuar funksionet, prek dhe mbaj butonin e \"Qasshmërisë\"." + "Zgjidh një shërbim për ta përdorur kur troket butonin e qasshmërisë:" + "Zgjidh një shërbim për ta përdorur me gjestin e qasshmërisë (rrëshqit shpejt lart nga fundi i ekranit me dy gishta):" + "Zgjidh një shërbim për ta përdorur me gjestin e qasshmërisë (rrëshqit shpejt lart nga fundi i ekranit me tre gishta):" + "Për të kaluar mes shërbimeve, prek dhe mbaj prekur butonin e qasshmërisë." + "Për të kaluar mes pajisjeve, rrëshqit shpejt lart me dy gishta dhe mbaje prekur." + "Për të kaluar mes pajisjeve, rrëshqit shpejt lart me tre gishta dhe mbaje prekur." "Zmadhimi" "Emri i përdoruesit aktual: %1$s" "Po kalon në %1$s…" diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index e95d15449480..c707180d52fb 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -132,6 +132,7 @@ "%s позивање преко Wi-Fi-ја" + "%s – позивање преко Wi-Fi-ја" "WLAN позив" "%s WLAN позив" "%s Wi-Fi" @@ -1634,8 +1635,6 @@ "Постављени елемент бр. %1$d" "%1$s: %2$d×%3$d, %4$d dpi" ", безбедно" - "Ово покретање активности у позадини са %1$s биће блокирано у будућим Q верзијама. Погледајте g.co/dev/bgblock." - "Покретање активности у позадини са %1$s је блокирано. Погледајте g.co/dev/bgblock." "Заборављени шаблон" "Погрешан шаблон" "Погрешна лозинка" @@ -1690,8 +1689,12 @@ "Пречица за приступачност је укључила услугу %1$s" "Пречица за приступачност је искључила услугу %1$s" "Притисните и задржите оба тастера за јачину звука три секунде да бисте користили %1$s" - "Изаберите функцију која ће се користити када додирнете дугме за приступачност:" - "Притисните и задржите дугме за приступачност да бисте мењали функције." + "Одаберите услугу која ће се користити када додирнете дугме за приступачност:" + "Одаберите функцију која ће се користити помоћу покрета за приступачност (помоћу два прста превуците нагоре од дна екрана):" + "Одаберите услугу која ће се користити помоћу покрета за приступачност (помоћу три прста превуците нагоре од дна екрана):" + "Да бисте прелазили са једне услуге на другу, додирните и задржите дугме за приступачност." + "Да бисте прелазили са једне услуге на другу, превуците нагоре помоћу два прста и задржите." + "Да бисте прелазили са једне услуге на другу, превуците нагоре помоћу три прста и задржите." "Увећање" "Актуелни корисник %1$s." "Пребацивање на %1$s…" diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 6335fcd40def..b57ae8a5cb1f 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -131,6 +131,7 @@ "Wi-Fi-samtal via %s" + "Wi-Fi-samtal med %s" "WLAN-samtal" "WLAN-samtal via %s" "Wi-Fi via %s" @@ -295,7 +296,7 @@ "Vill du ge <b>%1$s</b> åtkomst till foton, mediefiler och andra filer på enheten?" "Mikrofon" "spela in ljud" - "Vill du ge <b>%1$sn</b> behörighet att spela in ljud?" + "Vill du ge <b>%1$s</b> behörighet att spela in ljud?" "Fysiska aktivitet" "åtkomst till data om fysisk aktivitet" "Vill du ge <b>%1$s</b> to åtkomst till data om fysisk aktivitet?" @@ -1611,8 +1612,6 @@ "Överlagring #%1$d" "%1$s: %2$d x %3$d, %4$d dpi" ", säker" - "Denna bakgrundsaktivitet som startar från %1$s blockeras i framtida Q-versioner. Läs mer på g.co/dev/bgblock." - "Start av bakgrundsaktivitet från %1$s blockerades. Läs mer på g.co/dev/bgblock." "Har du glömt ditt grafiska lösenord?" "Fel grafiskt lösenord" "Fel lösenord" @@ -1666,8 +1665,12 @@ "%1$s aktiverades av Aktivera tillgänglighet snabbt" "%1$s inaktiverades av Aktivera tillgänglighet snabbt" "Tryck och håll båda volymknapparna i tre sekunder för att använda %1$s" - "Välj en funktion som ska användas när du trycker på tillgänglighetsknappen:" - "Tryck länge på tillgänglighetsknappen för att ändra funktioner." + "Välj en tjänst som ska användas när du trycker på tillgänglighetsknappen:" + "Välj en tjänst som ska användas med tillgänglighetsrörelsen (svepa uppåt med två fingrar från skärmens nederkant):" + "Välj en tjänst som ska användas med tillgänglighetsrörelsen (svepa uppåt med tre fingrar från skärmens nederkant):" + "Byt mellan tjänster genom att trycka länge på tillgänglighetsknappen." + "Byt mellan tjänster genom att svepa uppåt med två fingrar och hålla kvar dem." + "Byt mellan tjänster genom att svepa uppåt med tre fingrar och hålla kvar dem." "Förstoring" "Nuvarande användare: %1$s." "Byter till %1$s …" diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 4d5821a4f847..c2b08caaca61 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -131,6 +131,7 @@ "Kupiga Simu Kupitia Wi-Fi ya %s" + "Kupiga Simu Kupitia WiFi %s" "Simu ya WLAN" "Simu ya WLAN ya %s" "Wi-Fi ya %s" @@ -1611,8 +1612,6 @@ "Uwekeleaji #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", salama" - "Itazuia shughuli hii ya chinichini inayoanzia %1$s katika miundo ya baadaye ya Q. Angalia g.co/dev/bgblock." - "Imezuia shughuli za chinichini zinazoanzia %1$s. Angalia g.co/dev/bgblock." "Umesahau Ruwaza" "Mchoro huo si sahihi" "Nenosiri Lisilo sahihi" @@ -1666,8 +1665,12 @@ "Njia ya mkato ya zana za walio na matatizo ya kuona au kusikia imewasha %1$s" "Njia ya mkato ya zana za walio na matatizo ya kuona au kusikia imezima %1$s" "Bonyeza na ushikilie vitufe vyote viwili vya sauti kwa sekunde tatu ili utumie %1$s" - "Chagua kipengele utakachotumia, ukigusa kitufe cha Ufikivu:" - "Ili kubadilisha vipengele, gusa na ushikilie kitufe cha Ufikivu." + "Chagua huduma ya kutumia unapogusa kitufe cha ufikivu:" + "Chagua huduma ya kutumia pamoja na ishara ya ufikivu (telezesha vidole viwili juu kutoka sehemu ya chini ya skrini):" + "Chagua huduma ya kutumia pamoja na ishara ya ufikivu (telezesha vidole vitatu juu kutoka sehemu ya chini ya skrini):" + "Ili ubadilishe kati ya huduma, gusa na ushikilie kitufe cha ufikivu." + "Ili ubadilishe kati ya huduma, telezesha vidole viwili juu na ushikilie." + "Ili ubadilishe kati ya huduma, telezesha vidole vitatu juu na ushikilie." "Ukuzaji" "Mtumiaji wa sasa %1$s." "Inabadili kwenda %1$s…" diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index b87a1122fc19..295c90e12c7c 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -131,6 +131,8 @@ "%s வைஃபை அழைப்பு" + + "WLAN அழைப்பு" "%s WLAN அழைப்பு" "%s வைஃபை" @@ -1612,8 +1614,6 @@ "மேலோட்ட #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", பாதுகாப்பானது" - "%1$sமின் \'பின்னணிச் செயல்பாடுத் தொடக்கம்\' இனிவரும் Q பதிப்புகளில் தடுக்கப்படும். g.co/dev/bgblock என்ற இணைப்பைப் பார்க்கவும்." - "%1$sமில் \'பின்னணிச் செயல்பாட்டுத் தொடக்கம்\' தடுக்கப்பட்டுள்ளது. g.co/dev/bgblock என்ற இணைப்பைப் பார்க்கவும்." "வடிவத்தை மறந்துவிட்டீர்களா" "தவறான வடிவம்" "தவறான கடவுச்சொல்" @@ -1667,8 +1667,12 @@ "அணுகல்தன்மை ஷார்ட்கட்டானது %1$sஐ இயக்கியது" "அணுகல்தன்மை ஷார்ட்கட்டானது %1$sஐ முடக்கியது" "%1$sஐப் பயன்படுத்த 3 விநாடிகளுக்கு இரண்டு ஒலியளவு பட்டன்களையும் அழுத்திப் பிடிக்கவும்" - "அணுகல்தன்மை பட்டனைத் தட்டி, பயன்படுத்துவதற்கான அம்சத்தைத் தேர்ந்தெடுக்கவும்:" - "அம்சங்களை மாற்ற, அணுகல்தன்மை பட்டனைத் தொட்டுப் பிடித்திருக்கவும்." + "அணுகல்தன்மை பட்டனுக்கான சேவையைத் தேர்வுசெய்யவும்:" + "அணுகல்தன்மை சைகைக்கான சேவையைத் தேர்வுசெய்யவும் (இரண்டு விரல்களால் திரையின் கீழிருந்து மேல் நோக்கி ஸ்வைப் செய்யவும்):" + "அணுகல்தன்மை சைகைக்கான சேவையைத் தேர்வுசெய்யவும் (மூன்று விரல்களால் திரையின் கீழிருந்து மேல் நோக்கி ஸ்வைப் செய்யவும்):" + "சேவைகளுக்கு இடையே மாற அணுகல்தன்மை பட்டனைத் தொட்டுப் பிடிக்கவும்." + "சேவைகளுக்கு இடையே மாற இரண்டு விரல்களால் மேல்நோக்கி ஸ்வைப் செய்து பிடிக்கவும்." + "சேவைகளுக்கு இடையே மாற மூன்று விரல்களால் மேல்நோக்கி ஸ்வைப் செய்து பிடிக்கவும்." "பெரிதாக்கல்" "நடப்பு பயனர் %1$s." "%1$sக்கு மாறுகிறது…" diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index ff1643cd3e4c..0d6fd4a76055 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi కాలింగ్" + "%s Wi-Fi కాలింగ్" "WLAN కాల్" "%s WLAN కాల్" "%s Wi-Fi" @@ -1612,8 +1613,6 @@ "అతివ్యాప్తి #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", సురక్షితం" - "%1$s నుండి ప్రారంభం అయ్యే నేపథ్య కార్యకలాపం భవిష్యత్తు Q బిల్డ్‌లలో బ్లాక్ చేయబడుతుంది. See g.co/dev/bgblock." - "%1$s నుండి ప్రారంభం అయ్యే నేపథ్య కార్యకలాపం బ్లాక్ చేయబడింది. See g.co/dev/bgblock." "నమూనాను మర్చిపోయాను" "ఆకృతి తప్పు" "పాస్‌వర్డ్ తప్పు" @@ -1667,8 +1666,12 @@ "యాక్సెస్ సామర్థ్య షార్ట్‌కట్ ద్వారా %1$s ఆన్ చేయబడింది" "యాక్సెస్ సామర్థ్య షార్ట్‌కట్ ద్వారా %1$s ఆఫ్ చేయబడింది" "%1$sని ఉపయోగించడానికి వాల్యూమ్ కీలు రెండింటినీ 3 సెకన్లు నొక్కి ఉంచండి" - "యాక్సెస్ సామర్థ్య బటన్‌ను మీరు నొక్కినప్పుడు ఉపయోగించాల్సిన ఒక ఫీచర్‌ను ఎంచుకోండి:" - "ఫీచర్లను మార్చడానికి, యాక్సెస్ సామర్థ్య బటన్‌ను నొక్కి & పట్టుకోండి." + "యాక్సెసిబిలిటీ బటన్‌ను మీరు నొక్కినప్పుడు ఉపయోగించాల్సిన ఒక ఫీచర్‌ను ఎంచుకోండి:" + "యాక్సెసిబిలిటీ సంజ్ఞతో ఉపయోగించడానికి ఒక సేవను ఎంచుకోండి (రెండు చేతి వేళ్లతో స్క్రీన్‌ను కింద నుండి పైకి స్వైప్ చేయండి):" + "యాక్సెసిబిలిటీ సంజ్ఞతో ఉపయోగించడానికి ఒక సేవను ఎంచుకోండి (మూడు చేతి వేళ్లతో స్క్రీన్‌ను కింద నుండి పైకి స్వైప్ చేయండి):" + "సేవల మధ్య మారడానికి, యాక్సెసిబిలిటీ బటన్‌ను నొక్కి & పట్టుకోండి." + "సేవల మధ్య మారడానికి, రెండు చేతి వేళ్ళతో పైకి స్వైప్ చేసి పట్టుకోండి." + "సేవల మధ్య మారడానికి, మూడు చేతి వేళ్ళతో పైకి స్వైప్ చేసి పట్టుకోండి." "మాగ్నిఫికేషన్" "ప్రస్తుత వినియోగదారు %1$s." "%1$sకి మారుస్తోంది…" diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 42294da969c7..ae3f7a89f4ac 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -131,6 +131,7 @@ "การโทรผ่าน Wi-Fi %s" + "การโทรผ่าน Wi-Fi ของ %s" "การโทรผ่าน WLAN" "การโทรผ่าน WLAN %s" "Wi-Fi %s" @@ -1611,8 +1612,6 @@ "การวางซ้อน #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", ปลอดภัย" - "การเริ่มกิจกรรมในเบื้องหลังจาก %1$s นี้จะถูกบล็อกในบิวด์ Q ในอนาคต โปรดดู g.co/dev/bgblock" - "บล็อกการเริ่มกิจกรรมในเบื้องหลังจาก %1$s แล้ว โปรดดู g.co/dev/bgblock" "ลืมรูปแบบใช่หรือไม่" "รูปแบบไม่ถูกต้อง" "รหัสผ่านไม่ถูกต้อง" @@ -1666,8 +1665,12 @@ "ทางลัดการเข้าถึงเปิด %1$s แล้ว" "ทางลัดการเข้าถึงปิด %1$s แล้ว" "กดปุ่มปรับระดับเสียงทั้ง 2 ปุ่มค้างไว้ 3 วินาทีเพื่อใช้ %1$s" - "เลือกฟีเจอร์ที่จะใช้เมื่อคุณแตะปุ่ม \"การช่วยเหลือพิเศษ\":" - "หากต้องการเปลี่ยนฟีเจอร์ ให้แตะปุ่ม \"การช่วยเหลือพิเศษ\" ค้างไว้" + "เลือกบริการที่จะใช้เมื่อคุณแตะปุ่มการช่วยเหลือพิเศษ:" + "เลือกบริการที่จะใช้กับท่าทางสัมผัสการช่วยเหลือพิเศษ (ใช้ 2 นิ้วเลื่อนขึ้นจากด้านล่างของหน้าจอ):" + "เลือกบริการที่จะใช้กับท่าทางสัมผัสการช่วยเหลือพิเศษ (ใช้ 3 นิ้วเลื่อนขึ้นจากด้านล่างของหน้าจอ):" + "หากต้องการสลับระหว่างบริการ ให้แตะปุ่มการช่วยเหลือพิเศษค้างไว้" + "หากต้องการสลับระหว่างบริการ ให้ใช้ 2 นิ้วเลื่อนขึ้นค้างไว้" + "หากต้องการสลับระหว่างบริการ ให้ใช้ 3 นิ้วเลื่อนขึ้นค้างไว้" "การขยาย" "ผู้ใช้ปัจจุบัน %1$s" "กำลังเปลี่ยนเป็น %1$s…" diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 346a0b60380c..b9d86e7127d5 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -131,6 +131,7 @@ "Pagtawag Gamit ang Wi-Fi ng %s" + "Pagtawag Gamit ang WiFi ng %s" "Pagtawag Gamit ang WLAN" "Pagtawag Gamit ang WLAN ng %s" "Wi-Fi ng %s" @@ -1611,8 +1612,6 @@ "Overlay #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", secure" - "Iba-block ang pagsisimula ng aktibidad sa background na ito mula sa %1$s sa mga Q build sa hinaharap. Tingnan ang g.co/dev/bgblock." - "Na-block ang pagsisimula ng aktibidad sa background mula sa %1$s. Tingnan ang g.co/dev/bgblock." "Nakalimutan ang Pattern" "Maling Pattern" "Maling Password" @@ -1666,8 +1665,12 @@ "Na-on ng Shortcut sa Accessibility ang %1$s" "Na-off ng Shortcut sa Accessibility ang %1$s" "Pindutin nang matagal ang parehong volume key sa loob ng tatlong segundo para magamit ang %1$s" - "Pumili ng feature na gagamitin kapag na-tap mo ang button ng Pagiging Accessible:" - "Upang baguhin ang mga feature, pindutin nang matagal ang button ng Pagiging Naa-access." + "Pumili ng serbisyong gagamitin kapag na-tap mo ang button ng pagiging accessible:" + "Pumili ng serbisyong gagamitin sa galaw ng pagiging accessible (pag-swipe pataas mula sa ibaba ng screen gamit ang dalawang daliri):" + "Pumili ng serbisyong gagamitin sa galaw ng pagiging accessible (pag-swipe pataas mula sa ibaba ng screen gamit ang tatlong daliri):" + "Para magpalipat-lipat sa mga serbisyo, pindutin nang matagal ang button ng pagiging accessible." + "Para magpalipat-lipat sa mga serbisyo, mag-swipe pataas gamit ang dalawang daliri at i-hold." + "Para magpalipat-lipat sa mga serbisyo, mag-swipe pataas gamit ang tatlong daliri at i-hold." "Pag-magnify" "Kasalukuyang user %1$s." "Lumilipat kay %1$s…" diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 233eb8eb08c4..276d4d75d0fc 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -131,6 +131,7 @@ "%s Kablosuz Çağrı" + "%s Kablosuz Arama" "WLAN Üzerinden Çağrı" "%s WLAN Üzerinden Çağrı" "%s Kablosuz" @@ -1611,8 +1612,6 @@ "Yer Paylaşımı No. %1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", güvenli" - "%1$s paketinden bu arka plan etkinliği başlangıcı, ilerideki Q derlemelerinde engellenecek. g.co/dev/bgblock adresini ziyaret edin." - "%1$s paketinden arka plan etkinliği başlangıcı engellendi. g.co/dev/bgblock adresini ziyaret edin." "Deseni Unuttunuz mu?" "Yanlış Desen" "Yanlış Şifre" @@ -1666,8 +1665,12 @@ "Erişilebilirlik Kısayolu %1$s hizmetini açtı" "Erişilebilirlik Kısayolu %1$s hizmetini kapattı" "%1$s hizmetini kullanmak için her iki ses tuşunu basılı tutun" - "Erişilebilirlik düğmesine dokunduğunuzda kullanmak üzere bir özellik seçin:" - "Özellikleri değiştirmek için Erişilebilirlik düğmesine dokunup basılı tutun." + "Erişilebilirlik düğmesine dokunduğunuzda kullanmak üzere bir hizmet seçin:" + "Erişilebilirlik hareketiyle (iki parmakla ekranın altından yukarı kaydırma) kullanılacak bir hizmet seçin:" + "Erişilebilirlik hareketiyle (üç parmakla ekranın altından yukarı kaydırma) kullanılacak bir hizmet seçin:" + "Hizmetler arasında geçiş yapmak erişilebilirlik düğmesine dokunup basılı tutun." + "Hizmetler arasında geçiş yapmak için iki parmakla yukarı kaydırıp basılı tutun." + "Hizmetler arasında geçiş yapmak için üç parmakla yukarı kaydırıp basılı tutun." "Büyütme" "Geçerli kullanıcı: %1$s." "%1$s adlı kullanıcıya geçiliyor…" diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 6fb4cbd17ff9..7b0ce4d0aa59 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -133,6 +133,7 @@ "Виклики %s через Wi-Fi" + "Дзвінок від абонента %s через Wi-Fi" "Виклик через WLAN" "Виклик %s через WLAN" "%s через Wi-Fi" @@ -1657,8 +1658,6 @@ "Накладання №%1$d" "%1$s: %2$dх%3$d, %4$d dpi" ", безпечний" - "Фонову активність пакета %1$s буде заблоковано в майбутніх складаннях Q. Докладніше: g.co/dev/bgblock." - "Фонову активність додатка %1$s заблоковано. Докладніше: g.co/dev/bgblock." "Не пам’ятаю ключ" "Неправильний ключ" "Неправильний пароль" @@ -1714,8 +1713,12 @@ "Ярлик спеціальних можливостей увімкнув %1$s" "Ярлик спеціальних можливостей вимкнув %1$s" "Щоб скористатися службою %1$s, утримуйте обидві клавіші гучності впродовж трьох секунд" - "Виберіть функцію для кнопки спеціальних можливостей:" - "Щоб змінити функцію, натисніть і втримуйте кнопку спеціальних можливостей." + "Виберіть сервіс для кнопки спеціальних можливостей:" + "Виберіть сервіс для жесту спеціальних можливостей (проведення двома пальцями знизу вгору):" + "Виберіть сервіс для жесту спеціальних можливостей (проведення трьома пальцями знизу вгору):" + "Щоб переключитися між сервісами, натисніть і утримуйте кнопку спеціальних можливостей." + "Щоб переключитися між сервісами, проведіть двома пальцями вгору й утримуйте екран." + "Щоб переключитися між сервісами, проведіть трьома пальцями вгору й утримуйте екран." "Збільшення" "Поточний користувач: %1$s." "Перехід в обліковий запис \"%1$s\"…" diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index a132989112b1..38cbc5a9e231 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -131,6 +131,7 @@ "‏%s Wi-Fi کالنگ" + "‏%s Wi-Fi کالنگ" "‏WLAN کال" "‏%s WLAN کال" "%s Wi-Fi" @@ -1612,8 +1613,6 @@ "‏اوور لے ‎#%1$d" "%1$s: %2$dx%3$d, %4$d dpi" "، محفوظ" - "‏%1$s سے شروع ہونے والی پس منظر کی اس سرگرمی کو مستقبل کے Q بلڈز میں مسدود کر دیا جائے گا۔ g.co/dev/bgblock ملاحظہ کریں۔" - "‏%1$s سے شروع ہونے والی پس منظر کی سرگرمی کو مسدود کر دیا گیا ہے۔ g.co/dev/bgblock ملاحظہ کریں۔" "پیٹرن بھول گئے" "غلط پیٹرن" "غلط پاس ورڈ" @@ -1667,8 +1666,12 @@ "ایکسیسبیلٹی شارٹ کٹ نے %1$s کو آن کر دیا" "ایکسیسبیلٹی شارٹ کٹ نے %1$s کو آف کر دیا" "%1$s کا استعمال کرنے کے لیے 3 سیکنڈ تک والیوم کی دونوں کلیدوں کو چھوئیں اور دبائے رکھیں" - "ایکسیسبیلٹی بٹن پر تھپتھپانے وقت استعمال کرنے کیلئے ایک خصوصیت چنیں:" - "خصوصیات تبدیل کرنے کیلئے، ایکسیسبیلٹی بٹن ٹچ کریں اور دبائے رکھیں۔" + "ایکسیسبیلٹی بٹن پر تھپتھپانے وقت استعمال کرنے کیلئے ایک سروس چنیں:" + "ایکسیسبیلٹی اشارہ کے ساتھ استعمال کرنے کے لیے ایک سروس چنیں (دو انگلیوں سے اسکرین کے نیچے سے اوپر کی طرف سوائپ کریں):" + "ایکسیسبیلٹی اشارہ کے ساتھ استعمال کرنے کے لیے ایک سروس چنیں (تین انگلیوں سے اسکرین کے نیچے سے اوپر کی طرف سوائپ کریں):" + "سروسز کے مابین سوئچ کرنے کے لیے، ایکسیسبیلٹی بٹن کو ٹچ کرکے ہولڈ کریں۔" + "سروسز کے مابین سوئچ کرنے کے لیے، دو انگلیوں سے سوائپ کرکے ہولڈ کریں۔" + "سروسز کے مابین سوئچ کرنے کے لیے، تین انگلیوں سے سوائپ کرکے ہولڈ کریں۔" "میگنیفکیشن" "موجودہ صارف %1$s۔" "%1$s پر سوئچ کیا جا رہا ہے…" diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 7775aa70a575..d32c9c8b3e4a 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi chaqiruv" + "%s Wi-Fi chaqiruv" "WLAN chaqiruv" "%s WLAN chaqiruv" "%s Wi-Fi" @@ -1612,8 +1613,6 @@ "Tasvir uzatish #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", xavfsiz" - "Keyingi Android Q nashrlarida fondagi ushbu %1$s jarayoni bloklanadi. g.co/dev/bgblock bilan tanishing." - "Fondagi %1$s jarayoni bloklandi. g.co/dev/bgblock bilan tanishing." "Grafik kalit esimdan chiqdi" "Grafik kalit xato" "Parol noto‘g‘ri" @@ -1667,8 +1666,12 @@ "%1$s xizmati yoqildi" "%1$s xizmati o‘chirib qo‘yildi" "%1$s xizmatidan foydalanish uchun ikkala ovoz balandligi tugmalarini uzoq bosib turing" - "Maxsus imkoniyatlar tugmasi bosilganda ishga tushadigan funksiyani tanlang:" - "Funksiyalarni o‘zgartirish uchun Maxsus imkoniyatlar tugmasini bosib turing." + "Maxsus imkoniyatlar tugmasi bosilganda ishga tushadigan xizmatni tanlang:" + "Maxsus imkoniyatlar ishorasi bilan ishga tushadigan xizmatni tanlang (2 barmoq bilan ekranning pastidan tepaga surib tortilganda:" + "Maxsus imkoniyatlar ishorasi bilan ishga tushadigan xizmatni tanlang (3 barmoq bilan ekranning pastidan tepaga surib tortilganda:" + "Xizmatlarni almashtirihs uchun maxsus imkoniyatlar tugmasini bosib turing." + "Xizmatlarni almashtirish uchun 2 barmoq bilan tepaga suring va bosib turing." + "Xizmatlarni almashtirish uchun 3 barmoq bilan tepaga suring va bosib turing." "Kattalashtirish" "Joriy foydalanuvchi %1$s." "Quyidagi foydalanuvchiga o‘tilmoqda: %1$s…" diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 57c9816f7571..5fddbcca2df3 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -131,6 +131,7 @@ "Gọi qua Wi-Fi %s" + "Gọi qua Wi-Fi %s" "Cuộc gọi qua WLAN" "Cuộc gọi qua WLAN %s" "Wi-Fi %s" @@ -1611,8 +1612,6 @@ "Lớp phủ #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", an toàn" - "Tính năng bắt đầu hoạt động trong nền từ %1$s này sẽ bị chặn ở các bản dựng Q trong tương lai. Hãy xem trang g.co/dev/bgblock để biết thêm chi tiết." - "Tính năng bắt đầu hoạt động trong nền từ %1$s đã bị chặn. Hãy xem trang g.co/dev/bgblock để biết thêm chi tiết." "Đã quên hình" "Hình không chính xác" "Mật khẩu sai" @@ -1666,8 +1665,12 @@ "Đã bật phím tắt trợ năng %1$s" "Đã tắt phím tắt trợ năng %1$s" "Nhấn và giữ đồng thời cả hai phím âm lượng trong 3 giây để sử dụng %1$s" - "Chọn tính năng sẽ sử dụng khi bạn nhấn nút Hỗ trợ tiếp cận:" - "Để thay đổi các tính năng, hãy chạm và giữ nút Hỗ trợ tiếp cận." + "Chọn dịch vụ sẽ sử dụng khi bạn nhấn vào nút hỗ trợ tiếp cận:" + "Chọn dịch vụ sẽ sử dụng với cử chỉ hỗ trợ tiếp cận (vuốt lên từ cuối màn hình bằng 2 ngón tay):" + "Chọn dịch vụ sẽ sử dụng với cử chỉ hỗ trợ tiếp cận (vuốt lên từ cuối màn hình bằng 3 ngón tay):" + "Để chuyển đổi giữa các dịch vụ, hãy chạm và giữ nút hỗ trợ tiếp cận." + "Để chuyển đổi giữa các dịch vụ, hãy vuốt lên và giữ bằng 2 ngón tay." + "Để chuyển đổi giữa các dịch vụ, hãy vuốt lên và giữ bằng 3 ngón tay." "Phóng to" "Người dùng hiện tại %1$s." "Đang chuyển sang %1$s…" diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index ad08e53fbf37..a5f57899c701 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -131,6 +131,7 @@ "%s WLAN 通话" + "%s WLAN 通话" "WLAN 通话" "%s WLAN 通话" "%s WLAN" @@ -1611,8 +1612,6 @@ "叠加视图 #%1$d" "%1$s%2$dx%3$d%4$d dpi" ",安全" - "%1$s 的这类后台活动启动程序会在日后的 Android Q 版本中遭到屏蔽。请参阅 g.co/dev/bgblock。" - "已屏蔽 %1$s 的后台活动启动程序。请参阅 g.co/dev/bgblock。" "忘记了图案" "图案错误" "密码错误" @@ -1666,8 +1665,12 @@ "无障碍快捷方式已开启%1$s" "无障碍快捷方式已关闭%1$s" "同时按住两个音量键 3 秒钟即可使用 %1$s" - "选择按下“无障碍”按钮时要使用的功能:" - "要更改指定的功能,请触摸并按住“无障碍”按钮。" + "选择按“无障碍”按钮后要使用的服务:" + "选择要搭配无障碍手势(用两指从屏幕底部向上滑动)使用的服务:" + "选择要搭配无障碍手势(用三指从屏幕底部向上滑动)使用的服务:" + "要在多项服务之间切换,请轻触并按住“无障碍”按钮。" + "要在多项服务之间切换,请用两指向上滑动并按住。" + "要在多项服务之间切换,请用三指向上滑动并按住。" "放大功能" "当前用户是%1$s。" "正在切换为%1$s…" diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 27605359e337..b0e359339dd5 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi 通話" + "%s Wi-Fi 通話" "WLAN 通話" "%s WLAN 通話" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "重疊效果 #%1$d" "%1$s%2$dx%3$d%4$d dpi" "(安全)" - "在日後的 Q 版本中,系統將會封鎖這個由 %1$s 啟動的背景活動。請瀏覽 g.co/dev/bgblock。" - "已封鎖 %1$s 啟動的背景活動。請瀏覽 g.co/dev/bgblock。" "忘記圖案" "圖形不對" "密碼錯誤" @@ -1666,8 +1665,12 @@ "無障礙功能快速鍵已啟用 %1$s" "無障礙功能快速鍵已停用 %1$s" "㩒住兩個音量鍵 3 秒就可以用 %1$s" - "請選擇輕按「無障礙功能」按鈕時使用的功能:" - "如要變更功能,可按住「無障礙功能」按鈕。" + "請選擇輕按無障礙功能按鈕時使用的服務:" + "請選擇透過無障礙手勢 (使用兩隻手指從螢幕底部向上滑動) 使用的服務:" + "請選擇透過無障礙手勢 (使用三隻手指從螢幕底部向上滑動) 使用的服務:" + "如要在服務之間切換,請按住無障礙功能按鈕。" + "如要在服務之間切換,請使用兩隻手指向上滑動並按住。" + "如要在服務之間切換,請使用三隻手指向上滑動並按住。" "放大" "目前的使用者是%1$s。" "正在切換至%1$s…" diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 59e52fc833eb..2349ebf74d28 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -131,6 +131,7 @@ "%s Wi-Fi 通話" + "%s Wi-Fi 通話" "WLAN 通話" "%s WLAN 通話" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "第 %1$d 個重疊效果" "%1$s%2$dx%3$d%4$d dpi" "(安全)" - "%1$s 的這類背景活動啟動程序會在日後的 Android Q 版本遭到封鎖。請前往 g.co/dev/bgblock 查看詳情。" - "已封鎖 %1$s 的背景活動啟動程序。請前往 g.co/dev/bgblock 查看詳情。" "忘記圖案" "圖案錯誤" "密碼錯誤" @@ -1666,8 +1665,12 @@ "無障礙捷徑啟用了「%1$s」" "無障礙捷徑停用了「%1$s」" "同時按住調低及調高音量鍵三秒即可使用「%1$s」" - "輕觸 [無障礙設定] 按鈕後,選擇你想使用的功能:" - "如要變更指派的功能,請按住 [無障礙設定] 按鈕。" + "選擇輕觸無障礙按鈕後要使用的服務:" + "選擇要搭配無障礙手勢 (用兩指從螢幕底部向上滑動) 使用的服務:" + "選擇要搭配無障礙手勢 (用三指從螢幕底部向上滑動) 使用的服務:" + "如要切換不同的服務,請輕觸並按住無障礙按鈕。" + "如要切換不同的服務,請用兩指向上滑動並按住。" + "如要切換不同的服務,請用三指向上滑動並按住。" "放大" "目前的使用者是 %1$s。" "正在切換至%1$s…" diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index ecb1cdcfb025..cb4d3ca242d4 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -131,6 +131,7 @@ "%s ukushaya kwe-Wi-Fi" + "%s Ukushaya kwe-Wi-Fi" "Ikholi ye-WLAN" "%s ikholi ye-WLAN" "%s Wi-Fi" @@ -1611,8 +1612,6 @@ "Isendlalelo #%1$d" "%1$s: %2$dx%3$d, %4$d dpi" ", kuphephile" - "Lesi siqalo somsebenzi ongemuva kusukela ku-%1$s sizovinjelwa ekwakhiweni okuzayo kwe-Q. Bona i-g.co/dev/bgblock." - "Umsebenzi ongemuva oqala kusukela ku-%1$s uvinjelwe. Bona i-g.co/dev/bgblock." "Ukhohlwe iphethini?" "Iphatheni engalungile" "Iphasiwedi engalungile" @@ -1666,8 +1665,12 @@ "Isinqamuleli sokufinyelela sivule i-%1$s" "Isinqamuleli sokufinyelela sivale i-%1$s" "Cindezela uphinde ubambe bobabili okhiye bevolumu ngamasekhondi amathathu ukuze usebenzise i-%1$s" - "Khetha isici ozosisebenzisa uma uthepha inkinobho yokufinyelela:" - "Ukuze ushintshe izici, thinta uphinde ubambe inkinobho yokufinyelela." + "Khetha isevisi ozoyisebenzisa uma uthepha inkinobho yokufinyeleleka:" + "Khetha isevisi ezosetshenziswa ngokuthinta kokufinyeleleka (swayiphela phezulu kusukela ngaphansi kwesikrini ngeminwe emibili):" + "Khetha isevisi ozoyisebenzisa ngokuthinta kokufinyeleleka (swayiphela phezulu kusukela ngaphansi kwesikrini ngeminwe emithathu):" + "Ukuze ushintshe phakathi kwamasevisi, thinta uphinde ubambe inkinobho yokufinyeleleka." + "Ukuze ushintshe phakathi kwamasevisi, swayiphela phezulu ngeminwe emibili uphinde ubambe." + "Ukuze ushintshe phakathi kwamasevisi, swayiphela phezulu ngeminwe emithathu uphinde ubambe." "Ukukhuliswa" "Umsebenzisi wamanje %1$s." "Ishintshela ku-%1$s…" -- GitLab From 9c501aad4b9e80582a830df262bd3298742c97f7 Mon Sep 17 00:00:00 2001 From: Ady Abraham Date: Tue, 4 Jun 2019 16:07:44 -0700 Subject: [PATCH 073/620] DisplayEventDispatcher: use eConfigChangedDispatch In order to get DISPLAY_EVENT_CONFIG_CHANGED, eConfigChangedDispatch needs to be used when creating DisplayEventDispatcher. Bug: 131688378 Test: adb shell /data/nativetest64/libsurfaceflinger_unittest/libsurfaceflinger_unittest Test: trigger config change and observe logcat Change-Id: I0de8037ee5b024b7d9729750f582be919087be41 --- core/java/android/view/Choreographer.java | 3 ++- .../android/view/DisplayEventReceiver.java | 24 +++++++++++++++---- .../jni/android_view_DisplayEventReceiver.cpp | 15 +++++++----- libs/androidfw/DisplayEventDispatcher.cpp | 5 ++-- .../androidfw/DisplayEventDispatcher.h | 3 ++- libs/hwui/renderthread/RenderThread.cpp | 4 +++- .../server/display/LocalDisplayAdapter.java | 2 +- 7 files changed, 40 insertions(+), 16 deletions(-) diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java index c64386e8db79..e95b5caa4fa0 100644 --- a/core/java/android/view/Choreographer.java +++ b/core/java/android/view/Choreographer.java @@ -16,6 +16,7 @@ package android.view; +import static android.view.DisplayEventReceiver.CONFIG_CHANGED_EVENT_SUPPRESS; import static android.view.DisplayEventReceiver.VSYNC_SOURCE_APP; import static android.view.DisplayEventReceiver.VSYNC_SOURCE_SURFACE_FLINGER; @@ -910,7 +911,7 @@ public final class Choreographer { private int mFrame; public FrameDisplayEventReceiver(Looper looper, int vsyncSource) { - super(looper, vsyncSource); + super(looper, vsyncSource, CONFIG_CHANGED_EVENT_SUPPRESS); } // TODO(b/116025192): physicalDisplayId is ignored because SF only emits VSYNC events for diff --git a/core/java/android/view/DisplayEventReceiver.java b/core/java/android/view/DisplayEventReceiver.java index 60daddd663d5..91acc4638c26 100644 --- a/core/java/android/view/DisplayEventReceiver.java +++ b/core/java/android/view/DisplayEventReceiver.java @@ -53,6 +53,20 @@ public abstract class DisplayEventReceiver { */ public static final int VSYNC_SOURCE_SURFACE_FLINGER = 1; + /** + * Specifies to suppress config changed events from being generated from Surface Flinger. + *

+ * Needs to be kept in sync with frameworks/native/include/gui/ISurfaceComposer.h + */ + public static final int CONFIG_CHANGED_EVENT_SUPPRESS = 0; + + /** + * Specifies to generate config changed events from Surface Flinger. + *

+ * Needs to be kept in sync with frameworks/native/include/gui/ISurfaceComposer.h + */ + public static final int CONFIG_CHANGED_EVENT_DISPATCH = 1; + private static final String TAG = "DisplayEventReceiver"; private final CloseGuard mCloseGuard = CloseGuard.get(); @@ -65,7 +79,7 @@ public abstract class DisplayEventReceiver { private MessageQueue mMessageQueue; private static native long nativeInit(WeakReference receiver, - MessageQueue messageQueue, int vsyncSource); + MessageQueue messageQueue, int vsyncSource, int configChanged); private static native void nativeDispose(long receiverPtr); @FastNative private static native void nativeScheduleVsync(long receiverPtr); @@ -77,7 +91,7 @@ public abstract class DisplayEventReceiver { */ @UnsupportedAppUsage public DisplayEventReceiver(Looper looper) { - this(looper, VSYNC_SOURCE_APP); + this(looper, VSYNC_SOURCE_APP, CONFIG_CHANGED_EVENT_SUPPRESS); } /** @@ -85,15 +99,17 @@ public abstract class DisplayEventReceiver { * * @param looper The looper to use when invoking callbacks. * @param vsyncSource The source of the vsync tick. Must be on of the VSYNC_SOURCE_* values. + * @param configChanged Whether to dispatch config changed events. Must be one of the + * CONFIG_CHANGED_EVENT_* values. */ - public DisplayEventReceiver(Looper looper, int vsyncSource) { + public DisplayEventReceiver(Looper looper, int vsyncSource, int configChanged) { if (looper == null) { throw new IllegalArgumentException("looper must not be null"); } mMessageQueue = looper.getQueue(); mReceiverPtr = nativeInit(new WeakReference(this), mMessageQueue, - vsyncSource); + vsyncSource, configChanged); mCloseGuard.open("dispose"); } diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp index 8d702d11d8fe..ba538a855f81 100644 --- a/core/jni/android_view_DisplayEventReceiver.cpp +++ b/core/jni/android_view_DisplayEventReceiver.cpp @@ -48,7 +48,8 @@ static struct { class NativeDisplayEventReceiver : public DisplayEventDispatcher { public: NativeDisplayEventReceiver(JNIEnv* env, - jobject receiverWeak, const sp& messageQueue, jint vsyncSource); + jobject receiverWeak, const sp& messageQueue, jint vsyncSource, + jint configChanged); void dispose(); @@ -68,9 +69,11 @@ private: NativeDisplayEventReceiver::NativeDisplayEventReceiver(JNIEnv* env, - jobject receiverWeak, const sp& messageQueue, jint vsyncSource) : + jobject receiverWeak, const sp& messageQueue, jint vsyncSource, + jint configChanged) : DisplayEventDispatcher(messageQueue->getLooper(), - static_cast(vsyncSource)), + static_cast(vsyncSource), + static_cast(configChanged)), mReceiverWeakGlobal(env->NewGlobalRef(receiverWeak)), mMessageQueue(messageQueue) { ALOGV("receiver %p ~ Initializing display event receiver.", this); @@ -136,7 +139,7 @@ void NativeDisplayEventReceiver::dispatchConfigChanged(nsecs_t timestamp, static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, - jobject messageQueueObj, jint vsyncSource) { + jobject messageQueueObj, jint vsyncSource, jint configChanged) { sp messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj); if (messageQueue == NULL) { jniThrowRuntimeException(env, "MessageQueue is not initialized."); @@ -144,7 +147,7 @@ static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, } sp receiver = new NativeDisplayEventReceiver(env, - receiverWeak, messageQueue, vsyncSource); + receiverWeak, messageQueue, vsyncSource, configChanged); status_t status = receiver->initialize(); if (status) { String8 message; @@ -179,7 +182,7 @@ static void nativeScheduleVsync(JNIEnv* env, jclass clazz, jlong receiverPtr) { static const JNINativeMethod gMethods[] = { /* name, signature, funcPtr */ { "nativeInit", - "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;I)J", + "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;II)J", (void*)nativeInit }, { "nativeDispose", "(J)V", diff --git a/libs/androidfw/DisplayEventDispatcher.cpp b/libs/androidfw/DisplayEventDispatcher.cpp index 660614895603..d8a3f42690f4 100644 --- a/libs/androidfw/DisplayEventDispatcher.cpp +++ b/libs/androidfw/DisplayEventDispatcher.cpp @@ -34,8 +34,9 @@ namespace android { static const size_t EVENT_BUFFER_SIZE = 100; DisplayEventDispatcher::DisplayEventDispatcher(const sp& looper, - ISurfaceComposer::VsyncSource vsyncSource) : - mLooper(looper), mReceiver(vsyncSource), mWaitingForVsync(false) { + ISurfaceComposer::VsyncSource vsyncSource, + ISurfaceComposer::ConfigChanged configChanged) : + mLooper(looper), mReceiver(vsyncSource, configChanged), mWaitingForVsync(false) { ALOGV("dispatcher %p ~ Initializing display event dispatcher.", this); } diff --git a/libs/androidfw/include/androidfw/DisplayEventDispatcher.h b/libs/androidfw/include/androidfw/DisplayEventDispatcher.h index 5381c0174cb0..8bc25202b3ab 100644 --- a/libs/androidfw/include/androidfw/DisplayEventDispatcher.h +++ b/libs/androidfw/include/androidfw/DisplayEventDispatcher.h @@ -23,7 +23,8 @@ namespace android { class DisplayEventDispatcher : public LooperCallback { public: explicit DisplayEventDispatcher(const sp& looper, - ISurfaceComposer::VsyncSource vsyncSource = ISurfaceComposer::eVsyncSourceApp); + ISurfaceComposer::VsyncSource vsyncSource = ISurfaceComposer::eVsyncSourceApp, + ISurfaceComposer::ConfigChanged configChanged = ISurfaceComposer::eConfigChangedSuppress); status_t initialize(); void dispose(); diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp index 41cb8fdc66bd..71c5b53f727a 100644 --- a/libs/hwui/renderthread/RenderThread.cpp +++ b/libs/hwui/renderthread/RenderThread.cpp @@ -156,7 +156,9 @@ void RenderThread::initializeDisplayEventReceiver() { LOG_ALWAYS_FATAL_IF(mVsyncSource, "Initializing a second DisplayEventReceiver?"); if (!Properties::isolatedProcess) { - auto receiver = std::make_unique(); + auto receiver = std::make_unique( + ISurfaceComposer::eVsyncSourceApp, + ISurfaceComposer::eConfigChangedDispatch); status_t status = receiver->initCheck(); LOG_ALWAYS_FATAL_IF(status != NO_ERROR, "Initialization of DisplayEventReceiver " diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index 85fbdf6d0182..b03dc3b2ae93 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -856,7 +856,7 @@ final class LocalDisplayAdapter extends DisplayAdapter { private final class PhysicalDisplayEventReceiver extends DisplayEventReceiver { PhysicalDisplayEventReceiver(Looper looper) { - super(looper, VSYNC_SOURCE_APP); + super(looper, VSYNC_SOURCE_APP, CONFIG_CHANGED_EVENT_DISPATCH); } @Override -- GitLab From e14f08e9f59c79ac23b3f76456e4ae39ae02e9a9 Mon Sep 17 00:00:00 2001 From: Beverly Date: Thu, 6 Jun 2019 15:33:10 -0400 Subject: [PATCH 074/620] Add callbacks to StatusBarStateController So plugins can receive this information without an IPC call Test: manual Bug: 133783909 Change-Id: I716ed6af78ab5a80a36fb680bc5d42758766523d --- .../statusbar/StatusBarStateController.java | 11 +++++- .../StatusBarStateControllerImpl.java | 35 +++++++++++++++++++ .../SysuiStatusBarStateController.java | 10 ++++++ .../systemui/statusbar/phone/StatusBar.java | 3 +- 4 files changed, 57 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/StatusBarStateController.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/StatusBarStateController.java index 3ee69b4c3224..fe547a0a16fa 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/StatusBarStateController.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/StatusBarStateController.java @@ -18,7 +18,6 @@ package com.android.systemui.plugins.statusbar; import com.android.systemui.plugins.annotations.DependsOn; import com.android.systemui.plugins.annotations.ProvidesInterface; -import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; /** @@ -94,5 +93,15 @@ public interface StatusBarStateController { * performance regressions. */ default void onDozeAmountChanged(float linear, float eased) {} + + /** + * Callback to be notified when the sysui visibility changes + */ + default void onSystemUiVisibilityChanged(int visibility) {} + + /** + * Callback to be notified when the pulsing state changes + */ + default void onPulsingChanged(boolean pulsing) {} } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java index eb386dcdbf46..f0eeb046bc44 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java @@ -20,6 +20,7 @@ import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.text.format.DateFormat; import android.util.FloatProperty; +import android.view.View; import android.view.animation.Interpolator; import com.android.internal.annotations.GuardedBy; @@ -76,6 +77,16 @@ public class StatusBarStateControllerImpl implements SysuiStatusBarStateControll private int mHistoryIndex = 0; private HistoricalState[] mHistoricalRecords = new HistoricalState[HISTORY_SIZE]; + /** + * Current SystemUiVisibility + */ + private int mSystemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE; + + /** + * If the device is currently pulsing (AOD2). + */ + private boolean mPulsing; + /** * If the device is currently dozing or not. */ @@ -292,6 +303,30 @@ public class StatusBarStateControllerImpl implements SysuiStatusBarStateControll return mKeyguardRequested; } + @Override + public void setSystemUiVisibility(int visibility) { + if (mSystemUiVisibility != visibility) { + mSystemUiVisibility = visibility; + synchronized (mListeners) { + for (RankedListener rl : new ArrayList<>(mListeners)) { + rl.mListener.onSystemUiVisibilityChanged(mSystemUiVisibility); + } + } + } + } + + @Override + public void setPulsing(boolean pulsing) { + if (mPulsing != pulsing) { + mPulsing = pulsing; + synchronized (mListeners) { + for (RankedListener rl : new ArrayList<>(mListeners)) { + rl.mListener.onPulsingChanged(pulsing); + } + } + } + } + /** * Returns String readable state of status bar from {@link StatusBarState} */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java index dc5e1e913b4c..2ad979ab64e3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java @@ -110,6 +110,16 @@ public interface SysuiStatusBarStateController extends StatusBarStateController */ boolean isKeyguardRequested(); + /** + * Set systemui visibility + */ + void setSystemUiVisibility(int visibility); + + /** + * Set pulsing + */ + void setPulsing(boolean visibility); + /** * Listener with rankings SbStateListenerRank that have dependencies so must be updated * in a certain order diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 3cde49300d93..382d69428094 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -227,7 +227,6 @@ import com.android.systemui.statusbar.policy.UserInfoController; import com.android.systemui.statusbar.policy.UserInfoControllerImpl; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.statusbar.policy.ZenModeController; -import com.android.systemui.tuner.TunerService; import com.android.systemui.util.InjectionInflationController; import com.android.systemui.volume.VolumeComponent; @@ -2134,6 +2133,7 @@ public class StatusBar extends SystemUI implements DemoMode, checkBarModes(); mAutoHideController.touchAutoHide(); } + mStatusBarStateController.setSystemUiVisibility(mSystemUiVisibility); } mLightBarController.onSystemUiVisibilityChanged(fullscreenStackVis, dockedStackVis, mask, fullscreenStackBounds, dockedStackBounds, sbModeChanged, mStatusBarMode, @@ -3971,6 +3971,7 @@ public class StatusBar extends SystemUI implements DemoMode, } private void setPulsing(boolean pulsing) { + mStatusBarStateController.setPulsing(pulsing); mStatusBarKeyguardViewManager.setPulsing(pulsing); mKeyguardViewMediator.setPulsing(pulsing); mNotificationPanel.setPulsing(pulsing); -- GitLab From a952d2018bf9872565d4ac967ea433b6e9161543 Mon Sep 17 00:00:00 2001 From: Jack Yu Date: Thu, 6 Jun 2019 17:13:06 -0700 Subject: [PATCH 075/620] Fixed tethering failed when device is on CBRS Fixed by using the correct sub id for CBRS subscription Bug: 133852860 Test: Manual Change-Id: If01e17becce9684556345eb76512f617b9a9278c --- .../telephony/SubscriptionManager.java | 20 +++++++++++++++++++ .../android/telephony/TelephonyManager.java | 8 ++++---- .../com/android/internal/telephony/ISub.aidl | 2 ++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index a9521e36c0d5..8cf348270083 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -3175,4 +3175,24 @@ public class SubscriptionManager { return result; } + + /** + * Get active data subscription id. + * See {@link PhoneStateListener#onActiveDataSubscriptionIdChanged(int)} for the details. + * + * @return Active data subscription id + * + * //TODO: Refactor this API in b/134702460 + * @hide + */ + public static int getActiveDataSubscriptionId() { + try { + ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); + if (iSub != null) { + return iSub.getActiveDataSubscriptionId(); + } + } catch (RemoteException ex) { + } + return SubscriptionManager.INVALID_SUBSCRIPTION_ID; + } } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index d6011b946139..fd23fd96cb47 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -2513,7 +2513,7 @@ public class TelephonyManager { * @return the NETWORK_TYPE_xxxx for current data connection. */ public @NetworkType int getNetworkType() { - return getNetworkType(getSubId(SubscriptionManager.getDefaultDataSubscriptionId())); + return getNetworkType(getSubId(SubscriptionManager.getActiveDataSubscriptionId())); } /** @@ -2596,7 +2596,7 @@ public class TelephonyManager { @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public @NetworkType int getDataNetworkType() { - return getDataNetworkType(getSubId(SubscriptionManager.getDefaultDataSubscriptionId())); + return getDataNetworkType(getSubId(SubscriptionManager.getActiveDataSubscriptionId())); } /** @@ -7343,7 +7343,7 @@ public class TelephonyManager { * @hide */ public boolean getTetherApnRequired() { - return getTetherApnRequired(getSubId(SubscriptionManager.getDefaultDataSubscriptionId())); + return getTetherApnRequired(getSubId(SubscriptionManager.getActiveDataSubscriptionId())); } /** @@ -8126,7 +8126,7 @@ public class TelephonyManager { ITelephony telephony = getITelephony(); if (telephony != null) return telephony.isDataConnectivityPossible(getSubId(SubscriptionManager - .getDefaultDataSubscriptionId())); + .getActiveDataSubscriptionId())); } catch (RemoteException e) { Log.e(TAG, "Error calling ITelephony#isDataAllowed", e); } diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl index b081228d9616..7cc37d0d2b15 100755 --- a/telephony/java/com/android/internal/telephony/ISub.aidl +++ b/telephony/java/com/android/internal/telephony/ISub.aidl @@ -281,4 +281,6 @@ interface ISub { boolean isActiveSubId(int subId, String callingPackage); boolean setAlwaysAllowMmsData(int subId, boolean alwaysAllow); + + int getActiveDataSubscriptionId(); } -- GitLab From de8c25ac2db1a7fa3672ca0b1048621ce1707e37 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Fri, 7 Jun 2019 11:44:28 -0700 Subject: [PATCH 076/620] Remove obsolete state There isn't a fingerprint animation, we don't need the timeout anymore. This event was triggering unwanted updates, cancelling animations during wake-up. Fixes: 134448130 Test: power to wake-up: observe animation Test: fingerprint from bouncer: observe animation Test: fingerprint to wake-up: no animation Change-Id: I17fcd9eb5eba7e7bc88de09309f5c310fe13433f --- .../systemui/statusbar/phone/LockIcon.java | 28 +------------------ 1 file changed, 1 insertion(+), 27 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index 3143971241d8..07436f8c27fe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -66,8 +66,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange StatusBarStateController.StateListener, ConfigurationController.ConfigurationListener, UnlockMethodCache.OnUnlockMethodChangedListener { - private static final int FP_DRAW_OFF_TIMEOUT = 800; - private static final int STATE_LOCKED = 0; private static final int STATE_LOCK_OPEN = 1; private static final int STATE_SCANNING_FACE = 2; @@ -83,8 +81,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange private int mLastState = 0; private boolean mTransientBiometricsError; - private boolean mScreenOn; - private boolean mLastScreenOn; private boolean mIsFaceUnlockState; private boolean mSimLocked; private int mDensity; @@ -109,7 +105,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange update(false /* force */); } }; - private final Runnable mDrawOffTimeout = () -> update(true /* forceUpdate */); private final DockManager.DockEventListener mDockEventListener = new DockManager.DockEventListener() { @Override @@ -125,18 +120,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { - @Override - public void onScreenTurnedOn() { - mScreenOn = true; - update(); - } - - @Override - public void onScreenTurnedOff() { - mScreenOn = false; - update(); - } - @Override public void onSimStateChanged(int subId, int slotId, IccCardConstants.State simState) { @@ -249,8 +232,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange public void update(boolean force) { int state = getState(); mIsFaceUnlockState = state == STATE_SCANNING_FACE; - if (state != mLastState || mLastDozing != mDozing || mLastPulsing != mPulsing - || mLastScreenOn != mScreenOn || force) { + if (state != mLastState || mLastDozing != mDozing || mLastPulsing != mPulsing || force) { @LockAnimIndex final int lockAnimIndex = getAnimationIndexForTransition(mLastState, state, mLastPulsing, mPulsing, mLastDozing, mDozing); boolean isAnim = lockAnimIndex != -1; @@ -289,15 +271,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange } updateDarkTint(); - if (isAnim && !mLastScreenOn) { - removeCallbacks(mDrawOffTimeout); - postDelayed(mDrawOffTimeout, FP_DRAW_OFF_TIMEOUT); - } else { - removeCallbacks(mDrawOffTimeout); - } - mLastState = state; - mLastScreenOn = mScreenOn; mLastDozing = mDozing; mLastPulsing = mPulsing; } -- GitLab From 1488f69eb06384277d213d8eceb08d8a76a86501 Mon Sep 17 00:00:00 2001 From: Beverly Date: Fri, 7 Jun 2019 09:32:46 -0400 Subject: [PATCH 077/620] Make DozeParams available to Plugins Test: manual Bug: 134519217 Change-Id: I4a2b0827b861ef922fab85e0e6a6dde2313ba78f --- .../systemui/plugins/OverlayPlugin.java | 8 +++-- .../plugins/statusbar/DozeParameters.java | 32 +++++++++++++++++++ .../android/systemui/SystemUIApplication.java | 4 ++- .../statusbar/phone/DozeParameters.java | 6 +++- 4 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/DozeParameters.java diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/OverlayPlugin.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/OverlayPlugin.java index 90fc86bc5b51..075df75f938a 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/OverlayPlugin.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/OverlayPlugin.java @@ -16,12 +16,13 @@ package com.android.systemui.plugins; import android.view.View; import com.android.systemui.plugins.annotations.ProvidesInterface; +import com.android.systemui.plugins.statusbar.DozeParameters; @ProvidesInterface(action = OverlayPlugin.ACTION, version = OverlayPlugin.VERSION) public interface OverlayPlugin extends Plugin { String ACTION = "com.android.systemui.action.PLUGIN_OVERLAY"; - int VERSION = 3; + int VERSION = 4; /** * Setup overlay plugin @@ -29,9 +30,10 @@ public interface OverlayPlugin extends Plugin { void setup(View statusBar, View navBar); /** - * Setup overlay plugin with callback + * Setup overlay plugin with callback and DozeParameters */ - default void setup(View statusBar, View navBar, Callback callback) { + default void setup(View statusBar, View navBar, Callback callback, + DozeParameters dozeParameters) { setup(statusBar, navBar); } diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/DozeParameters.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/DozeParameters.java new file mode 100644 index 000000000000..678eb31304a1 --- /dev/null +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/DozeParameters.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.plugins.statusbar; + +import com.android.systemui.plugins.annotations.ProvidesInterface; + +/** + * Retrieve doze information + */ +@ProvidesInterface(version = DozeParameters.VERSION) +public interface DozeParameters { + int VERSION = 1; + + /** + * Whether to doze when the screen turns off + */ + boolean shouldControlScreenOff(); +} diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java index 61a0f72315ea..e89e6cb269f8 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java @@ -37,6 +37,7 @@ import android.util.TimingsTraceLog; import com.android.systemui.plugins.OverlayPlugin; import com.android.systemui.plugins.PluginListener; import com.android.systemui.shared.plugins.PluginManager; +import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarWindowController; import com.android.systemui.util.NotificationChannels; @@ -215,7 +216,8 @@ public class SystemUIApplication extends Application implements SysUiServiceProv StatusBar statusBar = getComponent(StatusBar.class); if (statusBar != null) { plugin.setup(statusBar.getStatusBarWindow(), - statusBar.getNavigationBarView(), new Callback(plugin)); + statusBar.getNavigationBarView(), new Callback(plugin), + DozeParameters.getInstance(getBaseContext())); } } }); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java index a17e04259fe3..89bd1b6b79f8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java @@ -35,7 +35,11 @@ import com.android.systemui.tuner.TunerService; import java.io.PrintWriter; -public class DozeParameters implements TunerService.Tunable { +/** + * Retrieve doze information + */ +public class DozeParameters implements TunerService.Tunable, + com.android.systemui.plugins.statusbar.DozeParameters { private static final int MAX_DURATION = 60 * 1000; public static final String DOZE_SENSORS_WAKE_UP_FULLY = "doze_sensors_wake_up_fully"; public static final boolean FORCE_NO_BLANKING = -- GitLab From 04c78a99f0b0dc68c6140f5afffe016e42a3a519 Mon Sep 17 00:00:00 2001 From: Anthony Han Date: Fri, 3 May 2019 13:34:57 -0700 Subject: [PATCH 078/620] Interpolate low light white balance Instead of setting color temperature to a default in low lux conditions, add a spline to interpolate from color temperature that reflects the ambient to a default. Bug: 131259669 Test: atest AmbientLuxTest Change-Id: I623190b796c67bab88e2eea3b4cf5a5b9ba14ae2 --- core/res/res/values/config.xml | 25 +- core/res/res/values/symbols.xml | 3 +- .../display/whitebalance/AmbientFilter.java | 4 +- .../DisplayWhiteBalanceController.java | 61 ++-- .../DisplayWhiteBalanceFactory.java | 12 +- .../display/whitebalance/AmbientLuxTest.java | 299 ++++++++++++++++++ 6 files changed, 376 insertions(+), 28 deletions(-) create mode 100644 services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index a467f40949dd..768eb5a1db2a 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4017,9 +4017,28 @@ - 10.0 + A float array containing a list of ambient brightnesses, in Lux. This array, + together with config_displayWhiteBalanceLowLightAmbientBiases, is used to generate a + lookup table used in DisplayWhiteBalanceController. This lookup table is used to map + ambient brightness readings to a bias, where the bias is used to linearly interpolate + between ambient color temperature and + config_displayWhiteBalanceLowLightAmbientColorTemperature. + This table is optional. If used, this array must, + 1) Contain at least two entries + 2) Be the same length as config_displayWhiteBalanceLowLightAmbientBiases. --> + + 10.0 + 10.0 + + + + + 0.0 + 1.0 + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml index de21e4919dc2..1803a00b3bee 100644 --- a/packages/SystemUI/res-keyguard/values-as/strings.xml +++ b/packages/SystemUI/res-keyguard/values-as/strings.xml @@ -151,4 +151,10 @@ ছিমখন অক্ষম হ’ল। অব্যাহত ৰাখিবলৈ PUK দিয়ক। ছিমখন স্থায়ীভাৱে ব্যৱহাৰৰ অনুপযোগী হোৱাৰ পূৰ্বে আপোনাৰ হাতত %dটা প্ৰয়াস বাকী আছে। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক। ছিমখন অক্ষম হ’ল। অব্যাহত ৰাখিবলৈ PUK দিয়ক। ছিমখন স্থায়ীভাৱে ব্যৱহাৰৰ অনুপযোগী হোৱাৰ পূৰ্বে আপোনাৰ হাতত %dটা প্ৰয়াস বাকী আছে। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক। + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml index d83706ea37b3..c0cf129a9408 100644 --- a/packages/SystemUI/res-keyguard/values-az/strings.xml +++ b/packages/SystemUI/res-keyguard/values-az/strings.xml @@ -151,4 +151,7 @@ SIM indi deaktivdir. Davam etmək üçün PUK kodunu daxil edin. SIM birdəfəlik yararsız olmadan öncə %d cəhdiniz qalır. Ətraflı məlumat üçün operatorla əlaqə saxlayın. SIM indi deaktivdir. Davam etmək üçün PUK kodunu daxil edin. SIM birdəfəlik yararsız olmadan öncə %d cəhdiniz qalır. Ətraflı məlumat üçün operatorla əlaqə saxlayın. + "Defolt" + "Qabarcıq" + "Analoq" 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 c0dfbc8522fc..88ca77b4a977 100644 --- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml @@ -159,4 +159,7 @@ SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još %d pokušaja pre nego što SIM postane trajno neupotrebljiv. Detaljne informacije potražite od mobilnog operatera. SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još %d pokušaja pre nego što SIM postane trajno neupotrebljiv. Detaljne informacije potražite od mobilnog operatera. + "Podrazumevani" + "Mehurići" + "Analogni" diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml index 6b5f3edeb464..d722f07177eb 100644 --- a/packages/SystemUI/res-keyguard/values-be/strings.xml +++ b/packages/SystemUI/res-keyguard/values-be/strings.xml @@ -167,4 +167,10 @@ SIM-карта заблакіравана. Каб працягнуць, увядзіце PUK-код. У вас ёсць яшчэ %d спроб, пасля чаго SIM-карта будзе заблакіравана назаўсёды. Звярніцеся да аператара, каб даведацца больш. SIM-карта заблакіравана. Каб працягнуць, увядзіце PUK-код. У вас ёсць яшчэ %d спробы, пасля чаго SIM-карта будзе заблакіравана назаўсёды. Звярніцеся да аператара, каб даведацца больш. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml index 296e77ae602d..90073aa06278 100644 --- a/packages/SystemUI/res-keyguard/values-bg/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml @@ -151,4 +151,10 @@ SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Остават ви %d опита, преди SIM картата да стане неизползваема завинаги. Свържете се с оператора за подробности. SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Остава ви %d опит, преди SIM картата да стане неизползваема завинаги. Свържете се с оператора за подробности. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml index b6aa65194a0f..4115981ba362 100644 --- a/packages/SystemUI/res-keyguard/values-bn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml @@ -151,4 +151,10 @@ সিম অক্ষম করা হয়েছে। চালিয়ে যেতে PUK কোড লিখুন। আপনি আর %d বার চেষ্টা করতে পারবেন, তারপরে এই সিমটি আর একেবারেই ব্যবহার করা যাবে না। বিশদে জানতে পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন। সিম অক্ষম করা হয়েছে। চালিয়ে যেতে PUK কোড লিখুন। আপনি আর %d বার চেষ্টা করতে পারবেন, তারপরে এই সিমটি আর একেবারেই ব্যবহার করা যাবে না। বিশদে জানতে পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন। + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml index 40e52706aa01..b23824e3f8ef 100644 --- a/packages/SystemUI/res-keyguard/values-bs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml @@ -159,4 +159,7 @@ SIM kartica je onemogućena. Unesite PUK kôd da nastavite. Imate još %d pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Za više informacija kontaktirajte mobilnog operatera. SIM kartica je onemogućena. Unesite PUK kôd da nastavite. Imate još %d pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Za više informacija kontaktirajte mobilnog operatera. + "Zadano" + "Mjehurići" + "Analogni" diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml index bb48226a8930..ccde138c10b6 100644 --- a/packages/SystemUI/res-keyguard/values-ca/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml @@ -151,4 +151,7 @@ La targeta SIM s\'ha desactivat. Introdueix el codi PUK per continuar. Et queden %d intents; si no l\'encertes, la SIM no es podrà tornar a fer servir. Contacta amb l\'operador de telefonia mòbil per obtenir-ne més informació. La targeta SIM s\'ha desactivat. Introdueix el codi PUK per continuar. Et queda %d intent; si no l\'encertes, la SIM no es podrà tornar a fer servir. Contacta amb l\'operador de telefonia mòbil per obtenir-ne més informació. + "Predeterminada" + "Bombolla" + "Analògica" diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml index 536dd15583ee..c3a9a3ebf7f2 100644 --- a/packages/SystemUI/res-keyguard/values-cs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml @@ -167,4 +167,10 @@ SIM karta je teď zablokována. Chcete-li pokračovat, zadejte kód PUK. Máte ještě %d pokusů, poté bude SIM karta natrvalo zablokována. Podrobnosti vám poskytne operátor. SIM karta je teď zablokována. Chcete-li pokračovat, zadejte kód PUK. Máte ještě %d pokus, poté bude SIM karta natrvalo zablokována. Podrobnosti vám poskytne operátor. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml index e60930d4d70b..5d9a3990050b 100644 --- a/packages/SystemUI/res-keyguard/values-da/strings.xml +++ b/packages/SystemUI/res-keyguard/values-da/strings.xml @@ -151,4 +151,10 @@ SIM-kortet er nu deaktiveret. Angiv PUK-koden for at fortsætte. Du har %d forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt. Kontakt dit mobilselskab for at få flere oplysninger. SIM-kortet er nu deaktiveret. Angiv PUK-koden for at fortsætte. Du har %d forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt. Kontakt dit mobilselskab for at få flere oplysninger. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml index 3a4d013d2a2e..0995a3b496f5 100644 --- a/packages/SystemUI/res-keyguard/values-de/strings.xml +++ b/packages/SystemUI/res-keyguard/values-de/strings.xml @@ -151,4 +151,7 @@ Die SIM-Karte ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Du hast noch %d Versuche, bevor die SIM-Karte endgültig gesperrt wird. Weitere Informationen erhältst du von deinem Mobilfunkanbieter. Die SIM-Karte ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Du hast noch %d Versuch, bevor die SIM-Karte endgültig gesperrt wird. Weitere Informationen erhältst du von deinem Mobilfunkanbieter. + "Standard" + "Blase" + "Analog" diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml index 47330058cdec..46b1d30b865c 100644 --- a/packages/SystemUI/res-keyguard/values-el/strings.xml +++ b/packages/SystemUI/res-keyguard/values-el/strings.xml @@ -151,4 +151,7 @@ Η κάρτα SIM απενεργοποιήθηκε. Καταχωρίστε τον κωδικό PUK, για να συνεχίσετε. Απομένουν %d ακόμη προσπάθειες προτού να μην είναι πλέον δυνατή η χρήση της κάρτας SIM. Επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας για λεπτομέρειες. Η κάρτα SIM απενεργοποιήθηκε. Καταχωρίστε τον κωδικό PUK, για να συνεχίσετε. Απομένει %d ακόμη προσπάθεια προτού να μην είναι πλέον δυνατή η χρήση της κάρτας SIM. Επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας για λεπτομέρειες. + "Προεπιλογή" + "Συννεφάκι" + "Αναλογικό" diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml index 8f1a94e767ee..5640b6d3050a 100644 --- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml @@ -151,4 +151,7 @@ SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact operator for details. SIM is now disabled. Enter PUK code to continue. You have %d remaining attempt before SIM becomes permanently unusable. Contact operator for details. + "Default" + "Bubble" + "Analogue" diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml index b7d0722ac14b..5836b72a0cda 100644 --- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml @@ -151,4 +151,7 @@ SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact operator for details. SIM is now disabled. Enter PUK code to continue. You have %d remaining attempt before SIM becomes permanently unusable. Contact operator for details. + "Default" + "Bubble" + "Analogue" diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml index 8f1a94e767ee..5640b6d3050a 100644 --- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml @@ -151,4 +151,7 @@ SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact operator for details. SIM is now disabled. Enter PUK code to continue. You have %d remaining attempt before SIM becomes permanently unusable. Contact operator for details. + "Default" + "Bubble" + "Analogue" diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml index 8f1a94e767ee..5640b6d3050a 100644 --- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml @@ -151,4 +151,7 @@ SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact operator for details. SIM is now disabled. Enter PUK code to continue. You have %d remaining attempt before SIM becomes permanently unusable. Contact operator for details. + "Default" + "Bubble" + "Analogue" diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml index 13e87fa5269a..fb968b76e24b 100644 --- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml @@ -151,4 +151,7 @@ ‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‎‎‎‎SIM is now disabled. Enter PUK code to continue. You have ‎‏‎‎‏‏‎%d‎‏‎‎‏‏‏‎ remaining attempts before SIM becomes permanently unusable. Contact carrier for details.‎‏‎‎‏‎ ‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‏‎‎‏‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‎‎‎‎‏‎‏‎‎‎‏‏‎‏‎‎‎‎‎SIM is now disabled. Enter PUK code to continue. You have ‎‏‎‎‏‏‎%d‎‏‎‎‏‏‏‎ remaining attempt before SIM becomes permanently unusable. Contact carrier for details.‎‏‎‎‏‎ + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‏‏‏‏‎‏‎‏‎‏‏‏‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‎‎‎‎‏‎‎‎‎‎‎‎‏‎Default‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‏‏‎‏‏‎‏‎‎‎‎‏‎‏‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‎‎‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‎‎‏‎‎‏‎‎Bubble‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‏‎‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‏‎‏‏‎‏‏‎‏‏‎‎‎‎‎‏‎‎‏‏‏‎‎‎‎‎‎‏‏‏‎‏‏‎‏‎Analog‎‏‎‎‏‎" diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml index 90ee83d9ef55..727cbad82ad2 100644 --- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml @@ -151,4 +151,7 @@ Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te quedan %d intentos más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles. Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te queda %d intento más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles. + "Predeterminado" + "Burbuja" + "Analógico" diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml index 5970c82d7218..26a9b87a277a 100644 --- a/packages/SystemUI/res-keyguard/values-es/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es/strings.xml @@ -151,4 +151,7 @@ La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te quedan %d intentos para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información. La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te queda %d intento para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información. + "Predeterminada" + "Burbuja" + "Analógica" diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml index a95a3d3e9a0d..7e03a5cff371 100644 --- a/packages/SystemUI/res-keyguard/values-et/strings.xml +++ b/packages/SystemUI/res-keyguard/values-et/strings.xml @@ -151,4 +151,7 @@ SIM-kaart on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Teil on jäänud veel %d katset enne, kui SIM-kaart püsivalt lukustatakse. Lisateavet küsige operaatorilt. SIM-kaart on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Teil on jäänud veel %d katse enne, kui SIM-kaart püsivalt lukustatakse. Lisateavet küsige operaatorilt. + "Vaikenumbrilaud" + "Mull" + "Analoog" diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml index 64601ca50645..ab6bc9bbd879 100644 --- a/packages/SystemUI/res-keyguard/values-eu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml @@ -151,4 +151,10 @@ Desgaitu egin da SIM txartela. Aurrera egiteko, idatzi PUK kodea. %d saiakera geratzen zaizkizu SIM txartela betiko erabilgaitz geratu aurretik. Xehetasunak lortzeko, jarri operadorearekin harremanetan. Desgaitu egin da SIM txartela. Aurrera egiteko, idatzi PUK kodea. %d saiakera geratzen zaizu SIM txartela betiko erabilgaitz geratu aurretik. Xehetasunak lortzeko, jarri operadorearekin harremanetan. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml index 1c4387e97a84..6ced7148a97e 100644 --- a/packages/SystemUI/res-keyguard/values-fa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml @@ -151,4 +151,10 @@ ‏سیم‌کارت اکنون غیرفعال است. برای ادامه دادن کد PUK را وارد کنید. %d تلاش دیگر باقی مانده است و پس از آن سیم‌کارت برای همیشه غیرقابل‌استفاده می‌شود. برای اطلاع از جزئیات با شرکت مخابراتی تماس بگیرید. ‏سیم‌کارت اکنون غیرفعال است. برای ادامه دادن کد PUK را وارد کنید. %d تلاش دیگر باقی مانده است و پس از آن سیم‌کارت برای همیشه غیرقابل‌استفاده می‌شود. برای اطلاع از جزئیات با شرکت مخابراتی تماس بگیرید. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml index a49b0c4dd14e..38149bdc10fb 100644 --- a/packages/SystemUI/res-keyguard/values-fi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml @@ -151,4 +151,10 @@ SIM-kortti on nyt lukittu. Anna PUK-koodi, niin voit jatkaa. Sinulla on %d yritystä jäljellä, ennen kuin SIM-kortti poistuu pysyvästi käytöstä. Pyydä lisätietoja operaattoriltasi. SIM-kortti on nyt lukittu. Anna PUK-koodi, niin voit jatkaa. Sinulla on %d yritys jäljellä, ennen kuin SIM-kortti poistuu pysyvästi käytöstä. Pyydä lisätietoja operaattoriltasi. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml index 77b1b2edcd0c..907ccdfb138b 100644 --- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml @@ -151,4 +151,10 @@ La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste %d tentative avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services. La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste %d tentatives avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml index b1f9e0dcd06a..79bccbe32bc4 100644 --- a/packages/SystemUI/res-keyguard/values-fr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml @@ -151,4 +151,10 @@ La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste %d tentative avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur. La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste %d tentatives avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml index 55f84f805964..69514105c8ab 100644 --- a/packages/SystemUI/res-keyguard/values-gl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml @@ -151,4 +151,10 @@ A SIM está desactivada. Introduce o código PUK para continuar. Quédanche %d intentos antes de que a SIM quede inutilizable para sempre. Contacta co operador para obter información. A SIM está desactivada. Introduce o código PUK para continuar. Quédache %d intento antes de que a SIM quede inutilizable para sempre. Contacta co operador para obter información. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml index aa4ebdfb529c..2d158c8b18d7 100644 --- a/packages/SystemUI/res-keyguard/values-gu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml @@ -151,4 +151,10 @@ સિમ હવે બંધ કરેલ છે. ચાલુ રાખવા માટે PUK કોડ દાખલ કરો. સિમ કાયમીરૂપે બિનઉપયોગી બની જાય એ પહેલાં તમારી પાસે %d પ્રયાસ બાકી છે. વિગતો માટે કૅરિઅરનો સંપર્ક કરો. સિમ હવે બંધ કરેલ છે. ચાલુ રાખવા માટે PUK કોડ દાખલ કરો. સિમ કાયમીરૂપે બિનઉપયોગી બની જાય એ પહેલાં તમારી પાસે %d પ્રયાસો બાકી છે. વિગતો માટે કૅરિઅરનો સંપર્ક કરો. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml index 86e14dc8b107..4f2be614d658 100644 --- a/packages/SystemUI/res-keyguard/values-hi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml @@ -151,4 +151,10 @@ सिम बंद कर दिया गया है. जारी रखने के लिए PUK कोड डालें. आपके पास %d मौके बचे हैं, उसके बाद, सिम हमेशा के लिए काम करना बंद कर देगा. जानकारी के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें. सिम बंद कर दिया गया है. जारी रखने के लिए PUK कोड डालें. आपके पास %d मौके बचे हैं, उसके बाद, सिम हमेशा के लिए काम करना बंद कर देगा. जानकारी के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml index c7f4daf3c4ea..c4f7bba86002 100644 --- a/packages/SystemUI/res-keyguard/values-hr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml @@ -159,4 +159,7 @@ SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još %d pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Više informacija zatražite od mobilnog operatera. SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još %d pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Više informacija zatražite od mobilnog operatera. + "Zadano" + "Mjehurić" + "Analogni" diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml index 62c97996716e..0d710206dd5c 100644 --- a/packages/SystemUI/res-keyguard/values-hu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml @@ -151,4 +151,10 @@ A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. Még %d próbálkozása van, mielőtt végleg használhatatlanná válik a SIM-kártya. További információért forduljon a szolgáltatóhoz. A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. Még %d próbálkozása van, mielőtt végleg használhatatlanná válik a SIM-kártya. További információért forduljon a szolgáltatóhoz. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml index fc9f7f253b1c..feec39b95a7d 100644 --- a/packages/SystemUI/res-keyguard/values-hy/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml @@ -151,4 +151,10 @@ SIM քարտն անջատված է: Շարունակելու համար մուտքագրեք PUK կոդը: Մնացել է %d փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել: Մանրամասների համար դիմեք օպերատորին: SIM քարտն անջատված է: Շարունակելու համար մուտքագրեք PUK կոդը: Մնացել է %d փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել: Մանրամասների համար դիմեք օպերատորին: + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml index ea9a15ff9bd2..64f396edfef8 100644 --- a/packages/SystemUI/res-keyguard/values-in/strings.xml +++ b/packages/SystemUI/res-keyguard/values-in/strings.xml @@ -151,4 +151,7 @@ SIM kini dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Tersisa %d percobaan sebelum SIM tidak dapat digunakan secara permanen. Hubungi operator untuk mengetahui detailnya. SIM kini dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Tersisa %d percobaan sebelum SIM tidak dapat digunakan secara permanen. Hubungi operator untuk mengetahui detailnya. + "Default" + "Balon" + "Analog" diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml index 132e4eb5d1f5..aa33215fc124 100644 --- a/packages/SystemUI/res-keyguard/values-is/strings.xml +++ b/packages/SystemUI/res-keyguard/values-is/strings.xml @@ -151,4 +151,7 @@ SIM-kortið er nú óvirkt. Sláðu inn PUK-númer til að halda áfram. Það er %d tilraun eftir þar til SIM-kortið verður ónothæft til frambúðar. Hafðu samband við símafyrirtækið til að fá upplýsingar. SIM-kortið er nú óvirkt. Sláðu inn PUK-númer til að halda áfram. Það eru %d tilraunir eftir þar til SIM-kortið verður ónothæft til frambúðar. Hafðu samband við símafyrirtækið til að fá upplýsingar. + "Sjálfgefið" + "Blaðra" + "Með vísum" diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml index 468435f52e01..761640c72010 100644 --- a/packages/SystemUI/res-keyguard/values-it/strings.xml +++ b/packages/SystemUI/res-keyguard/values-it/strings.xml @@ -151,4 +151,7 @@ La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora %d tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore. La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora %d tentativo a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore. + "Predefinito" + "Bolla" + "Analogico" diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml index 2b137932f869..8a28031f4d88 100644 --- a/packages/SystemUI/res-keyguard/values-iw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml @@ -167,4 +167,10 @@ ‏כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך %d ניסיונות נוספים לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך. ‏כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותר לך %d ניסיון נוסף לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml index 97f5b83301fa..712db58a12d8 100644 --- a/packages/SystemUI/res-keyguard/values-ja/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml @@ -151,4 +151,10 @@ SIM が無効になりました。続行するには PUK コードを入力してください。入力できるのはあと %d 回です。この回数を超えると SIM は完全に使用できなくなります。詳しくは携帯通信会社にお問い合わせください。 SIM が無効になりました。続行するには PUK コードを入力してください。入力できるのはあと %d 回です。この回数を超えると SIM は完全に使用できなくなります。詳しくは携帯通信会社にお問い合わせください。 + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml index 24daf4b893b1..d165230613c1 100644 --- a/packages/SystemUI/res-keyguard/values-ka/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml @@ -151,4 +151,7 @@ SIM ბარათი ახლა დეაქტივირებულია. გასაგრძელებლად შეიყვანეთ PUK-კოდი. თქვენ დაგრჩათ %d მცდელობა, სანამ SIM სამუდამოდ გამოუსადეგარი გახდება. დეტალური ინფორმაციისთვის დაუკავშირდით თქვენს ოპერატორს. SIM ბარათი ახლა დეაქტივირებულია. გასაგრძელებლად შეიყვანეთ PUK-კოდი. თქვენ დაგრჩათ %d მცდელობა, სანამ SIM სამუდამოდ გამოუსადეგარი გახდება. დეტალური ინფორმაციისთვის დაუკავშირდით თქვენს ოპერატორს. + "ნაგულისხმევი" + "ბუშტი" + "ანალოგური" diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml index 330bf53234c1..7add4ccb848b 100644 --- a/packages/SystemUI/res-keyguard/values-kk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml @@ -151,4 +151,10 @@ SIM картасы өшірілді. Жалғастыру үшін PUK кодын енгізіңіз. %d мүмкіндік қалды, одан кейін SIM картасы біржола құлыпталады. Толығырақ мәліметті оператордан алыңыз. SIM картасы өшірілді. Жалғастыру үшін PUK кодын енгізіңіз. %d мүмкіндік қалды, одан кейін SIM картасы біржола құлыпталады. Толығырақ мәліметті оператордан алыңыз. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml index 9fd949ab6e38..afbb37843c78 100644 --- a/packages/SystemUI/res-keyguard/values-km/strings.xml +++ b/packages/SystemUI/res-keyguard/values-km/strings.xml @@ -151,4 +151,10 @@ ឥឡូវនេះស៊ីមត្រូវបានបិទ។ សូមបញ្ចូលកូដ PUK ដើម្បីបន្ត។ អ្នកនៅសល់ការព្យាយាម %d ដងទៀត​មុនពេល​ស៊ីម​មិនអាច​ប្រើបាន​ជា​អចិន្ត្រៃយ៍។ ទាក់ទង​ទៅ​ក្រុមហ៊ុន​សេវា​ទូរសព្ទ​សម្រាប់ព័ត៌មានលម្អិត។ ឥឡូវនេះស៊ីមត្រូវបានបិទ។ សូមបញ្ចូលកូដ PUK ដើម្បីបន្ត។ អ្នកនៅសល់ការព្យាយាម %d ដងទៀតមុនពេលស៊ីមមិនអាចប្រើបានជាអចិន្ត្រៃយ៍។ ទាក់ទង​ទៅ​ក្រុមហ៊ុន​សេវា​ទូរសព្ទ​សម្រាប់​ព័ត៌មាន​លម្អិត។ + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml index bbda27c13501..fb2e64482d31 100644 --- a/packages/SystemUI/res-keyguard/values-kn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml @@ -151,4 +151,10 @@ ಸಿಮ್ ಅನ್ನು ಈಗ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಸಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ಸಿಮ್ ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಪ್ರಯೋಜಕವಾಗುವ ಮುನ್ನ ನಿಮ್ಮಲ್ಲಿ %d ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ. ಸಿಮ್ ಅನ್ನು ಈಗ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಸಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ಸಿಮ್ ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಪ್ರಯೋಜಕವಾಗುವ ಮುನ್ನ ನಿಮ್ಮಲ್ಲಿ %d ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml index 8d8e5f85bbfc..d6e56456a800 100644 --- a/packages/SystemUI/res-keyguard/values-ko/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml @@ -151,4 +151,10 @@ SIM이 사용 중지되었습니다. 계속하려면 PUK 코드를 입력하세요. %d번 더 실패하면 SIM을 완전히 사용할 수 없게 됩니다. 자세한 내용은 이동통신사에 문의하세요. SIM이 사용 중지되었습니다. 계속하려면 PUK 코드를 입력하세요. %d번 더 실패하면 SIM을 완전히 사용할 수 없게 됩니다. 자세한 내용은 이동통신사에 문의하세요. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml index fd02abbab849..c5e0475f55e2 100644 --- a/packages/SystemUI/res-keyguard/values-ky/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml @@ -151,4 +151,10 @@ SIM-карта азыр жарактан чыкты. Улантуу үчүн PUK-кодду киргизиңиз. SIM-картанын биротоло жарактан чыгарына %d аракет калды. Чоо-жайын билүү үчүн байланыш операторуна кайрылыңыз. SIM-карта азыр жарактан чыкты. Улантуу үчүн PUK-кодду киргизиңиз. SIM-картанын биротоло жарактан чыгаарына %d аракет калды. Чоо-жайын билүү үчүн байланыш операторуна кайрылыңыз. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml index f7483767f522..7b2f047bb9b3 100644 --- a/packages/SystemUI/res-keyguard/values-lo/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml @@ -151,4 +151,10 @@ ຕອນນີ້ປິດການນຳໃຊ້ SIM ແລ້ວ. ໃສ່ລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ທ່ານສາມາດລອງໄດ້ອີກ %d ເທື່ອກ່ອນທີ່ SIM ຈະບໍ່ສາມາດໃຊ້ໄດ້ຖາວອນ. ກະລຸນາຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ. ຕອນນີ້ປິດການນຳໃຊ້ SIM ແລ້ວ. ໃສ່ລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ທ່ານສາມາດລອງໄດ້ອີກ %d ເທື່ອກ່ອນທີ່ SIM ຈະບໍ່ສາມາດໃຊ້ໄດ້ຖາວອນ. ກະລຸນາຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml index c987b6afa821..bbd25b2a6f9e 100644 --- a/packages/SystemUI/res-keyguard/values-lt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml @@ -167,4 +167,7 @@ SIM kortelė dabar yra išjungta. Jei norite tęsti, įveskite PUK kodą. Jums liko %d bandymo. Paskui visiškai nebegalėsite naudoti SIM kortelės. Jei reikia išsamios informacijos, susisiekite su operatoriumi. SIM kortelė dabar yra išjungta. Jei norite tęsti, įveskite PUK kodą. Jums liko %d bandymų. Paskui visiškai nebegalėsite naudoti SIM kortelės. Jei reikia išsamios informacijos, susisiekite su operatoriumi. + "Numatytasis" + "Debesėlis" + "Analoginis" diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml index 2ad607ec8cd3..b67d57c661eb 100644 --- a/packages/SystemUI/res-keyguard/values-lv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml @@ -159,4 +159,10 @@ SIM karte tagad ir atspējota. Ievadiet PUK kodu, lai turpinātu. Varat mēģināt vēl %d reizi. Kļūdas gadījumā SIM karti vairs nevarēs izmantot. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru. SIM karte tagad ir atspējota. Ievadiet PUK kodu, lai turpinātu. Varat mēģināt vēl %d reizes. Kļūdas gadījumā SIM karti vairs nevarēs izmantot. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml index 1a3c799b0876..1ffd8a4ecec9 100644 --- a/packages/SystemUI/res-keyguard/values-mk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml @@ -151,4 +151,7 @@ SIM-картичката сега е оневозможена. Внесете PUK-код за да продолжите. Ви преостанува уште %d обид пред SIM-картичката да стане трајно неупотреблива. Контактирајте го операторот за детали. SIM-картичката сега е оневозможена. Внесете PUK-код за да продолжите. Ви преостануваат уште %d обиди пред SIM-картичката да стане трајно неупотреблива. Контактирајте го операторот за детали. + "Стандарден" + "Балонче" + "Аналоген" diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml index 685685e61bcf..b031e9e461b4 100644 --- a/packages/SystemUI/res-keyguard/values-ml/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml @@ -151,4 +151,10 @@ സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. സിം ശാശ്വതമായി ഉപയോഗശൂന്യമാകുന്നതിന് മുമ്പായി %d ശ്രമങ്ങൾ കൂടി ശേഷിക്കുന്നു. വിശദാംശങ്ങൾക്ക് കാരിയറുമായി ബന്ധപ്പെടുക. സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. സിം ശാശ്വതമായി ഉപയോഗശൂന്യമാകുന്നതിന് മുമ്പായി %d ശ്രമം കൂടി ശേഷിക്കുന്നു. വിശദാംശങ്ങൾക്ക് കാരിയറുമായി ബന്ധപ്പെടുക. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml index acdacdc15972..a5f8cbf665a8 100644 --- a/packages/SystemUI/res-keyguard/values-mn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml @@ -151,4 +151,10 @@ SIM-г идэвхгүй болголоо. Үргэлжлүүлэхийн тулд PUK кодыг оруулна уу. Таны SIM бүрмөсөн хүчингүй болох хүртэл %d оролдлого үлдлээ. Дэлгэрэнгүй мэдээлэл авахын тулд оператор компанитайгаа холбогдоно уу. SIM-г идэвхгүй болголоо. Үргэлжлүүлэхийн тулд PUK кодыг оруулна уу. Таны SIM бүрмөсөн хүчингүй болох хүртэл %d оролдлого үлдлээ. Дэлгэрэнгүй мэдээлэл авахын тулд оператор компанитайгаа холбогдоно уу. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml index 4ff6862a0621..2f14b636a271 100644 --- a/packages/SystemUI/res-keyguard/values-mr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml @@ -151,4 +151,10 @@ सिम आता बंद केलेले आहे. सुरू ठेवण्यासाठी PUK कोड टाका. सिम कायमचे बंद होण्याआधी तुमच्याकडे %d प्रयत्न शिल्लक आहेत. तपशीलांसाठी वाहकाशी संपर्क साधा. सिम आता बंद केलेले आहे. सुरू ठेवण्यासाठी PUK कोड टाका. सिम कायमचे बंद होण्याआधी तुमच्याकडे %d प्रयत्न शिल्लक आहे. तपशीलांसाठी वाहकाशी संपर्क साधा. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml index 5c9e7c9c6f4d..c70f51e07014 100644 --- a/packages/SystemUI/res-keyguard/values-ms/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml @@ -151,4 +151,10 @@ Kini SIM dilumpuhkan. Masukkan kod PUK untuk meneruskan. Tinggal %d percubaan sebelum SIM tidak boleh digunakan secara kekal. Hubungi pembawa untuk mendapatkan butiran. Kini SIM dilumpuhkan. Masukkan kod PUK untuk meneruskan. Tinggal %d percubaan sebelum SIM tidak boleh digunakan secara kekal. Hubungi pembawa untuk mendapatkan butiran. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml index c816159e7714..28fe2b210cea 100644 --- a/packages/SystemUI/res-keyguard/values-my/strings.xml +++ b/packages/SystemUI/res-keyguard/values-my/strings.xml @@ -151,4 +151,7 @@ ဆင်းမ်ကဒ်သည် ယခု ပိတ်သွားပါပြီ။ ရှေ့ဆက်ရန် PUK ကုဒ်ကို ထည့်ပါ။ ဆင်းမ်ကဒ် အပြီးပိတ်မသွားမီ သင့်တွင် %d ကြိမ် စမ်းသပ်ခွင့် ကျန်ပါသေးသည်။ အသေးစိတ်အချက်များအတွက် ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။ ဆင်းမ်ကဒ်သည် ယခု ပိတ်သွားပါပြီ။ ရှေ့ဆက်ရန် PUK ကုဒ်ကို ထည့်ပါ။ ဆင်းမ်ကဒ် အပြီးပိတ်မသွားမီ သင့်တွင် %d ကြိမ် စမ်းသပ်ခွင့် ကျန်ပါသေးသည်။ အသေးစိတ်အချက်များအတွက် ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။ + "မူလ" + "ပူဖောင်းကွက်" + "လက်တံနာရီ" diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml index 60a5d3626428..49415b9e6c19 100644 --- a/packages/SystemUI/res-keyguard/values-nb/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml @@ -151,4 +151,10 @@ SIM-kortet er deaktivert nå. Skriv inn PUK-koden for å fortsette. Du har %d forsøk igjen før SIM-kortet blir permanent ubrukelig. Kontakt operatøren for å få vite mer. SIM-kortet er deaktivert nå. Skriv inn PUK-koden for å fortsette. Du har %d forsøk igjen før SIM-kortet blir permanent ubrukelig. Kontakt operatøren for å få vite mer. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml index 5dcacdfeb747..4eff84215038 100644 --- a/packages/SystemUI/res-keyguard/values-ne/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml @@ -151,4 +151,10 @@ SIM लाई असक्षम पारिएको छ। जारी राख्न PUK कोड प्रविष्टि गर्नुहोस्। तपाईंसँग %d प्रयासहरू बाँकी छन्, त्यसपछि SIM सदाका लागि प्रयोग गर्न नमिल्ने हुन्छ। विवरणहरूका लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्। SIM लाई असक्षम पारिएको छ। जारी राख्न PUK कोड प्रविष्टि गर्नुहोस्। तपाईंसँग %d प्रयास बाँकी छ, त्यसपछि SIM सदाका लागि प्रयोग गर्न नमिल्ने हुन्छ। विवरणहरूका लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्। + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml index 7f18008abdb8..c79f2f7a536b 100644 --- a/packages/SystemUI/res-keyguard/values-nl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml @@ -151,4 +151,7 @@ De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Je hebt nog %d pogingen over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie. De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Je hebt nog %d poging over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie. + "Standaard" + "Bel" + "Analoog" diff --git a/packages/SystemUI/res-keyguard/values-or/strings.xml b/packages/SystemUI/res-keyguard/values-or/strings.xml index e1f512380c68..db16d09e9bf8 100644 --- a/packages/SystemUI/res-keyguard/values-or/strings.xml +++ b/packages/SystemUI/res-keyguard/values-or/strings.xml @@ -151,4 +151,10 @@ SIM କାର୍ଡକୁ ବର୍ତ୍ତମାନ ଅକ୍ଷମ କରିଦିଆଯାଇଛି। ଜାରି ରଖିବାକୁ PUK କୋଡ୍‍ ଲେଖନ୍ତୁ। ଆଉ %d ଥର ଭୁଲ କୋଡ୍‍ ଲେଖିବା ପରେ SIM କାର୍ଡ ସ୍ଥାୟୀ ଭାବେ ଅନୁପଯୋଗୀ ହୋଇଯିବ। ବିବରଣୀ ପାଇଁ କେରିଅର୍‌ର ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ। SIM କାର୍ଡକୁ ବର୍ତ୍ତମାନ ଅକ୍ଷମ କରିଦିଆଯାଇଛି। ଜାରି ରଖିବାକୁ PUK କୋଡ୍‍ ଲେଖନ୍ତୁ। ଆଉ %d ଥର ଭୁଲ କୋଡ୍‍ ଲେଖିବା ପରେ SIM କାର୍ଡ ସ୍ଥାୟୀ ଭାବେ ଅନୁପଯୋଗୀ ହୋଇଯିବ। ବିବରଣୀ ପାଇଁ କେରିଅର୍‌ର ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ। + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml index d15936da1eac..093732bbcaaf 100644 --- a/packages/SystemUI/res-keyguard/values-pa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml @@ -151,4 +151,10 @@ ਸਿਮ ਹੁਣ ਬੰਦ ਹੋ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਸਿਮ ਦੇ ਪੱਕੇ ਤੌਰ \'ਤੇ ਬੇਕਾਰ ਹੋ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਕੋਲ %d ਕੋਸ਼ਿਸ਼ ਬਾਕੀ ਹੈ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨੂੰ ਸੰਪਰਕ ਕਰੋ। ਸਿਮ ਹੁਣ ਬੰਦ ਹੋ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਸਿਮ ਦੇ ਪੱਕੇ ਤੌਰ \'ਤੇ ਬੇਕਾਰ ਹੋ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਕੋਲ %d ਕੋਸ਼ਿਸ਼ਾਂ ਬਾਕੀ ਹਨ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨੂੰ ਸੰਪਰਕ ਕਰੋ। + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml index 796e3b46ff71..5cda0175313d 100644 --- a/packages/SystemUI/res-keyguard/values-pl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml @@ -167,4 +167,10 @@ Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Masz jeszcze %d próby, zanim karta SIM zostanie trwale zablokowana. Aby uzyskać szczegółowe informacje, skontaktuj się z operatorem. Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Masz jeszcze %d próbę, zanim karta SIM zostanie trwale zablokowana. Aby uzyskać szczegółowe informacje, skontaktuj się z operatorem. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml index bfd046e1b10b..436dd551df7e 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml @@ -151,4 +151,7 @@ O chip agora está desativado. Informe o código PUK para continuar. Você tem %d tentativa restante antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes. O chip agora está desativado. Informe o código PUK para continuar. Você tem %d tentativas restantes antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes. + "Padrão" + "Bolha" + "Analógico" diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml index ba2b5bcf4853..2ba4268168c0 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml @@ -151,4 +151,7 @@ O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais %d tentativas antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes. O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais %d tentativa antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes. + "Predefinido" + "Balão" + "Analógico" diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml index bfd046e1b10b..436dd551df7e 100644 --- a/packages/SystemUI/res-keyguard/values-pt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml @@ -151,4 +151,7 @@ O chip agora está desativado. Informe o código PUK para continuar. Você tem %d tentativa restante antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes. O chip agora está desativado. Informe o código PUK para continuar. Você tem %d tentativas restantes antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes. + "Padrão" + "Bolha" + "Analógico" diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml index bde405c75ef0..6fdc95804129 100644 --- a/packages/SystemUI/res-keyguard/values-ro/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml @@ -159,4 +159,7 @@ Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-au mai rămas %d de încercări până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii. Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-a mai rămas %d încercare până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii. + "Prestabilit" + "Balon" + "Analogic" diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml index 07718c9eab0a..bfefba5e37ae 100644 --- a/packages/SystemUI/res-keyguard/values-ru/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml @@ -167,4 +167,10 @@ SIM-карта отключена. Чтобы продолжить, введите PUK-код. Осталось %d попыток. После этого SIM-карта будет заблокирована навсегда. За подробной информацией обратитесь к оператору связи. SIM-карта отключена. Чтобы продолжить, введите PUK-код. Осталось %d попытки. После этого SIM-карта будет заблокирована навсегда. За подробной информацией обратитесь к оператору связи. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml index 253cf61dbd29..e40be057dca6 100644 --- a/packages/SystemUI/res-keyguard/values-si/strings.xml +++ b/packages/SystemUI/res-keyguard/values-si/strings.xml @@ -151,4 +151,7 @@ SIM දැන් අබල කර ඇත. දිගටම කරගෙන යාමට PUK කේතය ඇතුළු කරන්න. SIM ස්ථිරවම භාවිත කළ නොහැකි බවට පත් වීමට පෙර ඔබ සතුව උත්සාහයන් %dක් ඉතිරිව ඇත. විස්තර සඳහා වාහක සම්බන්ධ කර ගන්න. SIM දැන් අබල කර ඇත. දිගටම කරගෙන යාමට PUK කේතය ඇතුළු කරන්න. SIM ස්ථිරවම භාවිත කළ නොහැකි බවට පත් වීමට පෙර ඔබ සතුව උත්සාහයන් %dක් ඉතිරිව ඇත. විස්තර සඳහා වාහක සම්බන්ධ කර ගන්න. + "පෙරනිමි" + "බුබුළ" + "ප්‍රතිසමය" diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml index 4a70cbc64079..a90a3024660d 100644 --- a/packages/SystemUI/res-keyguard/values-sk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml @@ -167,4 +167,10 @@ SIM karta je deaktivovaná. Pokračujte zadaním kódu PUK. Zostáva vám %d pokusov, potom sa SIM karta natrvalo zablokuje. Podrobnosti vám poskytne operátor. SIM karta je deaktivovaná. Pokračujte zadaním kódu PUK. Zostáva vám %d pokus, potom sa SIM karta natrvalo zablokuje. Podrobnosti vám poskytne operátor. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml index 0fbcbfca5d87..dac44e7f4d4a 100644 --- a/packages/SystemUI/res-keyguard/values-sl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml @@ -167,4 +167,10 @@ Kartica SIM je zdaj onemogočena. Če želite nadaljevati, vnesite kodo PUK. Na voljo imate še %d poskuse. Potem bo kartica SIM postala trajno neuporabna. Za podrobnosti se obrnite na operaterja. Kartica SIM je zdaj onemogočena. Če želite nadaljevati, vnesite kodo PUK. Na voljo imate še %d poskusov. Potem bo kartica SIM postala trajno neuporabna. Za podrobnosti se obrnite na operaterja. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml index 82fefeab03ec..b52039a5f174 100644 --- a/packages/SystemUI/res-keyguard/values-sq/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml @@ -151,4 +151,10 @@ Karta SIM tani është çaktivizuar. Fut kodin PUK për të vazhduar. Të kanë mbetur edhe %d përpjekje përpara se karta SIM të bëhet përgjithmonë e papërdorshme. Kontakto me operatorin për detaje. Karta SIM tani është çaktivizuar. Fut kodin PUK për të vazhduar. Të ka mbetur edhe %d përpjekje përpara se karta SIM të bëhet përgjithmonë e papërdorshme. Kontakto me operatorin për detaje. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml index 23a30c8d2d31..1e6de94125dd 100644 --- a/packages/SystemUI/res-keyguard/values-sr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml @@ -159,4 +159,7 @@ SIM је сада онемогућен. Унесите PUK кôд да бисте наставили. Имате још %d покушаја пре него што SIM постане трајно неупотребљив. Детаљне информације потражите од мобилног оператера. SIM је сада онемогућен. Унесите PUK кôд да бисте наставили. Имате још %d покушаја пре него што SIM постане трајно неупотребљив. Детаљне информације потражите од мобилног оператера. + "Подразумевани" + "Мехурићи" + "Аналогни" diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml index a9521bc7ab83..4cca1767a89d 100644 --- a/packages/SystemUI/res-keyguard/values-sv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml @@ -151,4 +151,7 @@ SIM-kortet är inaktiverat. Ange PUK-koden om du vill fortsätta. %d försök återstår innan SIM-kortet blir obrukbart. Kontakta operatören för mer information. SIM-kortet är inaktiverat. Ange PUK-koden om du vill fortsätta. %d försök återstår innan SIM-kortet blir obrukbart. Kontakta operatören för mer information. + "Standard" + "Bubbla" + "Analog" diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml index 5a195351da35..cfe0d4f3d9d5 100644 --- a/packages/SystemUI/res-keyguard/values-sw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml @@ -151,4 +151,10 @@ Sasa SIM imefungwa. Weka msimbo wa PUK ili uendelee. Umesalia na majaribio %d kabla ya SIM kuacha kufanya kazi kabisa. Wasiliana na mtoa huduma kwa maelezo. Sasa SIM imefungwa. Weka msimbo wa PUK ili uendelee. Umesalia na jaribio %d kabla ya SIM kuacha kufanya kazi kabisa. Wasiliana na mtoa huduma kwa maelezo. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml index db23ccced316..2383906caf89 100644 --- a/packages/SystemUI/res-keyguard/values-ta/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml @@ -151,4 +151,10 @@ சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர்வதற்கு, PUK குறியீட்டை உள்ளிடவும். நீங்கள் %d முறை மட்டுமே முயற்சிக்க முடியும். அதன்பிறகு சிம் நிரந்தரமாக முடக்கப்படும். விவரங்களுக்கு, மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும். சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர்வதற்கு, PUK குறியீட்டை உள்ளிடவும். நீங்கள் %d முறை மட்டுமே முயற்சிக்க முடியும். அதன்பிறகு சிம் நிரந்தரமாக முடக்கப்படும். விவரங்களுக்கு, மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும். + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml index 4cc70560db32..1df73bf1b63d 100644 --- a/packages/SystemUI/res-keyguard/values-te/strings.xml +++ b/packages/SystemUI/res-keyguard/values-te/strings.xml @@ -151,4 +151,10 @@ SIM ఇప్పుడు నిలిపివేయబడింది. PUK కోడ్‌ను నమోదు చేయండి. SIM శాశ్వతంగా నిరుపయోగం కాకుండా ఉండటానికి మీకు %d ప్రయత్నాలు మిగిలి ఉన్నాయి. వివరాల కోసం కారియర్‌ను సంప్రదించండి. SIM ఇప్పుడు నిలిపివేయబడింది. PUK కోడ్‌ను నమోదు చేయండి. SIM శాశ్వతంగా నిరుపయోగం కాకుండా ఉండటానికి మీకు %d ప్రయత్నం మిగిలి ఉంది వివరాల కోసం కారియర్‌ను సంప్రదించండి. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml index 9ba096a7f646..27ffa4bf1667 100644 --- a/packages/SystemUI/res-keyguard/values-th/strings.xml +++ b/packages/SystemUI/res-keyguard/values-th/strings.xml @@ -151,4 +151,10 @@ ซิมถูกปิดใช้งานในขณะนี้ โปรดป้อนรหัส PUK เพื่อทำต่อ คุณพยายามได้อีก %d ครั้งก่อนที่ซิมจะไม่สามารถใช้งานได้อย่างถาวร โปรดติดต่อสอบถามรายละเอียดจากผู้ให้บริการ ซิมถูกปิดใช้งานในขณะนี้ โปรดป้อนรหัส PUK เพื่อทำต่อ คุณพยายามได้อีก %d ครั้งก่อนที่ซิมจะไม่สามารถใช้งานได้อย่างถาวร โปรดติดต่อสอบถามรายละเอียดจากผู้ให้บริการ + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml index 4f247c3a361d..f4fc375e1fe5 100644 --- a/packages/SystemUI/res-keyguard/values-tl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml @@ -151,4 +151,10 @@ Naka-disable na ang SIM. Ilagay ang PUK code upang magpatuloy. Mayroon kang %d natitirang pagsubok bago tuluyang hindi magamit ang SIM. Makipag-ugnayan sa carrier para sa mga detalye. Naka-disable na ang SIM. Ilagay ang PUK code upang magpatuloy. Mayroon kang %d na natitirang pagsubok bago tuluyang hindi magamit ang SIM. Makipag-ugnayan sa carrier para sa mga detalye. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml index fc4fa408429c..56b838a60d18 100644 --- a/packages/SystemUI/res-keyguard/values-tr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml @@ -151,4 +151,10 @@ SIM artık devre dışı. Devam etmek için PUK kodunu girin. SIM kalıcı olarak kullanım dışı kalmadan önce %d deneme hakkınız kaldı. Ayrıntılı bilgi için operatörünüzle iletişim kurun. SIM artık devre dışı. Devam etmek için PUK kodunu girin. SIM kalıcı olarak kullanım dışı kalmadan önce %d deneme hakkınız kaldı. Ayrıntılı bilgi için operatörünüzle iletişim kurun. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml index e3b5256b767c..c683e329f17b 100644 --- a/packages/SystemUI/res-keyguard/values-uk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml @@ -167,4 +167,7 @@ SIM-карту заблоковано. Щоб продовжити, введіть PUK-код. Залишилося %d спроб. Після цього SIM-карту буде назавжди заблоковано. Щоб дізнатися більше, зверніться до свого оператора. SIM-карту заблоковано. Щоб продовжити, введіть PUK-код. Залишилося %d спроби. Після цього SIM-карту буде назавжди заблоковано. Щоб дізнатися більше, зверніться до свого оператора. + "За умовчанням" + "Бульбашковий" + "Аналоговий" diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml index ed44c0321c8e..fe57baa779b1 100644 --- a/packages/SystemUI/res-keyguard/values-ur/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml @@ -151,4 +151,10 @@ ‏SIM اب غیر فعال ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ SIM کے مستقل طور پر ناقابل استعمال ہونے سے پہلے آپ کے پاس %d کوششیں بچی ہیں۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔ ‏SIM اب غیر فعال ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ SIM کے مستقل طور پر ناقابل استعمال ہونے سے پہلے آپ کے پاس %d کوشش بچی ہے۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔ + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml index b78e5bff65c4..736373d33b4c 100644 --- a/packages/SystemUI/res-keyguard/values-uz/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml @@ -153,4 +153,10 @@ SIM karta faolsizlantirildi. Davom etish uchun PUK kodni kiriting. Yana %d marta xato qilsangiz, SIM kartangiz butunlay qulflanadi. Batafsil axborot olish uchun tarmoq operatoriga murojaat qiling. SIM karta faolsizlantirildi. Davom etish uchun PUK kodni kiriting. Yana %d marta xato qilsangiz, SIM kartangiz butunlay qulflanadi. Batafsil axborot olish uchun tarmoq operatoriga murojaat qiling. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml index 7f51ace8cdd8..461c73c36ebf 100644 --- a/packages/SystemUI/res-keyguard/values-vi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml @@ -151,4 +151,10 @@ SIM hiện đã bị tắt. Hãy nhập mã PUK để tiếp tục. Bạn còn %d lần thử trước khi SIM vĩnh viễn không sử dụng được. Hãy liên hệ với nhà cung cấp dịch vụ để biết chi tiết. SIM hiện đã bị tắt. Hãy nhập mã PUK để tiếp tục. Bạn còn %d lần thử trước khi SIM vĩnh viễn không thể sử dụng được. Hãy liên hệ với nhà cung cấp dịch vụ để biết chi tiết. + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml index 7e508240e485..bf7e1affb788 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml @@ -151,4 +151,10 @@ SIM 卡现已停用,请输入 PUK 码继续使用。您还可以尝试 %d 次。如果仍不正确,该 SIM 卡将永远无法使用。有关详情,请联系您的运营商。 SIM 卡现已停用,请输入 PUK 码继续使用。您还可以尝试 %d 次。如果仍不正确,该 SIM 卡将永远无法使用。有关详情,请联系您的运营商。 + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml index f416cee31572..760c5c37e267 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml @@ -151,4 +151,10 @@ SIM 卡已停用。請輸入 PUK 碼以繼續進行。您還可以再試 %d 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請與流動網絡供應商聯絡。 SIM 卡已停用。請輸入 PUK 碼以繼續進行。您還可以再試 %d 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請與流動網絡供應商聯絡。 + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml index c224e22b66e7..a2d160ba06ed 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml @@ -151,4 +151,10 @@ SIM 卡現在已遭停用。請輸入 PUK 碼以繼續進行。你還可以再試 %d 次,如果仍然失敗,SIM 卡將永久無法使用。詳情請與電信業者聯絡。 SIM 卡現在已遭停用。請輸入 PUK 碼以繼續進行。你還可以再試 %d 次,如果仍然失敗,SIM 卡將永久無法使用。詳情請與電信業者聯絡。 + + + + + + diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml index b4351a728289..6a7f6475809e 100644 --- a/packages/SystemUI/res-keyguard/values-zu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml @@ -151,4 +151,7 @@ I-SIM manje ikhutshaziwe. Faka ikhodi ye-PUK ukuze uqhubeke. Unemizamo engu-%d esele ngaphambi kokuthi i-SIM ingasebenziseki unaphakade. Xhumana nenkampani yenethiwekhi ngemininingwane. I-SIM manje ikhutshaziwe. Faka ikhodi ye-PUK ukuze uqhubeke. Unemizamo engu-%d esele ngaphambi kokuthi i-SIM ingasebenziseki unaphakade. Xhumana nenkampani yenethiwekhi ngemininingwane. + "Okuzenzekelayo" + "Ibhamuza" + "I-Analog" diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 80cba56ddc6c..8128b3d7f41d 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -197,6 +197,7 @@ "Diensverskaffernetwerk verander tans" "Maak batterybesonderhede oop" "Battery %d persent." + "Battery %1$s persent, ongeveer %2$s oor gegrond op jou gebruik" "Battery laai tans, %d%%." "Stelselinstellings" "Kennisgewings" @@ -398,7 +399,7 @@ "+%d" "Minder dringende kennisgewings hieronder" "Tik weer om oop te maak" - "Swiep op om te ontsluit" + "Swiep op om oop te maak" "Jou organisasie bestuur hierdie toestel" "Hierdie toestel word deur %s bestuur" "Swiep vanaf ikoon vir foon" @@ -932,8 +933,6 @@ "Beweeg na links onder" "Beweeg na regs onder" "Maak toe" - - - - + "Stelselnavigasie is opgedateer. Gaan na Instellings toe om veranderinge te maak." + "Gaan na Instellings toe om stelselnavigasie op te dateer" diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index b779ce7c6cea..f1d9ce7ca6de 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -197,6 +197,7 @@ "የአገልግሎት አቅራቢ አውታረ መረብን በመቀየር ላይ" "የባትሪ ዝርዝሮችን ክፈት" "የባትሪ %d መቶኛ።" + "ባትሪ %1$s በመቶ፣ በአጠቃቀምዎ ላይ በመመስረት %2$s ገደማ ይቀራል" "ባትሪ ኃይል በመሙላት ላይ፣ %d %%." "የስርዓት ቅንብሮች" "ማሳወቂያዎች" @@ -398,7 +399,7 @@ "+%d" "በጣም አስቸካይ ያልሆኑ ማሳወቂያዎች ከታች" "ለመክፈት ዳግም መታ ያድርጉ" - "ለማስከፈት ወደ ላይ ያንሸራትቱ" + "ለመክፈት በጣት ወደ ላይ ጠረግ ያድርጉ" "ይህ መሣሪያ በእርስዎ ድርጅት የሚተዳደር ነው" "ይህ መሣሪያ በ%s የሚተዳደር ነው" "ለስልክ ከአዶ ላይ ጠረግ ያድርጉ" @@ -932,8 +933,6 @@ "የግርጌውን ግራ አንቀሳቅስ" "ታችኛውን ቀኝ ያንቀሳቅሱ" "አሰናብት" - - - - + "የስርዓት ዳሰሳ ተዘምኗል። ለውጦችን ለማድረግ ወደ ቅንብሮች ይሂዱ።" + "የስርዓት ዳሰሳን ለማዘመን ወደ ቅንብሮች ይሂዱ" diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 2381e1691eb4..d77eb5db95c0 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -197,6 +197,7 @@ "جارٍ تغيير شبكة مشغِّل شبكة الجوّال." "فتح تفاصيل البطارية" "مستوى البطارية %d في المائة." + "نسبة الشحن بالبطارية %1$s بالمائة، ويتبقى %2$s تقريبًا بناءً على استخدامك." "جارٍ شحن البطارية، %d%%." "إعدادات النظام." "الإشعارات." @@ -406,7 +407,7 @@ "+%d" "الإشعارات الأقل إلحاحًا أدناه" "انقر مرة أخرى للفتح" - "مرر سريعًا لأعلى لإلغاء القفل" + "يمكنك الفتح بالتمرير سريعًا لأعلى." "تتولى مؤسستك إدارة هذا الجهاز." "تتم إدارة هذا الجهاز بواسطة %s" "يمكنك التمرير سريعًا من الرمز لتشغيل الهاتف" @@ -952,8 +953,6 @@ "نقل إلى أسفل يمين الشاشة" "نقل إلى أسفل اليسار" "تجاهل" - - - - + "تم تحديث التنقل داخل النظام. لإجراء التغييرات، يُرجى الانتقال إلى \"الإعدادات\"." + "الانتقال إلى \"الإعدادات\" لتعديل التنقل داخل النظام" diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 7f349eb68920..6bea13ec8be5 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -197,6 +197,7 @@ "বাহক নেটৱৰ্কৰ পৰিৱৰ্তন" "বেটাৰিৰ বিৱৰণসমূহ খোলক" "%d শতাংশ বেটাৰি।" + "আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি বেটাৰী %1$s শতাংশ, প্ৰায় %2$s বাকী আছে" "বেটাৰি চ্চাৰ্জ কৰি থকা হৈছে, %d শতাংশ।" "ছিষ্টেমৰ ছেটিংসমূহ৷" "জাননীসমূহ।" @@ -398,7 +399,8 @@ "+%d" "কম জৰুৰী জাননীসমূহ তলত" "খুলিবলৈ পুনৰাই টিপক" - "আনলক কৰিবলৈ ওপৰলৈ ছোৱাইপ কৰক" + + "আপোনাৰ প্ৰতিষ্ঠানে এই ডিভাইচটো পৰিচালনা কৰে" "এই ডিভাইচটো %sৰ দ্বাৰা পৰিচালিত।" "ফ\'নৰ বাবে আইকনৰপৰা ছোৱাইপ কৰক" @@ -932,8 +934,6 @@ "বুটামটো বাওঁফালে নিয়ক" "তলৰ সোঁফালে নিয়ক" "অগ্ৰাহ্য কৰক" - - - - + "ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰা হ’ল। সলনি কৰিবলৈ ছেটিংসমূহ-লৈ যাওক।" + "ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰিবলৈ ছেটিংসমূহ-লৈ যাওক" diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 4602bd2df6de..78c3239d90e5 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -197,6 +197,7 @@ "Operator şəbəkəsinin dəyişilməsi" "Batareya detallarını açın" "Batareya %d faizdir." + "Batareya %1$s faizdir, istifadəyə əsasən təxminən %2$s qalıb" "Batareya doldurulur, %d%% faiz." "Sistem parametrləri" "Bildirişlər." @@ -398,7 +399,7 @@ "+%d" "Daha az təcili bildirişlər aşağıdadır" "Açmaq üçün yenidən tıklayın" - "Kiliddən çıxarmaq üçün yuxarı çəkin" + "Açmaq üçün yuxarı sürüşdürün" "Bu cihaz təşkilatınız tərəfindən idarə olunur" "Bu cihaz %s tərəfindən idarə olunur" "Telefon üçün ikonadan sürüşdürün" @@ -932,8 +933,6 @@ "Aşağıya sola köçürün" "Aşağıya sağa köçürün" "Kənarlaşdırın" - - - - + "Sistem naviqasiyası yeniləndi. Dəyişiklik etmək üçün Ayarlara daxil olun." + "Sistem naviqasiyasını yeniləmək üçün Ayarlara keçin" diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 75be041dd6e0..b734740a260c 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -197,6 +197,7 @@ "Promena mreže mobilnog operatera" "Otvori detalje o bateriji" "Baterija je na %d posto." + "Baterija je na %1$s posto, preostalo vreme na osnovu korišćenja je %2$s" "Baterija se puni, %d%%." "Sistemska podešavanja." "Obaveštenja." @@ -400,7 +401,7 @@ "+%d" "Manje hitna obaveštenja su u nastavku" "Dodirnite ponovo da biste otvorili" - "Prevucite nagore da biste otključali" + "Prevucite nagore da biste otvorili" "Ovim uređajem upravlja organizacija" "Ovim uređajem upravlja %s" "Prevucite od ikone za telefon" @@ -937,8 +938,6 @@ "Premesti dole levo" "Premesti dole desno" "Odbaci" - - - - + "Navigacija sistema je ažurirana. Da biste uneli izmene, idite u Podešavanja." + "Idite u Podešavanja da biste ažurirali navigaciju sistema" diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 2155b33a4947..b42c385ba5df 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -199,6 +199,7 @@ + "Зарад акумулятара ў працэнтах: %1$s. Пры такім выкарыстанні яго хопіць прыблізна на %2$s" "Зарадка акумулятара: %d%%." "Сістэмныя налады." "Апавяшчэнні." @@ -404,7 +405,7 @@ "+%d" "Менш тэрміновыя апавяшчэнні ніжэй" "Дакраніцеся яшчэ раз, каб адкрыць" - "Правядзіце пальцам уверх, каб разблакіраваць" + "Каб адкрыць, прагарніце ўверх" "Гэта прылада знаходзіцца пад кіраваннем вашай арганізацыі" "Гэта прылада знаходзіцца пад кіраваннем %s" "Тэлефон: правядзіце пальцам ад значка" @@ -944,8 +945,6 @@ "Перамясціць лявей і ніжэй" "Перамясціць правей і ніжэй" "Адхіліць" - - - - + "Навігацыя ў сістэме абноўлена. Каб унесці змяненні, перайдзіце ў Налады." + "Перайдзіце ў Налады, каб абнавіць параметры навігацыі ў сістэме" diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 1e619a82233b..a3cdd72642a9 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -197,6 +197,7 @@ "Промяна на мрежата на оператора" "Отваряне на подробностите за батерията" "%d процента батерия." + "Батерията е на %1$s процента. Още около %2$s въз основа на използването" "Батерията се зарежда – %d%%." "Системни настройки." "Известия." @@ -398,7 +399,7 @@ "+%d" "Ппоказване на по-малко спешните известия по-долу" "Докоснете отново, за да отворите" - "Плъзнете нагоре, за да отключите" + "Прекарайте пръст нагоре, за да отключите" "Това устройство се управлява от организацията ви" "Това устройство се управлява от %s" "Плъзнете с пръст от иконата, за да използвате телефона" @@ -932,8 +933,6 @@ "Преместване долу вляво" "Преместване долу вдясно" "Отхвърляне" - - - - + "Режимът за навигиране в системата е актуализиран. За да извършите промени, отворете настройките." + "Отворете настройките, за да актуализирате режима за навигиране в системата" diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 99043416a0ef..dc175a00b3e4 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -197,6 +197,7 @@ "পরিষেবা প্রদানকারীর নেটওয়ার্ক পরিবর্তন করা হচ্ছে" "ব্যাটারির বিশদ বিবরণ খুলুন" "%d শতাংশ ব্যাটারি রয়েছে৷" + "ব্যাটারি %1$s শতাংশ, বর্তমান ব্যবহারের উপর ভিত্তি করে আর %2$s চলবে" "ব্যাটারি চার্জ হচ্ছে, %d শতাংশ৷" "সিস্টেম সেটিংস৷" "বিজ্ঞপ্তি৷" @@ -398,7 +399,8 @@ "+%d" "নিচে অপেক্ষাকৃত কম জরুরী বিজ্ঞপ্তিগুলি" "খোলার জন্য আবার আলতো চাপুন" - "আনলক করতে উপরের দিকে সোয়াইপ করুন" + + "আপনার সংস্থা এই ডিভাইসটি পরিচালনা করছে" "এই ডিভাইসটি %s এর দ্বারা পরিচালিত" "ফোনের জন্য আইকন থেকে সোয়াইপ করুন" @@ -932,8 +934,6 @@ "নিচে বাঁদিকে সরান" "নিচে ডান দিকে সরান" "খারিজ করুন" - - - - + "সিস্টেম নেভিগেশন আপডেট হয়েছে। পরিবর্তন করার জন্য সেটিংসে যান।" + "সিস্টেম নেভিগেশন আপডেট করতে সেটিংসে যান" diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 8a02f16e9058..4bfa10ee02d0 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -197,6 +197,7 @@ "Promjena mreže mobilnog operatera" "Otvori detalje o potrošnji baterije" "Baterija na %d posto." + "Baterija je na %1$s posto. Na osnovu vaše potrošnje preostalo vam je otprilike %2$s" "Punjenje baterije, %d%%." "Postavke sistema." "Obavještenja." @@ -400,7 +401,7 @@ "+%d" "Prikaži manje važna obavještenja ispod" "Dodirnite ponovo da otvorite" - "Prevucite prema gore da otključate" + "Prevucite da otvorite" "Ovim uređajem upravlja vaša organizacija" "Ovim uređajem upravlja %s" "Prevucite preko ikone da otvorite telefon" @@ -939,8 +940,6 @@ "Pomjeri dolje lijevo" "Pomjerite dolje desno" "Odbaci" - - - - + "Navigiranje sistemom je ažurirano. Da izvršite promjene, idite u Postavke." + "Idite u Postavke da ažurirate navigiranje sistemom" diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 4c5272247466..ece6a63e4be0 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -197,6 +197,7 @@ "S\'està canviant la xarxa de l\'operador de telefonia mòbil" "Obre els detalls de la bateria" "%d per cent de bateria." + "%1$s per cent de bateria amb aproximadament %2$s de temps restant segons l\'ús que en fas" "La bateria s\'està carregant, %d%%." "Configuració del sistema." "Notificacions." @@ -398,7 +399,7 @@ "+%d" "Notificacions menys urgents a continuació" "Torna a tocar per obrir-la." - "Llisca cap amunt per desbloquejar el teclat" + "Llisca cap amunt per obrir" "La teva organització gestiona aquest dispositiu" "%s gestiona aquest dispositiu" "Llisca des de la icona per obrir el telèfon" @@ -411,10 +412,10 @@ "Silenci\ntotal" "Només\ninterr. prior." "Només\nalarmes" - "%2$s • S\'està carregant sense fil (temps restant: %1$s)" - "%2$s • S\'està carregant (temps restant: %1$s)" + "%2$s • S\'està carregant sense fil (%1$s per completar la càrrega)" + "%2$s • S\'està carregant (%1$s per completar la càrrega)" "%2$s • Carregant ràpidament (temps restant: %1$s)" - "%2$s • Carregant lentament (temps restant: %1$s)" + "%2$s • Carregant lentament (%1$s per completar la càrrega)" "Canvia d\'usuari" "Canvia d\'usuari. Usuari actual: %s" "Usuari actual: %s" @@ -932,8 +933,6 @@ "Mou a baix a l\'esquerra" "Mou a baix a la dreta" "Omet" - - - - + "S\'ha actualitzat el sistema de navegació. Per fer canvis, ves a Configuració." + "Ves a Configuració per actualitzar el sistema de navegació" diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 4afe0c524070..6b6bfa330acd 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -197,6 +197,7 @@ "Probíhá změna sítě operátora" "Otevřít podrobnosti o baterii" "Stav baterie: %d procent." + "Baterie je nabitá na %1$s %, při vašem používání vydrží ještě %2$s" "Baterie se nabíjí. Nabito: %d %%" "Systémová nastavení." "Oznámení." @@ -402,7 +403,7 @@ "+%d" "Méně urgentní oznámení níže" "Oznámení otevřete opětovným klepnutím" - "Zařízení odemknete přejetím prstem nahoru" + "Otevřete přejetím prstem nahoru" "Toto zařízení spravuje vaše organizace" "Toto zařízení je spravováno organizací %s" "Telefon otevřete přejetím prstem od ikony" @@ -942,8 +943,6 @@ "Přesunout vlevo dolů" "Přesunout vpravo dolů" "Zavřít" - - - - + "Systémová navigace byla aktualizována. Chcete-li provést změny, přejděte do Nastavení." + "Přejděte do Nastavení a aktualizujte systémovou navigaci" diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 702fdcf9a729..5d3dac843463 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -197,6 +197,7 @@ "Skift af mobilnetværk" "Åbn oplysninger om batteri" "Batteri %d procent." + "Batteriniveauet er på %1$s procent, så du har ca. %2$s tilbage, alt efter hvordan du bruger enheden" "Batteriet oplades. %d %%." "Systemindstillinger." "Notifikationer." @@ -398,7 +399,7 @@ "+%d" "Mindre presserende notifikationer nedenfor" "Tryk igen for at åbne" - "Stryg opad for at låse op" + "Stryg opad for at åbne" "Denne enhed administreres af din organisation" "Denne enhed administreres af %s" "Stryg fra telefonikonet" @@ -932,8 +933,6 @@ "Flyt ned til venstre" "Flyt ned til højre" "Afvis" - - - - + "Systemnavigationen blev opdateret. Gå til Indstillinger for at foretage ændringer." + "Gå til Indstillinger for at opdatere systemnavigationen" diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index a1a01dfdd06c..1c44f09dcd54 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -26,7 +26,7 @@ "Benachrichtigungen" "Der Akku ist fast leer" "%s verbleibend" - "%1$s ausstehend; noch ca. %2$s, basierend auf deiner Nutzung" + "Noch %1$s übrig; bei deinem Nutzungsmuster hast du noch ca. %2$s" "%1$s ausstehend; noch ca. %2$s" "Noch %s. Der Energiesparmodus ist aktiviert." "Aufladen über USB nicht möglich. Verwende das mit dem Gerät gelieferte Ladegerät." @@ -199,6 +199,7 @@ + "Akku bei %1$s %, bei deinem Nutzungsmuster hast du noch ca. %2$s" @@ -402,7 +403,7 @@ "+%d" "Weniger dringende Benachrichtigungen unten" "Erneut tippen, um Benachrichtigung zu öffnen" - "Zum Entsperren nach oben wischen" + "Zum Öffnen nach oben wischen" "Dieses Gerät wird von deiner Organisation verwaltet" "Dieses Gerät wird von %s verwaltet" "Zum Öffnen des Telefons vom Symbol wegwischen" @@ -936,8 +937,6 @@ "Nach unten links verschieben" "Nach unten rechts verschieben" "Schließen" - - - - + "Systemsteuerungseinstellungen wurden angepasst. Änderungen kannst du in den Einstellungen vornehmen." + "Gehe zu den Einstellungen, um die Systemsteuerung anzupassen" diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 0a8707859b8d..335b60b3f633 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -197,6 +197,7 @@ "Αλλαγή δικτύου εταιρείας κινητής τηλεφωνίας" "Άνοιγμα λεπτομερειών μπαταρίας" "Μπαταρία %d τοις εκατό." + "Μπαταρία στο %1$s τοις εκατό. Περίπου %2$s ακόμη, βάσει της χρήσης σας" "Φόρτιση μπαταρίας, %d%% τοις εκατό." "Ρυθμίσεις συστήματος." "Ειδοποιήσεις." @@ -398,7 +399,7 @@ "+%d" "Λιγότερο επείγουσες ειδοποιήσεις παρακάτω" "Πατήστε ξανά για να ανοίξετε" - "Σύρετε για να ξεκλειδώσετε" + "Σύρετε προς τα επάνω για άνοιγμα" "Αυτή η συσκευή είναι διαχειριζόμενη από τον οργανισμό σας" "Τη συσκευή διαχειρίζεται ο οργανισμός %s" "Σύρετε προς τα έξω για τηλέφωνο" @@ -932,8 +933,6 @@ "Μετακίνηση κάτω αριστερά" "Μετακίνηση κάτω δεξιά" "Παράβλεψη" - - - - + "Η πλοήγηση συστήματος ενημερώθηκε. Για να κάνετε αλλαγές, μεταβείτε στις Ρυθμίσεις." + "Μεταβείτε στις Ρυθμίσεις για να ενημερώσετε την πλοήγηση συστήματος" diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 2b836ec5a87f..4ee7235d6770 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -197,6 +197,7 @@ "Operator network changing" "Open battery details" "Battery %d per cent." + "Battery %1$s percentage, about %2$s left based on your usage" "Battery charging, %d percent." "System settings" "Notifications." @@ -398,7 +399,7 @@ "+%d" "Less urgent notifications below" "Tap again to open" - "Swipe up to unlock" + "Swipe up to open" "This device is managed by your organization" "This device is managed by %s" "Swipe from icon for phone" @@ -932,8 +933,6 @@ "Move bottom left" "Move bottom right" "Dismiss" - - - - + "System navigation updated. To make changes, go to Settings." + "Go to Settings to update system navigation" diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 3409611c7b53..dfb39c664dbd 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -197,6 +197,7 @@ "Operator network changing" "Open battery details" "Battery %d per cent." + "Battery %1$s percentage, about %2$s left based on your usage" "Battery charging, %d percent." "System settings" "Notifications." @@ -398,7 +399,7 @@ "+%d" "Less urgent notifications below" "Tap again to open" - "Swipe up to unlock" + "Swipe up to open" "This device is managed by your organization" "This device is managed by %s" "Swipe from icon for phone" @@ -932,8 +933,6 @@ "Move bottom left" "Move bottom right" "Dismiss" - - - - + "System navigation updated. To make changes, go to Settings." + "Go to Settings to update system navigation" diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 2b836ec5a87f..4ee7235d6770 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -197,6 +197,7 @@ "Operator network changing" "Open battery details" "Battery %d per cent." + "Battery %1$s percentage, about %2$s left based on your usage" "Battery charging, %d percent." "System settings" "Notifications." @@ -398,7 +399,7 @@ "+%d" "Less urgent notifications below" "Tap again to open" - "Swipe up to unlock" + "Swipe up to open" "This device is managed by your organization" "This device is managed by %s" "Swipe from icon for phone" @@ -932,8 +933,6 @@ "Move bottom left" "Move bottom right" "Dismiss" - - - - + "System navigation updated. To make changes, go to Settings." + "Go to Settings to update system navigation" diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 2b836ec5a87f..4ee7235d6770 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -197,6 +197,7 @@ "Operator network changing" "Open battery details" "Battery %d per cent." + "Battery %1$s percentage, about %2$s left based on your usage" "Battery charging, %d percent." "System settings" "Notifications." @@ -398,7 +399,7 @@ "+%d" "Less urgent notifications below" "Tap again to open" - "Swipe up to unlock" + "Swipe up to open" "This device is managed by your organization" "This device is managed by %s" "Swipe from icon for phone" @@ -932,8 +933,6 @@ "Move bottom left" "Move bottom right" "Dismiss" - - - - + "System navigation updated. To make changes, go to Settings." + "Go to Settings to update system navigation" diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 416931db3c6c..738591fa0973 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -197,6 +197,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‎‎‎‏‎‏‎‏‏‏‎‎‎‏‏‎‏‏‏‎‏‏‏‏‎‏‏‏‏‏‎‎‎‎‏‎‎Carrier network changing‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‏‎‎‏‎‏‎‏‎‎‏‏‏‎‎‎‏‏‏‏‎‏‎‏‏‎‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎‎‎‎‎‎‏‏‏‎‎Open battery details‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‎‏‎‎‎‏‏‏‏‎‏‎‎‎‏‎‎‏‎‏‏‎‎‏‎‎‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‏‎‎‏‎‎‏‏‏‏‎‏‎Battery ‎‏‎‎‏‏‎%d‎‏‎‎‏‏‏‎ percent.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‎‎‎‎‎‎‏‎‏‎‏‏‎‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‏‎‎‎‎‎‏‎‏‏‎‎‎‎‏‎‎‏‏‏‎‎Battery ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ percent, about ‎‏‎‎‏‏‎%2$s‎‏‎‎‏‏‏‎ left based on your usage‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‏‏‎‏‎‎‎‏‏‏‏‎‎‏‏‏‎‎‎‎‏‎‏‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‎Battery charging, ‎‏‎‎‏‏‎%d‎‏‎‎‏‏‏‎ percent.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‎‎‏‏‎‎‎‏‎‏‏‎‎‎‏‎‏‎‏‎‏‎‎‏‎‏‏‎‏‎‏‎‎‎‏‏‎‎‎‎‎‏‎‏‏‏‏‏‎‎‎‎‏‎‎‎System settings.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‎‎‏‏‎‏‏‏‎‎‎‎‎‎‏‎‏‎‎‎‎‎‎‎‏‎‎‎‏‏‏‎‎‏‏‎‎‏‎‏‏‎‎‎‏‎‎‎Notifications.‎‏‎‎‏‎" @@ -398,7 +399,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‎‎‎‎‎‏‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‏‎‏‎‏‎‏‎‏‎+‎‏‎‎‏‏‎%d‎‏‎‎‏‏‏‎‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‏‏‏‎‎‎‏‏‎‎‎‎‎‎‎‏‏‎‎‏‏‏‏‎‏‎‏‏‏‏‎‏‏‏‎‎‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‎‏‎‏‏‎Less urgent notifications below‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‏‎‏‎‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‎‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‎‏‎‎Tap again to open‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‎‎‏‎‏‎‎‎‎‏‏‎‎‎‏‏‎‎‎‎‎‎‏‎‏‎‏‏‏‏‎‎‎‎‏‎‎‎‎‎‏‏‏‎‎Swipe up to unlock‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‎‎‏‏‏‎‎‎‏‏‎‎‏‎‏‏‏‎‎‎‎‏‏‎‎‏‎‏‏‏‏‏‎‎‎‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎Swipe up to open‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‏‎‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‎‎‏‏‎‎‏‏‏‎‏‎‏‎‎‎‎‎‏‏‎‎‏‏‏‎‎‎‏‎‏‏‎‏‎‎‎This device is managed by your organization‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‎‎‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎‎‎‏‏‏‎‎‎‏‎‎‎‏‏‎‏‎‏‎‎‎‏‏‏‏‏‏‎‏‎This device is managed by ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‎‎‎‏‏‏‎‏‏‎‏‏‎‎‎‏‎‏‎‏‎‏‏‏‎‏‏‎‏‎‏‏‏‏‎‎Swipe from icon for phone‎‏‎‎‏‎" diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 96dd605b3b9c..09b997323035 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -197,6 +197,7 @@ "Cambio de proveedor de red" "Abrir detalles de la batería" "Batería %d por ciento" + "Batería: %1$s por ciento; tiempo restante: aproximadamente %2$s en función del uso" "Cargando batería: %d%%" "Configuración del sistema" "Notificaciones" @@ -398,7 +399,7 @@ "+%d" "Notificaciones menos urgentes abajo" "Presionar de nuevo para abrir" - "Desliza el dedo hacia arriba para desbloquear el teléfono" + "Desliza el dedo hacia arriba para abrir" "Tu organización administra este dispositivo" "%s administra este dispositivo" "Desliza el dedo para desbloquear el teléfono." @@ -932,8 +933,6 @@ "Ubicar abajo a la izquierda" "Ubicar abajo a la derecha" "Ignorar" - - - - + "Se actualizó el sistema de navegación. Para hacer cambios, ve a Configuración." + "Ve a Configuración para actualizar la navegación del sistema" diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 2129bd867ed6..4094fe3b17ac 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -197,6 +197,7 @@ "Cambiando la red del operador" "Abrir detalles de la batería" "%d por ciento de batería" + "Queda un %1$s por ciento de batería (%2$s aproximadamente según tu uso)" "Batería cargando (%d %%)." "Ajustes del sistema" "Notificaciones" @@ -398,7 +399,7 @@ "+%d" "Notificaciones menos urgente abajo" "Toca de nuevo para abrir" - "Desliza el dedo hacia arriba para desbloquear" + "Desliza el dedo hacia arriba para abrir" "Este dispositivo está administrado por tu organización" "Este dispositivo está administrado por %s" "Desliza desde el icono para abrir el teléfono" @@ -932,8 +933,6 @@ "Mover abajo a la izquierda." "Mover abajo a la derecha" "Cerrar" - - - - + "Se ha actualizado la navegación del sistema. Para hacer cambios, ve a Ajustes." + "Ve a Ajustes para actualizar la navegación del sistema" diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index c9219e72c911..29bef2bb6813 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -197,6 +197,7 @@ "Operaatori võrku muudetakse" "Aku üksikasjade avamine" "Aku: %d protsenti." + "Aku protsent %1$s, teie kasutuse põhjal on jäänud ligikaudu %2$s" "Akut laetakse (%d%%)." "Süsteemiseaded" "Märguanded" @@ -398,7 +399,7 @@ "+%d" "Vähem kiireloomulised märguanded on allpool" "Avamiseks puudutage uuesti" - "Lukustuse tühistamiseks pühkige üles" + "Pühkige avamiseks üles" "Seda seadet haldab teie organisatsioon" "Seda seadet haldab %s" "Telefoni kasutamiseks pühkige ikoonilt eemale" @@ -932,8 +933,6 @@ "Teisalda alla vasakule" "Teisalda alla paremale" "Loobu" - - - - + "Süsteemis navigeerimine on värskendatud. Muutmiseks avage jaotis Seaded." + "Süsteemi navigeerimise värskendamiseks avage jaotis Seaded" diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 9dea61fd8f84..154f0a942b5f 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -197,6 +197,7 @@ "Operadorearen sarea aldatzen" "Ireki bateriaren xehetasunak" "Bateriaren karga: %d." + "Bateriak ehuneko %1$s dauka kargatuta. Zure erabilera kontuan izanda, %2$s inguru gelditzen zaizkio." "Kargatzen ari da bateria. %% %d arte kargatu da oraingoz." "Sistemaren ezarpenak." "Jakinarazpenak." @@ -398,7 +399,7 @@ "+%d" "Horren premiazkoak ez diren jakinarazpenak daude behean" "Irekitzeko, ukitu berriro" - "Desblokeatzeko, pasatu hatza gora" + "Pasatu hatza gora irekitzeko" "Zure erakundeak kudeatzen du gailua" "%s erakundeak kudeatzen du gailu hau" "Pasatu hatza ikonotik, telefonoa irekitzeko" @@ -932,8 +933,6 @@ "Eraman behealdera, ezkerretara" "Eraman behealdera, eskuinetara" "Baztertu" - - - - + "Eguneratu da sistemaren nabigazioa. Aldaketak egiteko, joan Ezarpenak atalera." + "Sistemaren nabigazioa eguneratzeko, joan Ezarpenak atalera" diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index e405afe44068..6a4413a017f4 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -197,6 +197,7 @@ "تغییر شبکه شرکت مخابراتی" "باز کردن جزئیات باتری" "باتری %d درصد." + "باتری %1$s درصد شارژ دارد، براساس مصرفتان تقریباً %2$s شارژ باقی‌مانده است" "در حال شارژ باتری، %d درصد" "تنظیمات سیستم." "اعلان‌ها." @@ -398,7 +399,7 @@ "+%d" "اعلان‌های کمتر فوری در زیر" "دوباره ضربه بزنید تا باز شود" - "برای باز کردن قفل سریع به بالا بکشید" + "برای باز کردن، انگشتتان را تند به بالا بکشید" "سازمان شما این دستگاه را مدیریت می‌کند" "این دستگاه توسط %s مدیریت می‌شود" "انگشتتان را از نماد تلفن تند بکشید" @@ -932,8 +933,6 @@ "انتقال به پایین سمت راست" "انتقال به پایین سمت چپ" "رد کردن" - - - - + "پیمایش سیستم به‌روزرسانی شد. برای انجام تغییرات به «تنظیمات» بروید." + "برای به‌روزرسانی پیمایش سیستم، به «تنظیمات» بروید" diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 4e52a4ee491d..90fb5b3c6815 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -197,6 +197,7 @@ "Operaattorin verkko muuttuu" "Avaa akun tiedot." "Akun virta %d prosenttia." + "Akkua jäljellä %1$s % eli noin %2$s käyttösi perusteella" "Akku latautuu: %d prosenttia" "Järjestelmän asetukset" "Ilmoitukset" @@ -398,7 +399,7 @@ "+%d" "Vähemmän kiireelliset ilmoitukset ovat alla" "Avaa napauttamalla uudelleen" - "Avaa lukitus pyyhkäisemällä ylös" + "Avaa pyyhkäisemällä ylös" "Organisaatiosi hallinnoi laitetta" "Tätä laitetta hallinnoi %s." "Avaa puhelu pyyhkäisemällä." @@ -932,8 +933,6 @@ "Siirrä vasempaan alareunaan" "Siirrä oikeaan alareunaan" "Ohita" - - - - + "Järjestelmän navigointitapa vaihdettu. Voit muuttaa sitä asetuksista." + "Vaihda järjestelmän navigointitapaa asetuksista" diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 4f6c1b561d1b..04b1af274200 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -197,6 +197,7 @@ "Changer de réseau de fournisseur de services" "Ouvrir les détails de la pile" "Pile : %d pour cent" + "Pile chargée à %1$s % (environ %2$s d\'autonomie en fonction de votre usage)" "La pile est en cours de charge : %d %%." "Paramètres système" "Notifications" @@ -398,7 +399,7 @@ "+%d" "Notifications moins urgentes affichées ci-dessous" "Touchez à nouveau pour ouvrir" - "Glissez vers le haut pour déverrouiller" + "Balayez l\'écran vers le haut pour ouvrir" "Cet appareil est géré par votre organisation" "Cet appareil est géré par %s" "Balayez à partir de l\'icône pour accéder au téléphone" @@ -932,8 +933,6 @@ "Déplacer dans coin inf. gauche" "Déplacer dans coin inf. droit" "Fermer" - - - - + "La navigation système a été mise à jour. Pour apporter des modifications, accédez au menu Paramètres." + "Accédez au menu Paramètres pour mettre à jour la navigation système" diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 95cd5b6e6e53..16f3b623c072 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -197,6 +197,7 @@ "Modification du réseau de l\'opérateur" "Ouvrir les détails de la batterie" "Batterie : %d pour cent" + "%1$s pour cent de batterie : il reste environ %2$s, en fonction de votre utilisation" "Batterie en charge : %d %%." "Paramètres système" "Notifications" @@ -374,7 +375,7 @@ "Jusqu\'à l\'aube" "À partir de %s" "Jusqu\'à %s" - "Thème foncé" + "Mode sombre" "Thème foncé\nÉconomiseur de batterie" "NFC" "La technologie NFC est désactivée" @@ -398,7 +399,7 @@ "+%d" "Notifications moins urgentes ci-dessous" "Appuyer à nouveau pour ouvrir" - "Faire glisser pour déverrouiller" + "Balayer vers le haut pour ouvrir" "Cet appareil est géré par votre entreprise" "Cet appareil est géré par %s" "Balayer pour téléphoner" @@ -932,8 +933,6 @@ "Déplacer en bas à gauche" "Déplacer en bas à droite" "Ignorer" - - - - + "Navigation système mise à jour. Pour apporter des modifications, accédez aux paramètres." + "Accédez aux paramètres pour mettre à jour la navigation système" diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index cce17d6e231d..0f8515b8b2f2 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -197,6 +197,7 @@ "Cambio de rede do operador" "Abrir os detalles da batería" "Carga da batería: %d por cento." + "Batería: %1$s %, durará %2$s co uso que adoitas darlle" "A batería está cargando. Nivel: %d %%." "Configuración do sistema" "Notificacións" @@ -389,7 +390,7 @@ "É posible que se\nsupervise a rede" "Buscar" "Pasa o dedo cara arriba para %s." - "Pasa o dedo cara a esquerda para %s." + "Pasa o dedo cara á esquerda para %s." "Non te molestará ningún son nin vibración, agás os procedentes de alarmas, recordatorios, eventos e os emisores de chamada especificados. Seguirás escoitando todo aquilo que decidas reproducir, mesmo a música, os vídeos e os xogos." "Non te molestará ningún son nin vibración, agás os procedentes de alarmas. Seguirás escoitando todo aquilo que decidas reproducir, mesmo a música, os vídeos e os xogos." "Personalizar" @@ -398,7 +399,7 @@ "+%d" "Notificacións menos urxentes abaixo" "Toca de novo para abrir" - "Pasa o dedo cara arriba para desbloquear" + "Pasa o dedo cara arriba para abrir" "Este dispositivo está xestionado pola túa organización" "Este dispositivo está xestionado por %s" "Pasa o dedo desde a icona para acceder ao teléfono" @@ -932,8 +933,6 @@ "Mover á parte infer. esquerda" "Mover á parte inferior dereita" "Ignorar" - - - - + "Actualizouse a navegación do sistema. Para facer cambios, vai a Configuración." + "Para actualizar a navegación do sistema, vai a Configuración" diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 53107f1910e2..b400039e16a1 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -197,6 +197,7 @@ "કૅરીઅર નેટવર્કમાં ફેરફાર થઈ રહ્યો છે" "બૅટરીની વિગતો ખોલો" "બૅટરી %d ટકા." + "તમારા વપરાશના આધારે બૅટરી %1$s ટકા, જે લગભગ %2$s સુધી ચાલે તેટલી બચી છે" "બૅટરી ચાર્જ થઈ રહી છે, %d%%." "સિસ્ટમ સેટિંગ્સ." "નોટિફિકેશનો." @@ -398,7 +399,7 @@ "+%d" "નીચે ઓછી તાકીદની સૂચનાઓ" "ખોલવા માટે ફરીથી ટૅપ કરો" - "અનલૉક કરવા માટે ઉપર સ્વાઇપ કરો" + "ખોલવા માટે ઉપરની તરફ સ્વાઇપ કરો" "આ ઉપકરણ તમારી સંસ્થા દ્વારા સંચાલિત છે" "આ ઉપકરણ %s દ્વારા સંચાલિત થાય છે" "ફોન માટે આયકનમાંથી સ્વાઇપ કરો" @@ -932,8 +933,6 @@ "નીચે ડાબે ખસેડો" "નીચે જમણે ખસેડો" "છોડી દો" - - - - + "સિસ્ટમ નૅવિગેશન અપડેટ કર્યું. ફેરફારો કરવા માટે, સેટિંગ પર જાઓ." + "સિસ્ટમ નૅવિગેશનને અપડેટ કરવા માટે સેટિંગ પર જાઓ" diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 92f372593710..8bdf0fc6f57c 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -197,6 +197,7 @@ "मोबाइल और इंटरनेट सेवा देने वाली कंपनी का नेटवर्क बदल रहा है" "बैटरी का विवरण खोलें" "%d प्रति‍शत बैटरी." + "%1$s प्रतिशत बैटरी बची है और आपके इस्तेमाल के हिसाब से यह %2$s में खत्म हो जाएगी" "बैटरी चार्ज हो रही है, %d%%." "सिस्टम सेटिंग." "सूचनाएं." @@ -398,7 +399,7 @@ "+%d" "कम अत्यावश्यक सूचनाएं नीचे दी गई हैं" "खोलने के लिए फिर से टैप करें" - "अनलॉक करने के लिए ऊपर स्वाइप करें" + "खोलने के लिए स्वाइप करें" "इस डिवाइस का प्रबंधन आपका संगठन करता है" "इस डिवाइस के प्रबंधक %s हैं" "फ़ोन के लिए आइकॉन से स्वाइप करें" @@ -932,8 +933,6 @@ "बाईं ओर सबसे नीचे ले जाएं" "सबसे नीचे दाईं ओर ले जाएं" "खारिज करें" - - - - + "सिस्टम नेविगेशन अपडेट हो गया. बदलाव करने के लिए \'सेटिंग\' पर जाएं." + "सिस्टम नेविगेशन अपडेट करने के लिए \'सेटिंग\' में जाएं" diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 04200c1a0001..32b629a8abae 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -197,6 +197,7 @@ "Promjena mreže mobilnog operatera" "Otvaranje pojedinosti o bateriji" "Baterija %d posto." + "Baterija je na %1$s posto, još otprilike %2$s na temelju vaše upotrebe" "Baterija se puni, %d posto." "Postavke sustava." "Obavijesti." @@ -400,7 +401,7 @@ "+%d" "Manje hitne obavijesti pri dnu" "Dodirnite opet za otvaranje" - "Prijeđite prstom prema gore za otključavanje" + "Prijeđite prstom prema gore da biste otvorili" "Ovim uređajem upravlja vaša organizacija" "Ovim uređajem upravlja %s" "Prijeđite prstom od ikone za telefon" @@ -937,8 +938,6 @@ "Premjesti u donji lijevi kut" "Premjestite u donji desni kut" "Odbaci" - - - - + "Ažurirana je navigacija sustavom. Možete je promijeniti u Postavkama." + "Navigaciju sustavom možete ažurirati u Postavkama" diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index cd5de1a2c763..08fa9fcda734 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -197,6 +197,7 @@ "Szolgáltatói hálózat váltása" "Az akkumulátorral kapcsolatos részletek megnyitása" "Akkumulátor %d százalék." + "Az akkumulátor %1$s százalékon áll, a használati adatok alapján körülbelül %2$s múlva merül le" "Akkumulátor töltése folyamatban, %d százalék." "Rendszerbeállítások" "Értesítések" @@ -398,7 +399,7 @@ "+%d" "A kevésbé sürgős értesítések lentebb vannak" "Koppintson ismét a megnyitáshoz" - "Húzza felfelé az ujját a feloldáshoz" + "Csúsztasson felfelé a megnyitáshoz" "Az eszközt az Ön szervezete kezeli" "Az eszközt a(z) %s felügyeli." "A telefonhoz csúsztasson az ikonról" @@ -932,8 +933,6 @@ "Áthelyezés le és balra" "Áthelyezés le és jobbra" "Elvetés" - - - - + "A rendszer-navigáció módja megváltozott. Módosításához nyissa meg a Beállításokat." + "A rendszer-navigációs lehetőségeket a Beállításokban módosíthatja" diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index be536476f5c3..dcacc995eaca 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -197,6 +197,7 @@ "Օպերատորի ցանցի փոփոխություն" "Բացել մարտկոցի տվյալները" "Մարտկոցը %d տոկոս է:" + "Մարտկոցի լիցքը %1$s տոկոս է և կբավարարի մոտ %2$s՝ կախված օգտագործման եղանակից:" "Մարտկոցը լիցքավորվում է: Լիցքը %d տոկոս է:" "Համակարգի կարգավորումներ:" "Ծանուցումներ:" @@ -398,7 +399,7 @@ "+%d" "Պակաս հրատապ ծանուցումները ստորև" "Կրկին հպեք՝ բացելու համար" - "Սահեցրեք վերև` ապակողպելու համար" + "Բացելու համար սահեցրեք վերև" "Այս սարքը կառավարում է ձեր կազմակերպությունը" "Այս սարքը կառավարվում է %s-ի կողմից" "Սահահարվածեք հեռախոսի պատկերակից" @@ -932,8 +933,6 @@ "Տեղափոխել ներքև՝ ձախ" "Տեղափոխել ներքև՝ աջ" "Փակել" - - - - + "Համակարգի նավիգացիան թարմացվեց: Փոփոխություններ անելու համար անցեք կարգավորումներ:" + "Թարմացրեք համակարգի նավիգացիան կարգավորումներում" diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 671f5f741459..73e2f5093bc3 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -197,6 +197,7 @@ "Jaringan operator berubah" "Membuka detail baterai" "Baterai %d persen." + "Baterai %1$s persen, sekitar %2$s lagi berdasarkan penggunaan Anda" "Mengisi daya baterai, %d persen." "Setelan sistem." "Notifikasi." @@ -398,7 +399,7 @@ "+%d" "Notifikasi kurang darurat di bawah" "Tap lagi untuk membuka" - "Geser ke atas untuk membuka kunci" + "Geser ke atas untuk membuka" "Perangkat ini dikelola oleh organisasi" "Perangkat ini dikelola oleh %s" "Geser dari ikon untuk telepon" @@ -932,8 +933,6 @@ "Pindahkan ke kiri bawah" "Pindahkan ke kanan bawah" "Tutup" - - - - + "Navigasi sistem diupdate. Untuk melakukan perubahan, buka Setelan." + "Buka Setelan untuk mengupdate navigasi sistem" diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 69cc6932946e..fd3bbcc281ed 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -197,6 +197,7 @@ "Skiptir um farsímakerfi" "Opna upplýsingar um rafhlöðu" "%d prósent á rafhlöðu." + "Rafhlaða í %1$s%, um það bil %2$s eftir miðað við notkun þína" "Rafhlaða í hleðslu, %d%%." "Kerfisstillingar." "Tilkynningar." @@ -398,7 +399,7 @@ "+%d" "Minna áríðandi tilkynningar fyrir neðan" "Ýttu aftur til að opna" - "Strjúktu upp til að opna" + "Strjúktu upp til að opna" "Þessu tæki er stýrt af fyrirtækinu þínu" "Þessu tæki er stýrt af %s" "Strjúktu frá tákninu fyrir síma" @@ -932,8 +933,6 @@ "Færa neðst til vinstri" "Færðu neðst til hægri" "Hunsa" - - - - + "Kerfisstjórnun uppfærð. Þú getur breytt þessu í stillingunum." + "Farðu í stillingar til að uppfæra kerfisstjórnun" diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index dfdf5f6a6e43..6e5eedb31f52 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -197,6 +197,7 @@ "Cambio della rete dell\'operatore" "Visualizza i dettagli relativi alla batteria" "Batteria: %d percento." + "Livello della batteria: %1$s percento. Tempo rimanente in base al tuo utilizzo: %2$s" "Batteria in carica, %d%%." "Impostazioni di sistema." "Notifiche." @@ -398,7 +399,7 @@ "+%d" "Notifiche meno urgenti in basso" "Tocca ancora per aprire" - "Scorri verso l\'alto per sbloccare" + "Scorri verso l\'alto per aprire" "Questo dispositivo è gestito dalla tua organizzazione" "Questo dispositivo è gestito da %s" "Scorri per accedere al telefono" @@ -932,8 +933,6 @@ "Sposta in basso a sinistra" "Sposta in basso a destra" "Ignora" - - - - + "Navigazione del sistema aggiornata. Per apportare modifiche, usa le Impostazioni." + "Usa le Impostazioni per aggiornare la navigazione del sistema" diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 571b37d4af17..926e90c7dccd 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -197,6 +197,7 @@ "רשת ספק משתנה" "פתיחת פרטי סוללה" "%d אחוזים של סוללה." + "רמת הטעינה בסוללה: %1$s אחוזים, הזמן הנותר המשוער על סמך השימוש שלך:%2$s" "טעינת סוללה, %d%%." "הגדרות מערכת" "התראות" @@ -402,7 +403,7 @@ "+%d" "התראות בדחיפות נמוכה יותר בהמשך" "הקש שוב כדי לפתוח" - "החלק מעלה כדי לבטל את הנעילה" + "צריך להחליק כדי לפתוח" "מכשיר זה מנוהל על ידי הארגון שלך" "המכשיר הזה מנוהל על ידי %s" "החלק מהסמל כדי להפעיל את הטלפון" @@ -942,8 +943,6 @@ "העברה לפינה השמאלית התחתונה" "העברה לפינה הימנית התחתונה" "סגירה" - - - - + "הניווט במערכת עודכן. אפשר לערוך שינויים דרך ההגדרות." + "יש לעבור להגדרות כדי לעדכן את הניווט במערכת" diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index b14d37c0845e..6b0039151317 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -197,6 +197,7 @@ "携帯通信会社のネットワークを変更します" "電池の詳細情報を開きます" "電池残量: %dパーセント" + "電池残量: %1$s、およそ %2$s に電池切れ(使用状況に基づく)" "電池充電中: %d%%" "システム設定。" "通知。" @@ -398,7 +399,7 @@ "+%d" "緊急度の低い通知を下に表示" "開くにはもう一度タップしてください" - "ロック解除するには上にスワイプしてください" + "開くには上にスワイプします" "このデバイスは組織によって管理されています" "このデバイスは %s が管理しています" "右にスワイプして通話" @@ -932,8 +933,6 @@ "左下に移動" "右下に移動" "閉じる" - - - - + "システム ナビゲーションを更新しました。変更するには [設定] に移動してください。" + "システム ナビゲーションを更新するには [設定] に移動してください" diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index a3375cb2bc10..c1aaa8da5777 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -197,6 +197,7 @@ "ოპერატორის ქსელის შეცვლა" "ბატარეის დეტალების გახსნა" "ბატარეა: %d პროცენტი." + "ბატარეა %1$s პროცენტზეა, მოხმარების გათვალისწინებით დარჩა დაახლოებით %2$s" "ბატარეა იტენება, %d %%." "სისტემის პარამეტრები." "შეტყობინებები" @@ -398,7 +399,7 @@ "+%d" "ქვემოთ მითითებულია ნაკლებად სასწრაფო შეტყობინებები" "შეეხეთ ისევ გასახსნელად" - "გაასრიალეთ ზევით განსაბლოკად" + "გასახსნელად გადაფურცლეთ ზემოთ" "ამ მოწყობილობას მართავს თქვენი ორგანიზაცია" "ამ მოწყობილობას მართავს %s" "ტელეფონისთვის გადაფურცლეთ ხატულადან" @@ -932,8 +933,6 @@ "ქვევით და მარცხნივ გადატანა" "გადაანაცვ. ქვემოთ და მარჯვნივ" "დახურვა" - - - - + "სისტემური ნავიგაცია განახლდა. ცვლილებების შესატანად გადადით პარამეტრებზე." + "სისტემური ნავიგაციის გასაახლებლად გადადით პარამეტრებზე" diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 5026b537d9cc..98bff38b0ec2 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -197,6 +197,7 @@ "Оператор желісін өзгерту" "Батарея мәліметтерін ашу" "Батарея %d пайыз." + "Батарея заряды: %1$s пайыз. Пайдалануға байланысты шамамен %2$s уақытқа жетеді." "Батарея зарядталуда, %d %%." "Жүйе параметрлері." "Хабарлар." @@ -398,7 +399,7 @@ "+%d" "Шұғылдығы азырақ хабарландырулар төменде" "Ашу үшін қайта түртіңіз" - "Құлыпты ашу үшін жоғары сырғытыңыз" + "Ашу үшін жоғары қарай сырғытыңыз." "Бұл құрылғыны ұйым басқарады" "Бұл құрылғыны %s басқарады" "Телефонды ашу үшін белгішеден әрі қарай сырғытыңыз" @@ -932,8 +933,6 @@ "Төменгі сол жаққа жылжыту" "Төменгі оң жаққа жылжыту" "Жабу" - - - - + "Жүйе навигациясы жаңартылды. Өзгерту енгізу үшін \"Параметрлер\" бөліміне өтіңіз." + "Жүйе навигациясын жаңарту үшін \"Параметрлер\" бөліміне өтіңіз." diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 935986823c72..a476947a6565 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -197,6 +197,7 @@ "បណ្តាញ​ក្រុមហ៊ុនសេវាទូរសព្ទ​កំពុងផ្លាស់ប្តូរ" "បើកព័ត៌មានលម្អិតអំពីថ្ម" "ថ្ម %d ភាគរយ។" + "ថ្ម %1$s ភាគរយ អាចប្រើបាន​ប្រហែល %2$s ទៀត ផ្អែក​លើការ​ប្រើប្រាស់​របស់អ្នក" "កំពុងសាកថ្ម %d ភាគរយ" "ការ​កំណត់​ប្រព័ន្ធ​។" "ការ​ជូន​ដំណឹង។" @@ -398,7 +399,7 @@ "+%d" "ការ​ជូន​ដំណឹង​​មិន​សូវ​បន្ទាន់​ខាង​ក្រោម" "ប៉ះ​ម្ដង​ទៀត ដើម្បី​បើក" - "អូស​ឡើង​លើ ដើម្បី​ដោះ​សោ" + "អូសឡើងលើ​ដើម្បីបើក" "ឧបករណ៍​នេះ​ស្ថិត​ក្រោម​ការ​គ្រប់គ្រង​​របស់ស្ថាប័ន​​អ្នក" "ឧបករណ៍នេះស្ថិតក្រោមការគ្រប់គ្រងរបស់ %s" "អូសចេញពីរូបតំណាងដើម្បីប្រើទូរស័ព្ទ" @@ -932,8 +933,6 @@ "ផ្លាស់ទីទៅផ្នែកខាងក្រោមខាងឆ្វេង​" "ផ្លាស់ទីទៅផ្នែកខាងក្រោម​ខាងស្ដាំ" "ច្រានចោល" - - - - + "បានធ្វើ​បច្ចុប្បន្នភាព​ការរុករកក្នុង​ប្រព័ន្ធ។ ដើម្បីធ្វើការផ្លាស់ប្ដូរ សូមចូលទៅ​កាន់ការកំណត់។" + "ចូល​ទៅកាន់​ការកំណត់ ដើម្បី​ធ្វើបច្ចុប្បន្នភាព​ការរុករក​ក្នុង​ប្រព័ន្ធ" diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index c28b5e20675e..a5356a4c68ae 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -197,6 +197,7 @@ "ವಾಹಕ ನೆಟ್‌ವರ್ಕ್ ಬದಲಾಯಿಸುವಿಕೆ" "ಬ್ಯಾಟರಿ ವಿವರಗಳನ್ನು ತೆರೆಯಿರಿ" "ಬ್ಯಾಟರಿ %d ಪ್ರತಿಶತ." + "ನಿಮ್ಮ ಬಳಕೆಯ ಆಧಾರದ ಮೇಲೆ ಬ್ಯಾಟರಿಯು ಪ್ರತಿಶತ %1$s ರಷ್ಟು ಮತ್ತು %2$s ಸಮಯ ಬಾಕಿ ಉಳಿದಿದೆ" "ಬ್ಯಾಟರಿ %d ಪ್ರತಿಶತ ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ." "ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್‌ಗಳು." "ಅಧಿಸೂಚನೆಗಳು." @@ -398,7 +399,7 @@ "+%d" "ಕೆಳಗೆ ಕಡಿಮೆ ಅವಸರದ ಅಧಿಸೂಚನೆಗಳು" "ತೆರೆಯಲು ಮತ್ತೆ ಟ್ಯಾಪ್‌ ಮಾಡಿ" - "ಅನ್‌ಲಾಕ್‌ ಮಾಡಲು ಸ್ವೈಪ್‌ ಮಾಡಿ" + "ತೆರೆಯಲು ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ" "ಈ ಸಾಧನವನ್ನು ನಿಮ್ಮ ಸಂಸ್ಥೆ ನಿರ್ವಹಿಸುತ್ತಿದೆ" "ಈ ಸಾಧನವನ್ನು %s ರಿಂದ ನಿರ್ವಹಿಸಲಾಗಿದೆ" "ಫೋನ್‌ಗಾಗಿ ಐಕಾನ್‌ನಿಂದ ಸ್ವೈಪ್ ಮಾಡಿ" @@ -932,8 +933,6 @@ "ಸ್ಕ್ರೀನ್‌ನ ಎಡ ಕೆಳಭಾಗಕ್ಕೆ ಸರಿಸಿ" "ಕೆಳಗಿನ ಬಲಭಾಗಕ್ಕೆ ಸರಿಸಿ" "ವಜಾಗೊಳಿಸಿ" - - - - + "ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಷನ ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗಿದೆ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಲು, ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಹೋಗಿ." + "ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಷನ್ ಅಪ್‌ಡೇಟ್ ಮಾಡಲು ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಹೋಗಿ" diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index af6f6eb31ee4..c138ad4e942e 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -197,6 +197,7 @@ "이동통신사 네트워크 변경" "배터리 세부정보 열기" "배터리 %d퍼센트" + "배터리 %1$s퍼센트, 평소 사용량 기준 약 %2$s 남음" "배터리 충전 중, %d%%입니다." "시스템 설정" "알림" @@ -398,7 +399,7 @@ "+%d" "아래에 덜 급한 알림 표시" "다시 탭하여 열기" - "위로 스와이프하여 잠금 해제" + "위로 스와이프하여 열기" "조직에서 관리하는 기기입니다." "%s에서 관리하는 기기입니다." "전화 기능을 사용하려면 아이콘에서 스와이프하세요." @@ -932,8 +933,6 @@ "왼쪽 하단으로 이동" "오른쪽 하단으로 이동" "닫기" - - - - + "시스템 탐색이 업데이트되었습니다. 변경하려면 설정으로 이동하세요." + "설정으로 이동하여 시스템 탐색을 업데이트하세요." diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 7f5a011e9a78..edade6badfad 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -197,6 +197,7 @@ "Байланыш оператору өзгөртүлүүдө" "Батареянын чоо-жайын ачуу" "Батарея %d пайыз." + "Батареянын деңгээли %1$s пайыз, колдонгонуңузга караганда болжол менен %2$s калды" "Батарея кубатталууда, %d%%." "Система тууралоолору." "Билдирмелер" @@ -398,7 +399,7 @@ "+%d" "Анчейин шашылыш эмес эскертмелер төмөндө" "Ачуу үчүн кайра таптап коюңуз" - "Кулпуну ачуу үчүн серпип коюңуз" + "Ачуу үчүн өйдө сүрүңүз" "Бул түзмөк уюмуңуз тарабынан башкарылат" "Бул түзмөк %s тарабынан башкарылат" "Сүрөтчөнү серпип телефонго өтүңүз" @@ -932,8 +933,6 @@ "Төмөнкү сол жакка жылдыруу" "Төмөнкү оң жакка жылдырыңыз" "Жабуу" - - - - + "Тутум чабыттоосу жаңыртылды. Өзгөртүү үчүн, Жөндөөлөргө өтүңүз." + "Тутум чабыттоосун жаңыртуу үчүн Жөндөөлөргө өтүңүз" diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 4a1589d809be..3748971bd351 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -197,6 +197,7 @@ "ການປ່ຽນເຄືອຂ່າຍຜູ້ໃຫ້ບໍລິການ" "ເປີດລາຍລະອຽດແບັດເຕີຣີ" "ແບັດເຕີຣີ %d ເປີເຊັນ." + "ແບັດເຕີຣີ %1$s ເປີເຊັນ, ເຫຼືອປະມານ %2$s ອ້າງອີງຈາກການນຳໃຊ້ຂອງທ່ານ" "ກຳລັງສາກແບັດເຕີຣີ, %d ເປີເຊັນ." "ການຕັ້ງຄ່າລະບົບ." "ການແຈ້ງເຕືອນ." @@ -398,7 +399,7 @@ "+%d" "ການ​ແຈ້ງເຕືອນ​ທີ່​ສຳຄັນ​ໜ້ອຍ​ກວ່າ​ຢູ່​ດ້ານ​ລຸ່ມ" "ແຕະ​ອີກ​ຄັ້ງ​ເພື່ອ​ເປີດ" - "ເລື່ອນ​ຂຶ້ນ​ເພື່ອ​ປົດ​ລັອກ" + "ປັດຂຶ້ນເພື່ອເປີດ" "ອຸປະກອນນີ້ແມ່ນຈັດການໂດຍອົງກອນຂອງທ່ານ" "ອຸປະກອນນີ້ຖືກຈັດການໂດຍ %s" "ປັດ​ຈາກ​ໄອ​ຄອນ​ສຳ​ລັບ​ໂທ​ລະ​ສັບ" @@ -932,8 +933,6 @@ "ຍ້າຍຊ້າຍລຸ່ມ" "ຍ້າຍຂວາລຸ່ມ" "ປິດໄວ້" - - - - + "ອັບເດດການນຳທາງລະບົບແລ້ວ. ເພື່ອປ່ຽນແປງ, ກະລຸນາໄປທີ່ການຕັ້ງຄ່າ." + "ໄປທີ່ການຕັ້ງຄ່າເພື່ອອັບເດດການນຳທາງລະບົບ" diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index ab6a04423833..6e096f418400 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -197,6 +197,7 @@ "Keičiamas operatoriaus tinklas" "Atidaryti išsamią akumuliatoriaus informaciją" "Akumuliatorius: %d proc." + "%1$s proc. akumuliatoriaus energijos – liko maždaug %2$s, atsižvelgiant į naudojimą" "Įkraunamas akumuliatorius, %d%%." "Sistemos nustatymai" "Pranešimai." @@ -402,7 +403,7 @@ "+%d" "Mažiau skubūs pranešimai toliau" "Palieskite dar kartą, kad atidarytumėte" - "Perbraukite aukštyn, kad atrakintumėte" + "Perbraukite aukštyn, kad atidarytumėte" "Šį įrenginį tvarko jūsų organizacija" "Šį įrenginį tvarko %s" "Perbraukite iš telefono piktogramos" @@ -942,8 +943,6 @@ "Perkelti į apačią kairėje" "Perkelti į apačią dešinėje" "Atmesti" - - - - + "Sistemos naršymo funkcijos atnaujintos. Jei norite pakeisti, eikite į skiltį „Nustatymai“." + "Eikite į skiltį „Nustatymai“, kad atnaujintumėte sistemos naršymo funkcijas" diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 889629e9034b..07bab11d5354 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -197,6 +197,7 @@ "Mobilo sakaru operatora tīkla mainīšana" "Atvērt akumulatora informāciju" "Akumulators: %d procenti" + "Akumulatora uzlādes līmenis: %1$s procenti. Ņemot vērā lietojumu, atlikušais laiks ir apmēram %2$s" "Notiek akumulatora uzlāde, %d%%." "Sistēmas iestatījumi" "Paziņojumi" @@ -400,7 +401,7 @@ "+%d" "Mazāk steidzami paziņojumi tiek rādīti tālāk" "Pieskarieties vēlreiz, lai atvērtu" - "Velciet uz augšu, lai atbloķētu" + "Velciet augšup, lai atvērtu" "Šo ierīci pārvalda jūsu organizācija" "Šo ierīci pārvalda %s" "Lai lietotu tālruni, velciet no ikonas" @@ -937,8 +938,6 @@ "Pārvietot apakšpusē pa kreisi" "Pārvietot apakšpusē pa labi" "Nerādīt" - - - - + "Sistēmas navigācija ir atjaunināta. Lai veiktu izmaiņas, atveriet iestatījumus." + "Atveriet iestatījumus, lai atjauninātu sistēmas navigāciju" diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index d6f2ae471469..d227623d3e82 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -197,6 +197,7 @@ "Променување на мрежата на операторот" "Отвори ги деталите за батеријата" "Батерија %d проценти." + "Батерија %1$s отсто, уште околу %2$s според вашето користење" "Полнење на батеријата, %d %%." "Поставки на систем." "Известувања" @@ -398,7 +399,7 @@ "+%d" "Долу се помалку итни известувања" "Допрете повторно за да се отвори" - "Повлечете за да се отклучи" + "Повлечете за да отворите" "Вашата организација управува со уредов" "Уредов го управува %s" "Повлечете од иконата за телефонот" @@ -932,8 +933,6 @@ "Премести долу лево" "Премести долу десно" "Отфрли" - - - - + "Навигацијата на системот е ажурирана. За да извршите промени, одете во „Поставки“." + "Одете во „Поставки“ за да ја ажурирате навигацијата на системот" diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 5f4e499cbc9c..44b5370da606 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -197,6 +197,7 @@ "കാരിയർ നെറ്റ്‌വർക്ക് മാറ്റൽ" "ബാറ്ററി വിശദാംശങ്ങൾ തുറക്കുക" "ബാറ്ററി %d ശതമാനം." + "ബാറ്ററി %1$s ശതമാനം, നിങ്ങളുടെ ഉപയോഗത്തിൻ്റെ അടിസ്ഥാനത്തിൽ ഏകദേശം %2$s സമയം കൂടി ശേഷിക്കുന്നു" "ബാറ്ററി ചാർജുചെയ്യുന്നു, %d%%." "സിസ്‌റ്റം ക്രമീകരണങ്ങൾ." "അറിയിപ്പുകൾ." @@ -398,7 +399,8 @@ "+%d" "ആവശ്യം കുറഞ്ഞ അറിയിപ്പുകൾ ചുവടെ നൽകിയിരിക്കുന്നു" "തുറക്കുന്നതിന് വീണ്ടും ടാപ്പുചെയ്യുക" - "അൺലോക്കുചെയ്യുന്നതിന് മുകളിലേക്ക് സ്വൈപ്പുചെയ്യുക" + + "ഈ ഉപകരണം മാനേജുചെയ്യുന്നത് നിങ്ങളുടെ സ്ഥാപനമാണ്" "%s മാനേജുചെയ്യുന്ന ഉപകരണമാണിത്" "ഫോൺ ഐക്കണിൽ നിന്ന് സ്വൈപ്പുചെയ്യുക" @@ -932,8 +934,6 @@ "ചുവടെ ഇടതുഭാഗത്തേക്ക് നീക്കുക" "ചുവടെ വലതുഭാഗത്തേക്ക് നീക്കുക" "ഡിസ്‌മിസ് ചെയ്യുക" - - - - + "സിസ്‌റ്റം നാവിഗേഷൻ അപ്‌ഡേറ്റ് ചെയ്‌തു. മാറ്റങ്ങൾ വരുത്താൻ ക്രമീകരണത്തിലേക്ക് പോവുക." + "സിസ്‌റ്റം നാവിഗേഷൻ അപ്‌ഡേറ്റ് ചെയ്യാൻ ക്രമീകരണത്തിലേക്ക് പോവുക" diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 4ed8fcc3392e..d5f786434d55 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -197,6 +197,7 @@ "Оператор компанийн сүлжээг өөрчилж байна" "Тэжээлийн дэлгэрэнгүй мэдээллийг нээх" "Батерей %d хувьтай." + "Батарей %1$s хувьтай байна. Таны хэрэглээнд тулгуурлан ойролцоогоор %2$s үлдсэн" "Батарейг цэнэглэж байна, %d%%." "Системийн тохиргоо." "Мэдэгдэл." @@ -398,7 +399,7 @@ "+%d" "Яаралтай биш мэдэгдлүүдийг доор" "Нээхийн тулд дахин товшино уу" - "Түгжээг тайлах бол шудрана уу" + "Нээхийн тулд дээш шударна уу" "Энэ төхөөрөмжийг таны байгууллага удирдаж байна" "Энэ төхөөрөмжийг %s удирддаг" "Утсыг гаргахын тулд дүрс тэмдгээс шудрах" @@ -932,8 +933,6 @@ "Зүүн доош зөөх" "Баруун доош зөөх" "Үл хэрэгсэх" - - - - + "Системийн навигацыг шинэчиллээ. Өөрчлөхийн тулд Тохиргоо руу очно уу." + "Системийн навигацыг шинэчлэхийн тулд Тохиргоо руу очно уу" diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 65034a3003cd..540d4149b59f 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -197,6 +197,7 @@ "वाहक नेटवर्क बदलत आहे" "बॅटरी तपशील उघडा" "बॅटरी %d टक्के." + "बॅटरी %1$s टक्के, तुमच्या वापराच्या आधारावर सुमारे %2$s शिल्लक आहे" "बॅटरी चार्ज होत आहे, %d टक्के." "सिस्‍टम सेटिंग्‍ज." "सूचना." @@ -398,7 +399,8 @@ "+%d" "खाली कमी तातडीच्या सूचना" "उघडण्यासाठी पुन्हा टॅप करा" - "अनलॉक करण्यासाठी स्वाइप करा" + + "हे डिव्हाइस तुमची संस्था व्यवस्थापित करते" "हे डिव्हाइस %s ने व्यवस्थापित केले आहे" "फोनसाठी चिन्हावरून स्वाइप करा" @@ -932,8 +934,6 @@ "तळाशी डावीकडे हलवा" "तळाशी उजवीकडे हलवा" "डिसमिस करा" - - - - + "सिस्टम नेव्हिगेशन अपडेट केले. बदल करण्यासाठी, सेटिंग्जवर जा." + "सिस्टम नेव्हिगेशन अपडेट करण्यासाठी सेटिंग्जवर जा" diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 9669077d2afc..9ba4464bc8ba 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -197,6 +197,7 @@ "Rangkaian pembawa berubah" "Buka butiran bateri" "Bateri %d peratus." + "Bateri %1$s peratus, tinggal kira-kira %2$s lagi berdasarkan penggunaan anda" "Bateri mengecas, %d peratus." "Tetapan sistem." "Pemberitahuan." @@ -398,7 +399,7 @@ "+%d" "Pemberitahuan kurang penting di bawah" "Ketik lagi untuk membuka" - "Leret ke atas untuk membuka kunci" + "Leret ke atas untuk buka" "Peranti ini diurus oleh organisasi anda" "Peranti ini diurus oleh %s" "Leret dari ikon untuk telefon" @@ -932,8 +933,6 @@ "Alihkan ke bawah sebelah kiri" "Alihkan ke bawah sebelah kanan" "Ketepikan" - - - - + "Navigasi sistem dikemas kini. Untuk membuat perubahan, pergi ke Tetapan." + "Pergi ke Tetapan untuk mengemas kini navigasi sistem" diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 3734536b39c4..4928f2e6714f 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -197,6 +197,7 @@ "ဝန်ဆောင်မှုပေးသူ ကွန်ရက် ပြောင်းလဲနေသည်။" "ဘက်ထရီ အသေးစိတ် အချက်အလက်များကို ဖွင့်ပါ" "ဘတ္တရီ %d ရာခိုင်နှုန်း။" + "ဘက်ထရီ %1$s ရာခိုင်နှုန်း၊ သင်၏ အသုံးပြုမှုအပေါ် မူတည်၍ %2$s ခန့်ကျန်သည်" "ဘက်ထရီအားသွင်းနေသည်၊ %d %%။" "စနစ်အပြင်အဆင်များ" "အကြောင်းကြားချက်များ။" @@ -398,7 +399,7 @@ "+%d" "အရေးပါမှု နည်းသည့် အကြောင်းကြားချက်များ အောက်မှာ" "ဖွင့်ရန် ထပ်ပြီး ပုတ်ပါ" - "သော့ဖွင့်ရန် အပေါ်သို့ ပွတ်ဆွဲပါ" + "ဖွင့်ရန် အပေါ်သို့ပွတ်ဆွဲပါ" "ဤစက်ပစ္စည်းကို သင်၏အဖွဲ့အစည်းက စီမံခန့်ခွဲထားပါသည်" "ဤစက်ပစ္စည်းကို %s က စီမံခန့်ခွဲထားပါသည်" "ဖုန်းအတွက် သင်္ကေတပုံအား ပွတ်ဆွဲပါ" @@ -932,8 +933,6 @@ "ဘယ်အောက်ခြေသို့ ရွှေ့ရန်" "ညာအောက်ခြေသို့ ရွှေ့ပါ" "ပယ်ရန်" - - - - + "စနစ်လမ်းညွှန်ခြင်း အပ်ဒိတ်လုပ်ပြီးပါပြီ။ အပြောင်းအလဲများ ပြုလုပ်ရန် \'ဆက်တင်များ\' သို့သွားပါ။" + "စနစ်လမ်းညွှန်ခြင်း အပ်ဒိတ်လုပ်ရန် \'ဆက်တင်များ\' သို့သွားပါ" diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index c10bc376ed1e..a9945f9e3ada 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -197,6 +197,7 @@ "Bytting av operatørnettverk" "Åpne informasjon om batteriet" "Batteri – %d prosent." + "Batterinivået er %1$s prosent – omtrent %2$s gjenstår basert på bruken din" "Batteriet lades – %d prosent." "Systeminnstillinger." "Varsler." @@ -398,7 +399,7 @@ "+%d" "Mindre presserende varsler nedenfor" "Trykk på nytt for å åpne" - "Sveip oppover for å låse opp" + "Sveip opp for å åpne" "Denne enheten administreres av organisasjonen din" "Denne enheten administreres av %s" "Sveip ikonet for å åpne telefon" @@ -932,8 +933,6 @@ "Flytt til nederst til venstre" "Flytt til nederst til høyre" "Avvis" - - - - + "Systemnavigeringen er oppdatert. For å gjøre endringer, gå til Innstillinger." + "Gå til Innstillinger for å oppdatere systemnavigeringen" diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 239e207d2976..97ef4b660117 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -197,6 +197,7 @@ "सेवा प्रदायकको नेटवर्क परिवर्तन गर्ने आइकन" "ब्याट्री सम्बन्धी विवरणहरूलाई खोल्नुहोस्" "ब्याट्री %d प्रतिशत" + "ब्याट्रीको चार्ज %1$s प्रतिशत छ, तपाईंको प्रयोगका आधारमा %2$s बाँकी छ" "ब्याट्री चार्ज हुँदैछ, %d प्रतिशत।" "प्रणाली सेटिङहरू" "सूचनाहरू।" @@ -398,7 +399,7 @@ "+%d" "तल कम जरुरी सूचनाहरू" "खोल्न पुनः ट्याप गर्नुहोस्" - "अनलक गर्न स्वाप गर्नुहोस्" + "खोल्न माथितिर स्वाइप गर्नुहोस्" "तपाईंको संगठनले यस यन्त्रलाई व्यवस्थापन गर्दछ" "यो यन्त्र %s द्वारा व्यवस्थापन गरिएको छ" "फोनको लागि आइकनबाट स्वाइप गर्नुहोस्" @@ -932,8 +933,6 @@ "पुछारमा बायाँतिर सार्नुहोस्" "पुछारमा दायाँतिर सार्नुहोस्" "हटाउनुहोस्" - - - - + "प्रणालीको नेभिगेसन अद्यावधिक गरियो। परिवर्तन गर्न सेटिङमा जानुहोस्।" + "प्रणालीको नेभिगेसन अद्यावधिक गर्न सेटिङमा जानुहोस्" diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 59cbdaa6066f..c7c377943e8f 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -197,6 +197,7 @@ "Netwerk van provider wordt gewijzigd" "Accudetails openen" "Batterij: %d procent." + "Batterij op %1$s procent, nog ongeveer %2$s op basis van je gebruik" "Batterij wordt opgeladen, %d%% procent." "Systeeminstellingen." "Meldingen." @@ -398,7 +399,7 @@ "+%d" "Minder urgente meldingen onderaan" "Tik nog eens om te openen" - "Veeg omhoog om te ontgrendelen" + "Veeg omhoog om te openen" "Dit apparaat wordt beheerd door je organisatie" "Dit apparaat wordt beheerd door %s" "Vegen voor telefoon" @@ -932,8 +933,6 @@ "Naar linksonder verplaatsen" "Naar rechtsonder verplaatsen" "Sluiten" - - - - + "Systeemnavigatie geüpdatet. Als je wijzigingen wilt aanbrengen, ga je naar Instellingen." + "Ga naar Instellingen om de systeemnavigatie te updaten" diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 2aa9c9689827..eed092d8a4d9 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -197,6 +197,7 @@ "କେରିଅର୍‍ ନେଟ୍‌ୱର୍କ ବଦଳୁଛି" "ବ୍ୟାଟେରୀ ବିବରଣୀ ଖୋଲନ୍ତୁ" "ବ୍ୟାଟେରୀ %d ଶତକଡ଼ା ଅଛି।" + "ବ୍ୟାଟେରୀ %1$s ଶତକଡା, ଆପଣଙ୍କର ବ୍ୟବହାରକୁ ଆଧାର କରି ପାଖାପାଖି %2$s ବାକି ଅଛି" "ବ୍ୟାଟେରୀ ଚାର୍ଜ ହେଉଛି, %d ଶତକଡ଼ା।" "ସିଷ୍ଟମ୍‍ ସେଟିଙ୍ଗ।" "ବିଜ୍ଞପ୍ତି" @@ -398,7 +399,8 @@ "+%d" "ନିମ୍ନରେ କମ୍‍ ଜରୁରୀ ବିଜ୍ଞପ୍ତି" "ଖୋଲିବା ପାଇଁ ପୁଣି ଟାପ୍‍ କରନ୍ତୁ" - "ଅନଲକ୍‌ କରିବା ପାଇଁ ଉପରକୁ ସ୍ୱାଇପ୍‌ କରନ୍ତୁ" + + "ଏହି ଡିଭାଇସ୍‌ ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ୱାରା ପରିଚାଳିତ।" "ଏହି ଡିଭାଇସ୍‌ %s ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି" "ଫୋନ୍‍ ପାଇଁ ଆଇକନରୁ ସ୍ୱାଇପ୍‍ କରନ୍ତୁ" @@ -932,8 +934,6 @@ "ତଳ ବାମକୁ ନିଅନ୍ତୁ" "ତଳ ଡାହାଣକୁ ନିଅନ୍ତୁ" "ଖାରଜ କରନ୍ତୁ" - - - - + "ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍‌ଡେଟ୍ ହୋଇଛି। ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ, ସେଟିଂସ୍‌କୁ ଯାଆନ୍ତୁ।" + "ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍‌ଡେଟ୍ କରିବା ପାଇଁ ସେଟିଂସ୍‍କୁ ଯାଆନ୍ତୁ" diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 86c04d4449b0..30f830e1ae3b 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -197,6 +197,7 @@ "ਕੈਰੀਅਰ ਨੈੱਟਵਰਕ ਦੀ ਬਦਲੀ" "ਬੈਟਰੀ ਵੇਰਵੇ ਖੋਲ੍ਹੋ" "ਬੈਟਰੀ %d ਪ੍ਰਤੀਸ਼ਤ ਹੈ।" + "ਬੈਟਰੀ %1$s ਫ਼ੀਸਦ, ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ %2$s ਬਾਕੀ" "ਬੈਟਰੀ ਚਾਰਜ ਹੋ ਰਹੀ ਹੈ, %d ਪ੍ਰਤੀਸ਼ਤ।" "ਸਿਸਟਮ ਸੈਟਿੰਗਾਂ।" "ਸੂਚਨਾਵਾਂ।" @@ -398,7 +399,7 @@ "+%d" "ਹੇਠਾਂ ਘੱਟ ਲਾਜ਼ਮੀ ਸੂਚਨਾਵਾਂ" "ਖੋਲ੍ਹਣ ਲਈ ਦੁਬਾਰਾ ਟੈਪ ਕਰੋ" - "ਅਣਲਾਕ ਕਰਨ ਲਈ ਉੱਪਰ ਸਵਾਈਪ ਕਰੋ।" + "ਖੋਲ੍ਹਣ ਲਈ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ" "ਇਸ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੇ ਸੰਗਠਨ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ" "ਇਹ ਡੀਵਾਈਸ %s ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਕੀਤਾ ਗਿਆ ਹੈ" "ਫ਼ੋਨ ਲਈ ਪ੍ਰਤੀਕ ਤੋਂ ਸਵਾਈਪ ਕਰੋ" @@ -932,8 +933,6 @@ "ਹੇਠਾਂ ਵੱਲ ਖੱਬੇ ਲਿਜਾਓ" "ਹੇਠਾਂ ਵੱਲ ਸੱਜੇ ਲਿਜਾਓ" "ਖਾਰਜ ਕਰੋ" - - - - + "ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਅੱਪਡੇਟ ਹੋ ਗਿਆ। ਤਬਦੀਲੀਆਂ ਕਰਨ ਲਈ, ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ।" + "ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ" diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index ec055005aa04..ab2ea04f87f6 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -199,6 +199,7 @@ "Zmiana sieci operatora" "Zobacz szczegóły baterii" "Bateria: %d procent." + "Bateria %1$s procent, jeszcze %2$s (na podstawie Twojego sposobu korzystania)" "Ładuję baterię, %d procent." "Ustawienia systemu." "Powiadomienia." @@ -404,7 +405,7 @@ "+%d" "Poniżej widać mniej pilne powiadomienia" "Kliknij ponownie, by otworzyć" - "Przesuń w górę, by odblokować" + "Przesuń w górę, by otworzyć" "Tym urządzeniem zarządza Twoja organizacja" "Tym urządzeniem zarządza %s" "Aby włączyć telefon, przesuń palcem od ikony" @@ -944,8 +945,6 @@ "Przenieś w lewy dolny róg" "Przenieś w prawy dolny róg" "Zamknij" - - - - + "Nawigacja w systemie została zaktualizowana. Aby wprowadzić zmiany, otwórz Ustawienia." + "Otwórz Ustawienia, by zaktualizować nawigację w systemie" diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index a7d85ab8b524..ae1fb3f257bd 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -197,6 +197,7 @@ "Alteração de rede da operadora" "Abrir detalhes da bateria" "Bateria em %d por cento." + "Bateria com %1$s de carga, tempo restante aproximado, com base no seu uso: %2$s" "Bateria carregando: %d%%." "Configurações do sistema" "Notificações." @@ -398,7 +399,7 @@ "+%d" "Notificações menos urgentes abaixo" "Toque novamente para abrir" - "Deslize para cima para desbloquear" + "Deslize para cima para abrir" "Este dispositivo é gerenciado pela sua organização" "Este dispositivo é gerenciado por %s" "Deslize a partir do ícone do telefone" @@ -932,8 +933,6 @@ "Mover para canto inferior esquerdo" "Mover para canto inferior direito" "Dispensar" - - - - + "Navegação no sistema atualizada. Se quiser alterá-la, acesse as configurações." + "Acesse as configurações para atualizar a navegação no sistema" diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 4260dc203991..0d1179ad7f1b 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -197,6 +197,7 @@ "Rede do operador em mudança." "Abrir detalhes da bateria" "Bateria a %d por cento." + "Bateria a %1$s por cento, resta(m) cerca de %2$s com base na sua utilização." "A bateria está a carregar, %d por cento." "Definições do sistema" "Notificações." @@ -398,7 +399,7 @@ "+%d" "Notificações menos urgentes abaixo" "Toque novamente para abrir" - "Deslizar rapidamente com o dedo para cima para desbloquear" + "Deslize rapidamente para cima para abrir" "Este dispositivo é gerido pela sua entidade" "Este dispositivo é gerido por %s" "Deslize rapid. a partir do ícone para aceder ao telemóvel" @@ -932,8 +933,6 @@ "Mover p/ parte infer. esquerda" "Mover parte inferior direita" "Ignorar" - - - - + "A navegação no sistema foi atualizada. Para efetuar alterações, aceda às Definições." + "Aceda às Definições para atualizar a navegação no sistema." diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index a7d85ab8b524..ae1fb3f257bd 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -197,6 +197,7 @@ "Alteração de rede da operadora" "Abrir detalhes da bateria" "Bateria em %d por cento." + "Bateria com %1$s de carga, tempo restante aproximado, com base no seu uso: %2$s" "Bateria carregando: %d%%." "Configurações do sistema" "Notificações." @@ -398,7 +399,7 @@ "+%d" "Notificações menos urgentes abaixo" "Toque novamente para abrir" - "Deslize para cima para desbloquear" + "Deslize para cima para abrir" "Este dispositivo é gerenciado pela sua organização" "Este dispositivo é gerenciado por %s" "Deslize a partir do ícone do telefone" @@ -932,8 +933,6 @@ "Mover para canto inferior esquerdo" "Mover para canto inferior direito" "Dispensar" - - - - + "Navegação no sistema atualizada. Se quiser alterá-la, acesse as configurações." + "Acesse as configurações para atualizar a navegação no sistema" diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 31709b66f2e9..06b1ddb922ea 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -197,6 +197,7 @@ "Se schimbă rețeaua operatorului" "Deschideți detaliile privind bateria" "Baterie: %d la sută." + "Procentul rămas din baterie este %1$s. În baza utilizării, timpul rămas este de aproximativ %2$s" "Se încarcă bateria, %d%%." "Setări de sistem." "Notificări." @@ -400,7 +401,7 @@ "+%d" "Notificările mai puțin urgente mai jos" "Atingeți din nou pentru a deschide" - "Glisați în sus pentru a debloca" + "Glisați în sus pentru a deschide" "Acest dispozitiv este gestionat de organizația dvs." "Acest dispozitiv este gestionat de %s" "Glisați dinspre telefon" @@ -937,8 +938,6 @@ "Mutați în stânga jos" "Mutați în dreapta jos" "Închideți" - - - - + "Navigarea în sistem a fost actualizată. Pentru a face modificări, accesați Setările." + "Accesați Setările pentru a actualiza navigarea în sistem" diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 6c926f121a5f..82f6e36de6d6 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -197,6 +197,7 @@ "Сменить сеть" "Сведения о расходе заряда батареи" "Заряд батареи в процентах: %d." + "Заряд батареи – %1$s %. При текущем уровне расхода его хватит примерно на такое время: %2$s." "Зарядка батареи. Текущий заряд: %d %%." "Настройки" "Уведомления" @@ -402,7 +403,7 @@ "+%d" "Показать менее важные уведомления" "Нажмите ещё раз, чтобы открыть" - "Проведите вверх, чтобы разблокировать" + "Проведите вверх, чтобы открыть" "Этим устройством управляет ваша организация" "Этим устройством управляет компания \"%s\"" "Телефон: проведите от значка" @@ -942,8 +943,6 @@ "Перенести в левый нижний угол" "Перенести в правый нижний угол" "Закрыть" - - - - + "Параметры навигации в системе обновлены. Чтобы изменить их, перейдите в настройки." + "Чтобы обновить параметры навигации в системе, перейдите в настройки." diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index aee39fd0b10d..c0466354f768 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -197,6 +197,7 @@ "වාහක ජාලය වෙනස් වෙමින්" "බැටරි විස්තර විවෘත කරන්න" "බැටරි ප්‍රතිශතය %d" + "බැටරි ප්‍රතිශතය %1$s, ඔබේ භාවිතයට අනුව %2$s ක් පමණ ඉතුරුයි" "බැටරිය ආරෝපණය කරමින්, %d%%." "පද්ධති සැකසීම්." "දැනුම්දීම්." @@ -398,7 +399,7 @@ "+%d" "හදිසිය අඩු දැනුම් දීම් පහත" "විවෘත කිරීමට නැවත තට්ටු කරන්න" - "අගුළු ඇරීමට ස්වයිප් කරන්න." + "විවෘත කිරීමට ස්වයිප් කරන්න" "මෙම උපාංගය ඔබගේ සංවිධානය විසින් කළමනාකරණය කරනු ලැබේ" "මෙම උපාංගය %s මගින් කළමනාකරණය කෙරේ" "දුරකථනය සඳහා නිරූපකය වෙතින් ස්වයිප් කරන්න" @@ -932,8 +933,6 @@ "පහළ වමට ගෙන යන්න" "පහළ දකුණට ගෙන යන්න" "ඉවතලන්න" - - - - + "පද්ධති සංචලනය යාවත්කාලීන කළා. වෙනස්කම් සිදු කිරීමට, සැකසීම් වෙත යන්න." + "පද්ධති සංචලනය යාවත්කාලීන කිරීමට සැකසීම් වෙත යන්න" diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 6bb9dfec5548..a92a3ad35517 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -197,6 +197,7 @@ "Mení sa sieť operátora" "Otvoriť podrobnosti o batérii" "Batéria %d percent." + "Percentá batérie: %1$s. Na základe vášho používania zostáva %2$s." "Nabíja sa batéria, %d %%." "Nastavenia systému." "Upozornenia." @@ -402,7 +403,7 @@ "+%d" "Menej naliehavé upozornenia sa nachádzajú nižšie" "Upozornenie otvoríte opätovným klepnutím" - "Odomknete prejdením prstom nahor" + "Otvorte potiahnutím prstom nahor" "Toto zariadenie spravuje vaša organizácia" "Toto zariadenie spravuje organizácia %s" "Telefón otvoríte prejdením prstom od ikony" @@ -942,8 +943,6 @@ "Presunúť doľava nadol" "Presunúť doprava nadol" "Zavrieť" - - - - + "Navigácia v systéme bola aktualizovaná. Ak chcete vykonať zmeny, prejdite do Nastavení." + "Prejdite do Nastavení a aktualizujte navigáciu v systéme" diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index efd73d807b43..0b9ceed507d4 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -197,6 +197,7 @@ "Spreminjanje omrežja operaterja" "Odpiranje podrobnosti o akumulatorju" "Baterija %d odstotkov." + "Napolnjenost akumulatorja je %1$s, glede na način uporabe imate na voljo še približno %2$s" "Polnjenje akumulatorja, %d %%." "Sistemske nastavitve." "Obvestila." @@ -402,7 +403,7 @@ "+%d" "Manj nujna obvestila spodaj" "Znova se dotaknite, da odprete" - "Povlecite, da odklenete" + "Povlecite navzgor, da odprete" "To napravo upravlja vaša organizacija" "To napravo upravlja %s" "Povlecite z ikone za telefon" @@ -942,8 +943,6 @@ "Premakni spodaj levo" "Premakni spodaj desno" "Opusti" - - - - + "Krmarjenje po sistemu je posodobljeno. Če želite opraviti spremembe, odprite nastavitve." + "Če želite posodobiti krmarjenje po sistemu, odprite nastavitve" diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 091c5402c339..1de50d4e2f98 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -197,6 +197,7 @@ "Rrjeti i operatorit celular po ndryshohet" "Hap detajet e baterisë" "Bateria ka edhe %d për qind." + "Bateria %1$s përqind, rreth %2$s të mbetura bazuar në përdorimin tënd" "Bateria po karikohet, %d%%." "Cilësimet e sistemit." "Njoftimet." @@ -398,7 +399,7 @@ "+%d" "Njoftimet më pak urgjente, më poshtë!" "Trokit përsëri për ta hapur" - "Rrëshqit për të shkyçur" + "Rrëshqit lart për ta hapur" "Kjo pajisje menaxhohet nga organizata jote" "Kjo pajisje menaxhohet nga %s" "Rrëshqit për të hapur telefonin" @@ -932,8 +933,6 @@ "Zhvendos poshtë majtas" "Lëvize poshtë djathtas" "Hiq" - - - - + "Navigimi i sistemit u përditësua. Për të bërë ndryshime, shko te \"Cilësimet\"." + "Shko te \"Cilësimet\" për të përditësuar navigimin e sistemit" diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 02986777cfb1..274e6786f36a 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -197,6 +197,7 @@ "Промена мреже мобилног оператера" "Отвори детаље о батерији" "Батерија је на %d посто." + "Батерија је на %1$s посто, преостало време на основу коришћења је %2$s" "Батерија се пуни, %d%%." "Системска подешавања." "Обавештења." @@ -400,7 +401,7 @@ "+%d" "Мање хитна обавештења су у наставку" "Додирните поново да бисте отворили" - "Превуците нагоре да бисте откључали" + "Превуците нагоре да бисте отворили" "Овим уређајем управља организација" "Овим уређајем управља %s" "Превуците од иконе за телефон" @@ -937,8 +938,6 @@ "Премести доле лево" "Премести доле десно" "Одбаци" - - - - + "Навигација система је ажурирана. Да бисте унели измене, идите у Подешавања." + "Идите у Подешавања да бисте ажурирали навигацију система" diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index cca609b42a33..c3db8d4d03c8 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -197,6 +197,7 @@ "Byter leverantörsnätverk" "Visa uppgifter om batteri" "Batteri %d procent." + "Batteri: %1$s procent, cirka %2$s kvar utifrån din användning" "Batteriet laddas, %d procent." "Systeminställningar." "Meddelanden." @@ -398,7 +399,7 @@ "+%d" "Mindre brådskande aviseringar nedan" "Tryck igen för att öppna" - "Svep uppåt för att låsa upp" + "Öppna genom att svepa uppåt" "Den här enheten hanteras av organisationen" "Den här enheten hanteras av %s" "Svep från ikonen och öppna telefonen" @@ -932,8 +933,6 @@ "Flytta längst ned till vänster" "Flytta längst ned till höger" "Stäng" - - - - + "Systemnavigeringen har uppdaterats. Öppna inställningarna om du vill ändra något." + "Öppna inställningarna och uppdatera systemnavigeringen" diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index b4177fc1478d..683138237605 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -197,6 +197,7 @@ "Mabadiliko katika mtandao wa mtoa huduma" "Fungua maelezo ya betri" "Asilimia %d ya betri" + "Betri ina asilimia %1$s, zimesalia takribani %2$s kulingana na jinsi unavyoitumia" "Betri inachaji, asilimia %d." "Mipangilio ya mfumo." "Arifa." @@ -398,7 +399,7 @@ "%d+" "Arifa zisizo za dharura sana ziko hapo chini" "Gusa tena ili ufungue" - "Telezesha kidole ili ufungue" + "Telezesha kidole juu ili ufungue" "Kifaa hiki kinasimamiwa na shirika lako" "Kifaa hiki kinadhibitiwa na %s" "Telezesha kidole kutoka kwa aikoni ili ufikie simu" @@ -932,8 +933,6 @@ "Sogeza chini kushoto" "Sogeza chini kulia" "Ondoa" - - - - + "Umesasisha usogezaji kwenye mfumo. Ili ufanye mabadiliko, nenda kwenye Mipangilio." + "Nenda kwenye mipangilio ili usasishe usogezaji kwenye mfumo" diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index bfca4766f17c..27118fc1a9f9 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -197,6 +197,7 @@ "மொபைல் நிறுவன நெட்வொர்க்கை மாற்றும்" "பேட்டரி விவரங்களைத் திறக்கும்" "பேட்டரி சக்தி %d சதவிகிதம் உள்ளது." + "பேட்டரி: %1$s சதவீதம், உபயோகத்தின் அடிப்படையில் %2$s மீதமுள்ளது" "பேட்டரி சார்ஜ் செய்யப்படுகிறது, %d சதவீதம்." "கணினி அமைப்பு." "அறிவிப்புகள்." @@ -398,7 +399,8 @@ "+%d" "அவசர நிலைக் குறைவான அறிவிப்புகள் கீழே உள்ளன" "திறக்க, மீண்டும் தட்டவும்" - "திறக்க, மேலே ஸ்வைப் செய்யவும்" + + "இந்தச் சாதனத்தை உங்கள் நிறுவனம் நிர்வகிக்கிறது" "இந்தச் சாதனத்தை நிர்வகிப்பது: %s" "ஃபோனிற்கு ஐகானிலிருந்து ஸ்வைப் செய்யவும்" @@ -932,8 +934,6 @@ "கீழே இடப்புறமாக நகர்த்து" "கீழே வலதுபுறமாக நகர்த்து" "மூடுக" - - - - + "சிஸ்டம் நேவிகேஷன் மாற்றப்பட்டது. மாற்றங்களைச் செய்ய ‘அமைப்புகளுக்குச்’ செல்லவும்." + "சிஸ்டம் நேவிகேஷனை மாற்ற ’அமைப்புகளுக்குச்’ செல்லவும்" diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 657e57764e06..ac2fb8d1dd85 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -197,6 +197,7 @@ "క్యారియర్ నెట్‌వర్క్ మారుతోంది" "బ్యాటరీ వివరాలను తెరుస్తుంది" "బ్యాటరీ %d శాతం." + "బ్యాటరీ %1$s శాతం ఉంది, మీ వినియోగాన్ని బట్టి %2$s పని చేస్తుంది" "బ్యాటరీ ఛార్జ్ అవుతోంది, %d %%." "సిస్టమ్ సెట్టింగ్‌లు." "నోటిఫికేషన్‌లు." @@ -398,7 +399,8 @@ "+%d" "తక్కువ అత్యవసర నోటిఫికేషన్‌లు దిగువన" "తెరవడానికి మళ్లీ నొక్కండి" - "అన్‌లాక్ చేయడానికి ఎగువకు స్వైప్ చేయండి" + + "ఈ పరికరాన్ని మీ సంస్థ నిర్వహిస్తోంది" "ఈ పరికరం %s నిర్వహణలో ఉంది" "ఫోన్ కోసం చిహ్నాన్ని స్వైప్ చేయండి" @@ -932,8 +934,6 @@ "దిగువ ఎడమవైపునకు తరలించు" "దిగవు కుడివైపునకు జరుపు" "విస్మరించు" - - - - + "సిస్టమ్ నావిగేషన్ అప్‌డేట్ చేయబడింది. మార్పులు చేయడానికి, సెట్టింగ్‌లకు వెళ్లండి." + "సిస్టమ్ నావిగేషన్‌ను అప్‌డేట్ చేయడానికి సెట్టింగ్‌లకు వెళ్లండి" diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index f377c34f2416..0f47518ee66f 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -197,6 +197,7 @@ "การเปลี่ยนเครือข่ายผู้ให้บริการ" "เปิดรายละเอียดแบตเตอรี่" "แบตเตอรี่ %d เปอร์เซ็นต์" + "แบตเตอรี่ %1$s เปอร์เซ็นต์ ใช้ได้อีกประมาณ %2$s ทั้งนี้ขึ้นอยู่กับการใช้งานของคุณ" "กำลังชาร์จแบตเตอรี่ %d เปอร์เซ็นต์" "การตั้งค่าระบบ" "การแจ้งเตือน" @@ -398,7 +399,7 @@ "+%d" "การแจ้งเตือนที่เร่งด่วนน้อยด้านล่าง" "แตะอีกครั้งเพื่อเปิด" - "เลื่อนเพื่อปลดล็อก" + "เลื่อนขึ้นเพื่อเปิด" "อุปกรณ์นี้จัดการโดยองค์กรของคุณ" "อุปกรณ์เครื่องนี้จัดการโดย %s" "เลื่อนไอคอนโทรศัพท์" @@ -932,8 +933,6 @@ "ย้ายไปด้านซ้ายล่าง" "ย้ายไปด้านขาวล่าง" "ปิด" - - - - + "อัปเดตการไปยังส่วนต่างๆ ของระบบแล้ว หากต้องการเปลี่ยนแปลง ให้ไปที่การตั้งค่า" + "ไปที่การตั้งค่าเพื่ออัปเดตการไปยังส่วนต่างๆ ของระบบ" diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 90c7ab76359a..96a612db8f29 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -197,6 +197,7 @@ "Nagpapalit ng carrier network" "Buksan ang mga detalye ng baterya" "Baterya %d (na) porsyento." + "%1$s (na) porsyento ang baterya, nasa %2$s ang natitira batay sa paggamit mo" "Nagcha-charge ang baterya, %d (na) porsyento." "Mga setting ng system." "Mga Notification." @@ -398,7 +399,7 @@ "+%d" "Nasa ibaba ang mga notification na hindi masyadong mahalaga" "I-tap ulit upang buksan" - "I-swipe pataas upang i-unlock" + "Mag-swipe pataas para buksan" "Ang device na ito ay pinamamahalaan ng iyong organisasyon" "Pinamamahalaan ng %s ang device na ito" "Mag-swipe mula sa icon para sa telepono" @@ -932,8 +933,6 @@ "Ilipat sa kaliwa sa ibaba" "Ilipat sa kanan sa ibaba" "I-dismiss" - - - - + "Na-update na ang pag-navigate ng system. Para gumawa ng mga pagbabago, pumunta sa Mga Setting." + "Pumunta sa Mga Setting para i-update ang pag-navigate sa system" diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 4432b41dda26..f1abe70b68fe 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -197,6 +197,7 @@ "Operatör ağı değiştiriliyor" "Pil ayrıntılarını aç" "Pil yüzdesi: %d" + "Pil yüzde %1$s dolu. Kullanımınıza göre yaklaşık %2$s süresi kaldı" "Pil şarj oluyor, yüzde %d." "Sistem ayarları." "Bildirimler." @@ -398,7 +399,7 @@ "+%d" "Daha az acil bildirimler aşağıdadır" "Açmak için tekrar dokunun" - "Kilidi açmak için hızlıca yukarı kaydırın" + "Açmak için yukarı kaydırın" "Bu cihaz kuruluşunuz tarafından yönetiliyor" "Bu cihaz %s tarafından yönetilmektedir." "Telefon için, simgeden hızlıca kaydırın" @@ -932,8 +933,6 @@ "Sol alta taşı" "Sağ alta taşı" "Kapat" - - - - + "Sistemde gezinme yöntemi güncellendi. Değişiklik yapmak için Ayarlar\'a gidin." + "Sistemde gezinme yöntemini güncellemek için Ayarlar\'a gidin" diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 171949a53761..821f900ec718 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -197,6 +197,7 @@ "Змінення мережі оператора" "Відкрити деталі акумулятора" "Заряд акумулятора у відсотках: %d." + "Згідно з даними про використання залишилося %1$s заряду акумулятора – близько %2$s" "Акумулятор заряджається: %d%%." "Налаштування системи." "Сповіщення." @@ -402,7 +403,7 @@ "+%d" "Менше термінових сповіщень нижче" "Торкніться знову, щоб відкрити" - "Проведіть пальцем угору, щоб розблокувати" + "Проведіть пальцем угору, щоб відкрити" "Цим пристроєм керує адміністратор вашої організації" "Цим пристроєм керує організація %s" "Телефон: проведіть пальцем від значка" @@ -942,8 +943,6 @@ "Перемістити ліворуч униз" "Перемістити праворуч униз" "Закрити" - - - - + "Навігацію в системі оновлено. Щоб внести зміни, перейдіть у налаштування." + "Перейдіть у налаштування, щоб оновити навігацію в системі" diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 7f37dea93be1..242bfc4116bb 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -197,6 +197,7 @@ "کیریئر نیٹ ورک کی تبدیلی" "بیٹری کی تفصیلات کھولیں" "بیٹری %d فیصد۔" + "آپ کے استعمال کی بنیاد پر بیٹری %1$s فیصد، تقریباً %2$s باقی ہے" "بیٹری چارج ہو رہی ہے، %d%%" "سسٹم کی ترتیبات۔" "اطلاعات۔" @@ -398,7 +399,7 @@ "‎+%d‎" "کم اہم اطلاعات ذیل میں ہیں" "کھولنے کیلئے دوبارہ تھپتھپائیں" - "غیر مقفل کرنے کیلئے اوپر سوائپ کریں" + "کھولنے کے لیے اوپر سوائپ کريں" "یہ آلہ آپ کی تنظیم کے زیر انتظام ہے" "یہ آلہ %s کے زیر انتظام ہے" "فون کیلئے آئیکن سے سوائپ کریں" @@ -932,8 +933,6 @@ "نیچے بائیں جانب لے جائیں" "نیچے دائیں جانب لے جائیں" "برخاست کریں" - - - - + "سسٹم نیویگیشن اپ ڈیٹ کیا گیا۔ تبدیلیاں کرنے کے لیے، ترتیبات پر جائیں۔" + "سسٹم نیویگیشن اپ ڈیٹ کرنے کے لیے ترتیبات پر جائیں" diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 2dfbb6157c1c..fd2756ff394b 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -197,6 +197,7 @@ "Mobil tarmoqni o‘zgartirish" "Quvvat sarfi tafsilotlari" "Batareya %d foiz." + "Batareya quvvati %1$s foiz, joriy holatda yana %2$s qoldi" "Batareya quvvat olmoqda (%d%%)." "Tizim sozlamalari." "Eslatmalar." @@ -398,7 +399,7 @@ "+%d" "Kam ahamiyatli bildirishnomalarni pastda ko‘rsatish" "Ochish uchun yana bosing" - "Qulfdan chiqarish uchun tepaga suring" + "Ochish uchun tepaga suring" "Bu – tashkilotingiz tomonidan boshqariladigan qurilma" "Bu – %s tomonidan boshqariladigan qurilma" "Telefonni ochish uchun suring" @@ -932,8 +933,6 @@ "Quyi chapga surish" "Quyi oʻngga surish" "Yopish" - - - - + "Tizim navigatsiyasi yangilandi. Buni Sozlamalar orqali oʻzgartirishingiz mumkin." + "Tizim navigatsiyasini yangilash uchun Sozlamalarni oching" diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 659cd694bf42..7a45717946e4 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -197,6 +197,7 @@ "Thay đổi mạng của nhà mạng" "Mở chi tiết về pin" "%d phần trăm pin." + "%1$s phần trăm pin, còn khoảng %2$s dựa trên mức sử dụng của bạn" "Đang sạc pin, %d%%." "Cài đặt hệ thống" "Thông báo." @@ -398,7 +399,7 @@ "+%d" "Thông báo ít khẩn cấp hơn bên dưới" "Nhấn lại để mở" - "Vuốt lên để mở khóa" + "Vuốt lên để mở" "Thiết bị này do tổ chức của bạn quản lý" "Thiết bị này được %s quản lý" "Vuốt từ biểu tượng để mở điện thoại" @@ -932,8 +933,6 @@ "Chuyển tới dưới cùng bên trái" "Chuyển tới dưới cùng bên phải" "Loại bỏ" - - - - + "Đã cập nhật chế độ di chuyển trên hệ thống. Để thay đổi, hãy chuyển đến phần Cài đặt." + "Chuyển đến phần Cài đặt để cập nhật chế độ di chuyển trên hệ thống" diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 018777f14786..5dafb2e9db03 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -197,6 +197,7 @@ "运营商网络正在更改" "打开电量详情" "电池电量为百分之 %d。" + "电池电量为 %1$s,根据您的使用情况,大约还可使用 %2$s" "正在充电,已完成 %d%%。" "系统设置。" "通知。" @@ -398,7 +399,7 @@ "+%d" "不太紧急的通知会显示在下方" "再次点按即可打开" - "向上滑动即可解锁" + "向上滑动即可打开" "此设备由您所属单位管理" "此设备是由%s托管" "滑动图标即可拨打电话" @@ -932,8 +933,6 @@ "移至左下角" "移至右下角" "关闭" - - - - + "系统导航已更新。要进行更改,请转到“设置”。" + "转到“设置”即可更新系统导航" diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index cd674f50e413..b22d42b9ce83 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -197,6 +197,7 @@ "流動網絡供應商網絡正在變更" "開啟電池詳細資料" "電池電量為百分之 %d。" + "電量仲剩番 %1$s。根據你嘅使用情況,仲可以用大約 %2$s" "正在充電:%d%%。" "系統設定" "通知。" @@ -398,7 +399,7 @@ "還有 %d 則通知" "不太緊急的通知會在下方顯示" "再次輕按即可開啟" - "向上滑動即可解鎖" + "向上滑動即可開啟" "此裝置由您的機構管理" "此裝置由%s管理" "從圖示滑動即可使用手機功能" @@ -932,8 +933,6 @@ "移去左下角" "移去右下角" "關閉" - - - - + "系統導覽已更新。如需變更,請前往「設定」。" + "前往「設定」更新系統導覽" diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index f16b21cad6a9..2a5659da4336 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -197,6 +197,7 @@ "電信業者網路正在進行變更" "開啟電量詳細資料" "電池電量為百分之 %d。" + "目前的電量為 %1$s。根據你的使用情形,大約還能使用到%2$s" "充電中,已完成 %d%%。" "系統設定" "通知。" @@ -398,7 +399,7 @@ "還有 %d 則通知" "較不緊急的通知會顯示在下方" "再次輕觸即可開啟" - "向上滑動即可解鎖" + "向上滑動即可開啟" "這個裝置是由貴機構所管理" "這個裝置是由 %s 所管理" "滑動手機圖示即可啟用" @@ -932,8 +933,6 @@ "移至左下方" "移至右下方" "關閉" - - - - + "系統操作機制已更新。如要進行變更,請前往「設定」。" + "請前往「設定」更新系統操作機制" diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 887bec0a7afa..92c0e88fcffd 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -197,6 +197,7 @@ "Inethiwekhi yenkampani yenethiwekhi iyashintsha" "Vula imininingwane yebhethri" "Iphesenti %d lebhethri" + "Amaphesenti ebhethri ngu-%1$s, cishe kusele okungu-%2$s kusukela ekusetshenzisweni kwakho" "Ibhethri liyashaja, %d iphesenti." "Izilungiselelo zesistimu" "Izaziso" @@ -398,7 +399,7 @@ "+%d" "Izaziso ezingasheshi kakhulu ezingezansi" "Thepha futhi ukuze uvule" - "Swayiphela phezulu ukuze uvule" + "Swayiphela phezulu ukuze uvule" "Le divayisi iphethwe inhlangano yakho" "Le divayisi iphethwe yi-%s" "Swayiphela ifoni kusukela kusithonjana" @@ -932,8 +933,6 @@ "Hambisa inkinobho ngakwesokunxele" "Hambisa inkinobho ngakwesokudla" "Cashisa" - - - - + "Ukuzulazula kwesistimu kubuyekeziwe. Ukuze wenze ushintsho, hamba kokuthi Izilungiselelo." + "Hamba kuzilungiselelo ukuze ubuyekeze ukuzulazula kwesistimu" -- GitLab From 17a91645c2162f437084b81395257e6052d57a7b Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 8 Jun 2019 08:41:59 -0700 Subject: [PATCH 082/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I7faa79c0c3849fd8e39396f29098d63fa71ab15f --- packages/SettingsLib/res/values-de/strings.xml | 8 ++++---- packages/SettingsLib/res/values-ru/strings.xml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 0347f2d5a3a0..7c03afb30379 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -381,12 +381,12 @@ "%1$s – %2$s" "Noch etwa %1$s" "Noch etwa %1$s (%2$s)" - "Noch etwa %1$s, basierend auf deiner Nutzung" - "Noch etwa %1$s, basierend auf deiner Nutzung (%2$s)" + "Bei deinem Nutzungsmuster hast du noch ca. %1$s" + "Bei deinem Nutzungsmuster hast du noch ca. %1$s (%2$s)" - "Sollte basierend auf deiner Nutzung etwa bis %1$s reichen (%2$s)" - "Sollte basierend auf deiner Nutzung etwa bis %1$s reichen" + "Bei deinem Nutzungsmuster dürfte der Akku bis ca. %1$s reichen (%2$s)" + "Bei deinem Nutzungsmuster dürfte der Akku bis ca. %1$s reichen" "Sollte etwa bis %1$s reichen (%2$s)" "Sollte etwa bis %1$s reichen" "Bis %1$s" diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index db43c7562dbc..0401e7fd2d02 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -60,7 +60,7 @@ "Средняя" "Быстрая" "Очень быстрая" - "%2$s: %1$s" + "%1$s / %2$s" "Нет подключения" "Отключение..." "Подключение..." -- GitLab From 4844d722a961bfd05606be0fb2f6625d364a31ac Mon Sep 17 00:00:00 2001 From: Beverly Date: Mon, 10 Jun 2019 11:52:16 -0400 Subject: [PATCH 083/620] Add feature flag to enable skip direction mapping When this feature if enabled, users can change the directionality of the skip gesture Test: manual Bug: 132788434 Change-Id: I43fb58c3abeafc36424b1ce6ef4140428de84f4e --- core/java/android/provider/Settings.java | 17 +++++++++++++++++ core/java/android/util/FeatureFlagUtils.java | 1 + 2 files changed, 18 insertions(+) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index b5c0e952b389..d614fed6b168 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -7755,6 +7755,20 @@ public final class Settings { private static final Validator SKIP_GESTURE_COUNT_VALIDATOR = NON_NEGATIVE_INTEGER_VALIDATOR; + /** + * Direction to advance media for skip gesture + * @hide + */ + public static final String SKIP_DIRECTION = "skip_gesture_direction"; + + /** + * Only used if FeatureFlag "settings_skip_direction_mutable" is enabled. + * If feature flag is disabled, should assume SKIP_DIRECTION = 0. + * 0 / false = right to left to advance to next + * 1 / true = left to right to advance to next + */ + private static final Validator SKIP_DIRECTION_VALIDATOR = BOOLEAN_VALIDATOR; + /** * Gesture that silences sound (alarms, notification, calls). * @hide @@ -8992,6 +9006,7 @@ public final class Settings { UI_NIGHT_MODE, LOCK_SCREEN_WHEN_TRUST_LOST, SKIP_GESTURE, + SKIP_DIRECTION, SILENCE_GESTURE, THEME_CUSTOMIZATION_OVERLAY_PACKAGES, NAVIGATION_MODE, @@ -9178,6 +9193,8 @@ public final class Settings { VALIDATORS.put(LOCK_SCREEN_CUSTOM_CLOCK_FACE, LOCK_SCREEN_CUSTOM_CLOCK_FACE_VALIDATOR); VALIDATORS.put(LOCK_SCREEN_WHEN_TRUST_LOST, LOCK_SCREEN_WHEN_TRUST_LOST_VALIDATOR); VALIDATORS.put(SKIP_GESTURE, SKIP_GESTURE_VALIDATOR); + VALIDATORS.put(SKIP_DIRECTION, SKIP_DIRECTION_VALIDATOR); + VALIDATORS.put(SKIP_DIRECTION, SKIP_DIRECTION_VALIDATOR); VALIDATORS.put(SILENCE_GESTURE, SILENCE_GESTURE_VALIDATOR); VALIDATORS.put(THEME_CUSTOMIZATION_OVERLAY_PACKAGES, THEME_CUSTOMIZATION_OVERLAY_PACKAGES_VALIDATOR); diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java index 324e02ceb1d5..0e0c676c2782 100644 --- a/core/java/android/util/FeatureFlagUtils.java +++ b/core/java/android/util/FeatureFlagUtils.java @@ -57,6 +57,7 @@ public class FeatureFlagUtils { DEFAULT_FLAGS.put(SCREENRECORD_LONG_PRESS, "false"); DEFAULT_FLAGS.put(PIXEL_WALLPAPER_CATEGORY_SWITCH, "false"); DEFAULT_FLAGS.put("settings_wifi_details_datausage_header", "false"); + DEFAULT_FLAGS.put("settings_skip_direction_mutable", "true"); } /** -- GitLab From 7c86b633e261ce2de04beeb91f465179af2509f4 Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Fri, 7 Jun 2019 13:07:27 -0400 Subject: [PATCH 084/620] Add cache to AppOpsController Reduces the Binder calls from AppOpsControllerImpl to PackageManager#getPermissionFlags by caching calls for 10s (moltmann@ recommended this expiration time). Also, modify AppOpsControllerImpl#notifySuscribers to use the bg Thread. Currently calls to getPermissionFlags only happen in two functions: * AppOpsControllerImpl#notifySuscribers * AppOpsControllerImpl#getActiveAppOpsForUser First one in only called from bg thread and second one is called from a bg thread from PrivacyItemController. In a future CL, this calling will be enforced at the entry point (getActiveAppOpsForUser) Test: atest PermissionFlagsCacheTest AppOpsControllerTest Bug: 134687592 Change-Id: I6fa9e2d865bc295f6325935e2df574b8b758214a --- .../systemui/appops/AppOpsControllerImpl.java | 16 +++- .../systemui/appops/PermissionFlagsCache.kt | 70 +++++++++++++++ .../systemui/appops/AppOpsControllerTest.java | 17 ++-- .../appops/PermissionFlagsCacheTest.kt | 88 +++++++++++++++++++ 4 files changed, 183 insertions(+), 8 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/appops/PermissionFlagsCache.kt create mode 100644 packages/SystemUI/tests/src/com/android/systemui/appops/PermissionFlagsCacheTest.kt diff --git a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java index 49bd5bd09220..858ed6dcf93d 100644 --- a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java @@ -62,6 +62,8 @@ public class AppOpsControllerImpl implements AppOpsController, private H mBGHandler; private final List mCallbacks = new ArrayList<>(); private final ArrayMap> mCallbacksByCode = new ArrayMap<>(); + private final PermissionFlagsCache mFlagsCache; + private boolean mListening; @GuardedBy("mActiveItems") private final List mActiveItems = new ArrayList<>(); @@ -78,8 +80,14 @@ public class AppOpsControllerImpl implements AppOpsController, @Inject public AppOpsControllerImpl(Context context, @Named(BG_LOOPER_NAME) Looper bgLooper) { + this(context, bgLooper, new PermissionFlagsCache(context)); + } + + @VisibleForTesting + protected AppOpsControllerImpl(Context context, Looper bgLooper, PermissionFlagsCache cache) { mContext = context; mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); + mFlagsCache = cache; mBGHandler = new H(bgLooper); final int numOps = OPS.length; for (int i = 0; i < numOps; i++) { @@ -94,6 +102,7 @@ public class AppOpsControllerImpl implements AppOpsController, @VisibleForTesting protected void setListening(boolean listening) { + mListening = listening; if (listening) { mAppOps.startWatchingActive(OPS, this); mAppOps.startWatchingNoted(OPS, this); @@ -225,7 +234,7 @@ public class AppOpsControllerImpl implements AppOpsController, if (permission == null) { return false; } - int permFlags = mContext.getPackageManager().getPermissionFlags(permission, + int permFlags = mFlagsCache.getPermissionFlags(permission, packageName, UserHandle.getUserHandleForUid(uid)); return (permFlags & PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED) != 0; } @@ -308,7 +317,7 @@ public class AppOpsControllerImpl implements AppOpsController, @Override public void onOpActiveChanged(int code, int uid, String packageName, boolean active) { if (updateActives(code, uid, packageName, active)) { - notifySuscribers(code, uid, packageName, active); + mBGHandler.post(() -> notifySuscribers(code, uid, packageName, active)); } } @@ -319,7 +328,7 @@ public class AppOpsControllerImpl implements AppOpsController, } if (result != AppOpsManager.MODE_ALLOWED) return; addNoted(code, uid, packageName); - notifySuscribers(code, uid, packageName, true); + mBGHandler.post(() -> notifySuscribers(code, uid, packageName, true)); } private void notifySuscribers(int code, int uid, String packageName, boolean active) { @@ -334,6 +343,7 @@ public class AppOpsControllerImpl implements AppOpsController, @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("AppOpsController state:"); + pw.println(" Listening: " + mListening); pw.println(" Active Items:"); for (int i = 0; i < mActiveItems.size(); i++) { final AppOpItem item = mActiveItems.get(i); diff --git a/packages/SystemUI/src/com/android/systemui/appops/PermissionFlagsCache.kt b/packages/SystemUI/src/com/android/systemui/appops/PermissionFlagsCache.kt new file mode 100644 index 000000000000..f02c7afdb9ca --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/appops/PermissionFlagsCache.kt @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.appops + +import android.content.Context +import android.content.pm.PackageManager +import android.os.UserHandle +import android.util.ArrayMap +import com.android.internal.annotations.VisibleForTesting + +private data class PermissionFlag(val flag: Int, val timestamp: Long) + +private data class PermissionFlagKey( + val permission: String, + val packageName: String, + val user: UserHandle +) + +internal const val CACHE_EXPIRATION = 10000L + +/** + * Cache for PackageManager's PermissionFlags. + * + * Flags older than [CACHE_EXPIRATION] will be retrieved again. + */ +internal open class PermissionFlagsCache(context: Context) { + private val packageManager = context.packageManager + private val permissionFlagsCache = ArrayMap() + + /** + * Retrieve permission flags from cache or PackageManager. There parameters will be passed + * directly to [PackageManager]. + * + * Calls to this method should be done from a background thread. + */ + fun getPermissionFlags(permission: String, packageName: String, user: UserHandle): Int { + val key = PermissionFlagKey(permission, packageName, user) + val now = getCurrentTime() + val value = permissionFlagsCache.getOrPut(key) { + PermissionFlag(getFlags(key), now) + } + if (now - value.timestamp > CACHE_EXPIRATION) { + val newValue = PermissionFlag(getFlags(key), now) + permissionFlagsCache.put(key, newValue) + return newValue.flag + } else { + return value.flag + } + } + + private fun getFlags(key: PermissionFlagKey) = + packageManager.getPermissionFlags(key.permission, key.packageName, key.user) + + @VisibleForTesting + protected open fun getCurrentTime() = System.currentTimeMillis() +} \ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java index cc31531c90a7..540ac843ad8e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java @@ -39,7 +39,6 @@ import android.testing.TestableLooper; import androidx.test.filters.SmallTest; -import com.android.systemui.Dependency; import com.android.systemui.SysuiTestCase; import org.junit.Before; @@ -65,28 +64,32 @@ public class AppOpsControllerTest extends SysuiTestCase { private AppOpsController.Callback mCallback; @Mock private AppOpsControllerImpl.H mMockHandler; + @Mock + private PermissionFlagsCache mFlagsCache; private AppOpsControllerImpl mController; + private TestableLooper mTestableLooper; @Before public void setUp() { MockitoAnnotations.initMocks(this); + mTestableLooper = TestableLooper.get(this); getContext().addMockSystemService(AppOpsManager.class, mAppOpsManager); // All permissions of TEST_UID and TEST_UID_OTHER are user sensitive. None of // TEST_UID_NON_USER_SENSITIVE are user sensitive. getContext().setMockPackageManager(mPackageManager); - when(mPackageManager.getPermissionFlags(anyString(), anyString(), + when(mFlagsCache.getPermissionFlags(anyString(), anyString(), eq(UserHandle.getUserHandleForUid(TEST_UID)))).thenReturn( PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED); - when(mPackageManager.getPermissionFlags(anyString(), anyString(), + when(mFlagsCache.getPermissionFlags(anyString(), anyString(), eq(UserHandle.getUserHandleForUid(TEST_UID_OTHER)))).thenReturn( PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED); - when(mPackageManager.getPermissionFlags(anyString(), anyString(), + when(mFlagsCache.getPermissionFlags(anyString(), anyString(), eq(UserHandle.getUserHandleForUid(TEST_UID_NON_USER_SENSITIVE)))).thenReturn(0); - mController = new AppOpsControllerImpl(mContext, Dependency.get(Dependency.BG_LOOPER)); + mController = new AppOpsControllerImpl(mContext, mTestableLooper.getLooper(), mFlagsCache); } @Test @@ -110,6 +113,7 @@ public class AppOpsControllerTest extends SysuiTestCase { AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true); mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, AppOpsManager.MODE_ALLOWED); + mTestableLooper.processAllMessages(); verify(mCallback).onActiveStateChanged(AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true); } @@ -119,6 +123,7 @@ public class AppOpsControllerTest extends SysuiTestCase { mController.addCallback(new int[]{AppOpsManager.OP_FINE_LOCATION}, mCallback); mController.onOpActiveChanged( AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true); + mTestableLooper.processAllMessages(); verify(mCallback, never()).onActiveStateChanged( anyInt(), anyInt(), anyString(), anyBoolean()); } @@ -129,6 +134,7 @@ public class AppOpsControllerTest extends SysuiTestCase { mController.removeCallback(new int[]{AppOpsManager.OP_RECORD_AUDIO}, mCallback); mController.onOpActiveChanged( AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true); + mTestableLooper.processAllMessages(); verify(mCallback, never()).onActiveStateChanged( anyInt(), anyInt(), anyString(), anyBoolean()); } @@ -139,6 +145,7 @@ public class AppOpsControllerTest extends SysuiTestCase { mController.removeCallback(new int[]{AppOpsManager.OP_CAMERA}, mCallback); mController.onOpActiveChanged( AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true); + mTestableLooper.processAllMessages(); verify(mCallback).onActiveStateChanged(AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/appops/PermissionFlagsCacheTest.kt b/packages/SystemUI/tests/src/com/android/systemui/appops/PermissionFlagsCacheTest.kt new file mode 100644 index 000000000000..dc070dea6d89 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/appops/PermissionFlagsCacheTest.kt @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.appops + +import android.content.Context +import android.content.pm.PackageManager +import android.os.UserHandle +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.any +import org.mockito.ArgumentMatchers.anyString +import org.mockito.Mock +import org.mockito.Mockito.times +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@SmallTest +@RunWith(AndroidTestingRunner::class) +class PermissionFlagsCacheTest : SysuiTestCase() { + + companion object { + const val TEST_PERMISSION = "test_permission" + const val TEST_PACKAGE = "test_package" + } + + @Mock + private lateinit var mPackageManager: PackageManager + @Mock + private lateinit var mUserHandle: UserHandle + private lateinit var flagsCache: TestPermissionFlagsCache + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + mContext.setMockPackageManager(mPackageManager) + flagsCache = TestPermissionFlagsCache(mContext) + } + + @Test + fun testCallsPackageManager_exactlyOnce() { + flagsCache.getPermissionFlags(TEST_PERMISSION, TEST_PACKAGE, mUserHandle) + flagsCache.time = CACHE_EXPIRATION - 1 + verify(mPackageManager).getPermissionFlags(TEST_PERMISSION, TEST_PACKAGE, mUserHandle) + } + + @Test + fun testCallsPackageManager_cacheExpired() { + flagsCache.getPermissionFlags(TEST_PERMISSION, TEST_PACKAGE, mUserHandle) + flagsCache.time = CACHE_EXPIRATION + 1 + flagsCache.getPermissionFlags(TEST_PERMISSION, TEST_PACKAGE, mUserHandle) + verify(mPackageManager, times(2)) + .getPermissionFlags(TEST_PERMISSION, TEST_PACKAGE, mUserHandle) + } + + @Test + fun testCallsPackageMaanger_multipleKeys() { + flagsCache.getPermissionFlags(TEST_PERMISSION, TEST_PACKAGE, mUserHandle) + flagsCache.getPermissionFlags(TEST_PERMISSION, "", mUserHandle) + verify(mPackageManager, times(2)) + .getPermissionFlags(anyString(), anyString(), any()) + } + + private class TestPermissionFlagsCache(context: Context) : PermissionFlagsCache(context) { + var time = 0L + + override fun getCurrentTime(): Long { + return time + } + } +} \ No newline at end of file -- GitLab From 6951d3df6c0605fe29a3b3c600a2f837aa978029 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Mon, 10 Jun 2019 14:07:13 -0700 Subject: [PATCH 085/620] Cancel authentication when secure camera is launched on Keyguard To decrease potential latency in starting the secure camera, rather than waiting for keyguard to become occluded and canceling authentication, we pre-emptively cancel face auth on keyguard when double tap is activated. This saves hundreds of ms. Fixes: 134613755 Test: With added logging, observed that cancel is now invoked immediately when double tap for camera is triggered. Change-Id: I3740c55fb608cd1f8aa228768389f192cf18d557 --- .../android/keyguard/KeyguardUpdateMonitor.java | 17 ++++++++++++++++- .../systemui/statusbar/phone/StatusBar.java | 6 ++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 3c119a622b66..cdb72162407b 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -212,6 +212,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private boolean mHasLockscreenWallpaper; private boolean mAssistantVisible; private boolean mKeyguardOccluded; + private boolean mSecureCameraLaunched; @VisibleForTesting protected boolean mTelephonyCapable; @@ -522,6 +523,14 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { updateBiometricListeningState(); } + /** + * Invoked when the secure camera is launched. + */ + public void onCameraLaunched() { + mSecureCameraLaunched = true; + updateBiometricListeningState(); + } + /** * @return a cached version of DreamManager.isDreaming() */ @@ -1654,7 +1663,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { return (mBouncer || mAuthInterruptActive || awakeKeyguard || shouldListenForFaceAssistant()) && !mSwitchingUser && !getUserCanSkipBouncer(user) && !isFaceDisabled(user) && !mKeyguardGoingAway && mFaceSettingEnabledForUser && !mLockIconPressed - && mUserManager.isUserUnlocked(user) && mIsPrimaryUser; + && mUserManager.isUserUnlocked(user) && mIsPrimaryUser + && !mSecureCameraLaunched; } /** @@ -2102,6 +2112,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { checkIsHandlerThread(); Log.d(TAG, "onKeyguardVisibilityChanged(" + showing + ")"); mKeyguardIsVisible = showing; + + if (showing) { + mSecureCameraLaunched = false; + } + for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 382d69428094..97ab83357270 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -3770,6 +3770,12 @@ public class StatusBar extends SystemUI implements DemoMode, "com.android.systemui:CAMERA_GESTURE"); } vibrateForCameraGesture(); + + if (source == StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP) { + Log.v(TAG, "Camera launch"); + mKeyguardUpdateMonitor.onCameraLaunched(); + } + if (!mStatusBarKeyguardViewManager.isShowing()) { startActivityDismissingKeyguard(KeyguardBottomAreaView.INSECURE_CAMERA_INTENT, false /* onlyProvisioned */, true /* dismissShade */, -- GitLab From f5076dfc51b9a13390b537eb455c5d765f8f5ccb Mon Sep 17 00:00:00 2001 From: Lifu Tang Date: Thu, 6 Jun 2019 17:04:58 -0700 Subject: [PATCH 086/620] Filter "Android System" from recent location apps Bug: 134674484 Test: build, flash, and test manually Change-Id: I86879e034b6605a4d3db2024f5e27601a45580fd --- .../android/settingslib/location/RecentLocationApps.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java b/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java index 6fd874989c35..60c9984e5ed4 100644 --- a/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java +++ b/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java @@ -90,12 +90,16 @@ public class RecentLocationApps { for (int i = 0; i < appOpsCount; ++i) { AppOpsManager.PackageOps ops = appOps.get(i); + // Don't show the Android System in the list - it's not actionable for the user. + // Also don't show apps belonging to background users except managed users. String packageName = ops.getPackageName(); int uid = ops.getUid(); final UserHandle user = UserHandle.getUserHandleForUid(uid); - // Don't show apps belonging to background users except managed users. - if (!profiles.contains(user)) { + boolean isAndroidOs = + (uid == android.os.Process.SYSTEM_UID) && ANDROID_SYSTEM_PACKAGE_NAME.equals( + packageName); + if (isAndroidOs || !profiles.contains(user)) { continue; } -- GitLab From 8b8c2bd0d2025a9ec8add7cf9b7c566f13f24fdd Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Fri, 7 Jun 2019 17:17:31 -0700 Subject: [PATCH 087/620] Enable auth on AOD2 Test: make Fixes: 134781140 Change-Id: Ic9acec7121c3919a6f13719b6fd2db52cadf209a --- .../src/com/android/systemui/statusbar/phone/StatusBar.java | 5 +++-- .../com/android/systemui/statusbar/phone/StatusBarTest.java | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 382d69428094..1d1b2f6db266 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -3886,8 +3886,9 @@ public class StatusBar extends SystemUI implements DemoMode, private boolean mAnimateWakeup; private boolean mAnimateScreenOff; private boolean mIgnoreTouchWhilePulsing; - private boolean mWakeLockScreenPerformsAuth = SystemProperties.getBoolean( - "persist.sysui.wake_performs_auth", false); + @VisibleForTesting + boolean mWakeLockScreenPerformsAuth = SystemProperties.getBoolean( + "persist.sysui.wake_performs_auth", true); @Override public String toString() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index 79e05c373534..0cce3dc24db1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -824,6 +824,7 @@ public class StatusBarTest extends SysuiTestCase { mAutoHideController = autoHideController; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mStatusBarWindow = statusBarWindow; + mDozeServiceHost.mWakeLockScreenPerformsAuth = false; } private WakefulnessLifecycle createAwakeWakefulnessLifecycle() { -- GitLab From 8fd0cca41a5e62d660128727f0707953a02bc260 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Mon, 10 Jun 2019 21:01:18 -0700 Subject: [PATCH 088/620] Fixed a bug where the icons where clipped off with owner info Because we were only fading out the owner info, but modifying its height, the icons would be clipped off. Fixes: 134814774 Test: atest SystemUITests Change-Id: If708ef17a327d220f6c21a0b9df866a215adbeb8 --- .../SystemUI/res-keyguard/layout/keyguard_status_view.xml | 2 ++ .../src/com/android/keyguard/KeyguardStatusView.java | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml index a983b05620b4..e08a27779da5 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml @@ -30,6 +30,8 @@ android:id="@+id/status_view_container" android:layout_width="match_parent" android:layout_height="wrap_content" + android:clipChildren="false" + android:clipToPadding="false" android:orientation="vertical"> Date: Tue, 11 Jun 2019 13:48:54 +0000 Subject: [PATCH 089/620] Start invocation light length from 0 Per discussion with UX Test: verify WAI Bug: 134590932 Change-Id: I623862ec1a24ab141584f513ddb5ab30e77f5b8f --- .../com/android/systemui/assist/ui/InvocationLightsView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java b/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java index 178f4c32bb75..5ad6b80bfaea 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java +++ b/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java @@ -130,7 +130,7 @@ public class InvocationLightsView extends View float arcLengthNormalized = cornerLengthNormalized * MINIMUM_CORNER_RATIO; float arcOffsetNormalized = (cornerLengthNormalized - arcLengthNormalized) / 2f; - float minLightLength = arcLengthNormalized / 2; + float minLightLength = 0; float maxLightLength = mGuide.getRegionWidth(PerimeterPathGuide.Region.BOTTOM) / 4f; float lightLength = MathUtils.lerp(minLightLength, maxLightLength, progress); -- GitLab From 424e462055f6aa728c3a4c9270e3e13883ddbffa Mon Sep 17 00:00:00 2001 From: Steve Elliott Date: Mon, 10 Jun 2019 17:04:39 -0400 Subject: [PATCH 090/620] Refresh face auth when invoking global actions Bug: 133578891 Test: manual Change-Id: Ic1122f99834ccfa4f66bd207e3680cc88c931ce1 --- .../com/android/systemui/globalactions/GlobalActionsImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java index 4065d5b5dd8d..1f3403b054c1 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java @@ -30,6 +30,7 @@ import android.widget.TextView; import com.android.internal.R; import com.android.internal.colorextraction.ColorExtractor.GradientColors; import com.android.internal.colorextraction.drawable.ScrimDrawable; +import com.android.keyguard.KeyguardUpdateMonitor; import com.android.settingslib.Utils; import com.android.systemui.Dependency; import com.android.systemui.SysUiServiceProvider; @@ -81,6 +82,7 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks mGlobalActions.showDialog(mKeyguardMonitor.isShowing(), mDeviceProvisionedController.isDeviceProvisioned(), mPanelExtension.get()); + KeyguardUpdateMonitor.getInstance(mContext).requestFaceAuth(); } @Override -- GitLab From 9e7a0158fc26c218d632ca0fecf54882d728f0b5 Mon Sep 17 00:00:00 2001 From: Benjamin Schwartz Date: Thu, 6 Jun 2019 17:39:22 -0700 Subject: [PATCH 091/620] SoundTriggerService: Track model stats Bug: 133868565 Test: adb bugreport Test: In bugreport, check DUMPSYS - voiceinteraction Change-Id: I09750de4b3de1088ac6fba5ad08f01a4b1249112 --- .../soundtrigger/SoundTriggerService.java | 100 +++++++++++++++++- 1 file changed, 98 insertions(+), 2 deletions(-) diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java index 7a834696387c..a8cafb33790d 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java @@ -61,6 +61,7 @@ import android.os.Parcel; import android.os.ParcelUuid; import android.os.PowerManager; import android.os.RemoteException; +import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings; import android.util.ArrayMap; @@ -75,6 +76,7 @@ import com.android.server.SystemService; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Map; import java.util.TreeMap; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -102,6 +104,80 @@ public class SoundTriggerService extends SystemService { private Object mCallbacksLock; private final TreeMap mCallbacks; + class SoundModelStatTracker { + private class SoundModelStat { + SoundModelStat() { + mStartCount = 0; + mTotalTimeMsec = 0; + mLastStartTimestampMsec = 0; + mLastStopTimestampMsec = 0; + mIsStarted = false; + } + long mStartCount; // Number of times that given model started + long mTotalTimeMsec; // Total time (msec) that given model was running since boot + long mLastStartTimestampMsec; // SystemClock.elapsedRealtime model was last started + long mLastStopTimestampMsec; // SystemClock.elapsedRealtime model was last stopped + boolean mIsStarted; // true if model is currently running + } + private final TreeMap mModelStats; + + SoundModelStatTracker() { + mModelStats = new TreeMap(); + } + + public synchronized void onStart(UUID id) { + SoundModelStat stat = mModelStats.get(id); + if (stat == null) { + stat = new SoundModelStat(); + mModelStats.put(id, stat); + } + + if (stat.mIsStarted) { + Slog.e(TAG, "error onStart(): Model " + id + " already started"); + return; + } + + stat.mStartCount++; + stat.mLastStartTimestampMsec = SystemClock.elapsedRealtime(); + stat.mIsStarted = true; + } + + public synchronized void onStop(UUID id) { + SoundModelStat stat = mModelStats.get(id); + if (stat == null) { + Slog.e(TAG, "error onStop(): Model " + id + " has no stats available"); + return; + } + + if (!stat.mIsStarted) { + Slog.e(TAG, "error onStop(): Model " + id + " already stopped"); + return; + } + + stat.mLastStopTimestampMsec = SystemClock.elapsedRealtime(); + stat.mTotalTimeMsec += stat.mLastStopTimestampMsec - stat.mLastStartTimestampMsec; + stat.mIsStarted = false; + } + + public synchronized void dump(PrintWriter pw) { + long curTime = SystemClock.elapsedRealtime(); + pw.println("Model Stats:"); + for (Map.Entry entry : mModelStats.entrySet()) { + UUID uuid = entry.getKey(); + SoundModelStat stat = entry.getValue(); + long totalTimeMsec = stat.mTotalTimeMsec; + if (stat.mIsStarted) { + totalTimeMsec += curTime - stat.mLastStartTimestampMsec; + } + pw.println(uuid + ", total_time(msec)=" + totalTimeMsec + + ", total_count=" + stat.mStartCount + + ", last_start=" + stat.mLastStartTimestampMsec + + ", last_stop=" + stat.mLastStopTimestampMsec); + } + } + } + + private final SoundModelStatTracker mSoundModelStatTracker; /** Number of ops run by the {@link RemoteSoundTriggerDetectionService} per package name */ @GuardedBy("mLock") private final ArrayMap mNumOpsPerPackage = new ArrayMap<>(); @@ -115,6 +191,7 @@ public class SoundTriggerService extends SystemService { mCallbacksLock = new Object(); mCallbacks = new TreeMap<>(); mLock = new Object(); + mSoundModelStatTracker = new SoundModelStatTracker(); } @Override @@ -193,8 +270,12 @@ public class SoundTriggerService extends SystemService { return STATUS_ERROR; } - return mSoundTriggerHelper.startGenericRecognition(parcelUuid.getUuid(), model, + int ret = mSoundTriggerHelper.startGenericRecognition(parcelUuid.getUuid(), model, callback, config); + if (ret == STATUS_OK) { + mSoundModelStatTracker.onStart(parcelUuid.getUuid()); + } + return ret; } @Override @@ -208,7 +289,12 @@ public class SoundTriggerService extends SystemService { + parcelUuid)); if (!isInitialized()) return STATUS_ERROR; - return mSoundTriggerHelper.stopGenericRecognition(parcelUuid.getUuid(), callback); + + int ret = mSoundTriggerHelper.stopGenericRecognition(parcelUuid.getUuid(), callback); + if (ret == STATUS_OK) { + mSoundModelStatTracker.onStop(parcelUuid.getUuid()); + } + return ret; } @Override @@ -252,6 +338,9 @@ public class SoundTriggerService extends SystemService { // Unload the model if it is loaded. mSoundTriggerHelper.unloadGenericSoundModel(soundModelId.getUuid()); mDbHelper.deleteGenericSoundModel(soundModelId.getUuid()); + + // Stop recognition if it is started. + mSoundModelStatTracker.onStop(soundModelId.getUuid()); } @Override @@ -403,6 +492,8 @@ public class SoundTriggerService extends SystemService { synchronized (mCallbacksLock) { mCallbacks.put(soundModelId.getUuid(), callback); } + + mSoundModelStatTracker.onStart(soundModelId.getUuid()); } return STATUS_OK; } @@ -467,6 +558,8 @@ public class SoundTriggerService extends SystemService { synchronized (mCallbacksLock) { mCallbacks.remove(soundModelId.getUuid()); } + + mSoundModelStatTracker.onStop(soundModelId.getUuid()); } return STATUS_OK; } @@ -1266,6 +1359,9 @@ public class SoundTriggerService extends SystemService { mSoundTriggerHelper.dump(fd, pw, args); // log sEventLogger.dump(pw); + + // stats + mSoundModelStatTracker.dump(pw); } private synchronized boolean isInitialized() { -- GitLab From c3fec689002bf6668cbe1b88021d625aaa51adb8 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Thu, 6 Jun 2019 18:11:07 -0700 Subject: [PATCH 092/620] Removed the AmbientPulseManager We only want a single pulse manager since notifications need to dynamically switch from pulsing to heads up in the future. Bug: 130327302 Change-Id: I0cbf23a69f33850776df81c4616932409670fe67 --- core/java/android/app/Notification.java | 21 +-- packages/SystemUI/res/values/config.xml | 5 +- .../src/com/android/systemui/Dependency.java | 3 - .../systemui/bubbles/BubbleExpandedView.java | 2 - .../statusbar/AmbientPulseManager.java | 162 ------------------ .../systemui/statusbar/NotificationShelf.java | 16 +- .../NotificationViewHierarchyManager.java | 1 - .../NotificationAlertingManager.java | 40 ++--- ...NotificationInterruptionStateProvider.java | 56 +++--- .../NotificationWakeUpCoordinator.kt | 27 +-- .../collection/NotificationData.java | 2 - .../collection/NotificationEntry.java | 12 +- .../collection/NotificationRowBinderImpl.java | 16 +- .../logging/NotificationLogger.java | 7 +- .../row/ActivatableNotificationView.java | 19 +- .../row/ExpandableNotificationRow.java | 132 ++++++-------- .../notification/row/ExpandableView.java | 18 +- .../row/NotificationContentInflater.java | 124 ++------------ .../row/NotificationContentView.java | 119 +------------ .../row/NotificationGutsManager.java | 3 - .../notification/row/NotificationMenuRow.java | 3 +- .../notification/stack/AmbientState.java | 15 +- .../notification/stack/AnimationFilter.java | 8 - .../stack/ExpandableViewState.java | 8 - .../stack/NotificationChildrenContainer.java | 7 +- .../stack/NotificationRoundnessManager.java | 24 +-- .../stack/NotificationSection.java | 2 +- .../stack/NotificationStackScrollLayout.java | 77 +++------ .../stack/StackScrollAlgorithm.java | 9 +- .../stack/StackStateAnimator.java | 3 +- .../statusbar/phone/HeadsUpManagerPhone.java | 86 ++++++++-- .../NotificationGroupAlertTransferHelper.java | 55 ++---- .../phone/NotificationGroupManager.java | 17 +- .../phone/NotificationPanelView.java | 1 - .../systemui/statusbar/phone/StatusBar.java | 44 ++--- .../StatusBarNotificationActivityStarter.java | 3 +- .../phone/StatusBarNotificationPresenter.java | 10 +- .../statusbar/policy/HeadsUpManager.java | 4 +- .../policy/OnHeadsUpChangedListener.java | 4 +- .../statusbar/AmbientPulseManagerTest.java | 79 --------- .../statusbar/NotificationTestHelper.java | 12 +- .../NotificationEntryManagerTest.java | 5 +- .../notification/NotificationFilterTest.java | 3 +- .../collection/NotificationDataTest.java | 3 +- .../row/ExpandableNotificationRowTest.java | 12 +- .../row/NotificationContentInflaterTest.java | 8 +- .../row/NotificationContentViewTest.java | 20 +-- .../NotificationRoundnessManagerTest.java | 14 +- .../NotificationStackScrollLayoutTest.java | 13 +- .../phone/HeadsUpManagerPhoneTest.java | 38 +++- ...ificationGroupAlertTransferHelperTest.java | 9 +- .../phone/NotificationGroupManagerTest.java | 25 +-- .../phone/NotificationPanelViewTest.java | 3 +- .../statusbar/phone/StatusBarTest.java | 18 +- 54 files changed, 420 insertions(+), 1007 deletions(-) delete mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java delete mode 100644 packages/SystemUI/tests/src/com/android/systemui/statusbar/AmbientPulseManagerTest.java diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 789351e0d157..475dccb0923e 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -3386,11 +3386,7 @@ public class Notification implements Parcelable */ private int mCachedContrastColor = COLOR_INVALID; private int mCachedContrastColorIsFor = COLOR_INVALID; - /** - * Caches a ambient version of {@link #mCachedAmbientColorIsFor}. - */ - private int mCachedAmbientColor = COLOR_INVALID; - private int mCachedAmbientColorIsFor = COLOR_INVALID; + /** * A neutral color color that can be used for icons. */ @@ -5445,22 +5441,9 @@ public class Notification implements Parcelable */ @UnsupportedAppUsage public RemoteViews makePublicContentView() { - return makePublicView(false /* ambient */); - } - - /** - * Construct a RemoteViews for the display in public contexts like on the lockscreen. - * - * @hide - */ - public RemoteViews makePublicAmbientNotification() { - return makePublicView(true /* ambient */); - } - - private RemoteViews makePublicView(boolean ambient) { if (mN.publicVersion != null) { final Builder builder = recoverBuilder(mContext, mN.publicVersion); - return ambient ? builder.makeAmbientNotification() : builder.createContentView(); + return builder.createContentView(); } Bundle savedBundle = mN.extras; Style style = mStyle; diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 6039568cab3a..375325b7f875 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -147,10 +147,7 @@ - 10000 - - - 2000 + 10000 6000 diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index 7a82402fda13..0ee9bff50bf3 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -54,7 +54,6 @@ import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.DevicePolicyManagerWrapper; import com.android.systemui.shared.system.PackageManagerWrapper; -import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.NavigationBarController; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationLockscreenUserManager; @@ -268,7 +267,6 @@ public class Dependency extends SystemUI { @Inject Lazy mVisualStabilityManager; @Inject Lazy mNotificationGutsManager; @Inject Lazy mNotificationMediaManager; - @Inject Lazy mAmbientPulseManager; @Inject Lazy mNotificationBlockingHelperManager; @Inject Lazy mNotificationRemoteInputManager; @Inject Lazy mSmartReplyConstants; @@ -449,7 +447,6 @@ public class Dependency extends SystemUI { mNotificationGroupAlertTransferHelper::get); mProviders.put(NotificationMediaManager.class, mNotificationMediaManager::get); mProviders.put(NotificationGutsManager.class, mNotificationGutsManager::get); - mProviders.put(AmbientPulseManager.class, mAmbientPulseManager::get); mProviders.put(NotificationBlockingHelperManager.class, mNotificationBlockingHelperManager::get); mProviders.put(NotificationRemoteInputManager.class, diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java index 7b58c5de4813..923ca20b3925 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java @@ -499,7 +499,6 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList view.setHeadsUp(false); view.resetTranslation(); view.setOnKeyguard(false); - view.setOnAmbient(false); view.setClipBottomAmount(0); view.setClipTopAmount(0); view.setContentTransformationAmount(0, false); @@ -515,7 +514,6 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList viewState.gone = false; viewState.hidden = false; viewState.dimmed = false; - viewState.dozing = false; viewState.alpha = 1f; viewState.notGoneIndex = -1; viewState.xTranslation = 0; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java deleted file mode 100644 index 5f878cee12d6..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.statusbar; - -import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_AMBIENT; - -import android.annotation.NonNull; -import android.content.Context; -import android.content.res.Resources; -import android.util.ArraySet; - -import com.android.internal.annotations.VisibleForTesting; -import com.android.systemui.R; -import com.android.systemui.statusbar.notification.collection.NotificationEntry; -import com.android.systemui.statusbar.notification.row.NotificationContentInflater.InflationFlag; - -import javax.inject.Inject; -import javax.inject.Singleton; - -/** - * Manager which handles high priority notifications that should "pulse" in when the device is - * dozing and/or in AOD. The pulse uses the notification's ambient view and pops in briefly - * before automatically dismissing the alert. - */ -@Singleton -public class AmbientPulseManager extends AlertingNotificationManager { - - protected final ArraySet mListeners = new ArraySet<>(); - @VisibleForTesting - protected long mExtensionTime; - - @Inject - public AmbientPulseManager(@NonNull final Context context) { - Resources resources = context.getResources(); - mAutoDismissNotificationDecay = resources.getInteger(R.integer.ambient_notification_decay); - mMinimumDisplayTime = resources.getInteger(R.integer.ambient_notification_minimum_time); - mExtensionTime = resources.getInteger(R.integer.ambient_notification_extension_time); - } - - /** - * Adds an OnAmbientChangedListener to observe events. - */ - public void addListener(@NonNull OnAmbientChangedListener listener) { - mListeners.add(listener); - } - - /** - * Removes the OnAmbientChangedListener from the observer list. - */ - public void removeListener(@NonNull OnAmbientChangedListener listener) { - mListeners.remove(listener); - } - - /** - * Extends the lifetime of the currently showing pulsing notification so that the pulse lasts - * longer. - */ - public void extendPulse() { - AmbientEntry topEntry = getTopEntry(); - if (topEntry == null) { - return; - } - topEntry.extendPulse(); - } - - public @InflationFlag int getContentFlag() { - return FLAG_CONTENT_VIEW_AMBIENT; - } - - @Override - protected void onAlertEntryAdded(AlertEntry alertEntry) { - NotificationEntry entry = alertEntry.mEntry; - entry.setAmbientPulsing(true); - for (OnAmbientChangedListener listener : mListeners) { - listener.onAmbientStateChanged(entry, true); - } - } - - @Override - protected void onAlertEntryRemoved(AlertEntry alertEntry) { - NotificationEntry entry = alertEntry.mEntry; - entry.setAmbientPulsing(false); - for (OnAmbientChangedListener listener : mListeners) { - listener.onAmbientStateChanged(entry, false); - } - entry.freeContentViewWhenSafe(FLAG_CONTENT_VIEW_AMBIENT); - } - - @Override - protected AlertEntry createAlertEntry() { - return new AmbientEntry(); - } - - /** - * Get the top pulsing entry. This should be the currently showing one if there are multiple. - * @return the currently showing entry - */ - private AmbientEntry getTopEntry() { - if (mAlertEntries.isEmpty()) { - return null; - } - AlertEntry topEntry = null; - for (AlertEntry entry : mAlertEntries.values()) { - if (topEntry == null || entry.compareTo(topEntry) < 0) { - topEntry = entry; - } - } - return (AmbientEntry) topEntry; - } - - /** - * Observer interface for any changes in the ambient entries. - */ - public interface OnAmbientChangedListener { - /** - * Called when an entry starts or stops pulsing. - * @param entry the entry that changed - * @param isPulsing true if the entry is now pulsing, false otherwise - */ - void onAmbientStateChanged(@NonNull NotificationEntry entry, boolean isPulsing); - } - - private final class AmbientEntry extends AlertEntry { - private boolean extended; - - /** - * Extend the lifetime of the alertEntry so that it auto-removes later. Can only be - * extended once. - */ - private void extendPulse() { - if (!extended) { - extended = true; - updateEntry(false); - } - } - - @Override - public void reset() { - super.reset(); - extended = false; - } - - @Override - protected long calculateFinishTime() { - return super.calculateFinishTime() + (extended ? mExtensionTime : 0); - } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 9ffb78c10939..0a8b7f8aa0da 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -477,8 +477,12 @@ public class NotificationShelf extends ActivatableNotificationView implements float viewEnd = row.getTranslationY() + row.getActualHeight(); boolean isPinned = (row.isPinned() || row.isHeadsUpAnimatingAway()) && !mAmbientState.isDozingAndNotPulsing(row); - boolean shouldClipOwnTop = row.showingAmbientPulsing() - || (mAmbientState.isPulseExpanding() && childIndex == 0); + boolean shouldClipOwnTop; + if (mAmbientState.isPulseExpanding()) { + shouldClipOwnTop = childIndex == 0; + } else { + shouldClipOwnTop = row.showingPulsing(); + } if (viewEnd > notificationClipEnd && !shouldClipOwnTop && (mAmbientState.isShadeExpanded() || !isPinned)) { int clipBottomAmount = (int) (viewEnd - notificationClipEnd); @@ -647,7 +651,7 @@ public class NotificationShelf extends ActivatableNotificationView implements ? fullTransitionAmount : transitionAmount; iconState.clampedAppearAmount = clampedAmount; - float contentTransformationAmount = !row.isAboveShelf() + float contentTransformationAmount = !row.isAboveShelf() && !row.showingPulsing() && (isLastChild || iconState.translateContent) ? iconTransitionAmount : 0.0f; @@ -682,7 +686,7 @@ public class NotificationShelf extends ActivatableNotificationView implements } notificationIconPosition += iconTopPadding; float shelfIconPosition = getTranslationY() + icon.getTop(); - float iconSize = mDozing ? mHiddenShelfIconSize : mIconSize; + float iconSize = mAmbientState.isFullyHidden() ? mHiddenShelfIconSize : mIconSize; shelfIconPosition += (icon.getHeight() - icon.getIconScale() * iconSize) / 2.0f; float iconYTranslation = NotificationUtils.interpolate( notificationIconPosition - shelfIconPosition, @@ -717,7 +721,9 @@ public class NotificationShelf extends ActivatableNotificationView implements iconState.scaleY = 1.0f; iconState.hidden = false; } - if (row.isAboveShelf() || (!row.isInShelf() && (isLastChild && row.areGutsExposed() + if (row.isAboveShelf() + || row.showingPulsing() + || (!row.isInShelf() && (isLastChild && row.areGutsExposed() || row.getTranslationZ() > mAmbientState.getBaseZHeight()))) { iconState.hidden = true; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java index b3da62eef35b..964b5dbc4233 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java @@ -364,7 +364,6 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle && !row.isLowPriority())); } - entry.getRow().setOnAmbient(mShadeController.get().isDozing()); int userId = entry.notification.getUserId(); boolean suppressedSummary = mGroupManager.isSummaryOfSuppressedGroup( entry.notification) && !entry.isRowRemoved(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java index f6d3cdfddb31..8a23f718ef9a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java @@ -17,7 +17,6 @@ package com.android.systemui.statusbar.notification; import static com.android.systemui.statusbar.NotificationRemoteInputManager.FORCE_REMOTE_INPUT_HISTORY; -import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_AMBIENT; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_HEADS_UP; import android.app.Notification; @@ -26,7 +25,6 @@ import android.util.Log; import com.android.internal.statusbar.NotificationVisibility; import com.android.systemui.statusbar.AlertingNotificationManager; -import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -45,7 +43,6 @@ public class NotificationAlertingManager { private static final String TAG = "NotifAlertManager"; - private final AmbientPulseManager mAmbientPulseManager; private final NotificationRemoteInputManager mRemoteInputManager; private final VisualStabilityManager mVisualStabilityManager; private final Lazy mShadeController; @@ -57,13 +54,11 @@ public class NotificationAlertingManager { @Inject public NotificationAlertingManager( NotificationEntryManager notificationEntryManager, - AmbientPulseManager ambientPulseManager, NotificationRemoteInputManager remoteInputManager, VisualStabilityManager visualStabilityManager, Lazy shadeController, NotificationInterruptionStateProvider notificationInterruptionStateProvider, NotificationListener notificationListener) { - mAmbientPulseManager = ambientPulseManager; mRemoteInputManager = remoteInputManager; mVisualStabilityManager = visualStabilityManager; mShadeController = shadeController; @@ -108,44 +103,32 @@ public class NotificationAlertingManager { // If it does and we no longer need to heads up, we should free the view. if (mNotificationInterruptionStateProvider.shouldHeadsUp(entry)) { mHeadsUpManager.showNotification(entry); - // Mark as seen immediately - setNotificationShown(entry.notification); + if (!mShadeController.get().isDozing()) { + // Mark as seen immediately + setNotificationShown(entry.notification); + } } else { entry.freeContentViewWhenSafe(FLAG_CONTENT_VIEW_HEADS_UP); } } - if ((inflatedFlags & FLAG_CONTENT_VIEW_AMBIENT) != 0) { - if (mNotificationInterruptionStateProvider.shouldPulse(entry)) { - mAmbientPulseManager.showNotification(entry); - } else { - entry.freeContentViewWhenSafe(FLAG_CONTENT_VIEW_AMBIENT); - } - } } private void updateAlertState(NotificationEntry entry) { boolean alertAgain = alertAgain(entry, entry.notification.getNotification()); - AlertingNotificationManager alertManager; boolean shouldAlert; - if (mShadeController.get().isDozing()) { - alertManager = mAmbientPulseManager; - shouldAlert = mNotificationInterruptionStateProvider.shouldPulse(entry); - } else { - alertManager = mHeadsUpManager; - shouldAlert = mNotificationInterruptionStateProvider.shouldHeadsUp(entry); - } - final boolean wasAlerting = alertManager.isAlerting(entry.key); + shouldAlert = mNotificationInterruptionStateProvider.shouldHeadsUp(entry); + final boolean wasAlerting = mHeadsUpManager.isAlerting(entry.key); if (wasAlerting) { if (!shouldAlert) { // We don't want this to be interrupting anymore, let's remove it - alertManager.removeNotification(entry.key, + mHeadsUpManager.removeNotification(entry.key, false /* ignoreEarliestRemovalTime */); } else { - alertManager.updateNotification(entry.key, alertAgain); + mHeadsUpManager.updateNotification(entry.key, alertAgain); } } else if (shouldAlert && alertAgain) { // This notification was updated to be alerting, show it! - alertManager.showNotification(entry); + mHeadsUpManager.showNotification(entry); } } @@ -171,7 +154,7 @@ public class NotificationAlertingManager { } private void stopAlerting(final String key) { - // Attempt to remove notifications from their alert managers (heads up, ambient pulse). + // Attempt to remove notifications from their alert manager. // Though the remove itself may fail, it lets the manager know to remove as soon as // possible. if (mHeadsUpManager.isAlerting(key)) { @@ -185,8 +168,5 @@ public class NotificationAlertingManager { || !mVisualStabilityManager.isReorderingAllowed(); mHeadsUpManager.removeNotification(key, ignoreEarliestRemovalTime); } - if (mAmbientPulseManager.isAlerting(key)) { - mAmbientPulseManager.removeNotification(key, false /* ignoreEarliestRemovalTime */); - } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java index 926d4b6a79b3..5bab0ef39326 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java @@ -39,6 +39,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.Dependency; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationPresenter; +import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.policy.HeadsUpManager; @@ -186,14 +187,15 @@ public class NotificationInterruptionStateProvider { * @return true if the entry should heads up, false otherwise */ public boolean shouldHeadsUp(NotificationEntry entry) { - StatusBarNotification sbn = entry.notification; - - if (getShadeController().isDozing()) { - if (DEBUG) { - Log.d(TAG, "No heads up: device is dozing: " + sbn.getKey()); - } - return false; + if (mStatusBarStateController.isDozing()) { + return shouldHeadsUpWhenDozing(entry); + } else { + return shouldHeadsUpWhenAwake(entry); } + } + + private boolean shouldHeadsUpWhenAwake(NotificationEntry entry) { + StatusBarNotification sbn = entry.notification; boolean inShade = mStatusBarStateController.getState() == SHADE; if (entry.isBubble() && inShade) { @@ -251,7 +253,7 @@ public class NotificationInterruptionStateProvider { * @param entry the entry to check * @return true if the entry should ambient pulse, false otherwise */ - public boolean shouldPulse(NotificationEntry entry) { + private boolean shouldHeadsUpWhenDozing(NotificationEntry entry) { StatusBarNotification sbn = entry.notification; if (!mAmbientDisplayConfiguration.pulseOnNotificationEnabled(UserHandle.USER_CURRENT)) { @@ -261,13 +263,6 @@ public class NotificationInterruptionStateProvider { return false; } - if (!getShadeController().isDozing()) { - if (DEBUG) { - Log.d(TAG, "No pulsing: not dozing: " + sbn.getKey()); - } - return false; - } - if (!canAlertCommon(entry)) { if (DEBUG) { Log.d(TAG, "No pulsing: notification shouldn't alert: " + sbn.getKey()); @@ -288,24 +283,14 @@ public class NotificationInterruptionStateProvider { } return false; } - - Bundle extras = sbn.getNotification().extras; - CharSequence title = extras.getCharSequence(Notification.EXTRA_TITLE); - CharSequence text = extras.getCharSequence(Notification.EXTRA_TEXT); - if (TextUtils.isEmpty(title) && TextUtils.isEmpty(text)) { - if (DEBUG) { - Log.d(TAG, "No pulsing: title and text are empty: " + sbn.getKey()); - } - return false; - } - - return true; + return true; } /** - * Common checks between heads up alerting and ambient pulse alerting. See + * Common checks between regular heads up and when pulsing. See * {@link #shouldHeadsUp(NotificationEntry)} and - * {@link #shouldPulse(NotificationEntry)}. Notifications that fail any of these checks + * {@link #shouldHeadsUpWhenDozing(NotificationEntry)}. Notifications that fail any of these + * checks * should not alert at all. * * @param entry the entry to check @@ -389,6 +374,19 @@ public class NotificationInterruptionStateProvider { return mPresenter; } + /** + * When an entry was added, should we launch its fullscreen intent? Examples are Alarms or + * incoming calls. + * + * @param entry the entry that was added + * @return {@code true} if we should launch the full screen intent + */ + public boolean shouldLaunchFullScreenIntentWhenAdded(NotificationEntry entry) { + return entry.notification.getNotification().fullScreenIntent != null + && (!shouldHeadsUp(entry) + || mStatusBarStateController.getState() == StatusBarState.KEYGUARD); + } + /** A component which can suppress heads-up notifications due to the overall state of the UI. */ public interface HeadsUpSuppressor { /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt index 0fa6842ca9b1..6dc5fb34f9bd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt @@ -21,14 +21,15 @@ import android.content.Context import android.util.FloatProperty import com.android.systemui.Interpolators import com.android.systemui.plugins.statusbar.StatusBarStateController -import com.android.systemui.statusbar.AmbientPulseManager import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout import com.android.systemui.statusbar.notification.stack.StackStateAnimator import com.android.systemui.statusbar.phone.DozeParameters +import com.android.systemui.statusbar.phone.HeadsUpManagerPhone import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.phone.NotificationIconAreaController +import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener import javax.inject.Inject import javax.inject.Singleton @@ -36,10 +37,10 @@ import javax.inject.Singleton @Singleton class NotificationWakeUpCoordinator @Inject constructor( private val mContext: Context, - private val mAmbientPulseManager: AmbientPulseManager, + private val mHeadsUpManagerPhone: HeadsUpManagerPhone, private val mStatusBarStateController: StatusBarStateController, private val mBypassController: KeyguardBypassController) - : AmbientPulseManager.OnAmbientChangedListener, StatusBarStateController.StateListener { + : OnHeadsUpChangedListener, StatusBarStateController.StateListener { private val mNotificationVisibility = object : FloatProperty("notificationVisibility") { @@ -89,7 +90,7 @@ class NotificationWakeUpCoordinator @Inject constructor( init { - mAmbientPulseManager.addListener(this) + mHeadsUpManagerPhone.addListener(this) mStatusBarStateController.addCallback(this) mDozeParameters = DozeParameters.getInstance(mContext) } @@ -111,13 +112,14 @@ class NotificationWakeUpCoordinator @Inject constructor( // If we stopped expanding and we're still visible because we had a pulse that hasn't // times out, let's release them all to make sure were not stuck in a state where // notifications are visible - mAmbientPulseManager.releaseAllImmediately() + mHeadsUpManagerPhone.releaseAllImmediately() } } private fun updateNotificationVisibility(animate: Boolean, increaseSpeed: Boolean) { - var visible = (mNotificationsVisibleForExpansion || mAmbientPulseManager.hasNotifications()) - && pulsing; + // TODO: handle Lockscreen wakeup for bypass when we're not pulsing anymore + var visible = (mNotificationsVisibleForExpansion || mHeadsUpManagerPhone.hasNotifications()) + && pulsing if (!visible && mNotificationsVisible && (mWakingUp || willWakeUp) && mDozeAmount != 0.0f) { // let's not make notifications invisible while waking up, otherwise the animation // is strange @@ -212,7 +214,7 @@ class NotificationWakeUpCoordinator @Inject constructor( private fun handleAnimationFinished() { if (mLinearDozeAmount == 0.0f || mLinearVisibilityAmount == 0.0f) { - mEntrySetToClearWhenFinished.forEach { it.setAmbientGoingAway(false) } + mEntrySetToClearWhenFinished.forEach { it.setHeadsUpAnimatingAway(false) } mEntrySetToClearWhenFinished.clear() } } @@ -251,22 +253,23 @@ class NotificationWakeUpCoordinator @Inject constructor( } } - override fun onAmbientStateChanged(entry: NotificationEntry, isPulsing: Boolean) { + override fun onHeadsUpStateChanged(entry: NotificationEntry, isHeadsUp: Boolean) { var animate = shouldAnimateVisibility() - if (!isPulsing) { + if (!isHeadsUp) { if (mLinearDozeAmount != 0.0f && mLinearVisibilityAmount != 0.0f) { if (entry.isRowDismissed) { // if we animate, we see the shelf briefly visible. Instead we fully animate // the notification and its background out animate = false } else if (!mWakingUp && !willWakeUp){ - entry.setAmbientGoingAway(true) + // TODO: look that this is done properly and not by anyone else + entry.setHeadsUpAnimatingAway(true) mEntrySetToClearWhenFinished.add(entry) } } } else if (mEntrySetToClearWhenFinished.contains(entry)) { mEntrySetToClearWhenFinished.remove(entry) - entry.setAmbientGoingAway(false) + entry.setHeadsUpAnimatingAway(false) } updateNotificationVisibility(animate, increaseSpeed = false) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java index 64b2f048ce2e..fca520fe0521 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java @@ -114,8 +114,6 @@ public class NotificationData { } else if (isHeadsUp) { // Provide consistent ranking with headsUpManager return mHeadsUpManager.compare(a, b); - } else if (a.getRow().showingAmbientPulsing() != b.getRow().showingAmbientPulsing()) { - return a.getRow().showingAmbientPulsing() ? -1 : 1; } else if (aMedia != bMedia) { // Upsort current media notification. return aMedia ? -1 : 1; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index 5371bd9e0d3a..abcdc7a2925f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -628,10 +628,6 @@ public final class NotificationEntry { if (row != null) row.freeContentViewWhenSafe(inflationFlag); } - public void setAmbientPulsing(boolean pulsing) { - if (row != null) row.setAmbientPulsing(pulsing); - } - public boolean rowExists() { return row != null; } @@ -660,10 +656,6 @@ public final class NotificationEntry { if (row != null) row.setPinned(pinned); } - public boolean isRowAnimatingAway() { - return row != null && row.isHeadsUpAnimatingAway(); - } - public boolean isRowHeadsUp() { return row != null && row.isHeadsUp(); } @@ -673,8 +665,8 @@ public final class NotificationEntry { } - public void setAmbientGoingAway(boolean goingAway) { - if (row != null) row.setAmbientGoingAway(goingAway); + public void setHeadsUpAnimatingAway(boolean animatingAway) { + if (row != null) row.setHeadsUpAnimatingAway(animatingAway); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRowBinderImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRowBinderImpl.java index d3e5af8c729e..247c31fc80a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRowBinderImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRowBinderImpl.java @@ -18,7 +18,6 @@ package com.android.systemui.statusbar.notification.collection; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.systemui.statusbar.NotificationRemoteInputManager.ENABLE_REMOTE_INPUT; -import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_AMBIENT; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_HEADS_UP; import android.annotation.Nullable; @@ -34,6 +33,7 @@ import com.android.internal.util.NotificationMessagingUtil; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.UiOffloadThread; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationPresenter; import com.android.systemui.statusbar.NotificationRemoteInputManager; @@ -47,6 +47,7 @@ import com.android.systemui.statusbar.notification.row.NotificationContentInflat import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.row.RowInflaterTask; import com.android.systemui.statusbar.notification.stack.NotificationListContainer; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.HeadsUpManager; @@ -69,6 +70,8 @@ public class NotificationRowBinderImpl implements NotificationRowBinder { private final ExpandableNotificationRow.ExpansionLogger mExpansionLogger = this::logNotificationExpansion; private final boolean mAllowLongPress; + private final KeyguardBypassController mKeyguardBypassController; + private final StatusBarStateController mStatusBarStateController; private NotificationRemoteInputManager mRemoteInputManager; private NotificationPresenter mPresenter; @@ -80,10 +83,14 @@ public class NotificationRowBinderImpl implements NotificationRowBinder { private NotificationClicker mNotificationClicker; private final NotificationLogger mNotificationLogger = Dependency.get(NotificationLogger.class); - public NotificationRowBinderImpl(Context context, boolean allowLongPress) { + public NotificationRowBinderImpl(Context context, boolean allowLongPress, + KeyguardBypassController keyguardBypassController, + StatusBarStateController statusBarStateController) { mContext = context; mMessagingUtil = new NotificationMessagingUtil(context); mAllowLongPress = allowLongPress; + mKeyguardBypassController = keyguardBypassController; + mStatusBarStateController = statusBarStateController; } private NotificationRemoteInputManager getRemoteInputManager() { @@ -144,6 +151,8 @@ public class NotificationRowBinderImpl implements NotificationRowBinder { StatusBarNotification sbn, ExpandableNotificationRow row, Runnable onDismissRunnable) { row.setExpansionLogger(mExpansionLogger, entry.notification.getKey()); + row.setBypassController(mKeyguardBypassController); + row.setStatusBarStateController(mStatusBarStateController); row.setGroupManager(mGroupManager); row.setHeadsUpManager(mHeadsUpManager); row.setOnExpandClickListener(mPresenter); @@ -249,9 +258,6 @@ public class NotificationRowBinderImpl implements NotificationRowBinder { if (mNotificationInterruptionStateProvider.shouldHeadsUp(entry)) { row.updateInflationFlag(FLAG_CONTENT_VIEW_HEADS_UP, true /* shouldInflate */); } - if (mNotificationInterruptionStateProvider.shouldPulse(entry)) { - row.updateInflationFlag(FLAG_CONTENT_VIEW_AMBIENT, true /* shouldInflate */); - } row.setNeedsRedaction( Dependency.get(NotificationLockscreenUserManager.class).needsRedaction(entry)); row.inflateViews(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java index 94f7e651d73d..81275fda57e5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java @@ -101,7 +101,7 @@ public class NotificationLogger implements StateListener { // Tracks notifications currently visible in mNotificationStackScroller and // emits visibility events via NoMan on changes. - protected final Runnable mVisibilityReporter = new Runnable() { + protected Runnable mVisibilityReporter = new Runnable() { private final ArraySet mTmpNewlyVisibleNotifications = new ArraySet<>(); private final ArraySet mTmpCurrentlyVisibleNotifications = @@ -407,6 +407,11 @@ public class NotificationLogger implements StateListener { mExpansionStateLogger.onExpansionChanged(key, isUserAction, isExpanded, location); } + @VisibleForTesting + public void setVisibilityReporter(Runnable visibilityReporter) { + mVisibilityReporter = visibilityReporter; + } + /** * A listener that is notified when some child locations might have changed. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java index 11321cffd25b..6d9d5ec7ef2d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java @@ -99,7 +99,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView private final DoubleTapHelper mDoubleTapHelper; private boolean mDimmed; - protected boolean mDozing; protected int mBgTint = NO_COLOR; private float mBgAlpha = 1f; @@ -434,16 +433,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView return true; } - public void setDozing(boolean dozing, boolean fade, long delay) { - super.setDozing(dozing, fade, delay); - if (mDozing == dozing) { - return; - } - mDozing = dozing; - updateBackground(); - updateBackgroundTint(false); - } - private void updateOutlineAlpha() { float alpha = NotificationStackScrollLayout.BACKGROUND_ALPHA_DIMMED; alpha = (alpha + (1.0f - alpha) * mNormalBackgroundVisibilityAmount); @@ -536,10 +525,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView * used and the background color not at all. */ public void setOverrideTintColor(int color, float overrideAmount) { - if (mDozing) { - color = NO_COLOR; - overrideAmount = 0; - } mOverrideTint = color; mOverrideAmount = overrideAmount; int newColor = calculateBgColor(); @@ -1051,6 +1036,10 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView return false; } + public boolean isHeadsUp() { + return false; + } + public interface OnActivatedListener { void onActivated(ActivatableNotificationView view); void onActivationReset(ActivatableNotificationView view); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index a27c15b80276..6b94a85e331e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -17,11 +17,9 @@ package com.android.systemui.statusbar.notification.row; import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator.ExpandAnimationParameters; -import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_AMBIENT; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_HEADS_UP; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_PUBLIC; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.InflationCallback; -import static com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_AMBIENT; import static com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_CONTRACTED; import static com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_HEADSUP; @@ -81,6 +79,7 @@ import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.PluginListener; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.RemoteInputController; @@ -98,6 +97,7 @@ import com.android.systemui.statusbar.notification.stack.AnimationProperties; import com.android.systemui.statusbar.notification.stack.ExpandableViewState; import com.android.systemui.statusbar.notification.stack.NotificationChildrenContainer; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.HeadsUpManager; @@ -127,14 +127,16 @@ public class ExpandableNotificationRow extends ActivatableNotificationView private static final long RECENTLY_ALERTED_THRESHOLD_MS = TimeUnit.SECONDS.toMillis(30); private boolean mUpdateBackgroundOnUpdate; private boolean mNotificationTranslationFinished = false; - /** * Listener for when {@link ExpandableNotificationRow} is laid out. */ public interface LayoutListener { void onLayout(); + } + private StatusBarStateController mStatusbarStateController; + private KeyguardBypassController mBypassController; private LayoutListener mLayoutListener; private final NotificationContentInflater mNotificationInflater; private int mIconTransformContentShift; @@ -187,11 +189,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView */ private boolean mOnKeyguard; - /** - * Whether or not the row is currently on the doze screen. - */ - private boolean mOnAmbient; - private Animator mTranslateAnim; private ArrayList mTranslateableViews; private NotificationContentView mPublicLayout; @@ -210,17 +207,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView */ private boolean mIsHeadsUp; - /** - * Whether or not the notification is using the ambient display view and is pulsing. This - * occurs when a high priority notification alerts while the phone is dozing or is on AOD. - */ - private boolean mIsAmbientPulsing; - - /** - * Happens when the notification was pulsing before and goes away to ensure smooth animations. - */ - private boolean mAmbientGoingAway; - /** * Whether or not the notification should be redacted on the lock screen, i.e has sensitive * content which should be redacted on the lock screen. @@ -341,7 +327,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView private SystemNotificationAsyncTask mSystemNotificationAsyncTask = new SystemNotificationAsyncTask(); - private int mStatusBarState = -1; /** * Returns whether the given {@code statusBarNotification} is a system notification. @@ -487,12 +472,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView getPrivateLayout().performWhenContentInactive(VISIBLE_TYPE_HEADSUP, freeViewRunnable); break; - case FLAG_CONTENT_VIEW_AMBIENT: - getPrivateLayout().performWhenContentInactive(VISIBLE_TYPE_AMBIENT, - freeViewRunnable); - getPublicLayout().performWhenContentInactive(VISIBLE_TYPE_AMBIENT, - freeViewRunnable); - break; case FLAG_CONTENT_VIEW_PUBLIC: getPublicLayout().performWhenContentInactive(VISIBLE_TYPE_CONTRACTED, freeViewRunnable); @@ -648,7 +627,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView if (!getShowingLayout().isDimmable()) { return false; } - if (showingAmbientPulsing()) { + if (showingPulsing()) { return false; } return super.isDimmable(); @@ -698,7 +677,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView if (headsUpWrapper != null) { headsUpHeight = Math.max(headsUpHeight, headsUpWrapper.getMinLayoutHeight()); } - layout.setHeights(minHeight, headsUpHeight, mNotificationMaxHeight, headsUpHeight); + layout.setHeights(minHeight, headsUpHeight, mNotificationMaxHeight); } public StatusBarNotification getStatusBarNotification() { @@ -709,6 +688,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView return mEntry; } + @Override public boolean isHeadsUp() { return mIsHeadsUp; } @@ -734,14 +714,18 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } @Override - public boolean showingAmbientPulsing() { - return mIsAmbientPulsing || mAmbientGoingAway; + public boolean showingPulsing() { + return isHeadsUpState() && (isDozing()) || (mOnKeyguard && isBypassEnabled()); } - public void setAmbientPulsing(boolean isAmbientPulsing) { - mIsAmbientPulsing = isAmbientPulsing; + /** + * @return if the view is in heads up state, i.e either still heads upped or it's disappearing. + */ + public boolean isHeadsUpState() { + return mIsHeadsUp || mHeadsupDisappearRunning; } + public void setGroupManager(NotificationGroupManager groupManager) { mGroupManager = groupManager; mPrivateLayout.setGroupManager(groupManager); @@ -1660,6 +1644,14 @@ public class ExpandableNotificationRow extends ActivatableNotificationView initDimens(); } + public void setBypassController(KeyguardBypassController bypassController) { + mBypassController = bypassController; + } + + public void setStatusBarStateController(StatusBarStateController statusBarStateController) { + mStatusbarStateController = statusBarStateController; + } + private void initDimens() { mNotificationMinHeightBeforeN = NotificationUtils.getFontScaledHeight(mContext, R.dimen.notification_min_height_legacy); @@ -2050,23 +2042,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView return false; } - @Override - public void setDozing(boolean dozing, boolean fade, long delay) { - if (mDozing == dozing) { - return; - } - super.setDozing(dozing, fade, delay); - if (!mIsAmbientPulsing) { - // Only fade the showing view of the pulsing notification. - fade = false; - } - final NotificationContentView showing = getShowingLayout(); - if (showing != null) { - showing.setDozing(dozing, fade, delay); - } - updateShelfIconColor(); - } - public void applyExpandAnimationParams(ExpandAnimationParameters params) { if (params == null) { return; @@ -2180,7 +2155,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView */ @Override public boolean isSoundEffectsEnabled() { - final boolean mute = mDozing && mSecureStateProvider != null && + final boolean mute = mStatusbarStateController != null + && mStatusbarStateController.isDozing() + && mSecureStateProvider != null && !mSecureStateProvider.getAsBoolean(); return !mute && super.isSoundEffectsEnabled(); } @@ -2345,9 +2322,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView return mPrivateLayout.getMinHeight(); } else if (mSensitive && mHideSensitiveForIntrinsicHeight) { return getMinHeight(); - } else if (mIsSummaryWithChildren && !mOnKeyguard) { + } else if (mIsSummaryWithChildren) { return mChildrenContainer.getIntrinsicHeight(); - } else if (isHeadsUpAllowed() && (mIsHeadsUp || mHeadsupDisappearRunning)) { + } else if (canShowHeadsUp() && isHeadsUpState()) { if (isPinned() || mHeadsupDisappearRunning) { return getPinnedHeadsUpHeight(true /* atLeastMinHeight */); } else if (isExpanded()) { @@ -2362,22 +2339,27 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } } - private boolean isHeadsUpAllowed() { - return !mOnKeyguard && !mOnAmbient; + /** + * @return {@code true} if the notification can show it's heads up layout. This is mostly true + * except for legacy use cases. + */ + public boolean canShowHeadsUp() { + if (mOnKeyguard && !isDozing() && !isBypassEnabled()) { + return false; + } + return true; } - private boolean isShownAsBubble() { - return mEntry.isBubble() && !mEntry.showInShadeWhenBubble() && !mEntry.isBubbleDismissed(); + private boolean isBypassEnabled() { + return mBypassController == null || mBypassController.getBypassEnabled(); } - /** - * Set the current status bar state. - * @param state should be from {@link com.android.systemui.statusbar.StatusBarState}. - */ - public void setStatusBarState(int state) { - if (mStatusBarState != state) { - mStatusBarState = state; - } + private boolean isDozing() { + return mStatusbarStateController != null && mStatusbarStateController.isDozing(); + } + + private boolean isShownAsBubble() { + return mEntry.isBubble() && !mEntry.showInShadeWhenBubble() && !mEntry.isBubbleDismissed(); } @Override @@ -2563,7 +2545,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView showingLayout.updateBackgroundColor(animated); mPrivateLayout.updateExpandButtons(isExpandable()); updateShelfIconColor(); - showingLayout.setDozing(isDozing(), false /* animate */, 0 /* delay */); mShowingPublicInitialized = true; } @@ -2773,12 +2754,12 @@ public class ExpandableNotificationRow extends ActivatableNotificationView public int getMinHeight(boolean ignoreTemporaryStates) { if (!ignoreTemporaryStates && mGuts != null && mGuts.isExposed()) { return mGuts.getIntrinsicHeight(); - } else if (!ignoreTemporaryStates && isHeadsUpAllowed() && mIsHeadsUp + } else if (!ignoreTemporaryStates && canShowHeadsUp() && mIsHeadsUp && mHeadsUpManager.isTrackingHeadsUp()) { return getPinnedHeadsUpHeight(false /* atLeastMinHeight */); } else if (mIsSummaryWithChildren && !isGroupExpanded() && !shouldShowPublic()) { return mChildrenContainer.getMinHeight(); - } else if (!ignoreTemporaryStates && isHeadsUpAllowed() && mIsHeadsUp) { + } else if (!ignoreTemporaryStates && canShowHeadsUp() && mIsHeadsUp) { return getHeadsUpHeight(); } NotificationContentView showingLayout = getShowingLayout(); @@ -3050,18 +3031,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView @Override public boolean isAboveShelf() { - return showingAmbientPulsing() || (!isOnKeyguard() + return (canShowHeadsUp() && (mIsPinned || mHeadsupDisappearRunning || (mIsHeadsUp && mAboveShelf) || mExpandAnimationRunning || mChildIsExpanding)); } - public void setOnAmbient(boolean onAmbient) { - if (onAmbient != mOnAmbient) { - mOnAmbient = onAmbient; - notifyHeightChanged(false /* needsAnimation */); - } - } - @Override public boolean topAmountNeedsClipping() { if (isGroupExpanded()) { @@ -3125,10 +3099,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView return getCurrentBottomRoundness() == 0.0f && getCurrentTopRoundness() == 0.0f; } - public boolean isOnAmbient() { - return mOnAmbient; - } - //TODO: this logic can't depend on layout if we are recycling! public boolean isMediaRow() { return getExpandedContentView() != null @@ -3206,10 +3176,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } } - public void setAmbientGoingAway(boolean goingAway) { - mAmbientGoingAway = goingAway; - } - /** * Returns the Smart Suggestions backing the smart suggestion buttons in the notification. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java index 30b53383bb74..a0fef0068b05 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java @@ -49,7 +49,6 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable { protected int mClipBottomAmount; protected int mMinimumHeightForClipping = 0; protected float mExtraWidthForClipping = 0; - private boolean mDozing; private ArrayList mMatchParentViews = new ArrayList(); private static Rect mClipRect = new Rect(); private boolean mWillBeGone; @@ -212,21 +211,6 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable { public void setDimmed(boolean dimmed, boolean fade) { } - /** - * Sets the notification as dozing. The default implementation does nothing. - * - * @param dozing Whether the notification should be dozing. - * @param fade Whether an animation should be played to change the state. - * @param delay If fading, the delay of the animation. - */ - public void setDozing(boolean dozing, boolean fade, long delay) { - mDozing = dozing; - } - - public boolean isDozing() { - return mDozing; - } - public boolean isRemoved() { return false; } @@ -527,7 +511,7 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable { public void setHeadsUpIsVisible() { } - public boolean showingAmbientPulsing() { + public boolean showingPulsing() { return false; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java index 396cd73f9a22..d057a1d2f20b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.notification.row; -import static com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_AMBIENT; import static com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_CONTRACTED; import static com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_HEADSUP; @@ -51,12 +50,6 @@ import com.android.systemui.util.Assert; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.HashMap; -import java.util.concurrent.Executor; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; /** * A utility that inflates the right kind of contentView based on the state @@ -72,7 +65,6 @@ public class NotificationContentInflater { FLAG_CONTENT_VIEW_CONTRACTED, FLAG_CONTENT_VIEW_EXPANDED, FLAG_CONTENT_VIEW_HEADS_UP, - FLAG_CONTENT_VIEW_AMBIENT, FLAG_CONTENT_VIEW_PUBLIC, FLAG_CONTENT_VIEW_ALL}) public @interface InflationFlag {} @@ -92,18 +84,12 @@ public class NotificationContentInflater { */ public static final int FLAG_CONTENT_VIEW_HEADS_UP = 1 << 2; - /** - * The ambient view. Seen when a high priority notification is received and the phone - * is dozing. - */ - public static final int FLAG_CONTENT_VIEW_AMBIENT = 1 << 3; - /** * The public view. This is a version of the contracted view that hides sensitive * information and is used on the lock screen if we determine that the notification's * content should be hidden. */ - public static final int FLAG_CONTENT_VIEW_PUBLIC = 1 << 4; + public static final int FLAG_CONTENT_VIEW_PUBLIC = 1 << 3; public static final int FLAG_CONTENT_VIEW_ALL = ~0; @@ -128,7 +114,6 @@ public class NotificationContentInflater { private RemoteViews.OnClickHandler mRemoteViewClickHandler; private boolean mIsChildInGroup; private InflationCallback mCallback; - private boolean mRedactAmbient; private boolean mInflateSynchronously = false; private final ArrayMap mCachedContentViews = new ArrayMap<>(); @@ -169,21 +154,18 @@ public class NotificationContentInflater { /** * Update whether or not the notification is redacted on the lock screen. If the notification - * is now redacted, we should inflate the public contracted view and public ambient view to - * now show on the lock screen. + * is now redacted, we should inflate the public contracted view to now show on the lock screen. * * @param needsRedaction true if the notification should now be redacted on the lock screen */ public void updateNeedsRedaction(boolean needsRedaction) { - mRedactAmbient = needsRedaction; if (mRow.getEntry() == null) { return; } - int flags = FLAG_CONTENT_VIEW_AMBIENT; if (needsRedaction) { - flags |= FLAG_CONTENT_VIEW_PUBLIC; + int flags = FLAG_CONTENT_VIEW_PUBLIC; + inflateNotificationViews(flags); } - inflateNotificationViews(flags); } /** @@ -263,7 +245,6 @@ public class NotificationContentInflater { mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight, - mRedactAmbient, mCallback, mRemoteViewClickHandler); if (mInflateSynchronously) { @@ -281,7 +262,7 @@ public class NotificationContentInflater { Context packageContext) { InflationProgress result = createRemoteViews(reInflateFlags, builder, mIsLowPriority, mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight, - mRedactAmbient, packageContext); + packageContext); result = inflateSmartReplyViews(result, reInflateFlags, mRow.getEntry(), mRow.getContext(), mRow.getHeadsUpManager(), mRow.getExistingSmartRepliesAndActions()); @@ -291,7 +272,6 @@ public class NotificationContentInflater { reInflateFlags, mCachedContentViews, mRow, - mRedactAmbient, mRemoteViewClickHandler, null); return result; @@ -316,21 +296,6 @@ public class NotificationContentInflater { mRow.getPrivateLayout().setHeadsUpInflatedSmartReplies(null); } break; - case FLAG_CONTENT_VIEW_AMBIENT: - boolean privateSafeToRemove = mRow.getPrivateLayout().isContentViewInactive( - VISIBLE_TYPE_AMBIENT); - boolean publicSafeToRemove = mRow.getPublicLayout().isContentViewInactive( - VISIBLE_TYPE_AMBIENT); - if (privateSafeToRemove) { - mRow.getPrivateLayout().setAmbientChild(null); - } - if (publicSafeToRemove) { - mRow.getPublicLayout().setAmbientChild(null); - } - if (privateSafeToRemove && publicSafeToRemove) { - mCachedContentViews.remove(FLAG_CONTENT_VIEW_AMBIENT); - } - break; case FLAG_CONTENT_VIEW_PUBLIC: if (mRow.getPublicLayout().isContentViewInactive(VISIBLE_TYPE_CONTRACTED)) { mRow.getPublicLayout().setContractedChild(null); @@ -366,7 +331,7 @@ public class NotificationContentInflater { private static InflationProgress createRemoteViews(@InflationFlag int reInflateFlags, Notification.Builder builder, boolean isLowPriority, boolean isChildInGroup, - boolean usesIncreasedHeight, boolean usesIncreasedHeadsUpHeight, boolean redactAmbient, + boolean usesIncreasedHeight, boolean usesIncreasedHeadsUpHeight, Context packageContext) { InflationProgress result = new InflationProgress(); isLowPriority = isLowPriority && !isChildInGroup; @@ -387,10 +352,6 @@ public class NotificationContentInflater { result.newPublicView = builder.makePublicContentView(); } - if ((reInflateFlags & FLAG_CONTENT_VIEW_AMBIENT) != 0) { - result.newAmbientView = redactAmbient ? builder.makePublicAmbientNotification() - : builder.makeAmbientNotification(); - } result.packageContext = packageContext; result.headsUpStatusBarText = builder.getHeadsUpStatusBarText(false /* showingPublic */); result.headsUpStatusBarTextPublic = builder.getHeadsUpStatusBarText( @@ -404,7 +365,6 @@ public class NotificationContentInflater { @InflationFlag int reInflateFlags, ArrayMap cachedContentViews, ExpandableNotificationRow row, - boolean redactAmbient, RemoteViews.OnClickHandler remoteViewClickHandler, @Nullable InflationCallback callback) { NotificationContentView privateLayout = row.getPrivateLayout(); @@ -428,7 +388,7 @@ public class NotificationContentInflater { } }; applyRemoteView(inflateSynchronously, result, reInflateFlags, flag, cachedContentViews, - row, redactAmbient, isNewView, remoteViewClickHandler, callback, privateLayout, + row, isNewView, remoteViewClickHandler, callback, privateLayout, privateLayout.getContractedChild(), privateLayout.getVisibleWrapper( NotificationContentView.VISIBLE_TYPE_CONTRACTED), runningInflations, applyCallback); @@ -452,7 +412,7 @@ public class NotificationContentInflater { } }; applyRemoteView(inflateSynchronously, result, reInflateFlags, flag, - cachedContentViews, row, redactAmbient, isNewView, remoteViewClickHandler, + cachedContentViews, row, isNewView, remoteViewClickHandler, callback, privateLayout, privateLayout.getExpandedChild(), privateLayout.getVisibleWrapper( NotificationContentView.VISIBLE_TYPE_EXPANDED), runningInflations, @@ -478,7 +438,7 @@ public class NotificationContentInflater { } }; applyRemoteView(inflateSynchronously, result, reInflateFlags, flag, - cachedContentViews, row, redactAmbient, isNewView, remoteViewClickHandler, + cachedContentViews, row, isNewView, remoteViewClickHandler, callback, privateLayout, privateLayout.getHeadsUpChild(), privateLayout.getVisibleWrapper( VISIBLE_TYPE_HEADSUP), runningInflations, @@ -503,39 +463,14 @@ public class NotificationContentInflater { } }; applyRemoteView(inflateSynchronously, result, reInflateFlags, flag, cachedContentViews, - row, redactAmbient, isNewView, remoteViewClickHandler, callback, + row, isNewView, remoteViewClickHandler, callback, publicLayout, publicLayout.getContractedChild(), publicLayout.getVisibleWrapper(NotificationContentView.VISIBLE_TYPE_CONTRACTED), runningInflations, applyCallback); } - flag = FLAG_CONTENT_VIEW_AMBIENT; - if ((reInflateFlags & flag) != 0) { - NotificationContentView newParent = redactAmbient ? publicLayout : privateLayout; - boolean isNewView = (!canReapplyAmbient(row, redactAmbient) - || !canReapplyRemoteView(result.newAmbientView, - cachedContentViews.get(FLAG_CONTENT_VIEW_AMBIENT))); - ApplyCallback applyCallback = new ApplyCallback() { - @Override - public void setResultView(View v) { - result.inflatedAmbientView = v; - } - - @Override - public RemoteViews getRemoteView() { - return result.newAmbientView; - } - }; - applyRemoteView(inflateSynchronously, result, reInflateFlags, flag, cachedContentViews, - row, redactAmbient, isNewView, remoteViewClickHandler, callback, - newParent, newParent.getAmbientChild(), newParent.getVisibleWrapper( - NotificationContentView.VISIBLE_TYPE_AMBIENT), runningInflations, - applyCallback); - } - // Let's try to finish, maybe nobody is even inflating anything - finishIfDone(result, reInflateFlags, cachedContentViews, runningInflations, callback, row, - redactAmbient); + finishIfDone(result, reInflateFlags, cachedContentViews, runningInflations, callback, row); CancellationSignal cancellationSignal = new CancellationSignal(); cancellationSignal.setOnCancelListener( () -> runningInflations.values().forEach(CancellationSignal::cancel)); @@ -550,7 +485,6 @@ public class NotificationContentInflater { @InflationFlag int inflationId, final ArrayMap cachedContentViews, final ExpandableNotificationRow row, - final boolean redactAmbient, boolean isNewView, RemoteViews.OnClickHandler remoteViewClickHandler, @Nullable final InflationCallback callback, @@ -603,7 +537,7 @@ public class NotificationContentInflater { } runningInflations.remove(inflationId); finishIfDone(result, reInflateFlags, cachedContentViews, runningInflations, - callback, row, redactAmbient); + callback, row); } @Override @@ -670,8 +604,7 @@ public class NotificationContentInflater { private static boolean finishIfDone(InflationProgress result, @InflationFlag int reInflateFlags, ArrayMap cachedContentViews, HashMap runningInflations, - @Nullable InflationCallback endListener, ExpandableNotificationRow row, - boolean redactAmbient) { + @Nullable InflationCallback endListener, ExpandableNotificationRow row) { Assert.isMainThread(); NotificationEntry entry = row.getEntry(); NotificationContentView privateLayout = row.getPrivateLayout(); @@ -735,19 +668,6 @@ public class NotificationContentInflater { } } - if ((reInflateFlags & FLAG_CONTENT_VIEW_AMBIENT) != 0) { - if (result.inflatedAmbientView != null) { - NotificationContentView newParent = redactAmbient - ? publicLayout : privateLayout; - NotificationContentView otherParent = !redactAmbient - ? publicLayout : privateLayout; - newParent.setAmbientChild(result.inflatedAmbientView); - otherParent.setAmbientChild(null); - cachedContentViews.put(FLAG_CONTENT_VIEW_AMBIENT, result.newAmbientView); - } else if (cachedContentViews.get(FLAG_CONTENT_VIEW_AMBIENT) != null) { - cachedContentViews.put(FLAG_CONTENT_VIEW_AMBIENT, result.newAmbientView); - } - } entry.headsUpStatusBarText = result.headsUpStatusBarText; entry.headsUpStatusBarTextPublic = result.headsUpStatusBarTextPublic; if (endListener != null) { @@ -827,12 +747,6 @@ public class NotificationContentInflater { mInflateSynchronously = inflateSynchronously; } - private static boolean canReapplyAmbient(ExpandableNotificationRow row, boolean redactAmbient) { - NotificationContentView ambientView = redactAmbient ? row.getPublicLayout() - : row.getPrivateLayout(); - return ambientView.getAmbientChild() != null; - } - public static class AsyncInflationTask extends AsyncTask implements InflationCallback, InflationTask { @@ -844,7 +758,6 @@ public class NotificationContentInflater { private final boolean mUsesIncreasedHeight; private final InflationCallback mCallback; private final boolean mUsesIncreasedHeadsUpHeight; - private final boolean mRedactAmbient; private @InflationFlag int mReInflateFlags; private final ArrayMap mCachedContentViews; private ExpandableNotificationRow mRow; @@ -862,7 +775,6 @@ public class NotificationContentInflater { boolean isChildInGroup, boolean usesIncreasedHeight, boolean usesIncreasedHeadsUpHeight, - boolean redactAmbient, InflationCallback callback, RemoteViews.OnClickHandler remoteViewClickHandler) { mRow = row; @@ -875,7 +787,6 @@ public class NotificationContentInflater { mIsChildInGroup = isChildInGroup; mUsesIncreasedHeight = usesIncreasedHeight; mUsesIncreasedHeadsUpHeight = usesIncreasedHeadsUpHeight; - mRedactAmbient = redactAmbient; mRemoteViewClickHandler = remoteViewClickHandler; mCallback = callback; NotificationEntry entry = row.getEntry(); @@ -903,9 +814,8 @@ public class NotificationContentInflater { processor.processNotification(notification, recoveredBuilder); } InflationProgress inflationProgress = createRemoteViews(mReInflateFlags, - recoveredBuilder, mIsLowPriority, - mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight, - mRedactAmbient, packageContext); + recoveredBuilder, mIsLowPriority, mIsChildInGroup, mUsesIncreasedHeight, + mUsesIncreasedHeadsUpHeight, packageContext); return inflateSmartReplyViews(inflationProgress, mReInflateFlags, mRow.getEntry(), mRow.getContext(), mRow.getHeadsUpManager(), mRow.getExistingSmartRepliesAndActions()); @@ -919,7 +829,7 @@ public class NotificationContentInflater { protected void onPostExecute(InflationProgress result) { if (mError == null) { mCancellationSignal = apply(mInflateSynchronously, result, mReInflateFlags, - mCachedContentViews, mRow, mRedactAmbient, mRemoteViewClickHandler, this); + mCachedContentViews, mRow, mRemoteViewClickHandler, this); } else { handleError(mError); } @@ -974,7 +884,6 @@ public class NotificationContentInflater { private RemoteViews newContentView; private RemoteViews newHeadsUpView; private RemoteViews newExpandedView; - private RemoteViews newAmbientView; private RemoteViews newPublicView; @VisibleForTesting @@ -983,7 +892,6 @@ public class NotificationContentInflater { private View inflatedContentView; private View inflatedHeadsUpView; private View inflatedExpandedView; - private View inflatedAmbientView; private View inflatedPublicView; private CharSequence headsUpStatusBarText; private CharSequence headsUpStatusBarTextPublic; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index ef11c7aacc3a..d6b7cf3ca545 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -71,7 +71,6 @@ public class NotificationContentView extends FrameLayout { public static final int VISIBLE_TYPE_EXPANDED = 1; public static final int VISIBLE_TYPE_HEADSUP = 2; private static final int VISIBLE_TYPE_SINGLELINE = 3; - public static final int VISIBLE_TYPE_AMBIENT = 4; public static final int UNDEFINED = -1; private final Rect mClipBounds = new Rect(); @@ -82,7 +81,6 @@ public class NotificationContentView extends FrameLayout { private View mExpandedChild; private View mHeadsUpChild; private HybridNotificationView mSingleLineView; - private View mAmbientChild; private RemoteInputView mExpandedRemoteInput; private RemoteInputView mHeadsUpRemoteInput; @@ -98,12 +96,10 @@ public class NotificationContentView extends FrameLayout { private NotificationViewWrapper mContractedWrapper; private NotificationViewWrapper mExpandedWrapper; private NotificationViewWrapper mHeadsUpWrapper; - private NotificationViewWrapper mAmbientWrapper; private HybridGroupManager mHybridGroupManager; private int mClipTopAmount; private int mContentHeight; private int mVisibleType = VISIBLE_TYPE_CONTRACTED; - private boolean mDozing; private boolean mAnimate; private boolean mIsHeadsUp; private boolean mLegacy; @@ -111,7 +107,6 @@ public class NotificationContentView extends FrameLayout { private int mSmallHeight; private int mHeadsUpHeight; private int mNotificationMaxHeight; - private int mNotificationAmbientHeight; private StatusBarNotification mStatusBarNotification; private NotificationGroupManager mGroupManager; private RemoteInputController mRemoteInputController; @@ -166,7 +161,6 @@ public class NotificationContentView extends FrameLayout { private int mUnrestrictedContentHeight; private MediaTransferManager mMediaTransferManager; - public NotificationContentView(Context context, AttributeSet attrs) { super(context, attrs); mHybridGroupManager = new HybridGroupManager(getContext(), this); @@ -183,12 +177,10 @@ public class NotificationContentView extends FrameLayout { com.android.internal.R.dimen.notification_content_margin_end); } - public void setHeights(int smallHeight, int headsUpMaxHeight, int maxHeight, - int ambientHeight) { + public void setHeights(int smallHeight, int headsUpMaxHeight, int maxHeight) { mSmallHeight = smallHeight; mHeadsUpHeight = headsUpMaxHeight; mNotificationMaxHeight = maxHeight; - mNotificationAmbientHeight = ambientHeight; } @Override @@ -286,20 +278,6 @@ public class NotificationContentView extends FrameLayout { MeasureSpec.makeMeasureSpec(mNotificationMaxHeight, MeasureSpec.AT_MOST)); maxChildHeight = Math.max(maxChildHeight, mSingleLineView.getMeasuredHeight()); } - if (mAmbientChild != null) { - int size = mNotificationAmbientHeight; - ViewGroup.LayoutParams layoutParams = mAmbientChild.getLayoutParams(); - boolean useExactly = false; - if (layoutParams.height >= 0) { - // An actual height is set - size = Math.min(size, layoutParams.height); - useExactly = true; - } - mAmbientChild.measure(widthMeasureSpec, - MeasureSpec.makeMeasureSpec(size, useExactly ? MeasureSpec.EXACTLY - : MeasureSpec.AT_MOST)); - maxChildHeight = Math.max(maxChildHeight, mAmbientChild.getMeasuredHeight()); - } int ownHeight = Math.min(maxChildHeight, maxSize); setMeasuredDimension(width, ownHeight); } @@ -394,10 +372,6 @@ public class NotificationContentView extends FrameLayout { return mHeadsUpChild; } - public View getAmbientChild() { - return mAmbientChild; - } - /** * Sets the contracted view. Child may be null to remove the content view. * @@ -432,9 +406,6 @@ public class NotificationContentView extends FrameLayout { if (child == mHeadsUpChild) { return mHeadsUpWrapper; } - if (child == mAmbientChild) { - return mAmbientWrapper; - } return null; } @@ -514,33 +485,6 @@ public class NotificationContentView extends FrameLayout { mContainingNotification); } - /** - * Sets the ambient view. Child may be null to remove the content view. - * - * @param child ambient content view to set - */ - public void setAmbientChild(@Nullable View child) { - if (mAmbientChild != null) { - mAmbientChild.animate().cancel(); - removeView(mAmbientChild); - } - if (child == null) { - mAmbientChild = null; - mAmbientWrapper = null; - if (mTransformationStartVisibleType == VISIBLE_TYPE_AMBIENT) { - mTransformationStartVisibleType = UNDEFINED; - } - if (mVisibleType == VISIBLE_TYPE_AMBIENT) { - selectLayout(false /* animate */, true /* force */); - } - return; - } - addView(child); - mAmbientChild = child; - mAmbientWrapper = NotificationViewWrapper.wrap(getContext(), child, - mContainingNotification); - } - @Override public void onViewAdded(View child) { super.onViewAdded(child); @@ -645,7 +589,7 @@ public class NotificationContentView extends FrameLayout { isTransitioningFromTo(VISIBLE_TYPE_EXPANDED, VISIBLE_TYPE_HEADSUP); boolean pinned = !isVisibleOrTransitioning(VISIBLE_TYPE_CONTRACTED) && (mIsHeadsUp || mHeadsUpAnimatingAway) - && !mContainingNotification.isOnKeyguard(); + && mContainingNotification.canShowHeadsUp(); if (transitioningBetweenHunAndExpanded || pinned) { return Math.min(getViewHeight(VISIBLE_TYPE_HEADSUP), getViewHeight(VISIBLE_TYPE_EXPANDED)); @@ -659,9 +603,7 @@ public class NotificationContentView extends FrameLayout { } int hint; - if (mAmbientChild != null && isVisibleOrTransitioning(VISIBLE_TYPE_AMBIENT)) { - hint = mAmbientChild.getHeight(); - } else if (mHeadsUpChild != null && isVisibleOrTransitioning(VISIBLE_TYPE_HEADSUP)) { + if (mHeadsUpChild != null && isVisibleOrTransitioning(VISIBLE_TYPE_HEADSUP)) { hint = getViewHeight(VISIBLE_TYPE_HEADSUP); } else if (mExpandedChild != null) { hint = getViewHeight(VISIBLE_TYPE_EXPANDED); @@ -761,9 +703,7 @@ public class NotificationContentView extends FrameLayout { if (mExpandedChild != null) { return getViewHeight(VISIBLE_TYPE_EXPANDED) + getExtraRemoteInputHeight(mExpandedRemoteInput); - } else if (mContainingNotification.isOnAmbient() && getShowingAmbientView() != null) { - return getShowingAmbientView().getHeight(); - } else if (mIsHeadsUp && mHeadsUpChild != null && !mContainingNotification.isOnKeyguard()) { + } else if (mIsHeadsUp && mHeadsUpChild != null && mContainingNotification.canShowHeadsUp()) { return getViewHeight(VISIBLE_TYPE_HEADSUP) + getExtraRemoteInputHeight(mHeadsUpRemoteInput); } else if (mContractedChild != null) { @@ -787,9 +727,7 @@ public class NotificationContentView extends FrameLayout { } public int getMinHeight(boolean likeGroupExpanded) { - if (mContainingNotification.isOnAmbient() && getShowingAmbientView() != null) { - return getShowingAmbientView().getHeight(); - } else if (likeGroupExpanded || !mIsChildInGroup || isGroupExpanded()) { + if (likeGroupExpanded || !mIsChildInGroup || isGroupExpanded()) { return mContractedChild != null ? getViewHeight(VISIBLE_TYPE_CONTRACTED) : mMinContractedHeight; } else { @@ -797,15 +735,6 @@ public class NotificationContentView extends FrameLayout { } } - public View getShowingAmbientView() { - View v = mIsChildInGroup ? mSingleLineView : mAmbientChild; - if (v != null) { - return v; - } else { - return mContractedChild; - } - } - private boolean isGroupExpanded() { return mGroupManager.isGroupExpanded(mStatusBarNotification); } @@ -887,7 +816,6 @@ public class NotificationContentView extends FrameLayout { forceUpdateVisibility(VISIBLE_TYPE_EXPANDED, mExpandedChild, mExpandedWrapper); forceUpdateVisibility(VISIBLE_TYPE_HEADSUP, mHeadsUpChild, mHeadsUpWrapper); forceUpdateVisibility(VISIBLE_TYPE_SINGLELINE, mSingleLineView, mSingleLineView); - forceUpdateVisibility(VISIBLE_TYPE_AMBIENT, mAmbientChild, mAmbientWrapper); fireExpandedVisibleListenerIfVisible(); // forceUpdateVisibilities cancels outstanding animations without updating the // mAnimationStartVisibleType. Do so here instead. @@ -963,8 +891,6 @@ public class NotificationContentView extends FrameLayout { mHeadsUpChild, mHeadsUpWrapper); updateViewVisibility(visibleType, VISIBLE_TYPE_SINGLELINE, mSingleLineView, mSingleLineView); - updateViewVisibility(visibleType, VISIBLE_TYPE_AMBIENT, - mAmbientChild, mAmbientWrapper); fireExpandedVisibleListenerIfVisible(); // updateViewVisibilities cancels outstanding animations without updating the // mAnimationStartVisibleType. Do so here instead. @@ -1025,8 +951,6 @@ public class NotificationContentView extends FrameLayout { return mHeadsUpWrapper; case VISIBLE_TYPE_SINGLELINE: return mSingleLineView; - case VISIBLE_TYPE_AMBIENT: - return mAmbientWrapper; default: return mContractedWrapper; } @@ -1044,8 +968,6 @@ public class NotificationContentView extends FrameLayout { return mHeadsUpChild; case VISIBLE_TYPE_SINGLELINE: return mSingleLineView; - case VISIBLE_TYPE_AMBIENT: - return mAmbientChild; default: return mContractedChild; } @@ -1059,8 +981,6 @@ public class NotificationContentView extends FrameLayout { return mHeadsUpWrapper; case VISIBLE_TYPE_CONTRACTED: return mContractedWrapper; - case VISIBLE_TYPE_AMBIENT: - return mAmbientWrapper; default: return null; } @@ -1100,26 +1020,23 @@ public class NotificationContentView extends FrameLayout { if (!noExpandedChild && viewHeight == getViewHeight(VISIBLE_TYPE_EXPANDED)) { return VISIBLE_TYPE_EXPANDED; } - boolean onAmbient = mContainingNotification.isOnAmbient(); if (!mUserExpanding && mIsChildInGroup && !isGroupExpanded()) { return VISIBLE_TYPE_SINGLELINE; } if ((mIsHeadsUp || mHeadsUpAnimatingAway) && mHeadsUpChild != null - && !mContainingNotification.isOnKeyguard()) { + && mContainingNotification.canShowHeadsUp()) { if (viewHeight <= getViewHeight(VISIBLE_TYPE_HEADSUP) || noExpandedChild) { return VISIBLE_TYPE_HEADSUP; } else { return VISIBLE_TYPE_EXPANDED; } } else { - int collapsedType = onAmbient && mAmbientChild != null ? VISIBLE_TYPE_AMBIENT : - VISIBLE_TYPE_CONTRACTED; if (noExpandedChild || (mContractedChild != null - && viewHeight <= getViewHeight(collapsedType) + && viewHeight <= getViewHeight(VISIBLE_TYPE_CONTRACTED) && (!mIsChildInGroup || isGroupExpanded() || !mContainingNotification.isExpanded(true /* allowOnKeyguard */)))) { - return collapsedType; + return VISIBLE_TYPE_CONTRACTED; } else { return VISIBLE_TYPE_EXPANDED; } @@ -1130,14 +1047,6 @@ public class NotificationContentView extends FrameLayout { return mIsContentExpandable; } - public void setDozing(boolean dozing, boolean fade, long delay) { - if (mContractedChild == null) { - return; - } - mDozing = dozing; - selectLayout(!dozing && fade /* animate */, false /* force */); - } - public void setHeadsUp(boolean headsUp) { mIsHeadsUp = headsUp; selectLayout(false /* animate */, true /* force */); @@ -1180,9 +1089,6 @@ public class NotificationContentView extends FrameLayout { if (mHeadsUpChild != null) { mHeadsUpWrapper.setIsChildInGroup(mIsChildInGroup); } - if (mAmbientChild != null) { - mAmbientWrapper.setIsChildInGroup(mIsChildInGroup); - } updateAllSingleLineViews(); } @@ -1201,14 +1107,10 @@ public class NotificationContentView extends FrameLayout { if (mHeadsUpChild != null) { mHeadsUpWrapper.onContentUpdated(row); } - if (mAmbientChild != null) { - mAmbientWrapper.onContentUpdated(row); - } applyRemoteInputAndSmartReply(entry); applyMediaTransfer(entry); updateLegacy(); mForceSelectNextLayout = true; - setDozing(mDozing, false /* animate */, 0 /* delay */); mPreviousExpandedRemoteInputIntent = null; mPreviousHeadsUpRemoteInputIntent = null; } @@ -1514,7 +1416,7 @@ public class NotificationContentView extends FrameLayout { // if the expanded child has the same height as the collapsed one we hide it. if (mExpandedChild != null && mExpandedChild.getHeight() != 0) { if ((!mIsHeadsUp && !mHeadsUpAnimatingAway) - || mHeadsUpChild == null || mContainingNotification.isOnKeyguard()) { + || mHeadsUpChild == null || !mContainingNotification.canShowHeadsUp()) { if (mExpandedChild.getHeight() <= mContractedChild.getHeight()) { expandable = false; } @@ -1545,9 +1447,6 @@ public class NotificationContentView extends FrameLayout { if (header == null && mHeadsUpChild != null) { header = mHeadsUpWrapper.getNotificationHeader(); } - if (header == null && mAmbientChild != null) { - header = mAmbientWrapper.getNotificationHeader(); - } return header; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java index caad0f5be7a3..a11a8fa5df12 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java @@ -386,9 +386,6 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx } final ExpandableNotificationRow row = (ExpandableNotificationRow) view; - if (row.isDozing()) { - return false; - } view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); if (row.areGutsExposed()) { closeAndSaveGuts(false /* removeLeavebehind */, false /* force */, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java index 7bde92f1427f..b4ccb567504a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java @@ -346,8 +346,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl if (mShouldShowMenu && !NotificationStackScrollLayout.isPinnedHeadsUp(getParent()) && !mParent.areGutsExposed() - && !mParent.isDozing() - && !mParent.showingAmbientPulsing() + && !mParent.showingPulsing() && (mCheckForDrag == null || !mHandler.hasCallbacks(mCheckForDrag))) { // Only show the menu if we're not a heads up view and guts aren't exposed. mCheckForDrag = new CheckForDrag(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java index d8bda6cbbf83..6220adebaf2b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java @@ -24,7 +24,6 @@ import android.view.View; import com.android.systemui.Dependency; import com.android.systemui.R; -import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -32,6 +31,7 @@ import com.android.systemui.statusbar.notification.row.ActivatableNotificationVi import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.ExpandableView; import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.SectionProvider; +import com.android.systemui.statusbar.policy.HeadsUpManager; import java.util.ArrayList; @@ -54,7 +54,6 @@ public class AmbientState { private int mSpeedBumpIndex = -1; private boolean mDozing; private boolean mHideSensitive; - private AmbientPulseManager mAmbientPulseManager = Dependency.get(AmbientPulseManager.class); private float mStackTranslation; private int mLayoutHeight; private int mTopPadding; @@ -83,11 +82,14 @@ public class AmbientState { private boolean mAppearing; private float mPulseHeight = MAX_PULSE_HEIGHT; private float mDozeAmount = 0.0f; + private HeadsUpManager mHeadUpManager; public AmbientState( Context context, - @NonNull SectionProvider sectionProvider) { + @NonNull SectionProvider sectionProvider, + HeadsUpManager headsUpManager) { mSectionProvider = sectionProvider; + mHeadUpManager = headsUpManager; reload(context); } @@ -389,8 +391,7 @@ public class AmbientState { } public boolean hasPulsingNotifications() { - return mPulsing && mAmbientPulseManager != null - && mAmbientPulseManager.hasNotifications(); + return mPulsing && mHeadUpManager != null && mHeadUpManager.hasNotifications(); } public void setPulsing(boolean hasPulsing) { @@ -405,10 +406,10 @@ public class AmbientState { } public boolean isPulsing(NotificationEntry entry) { - if (!mPulsing || mAmbientPulseManager == null) { + if (!mPulsing || mHeadUpManager == null) { return false; } - return mAmbientPulseManager.isAlerting(entry.key); + return mHeadUpManager.isAlerting(entry.key); } public boolean isPanelTracking() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java index bc9e71a72b72..6cd229037462 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java @@ -36,7 +36,6 @@ public class AnimationFilter { boolean animateHeight; boolean animateTopInset; boolean animateDimmed; - boolean animateDozing; boolean animateHideSensitive; boolean hasDelays; boolean hasGoToFullShadeEvent; @@ -89,11 +88,6 @@ public class AnimationFilter { return this; } - public AnimationFilter animateDozing() { - animateDozing = true; - return this; - } - public AnimationFilter animateHideSensitive() { animateHideSensitive = true; return this; @@ -145,7 +139,6 @@ public class AnimationFilter { animateHeight |= filter.animateHeight; animateTopInset |= filter.animateTopInset; animateDimmed |= filter.animateDimmed; - animateDozing |= filter.animateDozing; animateHideSensitive |= filter.animateHideSensitive; hasDelays |= filter.hasDelays; mAnimatedProperties.addAll(filter.mAnimatedProperties); @@ -160,7 +153,6 @@ public class AnimationFilter { animateHeight = false; animateTopInset = false; animateDimmed = false; - animateDozing = false; animateHideSensitive = false; hasDelays = false; hasGoToFullShadeEvent = false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java index af26c7c23222..72ef7f9572a4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java @@ -85,7 +85,6 @@ public class ExpandableViewState extends ViewState { public int height; public boolean dimmed; - public boolean dozing; public boolean hideSensitive; public boolean belowSpeedBump; public boolean inShelf; @@ -121,7 +120,6 @@ public class ExpandableViewState extends ViewState { ExpandableViewState svs = (ExpandableViewState) viewState; height = svs.height; dimmed = svs.dimmed; - dozing = svs.dozing; hideSensitive = svs.hideSensitive; belowSpeedBump = svs.belowSpeedBump; clipTopAmount = svs.clipTopAmount; @@ -158,9 +156,6 @@ public class ExpandableViewState extends ViewState { // apply below shelf speed bump expandableView.setBelowSpeedBump(this.belowSpeedBump); - // apply dozing - expandableView.setDozing(this.dozing, false /* animate */, 0 /* delay */); - // apply clipping float oldClipTopAmount = expandableView.getClipTopAmount(); if (oldClipTopAmount != this.clipTopAmount) { @@ -209,9 +204,6 @@ public class ExpandableViewState extends ViewState { expandableView.setHideSensitive(this.hideSensitive, animationFilter.animateHideSensitive, properties.delay, properties.duration); - // start dozing animation - expandableView.setDozing(this.dozing, animationFilter.animateDozing, properties.delay); - if (properties.wasAdded(child) && !hidden) { expandableView.performAddAnimation(properties.delay, properties.duration, false /* isHeadsUpAppear */); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java index 5425c8e613a2..12424317edf1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java @@ -567,7 +567,6 @@ public class NotificationChildrenContainer extends ViewGroup { ? parentState.zTranslation : 0; childState.dimmed = parentState.dimmed; - childState.dozing = parentState.dozing; childState.hideSensitive = parentState.hideSensitive; childState.belowSpeedBump = parentState.belowSpeedBump; childState.clipTopAmount = 0; @@ -662,8 +661,10 @@ public class NotificationChildrenContainer extends ViewGroup { && !showingAsLowPriority()) { return NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED; } - if (mIsLowPriority || !mContainingNotification.isOnKeyguard() - && (mContainingNotification.isExpanded() || mContainingNotification.isHeadsUp())) { + if (mIsLowPriority + || (!mContainingNotification.isOnKeyguard() && mContainingNotification.isExpanded()) + || (mContainingNotification.isHeadsUpState() + && mContainingNotification.canShowHeadsUp())) { return NUMBER_OF_CHILDREN_WHEN_SYSTEM_EXPANDED; } return NUMBER_OF_CHILDREN_WHEN_COLLAPSED; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java index c5ab9f6049c6..d8ccd3ae9d16 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java @@ -18,7 +18,6 @@ package com.android.systemui.statusbar.notification.stack; import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.NUM_SECTIONS; -import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; @@ -34,8 +33,7 @@ import javax.inject.Singleton; * A class that manages the roundness for notification views */ @Singleton -class NotificationRoundnessManager implements OnHeadsUpChangedListener, - AmbientPulseManager.OnAmbientChangedListener { +class NotificationRoundnessManager implements OnHeadsUpChangedListener { private final ActivatableNotificationView[] mFirstInSectionViews; private final ActivatableNotificationView[] mLastInSectionViews; @@ -45,16 +43,14 @@ class NotificationRoundnessManager implements OnHeadsUpChangedListener, private HashSet mAnimatedChildren; private Runnable mRoundingChangedCallback; private ExpandableNotificationRow mTrackedHeadsUp; - private ActivatableNotificationView mTrackedAmbient; private float mAppearFraction; @Inject - NotificationRoundnessManager(AmbientPulseManager ambientPulseManager) { + NotificationRoundnessManager() { mFirstInSectionViews = new ActivatableNotificationView[NUM_SECTIONS]; mLastInSectionViews = new ActivatableNotificationView[NUM_SECTIONS]; mTmpFirstInSectionViews = new ActivatableNotificationView[NUM_SECTIONS]; mTmpLastInSectionViews = new ActivatableNotificationView[NUM_SECTIONS]; - ambientPulseManager.addListener(this); } @Override @@ -73,14 +69,8 @@ class NotificationRoundnessManager implements OnHeadsUpChangedListener, } @Override - public void onAmbientStateChanged(NotificationEntry entry, boolean isPulsing) { - ActivatableNotificationView row = entry.getRow(); - if (isPulsing) { - mTrackedAmbient = row; - } else if (mTrackedAmbient == row) { - mTrackedAmbient = null; - } - updateView(row, false /* animate */); + public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) { + updateView(entry.getRow(), false /* animate */); } private void updateView(ActivatableNotificationView view, boolean animate) { @@ -134,6 +124,9 @@ class NotificationRoundnessManager implements OnHeadsUpChangedListener, if ((view.isPinned() || view.isHeadsUpAnimatingAway()) && !mExpanded) { return 1.0f; } + if (view.showingPulsing()) { + return 1.0f; + } if (isFirstInSection(view, true /* include first section */) && top) { return 1.0f; } @@ -145,9 +138,6 @@ class NotificationRoundnessManager implements OnHeadsUpChangedListener, // rounded. return 1.0f; } - if (view == mTrackedAmbient) { - return 1.0f; - } return 0.0f; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java index cbcfdd4b2ea7..f39ed2e89432 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java @@ -254,7 +254,7 @@ class NotificationSection { newTop = (int) Math.ceil(firstView.getTranslationY()); } top = Math.max(newTop, top); - if (firstView.showingAmbientPulsing()) { + if (firstView.showingPulsing()) { // If we're pulsing, the notification can actually go below! bottom = Math.max(bottom, finalTranslationY + ExpandableViewState.getFinalActualHeight(firstView)); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 1f0e545ecb0f..33fc26b83342 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -97,7 +97,6 @@ import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.OnMenuEv import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; -import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.DragDownHelper.DragDownCallback; import com.android.systemui.statusbar.EmptyShadeView; @@ -129,6 +128,7 @@ import com.android.systemui.statusbar.notification.row.StackScrollerDecorView; import com.android.systemui.statusbar.phone.HeadsUpAppearanceController; import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; import com.android.systemui.statusbar.phone.HeadsUpTouchHelper; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.LockscreenGestureLogger; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.NotificationGroupManager.OnGroupChangeListener; @@ -179,7 +179,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd * gap is drawn between them). In this case we don't want to round their corners. */ private static final int DISTANCE_BETWEEN_ADJACENT_SECTIONS_PX = 1; - private final AmbientPulseManager mAmbientPulseManager; + private final KeyguardBypassController mKeyguardBypassController; private ExpandHelper mExpandHelper; private final NotificationSwipeHelper mSwipeHelper; @@ -266,7 +266,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private boolean mTopPaddingNeedsAnimation; private boolean mDimmedNeedsAnimation; private boolean mHideSensitiveNeedsAnimation; - private boolean mDozingNeedsAnimation; private boolean mActivateNeedsAnimation; private boolean mGoToFullShadeNeedsAnimation; private boolean mIsExpanded = true; @@ -508,10 +507,11 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd AttributeSet attrs, @Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME) boolean allowLongPress, NotificationRoundnessManager notificationRoundnessManager, - AmbientPulseManager ambientPulseManager, DynamicPrivacyController dynamicPrivacyController, ActivityStarter activityStarter, - StatusBarStateController statusBarStateController) { + StatusBarStateController statusBarStateController, + HeadsUpManagerPhone headsUpManager, + KeyguardBypassController keyguardBypassController) { super(context, attrs, 0, 0); Resources res = getResources(); @@ -520,8 +520,12 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd for (int i = 0; i < NUM_SECTIONS; i++) { mSections[i] = new NotificationSection(this); } + mRoundnessManager = notificationRoundnessManager; - mAmbientPulseManager = ambientPulseManager; + mHeadsUpManager = headsUpManager; + mHeadsUpManager.addListener(mRoundnessManager); + mHeadsUpManager.setAnimationStateHandler(this::setHeadsUpGoingAwayAnimationsAllowed); + mKeyguardBypassController = keyguardBypassController; mSectionsManager = new NotificationSectionsManager( @@ -536,8 +540,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd clearNotifications(ROWS_GENTLE, closeShade); }); - mAmbientState = new AmbientState(context, mSectionsManager); - mRoundnessManager = notificationRoundnessManager; + mAmbientState = new AmbientState(context, mSectionsManager, mHeadsUpManager); mBgColor = context.getColor(R.color.notification_shade_background_color); int minHeight = res.getDimensionPixelSize(R.dimen.notification_min_height); int maxHeight = res.getDimensionPixelSize(R.dimen.notification_max_height); @@ -2523,12 +2526,15 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } int minTopPosition = 0; NotificationSection lastSection = getLastVisibleSection(); - if (mStatusBarState != StatusBarState.KEYGUARD) { + boolean onKeyguard = mStatusBarState == StatusBarState.KEYGUARD; + if (!onKeyguard) { minTopPosition = (int) (mTopPadding + mStackTranslation); } else if (lastSection == null) { minTopPosition = mTopPadding; } - boolean shiftPulsingWithFirst = mAmbientPulseManager.getAllEntries().count() <= 1; + boolean shiftPulsingWithFirst = mHeadsUpManager.getAllEntries().count() <= 1 + && (mAmbientState.isDozing() + || (mKeyguardBypassController.getBypassEnabled() && onKeyguard)); for (NotificationSection section : mSections) { int minBottomPosition = minTopPosition; if (section == lastSection) { @@ -3353,7 +3359,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd generateActivateEvent(); generateDimmedEvent(); generateHideSensitiveEvent(); - generateDozingEvent(); generateGoToFullShadeEvent(); generateViewResizeEvent(); generateGroupExpansionEvent(); @@ -3567,19 +3572,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd mHideSensitiveNeedsAnimation = false; } - @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) - private void generateDozingEvent() { - if (mDozingNeedsAnimation) { - AnimationEvent ev = new AnimationEvent(null, - AnimationEvent.ANIMATION_TYPE_DOZING, - new AnimationFilter() - .animateDozing() - .animateY(mShelf)); - mAnimationEvents.add(ev); - } - mDozingNeedsAnimation = false; - } - @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) private void generateGoToFullShadeEvent() { if (mGoToFullShadeNeedsAnimation) { @@ -4706,10 +4698,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd return; } mAmbientState.setDozing(dozing); - if (animate && mAnimationsEnabled) { - mDozingNeedsAnimation = true; - mNeedsAnimation = true; - } requestChildrenUpdate(); notifyHeightChangeListener(mShelf); } @@ -5020,13 +5008,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd mAnimationFinishedRunnables.add(runnable); } - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public void setHeadsUpManager(HeadsUpManagerPhone headsUpManager) { - mHeadsUpManager = headsUpManager; - mHeadsUpManager.addListener(mRoundnessManager); - mHeadsUpManager.setAnimationStateHandler(this::setHeadsUpGoingAwayAnimationsAllowed); - } - public void generateHeadsUpAnimation(NotificationEntry entry, boolean isHeadsUp) { ExpandableNotificationRow row = entry.getHeadsUpAnimationView(); generateHeadsUpAnimation(row, isHeadsUp); @@ -5831,9 +5812,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd .animateY() .animateZ(), - // ANIMATION_TYPE_DOZING - null, // Unused - // ANIMATION_TYPE_GO_TO_FULL_SHADE new AnimationFilter() .animateHeight() @@ -5895,7 +5873,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd // ANIMATION_TYPE_EVERYTHING new AnimationFilter() .animateAlpha() - .animateDozing() .animateDimmed() .animateHideSensitive() .animateHeight() @@ -5927,9 +5904,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd // ANIMATION_TYPE_CHANGE_POSITION StackStateAnimator.ANIMATION_DURATION_STANDARD, - // ANIMATION_TYPE_DOZING - StackStateAnimator.ANIMATION_DURATION_WAKEUP, - // ANIMATION_TYPE_GO_TO_FULL_SHADE StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE, @@ -5965,16 +5939,15 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd static final int ANIMATION_TYPE_ACTIVATED_CHILD = 4; static final int ANIMATION_TYPE_DIMMED = 5; static final int ANIMATION_TYPE_CHANGE_POSITION = 6; - static final int ANIMATION_TYPE_DOZING = 7; - static final int ANIMATION_TYPE_GO_TO_FULL_SHADE = 8; - static final int ANIMATION_TYPE_HIDE_SENSITIVE = 9; - static final int ANIMATION_TYPE_VIEW_RESIZE = 10; - static final int ANIMATION_TYPE_GROUP_EXPANSION_CHANGED = 11; - static final int ANIMATION_TYPE_HEADS_UP_APPEAR = 12; - static final int ANIMATION_TYPE_HEADS_UP_DISAPPEAR = 13; - static final int ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK = 14; - static final int ANIMATION_TYPE_HEADS_UP_OTHER = 15; - static final int ANIMATION_TYPE_EVERYTHING = 16; + static final int ANIMATION_TYPE_GO_TO_FULL_SHADE = 7; + static final int ANIMATION_TYPE_HIDE_SENSITIVE = 8; + static final int ANIMATION_TYPE_VIEW_RESIZE = 9; + static final int ANIMATION_TYPE_GROUP_EXPANSION_CHANGED = 10; + static final int ANIMATION_TYPE_HEADS_UP_APPEAR = 11; + static final int ANIMATION_TYPE_HEADS_UP_DISAPPEAR = 12; + static final int ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK = 13; + static final int ANIMATION_TYPE_HEADS_UP_OTHER = 14; + static final int ANIMATION_TYPE_EVERYTHING = 15; final long eventStartTime; final ExpandableView mChangingView; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index ccee2a1d9b9f..09c6968867b8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -213,7 +213,6 @@ public class StackScrollAlgorithm { private void updateDimmedActivatedHideSensitive(AmbientState ambientState, StackScrollAlgorithmState algorithmState) { boolean dimmed = ambientState.isDimmed(); - boolean hidden = ambientState.isFullyHidden(); boolean hideSensitive = ambientState.isHideSensitive(); View activatedChild = ambientState.getActivatedChild(); int childCount = algorithmState.visibleChildren.size(); @@ -221,7 +220,6 @@ public class StackScrollAlgorithm { ExpandableView child = algorithmState.visibleChildren.get(i); ExpandableViewState childViewState = child.getViewState(); childViewState.dimmed = dimmed; - childViewState.dozing = hidden; childViewState.hideSensitive = hideSensitive; boolean isActivatedChild = activatedChild == child; if (dimmed && isActivatedChild) { @@ -501,7 +499,7 @@ public class StackScrollAlgorithm { continue; } ExpandableNotificationRow row = (ExpandableNotificationRow) child; - if (!row.showingAmbientPulsing() || (i == 0 && ambientState.isPulseExpanding())) { + if (!row.showingPulsing() || (i == 0 && ambientState.isPulseExpanding())) { continue; } ExpandableViewState viewState = row.getViewState(); @@ -530,7 +528,8 @@ public class StackScrollAlgorithm { boolean isTopEntry = topHeadsUpEntry == row; float unmodifiedEndLocation = childState.yTranslation + childState.height; if (mIsExpanded) { - if (row.mustStayOnScreen() && !childState.headsUpIsVisible) { + if (row.mustStayOnScreen() && !childState.headsUpIsVisible + && !row.showingPulsing()) { // Ensure that the heads up is always visible even when scrolled off clampHunToTop(ambientState, row, childState); if (i == 0 && row.isAboveShelf()) { @@ -667,7 +666,7 @@ public class StackScrollAlgorithm { } childViewState.zTranslation = baseZ + childrenOnTop * zDistanceBetweenElements; - } else if (i == 0 && child.isAboveShelf()) { + } else if (i == 0 && (child.isAboveShelf() || child.showingPulsing())) { // In case this is a new view that has never been measured before, we don't want to // elevate if we are currently expanded more then the notification int shelfHeight = ambientState.getShelf() == null ? 0 : diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java index ea1ceec4e3b3..9f2f1ce93c3c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java @@ -171,8 +171,7 @@ public class StackStateAnimator { || viewState.zTranslation != child.getTranslationZ() || viewState.alpha != child.getAlpha() || viewState.height != child.getActualHeight() - || viewState.clipTopAmount != child.getClipTopAmount() - || viewState.dozing != child.isDozing())) { + || viewState.clipTopAmount != child.getClipTopAmount())) { mAnimationProperties.delay = mCurrentAdditionalDelay + calculateChildAnimationDelay(viewState); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java index a0cda693822f..9cdb2cdd4073 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone; +import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT; + import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; @@ -31,6 +33,7 @@ import android.view.ViewTreeObserver; import androidx.collection.ArraySet; +import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.Dependency; import com.android.systemui.Dumpable; import com.android.systemui.R; @@ -50,18 +53,27 @@ import java.io.PrintWriter; import java.util.HashSet; import java.util.Stack; +import javax.inject.Inject; +import javax.inject.Singleton; + /** * A implementation of HeadsUpManager for phone and car. */ +@Singleton public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, VisualStabilityManager.Callback, OnHeadsUpChangedListener, ConfigurationController.ConfigurationListener, StateListener { private static final String TAG = "HeadsUpManagerPhone"; - private final View mStatusBarWindowView; - private final NotificationGroupManager mGroupManager; - private final VisualStabilityManager mVisualStabilityManager; - private final StatusBarTouchableRegionManager mStatusBarTouchableRegionManager; + @VisibleForTesting + final int mExtensionTime; + private final StatusBarStateController mStatusBarStateController; + private View mStatusBarWindowView; + private NotificationGroupManager mGroupManager; + private VisualStabilityManager mVisualStabilityManager; + private StatusBarTouchableRegionManager mStatusBarTouchableRegionManager; + @VisibleForTesting + int mAutoDismissNotificationDecayDozing; private boolean mReleaseOnExpandFinish; private int mStatusBarHeight; @@ -101,21 +113,31 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, /////////////////////////////////////////////////////////////////////////////////////////////// // Constructor: + @Inject public HeadsUpManagerPhone(@NonNull final Context context, - @NonNull View statusBarWindowView, - @NonNull NotificationGroupManager groupManager, - @NonNull StatusBar bar, - @NonNull VisualStabilityManager visualStabilityManager) { + StatusBarStateController statusBarStateController) { super(context); + Resources resources = mContext.getResources(); + mAutoDismissNotificationDecayDozing = resources.getInteger( + R.integer.heads_up_notification_decay_dozing); + mExtensionTime = resources.getInteger(R.integer.ambient_notification_extension_time); + mStatusBarStateController = statusBarStateController; + mStatusBarStateController.addCallback(this); + + initResources(); + } + + public void setUp(@NonNull View statusBarWindowView, + @NonNull NotificationGroupManager groupManager, + @NonNull StatusBar bar, + @NonNull VisualStabilityManager visualStabilityManager) { mStatusBarWindowView = statusBarWindowView; - mStatusBarTouchableRegionManager = new StatusBarTouchableRegionManager(context, this, bar, + mStatusBarTouchableRegionManager = new StatusBarTouchableRegionManager(mContext, this, bar, statusBarWindowView); mGroupManager = groupManager; mVisualStabilityManager = visualStabilityManager; - initResources(); - addListener(new OnHeadsUpChangedListener() { @Override public void onHeadsUpPinnedModeChanged(boolean hasPinnedNotification) { @@ -125,7 +147,6 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, mStatusBarTouchableRegionManager.updateTouchableRegion(); } }); - Dependency.get(StatusBarStateController.class).addCallback(this); } public void setAnimationStateHandler(AnimationStateHandler handler) { @@ -261,6 +282,18 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, } } + /** + * Extends the lifetime of the currently showing pulsing notification so that the pulse lasts + * longer. + */ + public void extendHeadsUp() { + HeadsUpEntryPhone topEntry = getTopHeadsUpEntryPhone(); + if (topEntry == null) { + return; + } + topEntry.extendPulse(); + } + /////////////////////////////////////////////////////////////////////////////////////////////// // HeadsUpManager public methods overrides: @@ -426,6 +459,12 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, private boolean mMenuShownPinned; + /** + * If the time this entry has been on was extended + */ + private boolean extended; + + @Override protected boolean isSticky() { return super.isSticky() || mMenuShownPinned; @@ -433,7 +472,10 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, public void setEntry(@NonNull final NotificationEntry entry) { Runnable removeHeadsUpRunnable = () -> { - if (!mVisualStabilityManager.isReorderingAllowed()) { + if (!mVisualStabilityManager.isReorderingAllowed() + // We don't want to allow reordering while pulsing, but headsup need to + // time out if we're dozing. + && !mStatusBarStateController.isDozing()) { mEntriesToRemoveWhenReorderingAllowed.add(entry); mVisualStabilityManager.addReorderingAllowedCallback( HeadsUpManagerPhone.this); @@ -490,6 +532,24 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, public void reset() { super.reset(); mMenuShownPinned = false; + extended = false; + } + + private void extendPulse() { + if (!extended) { + extended = true; + updateEntry(false); + } + } + + @Override + protected long calculateFinishTime() { + return mPostTime + getDecayDuration() + (extended ? mExtensionTime : 0); + } + + private int getDecayDuration() { + return mStatusBarStateController.isDozing() ? mAutoDismissNotificationDecayDozing + : getRecommendedHeadsUpTimeoutMs(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java index 4dbd8545efb9..4d69f77e744d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java @@ -28,8 +28,6 @@ import com.android.systemui.Dependency; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; import com.android.systemui.statusbar.AlertingNotificationManager; -import com.android.systemui.statusbar.AmbientPulseManager; -import com.android.systemui.statusbar.AmbientPulseManager.OnAmbientChangedListener; import com.android.systemui.statusbar.InflationTask; import com.android.systemui.statusbar.notification.NotificationEntryListener; import com.android.systemui.statusbar.notification.NotificationEntryManager; @@ -48,13 +46,13 @@ import javax.inject.Inject; import javax.inject.Singleton; /** - * A helper class dealing with the alert interactions between {@link NotificationGroupManager}, - * {@link HeadsUpManager}, {@link AmbientPulseManager}. In particular, this class deals with keeping + * A helper class dealing with the alert interactions between {@link NotificationGroupManager} and + * {@link HeadsUpManager}. In particular, this class deals with keeping * the correct notification in a group alerting based off the group suppression. */ @Singleton public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedListener, - OnAmbientChangedListener, StateListener { + StateListener { private static final long ALERT_TRANSFER_TIMEOUT = 300; @@ -70,8 +68,6 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis private final ArrayMap mPendingAlerts = new ArrayMap<>(); private HeadsUpManager mHeadsUpManager; - private final AmbientPulseManager mAmbientPulseManager = - Dependency.get(AmbientPulseManager.class); private final NotificationGroupManager mGroupManager = Dependency.get(NotificationGroupManager.class); @@ -144,10 +140,9 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis @Override public void onGroupSuppressionChanged(NotificationGroup group, boolean suppressed) { - AlertingNotificationManager alertManager = getActiveAlertManager(); if (suppressed) { - if (alertManager.isAlerting(group.summary.key)) { - handleSuppressedSummaryAlerted(group.summary, alertManager); + if (mHeadsUpManager.isAlerting(group.summary.key)) { + handleSuppressedSummaryAlerted(group.summary, mHeadsUpManager); } } else { // Group summary can be null if we are no longer suppressed because the summary was @@ -160,8 +155,8 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis // Group is no longer suppressed. We should check if we need to transfer the alert // back to the summary now that it's no longer suppressed. if (groupAlertEntry.mAlertSummaryOnNextAddition) { - if (!alertManager.isAlerting(group.summary.key)) { - alertNotificationWhenPossible(group.summary, alertManager); + if (!mHeadsUpManager.isAlerting(group.summary.key)) { + alertNotificationWhenPossible(group.summary, mHeadsUpManager); } groupAlertEntry.mAlertSummaryOnNextAddition = false; } else { @@ -171,11 +166,6 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis } }; - @Override - public void onAmbientStateChanged(NotificationEntry entry, boolean isAmbient) { - onAlertStateChanged(entry, isAmbient, mAmbientPulseManager); - } - @Override public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) { onAlertStateChanged(entry, isHeadsUp, mHeadsUpManager); @@ -208,11 +198,10 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis PendingAlertInfo alertInfo = mPendingAlerts.remove(entry.key); if (alertInfo != null) { if (alertInfo.isStillValid()) { - alertNotificationWhenPossible(entry, getActiveAlertManager()); + alertNotificationWhenPossible(entry, mHeadsUpManager); } else { // The transfer is no longer valid. Free the content. - entry.getRow().freeContentViewWhenSafe( - alertInfo.mAlertManager.getContentFlag()); + entry.getRow().freeContentViewWhenSafe(mHeadsUpManager.getContentFlag()); } } } @@ -354,7 +343,6 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis if (SystemClock.elapsedRealtime() - groupAlertEntry.mLastAlertTransferTime < ALERT_TRANSFER_TIMEOUT) { NotificationEntry summary = groupAlertEntry.mGroup.summary; - AlertingNotificationManager alertManager = getActiveAlertManager(); if (!onlySummaryAlerts(summary)) { return; @@ -369,9 +357,9 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis boolean releasedChild = false; for (int i = 0; i < children.size(); i++) { NotificationEntry entry = children.get(i); - if (onlySummaryAlerts(entry) && alertManager.isAlerting(entry.key)) { + if (onlySummaryAlerts(entry) && mHeadsUpManager.isAlerting(entry.key)) { releasedChild = true; - alertManager.removeNotification(entry.key, true /* releaseImmediately */); + mHeadsUpManager.removeNotification(entry.key, true /* releaseImmediately */); } if (mPendingAlerts.containsKey(entry.key)) { // This is the child that would've been removed if it was inflated. @@ -379,10 +367,10 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis mPendingAlerts.get(entry.key).mAbortOnInflation = true; } } - if (releasedChild && !alertManager.isAlerting(summary.key)) { + if (releasedChild && !mHeadsUpManager.isAlerting(summary.key)) { boolean notifyImmediately = (numChildren - numPendingChildren) > 1; if (notifyImmediately) { - alertNotificationWhenPossible(summary, alertManager); + alertNotificationWhenPossible(summary, mHeadsUpManager); } else { // Should wait until the pending child inflates before alerting. groupAlertEntry.mAlertSummaryOnNextAddition = true; @@ -403,7 +391,7 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis @NonNull AlertingNotificationManager alertManager) { @InflationFlag int contentFlag = alertManager.getContentFlag(); if (!entry.getRow().isInflationFlagSet(contentFlag)) { - mPendingAlerts.put(entry.key, new PendingAlertInfo(entry, alertManager)); + mPendingAlerts.put(entry.key, new PendingAlertInfo(entry)); entry.getRow().updateInflationFlag(contentFlag, true /* shouldInflate */); entry.getRow().inflateViews(); return; @@ -415,10 +403,6 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis } } - private AlertingNotificationManager getActiveAlertManager() { - return mIsDozing ? mAmbientPulseManager : mHeadsUpManager; - } - private boolean onlySummaryAlerts(NotificationEntry entry) { return entry.notification.getNotification().getGroupAlertBehavior() == Notification.GROUP_ALERT_SUMMARY; @@ -429,10 +413,6 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis * inflation completes. */ private class PendingAlertInfo { - /** - * The alert manager when the transfer is initiated. - */ - final AlertingNotificationManager mAlertManager; /** * The original notification when the transfer is initiated. This is used to determine if @@ -450,10 +430,9 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis */ boolean mAbortOnInflation; - PendingAlertInfo(NotificationEntry entry, AlertingNotificationManager alertManager) { + PendingAlertInfo(NotificationEntry entry) { mOriginalNotification = entry.notification; mEntry = entry; - mAlertManager = alertManager; } /** @@ -466,10 +445,6 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis // Notification is aborted due to the transfer being explicitly cancelled return false; } - if (mAlertManager != getActiveAlertManager()) { - // Alert manager has changed - return false; - } if (mEntry.notification.getGroupKey() != mOriginalNotification.getGroupKey()) { // Groups have changed return false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java index cc8af3ba64fc..7b1d1c674f0b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java @@ -24,8 +24,6 @@ import android.util.Log; import com.android.systemui.Dependency; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; -import com.android.systemui.statusbar.AmbientPulseManager; -import com.android.systemui.statusbar.AmbientPulseManager.OnAmbientChangedListener; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; @@ -46,8 +44,7 @@ import javax.inject.Singleton; * A class to handle notifications and their corresponding groups. */ @Singleton -public class NotificationGroupManager implements OnHeadsUpChangedListener, - OnAmbientChangedListener, StateListener { +public class NotificationGroupManager implements OnHeadsUpChangedListener, StateListener { private static final String TAG = "NotificationGroupManager"; private final HashMap mGroupMap = new HashMap<>(); @@ -55,12 +52,11 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, private int mBarState = -1; private HashMap mIsolatedEntries = new HashMap<>(); private HeadsUpManager mHeadsUpManager; - private AmbientPulseManager mAmbientPulseManager = Dependency.get(AmbientPulseManager.class); private boolean mIsUpdatingUnchangedGroup; @Inject - public NotificationGroupManager() { - Dependency.get(StatusBarStateController.class).addCallback(this); + public NotificationGroupManager(StatusBarStateController statusBarStateController) { + statusBarStateController.addCallback(this); } /** @@ -450,11 +446,6 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, public void onHeadsUpUnPinned(NotificationEntry entry) { } - @Override - public void onAmbientStateChanged(NotificationEntry entry, boolean isAmbient) { - onAlertStateChanged(entry, isAmbient); - } - @Override public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) { onAlertStateChanged(entry, isHeadsUp); @@ -485,7 +476,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, if (!sbn.isGroup() || sbn.getNotification().isGroupSummary()) { return false; } - if (!mHeadsUpManager.isAlerting(entry.key) && !mAmbientPulseManager.isAlerting(entry.key)) { + if (!mHeadsUpManager.isAlerting(entry.key)) { return false; } return (sbn.getNotification().fullScreenIntent != null diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 5badc2e9a70a..56a61546faba 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -3126,7 +3126,6 @@ public class NotificationPanelView extends PanelView implements mNotificationStackScroller.setIconAreaController(notificationIconAreaController); mNotificationStackScroller.setStatusBar(statusBar); mNotificationStackScroller.setGroupManager(groupManager); - mNotificationStackScroller.setHeadsUpManager(headsUpManager); mNotificationStackScroller.setShelf(notificationShelf); mNotificationStackScroller.setScrimController(scrimController); updateShowEmptyShadeView(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 3cde49300d93..2fc7ea910531 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -172,7 +172,6 @@ import com.android.systemui.recents.ScreenPinningRequest; import com.android.systemui.shared.system.WindowManagerWrapper; import com.android.systemui.stackdivider.Divider; import com.android.systemui.stackdivider.WindowManagerProxy; -import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.BackDropView; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CrossFadeHelper; @@ -246,8 +245,7 @@ public class StatusBar extends SystemUI implements DemoMode, OnHeadsUpChangedListener, CommandQueue.Callbacks, ZenModeController.Callback, ColorExtractor.OnColorsChangedListener, ConfigurationListener, StatusBarStateController.StateListener, ShadeController, - ActivityLaunchAnimator.Callback, AmbientPulseManager.OnAmbientChangedListener, - AppOpsController.Callback { + ActivityLaunchAnimator.Callback, AppOpsController.Callback { public static final boolean MULTIUSER_DEBUG = false; public static final boolean ENABLE_CHILD_NOTIFICATIONS @@ -385,6 +383,8 @@ public class StatusBar extends SystemUI implements DemoMode, NotificationWakeUpCoordinator mWakeUpCoordinator; @Inject KeyguardBypassController mKeyguardBypassController; + @Inject + protected HeadsUpManagerPhone mHeadsUpManager; // expanded notifications protected NotificationPanelView mNotificationPanel; // the sliding/resizing panel within the notification window @@ -868,17 +868,13 @@ public class StatusBar extends SystemUI implements DemoMode, .commit(); mIconController = Dependency.get(StatusBarIconController.class); - mHeadsUpManager = new HeadsUpManagerPhone(context, mStatusBarWindow, mGroupManager, this, - mVisualStabilityManager); + mHeadsUpManager.setUp(mStatusBarWindow, mGroupManager, this, mVisualStabilityManager); Dependency.get(ConfigurationController.class).addCallback(mHeadsUpManager); mHeadsUpManager.addListener(this); mHeadsUpManager.addListener(mNotificationPanel); mHeadsUpManager.addListener(mGroupManager); mHeadsUpManager.addListener(mGroupAlertTransferHelper); mHeadsUpManager.addListener(mVisualStabilityManager); - mAmbientPulseManager.addListener(this); - mAmbientPulseManager.addListener(mGroupManager); - mAmbientPulseManager.addListener(mGroupAlertTransferHelper); mNotificationPanel.setHeadsUpManager(mHeadsUpManager); mGroupManager.setHeadsUpManager(mHeadsUpManager); mGroupAlertTransferHelper.setHeadsUpManager(mHeadsUpManager); @@ -1060,7 +1056,9 @@ public class StatusBar extends SystemUI implements DemoMode, final NotificationRowBinderImpl rowBinder = new NotificationRowBinderImpl( mContext, - SystemUIFactory.getInstance().provideAllowNotificationLongPress()); + SystemUIFactory.getInstance().provideAllowNotificationLongPress(), + mKeyguardBypassController, + mStatusBarStateController); mPresenter = new StatusBarNotificationPresenter(mContext, mNotificationPanel, mHeadsUpManager, mStatusBarWindow, mStackScroller, mDozeScrimController, @@ -1579,14 +1577,12 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) { mEntryManager.updateNotifications(); - } - - @Override - public void onAmbientStateChanged(NotificationEntry entry, boolean isAmbient) { - mEntryManager.updateNotifications(); - if (isAmbient) { - mDozeServiceHost.fireNotificationPulse(); - } else if (!mAmbientPulseManager.hasNotifications()) { + if (isDozing()) { + if (isHeadsUp) { + mDozeServiceHost.fireNotificationPulse(); + } + } + if (!isHeadsUp && !mHeadsUpManager.hasNotifications()) { // There are no longer any notifications to show. We should end the pulse now. mDozeScrimController.pulseOutNow(); } @@ -3643,7 +3639,9 @@ public class StatusBar extends SystemUI implements DemoMode, public void onStartedWakingUp() { mDeviceInteractive = true; mWakeUpCoordinator.setWakingUp(true); - mAmbientPulseManager.releaseAllImmediately(); + if (!mKeyguardBypassController.getBypassEnabled()) { + mHeadsUpManager.releaseAllImmediately(); + } mVisualStabilityManager.setScreenOn(true); updateVisibleToUser(); updateIsKeyguard(); @@ -4049,8 +4047,8 @@ public class StatusBar extends SystemUI implements DemoMode, if (reason == DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN) { mScrimController.setWakeLockScreenSensorActive(true); } - if (mDozeScrimController.isPulsing() && mAmbientPulseManager.hasNotifications()) { - mAmbientPulseManager.extendPulse(); + if (mDozeScrimController.isPulsing() && mHeadsUpManager.hasNotifications()) { + mHeadsUpManager.extendHeadsUp(); } else { mDozeScrimController.extendPulse(); } @@ -4139,12 +4137,6 @@ public class StatusBar extends SystemUI implements DemoMode, protected NotificationGroupAlertTransferHelper mGroupAlertTransferHelper; - - // for heads up notifications - protected HeadsUpManagerPhone mHeadsUpManager; - - protected AmbientPulseManager mAmbientPulseManager = Dependency.get(AmbientPulseManager.class); - // handling reordering protected VisualStabilityManager mVisualStabilityManager; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java index e00d439dc1c7..bec53a1b2d3c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java @@ -406,8 +406,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit } private void handleFullScreenIntent(NotificationEntry entry) { - boolean isHeadsUped = mNotificationInterruptionStateProvider.shouldHeadsUp(entry); - if (!isHeadsUped && entry.notification.getNotification().fullScreenIntent != null) { + if (mNotificationInterruptionStateProvider.shouldLaunchFullScreenIntentWhenAdded(entry)) { if (shouldSuppressFullScreenIntent(entry)) { if (DEBUG) { Log.d(TAG, "No Fullscreen intent: suppressed by DND: " + entry.key); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java index 6fe89645ef19..a87dca45bf75 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java @@ -49,7 +49,6 @@ import com.android.systemui.R; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter.OnDismissAction; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationMediaManager; @@ -106,7 +105,6 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, Dependency.get(VisualStabilityManager.class); private final NotificationGutsManager mGutsManager = Dependency.get(NotificationGutsManager.class); - protected AmbientPulseManager mAmbientPulseManager = Dependency.get(AmbientPulseManager.class); private final NotificationPanelView mNotificationPanel; private final HeadsUpManagerPhone mHeadsUpManager; @@ -213,7 +211,6 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, mEntryManager.setUpWithPresenter(this, notifListContainer, mHeadsUpManager); mEntryManager.addNotificationEntryListener(notificationEntryListener); mEntryManager.addNotificationLifetimeExtender(mHeadsUpManager); - mEntryManager.addNotificationLifetimeExtender(mAmbientPulseManager); mEntryManager.addNotificationLifetimeExtender(mGutsManager); mEntryManager.addNotificationLifetimeExtenders( remoteInputManager.getLifetimeExtenders()); @@ -297,7 +294,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, private void maybeEndAmbientPulse() { if (mNotificationPanel.hasPulsingNotifications() && - !mAmbientPulseManager.hasNotifications()) { + !mHeadsUpManager.hasNotifications()) { // We were showing a pulse for a notification, but no notifications are pulsing anymore. // Finish the pulse. mDozeScrimController.pulseOutNow(); @@ -343,10 +340,6 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, } public boolean canHeadsUp(NotificationEntry entry, StatusBarNotification sbn) { - if (mShadeController.isDozing()) { - return false; - } - if (mShadeController.isOccluded()) { boolean devicePublic = mLockscreenUserManager. isLockscreenPublicMode(mLockscreenUserManager.getCurrentUserId()); @@ -354,6 +347,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, || mLockscreenUserManager.isLockscreenPublicMode(sbn.getUserId()); boolean needsRedaction = mLockscreenUserManager.needsRedaction(entry); if (userPublic && needsRedaction) { + // TODO(b/135046837): we can probably relax this with dynamic privacy return false; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java index d1a225320eb7..40d5e4dcfd64 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java @@ -416,14 +416,14 @@ public abstract class HeadsUpManager extends AlertingNotificationManager { @Override protected long calculateFinishTime() { - return mPostTime + getRecommendedTimeoutMillis(); + return mPostTime + getRecommendedHeadsUpTimeoutMs(); } /** * Get user-preferred or default timeout duration. The larger one will be returned. * @return milliseconds before auto-dismiss */ - private int getRecommendedTimeoutMillis() { + protected int getRecommendedHeadsUpTimeoutMs() { return mAccessibilityMgr.getRecommendedTimeoutMillis( mAutoDismissNotificationDecay, AccessibilityManager.FLAG_CONTENT_CONTROLS diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnHeadsUpChangedListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnHeadsUpChangedListener.java index 438226ae082d..94aa39142926 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnHeadsUpChangedListener.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnHeadsUpChangedListener.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.policy; +import android.annotation.NonNull; + import com.android.systemui.statusbar.notification.collection.NotificationEntry; /** @@ -45,5 +47,5 @@ public interface OnHeadsUpChangedListener { * @param entry the entry of the changed notification * @param isHeadsUp whether the notification is now a headsUp notification */ - default void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) {} + default void onHeadsUpStateChanged(@NonNull NotificationEntry entry, boolean isHeadsUp) {} } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AmbientPulseManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AmbientPulseManagerTest.java deleted file mode 100644 index 0b25a7c8e07c..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AmbientPulseManagerTest.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.systemui.statusbar; - -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; - -import android.testing.AndroidTestingRunner; -import android.testing.TestableLooper; - -import androidx.test.filters.SmallTest; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - -@SmallTest -@RunWith(AndroidTestingRunner.class) -@TestableLooper.RunWithLooper -public class AmbientPulseManagerTest extends AlertingNotificationManagerTest { - @Rule - public MockitoRule rule = MockitoJUnit.rule(); - - private static final int TEST_EXTENSION_TIME = 500; - private AmbientPulseManager mAmbientPulseManager; - private boolean mLivesPastNormalTime; - - protected AlertingNotificationManager createAlertingNotificationManager() { - return mAmbientPulseManager; - } - - @Before - public void setUp() { - mAmbientPulseManager = new AmbientPulseManager(mContext); - mAmbientPulseManager.mMinimumDisplayTime = TEST_MINIMUM_DISPLAY_TIME; - mAmbientPulseManager.mAutoDismissNotificationDecay = TEST_AUTO_DISMISS_TIME; - mAmbientPulseManager.mExtensionTime = TEST_EXTENSION_TIME; - super.setUp(); - mAmbientPulseManager.mHandler = mTestHandler; - } - - @Test - public void testExtendPulse() { - mAmbientPulseManager.showNotification(mEntry); - Runnable pastNormalTimeRunnable = - () -> mLivesPastNormalTime = mAmbientPulseManager.isAlerting(mEntry.key); - mTestHandler.postDelayed(pastNormalTimeRunnable, - mAmbientPulseManager.mAutoDismissNotificationDecay + - mAmbientPulseManager.mExtensionTime / 2); - mTestHandler.postDelayed(TEST_TIMEOUT_RUNNABLE, TEST_TIMEOUT_TIME); - - mAmbientPulseManager.extendPulse(); - - // Wait for normal time runnable and extended remove runnable and process them on arrival. - TestableLooper.get(this).processMessages(2); - - assertFalse("Test timed out", mTimedOut); - assertTrue("Pulse was not extended", mLivesPastNormalTime); - assertFalse(mAmbientPulseManager.isAlerting(mEntry.key)); - } -} - diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java index 028fd7afd945..de8dcfe2253f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java @@ -20,6 +20,8 @@ import static android.app.Notification.FLAG_BUBBLE; import static android.app.NotificationManager.IMPORTANCE_DEFAULT; import static android.app.NotificationManager.IMPORTANCE_HIGH; +import static org.mockito.Mockito.mock; + import android.annotation.Nullable; import android.app.ActivityManager; import android.app.Instrumentation; @@ -40,6 +42,7 @@ import androidx.test.InstrumentationRegistry; import com.android.systemui.R; import com.android.systemui.bubbles.BubblesTestActivity; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.NotificationContentInflater.InflationFlag; @@ -66,14 +69,17 @@ public class NotificationTestHelper { private final Context mContext; private final Instrumentation mInstrumentation; private int mId; - private final NotificationGroupManager mGroupManager = new NotificationGroupManager(); + private final NotificationGroupManager mGroupManager; private ExpandableNotificationRow mRow; - private HeadsUpManager mHeadsUpManager; + private HeadsUpManagerPhone mHeadsUpManager; public NotificationTestHelper(Context context) { mContext = context; mInstrumentation = InstrumentationRegistry.getInstrumentation(); - mHeadsUpManager = new HeadsUpManagerPhone(mContext, null, mGroupManager, null, null); + StatusBarStateController stateController = mock(StatusBarStateController.class); + mGroupManager = new NotificationGroupManager(stateController); + mHeadsUpManager = new HeadsUpManagerPhone(mContext, stateController); + mHeadsUpManager.setUp(null, mGroupManager, null, null); mGroupManager.setHeadsUpManager(mHeadsUpManager); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java index 72f3a62f30a7..2ca1b0611cd6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java @@ -64,6 +64,7 @@ import com.android.systemui.ForegroundServiceController; import com.android.systemui.InitController; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationLifetimeExtender; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationLockscreenUserManager; @@ -83,6 +84,7 @@ import com.android.systemui.statusbar.notification.row.NotificationContentInflat import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.row.RowInflaterTask; import com.android.systemui.statusbar.notification.stack.NotificationListContainer; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; @@ -247,7 +249,8 @@ public class NotificationEntryManagerTest extends SysuiTestCase { mEntryManager.setNotificationRemoveInterceptor(mRemoveInterceptor); NotificationRowBinderImpl notificationRowBinder = - new NotificationRowBinderImpl(mContext, true /* allowLongPress */); + new NotificationRowBinderImpl(mContext, true, /* allowLongPress */ + mock(KeyguardBypassController.class), mock(StatusBarStateController.class)); notificationRowBinder.setUpWithPresenter( mPresenter, mListContainer, mHeadsUpManager, mEntryManager, mBindCallback); notificationRowBinder.setNotificationClicker(mock(NotificationClicker.class)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java index 91a7ea87a93b..6f7751b2e2a5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java @@ -40,6 +40,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.ForegroundServiceController; import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationTestHelper; import com.android.systemui.statusbar.notification.collection.NotificationData; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -90,7 +91,7 @@ public class NotificationFilterTest extends SysuiTestCase { .thenReturn(PackageManager.PERMISSION_GRANTED); mDependency.injectTestDependency(ForegroundServiceController.class, mFsc); mDependency.injectTestDependency(NotificationGroupManager.class, - new NotificationGroupManager()); + new NotificationGroupManager(mock(StatusBarStateController.class))); mDependency.injectMockDependency(ShadeController.class); mDependency.injectTestDependency(NotificationData.KeyguardEnvironment.class, mEnvironment); when(mEnvironment.isDeviceProvisioned()).thenReturn(true); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationDataTest.java index 6e0ddbf0cc46..260555f71256 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationDataTest.java @@ -66,6 +66,7 @@ import com.android.systemui.Dependency; import com.android.systemui.ForegroundServiceController; import com.android.systemui.InitController; import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationTestHelper; import com.android.systemui.statusbar.notification.collection.NotificationData.KeyguardEnvironment; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; @@ -125,7 +126,7 @@ public class NotificationDataTest extends SysuiTestCase { mDependency.injectTestDependency(ForegroundServiceController.class, mFsc); mDependency.injectTestDependency(NotificationGroupManager.class, - new NotificationGroupManager()); + new NotificationGroupManager(mock(StatusBarStateController.class))); mDependency.injectMockDependency(ShadeController.class); mDependency.injectTestDependency(KeyguardEnvironment.class, mEnvironment); when(mEnvironment.isDeviceProvisioned()).thenReturn(true); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java index 8d3c54988001..d526d104630e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java @@ -49,6 +49,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationTestHelper; import com.android.systemui.statusbar.notification.AboveShelfChangedListener; import com.android.systemui.statusbar.notification.stack.NotificationChildrenContainer; @@ -135,13 +136,6 @@ public class ExpandableNotificationRowTest extends SysuiTestCase { verify(row).updateShelfIconColor(); } - @Test - public void testIconColorShouldBeUpdatedWhenSettingDark() throws Exception { - ExpandableNotificationRow row = spy(mNotificationTestHelper.createRow()); - row.setDozing(true, false, 0); - verify(row).updateShelfIconColor(); - } - @Test public void testFreeContentViewWhenSafe() throws Exception { ExpandableNotificationRow row = mNotificationTestHelper.createRow(FLAG_CONTENT_VIEW_ALL); @@ -210,7 +204,9 @@ public class ExpandableNotificationRowTest extends SysuiTestCase { @Test public void testClickSound() throws Exception { assertTrue("Should play sounds by default.", mGroupRow.isSoundEffectsEnabled()); - mGroupRow.setDozing(true /* dark */, false /* fade */, 0 /* delay */); + StatusBarStateController mock = mock(StatusBarStateController.class); + when(mock.isDozing()).thenReturn(true); + mGroupRow.setStatusBarStateController(mock); mGroupRow.setSecureStateProvider(()-> false); assertFalse("Shouldn't play sounds when dark and trusted.", mGroupRow.isSoundEffectsEnabled()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java index 025296d14da4..8fcef4dccadb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java @@ -17,7 +17,6 @@ package com.android.systemui.statusbar.notification.row; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_ALL; -import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_AMBIENT; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_EXPANDED; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_HEADS_UP; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_PUBLIC; @@ -135,7 +134,6 @@ public class NotificationContentInflaterTest extends SysuiTestCase { mNotificationInflater); assertNotNull(mRow.getPrivateLayout().getHeadsUpChild()); - assertNull(mRow.getShowingLayout().getAmbientChild()); verify(mRow).onNotificationUpdated(); } @@ -177,7 +175,7 @@ public class NotificationContentInflaterTest extends SysuiTestCase { result, FLAG_CONTENT_VIEW_EXPANDED, 0, - new ArrayMap() /* cachedContentViews */, mRow, false /* redactAmbient */, + new ArrayMap() /* cachedContentViews */, mRow, true /* isNewView */, (v, p, r) -> true, new InflationCallback() { @Override @@ -209,14 +207,12 @@ public class NotificationContentInflaterTest extends SysuiTestCase { @Test public void testUpdateNeedsRedactionReinflatesChangedContentViews() { - mNotificationInflater.updateInflationFlag(FLAG_CONTENT_VIEW_AMBIENT, true); mNotificationInflater.updateInflationFlag(FLAG_CONTENT_VIEW_PUBLIC, true); mNotificationInflater.updateNeedsRedaction(true); NotificationContentInflater.AsyncInflationTask asyncInflationTask = (NotificationContentInflater.AsyncInflationTask) mRow.getEntry().getRunningTask(); - assertEquals(FLAG_CONTENT_VIEW_AMBIENT | FLAG_CONTENT_VIEW_PUBLIC, - asyncInflationTask.getReInflateFlags()); + assertEquals(FLAG_CONTENT_VIEW_PUBLIC, asyncInflationTask.getReInflateFlags()); asyncInflationTask.abort(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java index 377aa0bacd36..675b3efc5a26 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java @@ -50,8 +50,6 @@ public class NotificationContentViewTest extends SysuiTestCase { NotificationContentView mView; - private Icon mActionIcon; - @Before @UiThreadTest public void setup() { @@ -62,12 +60,11 @@ public class NotificationContentViewTest extends SysuiTestCase { doReturn(10).when(mockRow).getIntrinsicHeight(); mView.setContainingNotification(mockRow); - mView.setHeights(10, 20, 30, 40); + mView.setHeights(10, 20, 30); mView.setContractedChild(createViewWithHeight(10)); mView.setExpandedChild(createViewWithHeight(20)); mView.setHeadsUpChild(createViewWithHeight(30)); - mView.setAmbientChild(createViewWithHeight(40)); mView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); mView.layout(0, 0, mView.getMeasuredWidth(), mView.getMeasuredHeight()); @@ -79,16 +76,6 @@ public class NotificationContentViewTest extends SysuiTestCase { return view; } - @Test - @UiThreadTest - public void animationStartType_getsClearedAfterUpdatingVisibilitiesWithoutAnimation() { - mView.setHeadsUp(true); - mView.setDozing(true, false, 0); - mView.setDozing(false, true, 0); - mView.setHeadsUpAnimatingAway(true); - assertFalse(mView.isAnimatingVisibleType()); - } - @Test @UiThreadTest public void testShowAppOpsIcons() { @@ -101,14 +88,10 @@ public class NotificationContentViewTest extends SysuiTestCase { NotificationHeaderView mockHeadsUp = mock(NotificationHeaderView.class); when(mockHeadsUp.findViewById(com.android.internal.R.id.notification_header)) .thenReturn(mockHeadsUp); - NotificationHeaderView mockAmbient = mock(NotificationHeaderView.class); - when(mockAmbient.findViewById(com.android.internal.R.id.notification_header)) - .thenReturn(mockAmbient); mView.setContractedChild(mockContracted); mView.setExpandedChild(mockExpanded); mView.setHeadsUpChild(mockHeadsUp); - mView.setAmbientChild(mockAmbient); ArraySet ops = new ArraySet<>(); ops.add(AppOpsManager.OP_ANSWER_PHONE_CALLS); @@ -116,7 +99,6 @@ public class NotificationContentViewTest extends SysuiTestCase { verify(mockContracted, times(1)).showAppOpsIcons(ops); verify(mockExpanded, times(1)).showAppOpsIcons(ops); - verify(mockAmbient, never()).showAppOpsIcons(ops); verify(mockHeadsUp, times(1)).showAppOpsIcons(any()); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java index 1b4acd71ad31..7e6335d4e290 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java @@ -30,7 +30,7 @@ import android.testing.TestableLooper.RunWithLooper; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; -import com.android.systemui.statusbar.AmbientPulseManager; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationTestHelper; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; @@ -56,12 +56,12 @@ public class NotificationRoundnessManagerTest extends SysuiTestCase { private ExpandableNotificationRow mFirst; private ExpandableNotificationRow mSecond; @Mock - private AmbientPulseManager mAmbientPulseManager; + private StatusBarStateController mStatusBarStateController; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - mRoundnessManager = new NotificationRoundnessManager(mAmbientPulseManager); + mRoundnessManager = new NotificationRoundnessManager(); com.android.systemui.util.Assert.sMainLooper = TestableLooper.get(this).getLooper(); NotificationTestHelper testHelper = new NotificationTestHelper(getContext()); mFirst = testHelper.createRow(); @@ -147,11 +147,15 @@ public class NotificationRoundnessManagerTest extends SysuiTestCase { NotificationEntry entry = mock(NotificationEntry.class); when(entry.getRow()).thenReturn(row); - mRoundnessManager.onAmbientStateChanged(entry, true); + when(mStatusBarStateController.isDozing()).thenReturn(true); + row.setStatusBarStateController(mStatusBarStateController); + row.setHeadsUp(true); + mRoundnessManager.onHeadsUpStateChanged(entry, true); Assert.assertEquals(1f, row.getCurrentBottomRoundness(), 0.0f); Assert.assertEquals(1f, row.getCurrentTopRoundness(), 0.0f); - mRoundnessManager.onAmbientStateChanged(entry, false); + row.setHeadsUp(false); + mRoundnessManager.onHeadsUpStateChanged(entry, false); Assert.assertEquals(0f, row.getCurrentBottomRoundness(), 0.0f); Assert.assertEquals(0f, row.getCurrentTopRoundness(), 0.0f); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index c1780467daf9..7a59160dc5c0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -54,7 +54,6 @@ import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.EmptyShadeView; import com.android.systemui.statusbar.NotificationPresenter; import com.android.systemui.statusbar.NotificationRemoteInputManager; @@ -69,6 +68,7 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.FooterView; import com.android.systemui.statusbar.notification.row.NotificationBlockingHelperManager; import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.ShadeController; @@ -112,6 +112,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Mock private RemoteInputController mRemoteInputController; @Mock private MetricsLogger mMetricsLogger; @Mock private NotificationRoundnessManager mNotificationRoundnessManager; + @Mock private KeyguardBypassController mKeyguardBypassController; private TestableNotificationEntryManager mEntryManager; private int mOriginalInterruptionModelSetting; @@ -151,15 +152,15 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { // member variables, not the spy's member variables. mStackScrollerInternal = new NotificationStackScrollLayout(getContext(), null, true /* allowLongPress */, mNotificationRoundnessManager, - new AmbientPulseManager(mContext), mock(DynamicPrivacyController.class), mock(ActivityStarterDelegate.class), - mock(StatusBarStateController.class)); + mock(StatusBarStateController.class), + mHeadsUpManager, + mKeyguardBypassController); mStackScroller = spy(mStackScrollerInternal); mStackScroller.setShelf(notificationShelf); mStackScroller.setStatusBar(mBar); mStackScroller.setScrimController(mock(ScrimController.class)); - mStackScroller.setHeadsUpManager(mHeadsUpManager); mStackScroller.setGroupManager(mGroupManager); mStackScroller.setEmptyShadeView(mEmptyShadeView); @@ -432,9 +433,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Test @UiThreadTest - public void testOnMenuShownLogging() { - // Set up the object under test to have a valid mHeadsUpManager. See notes in setup. - mStackScrollerInternal.setHeadsUpManager(mHeadsUpManager); + public void testOnMenuShownLogging() { ; ExpandableNotificationRow row = mock(ExpandableNotificationRow.class, RETURNS_DEEP_STUBS); when(row.getStatusBarNotification().getLogMaker()).thenReturn(new LogMaker( diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java index 7bd41584f889..a66345bfe3a0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java @@ -29,6 +29,7 @@ import android.view.View; import androidx.test.filters.SmallTest; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.AlertingNotificationManager; import com.android.systemui.statusbar.AlertingNotificationManagerTest; import com.android.systemui.statusbar.notification.VisualStabilityManager; @@ -55,14 +56,19 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest { @Mock private View mStatusBarWindowView; @Mock private VisualStabilityManager mVSManager; @Mock private StatusBar mBar; + @Mock private StatusBarStateController mStatusBarStateController; + private boolean mLivesPastNormalTime; private final class TestableHeadsUpManagerPhone extends HeadsUpManagerPhone { TestableHeadsUpManagerPhone(Context context, View statusBarWindowView, NotificationGroupManager groupManager, StatusBar bar, - VisualStabilityManager vsManager) { - super(context, statusBarWindowView, groupManager, bar, vsManager); + VisualStabilityManager vsManager, + StatusBarStateController statusBarStateController) { + super(context, statusBarStateController); + setUp(statusBarWindowView, groupManager, bar, vsManager); mMinimumDisplayTime = TEST_MINIMUM_DISPLAY_TIME; mAutoDismissNotificationDecay = TEST_AUTO_DISMISS_TIME; + mAutoDismissNotificationDecayDozing = TEST_AUTO_DISMISS_TIME; } } @@ -72,13 +78,13 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest { @Before public void setUp() { - AccessibilityManagerWrapper mAccessibilityMgr = + AccessibilityManagerWrapper accessibilityMgr = mDependency.injectMockDependency(AccessibilityManagerWrapper.class); - when(mAccessibilityMgr.getRecommendedTimeoutMillis(anyInt(), anyInt())) + when(accessibilityMgr.getRecommendedTimeoutMillis(anyInt(), anyInt())) .thenReturn(TEST_AUTO_DISMISS_TIME); when(mVSManager.isReorderingAllowed()).thenReturn(true); mHeadsUpManager = new TestableHeadsUpManagerPhone(mContext, mStatusBarWindowView, - mGroupManager, mBar, mVSManager); + mGroupManager, mBar, mVSManager, mStatusBarStateController); super.setUp(); mHeadsUpManager.mHandler = mTestHandler; } @@ -122,4 +128,26 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest { // Notification is "behind" a higher priority notification so we can remove it immediately. assertTrue(mHeadsUpManager.canRemoveImmediately(mEntry.key)); } + + + @Test + public void testExtendHeadsUp() { + when(mStatusBarStateController.isDozing()).thenReturn(true); + mHeadsUpManager.showNotification(mEntry); + Runnable pastNormalTimeRunnable = + () -> mLivesPastNormalTime = mHeadsUpManager.isAlerting(mEntry.key); + mTestHandler.postDelayed(pastNormalTimeRunnable, + mHeadsUpManager.mAutoDismissNotificationDecayDozing + + mHeadsUpManager.mExtensionTime / 2); + mTestHandler.postDelayed(TEST_TIMEOUT_RUNNABLE, TEST_TIMEOUT_TIME); + + mHeadsUpManager.extendHeadsUp(); + + // Wait for normal time runnable and extended remove runnable and process them on arrival. + TestableLooper.get(this).processMessages(2); + + assertFalse("Test timed out", mTimedOut); + assertTrue("Pulse was not extended", mLivesPastNormalTime); + assertFalse(mHeadsUpManager.isAlerting(mEntry.key)); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java index 337c35c39ca1..b1c3c83e938e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.phone; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -32,7 +33,7 @@ import android.testing.TestableLooper; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; -import com.android.systemui.statusbar.AmbientPulseManager; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.notification.NotificationEntryListener; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -58,7 +59,6 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase { private NotificationGroupAlertTransferHelper mGroupAlertTransferHelper; private NotificationGroupManager mGroupManager; - private AmbientPulseManager mAmbientPulseManager; private HeadsUpManager mHeadsUpManager; @Mock private NotificationEntryManager mNotificationEntryManager; @Captor @@ -71,14 +71,12 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase { @Before public void setup() { - mAmbientPulseManager = new AmbientPulseManager(mContext); - mDependency.injectTestDependency(AmbientPulseManager.class, mAmbientPulseManager); mHeadsUpManager = new HeadsUpManager(mContext) {}; when(mNotificationEntryManager.getPendingNotificationsIterator()) .thenReturn(mPendingEntries.values()); - mGroupManager = new NotificationGroupManager(); + mGroupManager = new NotificationGroupManager(mock(StatusBarStateController.class)); mDependency.injectTestDependency(NotificationGroupManager.class, mGroupManager); mGroupManager.setHeadsUpManager(mHeadsUpManager); @@ -89,7 +87,6 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase { verify(mNotificationEntryManager).addNotificationEntryListener(mListenerCaptor.capture()); mNotificationEntryListener = mListenerCaptor.getValue(); mHeadsUpManager.addListener(mGroupAlertTransferHelper); - mAmbientPulseManager.addListener(mGroupAlertTransferHelper); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java index 43685f0513e7..dd274c7c09b9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java @@ -21,6 +21,7 @@ import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.testing.AndroidTestingRunner; @@ -29,7 +30,7 @@ import android.testing.TestableLooper; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; -import com.android.systemui.statusbar.AmbientPulseManager; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.policy.HeadsUpManager; @@ -53,17 +54,14 @@ public class NotificationGroupManagerTest extends SysuiTestCase { new NotificationGroupTestHelper(mContext); @Mock HeadsUpManager mHeadsUpManager; - @Mock AmbientPulseManager mAmbientPulseManager; @Before public void setup() { - mDependency.injectTestDependency(AmbientPulseManager.class, mAmbientPulseManager); - initializeGroupManager(); } private void initializeGroupManager() { - mGroupManager = new NotificationGroupManager(); + mGroupManager = new NotificationGroupManager(mock(StatusBarStateController.class)); mGroupManager.setHeadsUpManager(mHeadsUpManager); } @@ -146,21 +144,4 @@ public class NotificationGroupManagerTest extends SysuiTestCase { assertEquals(childEntry, mGroupManager.getGroupSummary(childEntry.notification)); assertEquals(summaryEntry, mGroupManager.getLogicalGroupSummary(childEntry.notification)); } - - @Test - public void testAmbientPulseEntryIsIsolated() { - NotificationEntry childEntry = mGroupTestHelper.createChildNotification(); - NotificationEntry summaryEntry = mGroupTestHelper.createSummaryNotification(); - mGroupManager.onEntryAdded(summaryEntry); - mGroupManager.onEntryAdded(childEntry); - mGroupManager.onEntryAdded(mGroupTestHelper.createChildNotification()); - when(mAmbientPulseManager.isAlerting(childEntry.key)).thenReturn(true); - - mGroupManager.onAmbientStateChanged(childEntry, true); - - // Child entries that are heads upped should be considered separate groups visually even if - // they are the same group logically - assertEquals(childEntry, mGroupManager.getGroupSummary(childEntry.notification)); - assertEquals(summaryEntry, mGroupManager.getLogicalGroupSummary(childEntry.notification)); - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java index e0e4a25a9f90..e92dd4c44e7d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java @@ -37,7 +37,6 @@ import com.android.keyguard.KeyguardStatusView; import com.android.systemui.SystemUIFactory; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.KeyguardAffordanceView; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationShelf; @@ -116,7 +115,7 @@ public class NotificationPanelViewTest extends SysuiTestCase { mock(TunerService.class)); NotificationWakeUpCoordinator coordinator = new NotificationWakeUpCoordinator(mContext, - new AmbientPulseManager(mContext), + mock(HeadsUpManagerPhone.class), new StatusBarStateControllerImpl(), bypassController); PulseExpansionHandler expansionHandler = new PulseExpansionHandler(mContext, coordinator); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index 79e05c373534..0baf92351d81 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -222,6 +222,7 @@ public class StatusBarTest extends SysuiTestCase { mNotificationLogger = new NotificationLogger(mNotificationListener, Dependency.get(UiOffloadThread.class), mEntryManager, mStatusBarStateController, mExpansionStateLogger); + mNotificationLogger.setVisibilityReporter(mock(Runnable.class)); mDependency.injectTestDependency(NotificationLogger.class, mNotificationLogger); DozeLog.traceDozing(mContext, false /* dozing */); @@ -253,7 +254,7 @@ public class StatusBarTest extends SysuiTestCase { when(mRemoteInputManager.getController()).thenReturn(mRemoteInputController); mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache, - mKeyguardIndicationController, mStackScroller, mHeadsUpManager, + mKeyguardIndicationController, mStackScroller, mPowerManager, mNotificationPanelView, mBarService, mNotificationListener, mNotificationLogger, mVisualStabilityManager, mViewHierarchyManager, mEntryManager, mScrimController, mBiometricUnlockController, @@ -269,19 +270,13 @@ public class StatusBarTest extends SysuiTestCase { SystemUIFactory.getInstance().getRootComponent() .getStatusBarInjector() .createStatusBar(mStatusBar); + mStatusBar.setHeadsUpManager(mHeadsUpManager); mStatusBar.putComponent(StatusBar.class, mStatusBar); Dependency.get(InitController.class).executePostInitTasks(); mEntryManager.setUpForTest(mock(NotificationPresenter.class), mStackScroller, mHeadsUpManager, mNotificationData); mEntryManager.addNotificationEntryListener(mEntryListener); mNotificationLogger.setUpWithContainer(mStackScroller); - - TestableLooper.get(this).setMessageHandler(m -> { - if (m.getCallback() == mStatusBar.mNotificationLogger.getVisibilityReporter()) { - return false; - } - return true; - }); } @Test @@ -765,7 +760,7 @@ public class StatusBarTest extends SysuiTestCase { static class TestableStatusBar extends StatusBar { public TestableStatusBar(StatusBarKeyguardViewManager man, UnlockMethodCache unlock, KeyguardIndicationController key, - NotificationStackScrollLayout stack, HeadsUpManagerPhone hum, + NotificationStackScrollLayout stack, PowerManager pm, NotificationPanelView panelView, IStatusBarService barService, NotificationListener notificationListener, NotificationLogger notificationLogger, @@ -794,7 +789,6 @@ public class StatusBarTest extends SysuiTestCase { mUnlockMethodCache = unlock; mKeyguardIndicationController = key; mStackScroller = stack; - mHeadsUpManager = hum; mPowerManager = pm; mNotificationPanel = panelView; mBarService = barService; @@ -842,6 +836,10 @@ public class StatusBarTest extends SysuiTestCase { mState = state; } + void setHeadsUpManager(HeadsUpManagerPhone headsUpManager) { + mHeadsUpManager = headsUpManager; + } + public void setUserSetupForTest(boolean userSetup) { mUserSetup = userSetup; } -- GitLab From 0877aabf28073cf56f4e837d702a75111f12ac61 Mon Sep 17 00:00:00 2001 From: Robert Snoeberger Date: Tue, 11 Jun 2019 16:48:41 -0400 Subject: [PATCH 093/620] Reduce overlap of analog clock with smart space. To reduce overlap, this change biases offset to positive Y so that the clock remains lower on the screen. Note that this doesn't prevent overlap. It only helps reduce it. Bug: 133188468 Test: collected screenshots over accelerated 24 hrs and looked for overlap. Change-Id: Ib6bdc19a5c93af2cd5df8400e2fa3106c281acf9 --- .../SystemUI/src/com/android/keyguard/clock/ClockLayout.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockLayout.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockLayout.java index 19083459a87c..7485d336174c 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/ClockLayout.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockLayout.java @@ -94,7 +94,8 @@ public class ClockLayout extends FrameLayout { getBurnInOffset(mBurnInPreventionOffsetX * 2, true) - mBurnInPreventionOffsetX, mDarkAmount); final float offsetY = MathUtils.lerp(0f, - getBurnInOffset(mBurnInPreventionOffsetY * 2, false) - mBurnInPreventionOffsetY, + getBurnInOffset(mBurnInPreventionOffsetY * 2, false) + - 0.5f * mBurnInPreventionOffsetY, mDarkAmount); // Put the analog clock in the middle of the screen. -- GitLab From da330ff413c6761e1d82c2b3cb12798067e5df80 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Tue, 11 Jun 2019 15:41:28 -0700 Subject: [PATCH 094/620] Fixes an issue where the wrong icons where ambient This is a regression from P from when we hid the statusbar icons of non-high-priority notifications by default Fixes: 134444704 Test: atest SystemUITests Merged-In: I2e571353735efb0d763ecc236f60aefe4c2b51d4 Change-Id: I2e571353735efb0d763ecc236f60aefe4c2b51d4 --- .../stack/NotificationStackScrollLayout.java | 16 ++++++++-------- .../phone/NotificationIconAreaController.java | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 4e48eff6083d..c6a6643684c9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -20,7 +20,7 @@ import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator.ExpandAnimationParameters; import static com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.ANCHOR_SCROLLING; import static com.android.systemui.statusbar.notification.stack.StackStateAnimator.ANIMATION_DURATION_SWIPE; -import static com.android.systemui.statusbar.phone.NotificationIconAreaController.LOW_PRIORITY; +import static com.android.systemui.statusbar.phone.NotificationIconAreaController.HIGH_PRIORITY; import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT; import static java.lang.annotation.RetentionPolicy.SOURCE; @@ -186,7 +186,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private int mCurrentStackHeight = Integer.MAX_VALUE; private final Paint mBackgroundPaint = new Paint(); private final boolean mShouldDrawNotificationBackground; - private boolean mLowPriorityBeforeSpeedBump; + private boolean mHighPriorityBeforeSpeedBump; private final boolean mAllowLongPress; private boolean mDismissRtl; @@ -580,12 +580,12 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd TunerService tunerService = Dependency.get(TunerService.class); tunerService.addTunable((key, newValue) -> { - if (key.equals(LOW_PRIORITY)) { - mLowPriorityBeforeSpeedBump = "1".equals(newValue); + if (key.equals(HIGH_PRIORITY)) { + mHighPriorityBeforeSpeedBump = "1".equals(newValue); } else if (key.equals(Settings.Secure.NOTIFICATION_DISMISS_RTL)) { updateDismissRtlSetting("1".equals(newValue)); } - }, LOW_PRIORITY, Settings.Secure.NOTIFICATION_DISMISS_RTL); + }, HIGH_PRIORITY, Settings.Secure.NOTIFICATION_DISMISS_RTL); mEntryManager.addNotificationEntryListener(new NotificationEntryListener() { @Override @@ -5711,10 +5711,10 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd ExpandableNotificationRow row = (ExpandableNotificationRow) view; currentIndex++; boolean beforeSpeedBump; - if (mLowPriorityBeforeSpeedBump) { - beforeSpeedBump = !row.getEntry().ambient; - } else { + if (mHighPriorityBeforeSpeedBump) { beforeSpeedBump = row.getEntry().isHighPriority(); + } else { + beforeSpeedBump = !row.getEntry().ambient; } if (beforeSpeedBump) { speedBumpIndex = currentIndex; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index 177b72a01f85..4fb5b98ec3ad 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -43,7 +43,7 @@ import java.util.function.Function; public class NotificationIconAreaController implements DarkReceiver, StatusBarStateController.StateListener { - public static final String LOW_PRIORITY = "low_priority"; + public static final String HIGH_PRIORITY = "high_priority"; private static final long AOD_ICONS_APPEAR_DURATION = 200; private final ContrastColorUtil mContrastColorUtil; -- GitLab From ce743b7e42aedb2e5c1bfc907b263b71f13fbdd0 Mon Sep 17 00:00:00 2001 From: Ady Abraham Date: Tue, 11 Jun 2019 19:16:12 -0700 Subject: [PATCH 095/620] DisplayModeDirector: make settings higher priority than app request Applications can still set refresh rate to 90Hz even if the Peak refresh rate setting is disabled. This prevents users disable 90Hz completely (to preserve power for example). Users should have the option to do so. Fixes: 135044304 Test: Disable peak refresh rate and run an app that requests 90Hz Change-Id: I7ab809f9bf75f91e983873b8993cf4a22010a5ea --- .../server/display/DisplayModeDirector.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index fee60d01affc..14bd2d8150da 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -402,18 +402,18 @@ public class DisplayModeDirector { } private static final class Vote { - public static final int PRIORITY_USER_SETTING = 0; // We split the app request into two priorities in case we can satisfy one desire without // the other. - public static final int PRIORITY_APP_REQUEST_REFRESH_RATE = 1; - public static final int PRIORITY_APP_REQUEST_SIZE = 2; + public static final int PRIORITY_APP_REQUEST_REFRESH_RATE = 0; + public static final int PRIORITY_APP_REQUEST_SIZE = 1; + public static final int PRIORITY_USER_SETTING_REFRESH_RATE = 2; public static final int PRIORITY_LOW_BRIGHTNESS = 3; public static final int PRIORITY_LOW_POWER_MODE = 4; // Whenever a new priority is added, remember to update MIN_PRIORITY and/or MAX_PRIORITY as // appropriate, as well as priorityToString. - public static final int MIN_PRIORITY = PRIORITY_USER_SETTING; + public static final int MIN_PRIORITY = PRIORITY_APP_REQUEST_REFRESH_RATE; public static final int MAX_PRIORITY = PRIORITY_LOW_POWER_MODE; /** @@ -457,12 +457,12 @@ public class DisplayModeDirector { public static String priorityToString(int priority) { switch (priority) { - case PRIORITY_USER_SETTING: - return "PRIORITY_USER_SETTING"; case PRIORITY_APP_REQUEST_REFRESH_RATE: return "PRIORITY_APP_REQUEST_REFRESH_RATE"; case PRIORITY_APP_REQUEST_SIZE: return "PRIORITY_APP_REQUEST_SIZE"; + case PRIORITY_USER_SETTING_REFRESH_RATE: + return "PRIORITY_USER_SETTING_REFRESH_RATE"; case PRIORITY_LOW_POWER_MODE: return "PRIORITY_LOW_POWER_MODE"; default: @@ -548,7 +548,7 @@ public class DisplayModeDirector { float peakRefreshRate = Settings.System.getFloat(mContext.getContentResolver(), Settings.System.PEAK_REFRESH_RATE, mDefaultPeakRefreshRate); Vote vote = Vote.forRefreshRates(0f, peakRefreshRate); - updateVoteLocked(Vote.PRIORITY_USER_SETTING, vote); + updateVoteLocked(Vote.PRIORITY_USER_SETTING_REFRESH_RATE, vote); } private void updateBrightnessSettingLocked() { -- GitLab From 94e56f929c58a3f53529b2c28c81142010b63d09 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Tue, 11 Jun 2019 19:13:54 -0700 Subject: [PATCH 096/620] Fixed an issue where too many notifications were pulsing With the bypass all notifications were pulsing. This was accidental when factoring in changes. Bug: 130327302 Test: atest SystemUITests Change-Id: Iac5fb75763c7d093c40d7532e2d9ca1a799e983e --- .../statusbar/notification/row/ExpandableNotificationRow.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index 6b94a85e331e..0ca8814bef3e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -715,7 +715,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView @Override public boolean showingPulsing() { - return isHeadsUpState() && (isDozing()) || (mOnKeyguard && isBypassEnabled()); + return isHeadsUpState() && (isDozing() || (mOnKeyguard && isBypassEnabled())); } /** -- GitLab From 13025c5326e7ba8c8db273d6a7fd1d29f2ff6b42 Mon Sep 17 00:00:00 2001 From: joshmccloskey Date: Tue, 11 Jun 2019 19:38:34 -0700 Subject: [PATCH 097/620] Updated string. Test: Manual. Fixes: 134942711 Change-Id: I13827259f94be8c43f80f74e4c1987e4073288dd --- core/res/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 76f2e7bd9792..ec41dd7e52df 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1555,8 +1555,8 @@ Turn your head a little less. Remove anything hiding your face. - - Clean the sensor at the top edge of the screen. + + Clean the top of your screen, including the black bar -- GitLab From 89233c49aa72ef926591a3e503794ff801955887 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Mon, 10 Jun 2019 18:00:22 -0700 Subject: [PATCH 098/620] Fix unreadable clock - Always use white text with shadows on media - Use lock screen colors for shade theme - Remove legacy wallpaper visibility listener - Remove shadow from black title Test: set white wallpaper Test: set dark wallpaper Test: set dark wallpaper on home, light on ls Test: set dark wallpaper on ls, light on home Test: atest SysuiColorExtractorTests Fixes: 134119878 Change-Id: I64ee2dee14322b2c02891c3ffe5fc0b25d1f100b --- .../colorextraction/ColorExtractor.java | 2 +- .../systemui/recents/RecentsActivity.java | 4 +- .../SystemUI/res-keyguard/values/styles.xml | 2 +- .../android/keyguard/KeyguardClockSwitch.java | 2 +- .../keyguard/clock/AnalogClockController.java | 2 +- .../keyguard/clock/BubbleClockController.java | 2 +- .../clock/DefaultClockController.java | 2 +- .../colorextraction/SysuiColorExtractor.java | 167 +++++------------- .../statusbar/NotificationMediaManager.java | 3 +- .../stack/NotificationStackScrollLayout.java | 10 +- .../systemui/statusbar/phone/StatusBar.java | 3 +- .../phone/StatusBarWindowController.java | 13 +- .../SysuiColorExtractorTests.java | 26 +-- 13 files changed, 56 insertions(+), 182 deletions(-) diff --git a/core/java/com/android/internal/colorextraction/ColorExtractor.java b/core/java/com/android/internal/colorextraction/ColorExtractor.java index a6286c0f03f7..3003ce80cbc1 100644 --- a/core/java/com/android/internal/colorextraction/ColorExtractor.java +++ b/core/java/com/android/internal/colorextraction/ColorExtractor.java @@ -106,7 +106,7 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener } } - private void extractWallpaperColors() { + protected void extractWallpaperColors() { GradientColors[] systemColors = mGradientColors.get(WallpaperManager.FLAG_SYSTEM); GradientColors[] lockColors = mGradientColors.get(WallpaperManager.FLAG_LOCK); extractInto(mSystemColors, diff --git a/packages/SystemUI/legacy/recents/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/legacy/recents/src/com/android/systemui/recents/RecentsActivity.java index 79c691cf45e1..a7ccc3a49073 100644 --- a/packages/SystemUI/legacy/recents/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/legacy/recents/src/com/android/systemui/recents/RecentsActivity.java @@ -323,7 +323,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD mColorExtractor = Dependency.get(SysuiColorExtractor.class); mColorExtractor.addOnColorsChangedListener(this); mUsingDarkText = mColorExtractor.getColors(ColorExtractor.TYPE_DARK, - WallpaperManager.FLAG_SYSTEM, true).supportsDarkText(); + WallpaperManager.FLAG_SYSTEM).supportsDarkText(); setTheme(mUsingDarkText ? R.style.RecentsTheme_Wallpaper_Light : R.style.RecentsTheme_Wallpaper); @@ -394,8 +394,6 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD @Override public void onColorsChanged(ColorExtractor colorExtractor, int which) { if ((which & WallpaperManager.FLAG_SYSTEM) != 0) { - // Recents doesn't care about the wallpaper being visible or not, it always - // wants to scrim with wallpaper colors ColorExtractor.GradientColors colors = mColorExtractor.getNeutralColors(); boolean darkText = colors.supportsDarkText(); if (darkText != mUsingDarkText) { diff --git a/packages/SystemUI/res-keyguard/values/styles.xml b/packages/SystemUI/res-keyguard/values/styles.xml index 9a042228435b..67c4458de2f2 100644 --- a/packages/SystemUI/res-keyguard/values/styles.xml +++ b/packages/SystemUI/res-keyguard/values/styles.xml @@ -111,7 +111,7 @@ @*android:color/background_material_dark - + + diff --git a/packages/EasterEgg/src/com/android/egg/quares/Quare.kt b/packages/EasterEgg/src/com/android/egg/quares/Quare.kt new file mode 100644 index 000000000000..eb77362a0be2 --- /dev/null +++ b/packages/EasterEgg/src/com/android/egg/quares/Quare.kt @@ -0,0 +1,168 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.egg.quares + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.drawable.Drawable +import android.graphics.drawable.Icon +import android.os.Parcel +import android.os.Parcelable +import java.util.ArrayList +import kotlin.math.abs +import kotlin.math.round + +class Quare(val width: Int, val height: Int, val depth: Int) : Parcelable { + private val data: IntArray = IntArray(width * height) + private val user: IntArray = data.copyOf() + + private fun loadAndQuantize(bitmap8bpp: Bitmap) { + bitmap8bpp.getPixels(data, 0, width, 0, 0, width, height) + if (depth == 8) return + val s = (255f / depth) + for (i in 0 until data.size) { + var f = (data[i] ushr 24).toFloat() / s + // f = f.pow(0.75f) // gamma adjust for bolder lines + f *= 1.25f // brightness adjust for bolder lines + f.coerceAtMost(1f) + data[i] = (round(f) * s).toInt() shl 24 + } + } + + fun isBlank(): Boolean { + return data.sum() == 0 + } + + fun load(drawable: Drawable) { + val resized = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8) + val canvas = Canvas(resized) + drawable.setBounds(0, 0, width, height) + drawable.setTint(0xFF000000.toInt()) + drawable.draw(canvas) + loadAndQuantize(resized) + resized.recycle() + } + + fun load(context: Context, icon: Icon) { + icon.loadDrawable(context)?.let { + load(it) + } + } + + fun bitmap(): Bitmap { + return Bitmap.createBitmap(data, width, height, Bitmap.Config.ALPHA_8) + } + + fun getUserMark(x: Int, y: Int): Int { + return user[y * width + x] ushr 24 + } + + fun setUserMark(x: Int, y: Int, v: Int) { + user[y * width + x] = v shl 24 + } + + fun getDataAt(x: Int, y: Int): Int { + return data[y * width + x] ushr 24 + } + + fun check(): Boolean { + return data.contentEquals(user) + } + + fun check(xSel: Int, ySel: Int): Boolean { + val xStart = if (xSel < 0) 0 else xSel + val xEnd = if (xSel < 0) width - 1 else xSel + val yStart = if (ySel < 0) 0 else ySel + val yEnd = if (ySel < 0) height - 1 else ySel + for (y in yStart..yEnd) + for (x in xStart..xEnd) + if (getDataAt(x, y) != getUserMark(x, y)) return false + return true + } + + fun errors(): IntArray { + return IntArray(width * height) { + abs(data[it] - user[it]) + } + } + + fun getRowClue(y: Int): IntArray { + return getClue(-1, y) + } + fun getColumnClue(x: Int): IntArray { + return getClue(x, -1) + } + fun getClue(xSel: Int, ySel: Int): IntArray { + val arr = ArrayList() + var len = 0 + val xStart = if (xSel < 0) 0 else xSel + val xEnd = if (xSel < 0) width - 1 else xSel + val yStart = if (ySel < 0) 0 else ySel + val yEnd = if (ySel < 0) height - 1 else ySel + for (y in yStart..yEnd) + for (x in xStart..xEnd) + if (getDataAt(x, y) != 0) { + len++ + } else if (len > 0) { + arr.add(len) + len = 0 + } + if (len > 0) arr.add(len) + else if (arr.size == 0) arr.add(0) + return arr.toIntArray() + } + + fun resetUserMarks() { + user.forEachIndexed { index, _ -> user[index] = 0 } + } + + // Parcelable interface + + override fun describeContents(): Int { + return 0 + } + + override fun writeToParcel(p: Parcel?, flags: Int) { + p?.let { + p.writeInt(width) + p.writeInt(height) + p.writeInt(depth) + p.writeIntArray(data) + p.writeIntArray(user) + } + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(p: Parcel?): Quare { + return p!!.let { + Quare( + p.readInt(), // width + p.readInt(), // height + p.readInt() // depth + ).also { + p.readIntArray(it.data) + p.readIntArray(it.user) + } + } + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } +} diff --git a/packages/EasterEgg/src/com/android/egg/quares/QuaresActivity.kt b/packages/EasterEgg/src/com/android/egg/quares/QuaresActivity.kt new file mode 100644 index 000000000000..ce439a9a663c --- /dev/null +++ b/packages/EasterEgg/src/com/android/egg/quares/QuaresActivity.kt @@ -0,0 +1,312 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.egg.quares + +import android.app.Activity +import android.content.Context +import android.content.res.Configuration +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Typeface +import android.graphics.drawable.Icon +import android.os.Bundle +import android.text.StaticLayout +import android.text.TextPaint +import android.util.Log +import android.view.View +import android.view.View.GONE +import android.view.View.VISIBLE +import android.widget.Button +import android.widget.CompoundButton +import android.widget.GridLayout + +import java.util.Random + +import com.android.egg.R + +const val TAG = "Quares" + +class QuaresActivity : Activity() { + private var q: Quare = Quare(16, 16, 1) + private var resId = 0 + private var resName = "" + private var icon: Icon? = null + + private lateinit var label: Button + private lateinit var grid: GridLayout + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + window.decorView.systemUiVisibility = + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_STABLE + + actionBar?.hide() + + setContentView(R.layout.activity_quares) + + grid = findViewById(R.id.grid) + label = findViewById(R.id.label) + + if (savedInstanceState != null) { + Log.v(TAG, "restoring puzzle from state") + q = savedInstanceState.getParcelable("q") ?: q + resId = savedInstanceState.getInt("resId") + resName = savedInstanceState.getString("resName", "") + loadPuzzle() + } + + label.setOnClickListener { newPuzzle() } + } + + override fun onResume() { + super.onResume() + if (resId == 0) { + // lazy init from onCreate + newPuzzle() + } + checkVictory() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + + outState.putParcelable("q", q) + outState.putInt("resId", resId) + outState.putString("resName", resName) + } + + fun newPuzzle() { + Log.v(TAG, "new puzzle...") + + q.resetUserMarks() + val oldResId = resId + resId = android.R.drawable.stat_sys_warning + try { + for (tries in 0..3) { + val ar = resources.obtainTypedArray(R.array.puzzles) + val newName = ar.getString(Random().nextInt(ar.length())) + if (newName == null) continue + + Log.v(TAG, "Looking for icon " + newName) + + val pkg = getPackageNameForResourceName(newName) + val newId = packageManager.getResourcesForApplication(pkg) + .getIdentifier(newName, "drawable", pkg) + if (newId == 0) { + Log.v(TAG, "oops, " + newName + " doesn't resolve from pkg " + pkg) + } else if (newId != oldResId) { + // got a good one + resId = newId + resName = newName + break + } + } + } catch (e: RuntimeException) { + Log.v(TAG, "problem loading puzzle, using fallback", e) + } + loadPuzzle() + } + + fun getPackageNameForResourceName(name: String): String { + return if (name.contains(":") && !name.startsWith("android:")) { + name.substring(0, name.indexOf(":")) + } else { + packageName + } + } + + fun checkVictory() { + if (q.check()) { + val dp = resources.displayMetrics.density + + val label: Button = findViewById(R.id.label) + label.text = resName.replace(Regex("^.*/"), "") + val drawable = icon?.loadDrawable(this)?.also { + it.setBounds(0, 0, (32 * dp).toInt(), (32 * dp).toInt()) + it.setTint(label.currentTextColor) + } + label.setCompoundDrawables(drawable, null, null, null) + + label.visibility = VISIBLE + } else { + label.visibility = GONE + } + } + + fun loadPuzzle() { + Log.v(TAG, "loading " + resName + " at " + q.width + "x" + q.height) + + val dp = resources.displayMetrics.density + + icon = Icon.createWithResource(getPackageNameForResourceName(resName), resId) + q.load(this, icon!!) + + if (q.isBlank()) { + // this is a really boring puzzle, let's try again + resId = 0 + resName = "" + recreate() + return + } + + grid.removeAllViews() + grid.columnCount = q.width + 1 + grid.rowCount = q.height + 1 + + label.visibility = GONE + + val orientation = resources.configuration.orientation + + // clean this up a bit + val minSide = resources.configuration.smallestScreenWidthDp - 25 // ish + val size = (minSide / (q.height + 0.5) * dp).toInt() + + val sb = StringBuffer() + + for (j in 0 until grid.rowCount) { + for (i in 0 until grid.columnCount) { + val tv: View + val params = GridLayout.LayoutParams().also { + it.width = size + it.height = size + it.setMargins(1, 1, 1, 1) + it.rowSpec = GridLayout.spec(GridLayout.UNDEFINED, GridLayout.TOP) // UGH + } + val x = i - 1 + val y = j - 1 + if (i > 0 && j > 0) { + if (i == 1 && j > 1) sb.append("\n") + sb.append(if (q.getDataAt(x, y) == 0) " " else "X") + tv = PixelButton(this) + tv.isChecked = q.getUserMark(x, y) != 0 + tv.setOnClickListener { + q.setUserMark(x, y, if (tv.isChecked) 0xFF else 0) + val columnCorrect = (grid.getChildAt(i) as? ClueView)?.check(q) ?: false + val rowCorrect = (grid.getChildAt(j*(grid.columnCount)) as? ClueView) + ?.check(q) ?: false + if (columnCorrect && rowCorrect) { + checkVictory() + } else { + label.visibility = GONE + } + } + } else if (i == j) { // 0,0 + tv = View(this) + tv.visibility = GONE + } else { + tv = ClueView(this) + if (j == 0) { + tv.textRotation = 90f + if (orientation == Configuration.ORIENTATION_LANDSCAPE) { + params.height /= 2 + tv.showText = false + } else { + params.height = (96 * dp).toInt() + } + if (x >= 0) { + tv.setColumn(q, x) + } + } + if (i == 0) { + if (orientation == Configuration.ORIENTATION_PORTRAIT) { + params.width /= 2 + tv.showText = false + } else { + params.width = (96 * dp).toInt() + } + if (y >= 0) { + tv.setRow(q, y) + } + } + } + grid.addView(tv, params) + } + } + + Log.v(TAG, "icon: \n" + sb) + } +} + +class PixelButton(context: Context) : CompoundButton(context) { + init { + setBackgroundResource(R.drawable.pixel_bg) + isClickable = true + isEnabled = true + } +} + +class ClueView(context: Context) : View(context) { + var row: Int = -1 + var column: Int = -1 + var textRotation: Float = 0f + var text: CharSequence = "" + var showText = true + val paint: TextPaint + val incorrectColor: Int + val correctColor: Int + + init { + setBackgroundColor(0) + paint = TextPaint().also { + it.textSize = 14f * context.resources.displayMetrics.density + it.color = context.getColor(R.color.q_clue_text) + it.typeface = Typeface.DEFAULT_BOLD + it.textAlign = Paint.Align.CENTER + } + incorrectColor = context.getColor(R.color.q_clue_bg) + correctColor = context.getColor(R.color.q_clue_bg_correct) + } + + fun setRow(q: Quare, row: Int): Boolean { + this.row = row + this.column = -1 + this.textRotation = 0f + text = q.getRowClue(row).joinToString("-") + return check(q) + } + fun setColumn(q: Quare, column: Int): Boolean { + this.column = column + this.row = -1 + this.textRotation = 90f + text = q.getColumnClue(column).joinToString("-") + return check(q) + } + fun check(q: Quare): Boolean { + val correct = q.check(column, row) + setBackgroundColor(if (correct) correctColor else incorrectColor) + return correct + } + + override fun onDraw(canvas: Canvas?) { + super.onDraw(canvas) + if (!showText) return + canvas?.let { + val x = canvas.width / 2f + val y = canvas.height / 2f + var textWidth = canvas.width + if (textRotation != 0f) { + canvas.rotate(textRotation, x, y) + textWidth = canvas.height + } + val textLayout = StaticLayout.Builder.obtain( + text, 0, text.length, paint, textWidth).build() + canvas.translate(x, y - textLayout.height / 2) + textLayout.draw(canvas) + } + } +} -- GitLab From 72dbd11ccddced2ffbe8af37befef6d245f7b834 Mon Sep 17 00:00:00 2001 From: Beverly Date: Mon, 8 Jul 2019 15:39:58 -0400 Subject: [PATCH 276/620] Adjust window rounded corners Test: manual Fixes: 136652290 Change-Id: I969b00528e269da16021387cb8298e05aeeb63ab --- .../policy/ScreenDecorationsUtils.java | 9 ++++++--- core/res/res/values/dimens.xml | 18 ++++++++++++++++++ core/res/res/values/symbols.xml | 3 +++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/core/java/com/android/internal/policy/ScreenDecorationsUtils.java b/core/java/com/android/internal/policy/ScreenDecorationsUtils.java index adf7692adc56..52172cf04362 100644 --- a/core/java/com/android/internal/policy/ScreenDecorationsUtils.java +++ b/core/java/com/android/internal/policy/ScreenDecorationsUtils.java @@ -36,13 +36,16 @@ public class ScreenDecorationsUtils { } // Radius that should be used in case top or bottom aren't defined. - float defaultRadius = resources.getDimension(R.dimen.rounded_corner_radius); + float defaultRadius = resources.getDimension(R.dimen.rounded_corner_radius) + - resources.getDimension(R.dimen.rounded_corner_radius_adjustment); - float topRadius = resources.getDimension(R.dimen.rounded_corner_radius_top); + float topRadius = resources.getDimension(R.dimen.rounded_corner_radius_top) + - resources.getDimension(R.dimen.rounded_corner_radius_top_adjustment); if (topRadius == 0f) { topRadius = defaultRadius; } - float bottomRadius = resources.getDimension(R.dimen.rounded_corner_radius_bottom); + float bottomRadius = resources.getDimension(R.dimen.rounded_corner_radius_bottom) + - resources.getDimension(R.dimen.rounded_corner_radius_bottom_adjustment); if (bottomRadius == 0f) { bottomRadius = defaultRadius; } diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 5363ef920886..039bc4d925a1 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -90,6 +90,24 @@ orientation. If zero, the value of rounded_corner_radius is used. --> 0dp + + 0px + + 0px + + 0px + 48dp diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 6e03f5e8e018..c4f1083d37d3 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3703,6 +3703,9 @@ + + + -- GitLab From 4ec5fda3d6edd9b9b8858e6961ba53f31a8c03fc Mon Sep 17 00:00:00 2001 From: Andrew Lewis Date: Wed, 10 Jul 2019 13:14:24 +0100 Subject: [PATCH 277/620] Redact ISOBMFF boxes with 'free' Test: atest MediaStore_Video_MediaTest android.os.RedactingFileDescriptorTest Bug: 135499138 Change-Id: Idaa8ad30300d5427f91bb2543be3152881018cf6 --- .../android/os/RedactingFileDescriptor.java | 26 ++++-- .../os/RedactingFileDescriptorTest.java | 80 ++++++++++++++++++- 2 files changed, 97 insertions(+), 9 deletions(-) diff --git a/core/java/android/os/RedactingFileDescriptor.java b/core/java/android/os/RedactingFileDescriptor.java index 4e5eaac3442f..a1ed2146b38e 100644 --- a/core/java/android/os/RedactingFileDescriptor.java +++ b/core/java/android/os/RedactingFileDescriptor.java @@ -35,7 +35,7 @@ import java.util.Arrays; /** * Variant of {@link FileDescriptor} that allows its creator to specify regions - * that should be redacted (appearing as zeros to the reader). + * that should be redacted. * * @hide */ @@ -44,13 +44,16 @@ public class RedactingFileDescriptor { private static final boolean DEBUG = true; private volatile long[] mRedactRanges; + private volatile long[] mFreeOffsets; private FileDescriptor mInner = null; private ParcelFileDescriptor mOuter = null; - private RedactingFileDescriptor(Context context, File file, int mode, long[] redactRanges) + private RedactingFileDescriptor( + Context context, File file, int mode, long[] redactRanges, long[] freeOffsets) throws IOException { mRedactRanges = checkRangesArgument(redactRanges); + mFreeOffsets = freeOffsets; try { try { @@ -88,13 +91,17 @@ public class RedactingFileDescriptor { * * @param file The underlying file to open. * @param mode The {@link ParcelFileDescriptor} mode to open with. - * @param redactRanges List of file offsets that should be redacted, stored + * @param redactRanges List of file ranges that should be redacted, stored * as {@code [start1, end1, start2, end2, ...]}. Start values are * inclusive and end values are exclusive. + * @param freePositions List of file offsets at which the four byte value 'free' should be + * written instead of zeros within parts of the file covered by {@code redactRanges}. + * Non-redacted bytes will not be modified even if covered by a 'free'. This is + * useful for overwriting boxes in ISOBMFF files with padding data. */ public static ParcelFileDescriptor open(Context context, File file, int mode, - long[] redactRanges) throws IOException { - return new RedactingFileDescriptor(context, file, mode, redactRanges).mOuter; + long[] redactRanges, long[] freePositions) throws IOException { + return new RedactingFileDescriptor(context, file, mode, redactRanges, freePositions).mOuter; } /** @@ -169,6 +176,15 @@ public class RedactingFileDescriptor { for (long j = start; j < end; j++) { data[(int) (j - offset)] = 0; } + // Overwrite data at 'free' offsets within the redaction ranges. + for (long freeOffset : mFreeOffsets) { + final long freeEnd = freeOffset + 4; + final long redactFreeStart = Math.max(freeOffset, start); + final long redactFreeEnd = Math.min(freeEnd, end); + for (long j = redactFreeStart; j < redactFreeEnd; j++) { + data[(int) (j - offset)] = (byte) "free".charAt((int) (j - freeOffset)); + } + } } return n; } diff --git a/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java b/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java index d5163e193510..eff4826040f4 100644 --- a/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java +++ b/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java @@ -64,7 +64,7 @@ public class RedactingFileDescriptorTest { @Test public void testSingleByte() throws Exception { final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_ONLY, - new long[] { 10, 11 }).getFileDescriptor(); + new long[] { 10, 11 }, new long[] {}).getFileDescriptor(); final byte[] buf = new byte[1_000]; assertEquals(buf.length, Os.read(fd, buf, 0, buf.length)); @@ -80,7 +80,7 @@ public class RedactingFileDescriptorTest { @Test public void testRanges() throws Exception { final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_ONLY, - new long[] { 100, 200, 300, 400 }).getFileDescriptor(); + new long[] { 100, 200, 300, 400 }, new long[] {}).getFileDescriptor(); final byte[] buf = new byte[10]; assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 90)); @@ -102,7 +102,7 @@ public class RedactingFileDescriptorTest { @Test public void testEntireFile() throws Exception { final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_ONLY, - new long[] { 0, 5_000_000 }).getFileDescriptor(); + new long[] { 0, 5_000_000 }, new long[] {}).getFileDescriptor(); try (FileInputStream in = new FileInputStream(fd)) { int val; @@ -115,7 +115,7 @@ public class RedactingFileDescriptorTest { @Test public void testReadWrite() throws Exception { final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, - new long[] { 100, 200, 300, 400 }).getFileDescriptor(); + new long[] { 100, 200, 300, 400 }, new long[] {}).getFileDescriptor(); // Redacted at first final byte[] buf = new byte[10]; @@ -168,4 +168,76 @@ public class RedactingFileDescriptorTest { assertArrayEquals(new long[] { 100, 200 }, removeRange(new long[] { 100, 200 }, 150, 150)); } + + @Test + public void testFreeAtStart() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 10 }, new long[] {1}).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, (byte) 'f', (byte) 'r', (byte) 'e', (byte) 'e', 0, 0, 0, 0, 0 }, + buf); + } + + @Test + public void testFreeAtOffset() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 10 }, new long[] {3}).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, 0, 0, (byte) 'f', (byte) 'r', (byte) 'e', (byte) 'e', 0, 0, 0 }, + buf); + } + + @Test + public void testFreeAcrossRedactionStart() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 10 }, new long[] {0}).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, (byte) 'r', (byte) 'e', (byte) 'e', 0, 0, 0, 0, 0, 0 }, + buf); + } + + @Test + public void testFreeAcrossRedactionEnd() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 3 }, new long[] {2}).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, 0, (byte) 'f', 64, 64, 64, 64, 64, 64, 64 }, + buf); + } + + @Test + public void testFreeOutsideRedaction() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 8 }, new long[] { 8 }).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, 0, 0, 0, 0, 0, 0, 0, 64, 64 }, + buf); + } + + @Test + public void testFreeMultipleRedactions() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 2, 3, 4 }, new long[] { 0 }).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, (byte) 'r', 64, (byte) 'e', 64, 64, 64, 64, 64, 64 }, + buf); + } } -- GitLab From b26cbbd53dd1bf5b84ddf8d9cecf43b2022e6b4e Mon Sep 17 00:00:00 2001 From: Hunter Knepshield Date: Wed, 3 Jul 2019 14:22:32 -0700 Subject: [PATCH 278/620] Check Carrier Privilege on Hidden Subs When calling CheckCarrierPrivilegeForAnySubId the hidden subscriptions were not being taken into account due to getAllActiveSubscriptionIds being a public method that intentionally ignores hidden subscriptions. NOTE: This is identical to ag/8193293, except that the SubscriptionManager modifications don't make getActiveSubscriptionIdList() static (it was causing test failures). A further bug can be pursued to make everything static all at once. Bug: 135684437 Test: manual Change-Id: Iad6a3c2635e5eac2d33a16aa460b98394fd817f4 --- .../telephony/SubscriptionManager.java | 23 ++++++++++++------- .../telephony/TelephonyPermissions.java | 21 +++++++---------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 484fd3b17c02..2822fccdb398 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -2116,29 +2116,36 @@ public class SubscriptionManager { } /** + * TODO(b/137102918) Make this static, tests use this as an instance method currently. + * * @return the list of subId's that are active, * is never null but the length maybe 0. * @hide */ @UnsupportedAppUsage public @NonNull int[] getActiveSubscriptionIdList() { - int[] subId = null; + return getActiveSubscriptionIdList(/* visibleOnly */ true); + } + /** + * TODO(b/137102918) Make this static, tests use this as an instance method currently. + * + * @return a non-null list of subId's that are active. + * + * @hide + */ + public @NonNull int[] getActiveSubscriptionIdList(boolean visibleOnly) { try { ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); if (iSub != null) { - subId = iSub.getActiveSubIdList(/*visibleOnly*/true); + int[] subId = iSub.getActiveSubIdList(visibleOnly); + if (subId != null) return subId; } } catch (RemoteException ex) { // ignore it } - if (subId == null) { - subId = new int[0]; - } - - return subId; - + return new int[0]; } /** diff --git a/telephony/java/com/android/internal/telephony/TelephonyPermissions.java b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java index 7a0ab9ca6a28..51c5d12dfe15 100644 --- a/telephony/java/com/android/internal/telephony/TelephonyPermissions.java +++ b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java @@ -600,26 +600,21 @@ public final class TelephonyPermissions { } } - /** - * Returns whether the provided uid has carrier privileges for any active subscription ID. - */ - private static boolean checkCarrierPrivilegeForAnySubId(Context context, - Supplier telephonySupplier, int uid) { + /** Returns whether the provided uid has carrier privileges for any active subscription ID. */ + private static boolean checkCarrierPrivilegeForAnySubId( + Context context, Supplier telephonySupplier, int uid) { SubscriptionManager sm = (SubscriptionManager) context.getSystemService( Context.TELEPHONY_SUBSCRIPTION_SERVICE); - int[] activeSubIds = sm.getActiveSubscriptionIdList(); - if (activeSubIds != null) { - for (int activeSubId : activeSubIds) { - if (getCarrierPrivilegeStatus(telephonySupplier, activeSubId, uid) - == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) { - return true; - } + int[] activeSubIds = sm.getActiveSubscriptionIdList(/* visibleOnly */ false); + for (int activeSubId : activeSubIds) { + if (getCarrierPrivilegeStatus(telephonySupplier, activeSubId, uid) + == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) { + return true; } } return false; } - private static int getCarrierPrivilegeStatus( Supplier telephonySupplier, int subId, int uid) { ITelephony telephony = telephonySupplier.get(); -- GitLab From 6384812b27911140d93e5398ea82e49e7cb79143 Mon Sep 17 00:00:00 2001 From: Adam He Date: Tue, 9 Jul 2019 14:19:47 -0700 Subject: [PATCH 279/620] Check mSetupComplete on initialization to avoid service being disabled. Fixes: 135297073 Test: manual verification && atest CtsContentCaptureServiceTestCases Change-Id: Ida283990c7800ac6946f7e5905e67ca1b21d8bbc --- .../server/infra/AbstractPerUserSystemService.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java b/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java index c52921ef344b..16cf7eef6a1e 100644 --- a/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java +++ b/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java @@ -75,6 +75,14 @@ public abstract class AbstractPerUserSystemService Date: Wed, 10 Jul 2019 15:55:45 -0400 Subject: [PATCH 280/620] Use a Region when calculating TouchableRegion for cutouts HeadsUpManagerPhone handles adding extra touchable region for the display cutout. When this changed to use Rects, the extra touch region was applied to the entire phone width because Rect#union() will cause the resulting Rect to grow in every dimension. The fix is to use a Region instead so we can properly union only the space under the notch Fixes: 135487528 Test: manual Change-Id: I1d39785087cc3378fc42363df170b81b84420a8e --- .../systemui/statusbar/phone/HeadsUpManagerPhone.java | 10 +++++++--- .../statusbar/phone/NotificationPanelView.java | 6 ++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java index a0cda693822f..1d0d231424d1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Rect; +import android.graphics.Region; import android.util.Log; import android.util.Pools; import android.view.DisplayCutout; @@ -76,7 +77,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, private int[] mTmpTwoArray = new int[2]; private boolean mHeadsUpGoingAway; private int mStatusBarState; - private Rect mTouchableRegion = new Rect(); + private Region mTouchableRegion = new Region(); private AnimationStateHandler mAnimationStateHandler; @@ -299,10 +300,11 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, info.touchableRegion.set(calculateTouchableRegion()); } - public Rect calculateTouchableRegion() { + public Region calculateTouchableRegion() { if (!hasPinnedHeadsUp()) { mTouchableRegion.set(0, 0, mStatusBarWindowView.getWidth(), mStatusBarHeight); updateRegionForNotch(mTouchableRegion); + } else { NotificationEntry topEntry = getTopEntry(); if (topEntry.isChildInGroup()) { @@ -322,7 +324,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, return mTouchableRegion; } - private void updateRegionForNotch(Rect region) { + private void updateRegionForNotch(Region region) { DisplayCutout cutout = mStatusBarWindowView.getRootWindowInsets().getDisplayCutout(); if (cutout == null) { return; @@ -390,6 +392,8 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, super.dumpInternal(fd, pw, args); pw.print(" mBarState="); pw.println(mStatusBarState); + pw.print(" mTouchableRegion="); + pw.println(mTouchableRegion); } /////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 1027046b0c28..a423adfd34b7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -38,6 +38,7 @@ import android.graphics.PointF; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; +import android.graphics.Region; import android.os.PowerManager; import android.util.AttributeSet; import android.util.Log; @@ -620,9 +621,10 @@ public class NotificationPanelView extends PanelView implements private Rect calculateGestureExclusionRect() { Rect exclusionRect = null; - if (isFullyCollapsed()) { + Region touchableRegion = mHeadsUpManager.calculateTouchableRegion(); + if (isFullyCollapsed() && touchableRegion != null) { // Note: The heads up manager also calculates the non-pinned touchable region - exclusionRect = mHeadsUpManager.calculateTouchableRegion(); + exclusionRect = touchableRegion.getBounds(); } return exclusionRect != null ? exclusionRect -- GitLab From a1c777ee2922765a6f71b4c5bae110038748db18 Mon Sep 17 00:00:00 2001 From: joshmccloskey Date: Wed, 10 Jul 2019 17:15:15 -0700 Subject: [PATCH 281/620] Fixed talkback issue with biometric prompt. Test: Manual. Fixes: 137164433 Change-Id: Ie5d241762769b275fc7616e2f5bb8378a064ed98 --- .../android/systemui/biometrics/BiometricDialogView.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java index 932e40c77af0..a5857df8ba5a 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java @@ -282,6 +282,7 @@ public abstract class BiometricDialogView extends LinearLayout { if (mRestoredState == null) { updateState(STATE_AUTHENTICATING); + mNegativeButton.setText(mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT)); final int hint = getHintStringResourceId(); if (hint != 0) { mErrorText.setText(hint); @@ -319,8 +320,6 @@ public abstract class BiometricDialogView extends LinearLayout { mDescriptionText.setText(descriptionText); } - mNegativeButton.setText(mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT)); - if (requiresConfirmation() && mRestoredState == null) { mPositiveButton.setVisibility(View.VISIBLE); mPositiveButton.setEnabled(false); @@ -474,6 +473,8 @@ public abstract class BiometricDialogView extends LinearLayout { mHandler.removeMessages(MSG_RESET_MESSAGE); mErrorText.setTextColor(mTextColor); mErrorText.setText(R.string.biometric_dialog_tap_confirm); + mErrorText.setContentDescription( + getResources().getString(R.string.biometric_dialog_tap_confirm)); mErrorText.setVisibility(View.VISIBLE); announceAccessibilityEvent(); mPositiveButton.setVisibility(View.VISIBLE); @@ -487,6 +488,7 @@ public abstract class BiometricDialogView extends LinearLayout { if (newState == STATE_PENDING_CONFIRMATION || newState == STATE_AUTHENTICATED) { mNegativeButton.setText(R.string.cancel); + mNegativeButton.setContentDescription(getResources().getString(R.string.cancel)); } updateIcon(mState, newState); -- GitLab From 75f942dfa807fe6d7b67d0ebca733e018fd66e02 Mon Sep 17 00:00:00 2001 From: Richard Uhler Date: Thu, 11 Jul 2019 09:32:43 +0100 Subject: [PATCH 282/620] Disable testEnableRollbackTimeoutFailsRollback test. The test is flaky because it is testing a race condition. The flakiness is fixed with the help of some new @TestApi in I01f3e769711ffa51fa714ff4bc81e70887f427ad. Disable the test on those branches without the fix merged. Bug: 134373106 Bug: 136605788 Test: atest RollbackTest Change-Id: I05edfc142c14631b259ae7aaf2dd31af00363a35 Merged-In: I01f3e769711ffa51fa714ff4bc81e70887f427ad --- .../src/com/android/tests/rollback/RollbackTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java index beff0c6bc308..1b002cadb07f 100644 --- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java +++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java @@ -960,6 +960,7 @@ public class RollbackTest { } @Test + @Ignore("b/136605788") public void testEnableRollbackTimeoutFailsRollback() throws Exception { try { RollbackTestUtils.adoptShellPermissionIdentity( -- GitLab From 5a5e0bd198d0acdb9f6389625c8846e8f3d7fa06 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Thu, 11 Jul 2019 14:19:11 +0900 Subject: [PATCH 283/620] Dump bypass controller state for debugging Test: adb shell dumpsys activity service com.android.systemui Bug: 136536811 Change-Id: I6b81a1b893c95cc0807738509755460c4b05a82a --- .../phone/BiometricUnlockController.java | 2 + .../phone/KeyguardBypassController.kt | 52 ++++++++++++------- .../systemui/statusbar/phone/StatusBar.java | 4 ++ 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 05d26b0a6a17..bc7174d33b13 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -261,6 +261,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { biometricSourceType); if (unlockAllowed) { startWakeAndUnlock(biometricSourceType); + } else { + Log.d(TAG, "onBiometricAuthenticated aborted by bypass controller"); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt index d7deedce3c2f..c88b22bbbced 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt @@ -21,11 +21,11 @@ import android.content.pm.PackageManager import android.hardware.biometrics.BiometricSourceType import android.hardware.face.FaceManager import android.provider.Settings -import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.statusbar.StatusBarState import com.android.systemui.tuner.TunerService +import java.io.PrintWriter import javax.inject.Inject import javax.inject.Singleton @@ -62,18 +62,15 @@ class KeyguardBypassController { } @Inject - constructor(context: Context, tunerService: TunerService, - statusBarStateController: StatusBarStateController, - lockscreenUserManager: NotificationLockscreenUserManager) { + constructor( + context: Context, + tunerService: TunerService, + statusBarStateController: StatusBarStateController, + lockscreenUserManager: NotificationLockscreenUserManager + ) { unlockMethodCache = UnlockMethodCache.getInstance(context) this.statusBarStateController = statusBarStateController - statusBarStateController.addCallback(object : StatusBarStateController.StateListener { - override fun onStateChanged(newState: Int) { - if (newState != StatusBarState.KEYGUARD) { - pendingUnlockType = null; - } - } - }) + if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) { return } @@ -82,16 +79,19 @@ class KeyguardBypassController { return } + statusBarStateController.addCallback(object : StatusBarStateController.StateListener { + override fun onStateChanged(newState: Int) { + if (newState != StatusBarState.KEYGUARD) { + pendingUnlockType = null + } + } + }) + val dismissByDefault = if (context.resources.getBoolean( - com.android.internal.R.bool.config_faceAuthDismissesKeyguard)) 1 else 0 - tunerService.addTunable( - object : TunerService.Tunable { - override fun onTuningChanged(key: String?, newValue: String?) { - bypassEnabled = Settings.Secure.getIntForUser( - context.contentResolver, - Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD, - dismissByDefault, - KeyguardUpdateMonitor.getCurrentUser()) != 0 + com.android.internal.R.bool.config_faceAuthDismissesKeyguard)) 1 else 0 + tunerService.addTunable(object : TunerService.Tunable { + override fun onTuningChanged(key: String?, newValue: String?) { + bypassEnabled = tunerService.getValue(key, dismissByDefault) != 0 } }, Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD) lockscreenUserManager.addUserChangedListener { pendingUnlockType = null } @@ -155,4 +155,16 @@ class KeyguardBypassController { fun onStartedGoingToSleep() { pendingUnlockType = null } + + fun dump(pw: PrintWriter) { + pw.println("KeyguardBypassController:") + pw.print(" pendingUnlockType: "); pw.println(pendingUnlockType) + pw.print(" bypassEnabled: "); pw.println(bypassEnabled) + pw.print(" canBypass: "); pw.println(canBypass()) + pw.print(" bouncerShowing: "); pw.println(bouncerShowing) + pw.print(" isPulseExpanding: "); pw.println(isPulseExpanding) + pw.print(" launchingAffordance: "); pw.println(launchingAffordance) + pw.print(" qSExpanded: "); pw.println(qSExpanded) + pw.print(" bouncerShowing: "); pw.println(bouncerShowing) + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 4392c35ee233..a84d35964994 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -2386,6 +2386,10 @@ public class StatusBar extends SystemUI implements DemoMode, mLightBarController.dump(fd, pw, args); } + if (mKeyguardBypassController != null) { + mKeyguardBypassController.dump(pw); + } + if (mKeyguardUpdateMonitor != null) { mKeyguardUpdateMonitor.dump(fd, pw, args); } -- GitLab From 47a775b67de77317f6ad357a9c4a3d88da846253 Mon Sep 17 00:00:00 2001 From: Beverly Date: Thu, 11 Jul 2019 10:13:43 -0400 Subject: [PATCH 284/620] Don't persist new night mode setting in car mode Keep persist.sys.theme in sync with the primary user's setting value UI_NIGHT_MODE Test: manual Fixes: 137174308 Change-Id: I8df67e0734b08bd82418e381d153d9012ecf99e4 --- .../java/com/android/server/UiModeManagerService.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java index bc7da3fe2edc..30a356325ada 100644 --- a/services/core/java/com/android/server/UiModeManagerService.java +++ b/services/core/java/com/android/server/UiModeManagerService.java @@ -413,15 +413,15 @@ final class UiModeManagerService extends SystemService { try { synchronized (mLock) { if (mNightMode != mode) { - if (UserManager.get(getContext()).isPrimaryUser()) { - SystemProperties.set(SYSTEM_PROPERTY_DEVICE_THEME, - Integer.toString(mode)); - } - // Only persist setting if not in car mode if (!mCarModeEnabled) { Secure.putIntForUser(getContext().getContentResolver(), Secure.UI_NIGHT_MODE, mode, user); + + if (UserManager.get(getContext()).isPrimaryUser()) { + SystemProperties.set(SYSTEM_PROPERTY_DEVICE_THEME, + Integer.toString(mode)); + } } mNightMode = mode; -- GitLab From 6a51b35a7d78a9616cb9a00e8c5787b70d82d001 Mon Sep 17 00:00:00 2001 From: Michael Wright Date: Thu, 4 Jul 2019 19:17:19 +0100 Subject: [PATCH 285/620] Read the high refresh rate blacklist from DeviceConfig. When available, we should read the high refresh rate blacklist from DeviceConfig, and use the device's configured list as a default / fallback. This lets us change the blacklist in the field in case we find additional compatibility issues, or one of the developers fixes their app and asks us to remove them from the blacklist. Fixes: 132338514 Test: atest WmTests:HighRefreshRateBlacklistTest Exempt-From-Owner-Approval: TBR Merged-In: I984dab60eeafff01758ac38c3db6056b33f662a6 Change-Id: I984dab60eeafff01758ac38c3db6056b33f662a6 --- core/java/android/provider/DeviceConfig.java | 9 + core/res/res/values/config.xml | 4 + core/res/res/values/symbols.xml | 2 + .../server/wm/HighRefreshRateBlacklist.java | 100 +++++++---- .../server/wm/WindowManagerService.java | 17 +- .../wm/HighRefreshRateBlacklistTest.java | 164 +++++++++++++----- 6 files changed, 225 insertions(+), 71 deletions(-) diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java index e30ba38c127f..1fd212df4469 100644 --- a/core/java/android/provider/DeviceConfig.java +++ b/core/java/android/provider/DeviceConfig.java @@ -336,6 +336,15 @@ public final class DeviceConfig { @TestApi String KEY_SYSTEM_GESTURES_EXCLUDED_BY_PRE_Q_STICKY_IMMERSIVE = "system_gestures_excluded_by_pre_q_sticky_immersive"; + + /** + * Key for controlling which packages are explicitly blocked from running at refresh rates + * higher than 60hz. + * + * @see android.provider.DeviceConfig#NAMESPACE_WINDOW_MANAGER + * @hide + */ + String KEY_HIGH_REFRESH_RATE_BLACKLIST = "high_refresh_rate_blacklist"; } private static final Object sLock = new Object(); diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 305c1a6d5657..e44c5f720a97 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4208,4 +4208,8 @@ 3 + + + diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 0043826ed65f..1743391aaaec 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3819,6 +3819,8 @@ + + diff --git a/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java b/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java index c0f53b819125..5726cb2d87d4 100644 --- a/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java +++ b/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java @@ -16,60 +16,102 @@ package com.android.server.wm; +import static android.provider.DeviceConfig.WindowManager.KEY_HIGH_REFRESH_RATE_BLACKLIST; + import android.annotation.NonNull; -import android.os.SystemProperties; +import android.annotation.Nullable; +import android.content.res.Resources; +import android.provider.DeviceConfig; import android.util.ArraySet; +import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.os.BackgroundThread; + +import java.io.PrintWriter; +import java.util.concurrent.Executor; /** * A Blacklist for packages that should force the display out of high refresh rate. */ class HighRefreshRateBlacklist { - private static final String SYSPROP_KEY = "ro.window_manager.high_refresh_rate_blacklist"; - private static final String SYSPROP_KEY_LENGTH_SUFFIX = "_length"; - private static final String SYSPROP_KEY_ENTRY_SUFFIX = "_entry"; - private static final int MAX_ENTRIES = 50; + private final ArraySet mBlacklistedPackages = new ArraySet<>(); + @NonNull + private final String[] mDefaultBlacklist; + private final Object mLock = new Object(); - private ArraySet mBlacklistedPackages = new ArraySet<>(); - - static HighRefreshRateBlacklist create() { - return new HighRefreshRateBlacklist(new SystemPropertyGetter() { + static HighRefreshRateBlacklist create(@NonNull Resources r) { + return new HighRefreshRateBlacklist(r, new DeviceConfigInterface() { @Override - public int getInt(String key, int def) { - return SystemProperties.getInt(key, def); + public @Nullable String getProperty(@NonNull String namespace, @NonNull String name) { + return DeviceConfig.getProperty(namespace, name); } - - @Override - public String get(String key) { - return SystemProperties.get(key); + public void addOnPropertyChangedListener(@NonNull String namespace, + @NonNull Executor executor, + @NonNull DeviceConfig.OnPropertyChangedListener listener) { + DeviceConfig.addOnPropertyChangedListener(namespace, executor, listener); } }); } @VisibleForTesting - HighRefreshRateBlacklist(SystemPropertyGetter propertyGetter) { + HighRefreshRateBlacklist(Resources r, DeviceConfigInterface deviceConfig) { + mDefaultBlacklist = r.getStringArray(R.array.config_highRefreshRateBlacklist); + deviceConfig.addOnPropertyChangedListener(DeviceConfig.NAMESPACE_WINDOW_MANAGER, + BackgroundThread.getExecutor(), new OnPropertyChangedListener()); + final String property = deviceConfig.getProperty(DeviceConfig.NAMESPACE_WINDOW_MANAGER, + KEY_HIGH_REFRESH_RATE_BLACKLIST); + updateBlacklist(property); + } - // Read and populate the blacklist - final int length = Math.min( - propertyGetter.getInt(SYSPROP_KEY + SYSPROP_KEY_LENGTH_SUFFIX, 0), - MAX_ENTRIES); - for (int i = 1; i <= length; i++) { - final String packageName = propertyGetter.get( - SYSPROP_KEY + SYSPROP_KEY_ENTRY_SUFFIX + i); - if (!packageName.isEmpty()) { - mBlacklistedPackages.add(packageName); + private void updateBlacklist(@Nullable String property) { + synchronized (mLock) { + mBlacklistedPackages.clear(); + if (property != null) { + String[] packages = property.split(","); + for (String pkg : packages) { + String pkgName = pkg.trim(); + if (!pkgName.isEmpty()) { + mBlacklistedPackages.add(pkgName); + } + } + } else { + // If there's no config, or the config has been deleted, fallback to the device's + // default blacklist + for (String pkg : mDefaultBlacklist) { + mBlacklistedPackages.add(pkg); + } } } } boolean isBlacklisted(String packageName) { - return mBlacklistedPackages.contains(packageName); + synchronized (mLock) { + return mBlacklistedPackages.contains(packageName); + } + } + void dump(PrintWriter pw) { + pw.println("High Refresh Rate Blacklist"); + pw.println(" Packages:"); + synchronized (mLock) { + for (String pkg : mBlacklistedPackages) { + pw.println(" " + pkg); + } + } } - interface SystemPropertyGetter { - int getInt(String key, int def); - @NonNull String get(String key); + interface DeviceConfigInterface { + @Nullable String getProperty(@NonNull String namespace, @NonNull String name); + void addOnPropertyChangedListener(@NonNull String namespace, @NonNull Executor executor, + @NonNull DeviceConfig.OnPropertyChangedListener listener); + } + + private class OnPropertyChangedListener implements DeviceConfig.OnPropertyChangedListener { + public void onPropertyChanged(@NonNull String namespace, @NonNull String name, + @Nullable String value) { + updateBlacklist(value); + } } } + diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 09ba2c8b1c6d..f356b51ebb7b 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -854,7 +854,7 @@ public class WindowManagerService extends IWindowManager.Stub final Configuration mTempConfiguration = new Configuration(); - final HighRefreshRateBlacklist mHighRefreshRateBlacklist = HighRefreshRateBlacklist.create(); + final HighRefreshRateBlacklist mHighRefreshRateBlacklist; // If true, only the core apps and services are being launched because the device // is in a special boot mode, such as being encrypted or waiting for a decryption password. @@ -1141,6 +1141,8 @@ public class WindowManagerService extends IWindowManager.Stub this, mInputManager, mActivityTaskManager, mH.getLooper()); mDragDropController = new DragDropController(this, mH.getLooper()); + mHighRefreshRateBlacklist = HighRefreshRateBlacklist.create(context.getResources()); + mSystemGestureExclusionLimitDp = Math.max(MIN_GESTURE_EXCLUSION_LIMIT_DP, DeviceConfig.getInt(DeviceConfig.NAMESPACE_WINDOW_MANAGER, KEY_SYSTEM_GESTURE_EXCLUSION_LIMIT_DP, 0)); @@ -5922,6 +5924,12 @@ public class WindowManagerService extends IWindowManager.Stub mRoot.dumpTokens(pw, dumpAll); } + + private void dumpHighRefreshRateBlacklist(PrintWriter pw) { + pw.println("WINDOW MANAGER HIGH REFRESH RATE BLACKLIST (dumpsys window refresh)"); + mHighRefreshRateBlacklist.dump(pw); + } + private void dumpTraceStatus(PrintWriter pw) { pw.println("WINDOW MANAGER TRACE (dumpsys window trace)"); pw.print(mWindowTracing.getStatus() + "\n"); @@ -6321,6 +6329,9 @@ public class WindowManagerService extends IWindowManager.Stub } else if ("trace".equals(cmd)) { dumpTraceStatus(pw); return; + } else if ("refresh".equals(cmd)) { + dumpHighRefreshRateBlacklist(pw); + return; } else { // Dumping a single name? if (!dumpWindows(pw, cmd, args, opti, dumpAll)) { @@ -6376,6 +6387,10 @@ public class WindowManagerService extends IWindowManager.Stub pw.println(separator); } dumpTraceStatus(pw); + if (dumpAll) { + pw.println(separator); + } + dumpHighRefreshRateBlacklist(pw); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java b/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java index 558672609304..e02b69c4b058 100644 --- a/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java @@ -16,71 +16,153 @@ package com.android.server.wm; +import static android.provider.DeviceConfig.WindowManager.KEY_HIGH_REFRESH_RATE_BLACKLIST; + import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import android.content.res.Resources; import android.platform.test.annotations.Presubmit; +import android.provider.DeviceConfig; +import android.util.Pair; -import androidx.test.filters.FlakyTest; import androidx.test.filters.SmallTest; -import com.android.server.wm.HighRefreshRateBlacklist.SystemPropertyGetter; +import com.android.internal.R; +import com.android.server.wm.HighRefreshRateBlacklist.DeviceConfigInterface; import org.junit.Test; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; + /** * Build/Install/Run: - * atest WmTests:HighRefreshRateBlacklistTest + * atest WmTests:HighRefreshRateBlacklistTest */ @SmallTest @Presubmit -@FlakyTest public class HighRefreshRateBlacklistTest { @Test - public void testBlacklist() { - HighRefreshRateBlacklist blacklist = new HighRefreshRateBlacklist( - new SystemPropertyGetter() { - - @Override - public int getInt(String key, int def) { - if ("ro.window_manager.high_refresh_rate_blacklist_length".equals(key)) { - return 2; - } - return def; - } - - @Override - public String get(String key) { - if ("ro.window_manager.high_refresh_rate_blacklist_entry1".equals(key)) { - return "com.android.sample1"; - } - if ("ro.window_manager.high_refresh_rate_blacklist_entry2".equals(key)) { - return "com.android.sample2"; - } - return ""; - } - }); + public void testDefaultBlacklist() { + final Resources r = createResources("com.android.sample1", "com.android.sample2"); + HighRefreshRateBlacklist blacklist = + new HighRefreshRateBlacklist(r, new FakeDeviceConfigInterface()); assertTrue(blacklist.isBlacklisted("com.android.sample1")); assertTrue(blacklist.isBlacklisted("com.android.sample2")); assertFalse(blacklist.isBlacklisted("com.android.sample3")); } @Test - public void testNoBlacklist() { - HighRefreshRateBlacklist blacklist = new HighRefreshRateBlacklist( - new SystemPropertyGetter() { - - @Override - public int getInt(String key, int def) { - return def; - } - - @Override - public String get(String key) { - return ""; - } - }); + public void testNoDefaultBlacklist() { + final Resources r = createResources(); + HighRefreshRateBlacklist blacklist = + new HighRefreshRateBlacklist(r, new FakeDeviceConfigInterface()); + assertFalse(blacklist.isBlacklisted("com.android.sample1")); + } + + @Test + public void testDefaultBlacklistIsOverriddenByDeviceConfig() { + final Resources r = createResources("com.android.sample1"); + final FakeDeviceConfigInterface config = new FakeDeviceConfigInterface(); + config.setBlacklist("com.android.sample2,com.android.sample3"); + HighRefreshRateBlacklist blacklist = new HighRefreshRateBlacklist(r, config); + assertFalse(blacklist.isBlacklisted("com.android.sample1")); + assertTrue(blacklist.isBlacklisted("com.android.sample2")); + assertTrue(blacklist.isBlacklisted("com.android.sample3")); + } + + @Test + public void testDefaultBlacklistIsOverriddenByEmptyDeviceConfig() { + final Resources r = createResources("com.android.sample1"); + final FakeDeviceConfigInterface config = new FakeDeviceConfigInterface(); + config.setBlacklist(""); + HighRefreshRateBlacklist blacklist = new HighRefreshRateBlacklist(r, config); assertFalse(blacklist.isBlacklisted("com.android.sample1")); } + + @Test + public void testDefaultBlacklistIsOverriddenByDeviceConfigUpdate() { + final Resources r = createResources("com.android.sample1"); + final FakeDeviceConfigInterface config = new FakeDeviceConfigInterface(); + HighRefreshRateBlacklist blacklist = new HighRefreshRateBlacklist(r, config); + + // First check that the default blacklist is in effect + assertTrue(blacklist.isBlacklisted("com.android.sample1")); + assertFalse(blacklist.isBlacklisted("com.android.sample2")); + assertFalse(blacklist.isBlacklisted("com.android.sample3")); + + // Then confirm that the DeviceConfig list has propagated and taken effect. + config.setBlacklist("com.android.sample2,com.android.sample3"); + assertFalse(blacklist.isBlacklisted("com.android.sample1")); + assertTrue(blacklist.isBlacklisted("com.android.sample2")); + assertTrue(blacklist.isBlacklisted("com.android.sample3")); + + // Finally make sure we go back to the default list if the DeviceConfig gets deleted. + config.setBlacklist(null); + assertTrue(blacklist.isBlacklisted("com.android.sample1")); + assertFalse(blacklist.isBlacklisted("com.android.sample2")); + assertFalse(blacklist.isBlacklisted("com.android.sample3")); + } + + private Resources createResources(String... defaultBlacklist) { + Resources r = mock(Resources.class); + when(r.getStringArray(R.array.config_highRefreshRateBlacklist)) + .thenReturn(defaultBlacklist); + return r; + } + + + class FakeDeviceConfigInterface implements DeviceConfigInterface { + private List> mListeners = + new ArrayList<>(); + private String mBlacklist; + + @Override + public String getProperty(String namespace, String name) { + if (!DeviceConfig.NAMESPACE_WINDOW_MANAGER.equals(namespace) + || !KEY_HIGH_REFRESH_RATE_BLACKLIST.equals(name)) { + throw new IllegalArgumentException("Only things in NAMESPACE_WINDOW_MANAGER " + + "supported."); + } + return mBlacklist; + } + + @Override + public void addOnPropertyChangedListener(String namespace, Executor executor, + DeviceConfig.OnPropertyChangedListener listener) { + + if (!DeviceConfig.NAMESPACE_WINDOW_MANAGER.equals(namespace)) { + throw new IllegalArgumentException("Only things in NAMESPACE_WINDOW_MANAGER " + + "supported."); + } + mListeners.add(new Pair<>(listener, executor)); + } + + void setBlacklist(String blacklist) { + mBlacklist = blacklist; + CountDownLatch latch = new CountDownLatch(mListeners.size()); + for (Pair listenerInfo : + mListeners) { + final Executor executor = listenerInfo.second; + final DeviceConfig.OnPropertyChangedListener listener = listenerInfo.first; + executor.execute(() -> { + listener.onPropertyChanged(DeviceConfig.NAMESPACE_WINDOW_MANAGER, + KEY_HIGH_REFRESH_RATE_BLACKLIST, blacklist); + latch.countDown(); + }); + } + try { + latch.await(10, TimeUnit.SECONDS); + } catch (InterruptedException e) { + throw new RuntimeException("Failed to notify all blacklist listeners in time.", e); + } + } + } } -- GitLab From d5aa7600d797c419421f930beaf4b34d72cf79bc Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 11 Jul 2019 08:15:57 -0700 Subject: [PATCH 286/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I9552d0718e0418dea093f7735268e9f917257e2f --- core/res/res/values-eu/strings.xml | 10 +++++----- core/res/res/values-hi/strings.xml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index bd68b2b9d764..d6a770084cad 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -374,7 +374,7 @@ "Beren zati batzuk memoria modu iraunkorrean ezartzeko baimena ematen die aplikazioei. Horrela, beste aplikazioek erabilgarri duten memoria murritz daiteke eta tableta motel daiteke." "Beren zati batzuk memorian modu iraunkorrean aktibo uztea baimentzen die aplikazioei. Horrela, beste aplikazioek memoria gutxiago izan lezakete erabilgarri eta telebistak motelago funtziona lezake." "Beren zati batzuk memoria modu iraunkorrean ezartzeko baimena ematen die aplikazioei. Horrela, beste aplikazioek erabilgarri duten memoria murritz daiteke eta telefonoa motel daiteke." - "Exekutatu zerbitzuak aurreko planoan" + "Abiarazi zerbitzuak aurreko planoan" "Aurreko planoko zerbitzuak erabiltzea baimentzen dio aplikazioari." "neurtu aplikazioen biltegiratzeko tokia" "Bere kodea, datuak eta cache-tamainak eskuratzeko baimena ematen die aplikazioei." @@ -421,7 +421,7 @@ "Aplikazioa aurreko planoan dagoenean, zure kokapenaren berri izan dezake sareen iturburuak erabilita; adibidez, telefonia mugikorreko dorreak eta Wi-Fi sareak. Kokapen-zerbitzu horiek aktibatuta eta erabilgarri izan behar dituzu telebistan, aplikazioak erabil ditzan." "Aplikazioa aurreko planoan dagoenean, zure kokapenaren berri izan dezake sareen iturburuak erabilita; adibidez, telefonia mugikorreko dorreak eta Wi-Fi sareak. Kokapen-zerbitzu horiek aktibatuta eta erabilgarri izan behar dituzu telefonoan, aplikazioak erabil ditzan." "Atzitu kokapena atzeko planoan" - "Baimen hau ematen bada kokapen zehatz edo gutxi gorabeherakorako sarbideaz gain, atzeko planoan exekutatu bitartean atzitu ahalko du aplikazioak kokapena." + "Baimen hau ematen bada kokapen zehatz edo gutxi gorabeherakorako sarbideaz gain, atzeko planoan abian den bitartean atzitu ahalko du aplikazioak kokapena." "aldatu audio-ezarpenak" "Audio-ezarpen orokorrak aldatzeko baimena ematen dio; besteak beste, bolumena eta irteerarako zer bozgorailu erabiltzen den." "grabatu audioa" @@ -1176,7 +1176,7 @@ "Itxaron" "Orriak ez du erantzuten.\n\nItxi egin nahi duzu?" "Aplikazioa birbideratu da" - "%1$s aplikazioa exekutatzen ari da." + "%1$s aplikazioa abian da." "%1$s aplikazioa lehenago abiarazi da." "Eskala" "Erakutsi beti" @@ -1202,7 +1202,7 @@ "%1$s prestatzen." "Aplikazioak abiarazten." "Bertsio-berritzea amaitzen." - "%1$s exekutatzen" + "%1$s abian da" "Sakatu jokora itzultzeko" "Aukeratu joko bat" "Funtzionamendu hobea izateko, joko hauetako bat baino ezin da egon irekita aldi berean." @@ -1440,7 +1440,7 @@ "Hurrengoa" "Eginda" "Atzera" - "Exekutatu" + "Abiarazi" "Markatu zenbakia \n%s erabilita" "Sortu kontaktua\n%s erabilita" "Aplikazio hauetako bat edo gehiago kontua orain eta etorkizunean atzitzeko baimena eskatzen ari dira." diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 0fcc8c68821f..cfaff80abf9a 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1084,7 +1084,7 @@ "वापस लाएं" "फिर से करें" "ऑटोमैटिक भरना" - "लेख चयन" + "टेक्स्ट चुनें" "शब्दकोश में जोड़ें" "मिटाएं" "इनपुट विधि" -- GitLab From b3455e68fdf4a625595c041a1b28dd216d6f022d Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Thu, 11 Jul 2019 11:47:13 +0900 Subject: [PATCH 287/620] Do not report AOD as showing when fading away AOD will still be showing when we authenticate from AOD2, but WM cannot show the activity untill we leave the AOD state, this causes transition jank. I'm now consolidating the dozing state with wakeAndUnlock to account for AOD2 wake-ups. Test: wake-up from LS to app Test: wake-up from LS to home Test: wake-up from AOD2 to app Test: wake-up from AOD2 to home Test: open app, wait for screen timeout Test: look at logs on #updateActivityLockScreenState Bug: 134952761 Fixes: 136737610 Change-Id: I08d087eb78788ca89d8f4a4ae67bbc597bcb650b --- .../keyguard/KeyguardViewMediator.java | 48 +++++++++++-------- .../systemui/statusbar/phone/StatusBar.java | 2 +- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 4dcb9f94088c..57bf53676a4a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -210,6 +210,7 @@ public class KeyguardViewMediator extends SystemUI { private boolean mBootCompleted; private boolean mBootSendUserPresent; private boolean mShuttingDown; + private boolean mDozing; /** High level access to the power manager for WakeLocks */ private PowerManager mPM; @@ -713,11 +714,10 @@ public class KeyguardViewMediator extends SystemUI { com.android.keyguard.R.bool.config_enableKeyguardService)) { setShowingLocked(!shouldWaitForProvisioning() && !mLockPatternUtils.isLockScreenDisabled( - KeyguardUpdateMonitor.getCurrentUser()), - mAodShowing, true /* forceCallbacks */); + KeyguardUpdateMonitor.getCurrentUser()), true /* forceCallbacks */); } else { // The system's keyguard is disabled or missing. - setShowingLocked(false, mAodShowing, true); + setShowingLocked(false /* showing */, true /* forceCallbacks */); } mStatusBarKeyguardViewManager = @@ -1326,7 +1326,7 @@ public class KeyguardViewMediator extends SystemUI { if (mLockPatternUtils.checkVoldPassword(KeyguardUpdateMonitor.getCurrentUser())) { if (DEBUG) Log.d(TAG, "Not showing lock screen since just decrypted"); // Without this, settings is not enabled until the lock screen first appears - setShowingLocked(false, mAodShowing); + setShowingLocked(false); hideLocked(); return; } @@ -1742,6 +1742,9 @@ public class KeyguardViewMediator extends SystemUI { private void updateActivityLockScreenState(boolean showing, boolean aodShowing) { mUiOffloadThread.submit(() -> { + if (DEBUG) { + Log.d(TAG, "updateActivityLockScreenState(" + showing + ", " + aodShowing + ")"); + } try { ActivityTaskManager.getService().setLockScreenShown(showing, aodShowing); } catch (RemoteException e) { @@ -1767,10 +1770,10 @@ public class KeyguardViewMediator extends SystemUI { if (DEBUG) Log.d(TAG, "handleShow"); } - setShowingLocked(true, mAodShowing); - mStatusBarKeyguardViewManager.show(options); mHiding = false; mWakeAndUnlocking = false; + setShowingLocked(true); + mStatusBarKeyguardViewManager.show(options); resetKeyguardDonePendingLocked(); mHideAnimationRun = false; adjustStatusBarLocked(); @@ -1877,7 +1880,7 @@ public class KeyguardViewMediator extends SystemUI { if (!mHiding) { // Tell ActivityManager that we canceled the keyguardExitAnimation. - setShowingLocked(mShowing, mAodShowing, true /* force */); + setShowingLocked(mShowing, true /* force */); return; } mHiding = false; @@ -1898,8 +1901,8 @@ public class KeyguardViewMediator extends SystemUI { playSounds(false); } + setShowingLocked(false); mWakeAndUnlocking = false; - setShowingLocked(false, mAodShowing); mDismissCallbackRegistry.notifyDismissSucceeded(); mStatusBarKeyguardViewManager.hide(startTime, fadeoutDuration); resetKeyguardDonePendingLocked(); @@ -1959,7 +1962,7 @@ public class KeyguardViewMediator extends SystemUI { Trace.beginSection("KeyguardViewMediator#handleVerifyUnlock"); synchronized (KeyguardViewMediator.this) { if (DEBUG) Log.d(TAG, "handleVerifyUnlock"); - setShowingLocked(true, mAodShowing); + setShowingLocked(true); mStatusBarKeyguardViewManager.dismissAndCollapse(); } Trace.endSection(); @@ -2106,6 +2109,8 @@ public class KeyguardViewMediator extends SystemUI { pw.print(" mDeviceInteractive: "); pw.println(mDeviceInteractive); pw.print(" mGoingToSleep: "); pw.println(mGoingToSleep); pw.print(" mHiding: "); pw.println(mHiding); + pw.print(" mDozing: "); pw.println(mDozing); + pw.print(" mAodShowing: "); pw.println(mAodShowing); pw.print(" mWaitingUntilKeyguardVisible: "); pw.println(mWaitingUntilKeyguardVisible); pw.print(" mKeyguardDonePending: "); pw.println(mKeyguardDonePending); pw.print(" mHideAnimationRun: "); pw.println(mHideAnimationRun); @@ -2116,10 +2121,14 @@ public class KeyguardViewMediator extends SystemUI { } /** - * @param aodShowing true when AOD - or ambient mode - is showing. + * @param dozing true when AOD - or ambient mode - is showing. */ - public void setAodShowing(boolean aodShowing) { - setShowingLocked(mShowing, aodShowing); + public void setDozing(boolean dozing) { + if (dozing == mDozing) { + return; + } + mDozing = dozing; + setShowingLocked(mShowing); } /** @@ -2140,19 +2149,18 @@ public class KeyguardViewMediator extends SystemUI { } } - private void setShowingLocked(boolean showing, boolean aodShowing) { - setShowingLocked(showing, aodShowing, false /* forceCallbacks */); + private void setShowingLocked(boolean showing) { + setShowingLocked(showing, false /* forceCallbacks */); } - private void setShowingLocked(boolean showing, boolean aodShowing, boolean forceCallbacks) { + private void setShowingLocked(boolean showing, boolean forceCallbacks) { + final boolean aodShowing = mDozing && !mWakeAndUnlocking; final boolean notifyDefaultDisplayCallbacks = showing != mShowing || aodShowing != mAodShowing || forceCallbacks; + mShowing = showing; + mAodShowing = aodShowing; if (notifyDefaultDisplayCallbacks) { - mShowing = showing; - mAodShowing = aodShowing; - if (notifyDefaultDisplayCallbacks) { - notifyDefaultDisplayCallbacks(showing); - } + notifyDefaultDisplayCallbacks(showing); updateActivityLockScreenState(showing, aodShowing); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 4392c35ee233..95a33afeb7dd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -3435,7 +3435,7 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationPanel.resetViews(dozingAnimated); updateQsExpansionEnabled(); - mKeyguardViewMediator.setAodShowing(mDozing); + mKeyguardViewMediator.setDozing(mDozing); mEntryManager.updateNotifications(); updateDozingState(); -- GitLab From 970dd06fbf8bc0ce961de77443c1fad0c188ad97 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 11 Jul 2019 08:44:00 -0700 Subject: [PATCH 288/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I17b30e81fe212ee9f7c9486dd6d0dca30b46fecf --- core/res/res/values-de/strings.xml | 2 +- core/res/res/values-en-rXC/strings.xml | 2 +- core/res/res/values-eu/strings.xml | 10 +++++----- core/res/res/values-gl/strings.xml | 2 +- core/res/res/values-hi/strings.xml | 2 +- core/res/res/values-it/strings.xml | 16 ++++++++-------- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index c307acb23f64..1ab77ccf66ef 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -567,7 +567,7 @@ "Beweg das Smartphone nach links." "Beweg das Smartphone nach rechts." "Bitte sieh direkt auf dein Gerät." - "Richte die Smartphone-Kamera auf dein Gesicht." + "Halte dein Gesicht direkt vor dein Smartphone." "Zu viel Unruhe. Halte das Smartphone ruhig." "Bitte registriere dein Gesicht noch einmal." "Gesicht wird nicht mehr erkannt. Erneut versuchen." diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 7709cc33a891..f62b3857b930 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -567,7 +567,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‎‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‎‎‎‏‎‏‏‎‏‏‎‏‏‎‏‎‏‎‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎Move phone to the left.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‏‎‎‎‎‏‏‎‎‏‏‏‎‎‏‎‎‏‎‏‏‏‎‏‎‏‎‎‏‏‎‎‏‎‎‎‏‎‎‎‏‎‏‎‏‎‏‎‎‎‎‎‎‎Move phone to the right.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‎‏‏‏‎‎‎‏‏‎‏‏‏‎‏‎‎‏‎‎‎‏‎‎‎‏‎‎‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‎‏‎Please look more directly at your device.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎‏‎‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎‎‎‏‎‏‏‎‏‎‎‏‎Can’t see your face. Look at the phone.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‎‎‏‎‏‏‎‎‎‎‏‎‏‏‎‎‎‎‏‏‏‎‎‎‎‏‏‏‏‎‎‏‎‏‎‏‏‎‏‏‏‎‏‎‎‎‎‏‎‎‏‏‏‏‎‎Position your face directly in front of the phone.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‏‎‏‎‎‏‎‏‎‏‏‎‎‏‏‏‎‏‏‎‎‎‏‏‏‏‎‏‎‎‏‎‎‎‎‎‎‎‎‏‏‏‏‎‎‏‎‏‏‎‎‏‏‎Too much motion. Hold phone steady.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‎‏‎‏‎‏‎‎‏‎‎‎‏‎‎‎‏‏‎‎‎‏‎‏‎‎‏‏‎‎‎‎‏‎‏‏‏‎‏‎‎‎‏‎‎‎‏‎‎‏‏‎Please re-enroll your face.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‎‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‎‏‎‎‎‏‎‎‏‏‎‏‎‎‏‎‏‏‎‎‏‏‎‎‏‎‏‎‏‏‏‏‏‏‎‎No longer able to recognize face. Try again.‎‏‎‎‏‎" diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index eaf1f56dead8..fb79545da1ce 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -374,7 +374,7 @@ "Beren zati batzuk memoria modu iraunkorrean ezartzeko baimena ematen die aplikazioei. Horrela, beste aplikazioek erabilgarri duten memoria murritz daiteke eta tableta motel daiteke." "Beren zati batzuk memorian modu iraunkorrean aktibo uztea baimentzen die aplikazioei. Horrela, beste aplikazioek memoria gutxiago izan lezakete erabilgarri eta telebistak motelago funtziona lezake." "Beren zati batzuk memoria modu iraunkorrean ezartzeko baimena ematen die aplikazioei. Horrela, beste aplikazioek erabilgarri duten memoria murritz daiteke eta telefonoa motel daiteke." - "Exekutatu zerbitzuak aurreko planoan" + "Abiarazi zerbitzuak aurreko planoan" "Aurreko planoko zerbitzuak erabiltzea baimentzen dio aplikazioari." "neurtu aplikazioen biltegiratzeko tokia" "Bere kodea, datuak eta cache-tamainak eskuratzeko baimena ematen die aplikazioei." @@ -421,7 +421,7 @@ "Aplikazioa aurreko planoan dagoenean, zure kokapenaren berri izan dezake sareen iturburuak erabilita; adibidez, telefonia mugikorreko dorreak eta Wi-Fi sareak. Kokapen-zerbitzu horiek aktibatuta eta erabilgarri izan behar dituzu telebistan, aplikazioak erabil ditzan." "Aplikazioa aurreko planoan dagoenean, zure kokapenaren berri izan dezake sareen iturburuak erabilita; adibidez, telefonia mugikorreko dorreak eta Wi-Fi sareak. Kokapen-zerbitzu horiek aktibatuta eta erabilgarri izan behar dituzu telefonoan, aplikazioak erabil ditzan." "Atzitu kokapena atzeko planoan" - "Baimen hau ematen bada kokapen zehatz edo gutxi gorabeherakorako sarbideaz gain, atzeko planoan exekutatu bitartean atzitu ahalko du aplikazioak kokapena." + "Baimen hau ematen bada kokapen zehatz edo gutxi gorabeherakorako sarbideaz gain, atzeko planoan abian den bitartean atzitu ahalko du aplikazioak kokapena." "aldatu audio-ezarpenak" "Audio-ezarpen orokorrak aldatzeko baimena ematen dio; besteak beste, bolumena eta irteerarako zer bozgorailu erabiltzen den." "grabatu audioa" @@ -1176,7 +1176,7 @@ "Itxaron" "Orriak ez du erantzuten.\n\nItxi egin nahi duzu?" "Aplikazioa birbideratu da" - "%1$s aplikazioa exekutatzen ari da." + "%1$s aplikazioa abian da." "%1$s aplikazioa lehenago abiarazi da." "Eskala" "Erakutsi beti" @@ -1202,7 +1202,7 @@ "%1$s prestatzen." "Aplikazioak abiarazten." "Bertsio-berritzea amaitzen." - "%1$s exekutatzen" + "%1$s abian da" "Sakatu jokora itzultzeko" "Aukeratu joko bat" "Funtzionamendu hobea izateko, joko hauetako bat baino ezin da egon irekita aldi berean." @@ -1440,7 +1440,7 @@ "Hurrengoa" "Eginda" "Atzera" - "Exekutatu" + "Abiarazi" "Markatu zenbakia \n%s erabilita" "Sortu kontaktua\n%s erabilita" "Aplikazio hauetako bat edo gehiago kontua orain eta etorkizunean atzitzeko baimena eskatzen ari dira." diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index e18196f56d01..4c8cc64d7067 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -567,7 +567,7 @@ "Move o teléfono cara á esquerda." "Move o teléfono cara á dereita." "Mira o dispositivo de forma máis directa." - "Coloca a cara directamente fronte ao teléfono." + "Coloca a cara directamente diante do teléfono." "Demasiado movemento. Non movas o teléfono." "Volve rexistrar a túa cara." "Xa non se pode recoñecer a cara. Téntao de novo." diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index dfced05e5c72..7dc0b92437e2 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1084,7 +1084,7 @@ "वापस लाएं" "फिर से करें" "ऑटोमैटिक भरना" - "लेख चयन" + "टेक्स्ट चुनें" "शब्दकोश में जोड़ें" "मिटाएं" "इनपुट विधि" diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 848a88281afc..45efc5ddf60b 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -416,7 +416,7 @@ "Consente all\'app di accedere a ulteriori comandi del fornitore di posizione. Ciò potrebbe consentire all\'app di interferire con il funzionamento del GPS o di altre fonti di geolocalizzazione." "accesso alla posizione esatta solo in primo piano" "Questa app può recuperare la tua posizione esatta solo quando è in primo piano. Questi servizi di geolocalizzazione devono essere attivi e disponibili sul telefono affinché l\'app possa usarli. Potrebbe aumentare il consumo della batteria." - "Accesso alla posizione approssimativa (in base alla rete) solo in primo piano" + "accesso alla posizione approssimativa (in base alla rete) solo in primo piano" "Questa app può recuperare la tua posizione tramite fonti di rete quali ripetitori di telefonia mobile e reti Wi-Fi, ma soltanto quando l\'app è in primo piano. Questi servizi di geolocalizzazione devono essere attivi e disponibili sul tablet affinché l\'app possa usarli." "Questa app può recuperare la tua posizione tramite fonti di rete quali ripetitori di telefonia mobile e reti Wi-Fi, ma soltanto quando l\'app è in primo piano. Questi servizi di geolocalizzazione devono essere attivi e disponibili sulla TV affinché l\'app possa usarli." "Questa app può recuperare la tua posizione tramite fonti di rete quali ripetitori di telefonia mobile e reti Wi-Fi, ma soltanto quando l\'app è in primo piano. Questi servizi di geolocalizzazione devono essere attivi e disponibili sul telefono affinché l\'app possa usarli." @@ -504,7 +504,7 @@ "Consente all\'applicazione di comunicare con tag, schede e lettori NFC (Near Field Communication)." "disattivazione blocco schermo" "Consente all\'applicazione di disattivare il blocco tastiera ed eventuali protezioni tramite password associate. Ad esempio, il telefono disattiva il blocco tastiera quando riceve una telefonata in arrivo e lo riattiva al termine della chiamata." - "richiedi complessità del blocco schermo" + "richiesta di complessità del blocco schermo" "Consente all\'app di conoscere il livello di complessità del blocco schermo (alto, medio, basso o nessuno), che indica l\'intervallo di caratteri possibile e il tipo di blocco schermo. L\'app può inoltre suggerire agli utenti di aggiornare il blocco schermo a un livello specifico di complessità, ma gli utenti possono ignorare liberamente il suggerimento e uscire. Tieni presente che il blocco schermo non viene memorizzato come testo non crittografato, quindi l\'app non conosce la password esatta." "utilizzo di hardware biometrico" "Consente all\'app di utilizzare hardware biometrico per eseguire l\'autenticazione" @@ -514,11 +514,11 @@ "Consente all\'app di utilizzare l\'hardware per il riconoscimento delle impronte digitali per eseguire l\'autenticazione" "modifica della tua raccolta musicale" "Consente all\'app di modificare la tua raccolta musicale." - "Modifica della tua raccolta di video" + "modifica della tua raccolta di video" "Consente all\'app di modificare la tua raccolta di video." - "Modifica della tua raccolta di foto" + "modifica della tua raccolta di foto" "Consente all\'app di modificare la tua raccolta di foto." - "Lettura delle posizioni dalla tua raccolta multimediale" + "lettura delle posizioni dalla tua raccolta multimediale" "Consente all\'app di leggere le posizioni dalla tua raccolta multimediale." "Verifica la tua identità" "Hardware biometrico non disponibile" @@ -550,9 +550,9 @@ "Icona dell\'impronta digitale" - "gestisci l\'hardware per Sblocco col sorriso" + "gestione dell\'hardware per Sblocco col sorriso" "Consente all\'app di richiamare i metodi per aggiungere e rimuovere i modelli di volti." - "utilizza l\'hardware per Sblocco col sorriso" + "utilizzo dell\'hardware per Sblocco col sorriso" "Consente all\'app di utilizzare hardware per l\'autenticazione con Sblocco col sorriso" "Sblocco col sorriso" "Registra di nuovo il volto" @@ -601,7 +601,7 @@ "Consente a un\'applicazione di leggere le statistiche di sincronizzazione per un account, incluse la cronologia degli eventi di sincronizzazione e la quantità di dati sincronizzati." "lettura dei contenuti dell\'archivio condiviso" "Consente all\'app di leggere i contenuti del tuo archivio condiviso." - "modificare/eliminare i contenuti dell\'archivio condiviso" + "modifica/eliminazione dei contenuti dell\'archivio condiviso" "Consente all\'app di modificare i contenuti del tuo archivio condiviso." "invio/ricezione di chiamate SIP" "Consente all\'app di effettuare e ricevere chiamate SIP." -- GitLab From 6db77174a2171157bfc93c5836704fd6609c9ae7 Mon Sep 17 00:00:00 2001 From: Jordan Liu Date: Mon, 24 Jun 2019 11:27:34 -0700 Subject: [PATCH 289/620] Do not notify SS change with invalid subId If a service state change is reported as a subscription is becoming invalid (i.e. no longer connected to a phone), the current behavior can sometimes notify this change to all PhoneStateListeners regardless of which subId they registered to listen on (namely this happens when the subscription was attached to the default phone). This change removes that behavior so that no listeners are notified if the subscription is invalid. Test: manually verified on DSDS that when 1. erasing eSIM when it is default and 2. removing pSIM when it is default, the service state triangle for the other SIM is unaffected Bug: 133140128 Merged-In: I906147b2d13be0bc26f8d31ec361fcd016c2cda0 Change-Id: I906147b2d13be0bc26f8d31ec361fcd016c2cda0 (cherry picked from commit 02ce78681fc1c9860abc4a68a9e77886963258a0) --- .../java/com/android/server/TelephonyRegistry.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index e66e596d5038..f7e825eecc12 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -1027,7 +1027,12 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { log(str); } mLocalLog.log(str); - if (validatePhoneId(phoneId)) { + // for service state updates, don't notify clients when subId is invalid. This prevents + // us from sending incorrect notifications like b/133140128 + // In the future, we can remove this logic for every notification here and add a + // callback so listeners know when their PhoneStateListener's subId becomes invalid, but + // for now we use the simplest fix. + if (validatePhoneId(phoneId) && SubscriptionManager.isValidSubscriptionId(subId)) { mServiceState[phoneId] = state; for (Record r : mRecords) { @@ -1059,7 +1064,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } } } else { - log("notifyServiceStateForSubscriber: INVALID phoneId=" + phoneId); + log("notifyServiceStateForSubscriber: INVALID phoneId=" + phoneId + + " or subId=" + subId); } handleRemoveListLocked(); } -- GitLab From 9d2660041a7f4429aa0c632e424b83941dfe5d3c Mon Sep 17 00:00:00 2001 From: Nathan Harold Date: Fri, 14 Jun 2019 16:56:05 -0700 Subject: [PATCH 290/620] Use TM SubId in getDataState and getDataActivity -Update getDataState() API to use the SubId specified by the TelephonyManager instance. -Update the getDataActivity() API to use the SubId specified by the TelephonyManager instance. (This CL is an un-revert of aosp/984377) Bug: 135205433 Test: manual (automated test is infeasible) Change-Id: I035f2c44a7955e88608b1c336acb72fb68c3e450 Merged-In: I035f2c44a7955e88608b1c336acb72fb68c3e450 --- config/hiddenapi-greylist-max-p.txt | 2 + .../android/telephony/TelephonyManager.java | 6 ++- .../internal/telephony/ITelephony.aidl | 42 +++++++++++++++---- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/config/hiddenapi-greylist-max-p.txt b/config/hiddenapi-greylist-max-p.txt index 141e8e669dac..25d45b0e6570 100644 --- a/config/hiddenapi-greylist-max-p.txt +++ b/config/hiddenapi-greylist-max-p.txt @@ -70,6 +70,8 @@ Lcom/android/internal/R$styleable;->MenuView:[I Lcom/android/internal/R$styleable;->Searchable:[I Lcom/android/internal/R$styleable;->SearchableActionKey:[I Lcom/android/internal/telephony/IPhoneSubInfo$Stub;->()V +Lcom/android/internal/telephony/ITelephony;->getDataActivity()I +Lcom/android/internal/telephony/ITelephony;->getDataState()I Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCallForwardingChanged(Z)V Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCellLocation(Landroid/os/Bundle;)V Lcom/android/internal/telephony/ITelephonyRegistry;->notifyDataActivity(I)V diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 6f60d334974d..5e8c4f78e18b 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -4890,7 +4890,8 @@ public class TelephonyManager { ITelephony telephony = getITelephony(); if (telephony == null) return DATA_ACTIVITY_NONE; - return telephony.getDataActivity(); + return telephony.getDataActivityForSubId( + getSubId(SubscriptionManager.getActiveDataSubscriptionId())); } catch (RemoteException ex) { // the phone process is restarting. return DATA_ACTIVITY_NONE; @@ -4938,7 +4939,8 @@ public class TelephonyManager { ITelephony telephony = getITelephony(); if (telephony == null) return DATA_DISCONNECTED; - return telephony.getDataState(); + return telephony.getDataStateForSubId( + getSubId(SubscriptionManager.getActiveDataSubscriptionId())); } catch (RemoteException ex) { // the phone process is restarting. return DATA_DISCONNECTED; diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 5a27a0fb42e4..a2dcc78585eb 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -308,18 +308,46 @@ interface ITelephony { */ List getNeighboringCellInfo(String callingPkg); - @UnsupportedAppUsage - int getCallState(); + @UnsupportedAppUsage + int getCallState(); /** * Returns the call state for a slot. */ - int getCallStateForSlot(int slotIndex); + int getCallStateForSlot(int slotIndex); + + /** + * Replaced by getDataActivityForSubId. + */ + int getDataActivity(); + + /** + * Returns a constant indicating the type of activity on a data connection + * (cellular). + * + * @see #DATA_ACTIVITY_NONE + * @see #DATA_ACTIVITY_IN + * @see #DATA_ACTIVITY_OUT + * @see #DATA_ACTIVITY_INOUT + * @see #DATA_ACTIVITY_DORMANT + */ + int getDataActivityForSubId(int subId); + + /** + * Replaced by getDataStateForSubId. + */ + int getDataState(); - @UnsupportedAppUsage - int getDataActivity(); - @UnsupportedAppUsage - int getDataState(); + /** + * Returns a constant indicating the current data connection state + * (cellular). + * + * @see #DATA_DISCONNECTED + * @see #DATA_CONNECTING + * @see #DATA_CONNECTED + * @see #DATA_SUSPENDED + */ + int getDataStateForSubId(int subId); /** * Returns the current active phone type as integer. -- GitLab From ac56a4254eff9351358bdf586bed89672ad3481d Mon Sep 17 00:00:00 2001 From: Malcolm Chen Date: Mon, 1 Jul 2019 16:32:21 -0700 Subject: [PATCH 291/620] Provide @hide API to return merged IMSIs from grouping. Bug: 135105735 Test: test app. Apply grouping and call the new API, to make sure it returns correct values. Change-Id: I99586976d3421d4b35be465201ee33cbb2dfd1d9 --- .../settingslib/net/DataUsageUtils.java | 18 +++++++---- .../settingslib/net/DataUsageUtilsTest.java | 32 ++++++++++++------- .../android/telephony/TelephonyManager.java | 27 ++++++++++++++++ .../internal/telephony/ITelephony.aidl | 5 +++ 4 files changed, 65 insertions(+), 17 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java index b15ea980ae15..23e2949372aa 100644 --- a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java @@ -18,11 +18,11 @@ package com.android.settingslib.net; import android.content.Context; import android.net.NetworkTemplate; -import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.Log; +import com.android.internal.util.ArrayUtils; /** * Utils class for data usage */ @@ -34,19 +34,25 @@ public class DataUsageUtils { */ public static NetworkTemplate getMobileTemplate(Context context, int subId) { final TelephonyManager telephonyManager = context.getSystemService( - TelephonyManager.class).createForSubscriptionId(subId); + TelephonyManager.class); final SubscriptionManager subscriptionManager = context.getSystemService( SubscriptionManager.class); - final SubscriptionInfo info = subscriptionManager.getActiveSubscriptionInfo(subId); final NetworkTemplate mobileAll = NetworkTemplate.buildTemplateMobileAll( telephonyManager.getSubscriberId(subId)); - if (info == null) { + if (!subscriptionManager.isActiveSubId(subId)) { Log.i(TAG, "Subscription is not active: " + subId); return mobileAll; } - // Use old API to build networkTemplate - return NetworkTemplate.normalize(mobileAll, telephonyManager.getMergedSubscriberIds()); + final String[] mergedSubscriberIds = telephonyManager.createForSubscriptionId(subId) + .getMergedSubscriberIdsFromGroup(); + + if (ArrayUtils.isEmpty(mergedSubscriberIds)) { + Log.i(TAG, "mergedSubscriberIds is null."); + return mobileAll; + } + + return NetworkTemplate.normalize(mobileAll, mergedSubscriberIds); } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageUtilsTest.java index 821c0b3a23f7..5cae6116a59c 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageUtilsTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageUtilsTest.java @@ -18,6 +18,7 @@ package com.android.settingslib.net; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -37,13 +38,13 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -import java.util.ArrayList; import java.util.List; @RunWith(RobolectricTestRunner.class) public class DataUsageUtilsTest { private static final int SUB_ID = 1; + private static final int SUB_ID_2 = 2; private static final String SUBSCRIBER_ID = "Test Subscriber"; private static final String SUBSCRIBER_ID_2 = "Test Subscriber 2"; @@ -66,21 +67,28 @@ public class DataUsageUtilsTest { mContext = spy(RuntimeEnvironment.application); when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); - when(mTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(mTelephonyManager); when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager); when(mTelephonyManager.getSubscriberId(SUB_ID)).thenReturn(SUBSCRIBER_ID); - when(mTelephonyManager.getMergedSubscriberIds()).thenReturn( - new String[]{SUBSCRIBER_ID, SUBSCRIBER_ID_2}); - - mInfos = new ArrayList<>(); - mInfos.add(mInfo1); - mInfos.add(mInfo2); - when(mSubscriptionManager.getSubscriptionsInGroup(mParcelUuid)).thenReturn(mInfos); + when(mTelephonyManager.getSubscriberId(SUB_ID_2)).thenReturn(SUBSCRIBER_ID_2); + when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager); + when(mSubscriptionManager.isActiveSubId(anyInt())).thenReturn(true); } @Test public void getMobileTemplate_infoNull_returnMobileAll() { - when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(null); + when(mSubscriptionManager.isActiveSubId(SUB_ID)).thenReturn(false); + + final NetworkTemplate networkTemplate = DataUsageUtils.getMobileTemplate(mContext, SUB_ID); + assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID)).isTrue(); + assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID_2)).isFalse(); + } + + @Test + public void getMobileTemplate_groupUuidNull_returnMobileAll() { + when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(mInfo1); + when(mInfo1.getGroupUuid()).thenReturn(null); + when(mTelephonyManager.getMergedSubscriberIdsFromGroup()) + .thenReturn(new String[] {SUBSCRIBER_ID}); final NetworkTemplate networkTemplate = DataUsageUtils.getMobileTemplate(mContext, SUB_ID); assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID)).isTrue(); @@ -88,9 +96,11 @@ public class DataUsageUtilsTest { } @Test - public void getMobileTemplate_infoExisted_returnMobileMerged() { + public void getMobileTemplate_groupUuidExist_returnMobileMerged() { when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(mInfo1); when(mInfo1.getGroupUuid()).thenReturn(mParcelUuid); + when(mTelephonyManager.getMergedSubscriberIdsFromGroup()) + .thenReturn(new String[] {SUBSCRIBER_ID, SUBSCRIBER_ID_2}); final NetworkTemplate networkTemplate = DataUsageUtils.getMobileTemplate(mContext, SUB_ID); assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID)).isTrue(); diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 758cd286ac1b..27087663d43c 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -3972,9 +3972,14 @@ public class TelephonyManager { * The returned set of subscriber IDs will include the subscriber ID corresponding to this * TelephonyManager's subId. * + * This is deprecated and {@link #getMergedSubscriberIdsFromGroup()} should be used for data + * usage merging purpose. + * TODO: remove this API. + * * @hide */ @UnsupportedAppUsage + @Deprecated public @Nullable String[] getMergedSubscriberIds() { try { ITelephony telephony = getITelephony(); @@ -3986,6 +3991,28 @@ public class TelephonyManager { return null; } + /** + * Return the set of subscriber IDs that should be considered "merged together" for data usage + * purposes. Unlike {@link #getMergedSubscriberIds()} this API merge subscriberIds based on + * subscription grouping: subscriberId of those in the same group will all be returned. + * + *

Requires the calling app to have READ_PRIVILEGED_PHONE_STATE permission. + * + * @hide + */ + @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public @Nullable String[] getMergedSubscriberIdsFromGroup() { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + return telephony.getMergedSubscriberIdsFromGroup(getSubId(), getOpPackageName()); + } + } catch (RemoteException ex) { + } catch (NullPointerException ex) { + } + return null; + } + /** * Returns the MSISDN string. * for a GSM phone. Return null if it is unavailable. diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 5a27a0fb42e4..7112ac1b8452 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -1058,6 +1058,11 @@ interface ITelephony { */ String[] getMergedSubscriberIds(int subId, String callingPackage); + /** + * @hide + */ + String[] getMergedSubscriberIdsFromGroup(int subId, String callingPackage); + /** * Override the operator branding for the current ICCID. * -- GitLab From 07fcb5bb24b260206940363bb21350770000a831 Mon Sep 17 00:00:00 2001 From: Malcolm Chen Date: Tue, 2 Jul 2019 22:29:35 -0700 Subject: [PATCH 292/620] Use new API to get mergedSubscriberIds based on grouping. In addition, make mMergedSubscriberIds a list to fit usage of multi-SIM devices. Bug: 135105735 Bug: 137137221 Test: manual Change-Id: I364262559789112f35b88f4c298463bf4af2e82a --- core/java/android/net/NetworkTemplate.java | 37 +++++++++++++++---- .../net/NetworkPolicyManagerService.java | 17 ++++++--- 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/core/java/android/net/NetworkTemplate.java b/core/java/android/net/NetworkTemplate.java index ae421a4991a4..87c7118c0ed8 100644 --- a/core/java/android/net/NetworkTemplate.java +++ b/core/java/android/net/NetworkTemplate.java @@ -48,6 +48,7 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.Arrays; +import java.util.List; import java.util.Objects; /** @@ -481,17 +482,39 @@ public class NetworkTemplate implements Parcelable { * For example, given an incoming template matching B, and the currently * active merge set [A,B], we'd return a new template that primarily matches * A, but also matches B. + * TODO: remove and use {@link #normalize(NetworkTemplate, List)}. */ @UnsupportedAppUsage public static NetworkTemplate normalize(NetworkTemplate template, String[] merged) { - if (template.isMatchRuleMobile() && ArrayUtils.contains(merged, template.mSubscriberId)) { - // Requested template subscriber is part of the merge group; return - // a template that matches all merged subscribers. - return new NetworkTemplate(template.mMatchRule, merged[0], merged, - template.mNetworkId); - } else { - return template; + return normalize(template, Arrays.asList(merged)); + } + + /** + * Examine the given template and normalize if it refers to a "merged" + * mobile subscriber. We pick the "lowest" merged subscriber as the primary + * for key purposes, and expand the template to match all other merged + * subscribers. + * + * There can be multiple merged subscriberIds for multi-SIM devices. + * + *

+ * For example, given an incoming template matching B, and the currently + * active merge set [A,B], we'd return a new template that primarily matches + * A, but also matches B. + */ + public static NetworkTemplate normalize(NetworkTemplate template, List mergedList) { + if (!template.isMatchRuleMobile()) return template; + + for (String[] merged : mergedList) { + if (ArrayUtils.contains(merged, template.mSubscriberId)) { + // Requested template subscriber is part of the merge group; return + // a template that matches all merged subscribers. + return new NetworkTemplate(template.mMatchRule, merged[0], merged, + template.mNetworkId); + } } + + return template; } @UnsupportedAppUsage diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 6c34e1313f73..d3346cddf3d0 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -232,7 +232,6 @@ import com.android.server.ServiceThread; import com.android.server.SystemConfig; import libcore.io.IoUtils; -import libcore.util.EmptyArray; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlSerializer; @@ -540,7 +539,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private final SparseArray mSubIdToSubscriberId = new SparseArray<>(); /** Set of all merged subscriberId as of last update */ @GuardedBy("mNetworkPoliciesSecondLock") - private String[] mMergedSubscriberIds = EmptyArray.STRING; + private List mMergedSubscriberIds = new ArrayList<>(); /** * Indicates the uids restricted by admin from accessing metered data. It's a mapping from @@ -1801,7 +1800,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final SubscriptionManager sm = mContext.getSystemService(SubscriptionManager.class); final int[] subIds = ArrayUtils.defeatNullable(sm.getActiveSubscriptionIdList()); - final String[] mergedSubscriberIds = ArrayUtils.defeatNullable(tm.getMergedSubscriberIds()); + final List mergedSubscriberIdsList = new ArrayList(); final SparseArray subIdToSubscriberId = new SparseArray<>(subIds.length); for (int subId : subIds) { @@ -1811,6 +1810,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } else { Slog.wtf(TAG, "Missing subscriberId for subId " + subId); } + + String[] mergedSubscriberId = ArrayUtils.defeatNullable( + tm.createForSubscriptionId(subId).getMergedSubscriberIdsFromGroup()); + mergedSubscriberIdsList.add(mergedSubscriberId); } synchronized (mNetworkPoliciesSecondLock) { @@ -1820,7 +1823,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { subIdToSubscriberId.valueAt(i)); } - mMergedSubscriberIds = mergedSubscriberIds; + mMergedSubscriberIds = mergedSubscriberIdsList; } Trace.traceEnd(TRACE_TAG_NETWORK); @@ -3373,8 +3376,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { fout.decreaseIndent(); fout.println(); - fout.println("Merged subscriptions: " - + Arrays.toString(NetworkIdentity.scrubSubscriberId(mMergedSubscriberIds))); + for (String[] mergedSubscribers : mMergedSubscriberIds) { + fout.println("Merged subscriptions: " + Arrays.toString( + NetworkIdentity.scrubSubscriberId(mergedSubscribers))); + } fout.println(); fout.println("Policy for UIDs:"); -- GitLab From 1dee0345db7c66efcbec27555d4f8a8edd1f2478 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Thu, 11 Jul 2019 17:44:54 -0400 Subject: [PATCH 293/620] Add metrics logging to BrightLineFalsingManager. This metric was logged in the old manager but not the new one. Bug: 71762354 Change-Id: Ieca5d4659fc8eb60ba481c6daf495a69f8e0e9e6 Test: manual. --- .../systemui/classifier/FalsingManagerImpl.java | 4 ++-- .../brightline/BrightLineFalsingManager.java | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java index 6fb6467d07b2..67dfdcac4b22 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java @@ -67,8 +67,8 @@ public class FalsingManagerImpl implements FalsingManager { Sensor.TYPE_LIGHT, Sensor.TYPE_ROTATION_VECTOR, }; - private static final String FALSING_REMAIN_LOCKED = "falsing_failure_after_attempts"; - private static final String FALSING_SUCCESS = "falsing_success_after_attempts"; + public static final String FALSING_REMAIN_LOCKED = "falsing_failure_after_attempts"; + public static final String FALSING_SUCCESS = "falsing_success_after_attempts"; private final Handler mHandler = new Handler(Looper.getMainLooper()); private final Context mContext; diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java index 19c46e40f604..00f35aa4276c 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java @@ -16,6 +16,9 @@ package com.android.systemui.classifier.brightline; +import static com.android.systemui.classifier.FalsingManagerImpl.FALSING_REMAIN_LOCKED; +import static com.android.systemui.classifier.FalsingManagerImpl.FALSING_SUCCESS; + import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; @@ -24,6 +27,7 @@ import android.net.Uri; import android.util.Log; import android.view.MotionEvent; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.classifier.Classifier; import com.android.systemui.plugins.FalsingManager; @@ -44,6 +48,8 @@ public class BrightLineFalsingManager implements FalsingManager { private final SensorManager mSensorManager; private final FalsingDataProvider mDataProvider; private boolean mSessionStarted; + private MetricsLogger mMetricsLogger; + private int mIsFalseTouchCalls; private final ExecutorService mBackgroundExecutor = Executors.newSingleThreadExecutor(); @@ -64,6 +70,7 @@ public class BrightLineFalsingManager implements FalsingManager { SensorManager sensorManager) { mDataProvider = falsingDataProvider; mSensorManager = sensorManager; + mMetricsLogger = new MetricsLogger(); mClassifiers = new ArrayList<>(); DistanceClassifier distanceClassifier = new DistanceClassifier(mDataProvider); ProximityClassifier proximityClassifier = new ProximityClassifier(distanceClassifier, @@ -111,6 +118,10 @@ public class BrightLineFalsingManager implements FalsingManager { unregisterSensors(); mDataProvider.onSessionEnd(); mClassifiers.forEach(FalsingClassifier::onSessionEnded); + if (mIsFalseTouchCalls != 0) { + mMetricsLogger.histogram(FALSING_REMAIN_LOCKED, mIsFalseTouchCalls); + mIsFalseTouchCalls = 0; + } } } @@ -157,6 +168,10 @@ public class BrightLineFalsingManager implements FalsingManager { @Override public void onSucccessfulUnlock() { + if (mIsFalseTouchCalls != 0) { + mMetricsLogger.histogram(FALSING_SUCCESS, mIsFalseTouchCalls); + mIsFalseTouchCalls = 0; + } } @Override -- GitLab From b224622c29679e83ac4b42bc7ae6553456391629 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Thu, 11 Jul 2019 15:01:26 -0700 Subject: [PATCH 294/620] Do task stack work on handler to ensure in-order execution The rest of the ClientMonitor work is done on a handler to guarantee in-order execution. e.g. setting to null when auth completes, updating mCurrentClient when new client is requested, etc. Put this work on the same handler. Fixes: 137237140 Test: BiometricPromptDemo, go home while authenticating multiple times; no crash observed Change-Id: I43126ce13fb88d751571d0d52fe594c0293f794c --- .../server/biometrics/BiometricServiceBase.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java index 0c4f0bd0edc6..f08423eb2016 100644 --- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java +++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java @@ -497,9 +497,9 @@ public abstract class BiometricServiceBase extends SystemService } } - private final class BiometricTaskStackListener extends TaskStackListener { + private final Runnable mOnTaskStackChangedRunnable = new Runnable() { @Override - public void onTaskStackChanged() { + public void run() { try { if (!(mCurrentClient instanceof AuthenticationClient)) { return; @@ -514,8 +514,8 @@ public abstract class BiometricServiceBase extends SystemService final String topPackage = runningTasks.get(0).topActivity.getPackageName(); if (!topPackage.contentEquals(currentClient) && !mCurrentClient.isAlreadyDone()) { - Slog.e(getTag(), "Stopping background authentication, top: " + topPackage - + " currentClient: " + currentClient); + Slog.e(getTag(), "Stopping background authentication, top: " + + topPackage + " currentClient: " + currentClient); mCurrentClient.stop(false /* initiatedByClient */); } } @@ -523,6 +523,13 @@ public abstract class BiometricServiceBase extends SystemService Slog.e(getTag(), "Unable to get running tasks", e); } } + }; + + private final class BiometricTaskStackListener extends TaskStackListener { + @Override + public void onTaskStackChanged() { + mHandler.post(mOnTaskStackChangedRunnable); + } } private final class ResetClientStateRunnable implements Runnable { -- GitLab From d038189709427aecffb84a3e83086f09f46bc714 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Thu, 11 Jul 2019 16:25:36 -0700 Subject: [PATCH 295/620] Reset mSecureCameraLaunched when bouncer is shown Whenever the bouncer is shown, face auth should start again. Fixes: 137228869 Test: Install test camera app that's available on lockscreen, double tap power to launch camera on lock screen. Bouncer is shown, and face unlock works Change-Id: Ia33075935c6d8413ab7c9351739cca67bb81c377 --- .../com/android/keyguard/KeyguardUpdateMonitor.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 05e14a779a17..2eb93d3a6075 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -2203,6 +2203,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { if (DEBUG) Log.d(TAG, "handleKeyguardBouncerChanged(" + bouncer + ")"); boolean isBouncer = (bouncer == 1); mBouncer = isBouncer; + + if (isBouncer) { + // If the bouncer is shown, always clear this flag. This can happen in the following + // situations: 1) Default camera with SHOW_WHEN_LOCKED is not chosen yet. 2) Secure + // camera requests dismiss keyguard (tapping on photos for example). When these happen, + // face auth should resume. + mSecureCameraLaunched = false; + } + for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -2649,6 +2658,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { pw.println(" strongAuthFlags=" + Integer.toHexString(strongAuthFlags)); pw.println(" trustManaged=" + getUserTrustIsManaged(userId)); pw.println(" enabledByUser=" + mFaceSettingEnabledForUser); + pw.println(" mSecureCameraLaunched=" + mSecureCameraLaunched); } } } -- GitLab From 560aa5798f86878d26599f2f75aadb12f10c93bc Mon Sep 17 00:00:00 2001 From: Hai Zhang Date: Thu, 11 Jul 2019 17:30:45 -0700 Subject: [PATCH 296/620] Pass EXTRA_CALLING_PACKAGE for legacy change default dialer/SMS intents. So that RequestRoleActivity can always know the calling package. This is required to keep supporting pre-Q apps calling with startActivity(). Also fixed application info retrieval to be aware of multi-user. Bug: 137054465 Test: manual Change-Id: I686a97b543a0218837ee08291ef6fd9579a551d1 --- .../policy/PermissionPolicyService.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/policy/PermissionPolicyService.java b/services/core/java/com/android/server/policy/PermissionPolicyService.java index 037293f9536c..a569bffef141 100644 --- a/services/core/java/com/android/server/policy/PermissionPolicyService.java +++ b/services/core/java/com/android/server/policy/PermissionPolicyService.java @@ -798,7 +798,7 @@ public final class PermissionPolicyService extends SystemService { @Override public boolean checkStartActivity(@NonNull Intent intent, int callingUid, @Nullable String callingPackage) { - if (callingPackage != null && isActionRemovedForCallingPackage(intent.getAction(), + if (callingPackage != null && isActionRemovedForCallingPackage(intent, callingUid, callingPackage)) { Slog.w(LOG_TAG, "Action Removed: starting " + intent.toString() + " from " + callingPackage + " (uid=" + callingUid + ")"); @@ -811,8 +811,9 @@ public final class PermissionPolicyService extends SystemService { * Check if the intent action is removed for the calling package (often based on target SDK * version). If the action is removed, we'll silently cancel the activity launch. */ - private boolean isActionRemovedForCallingPackage(@Nullable String action, + private boolean isActionRemovedForCallingPackage(@NonNull Intent intent, int callingUid, @NonNull String callingPackage) { + String action = intent.getAction(); if (action == null) { return false; } @@ -821,15 +822,19 @@ public final class PermissionPolicyService extends SystemService { case Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT: { ApplicationInfo applicationInfo; try { - applicationInfo = getContext().getPackageManager().getApplicationInfo( - callingPackage, 0); + applicationInfo = getContext().getPackageManager().getApplicationInfoAsUser( + callingPackage, 0, UserHandle.getUserId(callingUid)); + if (applicationInfo.targetSdkVersion >= Build.VERSION_CODES.Q) { + // Applications targeting Q or higher should use + // RoleManager.createRequestRoleIntent() instead. + return true; + } } catch (PackageManager.NameNotFoundException e) { Slog.i(LOG_TAG, "Cannot find application info for " + callingPackage); - return false; } - // Applications targeting Q should use RoleManager.createRequestRoleIntent() - // instead. - return applicationInfo.targetSdkVersion >= Build.VERSION_CODES.Q; + // Make sure RequestRoleActivity can know the calling package if we allow it. + intent.putExtra(Intent.EXTRA_CALLING_PACKAGE, callingPackage); + return false; } default: return false; -- GitLab From b6708dad402abc42f776bb8be601a199cdd03561 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 11 Jul 2019 19:34:56 -0700 Subject: [PATCH 297/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I22c679764a454425947c3e0bd3949b18fa6678d4 --- packages/SystemUI/res/values-eu/strings.xml | 4 ++-- packages/SystemUI/res/values-hy/strings.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 17f19f72c556..31a7d52cb583 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -870,7 +870,7 @@ "Memoria" "Aholkuak" "Zuzeneko aplikazioak" - "%1$s exekutatzen ari da" + "%1$s abian da" "Ezer instalatu gabe ireki da aplikazioa." "Ezer instalatu gabe ireki da aplikazioa. Sakatu informazio gehiago lortzeko." "Aplikazioari buruzko informazioa" @@ -887,7 +887,7 @@ "%s arte" "Utzi bere horretan" "Ordeztu" - "Aplikazioak exekutatzen ari dira atzeko planoan" + "Aplikazioak abian dira atzeko planoan" "Sakatu bateria eta datuen erabilerari buruzko xehetasunak ikusteko" "Datu-konexioa desaktibatu nahi duzu?" "%s erabilita ezingo dituzu erabili datuak edo Internet. Wifi-sare baten bidez soilik konektatu ahal izango zara Internetera." diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 07ad953c9b68..54ba5b0619ea 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -129,7 +129,7 @@ "Դեմքի ճանաչում…" "Դեմքի պատկերակ" "Համատեղելիության խոշորացման կոճակը:" - "Դիտափոխել փոքրից ավելի մեծ էկրան:" + "Մասշտաբը մեծացնել փոքրից ավելի մեծ էկրան:" "Bluetooth-ը միացված է:" "Bluetooth-ն անջատված է:" "Մարտկոց չկա:" -- GitLab From adec8b0333953ba4566906abbe685c38e84158dd Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 11 Jul 2019 19:53:04 -0700 Subject: [PATCH 298/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: If6d1fbbe8fb5560661f607deecf6168b7a4ccd01 --- packages/SystemUI/res/values-eu/strings.xml | 4 ++-- packages/SystemUI/res/values-hy/strings.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index a5f998914cec..7b2d7936d5ef 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -871,7 +871,7 @@ "Memoria" "Aholkuak" "Zuzeneko aplikazioak" - "%1$s exekutatzen ari da" + "%1$s abian da" "Ezer instalatu gabe ireki da aplikazioa." "Ezer instalatu gabe ireki da aplikazioa. Sakatu informazio gehiago lortzeko." "Aplikazioari buruzko informazioa" @@ -888,7 +888,7 @@ "%s arte" "Utzi bere horretan" "Ordeztu" - "Aplikazioak exekutatzen ari dira atzeko planoan" + "Aplikazioak abian dira atzeko planoan" "Sakatu bateria eta datuen erabilerari buruzko xehetasunak ikusteko" "Datu-konexioa desaktibatu nahi duzu?" "%s erabilita ezingo dituzu erabili datuak edo Internet. Wifi-sare baten bidez soilik konektatu ahal izango zara Internetera." diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 6d614b1e3f45..3156a6f6fda2 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -130,7 +130,7 @@ "Դեմքի ճանաչում…" "Դեմքի պատկերակ" "Համատեղելիության խոշորացման կոճակը:" - "Դիտափոխել փոքրից ավելի մեծ էկրան:" + "Մասշտաբը մեծացնել փոքրից ավելի մեծ էկրան:" "Bluetooth-ը միացված է:" "Bluetooth-ն անջատված է:" "Մարտկոց չկա:" -- GitLab From 19734232cb93e0a254b27bda79cc6e56c5e45eb3 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Thu, 11 Jul 2019 20:02:40 -0700 Subject: [PATCH 299/620] Fixed a crash with remote input Fixes: 137156529 Test: use remote input on hun Change-Id: Ib1adc090346d7a90283053725e0038494b326528 --- .../systemui/statusbar/NotificationRemoteInputManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java index 70ee752dd8ed..c9050d492191 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java @@ -398,7 +398,7 @@ public class NotificationRemoteInputManager implements Dumpable { } } - if (!riv.isAttachedToWindow()) { + if (riv != null && !riv.isAttachedToWindow()) { // the remoteInput isn't attached to the window anymore :/ Let's focus on the expanded // one instead if it's available riv = null; -- GitLab From 552a58ae51e4f8ef1a0bcefe9a475b4511454c17 Mon Sep 17 00:00:00 2001 From: sqian Date: Thu, 11 Jul 2019 14:42:37 -0700 Subject: [PATCH 300/620] Add a documentation in EmergencyNumber#getNumber If the number starts with a carrier prefix, the carrier prefix is configured in {@link CarrierConfigManager#KEY_EMERGENCY_NUMBER_PREFIX_STRING_ARRAY}. This is important because it provides a solid reference for Apps to strip the prefix, which they may not prefer to display. Bug: 137225076 Test: Treehugger Change-Id: I1f6bd74f1d6eb86fe3326246e0ddb08b9cf7ac11 --- .../java/android/telephony/emergency/EmergencyNumber.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/telephony/java/android/telephony/emergency/EmergencyNumber.java b/telephony/java/android/telephony/emergency/EmergencyNumber.java index 511adf6ad65b..19d07242132b 100644 --- a/telephony/java/android/telephony/emergency/EmergencyNumber.java +++ b/telephony/java/android/telephony/emergency/EmergencyNumber.java @@ -22,6 +22,7 @@ import android.hardware.radio.V1_4.EmergencyNumberSource; import android.hardware.radio.V1_4.EmergencyServiceCategory; import android.os.Parcel; import android.os.Parcelable; +import android.telephony.CarrierConfigManager; import android.telephony.PhoneNumberUtils; import android.telephony.Rlog; @@ -301,6 +302,9 @@ public final class EmergencyNumber implements Parcelable, Comparable Date: Fri, 12 Jul 2019 17:46:11 +0900 Subject: [PATCH 301/620] Fix issue where bouncer won't be dismissed when being dragged Because the animation might have finished but bouncer is not fully visible yet. Test: start dragging, wait for animation, then auth with face Fixes: 132846921 Change-Id: I0155d0ddffb628c94c9d427826f54995bc9b3671 --- .../android/systemui/statusbar/phone/KeyguardBouncer.java | 6 +++--- .../statusbar/phone/StatusBarKeyguardViewManager.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index 21a22eccf509..d6f8a606af55 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -346,10 +346,10 @@ public class KeyguardBouncer { } /** - * {@link #show(boolean)} was called but we're not showing yet. + * {@link #show(boolean)} was called but we're not showing yet, or being dragged. */ - public boolean willShowSoon() { - return mShowingSoon; + public boolean inTransit() { + return mShowingSoon || mExpansion != EXPANSION_HIDDEN; } /** 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 20bc2a742de6..da85039039f2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -719,7 +719,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb * animation didn't finish yet. */ public boolean bouncerIsOrWillBeShowing() { - return mBouncer.isShowing() || mBouncer.willShowSoon(); + return mBouncer.isShowing() || mBouncer.inTransit(); } public boolean isFullscreenBouncer() { -- GitLab From 2b5140d3e02f75f7da87786f8bed0d989ff8e0f6 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Wed, 19 Jun 2019 15:50:09 -0700 Subject: [PATCH 302/620] Stop idmap2d after several seconds pass Idmap2d is continuously running despite invocations to generate idmaps being rare. This change stops the idmap daemon after 10 seconds without a transaction. Bug: 135149444 Test: manual verifications that idmaps are created and then service dies. Change-Id: I38a46e034d56777c15d1b3a5c86a9313ecaf0d4c --- .../com/android/server/om/IdmapDaemon.java | 193 ++++++++++++++++++ .../com/android/server/om/IdmapManager.java | 59 +----- .../server/om/OverlayManagerService.java | 1 + 3 files changed, 204 insertions(+), 49 deletions(-) create mode 100644 services/core/java/com/android/server/om/IdmapDaemon.java diff --git a/services/core/java/com/android/server/om/IdmapDaemon.java b/services/core/java/com/android/server/om/IdmapDaemon.java new file mode 100644 index 000000000000..55fbcb4344cf --- /dev/null +++ b/services/core/java/com/android/server/om/IdmapDaemon.java @@ -0,0 +1,193 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.om; + +import static android.content.Context.IDMAP_SERVICE; + +import static com.android.server.om.OverlayManagerService.DEBUG; +import static com.android.server.om.OverlayManagerService.TAG; + +import android.os.IBinder; +import android.os.IIdmap2; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.SystemProperties; +import android.util.Slog; + +import com.android.server.IoThread; + +import java.util.concurrent.FutureTask; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * To prevent idmap2d from continuously running, the idmap daemon will terminate after 10 + * seconds without a transaction. + **/ +class IdmapDaemon { + // The amount of time in milliseconds to wait after a transaction to the idmap service is made + // before stopping the service. + private static final int SERVICE_TIMEOUT_MS = 10000; + + // The amount of time in milliseconds to wait when attempting to connect to idmap service. + private static final int SERVICE_CONNECT_TIMEOUT_MS = 5000; + + private static final Object IDMAP_TOKEN = new Object(); + private static final String IDMAP_DAEMON = "idmap2d"; + + private static IdmapDaemon sInstance; + private volatile IIdmap2 mService; + private final AtomicInteger mOpenedCount = new AtomicInteger(); + + /** + * An {@link AutoCloseable} connection to the idmap service. When the connection is closed or + * finalized, the idmap service will be stopped after a period of time unless another connection + * to the service is open. + **/ + private class Connection implements AutoCloseable { + private boolean mOpened = true; + + private Connection() { + synchronized (IDMAP_TOKEN) { + mOpenedCount.incrementAndGet(); + } + } + + @Override + public void close() { + synchronized (IDMAP_TOKEN) { + if (!mOpened) { + return; + } + + mOpened = false; + if (mOpenedCount.decrementAndGet() != 0) { + // Only post the callback to stop the service if the service does not have an + // open connection. + return; + } + + IoThread.getHandler().postDelayed(() -> { + synchronized (IDMAP_TOKEN) { + // Only stop the service if the service does not have an open connection. + if (mService == null || mOpenedCount.get() != 0) { + return; + } + + stopIdmapService(); + mService = null; + } + }, IDMAP_TOKEN, SERVICE_TIMEOUT_MS); + } + } + } + + static IdmapDaemon getInstance() { + if (sInstance == null) { + sInstance = new IdmapDaemon(); + } + return sInstance; + } + + String createIdmap(String targetPath, String overlayPath, int policies, boolean enforce, + int userId) throws Exception { + try (Connection connection = connect()) { + return mService.createIdmap(targetPath, overlayPath, policies, enforce, userId); + } + } + + boolean removeIdmap(String overlayPath, int userId) throws Exception { + try (Connection connection = connect()) { + return mService.removeIdmap(overlayPath, userId); + } + } + + boolean verifyIdmap(String overlayPath, int policies, boolean enforce, int userId) + throws Exception { + try (Connection connection = connect()) { + return mService.verifyIdmap(overlayPath, policies, enforce, userId); + } + } + + String getIdmapPath(String overlayPath, int userId) throws Exception { + try (Connection connection = connect()) { + return mService.getIdmapPath(overlayPath, userId); + } + } + + static void startIdmapService() { + SystemProperties.set("ctl.start", IDMAP_DAEMON); + } + + static void stopIdmapService() { + SystemProperties.set("ctl.stop", IDMAP_DAEMON); + } + + private Connection connect() throws Exception { + synchronized (IDMAP_TOKEN) { + IoThread.getHandler().removeCallbacksAndMessages(IDMAP_TOKEN); + if (mService != null) { + // Not enough time has passed to stop the idmap service. Reuse the existing + // interface. + return new Connection(); + } + + // Start the idmap service if it is not currently running. + startIdmapService(); + + // Block until the service is found. + FutureTask bindIdmap = new FutureTask<>(() -> { + IBinder binder = null; + while (binder == null) { + try { + binder = ServiceManager.getService(IDMAP_SERVICE); + Thread.sleep(100); + } catch (Exception e) { + Slog.e(TAG, "service '" + IDMAP_SERVICE + "' not retrieved; " + + e.getMessage()); + } + } + return binder; + }); + + IBinder binder; + try { + IoThread.getHandler().postAtFrontOfQueue(bindIdmap); + binder = bindIdmap.get(SERVICE_CONNECT_TIMEOUT_MS, TimeUnit.MILLISECONDS); + } catch (Exception rethrow) { + Slog.e(TAG, "service '" + IDMAP_SERVICE + "' not found;"); + throw rethrow; + } + + try { + binder.linkToDeath(() -> { + Slog.w(TAG, "service '" + IDMAP_SERVICE + "' died"); + }, 0); + } catch (RemoteException rethrow) { + Slog.e(TAG, "service '" + IDMAP_SERVICE + "' failed to be bound"); + throw rethrow; + } + + mService = IIdmap2.Stub.asInterface(binder); + if (DEBUG) { + Slog.d(TAG, "service '" + IDMAP_SERVICE + "' connected"); + } + + return new Connection(); + } + } +} diff --git a/services/core/java/com/android/server/om/IdmapManager.java b/services/core/java/com/android/server/om/IdmapManager.java index b604aa87f8f3..9b6d986d90d2 100644 --- a/services/core/java/com/android/server/om/IdmapManager.java +++ b/services/core/java/com/android/server/om/IdmapManager.java @@ -16,9 +16,6 @@ package com.android.server.om; -import static android.content.Context.IDMAP_SERVICE; -import static android.text.format.DateUtils.SECOND_IN_MILLIS; - import static com.android.server.om.OverlayManagerService.DEBUG; import static com.android.server.om.OverlayManagerService.TAG; @@ -27,15 +24,11 @@ import android.content.om.OverlayInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.os.Build.VERSION_CODES; -import android.os.IBinder; import android.os.IIdmap2; -import android.os.RemoteException; -import android.os.ServiceManager; import android.os.SystemProperties; import android.os.UserHandle; import android.util.Slog; -import com.android.internal.os.BackgroundThread; import com.android.server.om.OverlayManagerServiceImpl.PackageManagerHelper; import com.android.server.pm.Installer; @@ -51,11 +44,6 @@ import java.io.File; */ class IdmapManager { private static final boolean FEATURE_FLAG_IDMAP2 = true; - - private final Installer mInstaller; - private final PackageManagerHelper mPackageManager; - private IIdmap2 mIdmap2Service; - private static final boolean VENDOR_IS_Q_OR_LATER; static { final String value = SystemProperties.get("ro.vndk.version", "29"); @@ -70,12 +58,14 @@ class IdmapManager { VENDOR_IS_Q_OR_LATER = isQOrLater; } + private final Installer mInstaller; + private final PackageManagerHelper mPackageManager; + private final IdmapDaemon mIdmapDaemon; + IdmapManager(final Installer installer, final PackageManagerHelper packageManager) { mInstaller = installer; mPackageManager = packageManager; - if (FEATURE_FLAG_IDMAP2) { - connectToIdmap2d(); - } + mIdmapDaemon = IdmapDaemon.getInstance(); } boolean createIdmap(@NonNull final PackageInfo targetPackage, @@ -91,11 +81,11 @@ class IdmapManager { if (FEATURE_FLAG_IDMAP2) { int policies = calculateFulfilledPolicies(targetPackage, overlayPackage, userId); boolean enforce = enforceOverlayable(overlayPackage); - if (mIdmap2Service.verifyIdmap(overlayPath, policies, enforce, userId)) { + if (mIdmapDaemon.verifyIdmap(overlayPath, policies, enforce, userId)) { return true; } - return mIdmap2Service.createIdmap(targetPath, overlayPath, policies, enforce, - userId) != null; + return mIdmapDaemon.createIdmap(targetPath, overlayPath, policies, + enforce, userId) != null; } else { mInstaller.idmap(targetPath, overlayPath, sharedGid); return true; @@ -113,7 +103,7 @@ class IdmapManager { } try { if (FEATURE_FLAG_IDMAP2) { - return mIdmap2Service.removeIdmap(oi.baseCodePath, userId); + return mIdmapDaemon.removeIdmap(oi.baseCodePath, userId); } else { mInstaller.removeIdmap(oi.baseCodePath); return true; @@ -137,7 +127,7 @@ class IdmapManager { final int userId) { if (FEATURE_FLAG_IDMAP2) { try { - return mIdmap2Service.getIdmapPath(overlayPackagePath, userId); + return mIdmapDaemon.getIdmapPath(overlayPackagePath, userId); } catch (Exception e) { Slog.w(TAG, "failed to get idmap path for " + overlayPackagePath + ": " + e.getMessage()); @@ -151,35 +141,6 @@ class IdmapManager { } } - private void connectToIdmap2d() { - IBinder binder = ServiceManager.getService(IDMAP_SERVICE); - if (binder != null) { - try { - binder.linkToDeath(new IBinder.DeathRecipient() { - @Override - public void binderDied() { - Slog.w(TAG, "service '" + IDMAP_SERVICE + "' died; reconnecting..."); - connectToIdmap2d(); - } - - }, 0); - } catch (RemoteException e) { - binder = null; - } - } - if (binder != null) { - mIdmap2Service = IIdmap2.Stub.asInterface(binder); - if (DEBUG) { - Slog.d(TAG, "service '" + IDMAP_SERVICE + "' connected"); - } - } else { - Slog.w(TAG, "service '" + IDMAP_SERVICE + "' not found; trying again..."); - BackgroundThread.getHandler().postDelayed(() -> { - connectToIdmap2d(); - }, SECOND_IN_MILLIS); - } - } - /** * Checks if overlayable and policies should be enforced on the specified overlay for backwards * compatibility with pre-Q overlays. diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java index da69986cd59f..ce951816d3a6 100644 --- a/services/core/java/com/android/server/om/OverlayManagerService.java +++ b/services/core/java/com/android/server/om/OverlayManagerService.java @@ -262,6 +262,7 @@ public final class OverlayManagerService extends SystemService { initIfNeeded(); onSwitchUser(UserHandle.USER_SYSTEM); + IdmapDaemon.stopIdmapService(); publishBinderService(Context.OVERLAY_SERVICE, mService); publishLocalService(OverlayManagerService.class, this); -- GitLab From 98288b3e0f8819020ad98f9cf49d4375c5e7db89 Mon Sep 17 00:00:00 2001 From: Beverly Date: Thu, 11 Jul 2019 10:13:43 -0400 Subject: [PATCH 303/620] Don't persist new night mode setting in car mode Keep persist.sys.theme in sync with the primary user's setting value UI_NIGHT_MODE Test: manual Fixes: 137174308 Change-Id: I8df67e0734b08bd82418e381d153d9012ecf99e4 (cherry picked from commit 47a775b67de77317f6ad357a9c4a3d88da846253) --- .../java/com/android/server/UiModeManagerService.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java index bc7da3fe2edc..30a356325ada 100644 --- a/services/core/java/com/android/server/UiModeManagerService.java +++ b/services/core/java/com/android/server/UiModeManagerService.java @@ -413,15 +413,15 @@ final class UiModeManagerService extends SystemService { try { synchronized (mLock) { if (mNightMode != mode) { - if (UserManager.get(getContext()).isPrimaryUser()) { - SystemProperties.set(SYSTEM_PROPERTY_DEVICE_THEME, - Integer.toString(mode)); - } - // Only persist setting if not in car mode if (!mCarModeEnabled) { Secure.putIntForUser(getContext().getContentResolver(), Secure.UI_NIGHT_MODE, mode, user); + + if (UserManager.get(getContext()).isPrimaryUser()) { + SystemProperties.set(SYSTEM_PROPERTY_DEVICE_THEME, + Integer.toString(mode)); + } } mNightMode = mode; -- GitLab From f5b03e09219076fc97b1a7fdf35709d6243682ec Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Fri, 12 Jul 2019 10:38:37 -0700 Subject: [PATCH 304/620] Adding method to check if a task is running in home stack Bug: 137197916 Test: Verified on Launcher Change-Id: I0260fa63e19bf7a22d81f44b56bd7e9818b19d16 --- .../systemui/shared/recents/model/Task.java | 14 +++++++++++++- .../shared/system/ActivityManagerWrapper.java | 10 ++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java index 5b9ee1c47e87..dcb134ec933e 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java @@ -20,6 +20,7 @@ import static android.view.Display.DEFAULT_DISPLAY; import android.app.ActivityManager; import android.app.ActivityManager.TaskDescription; +import android.app.TaskInfo; import android.content.ComponentName; import android.content.Intent; import android.content.pm.ActivityInfo; @@ -75,7 +76,7 @@ public class Task { private int mHashCode; - public TaskKey(ActivityManager.RecentTaskInfo t) { + public TaskKey(TaskInfo t) { ComponentName sourceComponent = t.origActivity != null // Activity alias if there is one ? t.origActivity @@ -226,6 +227,17 @@ public class Task { // Do nothing } + /** + * Creates a task object from the provided task info + */ + public static Task from(TaskKey taskKey, TaskInfo taskInfo, boolean isLocked) { + ActivityManager.TaskDescription td = taskInfo.taskDescription; + return new Task(taskKey, + td != null ? td.getPrimaryColor() : 0, + td != null ? td.getBackgroundColor() : 0, + taskInfo.supportsSplitScreenMultiWindow, isLocked, td, taskInfo.topActivity); + } + public Task(TaskKey key) { this.key = key; this.taskDescription = new TaskDescription(); diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java index 506813beadf6..328116dc3c1b 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java @@ -30,10 +30,12 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import android.annotation.NonNull; import android.app.ActivityManager; import android.app.ActivityManager.RecentTaskInfo; +import android.app.ActivityManager.RunningTaskInfo; import android.app.ActivityOptions; import android.app.ActivityTaskManager; import android.app.AppGlobals; import android.app.IAssistDataReceiver; +import android.app.WindowConfiguration; import android.app.WindowConfiguration.ActivityType; import android.content.ContentResolver; import android.content.Context; @@ -500,4 +502,12 @@ public class ActivityManagerWrapper { PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT) || freeformDevOption); } + + /** + * Returns true if the running task represents the home task + */ + public static boolean isHomeTask(RunningTaskInfo info) { + return info.configuration.windowConfiguration.getActivityType() + == WindowConfiguration.ACTIVITY_TYPE_HOME; + } } -- GitLab From 6a3d2565c3b06d90048bee1cf8e1347f9494a77d Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Fri, 12 Jul 2019 10:31:51 -0700 Subject: [PATCH 305/620] audioservice: fix hasMediaDynamicPolicy() for loopback and render policies Exclude mixes with LOOPBACK + RENDER flags when looking for dynamic policies matching media usage. As this is only used in the context of sending becoming noisy intent we want to send the intent when playback capture is active. Bug: 137055231 Test: enable live caption and disconnect headset while music is playing Change-Id: Ib3cd38f58c2ff78a2f2f13c5c22b637f9701e345 --- .../core/java/com/android/server/audio/AudioService.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 4b08db6be047..7e2dcae658af 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -5577,6 +5577,7 @@ public class AudioService extends IAudioService.Stub /** * @return true if there is currently a registered dynamic mixing policy that affects media + * and is not a render + loopback policy */ /*package*/ boolean hasMediaDynamicPolicy() { synchronized (mAudioPolicies) { @@ -5585,7 +5586,8 @@ public class AudioService extends IAudioService.Stub } final Collection appColl = mAudioPolicies.values(); for (AudioPolicyProxy app : appColl) { - if (app.hasMixAffectingUsage(AudioAttributes.USAGE_MEDIA)) { + if (app.hasMixAffectingUsage(AudioAttributes.USAGE_MEDIA, + AudioMix.ROUTE_FLAG_LOOP_BACK_RENDER)) { return true; } } @@ -7348,9 +7350,10 @@ public class AudioService extends IAudioService.Stub Binder.restoreCallingIdentity(identity); } - boolean hasMixAffectingUsage(int usage) { + boolean hasMixAffectingUsage(int usage, int excludedFlags) { for (AudioMix mix : mMixes) { - if (mix.isAffectingUsage(usage)) { + if (mix.isAffectingUsage(usage) + && ((mix.getRouteFlags() & excludedFlags) != excludedFlags)) { return true; } } -- GitLab From 052e40835932d17c7b965fdf723a7c112860c9a2 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 13 Jul 2019 19:20:53 -0700 Subject: [PATCH 306/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: Ia6e49e4d3b169b2023503fffc7104604463819a1 --- packages/SettingsLib/res/values-hi/arrays.xml | 16 ++++++++-------- packages/SettingsLib/res/values-hi/strings.xml | 2 +- packages/SettingsLib/res/values-ne/strings.xml | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml index 5ad9b0191c77..3d9a78e99204 100644 --- a/packages/SettingsLib/res/values-hi/arrays.xml +++ b/packages/SettingsLib/res/values-hi/arrays.xml @@ -76,7 +76,7 @@ "avrcp16" - "सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)" + "सिस्टम से चुने जाने का उपयोग करें (डिफ़ॉल्ट)" "SBC" "AAC" "Qualcomm® aptX™ ऑडियो" @@ -86,7 +86,7 @@ "वैकल्पिक कोडेक अक्षम करें" - "सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)" + "सिस्टम से चुने जाने का उपयोग करें (डिफ़ॉल्ट)" "SBC" "AAC" "Qualcomm® aptX™ ऑडियो" @@ -96,38 +96,38 @@ "वैकल्पिक कोडेक अक्षम करें" - "सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)" + "सिस्टम से चुने जाने का उपयोग करें (डिफ़ॉल्ट)" "44.1 kHz" "48.0 kHz" "88.2 kHz" "96.0 kHz" - "सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)" + "सिस्टम से चुने जाने का उपयोग करें (डिफ़ॉल्ट)" "44.1 kHz" "48.0 kHz" "88.2 kHz" "96.0 kHz" - "सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)" + "सिस्टम से चुने जाने का उपयोग करें (डिफ़ॉल्ट)" "16 बिट/नमूना" "24 बिट/नमूना" "32 बिट/नमूना" - "सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)" + "सिस्टम से चुने जाने का उपयोग करें (डिफ़ॉल्ट)" "16 बिट/नमूना" "24 बिट/नमूना" "32 बिट/नमूना" - "सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)" + "सिस्टम से चुने जाने का उपयोग करें (डिफ़ॉल्ट)" "मोनो" "स्टीरियो" - "सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)" + "सिस्टम चुनाव का उपयोग करें (डिफ़ॉल्ट)" "मोनो" "स्टीरियो" diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 5d512a84ef99..238eba58e0a5 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -361,7 +361,7 @@ "इस समय चल रही सेवाओं को देखें और नियंत्रित करें" "वेबव्यू लागू करें" "वेबव्यू सेट करें" - "यह चयन अब मान्य नहीं है. पुनः प्रयास करें." + "यह चुनाव अब मान्य नहीं है. दोबारा कोशिश करें." "फ़ाइल आधारित सुरक्षित करने के तरीके में बदलें" "रूपांतरित करें..." "फ़ाइल पहले से एन्क्रिप्ट की हुई है" diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index fd45cb0a1f3c..f1934c37369e 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -248,7 +248,7 @@ "ताररहित प्रदर्शन प्रमाणीकरणका लागि विकल्पहरू देखाउनुहोस्" "Wi-Fi लग स्तर बढाउनुहोस्, Wi-Fi चयनकर्तामा प्रति SSID RSSI देखाइन्छ" "ब्याट्रीको खपत कम गरी नेटवर्कको कार्यसम्पादनमा सुधार गर्दछ" - "मिटर गरिएको जडान भनी चिन्ह लगाइएको" + "सशुल्क वाइफाइ" "मिटर नगरिएको" "लगर बफर आकारहरू" "लग बफर प्रति लगर आकार चयन गर्नुहोस्" -- GitLab From aad988345aa213cfd70b687c26ecf337f45dc177 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Sun, 14 Jul 2019 13:23:24 +0900 Subject: [PATCH 307/620] Do not let device sleep after successful auth Retrying auth, or succeeding is a strong signal that the user is present. The device should not sleep, otherwise the keyguard will be dismissed (as it should) but not automatically locked, since screen timaeouts don't lock instantly. Test: Manual Fixes: 135967964 Change-Id: I9a8bcf0ddb80536719d093aab9e00c76d87ad24b --- .../src/com/android/keyguard/KeyguardSecurityContainer.java | 1 + .../systemui/statusbar/phone/BiometricUnlockController.java | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 69630c4e90e8..c7c648cd023f 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -237,6 +237,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe MIN_DRAG_SIZE, getResources().getDisplayMetrics()) && !mUpdateMonitor.isFaceDetectionRunning()) { mUpdateMonitor.requestFaceAuth(); + mCallback.userActivity(); showMessage(null, null); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 05d26b0a6a17..80e6bec1d417 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -260,6 +260,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { boolean unlockAllowed = mKeyguardBypassController.onBiometricAuthenticated( biometricSourceType); if (unlockAllowed) { + mKeyguardViewMediator.userActivity(); startWakeAndUnlock(biometricSourceType); } } -- GitLab From c49f55c51369a0b900dcdc601de2a92c63e2dd74 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 14 Jul 2019 01:13:46 -0700 Subject: [PATCH 308/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I166c16c2b9dc34c74780e41b1ac73612e79f46f7 --- packages/CarrierDefaultApp/res/values-in/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/CarrierDefaultApp/res/values-in/strings.xml b/packages/CarrierDefaultApp/res/values-in/strings.xml index 01a9c6041ed5..f48d31f56586 100644 --- a/packages/CarrierDefaultApp/res/values-in/strings.xml +++ b/packages/CarrierDefaultApp/res/values-in/strings.xml @@ -5,7 +5,7 @@ "Operator Seluler" "Data seluler telah habis" "Data seluler telah dinonaktifkan" - "Tap untuk membuka situs web %s" + "Ketuk untuk membuka situs web %s" "Hubungi penyedia layanan %s" "Tidak ada sambungan data seluler" "Tambahkan paket data atau roaming melalui %s" -- GitLab From d258871dcf47666bf31ac8ed7289823f06d98289 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 14 Jul 2019 01:31:37 -0700 Subject: [PATCH 309/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I424bc1a910c09f141985edcc4375202046ef50a4 --- packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml b/packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml index 96046ad5f3df..35de8ef46508 100644 --- a/packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml +++ b/packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml @@ -19,5 +19,5 @@ "Armazenamento externo" "Armazenamento local" "Armazenamento interno" - "Documentos" + "Docs" -- GitLab From 90c2227261c114ff7dfc4e290bfb37b339b64681 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 14 Jul 2019 07:40:31 -0700 Subject: [PATCH 310/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I382b136a55db6b38eb364f6f4934129b05411a53 --- packages/Shell/res/values-in/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/Shell/res/values-in/strings.xml b/packages/Shell/res/values-in/strings.xml index cf2ebe504c0f..5c5ba816e5d7 100644 --- a/packages/Shell/res/values-in/strings.xml +++ b/packages/Shell/res/values-in/strings.xml @@ -24,10 +24,10 @@ "Harap tunggu..." "Laporan bug akan segera muncul di ponsel" "Pilih untuk membagikan laporan bug Anda" - "Tap untuk membagikan laporan bug" + "Ketuk untuk membagikan laporan bug" "Pilih untuk membagikan laporan bug tanpa screenshot atau menunggu screenshot selesai" - "Tap untuk membagikan laporan bug tanpa screenshot atau menunggu screenshot selesai" - "Tap untuk membagikan laporan bug tanpa screenshot atau menunggu screenshot selesai" + "Ketuk untuk membagikan laporan bug tanpa screenshot atau menunggu screenshot selesai" + "Ketuk untuk membagikan laporan bug tanpa screenshot atau menunggu screenshot selesai" "Laporan bug berisi data dari berbagai file log sistem, yang mungkin mencakup data yang dianggap sensitif (seperti data penggunaan aplikasi dan lokasi). Hanya bagikan laporan bug dengan aplikasi dan orang yang Anda percaya." "Jangan tampilkan lagi" "Laporan bug" -- GitLab From c040a9f941d6c0c8d7f2763f4a861e8b316f87da Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 14 Jul 2019 10:13:06 -0700 Subject: [PATCH 311/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: Ib19f01fa0ff2376e7db5168cc45d5da4321b28d8 --- packages/SystemUI/legacy/recents/res/values-fr/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-bs/strings.xml | 6 +++--- packages/SystemUI/res-keyguard/values-sq/strings.xml | 2 +- packages/SystemUI/res/values-en-rAU/strings.xml | 2 +- packages/SystemUI/res/values-en-rCA/strings.xml | 2 +- packages/SystemUI/res/values-en-rGB/strings.xml | 2 +- packages/SystemUI/res/values-en-rIN/strings.xml | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/SystemUI/legacy/recents/res/values-fr/strings.xml b/packages/SystemUI/legacy/recents/res/values-fr/strings.xml index 183b6beba76b..5b0d611c2588 100644 --- a/packages/SystemUI/legacy/recents/res/values-fr/strings.xml +++ b/packages/SystemUI/legacy/recents/res/values-fr/strings.xml @@ -32,7 +32,7 @@ "rechercher" "Impossible de lancer l\'application %s." "L\'application %s est désactivée en mode sécurisé." - "Tout effacer" + "Tout fermer" "Faire glisser ici pour utiliser l\'écran partagé" "Séparation horizontale" "Séparation verticale" diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml index 40e52706aa01..2a8871140f4f 100644 --- a/packages/SystemUI/res-keyguard/values-bs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml @@ -22,7 +22,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Zaključavanje tastature" "Upišite PIN" - "Upišite PUK kôd za SIM karticu i novi PIN" + "Upišite PUK za SIM i novi PIN kôd" "PUK kôd za SIM karticu" "Novi PIN za SIM karticu" "Dodirnite da upišete lozinku" @@ -54,7 +54,7 @@ "Prostor za PIN" "Lozinka uređaja" "Prostor za PIN za SIM karticu" - "Prostor za PUK kôd za SIM karticu" + "Prostor za PUK za SIM" "Naredni alarm je podešen za %1$s" "Izbriši" "Onemogući eSIM karticu" @@ -116,7 +116,7 @@ PUK kôd za SIM karticu je netačan. Imate još %d pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. "Korištenje PIN-a za SIM karticu nije uspjelo!" - "Korištenje PUK koda za SIM karticu nije uspjelo!" + "Korištenje PUK-a za SIM nije uspjelo!" "Kôd je prihvaćen" "Nema mreže." "Promjena načina unosa" diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml index 82fefeab03ec..80e68bc934e7 100644 --- a/packages/SystemUI/res-keyguard/values-sq/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml @@ -38,7 +38,7 @@ "%s • Po karikohet" "%s • Po karikohet me shpejtësi" "%s • Po karikohet ngadalë" - "Lidh ngarkuesin." + "Lidh karikuesin." "Shtyp \"Meny\" për të shkyçur." "Rrjeti është i kyçur" "Nuk ka kartë SIM" diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 41d3aeaea78a..d184a33a5fa6 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -400,7 +400,7 @@ "Less urgent notifications below" "Tap again to open" "Swipe up to unlock" - "This device is managed by your organization" + "This device is managed by your organisation" "This device is managed by %s" "Swipe from icon for phone" "Swipe from icon for voice assist" diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 5364da5928a7..3bfca58f7ef0 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -400,7 +400,7 @@ "Less urgent notifications below" "Tap again to open" "Swipe up to unlock" - "This device is managed by your organization" + "This device is managed by your organisation" "This device is managed by %s" "Swipe from icon for phone" "Swipe from icon for voice assist" diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 41d3aeaea78a..d184a33a5fa6 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -400,7 +400,7 @@ "Less urgent notifications below" "Tap again to open" "Swipe up to unlock" - "This device is managed by your organization" + "This device is managed by your organisation" "This device is managed by %s" "Swipe from icon for phone" "Swipe from icon for voice assist" diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 41d3aeaea78a..d184a33a5fa6 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -400,7 +400,7 @@ "Less urgent notifications below" "Tap again to open" "Swipe up to unlock" - "This device is managed by your organization" + "This device is managed by your organisation" "This device is managed by %s" "Swipe from icon for phone" "Swipe from icon for voice assist" -- GitLab From d46d543e997e4691652f6e94433b67f0d9e04fdd Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 14 Jul 2019 12:09:37 -0700 Subject: [PATCH 312/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I4d6b4d43d9fa21ba8f799ae34650439dc5498acb --- packages/CarrierDefaultApp/res/values-in/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/CarrierDefaultApp/res/values-in/strings.xml b/packages/CarrierDefaultApp/res/values-in/strings.xml index 01a9c6041ed5..f48d31f56586 100644 --- a/packages/CarrierDefaultApp/res/values-in/strings.xml +++ b/packages/CarrierDefaultApp/res/values-in/strings.xml @@ -5,7 +5,7 @@ "Operator Seluler" "Data seluler telah habis" "Data seluler telah dinonaktifkan" - "Tap untuk membuka situs web %s" + "Ketuk untuk membuka situs web %s" "Hubungi penyedia layanan %s" "Tidak ada sambungan data seluler" "Tambahkan paket data atau roaming melalui %s" -- GitLab From 4c877e4dd25e5b76b361bbfd365a068d1be25f6c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 14 Jul 2019 12:29:36 -0700 Subject: [PATCH 313/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I64618ec898312471b12a7ce6cfba0d5668a7c1af --- packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml b/packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml index 96046ad5f3df..35de8ef46508 100644 --- a/packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml +++ b/packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml @@ -19,5 +19,5 @@ "Armazenamento externo" "Armazenamento local" "Armazenamento interno" - "Documentos" + "Docs" -- GitLab From 30b4642488c4891cee4cdcb94cd9ea8feb784949 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 14 Jul 2019 19:25:52 -0700 Subject: [PATCH 314/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I55ae03d482913f3d4fb8911853bcc882181ef7f9 --- packages/Shell/res/values-in/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/Shell/res/values-in/strings.xml b/packages/Shell/res/values-in/strings.xml index cf2ebe504c0f..5c5ba816e5d7 100644 --- a/packages/Shell/res/values-in/strings.xml +++ b/packages/Shell/res/values-in/strings.xml @@ -24,10 +24,10 @@ "Harap tunggu..." "Laporan bug akan segera muncul di ponsel" "Pilih untuk membagikan laporan bug Anda" - "Tap untuk membagikan laporan bug" + "Ketuk untuk membagikan laporan bug" "Pilih untuk membagikan laporan bug tanpa screenshot atau menunggu screenshot selesai" - "Tap untuk membagikan laporan bug tanpa screenshot atau menunggu screenshot selesai" - "Tap untuk membagikan laporan bug tanpa screenshot atau menunggu screenshot selesai" + "Ketuk untuk membagikan laporan bug tanpa screenshot atau menunggu screenshot selesai" + "Ketuk untuk membagikan laporan bug tanpa screenshot atau menunggu screenshot selesai" "Laporan bug berisi data dari berbagai file log sistem, yang mungkin mencakup data yang dianggap sensitif (seperti data penggunaan aplikasi dan lokasi). Hanya bagikan laporan bug dengan aplikasi dan orang yang Anda percaya." "Jangan tampilkan lagi" "Laporan bug" -- GitLab From 709816baccbbc580019cce04114062f4d28addb6 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 14 Jul 2019 19:49:17 -0700 Subject: [PATCH 315/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: Iead3ad19af56e9a6e2fef89a946b5f69c4b4674c --- packages/SettingsLib/res/values-hi/arrays.xml | 16 ++++++++-------- packages/SettingsLib/res/values-hi/strings.xml | 2 +- packages/SettingsLib/res/values-ne/strings.xml | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml index 5ad9b0191c77..3d9a78e99204 100644 --- a/packages/SettingsLib/res/values-hi/arrays.xml +++ b/packages/SettingsLib/res/values-hi/arrays.xml @@ -76,7 +76,7 @@ "avrcp16" - "सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)" + "सिस्टम से चुने जाने का उपयोग करें (डिफ़ॉल्ट)" "SBC" "AAC" "Qualcomm® aptX™ ऑडियो" @@ -86,7 +86,7 @@ "वैकल्पिक कोडेक अक्षम करें" - "सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)" + "सिस्टम से चुने जाने का उपयोग करें (डिफ़ॉल्ट)" "SBC" "AAC" "Qualcomm® aptX™ ऑडियो" @@ -96,38 +96,38 @@ "वैकल्पिक कोडेक अक्षम करें" - "सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)" + "सिस्टम से चुने जाने का उपयोग करें (डिफ़ॉल्ट)" "44.1 kHz" "48.0 kHz" "88.2 kHz" "96.0 kHz" - "सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)" + "सिस्टम से चुने जाने का उपयोग करें (डिफ़ॉल्ट)" "44.1 kHz" "48.0 kHz" "88.2 kHz" "96.0 kHz" - "सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)" + "सिस्टम से चुने जाने का उपयोग करें (डिफ़ॉल्ट)" "16 बिट/नमूना" "24 बिट/नमूना" "32 बिट/नमूना" - "सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)" + "सिस्टम से चुने जाने का उपयोग करें (डिफ़ॉल्ट)" "16 बिट/नमूना" "24 बिट/नमूना" "32 बिट/नमूना" - "सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)" + "सिस्टम से चुने जाने का उपयोग करें (डिफ़ॉल्ट)" "मोनो" "स्टीरियो" - "सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)" + "सिस्टम चुनाव का उपयोग करें (डिफ़ॉल्ट)" "मोनो" "स्टीरियो" diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 5d512a84ef99..238eba58e0a5 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -361,7 +361,7 @@ "इस समय चल रही सेवाओं को देखें और नियंत्रित करें" "वेबव्यू लागू करें" "वेबव्यू सेट करें" - "यह चयन अब मान्य नहीं है. पुनः प्रयास करें." + "यह चुनाव अब मान्य नहीं है. दोबारा कोशिश करें." "फ़ाइल आधारित सुरक्षित करने के तरीके में बदलें" "रूपांतरित करें..." "फ़ाइल पहले से एन्क्रिप्ट की हुई है" diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index fd45cb0a1f3c..f1934c37369e 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -248,7 +248,7 @@ "ताररहित प्रदर्शन प्रमाणीकरणका लागि विकल्पहरू देखाउनुहोस्" "Wi-Fi लग स्तर बढाउनुहोस्, Wi-Fi चयनकर्तामा प्रति SSID RSSI देखाइन्छ" "ब्याट्रीको खपत कम गरी नेटवर्कको कार्यसम्पादनमा सुधार गर्दछ" - "मिटर गरिएको जडान भनी चिन्ह लगाइएको" + "सशुल्क वाइफाइ" "मिटर नगरिएको" "लगर बफर आकारहरू" "लग बफर प्रति लगर आकार चयन गर्नुहोस्" -- GitLab From f19e9123facad0b97b8b981e87eb53b5da3b079f Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 14 Jul 2019 22:13:49 -0700 Subject: [PATCH 316/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I43773e15dc0c3d572b791e1ee7aae6353b918f5d --- packages/SystemUI/res/values-en-rAU/strings.xml | 2 +- packages/SystemUI/res/values-en-rCA/strings.xml | 2 +- packages/SystemUI/res/values-en-rGB/strings.xml | 2 +- packages/SystemUI/res/values-en-rIN/strings.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 82252ba862a2..dc661dd14a4e 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -401,7 +401,7 @@ "Less urgent notifications below" "Tap again to open" "Swipe up to open" - "This device is managed by your organization" + "This device is managed by your organisation" "This device is managed by %s" "Swipe from icon for phone" "Swipe from icon for voice assist" diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index ca9e29aed15f..9903cc04e97a 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -401,7 +401,7 @@ "Less urgent notifications below" "Tap again to open" "Swipe up to open" - "This device is managed by your organization" + "This device is managed by your organisation" "This device is managed by %s" "Swipe from icon for phone" "Swipe from icon for voice assist" diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 82252ba862a2..dc661dd14a4e 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -401,7 +401,7 @@ "Less urgent notifications below" "Tap again to open" "Swipe up to open" - "This device is managed by your organization" + "This device is managed by your organisation" "This device is managed by %s" "Swipe from icon for phone" "Swipe from icon for voice assist" diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 82252ba862a2..dc661dd14a4e 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -401,7 +401,7 @@ "Less urgent notifications below" "Tap again to open" "Swipe up to open" - "This device is managed by your organization" + "This device is managed by your organisation" "This device is managed by %s" "Swipe from icon for phone" "Swipe from icon for voice assist" -- GitLab From 5af40871ea49c0aa57fb0228daed80ecb8094652 Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Mon, 15 Jul 2019 12:05:54 +0200 Subject: [PATCH 317/620] AM: make isHighEndGfx TestApi Bug: 136784434 Test: n/a Change-Id: Ie26de8dcf64a02b7757d4f705485cdcb7470f511 --- api/test-current.txt | 1 + core/java/android/app/ActivityManager.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/api/test-current.txt b/api/test-current.txt index 6f0b6a809c9c..cb3674ba6706 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -54,6 +54,7 @@ package android.app { method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getPackageImportance(String); method public long getTotalRam(); method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getUidImportance(int); + method public static boolean isHighEndGfx(); method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener); method public static void resumeAppSwitches() throws android.os.RemoteException; method @RequiresPermission(android.Manifest.permission.CHANGE_CONFIGURATION) public void scheduleApplicationInfoChanged(java.util.List, int); diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 17368b789645..91b98c71a613 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -925,7 +925,7 @@ public class ActivityManager { * (which tends to consume a lot more RAM). * @hide */ - @UnsupportedAppUsage + @TestApi static public boolean isHighEndGfx() { return !isLowRamDeviceStatic() && !RoSystemProperties.CONFIG_AVOID_GFX_ACCEL -- GitLab From 62a81ab99a121ed2017b102b3802598b19ab712a Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Fri, 12 Jul 2019 18:19:27 -0700 Subject: [PATCH 318/620] audioservice: re send BT_SCO parameter to HAL when audioserver restarts Fix omission in AudioDeviceBroker.onAudioServerDied() where parameter "BT_SCO=on|off" must be send to HAL according to current forced usage for communication. Bug: 135512789 Test: killaudio server during call over BT SCO Change-Id: I1039748db5591321869f70c3dc589fbc62d41c31 --- .../core/java/com/android/server/audio/AudioDeviceBroker.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java index 884ecbaac058..350df11621e6 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java +++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java @@ -123,6 +123,8 @@ import com.android.internal.annotations.GuardedBy; /*package*/ void onAudioServerDied() { // Restore forced usage for communications and record synchronized (mDeviceStateLock) { + AudioSystem.setParameters( + "BT_SCO=" + (mForcedUseForComm == AudioSystem.FORCE_BT_SCO ? "on" : "off")); onSetForceUse(AudioSystem.FOR_COMMUNICATION, mForcedUseForComm, "onAudioServerDied"); onSetForceUse(AudioSystem.FOR_RECORD, mForcedUseForComm, "onAudioServerDied"); } -- GitLab From 89920d8ba21ff719d1ba4c29e9b0205fff829eb0 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Fri, 21 Jun 2019 11:39:28 -0700 Subject: [PATCH 319/620] WiredAccessoryManager: fix connected state logic for Extcon Bug: 134120683 Test: make Change-Id: I618031968a4131ee153994deca55d192cbc598b3 (cherry picked from commit a1f05cc479a73f991793ff587119b3e56daf2c5c) --- .../android/server/WiredAccessoryManager.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/WiredAccessoryManager.java b/services/core/java/com/android/server/WiredAccessoryManager.java index 9bbc3158757c..8e5c73bfc022 100644 --- a/services/core/java/com/android/server/WiredAccessoryManager.java +++ b/services/core/java/com/android/server/WiredAccessoryManager.java @@ -16,33 +16,33 @@ package com.android.server; +import static com.android.server.input.InputManagerService.SW_HEADPHONE_INSERT; +import static com.android.server.input.InputManagerService.SW_HEADPHONE_INSERT_BIT; +import static com.android.server.input.InputManagerService.SW_LINEOUT_INSERT; +import static com.android.server.input.InputManagerService.SW_LINEOUT_INSERT_BIT; +import static com.android.server.input.InputManagerService.SW_MICROPHONE_INSERT; +import static com.android.server.input.InputManagerService.SW_MICROPHONE_INSERT_BIT; + import android.content.Context; +import android.media.AudioManager; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.os.UEventObserver; +import android.util.Log; import android.util.Pair; import android.util.Slog; -import android.media.AudioManager; -import android.util.Log; import android.view.InputDevice; import com.android.internal.R; import com.android.server.input.InputManagerService; import com.android.server.input.InputManagerService.WiredAccessoryCallbacks; -import static com.android.server.input.InputManagerService.SW_HEADPHONE_INSERT; -import static com.android.server.input.InputManagerService.SW_MICROPHONE_INSERT; -import static com.android.server.input.InputManagerService.SW_LINEOUT_INSERT; -import static com.android.server.input.InputManagerService.SW_HEADPHONE_INSERT_BIT; -import static com.android.server.input.InputManagerService.SW_MICROPHONE_INSERT_BIT; -import static com.android.server.input.InputManagerService.SW_LINEOUT_INSERT_BIT; - import java.io.File; -import java.io.FileReader; import java.io.FileNotFoundException; +import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -538,7 +538,7 @@ final class WiredAccessoryManager implements WiredAccessoryCallbacks { synchronized (mLock) { int mask = maskAndState.first; int state = maskAndState.second; - updateLocked(name, mHeadsetState | (mask & state) & ~(mask & ~state)); + updateLocked(name, mHeadsetState & ~(mask & ~state) | (mask & state)); return; } } -- GitLab From bc841b029311400ef2602bafe9b3776310d5e8a7 Mon Sep 17 00:00:00 2001 From: Long Ling Date: Wed, 3 Jul 2019 16:43:15 -0700 Subject: [PATCH 320/620] 60hz only when ambient or display brightness is low Due to hardware limitation, flickers are seen when switching between 60 and 90hz at low display and ambient brightness. Force the display to stay at 60hz when ambient and display brightness are low. Bug: 136461712 Exempt-From-Owner-Approval: Santos is designated by Michael Change-Id: I931288c46fc658e25b25249a160904b3e2dcfb94 --- core/res/res/values/config.xml | 23 +- core/res/res/values/symbols.xml | 3 +- .../server/display/DisplayManagerService.java | 5 +- .../server/display/DisplayModeDirector.java | 291 ++++++++++++++++-- .../display/whitebalance/AmbientFilter.java | 5 +- .../DisplayWhiteBalanceFactory.java | 4 +- 6 files changed, 290 insertions(+), 41 deletions(-) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index e44c5f720a97..76d252e3e649 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4129,8 +4129,27 @@ for higher refresh rates to be automatically used out of the box --> 60 - - -1 + + + + + + + diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index e19d16970506..2791e1cbd363 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3788,7 +3788,8 @@ - + + diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 99341d1c96ae..4f33ebb035da 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -303,6 +303,8 @@ public final class DisplayManagerService extends SystemService { private final Spline mMinimumBrightnessSpline; private final ColorSpace mWideColorSpace; + private SensorManager mSensorManager; + public DisplayManagerService(Context context) { this(context, new Injector()); } @@ -430,7 +432,7 @@ public final class DisplayManagerService extends SystemService { } mDisplayModeDirector.setListener(new AllowedDisplayModeObserver()); - mDisplayModeDirector.start(); + mDisplayModeDirector.start(mSensorManager); mHandler.sendEmptyMessage(MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS); } @@ -2358,6 +2360,7 @@ public final class DisplayManagerService extends SystemService { }; mDisplayPowerController = new DisplayPowerController( mContext, callbacks, handler, sensorManager, blanker); + mSensorManager = sensorManager; } mHandler.sendEmptyMessage(MSG_LOAD_BRIGHTNESS_CONFIGURATION); diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 14bd2d8150da..78a48dac6fb5 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -18,26 +18,41 @@ package com.android.server.display; import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.res.Resources; import android.database.ContentObserver; import android.hardware.display.DisplayManager; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; + import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.UserHandle; +import android.os.PowerManager; +import android.os.SystemClock; import android.provider.Settings; +import android.text.TextUtils; import android.util.Slog; import android.util.SparseArray; import android.view.Display; import android.view.DisplayInfo; import com.android.internal.R; +import com.android.server.display.whitebalance.DisplayWhiteBalanceFactory; +import com.android.server.display.whitebalance.AmbientFilter; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Objects; /** @@ -74,7 +89,7 @@ public class DisplayModeDirector { private final AppRequestObserver mAppRequestObserver; private final SettingsObserver mSettingsObserver; private final DisplayObserver mDisplayObserver; - + private final BrightnessObserver mBrightnessObserver; private Listener mListener; @@ -87,6 +102,8 @@ public class DisplayModeDirector { mAppRequestObserver = new AppRequestObserver(); mSettingsObserver = new SettingsObserver(context, handler); mDisplayObserver = new DisplayObserver(context, handler); + mBrightnessObserver = new BrightnessObserver(context, handler); + } /** @@ -96,15 +113,17 @@ public class DisplayModeDirector { * This has to be deferred because the object may be constructed before the rest of the system * is ready. */ - public void start() { + public void start(SensorManager sensorManager) { mSettingsObserver.observe(); mDisplayObserver.observe(); mSettingsObserver.observe(); + mBrightnessObserver.observe(sensorManager); synchronized (mLock) { // We may have a listener already registered before the call to start, so go ahead and // notify them to pick up our newly initialized state. notifyAllowedModesChangedLocked(); } + } /** @@ -315,6 +334,7 @@ public class DisplayModeDirector { } mSettingsObserver.dumpLocked(pw); mAppRequestObserver.dumpLocked(pw); + mBrightnessObserver.dumpLocked(pw); } } @@ -486,20 +506,15 @@ public class DisplayModeDirector { Settings.System.getUriFor(Settings.System.PEAK_REFRESH_RATE); private final Uri mLowPowerModeSetting = Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE); - private final Uri mBrightnessSetting = - Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS); private final Context mContext; private final float mDefaultPeakRefreshRate; - private final int mBrightnessThreshold; SettingsObserver(@NonNull Context context, @NonNull Handler handler) { super(handler); mContext = context; mDefaultPeakRefreshRate = (float) context.getResources().getInteger( R.integer.config_defaultPeakRefreshRate); - mBrightnessThreshold = context.getResources().getInteger( - R.integer.config_brightnessThresholdOfPeakRefreshRate); } public void observe() { @@ -508,14 +523,9 @@ public class DisplayModeDirector { UserHandle.USER_SYSTEM); cr.registerContentObserver(mLowPowerModeSetting, false /*notifyDescendants*/, this, UserHandle.USER_SYSTEM); - if (mBrightnessThreshold >= 0) { - cr.registerContentObserver(mBrightnessSetting, false /*notifyDescendants*/, this, - UserHandle.USER_SYSTEM); - } synchronized (mLock) { updateRefreshRateSettingLocked(); updateLowPowerModeSettingLocked(); - updateBrightnessSettingLocked(); } } @@ -526,8 +536,6 @@ public class DisplayModeDirector { updateRefreshRateSettingLocked(); } else if (mLowPowerModeSetting.equals(uri)) { updateLowPowerModeSettingLocked(); - } else if (mBrightnessThreshold >=0 && mBrightnessSetting.equals(uri)) { - updateBrightnessSettingLocked(); } } } @@ -542,6 +550,7 @@ public class DisplayModeDirector { vote = null; } updateVoteLocked(Vote.PRIORITY_LOW_POWER_MODE, vote); + mBrightnessObserver.onLowPowerModeEnabled(inLowPowerMode); } private void updateRefreshRateSettingLocked() { @@ -549,23 +558,7 @@ public class DisplayModeDirector { Settings.System.PEAK_REFRESH_RATE, mDefaultPeakRefreshRate); Vote vote = Vote.forRefreshRates(0f, peakRefreshRate); updateVoteLocked(Vote.PRIORITY_USER_SETTING_REFRESH_RATE, vote); - } - - private void updateBrightnessSettingLocked() { - int brightness = Settings.System.getInt(mContext.getContentResolver(), - Settings.System.SCREEN_BRIGHTNESS, -1); - - if (brightness < 0) { - return; - } - - final Vote vote; - if (brightness <= mBrightnessThreshold) { - vote = Vote.forRefreshRates(0f, 60f); - } else { - vote = null; - } - updateVoteLocked(Vote.PRIORITY_LOW_BRIGHTNESS, vote); + mBrightnessObserver.onPeakRefreshRateEnabled(peakRefreshRate > 60f); } public void dumpLocked(PrintWriter pw) { @@ -715,4 +708,240 @@ public class DisplayModeDirector { } } } + + /** + * This class manages brightness threshold for switching between 60 hz and higher refresh rate. + * See more information at the definition of + * {@link R.array#config_brightnessThresholdsOfPeakRefreshRate} and + * {@link R.array#config_ambientThresholdsOfPeakRefreshRate}. + */ + private class BrightnessObserver extends ContentObserver { + private final Uri mDisplayBrightnessSetting = + Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS); + + private final static int LIGHT_SENSOR_RATE_MS = 250; + private final int[] mDisplayBrightnessThresholds; + private final int[] mAmbientBrightnessThresholds; + // valid threshold if any item from the array >= 0 + private boolean mShouldObserveDisplayChange; + private boolean mShouldObserveAmbientChange; + + private SensorManager mSensorManager; + private Sensor mLightSensor; + // Take it as low brightness before valid sensor data comes + private float mAmbientLux = -1.0f; + private AmbientFilter mAmbientFilter; + + private final Context mContext; + private ScreenStateReceiver mScreenStateReceiver; + + // Enable light sensor only when screen is on, peak refresh rate enabled and low power mode + // off. After initialization, these states will be updated from the same handler thread. + private boolean mScreenOn = false; + private boolean mPeakRefreshRateEnabled = false; + private boolean mLowPowerModeEnabled = false; + + BrightnessObserver(Context context, Handler handler) { + super(handler); + mContext = context; + mDisplayBrightnessThresholds = context.getResources().getIntArray( + R.array.config_brightnessThresholdsOfPeakRefreshRate); + mAmbientBrightnessThresholds = context.getResources().getIntArray( + R.array.config_ambientThresholdsOfPeakRefreshRate); + if (mDisplayBrightnessThresholds.length != mAmbientBrightnessThresholds.length) { + throw new RuntimeException("display brightness threshold array and ambient " + + "brightness threshold array have different length"); + } + + mShouldObserveDisplayChange = checkShouldObserve(mDisplayBrightnessThresholds); + mShouldObserveAmbientChange = checkShouldObserve(mAmbientBrightnessThresholds); + } + + public void observe(SensorManager sensorManager) { + if (mShouldObserveDisplayChange) { + final ContentResolver cr = mContext.getContentResolver(); + cr.registerContentObserver(mDisplayBrightnessSetting, + false /*notifyDescendants*/, this, UserHandle.USER_SYSTEM); + } + + if (mShouldObserveAmbientChange) { + Resources resources = mContext.getResources(); + String lightSensorType = resources.getString( + com.android.internal.R.string.config_displayLightSensorType); + + Sensor lightSensor = null; + if (!TextUtils.isEmpty(lightSensorType)) { + List sensors = sensorManager.getSensorList(Sensor.TYPE_ALL); + for (int i = 0; i < sensors.size(); i++) { + Sensor sensor = sensors.get(i); + if (lightSensorType.equals(sensor.getStringType())) { + lightSensor = sensor; + break; + } + } + } + + if (lightSensor == null) { + lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); + } + + if (lightSensor != null) { + final Resources res = mContext.getResources(); + + mAmbientFilter = DisplayWhiteBalanceFactory.createBrightnessFilter(res); + mSensorManager = sensorManager; + mLightSensor = lightSensor; + + // Intent.ACTION_SCREEN_ON is not sticky. Check current screen status. + if (mContext.getSystemService(PowerManager.class).isInteractive()) { + onScreenOn(true); + } + mScreenStateReceiver = new ScreenStateReceiver(mContext); + } + } + + if (mShouldObserveDisplayChange || mShouldObserveAmbientChange) { + synchronized (mLock) { + onBrightnessChangedLocked(); + } + } + } + + public void onPeakRefreshRateEnabled(boolean b) { + if (mShouldObserveAmbientChange && mPeakRefreshRateEnabled != b) { + mPeakRefreshRateEnabled = b; + updateSensorStatus(); + } + } + + public void onLowPowerModeEnabled(boolean b) { + if (mShouldObserveAmbientChange && mLowPowerModeEnabled != b) { + mLowPowerModeEnabled = b; + updateSensorStatus(); + } + } + + public void dumpLocked(PrintWriter pw) { + pw.println(" BrightnessObserver"); + + for (int d: mDisplayBrightnessThresholds) { + pw.println(" mDisplayBrightnessThreshold: " + d); + } + + for (int d: mAmbientBrightnessThresholds) { + pw.println(" mAmbientBrightnessThreshold: " + d); + } + } + + @Override + public void onChange(boolean selfChange, Uri uri, int userId) { + synchronized (mLock) { + onBrightnessChangedLocked(); + } + } + + /** + * Checks to see if at least one value is positive, in which case it is necessary to listen + * to value changes. + */ + private boolean checkShouldObserve(int[] a) { + for (int d: a) { + if (d >= 0) { + return true; + } + } + + return false; + } + + private void onBrightnessChangedLocked() { + int brightness = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS, -1); + + Vote vote = null; + for (int i = 0; i < mDisplayBrightnessThresholds.length; i++) { + int disp = mDisplayBrightnessThresholds[i]; + int ambi = mAmbientBrightnessThresholds[i]; + + if (disp >= 0 && ambi >= 0) { + if (brightness <= disp && mAmbientLux <= ambi) { + vote = Vote.forRefreshRates(0f, 60f); + } + } else if (disp >= 0) { + if (brightness <= disp) { + vote = Vote.forRefreshRates(0f, 60f); + } + } else if (ambi >= 0) { + if (mAmbientLux <= ambi) { + vote = Vote.forRefreshRates(0f, 60f); + } + } + + if (vote != null) { + break; + } + } + + if (DEBUG) { + Slog.d(TAG, "Display brightness " + brightness + ", ambient lux " + mAmbientLux + + (vote != null ? " 60hz only" : " no refresh rate limit")); + } + updateVoteLocked(Vote.PRIORITY_LOW_BRIGHTNESS, vote); + } + + private void onScreenOn(boolean on) { + // Not check mShouldObserveAmbientChange because Screen status receiver is registered + // only when it is true. + if (mScreenOn != on) { + mScreenOn = on; + updateSensorStatus(); + } + } + + private void updateSensorStatus() { + if (mSensorManager == null || mLightSensorListener == null) { + return; + } + + if (mScreenOn && !mLowPowerModeEnabled && mPeakRefreshRateEnabled) { + mSensorManager.registerListener(mLightSensorListener, + mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler); + } else { + mSensorManager.unregisterListener(mLightSensorListener); + } + } + + private final SensorEventListener mLightSensorListener = new SensorEventListener() { + @Override + public void onSensorChanged(SensorEvent event) { + long now = SystemClock.uptimeMillis(); + mAmbientFilter.addValue(now, event.values[0]); + mAmbientLux = mAmbientFilter.getEstimate(now); + + synchronized (mLock) { + onBrightnessChangedLocked(); + } + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + // Not used. + } + }; + + private final class ScreenStateReceiver extends BroadcastReceiver { + public ScreenStateReceiver(Context context) { + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_SCREEN_OFF); + filter.addAction(Intent.ACTION_SCREEN_ON); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + context.registerReceiver(this, filter, null, mHandler); + } + + @Override + public void onReceive(Context context, Intent intent) { + onScreenOn(Intent.ACTION_SCREEN_ON.equals(intent.getAction())); + } + } + } } diff --git a/services/core/java/com/android/server/display/whitebalance/AmbientFilter.java b/services/core/java/com/android/server/display/whitebalance/AmbientFilter.java index 123cd73a3ff3..35808974b9e4 100644 --- a/services/core/java/com/android/server/display/whitebalance/AmbientFilter.java +++ b/services/core/java/com/android/server/display/whitebalance/AmbientFilter.java @@ -36,7 +36,7 @@ import java.util.Arrays; * - {@link WeightedMovingAverageAmbientFilter} * A weighted average prioritising recent changes. */ -abstract class AmbientFilter { +abstract public class AmbientFilter { protected static final boolean DEBUG = false; // Enable for verbose logs. @@ -156,8 +156,7 @@ abstract class AmbientFilter { /** * A weighted average prioritising recent changes. */ - @VisibleForTesting - public static class WeightedMovingAverageAmbientFilter extends AmbientFilter { + static class WeightedMovingAverageAmbientFilter extends AmbientFilter { // How long the latest ambient value change is predicted to last. private static final int PREDICTION_TIME = 100; // Milliseconds diff --git a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java index 4df7d6b14f25..bf0a1d16219d 100644 --- a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java +++ b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java @@ -115,8 +115,7 @@ public class DisplayWhiteBalanceFactory { * Creates a BrightnessFilter which functions as a weighted moving average buffer for recent * brightness values. */ - @VisibleForTesting - static AmbientFilter createBrightnessFilter(Resources resources) { + public static AmbientFilter createBrightnessFilter(Resources resources) { final int horizon = resources.getInteger( com.android.internal.R.integer.config_displayWhiteBalanceBrightnessFilterHorizon); final float intercept = getFloat(resources, @@ -129,7 +128,6 @@ public class DisplayWhiteBalanceFactory { + "expected config_displayWhiteBalanceBrightnessFilterIntercept"); } - /** * Creates an ambient color sensor instance to redirect sensor data to callbacks. */ -- GitLab From 2f809b0b7d427fd14c74adccfab704baac915a52 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 12 Jul 2019 18:41:19 -0700 Subject: [PATCH 321/620] PasswordSlotManager: Fix incorrect string comparison. Bug: 135721162 Test: cts-on-gsi -m CtsWindowManagerDeviceTestCases Change-Id: I2a11dd6dfd44e10400e40ebbaa2ed597de95cdcb Merged-In: I2a11dd6dfd44e10400e40ebbaa2ed597de95cdcb --- .../com/android/server/locksettings/PasswordSlotManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/locksettings/PasswordSlotManager.java b/services/core/java/com/android/server/locksettings/PasswordSlotManager.java index 5cbd237a0722..4ef63c05325c 100644 --- a/services/core/java/com/android/server/locksettings/PasswordSlotManager.java +++ b/services/core/java/com/android/server/locksettings/PasswordSlotManager.java @@ -122,7 +122,7 @@ public class PasswordSlotManager { */ public void markSlotDeleted(int slot) throws RuntimeException { ensureSlotMapLoaded(); - if (mSlotMap.containsKey(slot) && mSlotMap.get(slot) != getMode()) { + if (mSlotMap.containsKey(slot) && !mSlotMap.get(slot).equals(getMode())) { throw new RuntimeException("password slot " + slot + " cannot be deleted"); } mSlotMap.remove(slot); -- GitLab From d1552e36f4aa20ac240e2d72ae26f30e51f03787 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 12 Jul 2019 18:41:19 -0700 Subject: [PATCH 322/620] PasswordSlotManager: Fix incorrect string comparison. Bug: 135721162 Test: cts-on-gsi -m CtsWindowManagerDeviceTestCases Change-Id: I2a11dd6dfd44e10400e40ebbaa2ed597de95cdcb Merged-In: I2a11dd6dfd44e10400e40ebbaa2ed597de95cdcb --- .../com/android/server/locksettings/PasswordSlotManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/locksettings/PasswordSlotManager.java b/services/core/java/com/android/server/locksettings/PasswordSlotManager.java index 5cbd237a0722..4ef63c05325c 100644 --- a/services/core/java/com/android/server/locksettings/PasswordSlotManager.java +++ b/services/core/java/com/android/server/locksettings/PasswordSlotManager.java @@ -122,7 +122,7 @@ public class PasswordSlotManager { */ public void markSlotDeleted(int slot) throws RuntimeException { ensureSlotMapLoaded(); - if (mSlotMap.containsKey(slot) && mSlotMap.get(slot) != getMode()) { + if (mSlotMap.containsKey(slot) && !mSlotMap.get(slot).equals(getMode())) { throw new RuntimeException("password slot " + slot + " cannot be deleted"); } mSlotMap.remove(slot); -- GitLab From d7cd8eda88f063aa9946d7b1586f61d79b789bd9 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Tue, 16 Jul 2019 18:19:01 +0800 Subject: [PATCH 323/620] Don't hold lock when dumping activities of app side Although TransferPipe has a 5s timeout, there may have several activities take long time do dump that may lead to system no response. Fix: 135770637 Test: Launch an activity which overrides Activity#dump and sleeps 5s in the dump method. Enter command: "adb shell dumpsys activity all", then check the interaction with system UI is still responsive. Change-Id: Id81463eee0178065a0fb982a6e599bee5f15dd81 --- .../server/wm/ActivityTaskManagerService.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 0f96f99c3348..8a9dfc7569dc 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -4998,6 +4998,9 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { * - the cmd arg isn't the flattened component name of an existing activity: * dump all activity whose component contains the cmd as a substring * - A hex number of the ActivityRecord object instance. + *

+ * The caller should not hold lock when calling this method because it will wait for the + * activities to complete the dump. * * @param dumpVisibleStacksOnly dump activity with {@param name} only if in a visible stack * @param dumpFocusedStackOnly dump activity with {@param name} only if in the focused stack @@ -5050,29 +5053,28 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { private void dumpActivity(String prefix, FileDescriptor fd, PrintWriter pw, final ActivityRecord r, String[] args, boolean dumpAll) { String innerPrefix = prefix + " "; + IApplicationThread appThread = null; synchronized (mGlobalLock) { pw.print(prefix); pw.print("ACTIVITY "); pw.print(r.shortComponentName); pw.print(" "); pw.print(Integer.toHexString(System.identityHashCode(r))); pw.print(" pid="); - if (r.hasProcess()) pw.println(r.app.getPid()); - else pw.println("(not running)"); + if (r.hasProcess()) { + pw.println(r.app.getPid()); + appThread = r.app.getThread(); + } else { + pw.println("(not running)"); + } if (dumpAll) { r.dump(pw, innerPrefix); } } - if (r.attachedToProcess()) { + if (appThread != null) { // flush anything that is already in the PrintWriter since the thread is going // to write to the file descriptor directly pw.flush(); - try { - TransferPipe tp = new TransferPipe(); - try { - r.app.getThread().dumpActivity(tp.getWriteFd(), - r.appToken, innerPrefix, args); - tp.go(fd); - } finally { - tp.kill(); - } + try (TransferPipe tp = new TransferPipe()) { + appThread.dumpActivity(tp.getWriteFd(), r.appToken, innerPrefix, args); + tp.go(fd); } catch (IOException e) { pw.println(innerPrefix + "Failure while dumping the activity: " + e); } catch (RemoteException e) { @@ -7181,10 +7183,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { public boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name, String[] args, int opti, boolean dumpAll, boolean dumpVisibleStacksOnly, boolean dumpFocusedStackOnly) { - synchronized (mGlobalLock) { - return ActivityTaskManagerService.this.dumpActivity(fd, pw, name, args, opti, - dumpAll, dumpVisibleStacksOnly, dumpFocusedStackOnly); - } + return ActivityTaskManagerService.this.dumpActivity(fd, pw, name, args, opti, dumpAll, + dumpVisibleStacksOnly, dumpFocusedStackOnly); } @Override -- GitLab From 35e049a68f4a151ed209330c2955c8e8236b6c42 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Tue, 16 Jul 2019 15:03:14 +0200 Subject: [PATCH 324/620] Do not detach children of starting windows In case we need to relaunch an activity, we detach it's children just about at the same time when we add the splash screen. However, detaching will have the side effect that all transactions will be ignored so the starting window will never become visible, leading to an ugly hole. I don't think there is any good reason to detach the children of the starting window This is a regression from the task snapshot scaling change, so it's important to fix. Test: Open app, go home, toggle battery saver, reopen app Fixes: 137284423 Change-Id: Id2f4e5e4225c1c693b1fbcb5b0d7cf4b17f9a6e7 --- .../java/com/android/server/wm/WindowStateAnimator.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 2c0a733eebde..3505afb5e7a3 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -1493,6 +1493,12 @@ class WindowStateAnimator { } void detachChildren() { + + // Do not detach children of starting windows, as their lifecycle is well under control and + // it may lead to issues in case we relaunch when we just added the starting window. + if (mWin.mAttrs.type == TYPE_APPLICATION_STARTING) { + return; + } if (mSurfaceController != null) { mSurfaceController.detachChildren(); } -- GitLab From b52b0457e1bad14697341cb81f6d391755b009be Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Tue, 16 Jul 2019 17:43:15 +0200 Subject: [PATCH 325/620] Only consider gone for layout if parent is gone for layout If we check getParentWindowHidden, that determines mostly actual visibility. However, we don't want that because we still would like to follow the parent's window layout lifecycle, as otherwise we may be stuck in a transition in case the parent window is hidden but the child is waiting for a layout to happen. Test: Click "Customize" on wallpaper picker, go back, ensure no transition timeout Fixes: 135976008 Change-Id: I66aeab29a81cd82b170aaf337249616b1f559848 --- services/core/java/com/android/server/wm/WindowState.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 9ea6e30ef89b..f68d7c077e72 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1633,7 +1633,7 @@ class WindowState extends WindowContainer implements WindowManagerP || !mRelayoutCalled || (atoken == null && mToken.isHidden()) || (atoken != null && atoken.hiddenRequested) - || isParentWindowHidden() + || isParentWindowGoneForLayout() || (mAnimatingExit && !isAnimatingLw()) || mDestroying; } @@ -3840,6 +3840,11 @@ class WindowState extends WindowContainer implements WindowManagerP return parent != null && parent.mHidden; } + private boolean isParentWindowGoneForLayout() { + final WindowState parent = getParentWindow(); + return parent != null && parent.isGoneForLayoutLw(); + } + void setWillReplaceWindow(boolean animate) { for (int i = mChildren.size() - 1; i >= 0; i--) { final WindowState c = mChildren.get(i); -- GitLab From 3174c66843d096ab745745401b1cfbb87daf022b Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Mon, 15 Jul 2019 15:49:54 -0700 Subject: [PATCH 326/620] Fix issue where sensors wouldn't be reregistered Test: manual Test: atest DozeTriggersTest Fixes: 137220997 Change-Id: Ic983b64745fd1fa171059d08557e92ed52060f9e --- .../android/systemui/doze/DozeSensors.java | 21 ++++---- .../android/systemui/doze/DozeTriggers.java | 3 ++ .../systemui/doze/DozeConfigurationUtil.java | 8 +++ .../systemui/doze/DozeTriggersTest.java | 49 ++++++++++++------- .../utils/hardware/FakeSensorManager.java | 25 +++++++--- 5 files changed, 73 insertions(+), 33 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index cf04b7f192e4..6918501bfb9f 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -198,7 +198,10 @@ public class DozeSensors { updateListening(); } - private void updateListening() { + /** + * Registers/unregisters sensors based on internal state. + */ + public void updateListening() { boolean anyListening = false; for (TriggerSensor s : mSensors) { // We don't want to be listening while we're PAUSED (prox sensor is covered) @@ -231,7 +234,7 @@ public class DozeSensors { public void onUserSwitched() { for (TriggerSensor s : mSensors) { - s.updateListener(); + s.updateListening(); } } @@ -246,7 +249,7 @@ public class DozeSensors { return; } for (TriggerSensor s : mSensors) { - s.updateListener(); + s.updateListening(); } } }; @@ -409,22 +412,22 @@ public class DozeSensors { public void setListening(boolean listen) { if (mRequested == listen) return; mRequested = listen; - updateListener(); + updateListening(); } public void setDisabled(boolean disabled) { if (mDisabled == disabled) return; mDisabled = disabled; - updateListener(); + updateListening(); } public void ignoreSetting(boolean ignored) { if (mIgnoresSetting == ignored) return; mIgnoresSetting = ignored; - updateListener(); + updateListening(); } - public void updateListener() { + public void updateListening() { if (!mConfigured || mSensor == null) return; if (mRequested && !mDisabled && (enabledBySetting() || mIgnoresSetting) && !mRegistered) { @@ -480,7 +483,7 @@ public class DozeSensors { mCallback.onSensorPulse(mPulseReason, mSensorPerformsProxCheck, screenX, screenY, event.values); if (!mRegistered) { - updateListener(); // reregister, this sensor only fires once + updateListening(); // reregister, this sensor only fires once } })); } @@ -541,7 +544,7 @@ public class DozeSensors { } @Override - public void updateListener() { + public void updateListening() { if (!mConfigured) return; AsyncSensorManager asyncSensorManager = (AsyncSensorManager) mSensorManager; if (mRequested && !mDisabled && (enabledBySetting() || mIgnoresSetting) diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index 97b08d5a12a6..63de960db79d 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -314,6 +314,9 @@ public class DozeTriggers implements DozeMachine.Part { break; case DOZE_PULSE_DONE: mDozeSensors.requestTemporaryDisable(); + // A pulse will temporarily disable sensors that require a touch screen. + // Let's make sure that they are re-enabled when the pulse is over. + mDozeSensors.updateListening(); break; case FINISH: mBroadcastReceiver.unregister(mContext); diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java index 2d6ae2629ce4..2ed0970ce44b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java @@ -24,6 +24,7 @@ import static org.mockito.Mockito.when; import static org.mockito.Mockito.withSettings; import com.android.systemui.statusbar.phone.DozeParameters; +import com.android.systemui.utils.hardware.FakeSensorManager; import org.mockito.Answers; import org.mockito.MockSettings; @@ -39,6 +40,7 @@ public class DozeConfigurationUtil { when(params.getPickupPerformsProxCheck()).thenReturn(true); when(params.getPolicy()).thenReturn(mock(AlwaysOnDisplayPolicy.class)); when(params.doubleTapReportsTouchCoordinates()).thenReturn(false); + when(params.getDisplayNeedsBlanking()).thenReturn(false); doneHolder[0] = true; return params; @@ -52,11 +54,17 @@ public class DozeConfigurationUtil { when(config.pickupGestureEnabled(anyInt())).thenReturn(false); when(config.pulseOnNotificationEnabled(anyInt())).thenReturn(true); when(config.alwaysOnEnabled(anyInt())).thenReturn(false); + when(config.enabled(anyInt())).thenReturn(true); + when(config.getWakeLockScreenDebounce()).thenReturn(0L); when(config.doubleTapSensorType()).thenReturn(null); when(config.tapSensorType()).thenReturn(null); when(config.longPressSensorType()).thenReturn(null); + when(config.tapGestureEnabled(anyInt())).thenReturn(true); + when(config.tapSensorAvailable()).thenReturn(true); + when(config.tapSensorType()).thenReturn(FakeSensorManager.TAP_SENSOR_TYPE); + when(config.dozePickupSensorAvailable()).thenReturn(false); when(config.wakeScreenGestureAvailable()).thenReturn(false); diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java index 6979fd811817..6feff9c0b1a5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java @@ -19,6 +19,7 @@ package com.android.systemui.doze; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -27,18 +28,17 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AlarmManager; -import android.app.Instrumentation; +import android.hardware.Sensor; import android.hardware.display.AmbientDisplayConfiguration; import android.os.Handler; import android.os.Looper; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; -import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; -import com.android.systemui.dock.DockManagerFake; +import com.android.systemui.dock.DockManager; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.util.wakelock.WakeLock; import com.android.systemui.util.wakelock.WakeLockFake; @@ -46,14 +46,12 @@ import com.android.systemui.utils.hardware.FakeSensorManager; import org.junit.Before; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @SmallTest -@Ignore("failing") @RunWith(AndroidTestingRunner.class) -@RunWithLooper +@RunWithLooper(setAsMainLooper = true) public class DozeTriggersTest extends SysuiTestCase { private DozeTriggers mTriggers; private DozeMachine mMachine; @@ -61,10 +59,10 @@ public class DozeTriggersTest extends SysuiTestCase { private AmbientDisplayConfiguration mConfig; private DozeParameters mParameters; private FakeSensorManager mSensors; + private Sensor mTapSensor; private WakeLock mWakeLock; - private Instrumentation mInstrumentation; private AlarmManager mAlarmManager; - private DockManagerFake mDockManagerFake; + private DockManager mDockManagerFake; @BeforeClass public static void setupSuite() { @@ -74,15 +72,15 @@ public class DozeTriggersTest extends SysuiTestCase { @Before public void setUp() throws Exception { - mInstrumentation = InstrumentationRegistry.getInstrumentation(); mMachine = mock(DozeMachine.class); mAlarmManager = mock(AlarmManager.class); - mHost = new DozeHostFake(); + mHost = spy(new DozeHostFake()); mConfig = DozeConfigurationUtil.createMockConfig(); mParameters = DozeConfigurationUtil.createMockParameters(); - mSensors = new FakeSensorManager(mContext); + mSensors = spy(new FakeSensorManager(mContext)); + mTapSensor = mSensors.getFakeTapSensor().getSensor(); mWakeLock = new WakeLockFake(); - mDockManagerFake = spy(new DockManagerFake()); + mDockManagerFake = mock(DockManager.class); mTriggers = new DozeTriggers(mContext, mMachine, mHost, mAlarmManager, mConfig, mParameters, mSensors, Handler.createAsync(Looper.myLooper()), mWakeLock, true, @@ -95,29 +93,45 @@ public class DozeTriggersTest extends SysuiTestCase { mTriggers.transitionTo(DozeMachine.State.UNINITIALIZED, DozeMachine.State.INITIALIZED); mTriggers.transitionTo(DozeMachine.State.INITIALIZED, DozeMachine.State.DOZE); + clearInvocations(mMachine); mHost.callback.onNotificationAlerted(); - mSensors.getMockProximitySensor().sendProximityResult(false); /* Near */ verify(mMachine, never()).requestState(any()); verify(mMachine, never()).requestPulse(anyInt()); mHost.callback.onNotificationAlerted(); - mSensors.getMockProximitySensor().sendProximityResult(true); /* Far */ verify(mMachine).requestPulse(anyInt()); } + @Test + public void testTransitionTo_disablesAndEnablesTouchSensors() { + when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE); + + mTriggers.transitionTo(DozeMachine.State.INITIALIZED, DozeMachine.State.DOZE); + verify(mSensors).requestTriggerSensor(any(), eq(mTapSensor)); + + clearInvocations(mSensors); + mTriggers.transitionTo(DozeMachine.State.DOZE, + DozeMachine.State.DOZE_REQUEST_PULSE); + mTriggers.transitionTo(DozeMachine.State.DOZE_REQUEST_PULSE, + DozeMachine.State.DOZE_PULSING); + verify(mSensors).cancelTriggerSensor(any(), eq(mTapSensor)); + + clearInvocations(mSensors); + mTriggers.transitionTo(DozeMachine.State.DOZE_PULSING, DozeMachine.State.DOZE_PULSE_DONE); + verify(mSensors).requestTriggerSensor(any(), eq(mTapSensor)); + } + @Test public void testDockEventListener_registerAndUnregister() { mTriggers.transitionTo(DozeMachine.State.UNINITIALIZED, DozeMachine.State.INITIALIZED); - verify(mDockManagerFake).addListener(any()); mTriggers.transitionTo(DozeMachine.State.DOZE, DozeMachine.State.FINISH); - verify(mDockManagerFake).removeListener(any()); } @@ -128,7 +142,6 @@ public class DozeTriggersTest extends SysuiTestCase { mTriggers.onSensor(DozeLog.REASON_SENSOR_DOUBLE_TAP, false /* sensorPerformedProxCheck */, 50 /* screenX */, 50 /* screenY */, null /* rawValues */); - verify(mMachine, never()).wakeUp(); } @@ -142,7 +155,7 @@ public class DozeTriggersTest extends SysuiTestCase { false /* sensorPerformedProxCheck */, 50 /* screenX */, 50 /* screenY */, null /* rawValues */); - verify(mHost).setAodDimmingScrim(eq(255)); + verify(mHost).setAodDimmingScrim(eq(255f)); verify(mMachine).wakeUp(); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/hardware/FakeSensorManager.java b/packages/SystemUI/tests/src/com/android/systemui/utils/hardware/FakeSensorManager.java index a4ae166d0675..29b8ab600caf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/utils/hardware/FakeSensorManager.java +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/hardware/FakeSensorManager.java @@ -40,18 +40,23 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import javax.annotation.Nullable; + /** * Rudimentary fake for SensorManager * - * Currently only supports the proximity sensor. + * Currently only supports proximity, light and tap sensors. * * Note that this class ignores the "Handler" argument, so the test is responsible for calling the * listener on the right thread. */ public class FakeSensorManager extends SensorManager { + public static final String TAP_SENSOR_TYPE = "tapSensorType"; + private final MockProximitySensor mMockProximitySensor; private final FakeGenericSensor mFakeLightSensor; + private final FakeGenericSensor mFakeTapSensor; private final FakeGenericSensor[] mSensors; public FakeSensorManager(Context context) throws Exception { @@ -59,12 +64,13 @@ public class FakeSensorManager extends SensorManager { .getDefaultSensor(Sensor.TYPE_PROXIMITY); if (proxSensor == null) { // No prox? Let's create a fake one! - proxSensor = createSensor(Sensor.TYPE_PROXIMITY); + proxSensor = createSensor(Sensor.TYPE_PROXIMITY, null); } mSensors = new FakeGenericSensor[]{ mMockProximitySensor = new MockProximitySensor(proxSensor), - mFakeLightSensor = new FakeGenericSensor(createSensor(Sensor.TYPE_LIGHT)), + mFakeLightSensor = new FakeGenericSensor(createSensor(Sensor.TYPE_LIGHT, null)), + mFakeTapSensor = new FakeGenericSensor(createSensor(99, TAP_SENSOR_TYPE)) }; } @@ -76,6 +82,10 @@ public class FakeSensorManager extends SensorManager { return mFakeLightSensor; } + public FakeGenericSensor getFakeTapSensor() { + return mFakeTapSensor; + } + @Override public Sensor getDefaultSensor(int type) { Sensor s = super.getDefaultSensor(type); @@ -160,13 +170,13 @@ public class FakeSensorManager extends SensorManager { @Override protected boolean requestTriggerSensorImpl(TriggerEventListener listener, Sensor sensor) { - return false; + return true; } @Override protected boolean cancelTriggerSensorImpl(TriggerEventListener listener, Sensor sensor, boolean disable) { - return false; + return true; } @Override @@ -185,12 +195,15 @@ public class FakeSensorManager extends SensorManager { return false; } - private Sensor createSensor(int type) throws Exception { + private Sensor createSensor(int type, @Nullable String stringType) throws Exception { Constructor constr = Sensor.class.getDeclaredConstructor(); constr.setAccessible(true); Sensor sensor = constr.newInstance(); setSensorType(sensor, type); + if (stringType != null) { + setSensorField(sensor, "mStringType", stringType); + } setSensorField(sensor, "mName", "Mock " + sensor.getStringType() + "/" + type); setSensorField(sensor, "mVendor", "Mock Vendor"); setSensorField(sensor, "mVersion", 1); -- GitLab From 41ee35fabf60f3e68404e06a1e6ddcacd852e519 Mon Sep 17 00:00:00 2001 From: Daniel Solomon Date: Thu, 11 Jul 2019 16:29:33 -0700 Subject: [PATCH 327/620] Add ability to select composition color space for a given color mode Add the ability to specify a desired display composition color space (sRGB, P3, etc.) for a given color mode (Natural, Boosted, etc.). If no composition color space is specified, the composition color space is unchanged. Bug: 137140317 Bug: 137053654 Test: atest FrameworksMockingServicesTests:DisplayTransformManagerTest Test: atest FrameworksServicesTests:ColorDisplayServiceTest Change-Id: I37b01fa160d3965cea341781c0aa656f57e0f68f --- core/res/res/values/config.xml | 16 ++++ core/res/res/values/symbols.xml | 2 + .../display/color/ColorDisplayService.java | 44 +++++++++- .../color/DisplayTransformManager.java | 26 ++++-- .../color/DisplayTransformManagerTest.java | 42 +++++++-- .../color/ColorDisplayServiceTest.java | 86 +++++++++++++++++++ 6 files changed, 202 insertions(+), 14 deletions(-) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 305c1a6d5657..b50a23d6cfd4 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1115,6 +1115,22 @@ regularly selected color mode will be used if this value is negative. --> -1 + + + + + + 700 - - 10000 - - 6000 + 10000 diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java index cbaf85c511dd..680e52223178 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java @@ -72,8 +72,6 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, private NotificationGroupManager mGroupManager; private VisualStabilityManager mVisualStabilityManager; private StatusBarTouchableRegionManager mStatusBarTouchableRegionManager; - @VisibleForTesting - int mAutoDismissNotificationDecayDozing; private boolean mReleaseOnExpandFinish; private int mStatusBarHeight; @@ -120,8 +118,6 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, KeyguardBypassController bypassController) { super(context); Resources resources = mContext.getResources(); - mAutoDismissNotificationDecayDozing = resources.getInteger( - R.integer.heads_up_notification_decay_dozing); mExtensionTime = resources.getInteger(R.integer.ambient_notification_extension_time); mAutoHeadsUpNotificationDecay = resources.getInteger( R.integer.auto_heads_up_notification_decay); @@ -612,9 +608,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, } private int getDecayDuration() { - if (mStatusBarStateController.isDozing()) { - return mAutoDismissNotificationDecayDozing; - } else if (isAutoHeadsUp()) { + if (isAutoHeadsUp()) { return getRecommendedHeadsUpTimeoutMs(mAutoHeadsUpNotificationDecay); } else { return getRecommendedHeadsUpTimeoutMs(mAutoDismissNotificationDecay); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java index 5c1f473360b2..881cc3915880 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java @@ -64,7 +64,7 @@ public class AlertingNotificationManagerTest extends SysuiTestCase { protected static final int TEST_AUTO_DISMISS_TIME = 500; // Number of notifications to use in tests requiring multiple notifications private static final int TEST_NUM_NOTIFICATIONS = 4; - protected static final int TEST_TIMEOUT_TIME = 10000; + protected static final int TEST_TIMEOUT_TIME = 15000; protected final Runnable TEST_TIMEOUT_RUNNABLE = () -> mTimedOut = true; private AlertingNotificationManager mAlertingNotificationManager; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java index f8b9e6879dcf..48934da9fb37 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java @@ -70,7 +70,6 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest { setUp(statusBarWindowView, groupManager, bar, vsManager); mMinimumDisplayTime = TEST_MINIMUM_DISPLAY_TIME; mAutoDismissNotificationDecay = TEST_AUTO_DISMISS_TIME; - mAutoDismissNotificationDecayDozing = TEST_AUTO_DISMISS_TIME; } } @@ -134,13 +133,11 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest { @Test public void testExtendHeadsUp() { - when(mStatusBarStateController.isDozing()).thenReturn(true); mHeadsUpManager.showNotification(mEntry); Runnable pastNormalTimeRunnable = () -> mLivesPastNormalTime = mHeadsUpManager.isAlerting(mEntry.key); mTestHandler.postDelayed(pastNormalTimeRunnable, - mHeadsUpManager.mAutoDismissNotificationDecayDozing + - mHeadsUpManager.mExtensionTime / 2); + TEST_AUTO_DISMISS_TIME + mHeadsUpManager.mExtensionTime / 2); mTestHandler.postDelayed(TEST_TIMEOUT_RUNNABLE, TEST_TIMEOUT_TIME); mHeadsUpManager.extendHeadsUp(); -- GitLab From bbb75b1263887dfebd9372b60ec7095a7dc6aa1d Mon Sep 17 00:00:00 2001 From: Jeff Vander Stoep Date: Fri, 12 Jul 2019 10:28:50 -0700 Subject: [PATCH 343/620] Renderscript: rename .rs extension to .rscript Reserve .rs extension for Rust. Bug: 137365032 Test: make checkbuild Test: cd frameworks/compile/slang/tests ./slang_tests.py Test: atest CtsRenderscriptTestCases Test: CtsRsCppTestCases Exempt-From-Owner-Approval: Clean CP Change-Id: Ic49fc7f5265d49cd4f8efd6a2b6a60b77bbd40dc Merged-In: Ic49fc7f5265d49cd4f8efd6a2b6a60b77bbd40dc (cherry picked from commit e98dce083cc891a29f8aab489a80606f215c9f1c) --- .../hwuicompare/{errorCalculator.rs => errorCalculator.rscript} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/CanvasCompare/src/com/android/test/hwuicompare/{errorCalculator.rs => errorCalculator.rscript} (100%) diff --git a/tests/CanvasCompare/src/com/android/test/hwuicompare/errorCalculator.rs b/tests/CanvasCompare/src/com/android/test/hwuicompare/errorCalculator.rscript similarity index 100% rename from tests/CanvasCompare/src/com/android/test/hwuicompare/errorCalculator.rs rename to tests/CanvasCompare/src/com/android/test/hwuicompare/errorCalculator.rscript -- GitLab From 0fdd8f16d1409f4919931dbe8137077003770ea1 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Wed, 17 Jul 2019 15:28:18 -0700 Subject: [PATCH 344/620] Do not play "lock" anim right after showing kg Let's not play the lock icon animation if the keyguard had just become visible. Otherwise it will look like we're locking the phone, and it was already locked earlier. Test: manual Fixes: 137691015 Change-Id: I2486cfff3efbbb30d23ce4b68962dd352a2e60b7 --- .../android/systemui/statusbar/phone/LockIcon.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index 49afae7415ae..1360a084207b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -102,6 +102,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange private boolean mWakeAndUnlockRunning; private boolean mKeyguardShowing; private boolean mShowingLaunchAffordance; + private boolean mKeyguardJustShown; private boolean mUpdatePending; private final KeyguardMonitor.Callback mKeyguardMonitorCallback = @@ -115,6 +116,9 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange mBlockUpdates = false; force = true; } + if (!wasShowing && mKeyguardShowing) { + mKeyguardJustShown = true; + } update(force); } @@ -273,8 +277,10 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange int state = getState(); int lastState = mLastState; + boolean keyguardJustShown = mKeyguardJustShown; mIsFaceUnlockState = state == STATE_SCANNING_FACE; mLastState = state; + mKeyguardJustShown = false; boolean shouldUpdate = lastState != state || mForceUpdate; if (mBlockUpdates && canBlockUpdates()) { @@ -283,7 +289,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange if (shouldUpdate) { mForceUpdate = false; @LockAnimIndex final int lockAnimIndex = getAnimationIndexForTransition(lastState, - state, mPulsing, mDozing); + state, mPulsing, mDozing, keyguardJustShown); boolean isAnim = lockAnimIndex != -1; int iconRes = isAnim ? getThemedAnimationResId(lockAnimIndex) : getIconForState(state); @@ -412,7 +418,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange } private static int getAnimationIndexForTransition(int oldState, int newState, boolean pulsing, - boolean dozing) { + boolean dozing, boolean keyguardJustShown) { // Never animate when screen is off if (dozing && !pulsing) { @@ -423,7 +429,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange return ERROR; } else if (oldState != STATE_LOCK_OPEN && newState == STATE_LOCK_OPEN) { return UNLOCK; - } else if (oldState == STATE_LOCK_OPEN && newState == STATE_LOCKED) { + } else if (oldState == STATE_LOCK_OPEN && newState == STATE_LOCKED && !keyguardJustShown) { return LOCK; } else if (newState == STATE_SCANNING_FACE) { return SCANNING; -- GitLab From bd6c92b07438192189fb502cf52184109f117c8d Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Wed, 17 Jul 2019 09:49:52 -0700 Subject: [PATCH 345/620] Do not animate wallpaper when wakeAndUnlock Fixes: 137536016 Test: press power to go to lock scree <-> aod Test: unlock with fingerprint Test: trigger AOD2 pulse (look at wallpaper animation) Test: atest DozeWallpaperStateTest Change-Id: I46574609a00712bdde5a4652ab5c9b0c04cbeeec Merged-In: I46574609a00712bdde5a4652ab5c9b0c04cbeeec --- .../android/systemui/doze/DozeFactory.java | 9 ++++++++- .../systemui/doze/DozeWallpaperState.java | 13 +++++++++--- .../phone/BiometricUnlockController.java | 13 ++++++++++++ .../systemui/statusbar/phone/StatusBar.java | 1 + .../systemui/doze/DozeWallpaperStateTest.java | 20 ++++++++++++++++++- 5 files changed, 51 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java index fc3d1a52342f..d22d2c3fd47f 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java @@ -30,6 +30,7 @@ import com.android.systemui.R; import com.android.systemui.SystemUIApplication; import com.android.systemui.classifier.FalsingManagerFactory; import com.android.systemui.dock.DockManager; +import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.util.AsyncSensorManager; import com.android.systemui.util.wakelock.DelayedWakeLock; @@ -70,7 +71,7 @@ public class DozeFactory { new DozeScreenState(wrappedService, handler, params, wakeLock), createDozeScreenBrightness(context, wrappedService, sensorManager, host, params, handler), - new DozeWallpaperState(context), + new DozeWallpaperState(context, getBiometricUnlockController(dozeService)), new DozeDockHandler(context, machine, host, config, handler, dockManager), new DozeAuthRemover(dozeService) }); @@ -108,4 +109,10 @@ public class DozeFactory { final SystemUIApplication app = (SystemUIApplication) appCandidate; return app.getComponent(DozeHost.class); } + + public static BiometricUnlockController getBiometricUnlockController(DozeService service) { + Application appCandidate = service.getApplication(); + final SystemUIApplication app = (SystemUIApplication) appCandidate; + return app.getComponent(BiometricUnlockController.class); + } } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeWallpaperState.java b/packages/SystemUI/src/com/android/systemui/doze/DozeWallpaperState.java index 1b3cd881b949..35c8b741381c 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeWallpaperState.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeWallpaperState.java @@ -24,6 +24,7 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; +import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.DozeParameters; import java.io.PrintWriter; @@ -38,18 +39,22 @@ public class DozeWallpaperState implements DozeMachine.Part { private final IWallpaperManager mWallpaperManagerService; private final DozeParameters mDozeParameters; + private final BiometricUnlockController mBiometricUnlockController; private boolean mIsAmbientMode; - public DozeWallpaperState(Context context) { + public DozeWallpaperState(Context context, + BiometricUnlockController biometricUnlockController) { this(IWallpaperManager.Stub.asInterface( ServiceManager.getService(Context.WALLPAPER_SERVICE)), + biometricUnlockController, DozeParameters.getInstance(context)); } @VisibleForTesting DozeWallpaperState(IWallpaperManager wallpaperManagerService, - DozeParameters parameters) { + BiometricUnlockController biometricUnlockController, DozeParameters parameters) { mWallpaperManagerService = wallpaperManagerService; + mBiometricUnlockController = biometricUnlockController; mDozeParameters = parameters; } @@ -76,7 +81,9 @@ public class DozeWallpaperState implements DozeMachine.Part { } else { boolean wakingUpFromPulse = oldState == DozeMachine.State.DOZE_PULSING && newState == DozeMachine.State.FINISH; - animated = !mDozeParameters.getDisplayNeedsBlanking() || wakingUpFromPulse; + boolean fastDisplay = !mDozeParameters.getDisplayNeedsBlanking(); + animated = (fastDisplay && !mBiometricUnlockController.unlockedByWakeAndUnlock()) + || wakingUpFromPulse; } if (isAmbientMode != mIsAmbientMode) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 930f57efd2a7..94cd2cdaa9d3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -141,6 +141,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { private BiometricSourceType mPendingAuthenticatedBioSourceType = null; private boolean mPendingShowBouncer; private boolean mHasScreenTurnedOnSinceAuthenticating; + private boolean mFadedAwayAfterWakeAndUnlock; private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class); @@ -368,6 +369,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { @Override public void onStartedGoingToSleep(int why) { resetMode(); + mFadedAwayAfterWakeAndUnlock = false; mPendingAuthenticatedUserId = -1; mPendingAuthenticatedBioSourceType = null; } @@ -513,6 +515,9 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { } public void finishKeyguardFadingAway() { + if (isWakeAndUnlock()) { + mFadedAwayAfterWakeAndUnlock = true; + } resetMode(); } @@ -562,6 +567,14 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { || mMode == MODE_WAKE_AND_UNLOCK_FROM_DREAM; } + /** + * Successful authentication with fingerprint, face, or iris that wakes up the device. + * This will return {@code true} even after the keyguard fades away. + */ + public boolean unlockedByWakeAndUnlock() { + return isWakeAndUnlock() || mFadedAwayAfterWakeAndUnlock; + } + /** * Successful authentication with fingerprint, face, or iris when the screen was either * on or off. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 9e6454ec9f3d..d93dc950a077 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1230,6 +1230,7 @@ public class StatusBar extends SystemUI implements DemoMode, mDozeScrimController, keyguardViewMediator, mScrimController, this, UnlockMethodCache.getInstance(mContext), new Handler(), mKeyguardUpdateMonitor, mKeyguardBypassController); + putComponent(BiometricUnlockController.class, mBiometricUnlockController); mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this, getBouncerContainer(), mNotificationPanel, mBiometricUnlockController, mStatusBarWindow.findViewById(R.id.lock_icon_container), mStackScroller, diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java index 87ae85f6d302..f07edf331f13 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java @@ -18,6 +18,7 @@ package com.android.systemui.doze; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -29,6 +30,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; +import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.DozeParameters; import org.junit.Before; @@ -44,12 +46,14 @@ public class DozeWallpaperStateTest extends SysuiTestCase { private DozeWallpaperState mDozeWallpaperState; @Mock IWallpaperManager mIWallpaperManager; + @Mock BiometricUnlockController mBiometricUnlockController; @Mock DozeParameters mDozeParameters; @Before public void setUp() { MockitoAnnotations.initMocks(this); - mDozeWallpaperState = new DozeWallpaperState(mIWallpaperManager, mDozeParameters); + mDozeWallpaperState = new DozeWallpaperState(mIWallpaperManager, mBiometricUnlockController, + mDozeParameters); } @Test @@ -101,6 +105,20 @@ public class DozeWallpaperStateTest extends SysuiTestCase { verify(mIWallpaperManager).setInAmbientMode(eq(false), eq(0L)); } + @Test + public void testDoesNotAnimate_whenWakeAndUnlock() throws RemoteException { + // Pre-conditions + when(mDozeParameters.getAlwaysOn()).thenReturn(true); + when(mBiometricUnlockController.unlockedByWakeAndUnlock()).thenReturn(true); + + mDozeWallpaperState.transitionTo(DozeMachine.State.UNINITIALIZED, + DozeMachine.State.DOZE_AOD); + clearInvocations(mIWallpaperManager); + + mDozeWallpaperState.transitionTo(DozeMachine.State.DOZE_AOD, DozeMachine.State.FINISH); + verify(mIWallpaperManager).setInAmbientMode(eq(false), eq(0L)); + } + @Test public void testTransitionTo_requestPulseIsAmbientMode() throws RemoteException { mDozeWallpaperState.transitionTo(DozeMachine.State.DOZE, -- GitLab From 29e30faa4e808db7d3e3dcef0bfbad5bd062496c Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Wed, 17 Jul 2019 09:49:52 -0700 Subject: [PATCH 346/620] Do not animate wallpaper when wakeAndUnlock Fixes: 137536016 Test: press power to go to lock scree <-> aod Test: unlock with fingerprint Test: trigger AOD2 pulse (look at wallpaper animation) Test: atest DozeWallpaperStateTest Change-Id: I46574609a00712bdde5a4652ab5c9b0c04cbeeec Merged-In: I46574609a00712bdde5a4652ab5c9b0c04cbeeec --- .../android/systemui/doze/DozeFactory.java | 9 ++++++++- .../systemui/doze/DozeWallpaperState.java | 13 +++++++++--- .../phone/BiometricUnlockController.java | 13 ++++++++++++ .../systemui/statusbar/phone/StatusBar.java | 1 + .../systemui/doze/DozeWallpaperStateTest.java | 20 ++++++++++++++++++- 5 files changed, 51 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java index 8694d2ad607c..9c2adb36e1ae 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java @@ -30,6 +30,7 @@ import com.android.systemui.R; import com.android.systemui.SystemUIApplication; import com.android.systemui.classifier.FalsingManagerFactory; import com.android.systemui.dock.DockManager; +import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.util.AsyncSensorManager; import com.android.systemui.util.wakelock.DelayedWakeLock; @@ -70,7 +71,7 @@ public class DozeFactory { new DozeScreenState(wrappedService, handler, params, wakeLock), createDozeScreenBrightness(context, wrappedService, sensorManager, host, params, handler), - new DozeWallpaperState(context), + new DozeWallpaperState(context, getBiometricUnlockController(dozeService)), new DozeDockHandler(context, machine, host, config, handler, dockManager) }); @@ -107,4 +108,10 @@ public class DozeFactory { final SystemUIApplication app = (SystemUIApplication) appCandidate; return app.getComponent(DozeHost.class); } + + public static BiometricUnlockController getBiometricUnlockController(DozeService service) { + Application appCandidate = service.getApplication(); + final SystemUIApplication app = (SystemUIApplication) appCandidate; + return app.getComponent(BiometricUnlockController.class); + } } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeWallpaperState.java b/packages/SystemUI/src/com/android/systemui/doze/DozeWallpaperState.java index 1b3cd881b949..35c8b741381c 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeWallpaperState.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeWallpaperState.java @@ -24,6 +24,7 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; +import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.DozeParameters; import java.io.PrintWriter; @@ -38,18 +39,22 @@ public class DozeWallpaperState implements DozeMachine.Part { private final IWallpaperManager mWallpaperManagerService; private final DozeParameters mDozeParameters; + private final BiometricUnlockController mBiometricUnlockController; private boolean mIsAmbientMode; - public DozeWallpaperState(Context context) { + public DozeWallpaperState(Context context, + BiometricUnlockController biometricUnlockController) { this(IWallpaperManager.Stub.asInterface( ServiceManager.getService(Context.WALLPAPER_SERVICE)), + biometricUnlockController, DozeParameters.getInstance(context)); } @VisibleForTesting DozeWallpaperState(IWallpaperManager wallpaperManagerService, - DozeParameters parameters) { + BiometricUnlockController biometricUnlockController, DozeParameters parameters) { mWallpaperManagerService = wallpaperManagerService; + mBiometricUnlockController = biometricUnlockController; mDozeParameters = parameters; } @@ -76,7 +81,9 @@ public class DozeWallpaperState implements DozeMachine.Part { } else { boolean wakingUpFromPulse = oldState == DozeMachine.State.DOZE_PULSING && newState == DozeMachine.State.FINISH; - animated = !mDozeParameters.getDisplayNeedsBlanking() || wakingUpFromPulse; + boolean fastDisplay = !mDozeParameters.getDisplayNeedsBlanking(); + animated = (fastDisplay && !mBiometricUnlockController.unlockedByWakeAndUnlock()) + || wakingUpFromPulse; } if (isAmbientMode != mIsAmbientMode) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 4d4818d51414..eccd70b4a597 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -132,6 +132,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { private BiometricSourceType mPendingAuthenticatedBioSourceType = null; private boolean mPendingShowBouncer; private boolean mHasScreenTurnedOnSinceAuthenticating; + private boolean mFadedAwayAfterWakeAndUnlock; private final TunerService.Tunable mFaceDismissedKeyguardTunable = new TunerService.Tunable() { @Override @@ -360,6 +361,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { @Override public void onStartedGoingToSleep(int why) { resetMode(); + mFadedAwayAfterWakeAndUnlock = false; mPendingAuthenticatedUserId = -1; mPendingAuthenticatedBioSourceType = null; } @@ -454,6 +456,9 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { } public void finishKeyguardFadingAway() { + if (isWakeAndUnlock()) { + mFadedAwayAfterWakeAndUnlock = true; + } resetMode(); } @@ -503,6 +508,14 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { || mMode == MODE_WAKE_AND_UNLOCK_FROM_DREAM; } + /** + * Successful authentication with fingerprint, face, or iris that wakes up the device. + * This will return {@code true} even after the keyguard fades away. + */ + public boolean unlockedByWakeAndUnlock() { + return isWakeAndUnlock() || mFadedAwayAfterWakeAndUnlock; + } + /** * Successful authentication with fingerprint, face, or iris when the screen was either * on or off. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 1aa8bd79af35..7d6799bf638e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1213,6 +1213,7 @@ public class StatusBar extends SystemUI implements DemoMode, mDozeScrimController, keyguardViewMediator, mScrimController, this, UnlockMethodCache.getInstance(mContext), new Handler(), mKeyguardUpdateMonitor, Dependency.get(TunerService.class)); + putComponent(BiometricUnlockController.class, mBiometricUnlockController); mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this, getBouncerContainer(), mNotificationPanel, mBiometricUnlockController, mStatusBarWindow.findViewById(R.id.lock_icon_container)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java index 87ae85f6d302..f07edf331f13 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeWallpaperStateTest.java @@ -18,6 +18,7 @@ package com.android.systemui.doze; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -29,6 +30,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; +import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.DozeParameters; import org.junit.Before; @@ -44,12 +46,14 @@ public class DozeWallpaperStateTest extends SysuiTestCase { private DozeWallpaperState mDozeWallpaperState; @Mock IWallpaperManager mIWallpaperManager; + @Mock BiometricUnlockController mBiometricUnlockController; @Mock DozeParameters mDozeParameters; @Before public void setUp() { MockitoAnnotations.initMocks(this); - mDozeWallpaperState = new DozeWallpaperState(mIWallpaperManager, mDozeParameters); + mDozeWallpaperState = new DozeWallpaperState(mIWallpaperManager, mBiometricUnlockController, + mDozeParameters); } @Test @@ -101,6 +105,20 @@ public class DozeWallpaperStateTest extends SysuiTestCase { verify(mIWallpaperManager).setInAmbientMode(eq(false), eq(0L)); } + @Test + public void testDoesNotAnimate_whenWakeAndUnlock() throws RemoteException { + // Pre-conditions + when(mDozeParameters.getAlwaysOn()).thenReturn(true); + when(mBiometricUnlockController.unlockedByWakeAndUnlock()).thenReturn(true); + + mDozeWallpaperState.transitionTo(DozeMachine.State.UNINITIALIZED, + DozeMachine.State.DOZE_AOD); + clearInvocations(mIWallpaperManager); + + mDozeWallpaperState.transitionTo(DozeMachine.State.DOZE_AOD, DozeMachine.State.FINISH); + verify(mIWallpaperManager).setInAmbientMode(eq(false), eq(0L)); + } + @Test public void testTransitionTo_requestPulseIsAmbientMode() throws RemoteException { mDozeWallpaperState.transitionTo(DozeMachine.State.DOZE, -- GitLab From 97bc3a29d8225c018b46659c36c4987cdb8ef04f Mon Sep 17 00:00:00 2001 From: Mathew Inwood Date: Mon, 24 Jun 2019 12:07:22 +0100 Subject: [PATCH 347/620] Compatibility API implementation for app processes. Pass the set of disabled changes from the system server into the app in the bindApplication() call. Use this to instantiate an implementation of Compatibility.Callbacks() to implement the API. Test: Manual. Bug: 135010838 Merged-In: I2fcf25264c62acc801f9e62967072cd04e4641e7 Change-Id: I2fcf25264c62acc801f9e62967072cd04e4641e7 --- core/java/android/app/ActivityThread.java | 7 +- core/java/android/app/AppCompatCallbacks.java | 64 +++++++++++++++++++ core/java/android/app/IApplicationThread.aidl | 2 +- .../content/res/CompatibilityInfo.java | 4 +- .../TransactionParcelTests.java | 3 +- .../server/am/ActivityManagerService.java | 8 ++- 6 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 core/java/android/app/AppCompatCallbacks.java diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 546f000159a0..9173e214cddd 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -790,6 +790,8 @@ public final class ActivityThread extends ClientTransactionHandler { @Nullable ContentCaptureOptions contentCaptureOptions; + long[] disabledCompatChanges; + @Override public String toString() { return "AppBindData{appInfo=" + appInfo + "}"; @@ -1002,7 +1004,7 @@ public final class ActivityThread extends ClientTransactionHandler { boolean isRestrictedBackupMode, boolean persistent, Configuration config, CompatibilityInfo compatInfo, Map services, Bundle coreSettings, String buildSerial, AutofillOptions autofillOptions, - ContentCaptureOptions contentCaptureOptions) { + ContentCaptureOptions contentCaptureOptions, long[] disabledCompatChanges) { if (services != null) { if (false) { // Test code to make sure the app could see the passed-in services. @@ -1050,6 +1052,7 @@ public final class ActivityThread extends ClientTransactionHandler { data.buildSerial = buildSerial; data.autofillOptions = autofillOptions; data.contentCaptureOptions = contentCaptureOptions; + data.disabledCompatChanges = disabledCompatChanges; sendMessage(H.BIND_APPLICATION, data); } @@ -6130,10 +6133,10 @@ public final class ActivityThread extends ClientTransactionHandler { if (data.trackAllocation) { DdmVmInternal.enableRecentAllocations(true); } - // Note when this process has started. Process.setStartTimes(SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); + AppCompatCallbacks.install(data.disabledCompatChanges); mBoundApplication = data; mConfiguration = new Configuration(data.config); mCompatConfiguration = new Configuration(data.config); diff --git a/core/java/android/app/AppCompatCallbacks.java b/core/java/android/app/AppCompatCallbacks.java new file mode 100644 index 000000000000..17697dba9ccd --- /dev/null +++ b/core/java/android/app/AppCompatCallbacks.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app; + +import android.compat.Compatibility; +import android.os.Process; +import android.util.Log; + +import java.util.Arrays; + +/** + * App process implementation of the {@link Compatibility} API. + * + * @hide + */ +public final class AppCompatCallbacks extends Compatibility.Callbacks { + + private static final String TAG = "Compatibility"; + + private final long[] mDisabledChanges; + + /** + * Install this class into the current process. + * + * @param disabledChanges Set of compatibility changes that are disabled for this process. + */ + public static void install(long[] disabledChanges) { + Compatibility.setCallbacks(new AppCompatCallbacks(disabledChanges)); + } + + private AppCompatCallbacks(long[] disabledChanges) { + mDisabledChanges = Arrays.copyOf(disabledChanges, disabledChanges.length); + Arrays.sort(mDisabledChanges); + } + + protected void reportChange(long changeId) { + Log.d(TAG, "Compat change reported: " + changeId + "; UID " + Process.myUid()); + // TODO log via StatsLog + } + + protected boolean isChangeEnabled(long changeId) { + if (Arrays.binarySearch(mDisabledChanges, changeId) < 0) { + // Not present in the disabled array + reportChange(changeId); + return true; + } + return false; + } + +} diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl index 66c438393bd6..cfa065ba5bc9 100644 --- a/core/java/android/app/IApplicationThread.aidl +++ b/core/java/android/app/IApplicationThread.aidl @@ -73,7 +73,7 @@ oneway interface IApplicationThread { boolean restrictedBackupMode, boolean persistent, in Configuration config, in CompatibilityInfo compatInfo, in Map services, in Bundle coreSettings, in String buildSerial, in AutofillOptions autofillOptions, - in ContentCaptureOptions contentCaptureOptions); + in ContentCaptureOptions contentCaptureOptions, in long[] disabledCompatChanges); void runIsolatedEntryPoint(in String entryPoint, in String[] entryPointArgs); void scheduleExit(); void scheduleServiceArgs(IBinder token, in ParceledListSlice args); diff --git a/core/java/android/content/res/CompatibilityInfo.java b/core/java/android/content/res/CompatibilityInfo.java index a99a0b5a7a90..f3b7553577ca 100644 --- a/core/java/android/content/res/CompatibilityInfo.java +++ b/core/java/android/content/res/CompatibilityInfo.java @@ -32,8 +32,8 @@ import android.view.WindowManager; import android.view.WindowManager.LayoutParams; /** - * CompatibilityInfo class keeps the information about compatibility mode that the application is - * running under. + * CompatibilityInfo class keeps the information about the screen compatibility mode that the + * application is running under. * * {@hide} */ diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java index d2b18cb0bcb8..51da0c871c4d 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java @@ -416,7 +416,8 @@ public class TransactionParcelTests { IUiAutomationConnection iUiAutomationConnection, int i, boolean b, boolean b1, boolean b2, boolean b3, Configuration configuration, CompatibilityInfo compatibilityInfo, Map map, Bundle bundle1, String s1, - AutofillOptions ao, ContentCaptureOptions co) throws RemoteException { + AutofillOptions ao, ContentCaptureOptions co, long[] disableCompatChanges) + throws RemoteException { } @Override diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 91ae156afdf5..e58fe6762b68 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -348,6 +348,7 @@ import com.android.server.ThreadPriorityBooster; import com.android.server.Watchdog; import com.android.server.am.ActivityManagerServiceDumpProcessesProto.UidObserverRegistrationProto; import com.android.server.appop.AppOpsService; +import com.android.server.compat.CompatConfig; import com.android.server.contentcapture.ContentCaptureManagerInternal; import com.android.server.firewall.IntentFirewall; import com.android.server.job.JobSchedulerInternal; @@ -5038,6 +5039,7 @@ public class ActivityManagerService extends IActivityManager.Stub bindApplicationTimeMillis = SystemClock.elapsedRealtime(); mAtmInternal.preBindApplication(app.getWindowProcessController()); final ActiveInstrumentation instr2 = app.getActiveInstrumentation(); + long[] disabledCompatChanges = CompatConfig.get().getDisabledChanges(app.info); if (app.isolatedEntryPoint != null) { // This is an isolated process which should just call an entry point instead of // being bound to an application. @@ -5053,7 +5055,8 @@ public class ActivityManagerService extends IActivityManager.Stub new Configuration(app.getWindowProcessController().getConfiguration()), app.compat, getCommonServicesLocked(app.isolated), mCoreSettingsObserver.getCoreSettingsLocked(), - buildSerial, autofillOptions, contentCaptureOptions); + buildSerial, autofillOptions, contentCaptureOptions, + disabledCompatChanges); } else { thread.bindApplication(processName, appInfo, providers, null, profilerInfo, null, null, null, testMode, @@ -5062,7 +5065,8 @@ public class ActivityManagerService extends IActivityManager.Stub new Configuration(app.getWindowProcessController().getConfiguration()), app.compat, getCommonServicesLocked(app.isolated), mCoreSettingsObserver.getCoreSettingsLocked(), - buildSerial, autofillOptions, contentCaptureOptions); + buildSerial, autofillOptions, contentCaptureOptions, + disabledCompatChanges); } if (profilerInfo != null) { profilerInfo.closeFd(); -- GitLab From f6e32f079dbf98bacc8eab7b70e60c062b972067 Mon Sep 17 00:00:00 2001 From: Robert Snoeberger Date: Wed, 17 Jul 2019 17:07:18 -0400 Subject: [PATCH 348/620] Pad indication text to prevent clipping on side of screen. Padding amount is the same as owner_info also shown on AOD screen. Bug: 137627803 Test: Checked that text with more than 100 characters shown in indication area wasn't clipped on side of screen. 100 characters was used because face_acquired_sensor_dirty string has char limit of 100. Change-Id: I1c4014b4cfbdc2bba84b9974813ca23e6b42cf4c --- packages/SystemUI/res/layout/keyguard_bottom_area.xml | 4 ++++ packages/SystemUI/res/values/dimens.xml | 3 +++ 2 files changed, 7 insertions(+) diff --git a/packages/SystemUI/res/layout/keyguard_bottom_area.xml b/packages/SystemUI/res/layout/keyguard_bottom_area.xml index 7fc2066c7176..21c2c6b879f8 100644 --- a/packages/SystemUI/res/layout/keyguard_bottom_area.xml +++ b/packages/SystemUI/res/layout/keyguard_bottom_area.xml @@ -46,6 +46,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" + android:paddingStart="@dimen/keyguard_indication_text_padding" + android:paddingEnd="@dimen/keyguard_indication_text_padding" android:textAppearance="@style/TextAppearance.Keyguard.BottomArea" android:visibility="gone" /> @@ -54,6 +56,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" + android:paddingStart="@dimen/keyguard_indication_text_padding" + android:paddingEnd="@dimen/keyguard_indication_text_padding" android:textAppearance="@style/TextAppearance.Keyguard.BottomArea" android:accessibilityLiveRegion="polite" /> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index afe6d9c2552b..aa25cf999636 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -183,6 +183,9 @@ 12sp + + 16dp + 5 -- GitLab From 036b140b39e3355745a067de15df1b85f7cd6795 Mon Sep 17 00:00:00 2001 From: Jimmy Chen Date: Thu, 18 Jul 2019 10:25:26 +0800 Subject: [PATCH 349/620] p2p: update documents about EXTRA_WIFI_P2P_GROUP in connection changed event This value may be a null, receiver should check before using variable. Bug: 137618950 Test: make docs Change-Id: If466dac092fc345482d0456f08a915d1e7ba0010 --- wifi/java/android/net/wifi/p2p/WifiP2pManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java index cd659e2a934a..d37c4a2e78db 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java @@ -190,7 +190,7 @@ public class WifiP2pManager { * has changed. One extra {@link #EXTRA_WIFI_P2P_INFO} provides the p2p connection info in * the form of a {@link WifiP2pInfo} object. Another extra {@link #EXTRA_NETWORK_INFO} provides * the network info in the form of a {@link android.net.NetworkInfo}. A third extra provides - * the details of the group. + * the details of the group and may contain a {@code null}. * * All of these permissions are required to receive this broadcast: * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and -- GitLab From be2b0a71d73ea66426c1e4585520c386939388f2 Mon Sep 17 00:00:00 2001 From: Mathew Inwood Date: Mon, 24 Jun 2019 12:07:22 +0100 Subject: [PATCH 350/620] Compatibility API implementation for app processes. Pass the set of disabled changes from the system server into the app in the bindApplication() call. Use this to instantiate an implementation of Compatibility.Callbacks() to implement the API. Test: Manual. Bug: 135010838 Merged-In: I2fcf25264c62acc801f9e62967072cd04e4641e7 Change-Id: I2fcf25264c62acc801f9e62967072cd04e4641e7 --- core/java/android/app/ActivityThread.java | 7 +- core/java/android/app/AppCompatCallbacks.java | 64 +++++++++++++++++++ core/java/android/app/IApplicationThread.aidl | 2 +- .../content/res/CompatibilityInfo.java | 4 +- .../TransactionParcelTests.java | 3 +- .../server/am/ActivityManagerService.java | 8 ++- 6 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 core/java/android/app/AppCompatCallbacks.java diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 546f000159a0..9173e214cddd 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -790,6 +790,8 @@ public final class ActivityThread extends ClientTransactionHandler { @Nullable ContentCaptureOptions contentCaptureOptions; + long[] disabledCompatChanges; + @Override public String toString() { return "AppBindData{appInfo=" + appInfo + "}"; @@ -1002,7 +1004,7 @@ public final class ActivityThread extends ClientTransactionHandler { boolean isRestrictedBackupMode, boolean persistent, Configuration config, CompatibilityInfo compatInfo, Map services, Bundle coreSettings, String buildSerial, AutofillOptions autofillOptions, - ContentCaptureOptions contentCaptureOptions) { + ContentCaptureOptions contentCaptureOptions, long[] disabledCompatChanges) { if (services != null) { if (false) { // Test code to make sure the app could see the passed-in services. @@ -1050,6 +1052,7 @@ public final class ActivityThread extends ClientTransactionHandler { data.buildSerial = buildSerial; data.autofillOptions = autofillOptions; data.contentCaptureOptions = contentCaptureOptions; + data.disabledCompatChanges = disabledCompatChanges; sendMessage(H.BIND_APPLICATION, data); } @@ -6130,10 +6133,10 @@ public final class ActivityThread extends ClientTransactionHandler { if (data.trackAllocation) { DdmVmInternal.enableRecentAllocations(true); } - // Note when this process has started. Process.setStartTimes(SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); + AppCompatCallbacks.install(data.disabledCompatChanges); mBoundApplication = data; mConfiguration = new Configuration(data.config); mCompatConfiguration = new Configuration(data.config); diff --git a/core/java/android/app/AppCompatCallbacks.java b/core/java/android/app/AppCompatCallbacks.java new file mode 100644 index 000000000000..17697dba9ccd --- /dev/null +++ b/core/java/android/app/AppCompatCallbacks.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app; + +import android.compat.Compatibility; +import android.os.Process; +import android.util.Log; + +import java.util.Arrays; + +/** + * App process implementation of the {@link Compatibility} API. + * + * @hide + */ +public final class AppCompatCallbacks extends Compatibility.Callbacks { + + private static final String TAG = "Compatibility"; + + private final long[] mDisabledChanges; + + /** + * Install this class into the current process. + * + * @param disabledChanges Set of compatibility changes that are disabled for this process. + */ + public static void install(long[] disabledChanges) { + Compatibility.setCallbacks(new AppCompatCallbacks(disabledChanges)); + } + + private AppCompatCallbacks(long[] disabledChanges) { + mDisabledChanges = Arrays.copyOf(disabledChanges, disabledChanges.length); + Arrays.sort(mDisabledChanges); + } + + protected void reportChange(long changeId) { + Log.d(TAG, "Compat change reported: " + changeId + "; UID " + Process.myUid()); + // TODO log via StatsLog + } + + protected boolean isChangeEnabled(long changeId) { + if (Arrays.binarySearch(mDisabledChanges, changeId) < 0) { + // Not present in the disabled array + reportChange(changeId); + return true; + } + return false; + } + +} diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl index 66c438393bd6..cfa065ba5bc9 100644 --- a/core/java/android/app/IApplicationThread.aidl +++ b/core/java/android/app/IApplicationThread.aidl @@ -73,7 +73,7 @@ oneway interface IApplicationThread { boolean restrictedBackupMode, boolean persistent, in Configuration config, in CompatibilityInfo compatInfo, in Map services, in Bundle coreSettings, in String buildSerial, in AutofillOptions autofillOptions, - in ContentCaptureOptions contentCaptureOptions); + in ContentCaptureOptions contentCaptureOptions, in long[] disabledCompatChanges); void runIsolatedEntryPoint(in String entryPoint, in String[] entryPointArgs); void scheduleExit(); void scheduleServiceArgs(IBinder token, in ParceledListSlice args); diff --git a/core/java/android/content/res/CompatibilityInfo.java b/core/java/android/content/res/CompatibilityInfo.java index a99a0b5a7a90..f3b7553577ca 100644 --- a/core/java/android/content/res/CompatibilityInfo.java +++ b/core/java/android/content/res/CompatibilityInfo.java @@ -32,8 +32,8 @@ import android.view.WindowManager; import android.view.WindowManager.LayoutParams; /** - * CompatibilityInfo class keeps the information about compatibility mode that the application is - * running under. + * CompatibilityInfo class keeps the information about the screen compatibility mode that the + * application is running under. * * {@hide} */ diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java index d2b18cb0bcb8..51da0c871c4d 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java @@ -416,7 +416,8 @@ public class TransactionParcelTests { IUiAutomationConnection iUiAutomationConnection, int i, boolean b, boolean b1, boolean b2, boolean b3, Configuration configuration, CompatibilityInfo compatibilityInfo, Map map, Bundle bundle1, String s1, - AutofillOptions ao, ContentCaptureOptions co) throws RemoteException { + AutofillOptions ao, ContentCaptureOptions co, long[] disableCompatChanges) + throws RemoteException { } @Override diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 91ae156afdf5..e58fe6762b68 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -348,6 +348,7 @@ import com.android.server.ThreadPriorityBooster; import com.android.server.Watchdog; import com.android.server.am.ActivityManagerServiceDumpProcessesProto.UidObserverRegistrationProto; import com.android.server.appop.AppOpsService; +import com.android.server.compat.CompatConfig; import com.android.server.contentcapture.ContentCaptureManagerInternal; import com.android.server.firewall.IntentFirewall; import com.android.server.job.JobSchedulerInternal; @@ -5038,6 +5039,7 @@ public class ActivityManagerService extends IActivityManager.Stub bindApplicationTimeMillis = SystemClock.elapsedRealtime(); mAtmInternal.preBindApplication(app.getWindowProcessController()); final ActiveInstrumentation instr2 = app.getActiveInstrumentation(); + long[] disabledCompatChanges = CompatConfig.get().getDisabledChanges(app.info); if (app.isolatedEntryPoint != null) { // This is an isolated process which should just call an entry point instead of // being bound to an application. @@ -5053,7 +5055,8 @@ public class ActivityManagerService extends IActivityManager.Stub new Configuration(app.getWindowProcessController().getConfiguration()), app.compat, getCommonServicesLocked(app.isolated), mCoreSettingsObserver.getCoreSettingsLocked(), - buildSerial, autofillOptions, contentCaptureOptions); + buildSerial, autofillOptions, contentCaptureOptions, + disabledCompatChanges); } else { thread.bindApplication(processName, appInfo, providers, null, profilerInfo, null, null, null, testMode, @@ -5062,7 +5065,8 @@ public class ActivityManagerService extends IActivityManager.Stub new Configuration(app.getWindowProcessController().getConfiguration()), app.compat, getCommonServicesLocked(app.isolated), mCoreSettingsObserver.getCoreSettingsLocked(), - buildSerial, autofillOptions, contentCaptureOptions); + buildSerial, autofillOptions, contentCaptureOptions, + disabledCompatChanges); } if (profilerInfo != null) { profilerInfo.closeFd(); -- GitLab From 3f333d6d72fd2d91a68b2fd1fd2ca28291e6b1d9 Mon Sep 17 00:00:00 2001 From: John Reck Date: Wed, 17 Jul 2019 11:12:32 -0700 Subject: [PATCH 351/620] Increase dequeueBuffer timeout Timeout recovery isn't working properly, so increase it to avoid any false-positives from something like a slow screen-on Bug: 137509524 Test: none Change-Id: Ic4fae04b41f71600479f9557e334f67c27851db4 --- libs/hwui/renderthread/CanvasContext.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index f326ce8d23e9..9898a1c30856 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -148,7 +148,8 @@ void CanvasContext::setSurface(sp&& surface) { if (surface) { mNativeSurface = new ReliableSurface{std::move(surface)}; - mNativeSurface->setDequeueTimeout(500_ms); + // TODO: Fix error handling & re-shorten timeout + mNativeSurface->setDequeueTimeout(4000_ms); } else { mNativeSurface = nullptr; } -- GitLab From c0b0c34fb056706bca566c2be20eaafd8da5e685 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 18 Jul 2019 11:30:29 -0700 Subject: [PATCH 352/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I10856a2e242d1c493f514e67884d26e4fd057447 --- core/res/res/values-de/strings.xml | 2 +- core/res/res/values-gl/strings.xml | 2 +- core/res/res/values-hy/strings.xml | 2 +- core/res/res/values-zh-rHK/strings.xml | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 88e046a68800..9c6fc1631956 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -428,7 +428,7 @@ "Diese App kann jederzeit Audio über das Mikrofon aufnehmen." "Befehle an die SIM senden" "Ermöglicht der App das Senden von Befehlen an die SIM-Karte. Dies ist äußerst risikoreich." - "körperlichen Aktivitäten erkennen" + "Körperliche Aktivitäten erkennen" "Diese App kann deine körperliche Aktivität erkennen." "Bilder und Videos aufnehmen" "Diese App kann mit der Kamera jederzeit Bilder und Videos aufnehmen." diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 74722bbe767e..7b70ea931f7a 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -1984,7 +1984,7 @@ "DESINSTALAR" "ABRIR IGUALMENTE" "Detectouse unha aplicación daniña" - "A aplicación %1$s quere mostrar partes de %2$s" + "%1$s quere mostrar fragmentos de aplicación de %2$s" "Editar" "As chamadas e as notificacións vibrarán" "As chamadas e as notificacións estarán silenciadas" diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index a7a91635d3b1..47e7e10b22fc 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -1613,7 +1613,7 @@ "Ներկառուցված էկրան" "HDMI էկրան" "Վերածածկ #%1$d" - "%1$s. %2$dx%3$d, %4$d կմվ" + "%1$s. %2$dx%3$d, %4$d կմչ" ", անվտանգ" "Մոռացել եմ սխեման" "Սխալ սխեմա" diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index bf9d0cc070b2..66c89e87d598 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -817,7 +817,7 @@ "再試一次" "再試一次" "解鎖即可使用所有功能和資料" - "已超過臉容解鎖嘗試次數上限" + "已超過臉孔解鎖嘗試次數上限" "找不到 SIM 卡" "平板電腦中沒有 SIM 卡。" "電視沒有 SIM 卡。" @@ -887,7 +887,7 @@ "展開解鎖區域。" "滑動解鎖。" "圖案解鎖。" - "臉容解鎖。" + "臉孔解鎖。" "PIN 解鎖。" "SIM 卡 PIN 碼解鎖。" "SIM 卡 PUK 解鎖。" -- GitLab From a67f9d5d976f65c78b3ce469626a535d880a46ea Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 18 Jul 2019 11:31:21 -0700 Subject: [PATCH 353/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: Ib95137b7ade70cbb7184e3d0a7f004fc759bc064 --- packages/SystemUI/res/values-fr/strings.xml | 2 +- packages/SystemUI/res/values-gl/strings.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 75e84d322efc..60ff38f9cf6e 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -375,7 +375,7 @@ "Jusqu\'à l\'aube" "À partir de %s" "Jusqu\'à %s" - "Thème foncé" + "Thème sombre" "Thème foncé\nÉconomiseur de batterie" "NFC" "La technologie NFC est désactivée" diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index f42c14f2fea0..b3e0fa5d746b 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -893,10 +893,10 @@ "Non terás acceso aos datos nin a Internet a través de %s. Internet só estará dispoñible mediante a wifi." "o teu operador" "Dado que unha aplicación se superpón sobre unha solicitude de permiso, a configuración non pode verificar a túa resposta." - "Queres permitir que a aplicación %1$s mostre partes de %2$s?" + "Queres permitir que %1$s mostre fragmentos de aplicación de %2$s?" "- Pode ler información da aplicación %1$s" "- Pode levar a cabo accións dentro da aplicación %1$s" - "Permitir que a aplicación %1$s mostre partes de calquera aplicación" + "Permitir que %1$s mostre fragmentos de calquera aplicación" "Permitir" "Denegar" "Tocar para programar a función Aforro de batería" -- GitLab From 38db5e126d16b252a07d815e986f6cf8cf43566d Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 18 Jul 2019 11:34:15 -0700 Subject: [PATCH 354/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I2b42edaa4a1dc95fefdc4f7ebabf528551b03460 --- core/res/res/values-de/strings.xml | 2 +- core/res/res/values-gl/strings.xml | 2 +- core/res/res/values-hy/strings.xml | 2 +- core/res/res/values-zh-rHK/strings.xml | 22 +++++++++++----------- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 1ab77ccf66ef..754b01965ed2 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -428,7 +428,7 @@ "Diese App kann jederzeit Audio über das Mikrofon aufnehmen." "Befehle an die SIM senden" "Ermöglicht der App das Senden von Befehlen an die SIM-Karte. Dies ist äußerst risikoreich." - "körperlichen Aktivitäten erkennen" + "Körperliche Aktivitäten erkennen" "Diese App kann deine körperliche Aktivität erkennen." "Bilder und Videos aufnehmen" "Diese App kann mit der Kamera jederzeit Bilder und Videos aufnehmen." diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 4c8cc64d7067..7a1b2659f4a2 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -1984,7 +1984,7 @@ "DESINSTALAR" "ABRIR IGUALMENTE" "Detectouse unha aplicación daniña" - "A aplicación %1$s quere mostrar partes de %2$s" + "%1$s quere mostrar fragmentos de aplicación de %2$s" "Editar" "As chamadas e as notificacións vibrarán" "As chamadas e as notificacións estarán silenciadas" diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index c615356f020d..3377d3b48785 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -1613,7 +1613,7 @@ "Ներկառուցված էկրան" "HDMI էկրան" "Վերածածկ #%1$d" - "%1$s. %2$dx%3$d, %4$d կմվ" + "%1$s. %2$dx%3$d, %4$d կմչ" ", անվտանգ" "Մոռացել եմ սխեման" "Սխալ սխեմա" diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 42b790087e1d..cce909a4e031 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -550,11 +550,11 @@ "指紋圖示" - "管理臉容解鎖硬件" + "管理臉孔解鎖硬件" "允許應用程式調用方法,以加入和刪除可用的臉孔範本。" - "使用臉容解鎖硬件" - "允許應用程式使用臉容解鎖硬件來驗證" - "臉容解鎖" + "使用臉孔解鎖硬件" + "允許應用程式使用臉孔解鎖硬件來驗證" + "臉孔解鎖" "重新註冊臉孔" "如要提高識別能力,請重新註冊您的臉孔" "無法擷取準確的臉容資料。請再試一次。" @@ -580,15 +580,15 @@ "無法驗證臉孔,硬件無法使用。" - "請再次嘗試「臉容解鎖」。" + "請再次嘗試「臉孔解鎖」。" "無法儲存新的臉容資料,請先刪除舊資料。" "臉孔操作已取消。" - "使用者已取消「臉容解鎖」。" + "使用者已取消「臉孔解鎖」。" "嘗試次數過多,請稍後再試。" - "嘗試次數過多,「臉容解鎖」已停用。" + "嘗試次數過多,「臉孔解鎖」已停用。" "無法驗證臉孔。請再試一次。" - "您尚未設定「臉容解鎖」。" - "此裝置不支援「臉容解鎖」。" + "您尚未設定「臉孔解鎖」。" + "此裝置不支援「臉孔解鎖」。" "臉孔 %d" @@ -817,7 +817,7 @@ "再試一次" "再試一次" "解鎖即可使用所有功能和資料" - "已超過臉容解鎖嘗試次數上限" + "已超過臉孔解鎖嘗試次數上限" "找不到 SIM 卡" "平板電腦中沒有 SIM 卡。" "電視沒有 SIM 卡。" @@ -887,7 +887,7 @@ "展開解鎖區域。" "滑動解鎖。" "圖案解鎖。" - "臉容解鎖。" + "臉孔解鎖。" "PIN 解鎖。" "SIM 卡 PIN 碼解鎖。" "SIM 卡 PUK 解鎖。" -- GitLab From eabca8763570c5c99ea507799ad2135ff1e9d8a3 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 18 Jul 2019 11:37:02 -0700 Subject: [PATCH 355/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I7d11de6106b6326b0fcb95fa642faaff6b870371 --- packages/SystemUI/res/values-fr/strings.xml | 2 +- packages/SystemUI/res/values-gl/strings.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index b25f2fcbdbdd..75a76ae66093 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -376,7 +376,7 @@ "Jusqu\'à l\'aube" "À partir de %s" "Jusqu\'à %s" - "Thème foncé" + "Thème sombre" "Thème foncé\nÉconomiseur de batterie" "NFC" "La technologie NFC est désactivée" diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 1a914e097655..3268ed06ff56 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -894,10 +894,10 @@ "Non terás acceso aos datos nin a Internet a través de %s. Internet só estará dispoñible mediante a wifi." "o teu operador" "Dado que unha aplicación se superpón sobre unha solicitude de permiso, a configuración non pode verificar a túa resposta." - "Queres permitir que a aplicación %1$s mostre partes de %2$s?" + "Queres permitir que %1$s mostre fragmentos de aplicación de %2$s?" "- Pode ler información da aplicación %1$s" "- Pode levar a cabo accións dentro da aplicación %1$s" - "Permitir que a aplicación %1$s mostre partes de calquera aplicación" + "Permitir que %1$s mostre fragmentos de calquera aplicación" "Permitir" "Denegar" "Tocar para programar a función Aforro de batería" -- GitLab From e71346fa0ab70ebf707cd6fac55f1788b77310f8 Mon Sep 17 00:00:00 2001 From: Kevin Hufnagle Date: Thu, 18 Jul 2019 12:50:31 -0700 Subject: [PATCH 356/620] docs: Fixed link in setCurrentTab() description Moving focus and selected tab requires focusCurrentTab(), not setCurrentTab(). Test: make ds-docs Bug: 137317608 Change-Id: I96f4f4c32cbf8a3dfa0aac8cfa6d6cd12e8f8259 --- core/java/android/widget/TabWidget.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/widget/TabWidget.java b/core/java/android/widget/TabWidget.java index 49a0f39b3bad..4c67b080252a 100644 --- a/core/java/android/widget/TabWidget.java +++ b/core/java/android/widget/TabWidget.java @@ -433,7 +433,7 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener { * to the next tabbed view, in this example). *

* To move both the focus AND the selected tab at once, please use - * {@link #setCurrentTab}. Normally, the view logic takes care of + * {@link #focusCurrentTab}. Normally, the view logic takes care of * adjusting the focus, so unless you're circumventing the UI, * you'll probably just focus your interest here. * -- GitLab From b0becb2325ba9132ab86c3269583ab1386297ef3 Mon Sep 17 00:00:00 2001 From: Kevin Hufnagle Date: Thu, 18 Jul 2019 20:20:32 +0000 Subject: [PATCH 357/620] docs: Fixed typo in SERVICE_META_DATA Test: make ds-docs Bug: 137267707 Change-Id: I3f38362f028866f55b9009b6a0de15dcbcb96e0c --- .../java/android/accessibilityservice/AccessibilityService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index cebe6e1211e0..90b80e73c323 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -309,7 +309,7 @@ public abstract class AccessibilityService extends Service { * Name under which an AccessibilityService component publishes information * about itself. This meta-data must reference an XML resource containing an * <{@link android.R.styleable#AccessibilityService accessibility-service}> - * tag. This is a a sample XML file configuring an accessibility service: + * tag. This is a sample XML file configuring an accessibility service: *

 <accessibility-service
      *     android:accessibilityEventTypes="typeViewClicked|typeViewFocused"
      *     android:packageNames="foo.bar, foo.baz"
-- 
GitLab


From 0cbfc85ef7de8942bb44684acf90bdcd1899a2a2 Mon Sep 17 00:00:00 2001
From: Nick Cook 
Date: Thu, 18 Jul 2019 20:34:32 +0000
Subject: [PATCH 358/620] docs: Fix broken link.

Test: make ds-docs

Bug: 79729313
Change-Id: I3f7b90457e9127380f2b8cbaf0f958823ba5488e
---
 core/java/android/widget/ArrayAdapter.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core/java/android/widget/ArrayAdapter.java b/core/java/android/widget/ArrayAdapter.java
index c3c2c0db9a77..2bf1ba5cf017 100644
--- a/core/java/android/widget/ArrayAdapter.java
+++ b/core/java/android/widget/ArrayAdapter.java
@@ -50,7 +50,7 @@ import java.util.List;
  * override {@link #getView(int, View, ViewGroup)}
  * and inflate a view resource.
  * For a code example, see
- * the 
+ * the 
  * CustomChoiceList sample.
  * 

*

-- GitLab From 2e312791d6a4da2bb543f7dbbc98a37a32029717 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Thu, 18 Jul 2019 13:37:23 -0700 Subject: [PATCH 359/620] Biometric HAL death should invoke handleError on the handler All client lifecycle is modified on the handler. When the HAL dies, serviceDied comes in on the main thread and will race with the rest of client lifecycle manipulation. We need to guarantee this is in order, otherwise it's possible for BiometricService to receive the following order of events 1) BiometricService requests auth 2) Face/FingerprintService is ready to start auth 3) HAL dies in the middle of 2), and sends onError to BiometricService 4) onReadyForAuthentication is sent to BiometricService, causing NPE With this change, it will guarantee that 3) occurs after 4), which will avoid A) BiometricService receiving events out of order, and more importantly B) allow BiometricPrompt to show the HW_UNAVAILABLE error instead of crashing system server. Fixes: 137800315 Test: Authentication with BiometricPromptDemo while killing the HAL Change-Id: Iae2d5b39dd494123f274b47edcc44c3afc1fff8c --- .../android/server/biometrics/BiometricServiceBase.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java index f08423eb2016..20eb6180832c 100644 --- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java +++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java @@ -665,8 +665,12 @@ public abstract class BiometricServiceBase extends SystemService mMetricsLogger.count(getConstants().tagHalDied(), 1); mHALDeathCount++; mCurrentUserId = UserHandle.USER_NULL; - handleError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE, - 0 /*vendorCode */); + + // All client lifecycle must be managed on the handler. + mHandler.post(() -> { + handleError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE, + 0 /*vendorCode */); + }); StatsLog.write(StatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED, statsModality(), BiometricsProtoEnums.ISSUE_HAL_DEATH); -- GitLab From e0fd9ab53b394b4683f87de4803218f3620ff45d Mon Sep 17 00:00:00 2001 From: Kevin Hufnagle Date: Thu, 18 Jul 2019 14:00:07 -0700 Subject: [PATCH 360/620] docs: Added protection level to permissions All permissions that are suitable for use by third-party apps and aren't deprecated now contain a paragraph in their descriptions that lists the protection level for a given permission, such as: Protection level: signature|privileged Test: make ds-docs Bug: 137260540 Change-Id: I45eada81bf4aa83480ff2e701a9e0e9932b66b88 --- core/res/AndroidManifest.xml | 46 +++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index a3fccd96f224..e238e1d0c03f 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -859,7 +859,7 @@ meaning that the whitelist state can be specified only at install time and cannot change until the app is installed. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. - --> +

Protection level: dangerous --> Is this permission is not whitelisted for an app that targets an API level before +

If this permission is not whitelisted for an app that targets an API level before {@link android.os.Build.VERSION_CODES#Q} this permission cannot be granted to apps.

+

Protection level: dangerous

--> + user's shared collection. +

Protection level: dangerous --> +

Not for use by third-party applications. --> @@ -2561,7 +2563,8 @@ android:protectionLevel="signature" /> + as locale. +

Protection level: signature|privileged|development --> @@ -2860,7 +2863,8 @@ - + @@ -3439,7 +3443,8 @@ android:protectionLevel="signature" /> + but signals for us to quietly ignore calls instead of throwing an exception. +

Protection level: signature|privileged --> @@ -3797,7 +3802,8 @@ + device can grant permission through the Settings application. +

Protection level: signature|privileged|development|appop --> @@ -3820,14 +3826,14 @@ +

Protection level: normal --> - + @@ -3857,7 +3863,8 @@ android:protectionLevel="signature" /> + to ensure that only the system can bind to it. +

Protection level: signature|privileged --> @@ -3899,7 +3906,8 @@ to the path in the provider where global search queries are performed. This permission can not be held by regular applications; it is used by applications to protect themselves from everyone else - besides global search. --> + besides global search. +

Protection level: signature|privileged --> @@ -4438,7 +4446,8 @@ - + @@ -4508,7 +4517,8 @@ - + @@ -4540,13 +4550,15 @@ - + + intents}. +

Protection level: normal --> -- GitLab From d65aafc748a1b424f3d6b7608dd8487ae20cdaff Mon Sep 17 00:00:00 2001 From: Taesu Lee Date: Tue, 28 May 2019 19:05:06 +0900 Subject: [PATCH 361/620] Added the min match system config for loose phone numbers comparison Specific min match is required for each country. Test: atest PhoneNumberUtilsTest Change-Id: I7f9e9ad824d44f2ebf8367beb6ec337e3eb3a8ad Merged-In: I7f9e9ad824d44f2ebf8367beb6ec337e3eb3a8ad Signed-off-by: Taesu Lee Bug:134246556 --- api/test-current.txt | 5 ++ core/res/res/values/config.xml | 3 + core/res/res/values/symbols.xml | 1 + .../android/telephony/PhoneNumberUtils.java | 62 +++++++++++-------- 4 files changed, 45 insertions(+), 26 deletions(-) diff --git a/api/test-current.txt b/api/test-current.txt index acc1b4a7cac6..e8e27cb93427 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -2847,6 +2847,11 @@ package android.telephony { method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setTransportType(int); } + public class PhoneNumberUtils { + method public static int getMinMatchForTest(); + method public static void setMinMatchForTest(int); + } + public class ServiceState implements android.os.Parcelable { method public void addNetworkRegistrationInfo(android.telephony.NetworkRegistrationInfo); method public void setCdmaSystemAndNetworkId(int, int); diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 9a642add609e..f92a58ad471e 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1285,6 +1285,9 @@ true + + 7 + 5 diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 0367c279a77e..414751169e96 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -320,6 +320,7 @@ + diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java index b75e51577fdb..f03a9dc0f963 100644 --- a/telephony/java/android/telephony/PhoneNumberUtils.java +++ b/telephony/java/android/telephony/PhoneNumberUtils.java @@ -22,9 +22,11 @@ import com.android.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat; import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber; import android.annotation.IntDef; +import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.Intent; +import android.content.res.Resources; import android.database.Cursor; import android.location.CountryDetector; import android.net.Uri; @@ -164,6 +166,33 @@ public class PhoneNumberUtils { return c == 'w'||c == 'W'; } + private static int sMinMatch = 0; + + private static int getMinMatch() { + if (sMinMatch == 0) { + sMinMatch = Resources.getSystem().getInteger( + com.android.internal.R.integer.config_phonenumber_compare_min_match); + } + return sMinMatch; + } + + /** + * A Test API to get current sMinMatch. + * @hide + */ + @TestApi + public static int getMinMatchForTest() { + return getMinMatch(); + } + + /** + * A Test API to set sMinMatch. + * @hide + */ + @TestApi + public static void setMinMatchForTest(int minMatch) { + sMinMatch = minMatch; + } /** Returns true if ch is not dialable or alpha char */ private static boolean isSeparator(char ch) { @@ -475,7 +504,7 @@ public class PhoneNumberUtils { * enough for caller ID purposes. * * - Compares from right to left - * - requires MIN_MATCH (7) characters to match + * - requires minimum characters to match * - handles common trunk prefixes and international prefixes * (basically, everything except the Russian trunk prefix) * @@ -491,6 +520,7 @@ public class PhoneNumberUtils { int matched; int numNonDialableCharsInA = 0; int numNonDialableCharsInB = 0; + int minMatch = getMinMatch(); if (a == null || b == null) return a == b; @@ -530,12 +560,12 @@ public class PhoneNumberUtils { } } - if (matched < MIN_MATCH) { + if (matched < minMatch) { int effectiveALen = a.length() - numNonDialableCharsInA; int effectiveBLen = b.length() - numNonDialableCharsInB; - // if the number of dialable chars in a and b match, but the matched chars < MIN_MATCH, + // if the number of dialable chars in a and b match, but the matched chars < minMatch, // treat them as equal (i.e. 404-04 and 40404) if (effectiveALen == effectiveBLen && effectiveALen == matched) { return true; @@ -545,7 +575,7 @@ public class PhoneNumberUtils { } // At least one string has matched completely; - if (matched >= MIN_MATCH && (ia < 0 || ib < 0)) { + if (matched >= minMatch && (ia < 0 || ib < 0)) { return true; } @@ -736,7 +766,7 @@ public class PhoneNumberUtils { } /** - * Returns the rightmost MIN_MATCH (5) characters in the network portion + * Returns the rightmost minimum matched characters in the network portion * in *reversed* order * * This can be used to do a database lookup against the column @@ -747,7 +777,7 @@ public class PhoneNumberUtils { public static String toCallerIDMinMatch(String phoneNumber) { String np = extractNetworkPortionAlt(phoneNumber); - return internalGetStrippedReversed(np, MIN_MATCH); + return internalGetStrippedReversed(np, getMinMatch()); } /** @@ -1709,26 +1739,6 @@ public class PhoneNumberUtils { return normalizedDigits.toString(); } - // Three and four digit phone numbers for either special services, - // or 3-6 digit addresses from the network (eg carrier-originated SMS messages) should - // not match. - // - // This constant used to be 5, but SMS short codes has increased in length and - // can be easily 6 digits now days. Most countries have SMS short code length between - // 3 to 6 digits. The exceptions are - // - // Australia: Short codes are six or eight digits in length, starting with the prefix "19" - // followed by an additional four or six digits and two. - // Czechia: Codes are seven digits in length for MO and five (not billed) or - // eight (billed) for MT direction - // - // see http://en.wikipedia.org/wiki/Short_code#Regional_differences for reference - // - // However, in order to loose match 650-555-1212 and 555-1212, we need to set the min match - // to 7. - @UnsupportedAppUsage - static final int MIN_MATCH = 7; - /** * Checks a given number against the list of * emergency numbers provided by the RIL and SIM card. -- GitLab From 8f3f03f1bfee3e4fe5e38e503285f3b23731c834 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Thu, 18 Jul 2019 14:19:54 -0700 Subject: [PATCH 362/620] Fixed an issue where heads up notifications would overlap We recently fixed the logic where notifications are being displayed if multiple huns are showing, however we were not clipping to them. We're now clipping heads up notifications as well by the clipTopAmount Fixes: 136914021 Test: add two different sized HUNS, so weird overlap. Change-Id: I68a4c373eff3952b1a4711858c9ce61684f6ff17 --- .../notification/stack/SectionHeaderView.java | 5 +++++ .../notification/stack/StackScrollAlgorithm.java | 15 ++++++--------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/SectionHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/SectionHeaderView.java index cc1170f7409b..b444fa50a253 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/SectionHeaderView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/SectionHeaderView.java @@ -83,6 +83,11 @@ public class SectionHeaderView extends ActivatableNotificationView { bindContents(); } + @Override + public boolean isTransparent() { + return true; + } + /** Must be called whenever the UI mode changes (i.e. when we enter night mode). */ void onUiModeChanged() { updateBackgroundColors(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index 01e2b28600db..7655056ea60b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -159,15 +159,13 @@ public class StackScrollAlgorithm { float drawStart = !ambientState.isOnKeyguard() ? ambientState.getTopPadding() + ambientState.getStackTranslation() + ambientState.getExpandAnimationTopChange() : 0; - float previousNotificationEnd = 0; - float previousNotificationStart = 0; + float clipStart = 0; int childCount = algorithmState.visibleChildren.size(); for (int i = 0; i < childCount; i++) { ExpandableView child = algorithmState.visibleChildren.get(i); ExpandableViewState state = child.getViewState(); if (!child.mustStayOnScreen() || state.headsUpIsVisible) { - previousNotificationEnd = Math.max(drawStart, previousNotificationEnd); - previousNotificationStart = Math.max(drawStart, previousNotificationStart); + clipStart = Math.max(drawStart, clipStart); } float newYTranslation = state.yTranslation; float newHeight = state.height; @@ -175,10 +173,10 @@ public class StackScrollAlgorithm { boolean isHeadsUp = (child instanceof ExpandableNotificationRow) && ((ExpandableNotificationRow) child).isPinned(); if (mClipNotificationScrollToTop - && !state.inShelf && newYTranslation < previousNotificationEnd - && (!isHeadsUp || ambientState.isShadeExpanded())) { + && (!state.inShelf || isHeadsUp) + && newYTranslation < clipStart) { // The previous view is overlapping on top, clip! - float overlapAmount = previousNotificationEnd - newYTranslation; + float overlapAmount = clipStart - newYTranslation; state.clipTopAmount = (int) overlapAmount; } else { state.clipTopAmount = 0; @@ -187,8 +185,7 @@ public class StackScrollAlgorithm { if (!child.isTransparent()) { // Only update the previous values if we are not transparent, // otherwise we would clip to a transparent view. - previousNotificationEnd = newNotificationEnd; - previousNotificationStart = newYTranslation; + clipStart = Math.max(clipStart, isHeadsUp ? newYTranslation : newNotificationEnd); } } } -- GitLab From 1b80884e03c7df7337f47a2ecb64e5984aa0ac32 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Thu, 18 Jul 2019 17:20:11 -0400 Subject: [PATCH 363/620] Allow BrightLineFalsingManager settings to be experimented with via Phenotype. This also ensures that the FalsingManagerProxy cleans up its internal instance whenever a Phenotype flag changes. Bug: 71762354 Test: atest SystemUITests Change-Id: I9fa4d1344bb184dea00f92f8d265667f0be11466 --- .../sysui/SystemUiDeviceConfigFlags.java | 83 +++++++++++++++++++ .../classifier/FalsingManagerProxy.java | 4 + .../brightline/DiagonalClassifier.java | 24 +++++- .../brightline/DistanceClassifier.java | 65 ++++++++++++--- .../brightline/ProximityClassifier.java | 12 ++- .../brightline/ZigZagClassifier.java | 40 ++++++++- .../classifier/FalsingManagerProxyTest.java | 3 + 7 files changed, 208 insertions(+), 23 deletions(-) diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 55e21a4774d9..e91a0eac1264 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -191,6 +191,89 @@ public final class SystemUiDeviceConfigFlags { */ public static final String BRIGHTLINE_FALSING_MANAGER_ENABLED = "brightline_falsing_manager_enabled"; + /** + * (float) Maximum fraction of the screen required to qualify as a real swipe. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_SCREEN_FRACTION_MAX_DISTANCE = + "brightline_falsing_distance_screen_fraction_max_distance"; + + /** + * (float) Multiplier for swipe velocity to convert it to pixels for a fling. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_VELOCITY_TO_DISTANCE = + "brightline_falsing_distance_velcoity_to_distance"; + + /** + * (float) How far, in inches, must a fling travel horizontally to qualify as intentional. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_FLING_THRESHOLD_IN = + "brightline_falsing_distance_horizontal_fling_threshold_in"; + + /** + * (float) Maximum fraction of the screen required to qualify as a real swipe. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_VERTICAL_FLING_THRESHOLD_IN = + "brightline_falsing_distance_vertical_fling_threshold_in"; + + /** + * (float) How far, in inches, must a continuous swipe travel horizontally to be intentional. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_SWIPE_THRESHOLD_IN = + "brightline_falsing_distance_horizontal_swipe_threshold_in"; + + /** + * (float) How far, in inches, must a continuous swipe travel vertically to be intentional. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_VERTICAL_SWIPE_THRESHOLD_IN = + "brightline_falsing_distance_horizontal_swipe_threshold_in"; + + /** + * (float) Percentage of swipe with the proximity sensor covered that triggers a higher + * swipe distance requirement. + */ + public static final String BRIGHTLINE_FALSING_PROXIMITY_PERCENT_COVERED_THRESHOLD = + "brightline_falsing_proximity_percent_covered_threshold"; + + /** + * (float) Angle, in radians, that a swipe can vary from horizontal and sill be intentional. + */ + public static final String BRIGHTLINE_FALSING_DIAGONAL_HORIZONTAL_ANGLE_RANGE = + "brightline_falsing_diagonal_horizontal_angle_range"; + + /** + * (float) Angle, in radians, that a swipe can vary from vertical and sill be intentional. + */ + public static final String BRIGHTLINE_FALSING_DIAGONAL_VERTICAL_ANGLE_RANGE = + "brightline_falsing_diagonal_horizontal_angle_range"; + + /** + * (float) Distance, in inches, that a swipe is allowed to vary in the horizontal direction for + * horizontal swipes. + */ + public static final String BRIGHTLINE_FALSING_ZIGZAG_X_PRIMARY_DEVIANCE = + "brightline_falsing_zigzag_x_primary_deviance"; + + /** + * (float) Distance, in inches, that a swipe is allowed to vary in the vertical direction for + * vertical swipes. + */ + public static final String BRIGHTLINE_FALSING_ZIGZAG_Y_PRIMARY_DEVIANCE = + "brightline_falsing_zigzag_y_primary_deviance"; + + /** + * (float) Distance, in inches, that a swipe is allowed to vary in the horizontal direction for + * horizontal swipes. + */ + public static final String BRIGHTLINE_FALSING_ZIGZAG_X_SECONDARY_DEVIANCE = + "brightline_falsing_zigzag_x_secondary_deviance"; + + /** + * (float) Distance, in inches, that a swipe is allowed to vary in the vertical direction for + * vertical swipes. + */ + public static final String BRIGHTLINE_FALSING_ZIGZAG_Y_SECONDARY_DEVIANCE = + "brightline_falsing_zigzag_y_secondary_deviance"; + private SystemUiDeviceConfigFlags() { } } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java index 8210951e1f96..bdcf0b36a04c 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java @@ -93,6 +93,10 @@ public class FalsingManagerProxy implements FalsingManager { public void setupFalsingManager(Context context) { boolean brightlineEnabled = DeviceConfig.getBoolean( DeviceConfig.NAMESPACE_SYSTEMUI, BRIGHTLINE_FALSING_MANAGER_ENABLED, false); + + if (mInternalFalsingManager != null) { + mInternalFalsingManager.cleanup(); + } if (!brightlineEnabled) { mInternalFalsingManager = new FalsingManagerImpl(context); } else { diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java index 730907e1fa9c..cc6645415fd8 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java @@ -16,9 +16,13 @@ package com.android.systemui.classifier.brightline; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DIAGONAL_HORIZONTAL_ANGLE_RANGE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DIAGONAL_VERTICAL_ANGLE_RANGE; import static com.android.systemui.classifier.Classifier.LEFT_AFFORDANCE; import static com.android.systemui.classifier.Classifier.RIGHT_AFFORDANCE; +import android.provider.DeviceConfig; + /** * False on swipes that are too close to 45 degrees. * @@ -35,8 +39,20 @@ class DiagonalClassifier extends FalsingClassifier { private static final float ONE_HUNDRED_EIGHTY_DEG = (float) (Math.PI); private static final float THREE_HUNDRED_SIXTY_DEG = (float) (2 * Math.PI); + private final float mHorizontalAngleRange; + private final float mVerticalAngleRange; + DiagonalClassifier(FalsingDataProvider dataProvider) { super(dataProvider); + + mHorizontalAngleRange = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DIAGONAL_HORIZONTAL_ANGLE_RANGE, + HORIZONTAL_ANGLE_RANGE); + mVerticalAngleRange = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DIAGONAL_VERTICAL_ANGLE_RANGE, + VERTICAL_ANGLE_RANGE); } @Override @@ -52,11 +68,11 @@ class DiagonalClassifier extends FalsingClassifier { return false; } - float minAngle = DIAGONAL - HORIZONTAL_ANGLE_RANGE; - float maxAngle = DIAGONAL + HORIZONTAL_ANGLE_RANGE; + float minAngle = DIAGONAL - mHorizontalAngleRange; + float maxAngle = DIAGONAL + mHorizontalAngleRange; if (isVertical()) { - minAngle = DIAGONAL - VERTICAL_ANGLE_RANGE; - maxAngle = DIAGONAL + VERTICAL_ANGLE_RANGE; + minAngle = DIAGONAL - mVerticalAngleRange; + maxAngle = DIAGONAL + mVerticalAngleRange; } return angleBetween(angle, minAngle, maxAngle) diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java index 005ee12c4f61..a6a617dc51de 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java @@ -16,6 +16,14 @@ package com.android.systemui.classifier.brightline; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_FLING_THRESHOLD_IN; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_SWIPE_THRESHOLD_IN; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_SCREEN_FRACTION_MAX_DISTANCE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VELOCITY_TO_DISTANCE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VERTICAL_FLING_THRESHOLD_IN; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VERTICAL_SWIPE_THRESHOLD_IN; + +import android.provider.DeviceConfig; import android.view.MotionEvent; import android.view.VelocityTracker; @@ -31,12 +39,13 @@ class DistanceClassifier extends FalsingClassifier { private static final float HORIZONTAL_SWIPE_THRESHOLD_DISTANCE_IN = 3; private static final float VERTICAL_SWIPE_THRESHOLD_DISTANCE_IN = 3; private static final float VELOCITY_TO_DISTANCE = 80f; - private static final float SCREEN_FRACTION_MIN_DISTANCE = 0.8f; + private static final float SCREEN_FRACTION_MAX_DISTANCE = 0.8f; private final float mVerticalFlingThresholdPx; private final float mHorizontalFlingThresholdPx; private final float mVerticalSwipeThresholdPx; private final float mHorizontalSwipeThresholdPx; + private final float mVelocityToDistanceMultiplier; private boolean mDistanceDirty; private DistanceVectors mCachedDistance; @@ -44,18 +53,48 @@ class DistanceClassifier extends FalsingClassifier { DistanceClassifier(FalsingDataProvider dataProvider) { super(dataProvider); + mVelocityToDistanceMultiplier = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_VELOCITY_TO_DISTANCE, + VELOCITY_TO_DISTANCE); + + float horizontalFlingThresholdIn = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_FLING_THRESHOLD_IN, + HORIZONTAL_FLING_THRESHOLD_DISTANCE_IN); + + float verticalFlingThresholdIn = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_VERTICAL_FLING_THRESHOLD_IN, + VERTICAL_FLING_THRESHOLD_DISTANCE_IN); + + float horizontalSwipeThresholdIn = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_SWIPE_THRESHOLD_IN, + HORIZONTAL_SWIPE_THRESHOLD_DISTANCE_IN); + + float verticalSwipeThresholdIn = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_VERTICAL_SWIPE_THRESHOLD_IN, + VERTICAL_SWIPE_THRESHOLD_DISTANCE_IN); + + float screenFractionMaxDistance = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_SCREEN_FRACTION_MAX_DISTANCE, + SCREEN_FRACTION_MAX_DISTANCE); + mHorizontalFlingThresholdPx = Math - .min(getWidthPixels() * SCREEN_FRACTION_MIN_DISTANCE, - HORIZONTAL_FLING_THRESHOLD_DISTANCE_IN * getXdpi()); + .min(getWidthPixels() * screenFractionMaxDistance, + horizontalFlingThresholdIn * getXdpi()); mVerticalFlingThresholdPx = Math - .min(getHeightPixels() * SCREEN_FRACTION_MIN_DISTANCE, - VERTICAL_FLING_THRESHOLD_DISTANCE_IN * getYdpi()); + .min(getHeightPixels() * screenFractionMaxDistance, + verticalFlingThresholdIn * getYdpi()); mHorizontalSwipeThresholdPx = Math - .min(getWidthPixels() * SCREEN_FRACTION_MIN_DISTANCE, - HORIZONTAL_SWIPE_THRESHOLD_DISTANCE_IN * getXdpi()); + .min(getWidthPixels() * screenFractionMaxDistance, + horizontalSwipeThresholdIn * getXdpi()); mVerticalSwipeThresholdPx = Math - .min(getHeightPixels() * SCREEN_FRACTION_MIN_DISTANCE, - VERTICAL_SWIPE_THRESHOLD_DISTANCE_IN * getYdpi()); + .min(getHeightPixels() * screenFractionMaxDistance, + verticalSwipeThresholdIn * getYdpi()); mDistanceDirty = true; } @@ -139,18 +178,18 @@ class DistanceClassifier extends FalsingClassifier { } boolean getPassedFlingThreshold() { - float dX = this.mDx + this.mVx * VELOCITY_TO_DISTANCE; - float dY = this.mDy + this.mVy * VELOCITY_TO_DISTANCE; + float dX = this.mDx + this.mVx * mVelocityToDistanceMultiplier; + float dY = this.mDy + this.mVy * mVelocityToDistanceMultiplier; if (isHorizontal()) { logDebug("Horizontal swipe and fling distance: " + this.mDx + ", " - + this.mVx * VELOCITY_TO_DISTANCE); + + this.mVx * mVelocityToDistanceMultiplier); logDebug("Threshold: " + mHorizontalFlingThresholdPx); return Math.abs(dX) >= mHorizontalFlingThresholdPx; } logDebug("Vertical swipe and fling distance: " + this.mDy + ", " - + this.mVy * VELOCITY_TO_DISTANCE); + + this.mVy * mVelocityToDistanceMultiplier); logDebug("Threshold: " + mVerticalFlingThresholdPx); return Math.abs(dY) >= mVerticalFlingThresholdPx; } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java index 94a8ac85b724..2644bf9f26ce 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java @@ -16,10 +16,12 @@ package com.android.systemui.classifier.brightline; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_PROXIMITY_PERCENT_COVERED_THRESHOLD; import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS; import android.hardware.Sensor; import android.hardware.SensorEvent; +import android.provider.DeviceConfig; import android.view.MotionEvent; @@ -31,8 +33,9 @@ import android.view.MotionEvent; */ class ProximityClassifier extends FalsingClassifier { - private static final double PERCENT_COVERED_THRESHOLD = 0.1; + private static final float PERCENT_COVERED_THRESHOLD = 0.1f; private final DistanceClassifier mDistanceClassifier; + private final float mPercentCoveredThreshold; private boolean mNear; private long mGestureStartTimeNs; @@ -44,6 +47,11 @@ class ProximityClassifier extends FalsingClassifier { FalsingDataProvider dataProvider) { super(dataProvider); this.mDistanceClassifier = distanceClassifier; + + mPercentCoveredThreshold = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_PROXIMITY_PERCENT_COVERED_THRESHOLD, + PERCENT_COVERED_THRESHOLD); } @Override @@ -107,7 +115,7 @@ class ProximityClassifier extends FalsingClassifier { logInfo("Percent of gesture in proximity: " + mPercentNear); - if (mPercentNear > PERCENT_COVERED_THRESHOLD) { + if (mPercentNear > mPercentCoveredThreshold) { return !mDistanceClassifier.isLongSwipe(); } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java index a62574f26399..c58b7db451b0 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java @@ -16,7 +16,13 @@ package com.android.systemui.classifier.brightline; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_X_PRIMARY_DEVIANCE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_X_SECONDARY_DEVIANCE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_Y_PRIMARY_DEVIANCE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_Y_SECONDARY_DEVIANCE; + import android.graphics.Point; +import android.provider.DeviceConfig; import android.view.MotionEvent; import java.util.ArrayList; @@ -37,8 +43,34 @@ class ZigZagClassifier extends FalsingClassifier { private static final float MAX_X_SECONDARY_DEVIANCE = .3f; private static final float MAX_Y_SECONDARY_DEVIANCE = .3f; + private final float mMaxXPrimaryDeviance; + private final float mMaxYPrimaryDeviance; + private final float mMaxXSecondaryDeviance; + private final float mMaxYSecondaryDeviance; + ZigZagClassifier(FalsingDataProvider dataProvider) { super(dataProvider); + + mMaxXPrimaryDeviance = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_ZIGZAG_X_PRIMARY_DEVIANCE, + MAX_X_PRIMARY_DEVIANCE); + + mMaxYPrimaryDeviance = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_ZIGZAG_Y_PRIMARY_DEVIANCE, + MAX_Y_PRIMARY_DEVIANCE); + + mMaxXSecondaryDeviance = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_ZIGZAG_X_SECONDARY_DEVIANCE, + MAX_X_SECONDARY_DEVIANCE); + + mMaxYSecondaryDeviance = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_ZIGZAG_Y_SECONDARY_DEVIANCE, + MAX_Y_SECONDARY_DEVIANCE); + } @Override @@ -98,11 +130,11 @@ class ZigZagClassifier extends FalsingClassifier { float maxXDeviance; float maxYDeviance; if (actualDx > actualDy) { - maxXDeviance = MAX_X_PRIMARY_DEVIANCE * totalDistanceIn * getXdpi(); - maxYDeviance = MAX_Y_SECONDARY_DEVIANCE * totalDistanceIn * getYdpi(); + maxXDeviance = mMaxXPrimaryDeviance * totalDistanceIn * getXdpi(); + maxYDeviance = mMaxYSecondaryDeviance * totalDistanceIn * getYdpi(); } else { - maxXDeviance = MAX_X_SECONDARY_DEVIANCE * totalDistanceIn * getXdpi(); - maxYDeviance = MAX_Y_PRIMARY_DEVIANCE * totalDistanceIn * getYdpi(); + maxXDeviance = mMaxXSecondaryDeviance * totalDistanceIn * getXdpi(); + maxYDeviance = mMaxYPrimaryDeviance * totalDistanceIn * getYdpi(); } logDebug("Straightness Deviance: (" + devianceX + "," + devianceY + ") vs " diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java index 329ef1c19a2b..7ea6493da83d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java @@ -56,6 +56,9 @@ public class FalsingManagerProxyTest extends SysuiTestCase { mHandler = new Handler(mTestableLooper.getLooper()); mDefaultConfigValue = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI, BRIGHTLINE_FALSING_MANAGER_ENABLED, false); + // In case it runs on a device where it's been set to true, set it to false by hand. + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_MANAGER_ENABLED, "false", false); } @After -- GitLab From 7d95f154a0f4a575a6b4e2e1d41294db87108212 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Wed, 17 Jul 2019 16:25:54 -0700 Subject: [PATCH 364/620] Disable bypass and bouncer delay when no face auth KeyguardUpdateMonitor#isUnlockWithFacePossible was returning true when the user had disabled face unlock. This was causing bypass to still be enabled (hiding all notifications) and bouncer was also being delayed, even though we were not scanning. Fixes: 134977472 Test: auth with bypass (toggling face auth setting on/off) Test: auth without bypass (toggling face auth setting on/off) Change-Id: I234eb303db87fe0dafa2073a9bdf819c665018d6 --- .../IBiometricEnabledOnKeyguardCallback.aidl | 2 +- .../keyguard/KeyguardUpdateMonitor.java | 18 ++++++++++-------- .../statusbar/phone/UnlockMethodCache.java | 12 ++++++++---- .../keyguard/KeyguardUpdateMonitorTest.java | 3 ++- .../server/biometrics/BiometricService.java | 11 ++++++----- 5 files changed, 27 insertions(+), 19 deletions(-) diff --git a/core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl b/core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl index d22e7e295b77..62d727c080e3 100644 --- a/core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl +++ b/core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl @@ -22,5 +22,5 @@ import android.hardware.biometrics.BiometricSourceType; * @hide */ oneway interface IBiometricEnabledOnKeyguardCallback { - void onChanged(in BiometricSourceType type, boolean enabled); + void onChanged(in BiometricSourceType type, boolean enabled, int userId); } \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 2eb93d3a6075..fd618b05f348 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -377,14 +377,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } }; - private boolean mFaceSettingEnabledForUser; + private SparseBooleanArray mFaceSettingEnabledForUser = new SparseBooleanArray(); private BiometricManager mBiometricManager; private IBiometricEnabledOnKeyguardCallback mBiometricEnabledCallback = new IBiometricEnabledOnKeyguardCallback.Stub() { @Override - public void onChanged(BiometricSourceType type, boolean enabled) throws RemoteException { + public void onChanged(BiometricSourceType type, boolean enabled, int userId) + throws RemoteException { if (type == BiometricSourceType.FACE) { - mFaceSettingEnabledForUser = enabled; + mFaceSettingEnabledForUser.put(userId, enabled); updateFaceListeningState(); } } @@ -1711,7 +1712,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { // instance of KeyguardUpdateMonitor for each user but KeyguardUpdateMonitor is user-aware. return (mBouncer || mAuthInterruptActive || awakeKeyguard || shouldListenForFaceAssistant()) && !mSwitchingUser && !isFaceDisabled(user) && becauseCannotSkipBouncer - && !mKeyguardGoingAway && mFaceSettingEnabledForUser && !mLockIconPressed + && !mKeyguardGoingAway && mFaceSettingEnabledForUser.get(user) && !mLockIconPressed && strongAuthAllowsScanning && mIsPrimaryUser && !mSecureCameraLaunched; } @@ -1783,13 +1784,14 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } /** - * If face hardware is available and user has enrolled. Not considering encryption or - * lockdown state. + * If face hardware is available, user has enrolled and enabled auth via setting. + * Not considering encryption or lock down state. */ public boolean isUnlockWithFacePossible(int userId) { return mFaceManager != null && mFaceManager.isHardwareDetected() && !isFaceDisabled(userId) - && mFaceManager.hasEnrolledTemplates(userId); + && mFaceManager.hasEnrolledTemplates(userId) + && mFaceSettingEnabledForUser.get(userId); } private void stopListeningForFingerprint() { @@ -2657,7 +2659,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { pw.println(" possible=" + isUnlockWithFacePossible(userId)); pw.println(" strongAuthFlags=" + Integer.toHexString(strongAuthFlags)); pw.println(" trustManaged=" + getUserTrustIsManaged(userId)); - pw.println(" enabledByUser=" + mFaceSettingEnabledForUser); + pw.println(" enabledByUser=" + mFaceSettingEnabledForUser.get(userId)); pw.println(" mSecureCameraLaunched=" + mSecureCameraLaunched); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java index f36c56f60965..a71fcdbd9914 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java @@ -107,6 +107,9 @@ public class UnlockMethodCache { mListeners.remove(listener); } + /** + * If there are faces enrolled and user enabled face auth on keyguard. + */ public boolean isUnlockingWithFacePossible() { return mIsUnlockingWithFacePossible; } @@ -119,15 +122,16 @@ public class UnlockMethodCache { || (Build.IS_DEBUGGABLE && DEBUG_AUTH_WITH_ADB && mDebugUnlocked); boolean trustManaged = mKeyguardUpdateMonitor.getUserTrustIsManaged(user); boolean trusted = mKeyguardUpdateMonitor.getUserHasTrust(user); - boolean hasEnrolledFaces = mKeyguardUpdateMonitor.isUnlockWithFacePossible(user); - boolean changed = secure != mSecure || canSkipBouncer != mCanSkipBouncer || - trustManaged != mTrustManaged || mIsUnlockingWithFacePossible != hasEnrolledFaces; + boolean isUnlockingWithFacePossible = mKeyguardUpdateMonitor.isUnlockWithFacePossible(user); + boolean changed = secure != mSecure || canSkipBouncer != mCanSkipBouncer + || trustManaged != mTrustManaged + || mIsUnlockingWithFacePossible != isUnlockingWithFacePossible; if (changed || updateAlways) { mSecure = secure; mCanSkipBouncer = canSkipBouncer; mTrusted = trusted; mTrustManaged = trustManaged; - mIsUnlockingWithFacePossible = hasEnrolledFaces; + mIsUnlockingWithFacePossible = isUnlockingWithFacePossible; notifyListeners(); } Trace.endSection(); diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index bdc6341bde91..db6177a63f96 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -103,7 +103,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { when(context.getPackageManager()).thenReturn(mPackageManager); doAnswer(invocation -> { IBiometricEnabledOnKeyguardCallback callback = invocation.getArgument(0); - callback.onChanged(BiometricSourceType.FACE, true /* enabled */); + callback.onChanged(BiometricSourceType.FACE, true /* enabled */, + KeyguardUpdateMonitor.getCurrentUser()); return null; }).when(mBiometricManager).registerEnabledOnKeyguardCallback(any()); when(mFaceManager.isHardwareDetected()).thenReturn(true); diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java index df6f73b914a8..bd3cd5439b32 100644 --- a/services/core/java/com/android/server/biometrics/BiometricService.java +++ b/services/core/java/com/android/server/biometrics/BiometricService.java @@ -521,8 +521,8 @@ public class BiometricService extends SystemService { List callbacks = mEnabledOnKeyguardCallbacks; for (int i = 0; i < callbacks.size(); i++) { callbacks.get(i).notify(BiometricSourceType.FACE, - mFaceEnabledOnKeyguard.getOrDefault(userId, - DEFAULT_KEYGUARD_ENABLED)); + mFaceEnabledOnKeyguard.getOrDefault(userId, DEFAULT_KEYGUARD_ENABLED), + userId); } } } @@ -540,9 +540,9 @@ public class BiometricService extends SystemService { } } - void notify(BiometricSourceType sourceType, boolean enabled) { + void notify(BiometricSourceType sourceType, boolean enabled, int userId) { try { - mCallback.onChanged(sourceType, enabled); + mCallback.onChanged(sourceType, enabled, userId); } catch (DeadObjectException e) { Slog.w(TAG, "Death while invoking notify", e); mEnabledOnKeyguardCallbacks.remove(this); @@ -796,7 +796,8 @@ public class BiometricService extends SystemService { mEnabledOnKeyguardCallbacks.add(new EnabledOnKeyguardCallback(callback)); try { callback.onChanged(BiometricSourceType.FACE, - mSettingObserver.getFaceEnabledOnKeyguard()); + mSettingObserver.getFaceEnabledOnKeyguard(), + UserHandle.getCallingUserId()); } catch (RemoteException e) { Slog.w(TAG, "Remote exception", e); } -- GitLab From 42ece979a259b6e1e5995e57d740952936374615 Mon Sep 17 00:00:00 2001 From: Nick Cook Date: Thu, 18 Jul 2019 21:30:45 +0000 Subject: [PATCH 365/620] docs: Fix broken link. Test: make ds-docs Bug: 132635673 Change-Id: I9e6a493112418f7b1467d9d2926a1b2c106d4ad0 --- core/java/android/widget/RelativeLayout.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index d985528c38fb..6b324a541c42 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -1202,13 +1202,13 @@ public class RelativeLayout extends ViewGroup { * determine where to position the view on the screen. If the view is not contained * within a relative layout, these attributes are ignored. * - * See the - * Relative Layout guide for example code demonstrating how to use relative layout’s + * See the Relative + * Layout guide for example code demonstrating how to use relative layout's * layout parameters in a layout XML. * * To learn more about layout parameters and how they differ from typical view attributes, - * see the - * Layouts guide. + * see the Layouts + * guide. * * * @attr ref android.R.styleable#RelativeLayout_Layout_layout_alignWithParentIfMissing -- GitLab From 4f1e9151610bf8d33f100f23e3771fb9786b1e72 Mon Sep 17 00:00:00 2001 From: Mehdi Alizadeh Date: Thu, 18 Jul 2019 15:08:44 -0700 Subject: [PATCH 366/620] Removes auto-switch from gesture nav when default home app changes Bug: 137197916 Test: Manual test with setting a 3P launcher as default Change-Id: I643bacc0379d05980ce8db7198771f5d4616d203 --- .../phone/NavigationModeController.java | 152 +----------------- 1 file changed, 7 insertions(+), 145 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java index 64fef55a21d3..1df9411019d2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java @@ -32,8 +32,6 @@ import static com.android.systemui.shared.system.QuickStepContract.ACTION_ENABLE import static com.android.systemui.shared.system.QuickStepContract.ACTION_ENABLE_GESTURE_NAV_RESULT; import static com.android.systemui.shared.system.QuickStepContract.EXTRA_RESULT_INTENT; -import android.app.Notification; -import android.app.NotificationManager; import android.app.PendingIntent; import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; @@ -42,7 +40,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.om.IOverlayManager; -import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.ApkAssets; import android.os.PatternMatcher; @@ -52,16 +49,13 @@ import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; import android.provider.Settings.Secure; -import android.text.TextUtils; import android.util.Log; import android.util.SparseBooleanArray; import com.android.systemui.Dumpable; -import com.android.systemui.R; import com.android.systemui.UiOffloadThread; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.statusbar.policy.DeviceProvisionedController; -import com.android.systemui.util.NotificationChannels; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -80,11 +74,6 @@ public class NavigationModeController implements Dumpable { private static final String TAG = NavigationModeController.class.getSimpleName(); private static final boolean DEBUG = false; - private static final int SYSTEM_APP_MASK = - ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; - static final String SHARED_PREFERENCES_NAME = "navigation_mode_controller_preferences"; - static final String PREFS_SWITCHED_FROM_GESTURE_NAV_KEY = "switched_from_gesture_nav"; - public interface ModeChangedListener { void onNavigationModeChanged(int mode); } @@ -100,8 +89,6 @@ public class NavigationModeController implements Dumpable { private int mMode = NAV_BAR_MODE_3BUTTON; private ArrayList mListeners = new ArrayList<>(); - private String mLastDefaultLauncher; - private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -112,18 +99,6 @@ public class NavigationModeController implements Dumpable { } updateCurrentInteractionMode(true /* notify */); break; - case ACTION_PREFERRED_ACTIVITY_CHANGED: - if (DEBUG) { - Log.d(TAG, "ACTION_PREFERRED_ACTIVITY_CHANGED"); - } - final String launcher = getDefaultLauncherPackageName(mCurrentUserContext); - // Check if it is a default launcher change - if (!TextUtils.equals(mLastDefaultLauncher, launcher)) { - switchFromGestureNavModeIfNotSupportedByDefaultLauncher(); - showNotificationIfDefaultLauncherSupportsGestureNav(); - mLastDefaultLauncher = launcher; - } - break; } } }; @@ -159,7 +134,6 @@ public class NavigationModeController implements Dumpable { // Update the nav mode for the current user updateCurrentInteractionMode(true /* notify */); - switchFromGestureNavModeIfNotSupportedByDefaultLauncher(); // When switching users, defer enabling the gestural nav overlay until the user // is all set up @@ -190,11 +164,7 @@ public class NavigationModeController implements Dumpable { mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, preferredActivityFilter, null, null); - // We are only interested in launcher changes, so keeping track of the current default. - mLastDefaultLauncher = getDefaultLauncherPackageName(mContext); - updateCurrentInteractionMode(false /* notify */); - switchFromGestureNavModeIfNotSupportedByDefaultLauncher(); // Check if we need to defer enabling gestural nav deferGesturalNavOverlayIfNecessary(); @@ -216,21 +186,13 @@ public class NavigationModeController implements Dumpable { // Already in gesture mode return true; } - final Boolean supported = isGestureNavSupportedByDefaultLauncher(mCurrentUserContext); - if (supported == null || supported) { - Log.d(TAG, "Switching system navigation to full-gesture mode:" - + " defaultLauncher=" - + getDefaultLauncherPackageName(mCurrentUserContext) - + " contextUser=" - + mCurrentUserContext.getUserId()); - - setModeOverlay(NAV_BAR_MODE_GESTURAL_OVERLAY, USER_CURRENT); - return true; - } else { - Log.e(TAG, "Gesture nav is not supported for defaultLauncher=" - + getDefaultLauncherPackageName(mCurrentUserContext)); - return false; - } + + Log.d(TAG, "Switching system navigation to full-gesture mode:" + + " contextUser=" + + mCurrentUserContext.getUserId()); + + setModeOverlay(NAV_BAR_MODE_GESTURAL_OVERLAY, USER_CURRENT); + return true; } private boolean enableGestureNav(Intent intent) { @@ -430,100 +392,6 @@ public class NavigationModeController implements Dumpable { }); } - private void switchFromGestureNavModeIfNotSupportedByDefaultLauncher() { - if (getCurrentInteractionMode(mCurrentUserContext) != NAV_BAR_MODE_GESTURAL) { - return; - } - final Boolean supported = isGestureNavSupportedByDefaultLauncher(mCurrentUserContext); - if (supported == null || supported) { - return; - } - - Log.d(TAG, "Switching system navigation to 3-button mode:" - + " defaultLauncher=" + getDefaultLauncherPackageName(mCurrentUserContext) - + " contextUser=" + mCurrentUserContext.getUserId()); - - setModeOverlay(NAV_BAR_MODE_3BUTTON_OVERLAY, USER_CURRENT); - showNotification(mCurrentUserContext, R.string.notification_content_system_nav_changed); - mCurrentUserContext.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE) - .edit().putBoolean(PREFS_SWITCHED_FROM_GESTURE_NAV_KEY, true).apply(); - } - - private void showNotificationIfDefaultLauncherSupportsGestureNav() { - boolean previouslySwitchedFromGestureNav = mCurrentUserContext - .getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE) - .getBoolean(PREFS_SWITCHED_FROM_GESTURE_NAV_KEY, false); - if (!previouslySwitchedFromGestureNav) { - return; - } - if (getCurrentInteractionMode(mCurrentUserContext) == NAV_BAR_MODE_GESTURAL) { - return; - } - final Boolean supported = isGestureNavSupportedByDefaultLauncher(mCurrentUserContext); - if (supported == null || !supported) { - return; - } - - showNotification(mCurrentUserContext, R.string.notification_content_gesture_nav_available); - mCurrentUserContext.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE) - .edit().putBoolean(PREFS_SWITCHED_FROM_GESTURE_NAV_KEY, false).apply(); - } - - /** - * Returns null if there is no default launcher set for the current user. Returns true if the - * current default launcher supports Gesture Navigation. Returns false otherwise. - */ - private Boolean isGestureNavSupportedByDefaultLauncher(Context context) { - final String defaultLauncherPackageName = getDefaultLauncherPackageName(context); - if (DEBUG) { - Log.d(TAG, "isGestureNavSupportedByDefaultLauncher:" - + " defaultLauncher=" + defaultLauncherPackageName - + " contextUser=" + context.getUserId()); - } - if (defaultLauncherPackageName == null) { - return null; - } - if (isSystemApp(context, defaultLauncherPackageName)) { - return true; - } - return false; - } - - private String getDefaultLauncherPackageName(Context context) { - final ComponentName cn = context.getPackageManager().getHomeActivities(new ArrayList<>()); - if (cn == null) { - return null; - } - return cn.getPackageName(); - } - - /** Returns true if the app for the given package name is a system app for this device */ - private boolean isSystemApp(Context context, String packageName) { - try { - ApplicationInfo ai = context.getPackageManager().getApplicationInfo(packageName, - PackageManager.GET_META_DATA); - return ai != null && ((ai.flags & SYSTEM_APP_MASK) != 0); - } catch (PackageManager.NameNotFoundException e) { - return false; - } - } - - private void showNotification(Context context, int resId) { - final CharSequence message = context.getResources().getString(resId); - if (DEBUG) { - Log.d(TAG, "showNotification: message=" + message); - } - - final Notification.Builder builder = - new Notification.Builder(mContext, NotificationChannels.ALERTS) - .setContentText(message) - .setStyle(new Notification.BigTextStyle()) - .setSmallIcon(R.drawable.ic_info) - .setAutoCancel(true) - .setContentIntent(PendingIntent.getActivity(context, 0, new Intent(), 0)); - context.getSystemService(NotificationManager.class).notify(TAG, 0, builder.build()); - } - @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("NavigationModeController:"); @@ -536,12 +404,6 @@ public class NavigationModeController implements Dumpable { } pw.println(" defaultOverlays=" + defaultOverlays); dumpAssetPaths(mCurrentUserContext); - - pw.println(" defaultLauncher=" + mLastDefaultLauncher); - boolean previouslySwitchedFromGestureNav = mCurrentUserContext - .getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE) - .getBoolean(PREFS_SWITCHED_FROM_GESTURE_NAV_KEY, false); - pw.println(" previouslySwitchedFromGestureNav=" + previouslySwitchedFromGestureNav); } private void dumpAssetPaths(Context context) { -- GitLab From 16f334e5c1bfbb7af0f015211b3c09dafe0e998d Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Thu, 18 Jul 2019 16:00:55 -0700 Subject: [PATCH 367/620] Fixed the layout of media heads up notifications Previously the heads up layout was strangely clipped because we were using the expanded layout. We're now using the collapsed layout instead. In order to allow this, the media notification needs to wrap it's height properly. Fixes: 136507638 Test: show heads up media notification Change-Id: Ib091b0e776b5cd1a615c9ea0121a3115817b7f64 --- core/java/android/app/Notification.java | 3 +-- .../res/layout/notification_template_material_media.xml | 8 ++++---- core/res/res/values/dimens.xml | 2 +- core/res/res/values/symbols.xml | 1 + packages/SystemUI/res/values/dimens.xml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 475dccb0923e..f66448f518c8 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -8101,8 +8101,7 @@ public class Notification implements Parcelable */ @Override public RemoteViews makeHeadsUpContentView(boolean increasedHeight) { - RemoteViews expanded = makeMediaBigContentView(); - return expanded != null ? expanded : makeMediaContentView(); + return makeMediaContentView(); } /** @hide */ diff --git a/core/res/res/layout/notification_template_material_media.xml b/core/res/res/layout/notification_template_material_media.xml index 13fef67c5e2f..575295b1be45 100644 --- a/core/res/res/layout/notification_template_material_media.xml +++ b/core/res/res/layout/notification_template_material_media.xml @@ -15,7 +15,7 @@ ~ limitations under the License --> - - + diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 039bc4d925a1..665387943bbd 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -279,7 +279,7 @@ 1dp - 92dp + 106dp 64dp diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index d13c715db468..1f5a0100a0a7 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3797,6 +3797,7 @@ + diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index aa25cf999636..bef1fc2f271c 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -112,7 +112,7 @@ 17dp - 106dp + @*android:dimen/notification_min_height 146dp -- GitLab From bdf04e88c7e9db4c1ca8c9976d519a87b39dd9d6 Mon Sep 17 00:00:00 2001 From: SzuWei Lin Date: Fri, 19 Jul 2019 13:14:48 +0800 Subject: [PATCH 368/620] Postpone the shared user checking after Q The shared user checking becomes strict. If there is an APK in vendor partition shared UID with a APK in system partition, the signatures of these 2 APKs must be equal. Otherwise, framework will throw an exception and cannot boot. Postpone the checking from first_api_level 28 to 29. Bug: 137524152 Test: test on a device with first_api_level=29 and pass the checking Change-Id: I76d87a6dab35d4d39113cdd16a20706ce2c45093 --- .../com/android/server/pm/PackageManagerService.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 9f5fc9269a7c..7fce4453b768 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -16590,13 +16590,13 @@ public class PackageManagerService extends IPackageManager.Stub && compareSignatures(sharedUserSignatures, pkg.mSigningDetails.signatures) != PackageManager.SIGNATURE_MATCH) { - if (SystemProperties.getInt("ro.product.first_api_level", 0) <= 28) { + if (SystemProperties.getInt("ro.product.first_api_level", 0) <= 29) { // Mismatched signatures is an error and silently skipping system // packages will likely break the device in unforeseen ways. - // However, - // we allow the device to boot anyway because, prior to P, - // vendors were - // not expecting the platform to crash in this situation. + // However, we allow the device to boot anyway because, prior to Q, + // vendors were not expecting the platform to crash in this + // situation. + // This WILL be a hard failure on any new API levels after Q. throw new ReconcileFailure( INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES, "Signature mismatch for shared user: " -- GitLab From b332588e60b4219c603a546dda8f19619e166783 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Fri, 19 Jul 2019 11:25:45 -0400 Subject: [PATCH 369/620] Enable the BrightLineFalsingManager by default on Q. Bug: 71762354 Change-Id: Icfc6e21d50e08c34168f504ec64bf654ba6cb6a4 Test: atest SystemUITests --- .../com/android/systemui/classifier/FalsingManagerProxy.java | 2 +- .../android/systemui/classifier/FalsingManagerProxyTest.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java index 3cc8ec9afbb2..69f243c8ed70 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java @@ -91,7 +91,7 @@ public class FalsingManagerProxy implements FalsingManager { @VisibleForTesting public void setupFalsingManager(Context context) { boolean brightlineEnabled = DeviceConfig.getBoolean( - DeviceConfig.NAMESPACE_SYSTEMUI, BRIGHTLINE_FALSING_MANAGER_ENABLED, false); + DeviceConfig.NAMESPACE_SYSTEMUI, BRIGHTLINE_FALSING_MANAGER_ENABLED, true); if (!brightlineEnabled) { mInternalFalsingManager = new FalsingManagerImpl(context); } else { diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java index 329ef1c19a2b..7ea6493da83d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java @@ -56,6 +56,9 @@ public class FalsingManagerProxyTest extends SysuiTestCase { mHandler = new Handler(mTestableLooper.getLooper()); mDefaultConfigValue = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI, BRIGHTLINE_FALSING_MANAGER_ENABLED, false); + // In case it runs on a device where it's been set to true, set it to false by hand. + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_MANAGER_ENABLED, "false", false); } @After -- GitLab From 026e5441a4f54f0616de38cc776ec8395289ac7e Mon Sep 17 00:00:00 2001 From: Kai Shi Date: Thu, 18 Jul 2019 15:50:55 -0700 Subject: [PATCH 370/620] WifiMetrics: add per-band Tx and Rx speed histogram Bug: 137886569 Test: Unit tests for Wifi: frameworks/opt/net/wifi/tests/wifitests/runtest.sh and manual test Change-Id: I30aae21651237b1bc7291527d0beab3e28dadb21 --- proto/src/wifi.proto | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/proto/src/wifi.proto b/proto/src/wifi.proto index f9a2ca269335..8ad24894a1b9 100644 --- a/proto/src/wifi.proto +++ b/proto/src/wifi.proto @@ -551,6 +551,30 @@ message WifiLog { // Histogram of the EAP method type of all installed Passpoint profiles for R2 repeated PasspointProfileTypeCount installed_passpoint_profile_type_for_r2 = 148; + + // Histogram of Tx link speed at 2G + repeated Int32Count tx_link_speed_count_2g = 149; + + // Histogram of Tx link speed at 5G low band + repeated Int32Count tx_link_speed_count_5g_low = 150; + + // Histogram of Tx link speed at 5G middle band + repeated Int32Count tx_link_speed_count_5g_mid = 151; + + // Histogram of Tx link speed at 5G high band + repeated Int32Count tx_link_speed_count_5g_high = 152; + + // Histogram of Rx link speed at 2G + repeated Int32Count rx_link_speed_count_2g = 153; + + // Histogram of Rx link speed at 5G low band + repeated Int32Count rx_link_speed_count_5g_low = 154; + + // Histogram of Rx link speed at 5G middle band + repeated Int32Count rx_link_speed_count_5g_mid = 155; + + // Histogram of Rx link speed at 5G high band + repeated Int32Count rx_link_speed_count_5g_high = 156; } // Information that gets logged for every WiFi connection. @@ -827,6 +851,7 @@ message LinkSpeedCount { optional int64 rssi_sum_of_squares_dbm_sq = 4; } + // Number of occurrences of Soft AP session durations message SoftApDurationBucket { // Bucket covers duration : [duration_sec, duration_sec + bucket_size_sec) -- GitLab From 5f27f741d2cb3a24c2c5c5b32bd1e50e5fc7e0b5 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 19 Jul 2019 10:57:39 -0700 Subject: [PATCH 371/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I49514b3428c41473d516b5889217c241f892be5d --- core/res/res/values-ca/strings.xml | 2 +- core/res/res/values-pl/strings.xml | 2 +- core/res/res/values-vi/strings.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 619af249598d..b13f506da65f 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -594,7 +594,7 @@ "Icona facial" "llegir la configuració de sincronització" - "Permet que l\'aplicació llegeixi la configuració de sincronització d\'un compte. Per exemple, això pot determinar que l\'aplicació Persones estigui sincronitzada amb un compte." + "Permet que l\'aplicació llegeixi la configuració de sincronització d\'un compte. Per exemple, això pot determinar que l\'aplicació Contactes estigui sincronitzada amb un compte." "activar o desactivar la sincronització" "Permet que una aplicació modifiqui la configuració de sincronització d\'un compte. Per exemple, aquesta acció es pot fer servir per activar la sincronització de l\'aplicació Persones amb un compte." "llegir les estadístiques de sincronització" diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 962ad514c27b..4937ced8a16b 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1711,7 +1711,7 @@ "Gdy skrót jest włączony, jednoczesne naciśnięcie przez trzy sekundy obu klawiszy sterowania głośnością uruchomi funkcję ułatwień dostępu.\n\nBieżąca funkcja ułatwień dostępu:\n%1$s\n\nFunkcję możesz zmienić, wybierając Ustawienia > Ułatwienia dostępu." "Wyłącz skrót" "Użyj skrótu" - "Inwersja kolorów" + "Odwrócenie kolorów" "Korekcja kolorów" "Skrót ułatwień dostępu wyłączył usługę %1$s" "Skrót ułatwień dostępu wyłączył usługę %1$s" diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 305dca0ba549..429861b07100 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -520,7 +520,7 @@ "Cho phép ứng dụng này sửa đổi bộ sưu tập ảnh của bạn." "đọc vị trí từ bộ sưu tập phương tiện" "Cho phép ứng dụng này đọc vị trí từ bộ sưu tập phương tiện của bạn." - "Hãy xác minh đó là bạn" + "Xác minh danh tính của bạn" "Không có phần cứng sinh trắc học" "Đã hủy xác thực" "Không nhận dạng được" -- GitLab From 16f36b8cdcfcfdd89b151c5c043e9ab4d6d50e0f Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Fri, 19 Jul 2019 18:09:52 +0000 Subject: [PATCH 372/620] Revert "Stop idmap2d after several seconds pass" This reverts commit 2b5140d3e02f75f7da87786f8bed0d989ff8e0f6. Reason for revert: failing launcher 3 tests Change-Id: I383a38f34dc81b6b4f7d2960b47c13b4887905bf --- .../com/android/server/om/IdmapDaemon.java | 193 ------------------ .../com/android/server/om/IdmapManager.java | 59 +++++- .../server/om/OverlayManagerService.java | 1 - 3 files changed, 49 insertions(+), 204 deletions(-) delete mode 100644 services/core/java/com/android/server/om/IdmapDaemon.java diff --git a/services/core/java/com/android/server/om/IdmapDaemon.java b/services/core/java/com/android/server/om/IdmapDaemon.java deleted file mode 100644 index 55fbcb4344cf..000000000000 --- a/services/core/java/com/android/server/om/IdmapDaemon.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.om; - -import static android.content.Context.IDMAP_SERVICE; - -import static com.android.server.om.OverlayManagerService.DEBUG; -import static com.android.server.om.OverlayManagerService.TAG; - -import android.os.IBinder; -import android.os.IIdmap2; -import android.os.RemoteException; -import android.os.ServiceManager; -import android.os.SystemProperties; -import android.util.Slog; - -import com.android.server.IoThread; - -import java.util.concurrent.FutureTask; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * To prevent idmap2d from continuously running, the idmap daemon will terminate after 10 - * seconds without a transaction. - **/ -class IdmapDaemon { - // The amount of time in milliseconds to wait after a transaction to the idmap service is made - // before stopping the service. - private static final int SERVICE_TIMEOUT_MS = 10000; - - // The amount of time in milliseconds to wait when attempting to connect to idmap service. - private static final int SERVICE_CONNECT_TIMEOUT_MS = 5000; - - private static final Object IDMAP_TOKEN = new Object(); - private static final String IDMAP_DAEMON = "idmap2d"; - - private static IdmapDaemon sInstance; - private volatile IIdmap2 mService; - private final AtomicInteger mOpenedCount = new AtomicInteger(); - - /** - * An {@link AutoCloseable} connection to the idmap service. When the connection is closed or - * finalized, the idmap service will be stopped after a period of time unless another connection - * to the service is open. - **/ - private class Connection implements AutoCloseable { - private boolean mOpened = true; - - private Connection() { - synchronized (IDMAP_TOKEN) { - mOpenedCount.incrementAndGet(); - } - } - - @Override - public void close() { - synchronized (IDMAP_TOKEN) { - if (!mOpened) { - return; - } - - mOpened = false; - if (mOpenedCount.decrementAndGet() != 0) { - // Only post the callback to stop the service if the service does not have an - // open connection. - return; - } - - IoThread.getHandler().postDelayed(() -> { - synchronized (IDMAP_TOKEN) { - // Only stop the service if the service does not have an open connection. - if (mService == null || mOpenedCount.get() != 0) { - return; - } - - stopIdmapService(); - mService = null; - } - }, IDMAP_TOKEN, SERVICE_TIMEOUT_MS); - } - } - } - - static IdmapDaemon getInstance() { - if (sInstance == null) { - sInstance = new IdmapDaemon(); - } - return sInstance; - } - - String createIdmap(String targetPath, String overlayPath, int policies, boolean enforce, - int userId) throws Exception { - try (Connection connection = connect()) { - return mService.createIdmap(targetPath, overlayPath, policies, enforce, userId); - } - } - - boolean removeIdmap(String overlayPath, int userId) throws Exception { - try (Connection connection = connect()) { - return mService.removeIdmap(overlayPath, userId); - } - } - - boolean verifyIdmap(String overlayPath, int policies, boolean enforce, int userId) - throws Exception { - try (Connection connection = connect()) { - return mService.verifyIdmap(overlayPath, policies, enforce, userId); - } - } - - String getIdmapPath(String overlayPath, int userId) throws Exception { - try (Connection connection = connect()) { - return mService.getIdmapPath(overlayPath, userId); - } - } - - static void startIdmapService() { - SystemProperties.set("ctl.start", IDMAP_DAEMON); - } - - static void stopIdmapService() { - SystemProperties.set("ctl.stop", IDMAP_DAEMON); - } - - private Connection connect() throws Exception { - synchronized (IDMAP_TOKEN) { - IoThread.getHandler().removeCallbacksAndMessages(IDMAP_TOKEN); - if (mService != null) { - // Not enough time has passed to stop the idmap service. Reuse the existing - // interface. - return new Connection(); - } - - // Start the idmap service if it is not currently running. - startIdmapService(); - - // Block until the service is found. - FutureTask bindIdmap = new FutureTask<>(() -> { - IBinder binder = null; - while (binder == null) { - try { - binder = ServiceManager.getService(IDMAP_SERVICE); - Thread.sleep(100); - } catch (Exception e) { - Slog.e(TAG, "service '" + IDMAP_SERVICE + "' not retrieved; " - + e.getMessage()); - } - } - return binder; - }); - - IBinder binder; - try { - IoThread.getHandler().postAtFrontOfQueue(bindIdmap); - binder = bindIdmap.get(SERVICE_CONNECT_TIMEOUT_MS, TimeUnit.MILLISECONDS); - } catch (Exception rethrow) { - Slog.e(TAG, "service '" + IDMAP_SERVICE + "' not found;"); - throw rethrow; - } - - try { - binder.linkToDeath(() -> { - Slog.w(TAG, "service '" + IDMAP_SERVICE + "' died"); - }, 0); - } catch (RemoteException rethrow) { - Slog.e(TAG, "service '" + IDMAP_SERVICE + "' failed to be bound"); - throw rethrow; - } - - mService = IIdmap2.Stub.asInterface(binder); - if (DEBUG) { - Slog.d(TAG, "service '" + IDMAP_SERVICE + "' connected"); - } - - return new Connection(); - } - } -} diff --git a/services/core/java/com/android/server/om/IdmapManager.java b/services/core/java/com/android/server/om/IdmapManager.java index 9b6d986d90d2..b604aa87f8f3 100644 --- a/services/core/java/com/android/server/om/IdmapManager.java +++ b/services/core/java/com/android/server/om/IdmapManager.java @@ -16,6 +16,9 @@ package com.android.server.om; +import static android.content.Context.IDMAP_SERVICE; +import static android.text.format.DateUtils.SECOND_IN_MILLIS; + import static com.android.server.om.OverlayManagerService.DEBUG; import static com.android.server.om.OverlayManagerService.TAG; @@ -24,11 +27,15 @@ import android.content.om.OverlayInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.os.Build.VERSION_CODES; +import android.os.IBinder; import android.os.IIdmap2; +import android.os.RemoteException; +import android.os.ServiceManager; import android.os.SystemProperties; import android.os.UserHandle; import android.util.Slog; +import com.android.internal.os.BackgroundThread; import com.android.server.om.OverlayManagerServiceImpl.PackageManagerHelper; import com.android.server.pm.Installer; @@ -44,6 +51,11 @@ import java.io.File; */ class IdmapManager { private static final boolean FEATURE_FLAG_IDMAP2 = true; + + private final Installer mInstaller; + private final PackageManagerHelper mPackageManager; + private IIdmap2 mIdmap2Service; + private static final boolean VENDOR_IS_Q_OR_LATER; static { final String value = SystemProperties.get("ro.vndk.version", "29"); @@ -58,14 +70,12 @@ class IdmapManager { VENDOR_IS_Q_OR_LATER = isQOrLater; } - private final Installer mInstaller; - private final PackageManagerHelper mPackageManager; - private final IdmapDaemon mIdmapDaemon; - IdmapManager(final Installer installer, final PackageManagerHelper packageManager) { mInstaller = installer; mPackageManager = packageManager; - mIdmapDaemon = IdmapDaemon.getInstance(); + if (FEATURE_FLAG_IDMAP2) { + connectToIdmap2d(); + } } boolean createIdmap(@NonNull final PackageInfo targetPackage, @@ -81,11 +91,11 @@ class IdmapManager { if (FEATURE_FLAG_IDMAP2) { int policies = calculateFulfilledPolicies(targetPackage, overlayPackage, userId); boolean enforce = enforceOverlayable(overlayPackage); - if (mIdmapDaemon.verifyIdmap(overlayPath, policies, enforce, userId)) { + if (mIdmap2Service.verifyIdmap(overlayPath, policies, enforce, userId)) { return true; } - return mIdmapDaemon.createIdmap(targetPath, overlayPath, policies, - enforce, userId) != null; + return mIdmap2Service.createIdmap(targetPath, overlayPath, policies, enforce, + userId) != null; } else { mInstaller.idmap(targetPath, overlayPath, sharedGid); return true; @@ -103,7 +113,7 @@ class IdmapManager { } try { if (FEATURE_FLAG_IDMAP2) { - return mIdmapDaemon.removeIdmap(oi.baseCodePath, userId); + return mIdmap2Service.removeIdmap(oi.baseCodePath, userId); } else { mInstaller.removeIdmap(oi.baseCodePath); return true; @@ -127,7 +137,7 @@ class IdmapManager { final int userId) { if (FEATURE_FLAG_IDMAP2) { try { - return mIdmapDaemon.getIdmapPath(overlayPackagePath, userId); + return mIdmap2Service.getIdmapPath(overlayPackagePath, userId); } catch (Exception e) { Slog.w(TAG, "failed to get idmap path for " + overlayPackagePath + ": " + e.getMessage()); @@ -141,6 +151,35 @@ class IdmapManager { } } + private void connectToIdmap2d() { + IBinder binder = ServiceManager.getService(IDMAP_SERVICE); + if (binder != null) { + try { + binder.linkToDeath(new IBinder.DeathRecipient() { + @Override + public void binderDied() { + Slog.w(TAG, "service '" + IDMAP_SERVICE + "' died; reconnecting..."); + connectToIdmap2d(); + } + + }, 0); + } catch (RemoteException e) { + binder = null; + } + } + if (binder != null) { + mIdmap2Service = IIdmap2.Stub.asInterface(binder); + if (DEBUG) { + Slog.d(TAG, "service '" + IDMAP_SERVICE + "' connected"); + } + } else { + Slog.w(TAG, "service '" + IDMAP_SERVICE + "' not found; trying again..."); + BackgroundThread.getHandler().postDelayed(() -> { + connectToIdmap2d(); + }, SECOND_IN_MILLIS); + } + } + /** * Checks if overlayable and policies should be enforced on the specified overlay for backwards * compatibility with pre-Q overlays. diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java index ce951816d3a6..da69986cd59f 100644 --- a/services/core/java/com/android/server/om/OverlayManagerService.java +++ b/services/core/java/com/android/server/om/OverlayManagerService.java @@ -262,7 +262,6 @@ public final class OverlayManagerService extends SystemService { initIfNeeded(); onSwitchUser(UserHandle.USER_SYSTEM); - IdmapDaemon.stopIdmapService(); publishBinderService(Context.OVERLAY_SERVICE, mService); publishLocalService(OverlayManagerService.class, this); -- GitLab From bb83b895450257b602bc6ac40f93de64e32006e1 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Fri, 19 Jul 2019 11:45:16 -0700 Subject: [PATCH 373/620] Update clock when turning the screen on Sensors might disable the screen, setting the machine state to DOZE. We need to update the clock when the screen turns on. Fixes: 137943236 Test: turn off screen with sensor, wait for a few minutes, come back Change-Id: I633568294aa24bfea6765accc08ccf23f9c6bec1 --- packages/SystemUI/src/com/android/systemui/doze/DozeUi.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java index e877d4446c63..1f33af8c3f55 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java @@ -16,6 +16,7 @@ package com.android.systemui.doze; +import static com.android.systemui.doze.DozeMachine.State.DOZE; import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD_PAUSED; import android.app.AlarmManager; @@ -116,7 +117,7 @@ public class DozeUi implements DozeMachine.Part { public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState) { switch (newState) { case DOZE_AOD: - if (oldState == DOZE_AOD_PAUSED) { + if (oldState == DOZE_AOD_PAUSED || oldState == DOZE) { // Whenever turning on the display, it's necessary to push a new frame. // The display buffers will be empty and need to be filled. mHost.dozeTimeTick(); -- GitLab From 41e7e6edc74e27235f6057def04dd9a6e18f3a8a Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Fri, 19 Jul 2019 11:47:58 -0700 Subject: [PATCH 374/620] Fixed a crash with the headsUpManager Since the headsUpManager is calling out in various places to its listeners, the callbacks may query the headsupmanager in an internally inconsistent state, such that the pinned mode is true but there is no topEntry. Let's add a null-check for safety here. Bug: 137804505 Test: atest SystemUITests Change-Id: Ibae76b555ca51ccf676228b034a614d59a8b4e8e --- .../systemui/statusbar/phone/HeadsUpManagerPhone.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java index 1d0d231424d1..595c1acaf56d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java @@ -301,12 +301,15 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, } public Region calculateTouchableRegion() { - if (!hasPinnedHeadsUp()) { + NotificationEntry topEntry = getTopEntry(); + // This call could be made in an inconsistent state while the pinnedMode hasn't been + // updated yet, but callbacks leading out of the headsUp manager, querying it. Let's + // therefore also check if the topEntry is null. + if (!hasPinnedHeadsUp() || topEntry == null) { mTouchableRegion.set(0, 0, mStatusBarWindowView.getWidth(), mStatusBarHeight); updateRegionForNotch(mTouchableRegion); } else { - NotificationEntry topEntry = getTopEntry(); if (topEntry.isChildInGroup()) { final NotificationEntry groupSummary = mGroupManager.getGroupSummary(topEntry.notification); -- GitLab From 80565fbf36d3a3fddcb1610a19cb20fbe78bf907 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Thu, 18 Jul 2019 08:22:38 -0700 Subject: [PATCH 375/620] SoundTriggerHelper: fix power save mode listener When stopping a recognition, do not unregister power save mode listener if no recognition is active any more but only if no recognition is requested. Otherwise recognitions suspended due to power save mode will never resume. Bug: 136978230 Test: Activate power save mode, plug USB and verify OK G works. Change-Id: I426e11447fcde5c578ae2f64aa1fe18ef00fba0f --- .../soundtrigger/SoundTriggerHelper.java | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java index 94352b21db87..99337565e128 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java @@ -104,8 +104,8 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { // This is an indirect indication of the microphone being open in some other application. private boolean mServiceDisabled = false; - // Whether we have ANY recognition (keyphrase or generic) running. - private boolean mRecognitionRunning = false; + // Whether ANY recognition (keyphrase or generic) has been requested. + private boolean mRecognitionRequested = false; private PowerSaveModeListener mPowerSaveModeListener; @@ -252,11 +252,6 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { } } - // Initialize power save, call active state monitoring logic. - if (!mRecognitionRunning) { - initializeTelephonyAndPowerStateListeners(); - } - // If the existing SoundModel is different (for the same UUID for Generic and same // keyphrase ID for voice), ensure that it is unloaded and stopped before proceeding. // This works for both keyphrase and generic models. This logic also ensures that a @@ -326,8 +321,16 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { modelData.setRecognitionConfig(recognitionConfig); modelData.setSoundModel(soundModel); - return startRecognitionLocked(modelData, + int status = startRecognitionLocked(modelData, false /* Don't notify for synchronous calls */); + + // Initialize power save, call active state monitoring logic. + if (status == STATUS_OK && !mRecognitionRequested) { + initializeTelephonyAndPowerStateListeners(); + mRecognitionRequested = true; + } + + return status; } } @@ -450,7 +453,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { modelData.clearCallback(); modelData.setRecognitionConfig(null); - if (!computeRecognitionRunningLocked()) { + if (!computeRecognitionRequestedLocked()) { internalClearGlobalStateLocked(); } @@ -1196,20 +1199,20 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { } // Computes whether we have any recognition running at all (voice or generic). Sets - // the mRecognitionRunning variable with the result. - private boolean computeRecognitionRunningLocked() { + // the mRecognitionRequested variable with the result. + private boolean computeRecognitionRequestedLocked() { if (mModuleProperties == null || mModule == null) { - mRecognitionRunning = false; - return mRecognitionRunning; + mRecognitionRequested = false; + return mRecognitionRequested; } for (ModelData modelData : mModelDataMap.values()) { - if (modelData.isModelStarted()) { - mRecognitionRunning = true; - return mRecognitionRunning; + if (modelData.isRequested()) { + mRecognitionRequested = true; + return mRecognitionRequested; } } - mRecognitionRunning = false; - return mRecognitionRunning; + mRecognitionRequested = false; + return mRecognitionRequested; } // This class encapsulates the callbacks, state, handles and any other information that -- GitLab From f61c1044fb4af63b42e41ef76bbaff843a7226ac Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Fri, 19 Jul 2019 12:16:25 -0700 Subject: [PATCH 376/620] Use binned brightness sensor instead of prox Prox can be noisy and should only be used as a fallback when a more robust sensor implementation is not available. Test: manually cover prox sensor Test: breakpoint Test: dumpsys Fixes: 137451005 Change-Id: If0fca42aca36546942930ce76be1353129fc91fc --- .../com/android/systemui/doze/DozeSensors.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index 5f52486b2bc6..a882309c06d4 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -43,6 +43,7 @@ import androidx.annotation.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; +import com.android.systemui.R; import com.android.systemui.plugins.SensorManagerPlugin; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.util.AlarmTimeout; @@ -255,12 +256,21 @@ public class DozeSensors { long mLastNear; final AlarmTimeout mCooldownTimer; final AlwaysOnDisplayPolicy mPolicy; - + final Sensor mSensor; public ProxSensor(AlwaysOnDisplayPolicy policy) { mPolicy = policy; mCooldownTimer = new AlarmTimeout(mAlarmManager, this::updateRegistered, "prox_cooldown", mHandler); + + // The default prox sensor can be noisy, so let's use a prox gated brightness sensor + // if available. + Sensor sensor = DozeSensors.findSensorWithType(mSensorManager, + mContext.getString(R.string.doze_brightness_sensor_type)); + if (sensor == null) { + sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); + } + mSensor = sensor; } void setRequested(boolean requested) { @@ -324,8 +334,9 @@ public class DozeSensors { @Override public String toString() { - return String.format("{registered=%s, requested=%s, coolingDown=%s, currentlyFar=%s}", - mRegistered, mRequested, mCooldownTimer.isScheduled(), mCurrentlyFar); + return String.format("{registered=%s, requested=%s, coolingDown=%s, currentlyFar=%s," + + " sensor=%s}", mRegistered, mRequested, mCooldownTimer.isScheduled(), + mCurrentlyFar, mSensor); } } -- GitLab From 68f5dae5b6489f982f55e0e8fc951bd084deb65f Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Tue, 16 Jul 2019 15:42:48 -0700 Subject: [PATCH 377/620] Fix class initialization issue We were getting an NPE because the superclass was calling an overridden method on its constructor, before the variable could be initialized. Test: atest ScrimControllerTest Fixes: 137665467 Fixes: 137878476 Change-Id: I8914eac86cac19d92a68a2d55d97dfcee4066ed3 (cherry picked from commit 1c72bc21514eb6b76f80cef68be1245fb5d4f423) --- .../android/systemui/colorextraction/SysuiColorExtractor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java index 0e93f42a3554..d3e8b3d3236e 100644 --- a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java +++ b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java @@ -77,7 +77,7 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable, protected void extractWallpaperColors() { super.extractWallpaperColors(); // mTonal is final but this method will be invoked by the base class during its ctor. - if (mTonal == null) { + if (mTonal == null || mNeutralColorsLock == null) { return; } mTonal.applyFallback(mLockColors == null ? mSystemColors : mLockColors, mNeutralColorsLock); -- GitLab From 893a9dfa102782b66950134b8f3fb98ff32550e4 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Fri, 19 Jul 2019 17:30:16 -0700 Subject: [PATCH 378/620] Fixed a bug with the animation of the notification background The position of the background could be 0 and therefore the background could fly over the whole screen. We're now positioning the top section at the start of the first visible section. Fixes: 137885070 Test: atest SystemUiTests Change-Id: I6720b570f5cd209249b90681cdf6c6a56cf0194e --- .../stack/NotificationStackScrollLayout.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 8fe34180203f..80e1ac10e319 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -2516,12 +2516,20 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } return; } - int minTopPosition = 0; + int minTopPosition; NotificationSection lastSection = getLastVisibleSection(); if (mStatusBarState != StatusBarState.KEYGUARD) { minTopPosition = (int) (mTopPadding + mStackTranslation); } else if (lastSection == null) { minTopPosition = mTopPadding; + } else { + // The first sections could be empty while there could still be elements in later + // sections. The position of these first few sections is determined by the position of + // the first visible section. + NotificationSection firstVisibleSection = getFirstVisibleSection(); + firstVisibleSection.updateBounds(0 /* minTopPosition*/, 0 /* minBottomPosition */, + false /* shiftPulsingWithFirst */); + minTopPosition = firstVisibleSection.getBounds().top; } boolean shiftPulsingWithFirst = mAmbientPulseManager.getAllEntries().count() <= 1; for (NotificationSection section : mSections) { -- GitLab From 31ebb40789704c7a69c85a255bf401f47cf1a7f6 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Fri, 19 Jul 2019 18:29:56 -0700 Subject: [PATCH 379/620] Fixed that silent notifications weren't showing on AOD Because we were listening to the tuning value but not actually handling the null default value, the visibility of the silent icons would be wrong by default. Additionally, the whole settings check isn't actually needed since we are already limited to the visible notifications in the notification list and therefore the setting is already automatically applied. Fixes: 137977737 Test: atest SystemUItests Change-Id: I93e23b08525c6bb8d2219a4bdaa0bbc64ce55d8d --- .../phone/NotificationIconAreaController.java | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index d2159ca15b24..21de8a59836e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -4,7 +4,6 @@ import android.content.Context; import android.content.res.Resources; import android.graphics.Color; import android.graphics.Rect; -import android.provider.Settings; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -32,7 +31,6 @@ import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; -import com.android.systemui.tuner.TunerService; import java.util.ArrayList; import java.util.Objects; @@ -58,7 +56,6 @@ public class NotificationIconAreaController implements DarkReceiver, private final KeyguardBypassController mBypassController; private final DozeParameters mDozeParameters; - private boolean mShowSilentOnLockscreen = true; private int mIconSize; private int mIconHPadding; private int mIconTint = Color.WHITE; @@ -101,11 +98,6 @@ public class NotificationIconAreaController implements DarkReceiver, initializeNotificationAreaViews(context); reloadAodColor(); - - TunerService tunerService = Dependency.get(TunerService.class); - tunerService.addTunable((key, newValue) -> { - mShowSilentOnLockscreen = "1".equals(newValue); - }, Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS); } protected View inflateIconArea(LayoutInflater inflater) { @@ -238,7 +230,7 @@ public class NotificationIconAreaController implements DarkReceiver, } protected boolean shouldShowNotificationIcon(NotificationEntry entry, - boolean showAmbient, boolean showLowPriority, boolean hideDismissed, + boolean showAmbient, boolean hideDismissed, boolean hideRepliedMessages, boolean hideCurrentMedia, boolean hideCenteredIcon, boolean hidePulsing, boolean onlyShowCenteredIcon) { @@ -257,9 +249,6 @@ public class NotificationIconAreaController implements DarkReceiver, if (hideCurrentMedia && entry.key.equals(mMediaManager.getMediaNotificationKey())) { return false; } - if (!showLowPriority && !entry.isHighPriority()) { - return false; - } if (!entry.isTopLevelChild()) { return false; } @@ -297,7 +286,6 @@ public class NotificationIconAreaController implements DarkReceiver, private void updateShelfIcons() { updateIconsForLayout(entry -> entry.expandedIcon, mShelfIcons, true /* showAmbient */, - true /* showLowPriority */, false /* hideDismissed */, false /* hideRepliedMessages */, false /* hideCurrentMedia */, @@ -309,7 +297,6 @@ public class NotificationIconAreaController implements DarkReceiver, public void updateStatusBarIcons() { updateIconsForLayout(entry -> entry.icon, mNotificationIcons, false /* showAmbient */, - true /* showLowPriority */, true /* hideDismissed */, true /* hideRepliedMessages */, false /* hideCurrentMedia */, @@ -321,7 +308,6 @@ public class NotificationIconAreaController implements DarkReceiver, private void updateCenterIcon() { updateIconsForLayout(entry -> entry.centeredIcon, mCenteredIcon, false /* showAmbient */, - true /* showLowPriority */, false /* hideDismissed */, false /* hideRepliedMessages */, false /* hideCurrentMedia */, @@ -333,7 +319,6 @@ public class NotificationIconAreaController implements DarkReceiver, public void updateAodNotificationIcons() { updateIconsForLayout(entry -> entry.aodIcon, mAodIcons, false /* showAmbient */, - mShowSilentOnLockscreen /* showLowPriority */, true /* hideDismissed */, true /* hideRepliedMessages */, true /* hideCurrentMedia */, @@ -353,7 +338,7 @@ public class NotificationIconAreaController implements DarkReceiver, * @param hidePulsing should pulsing notifications be hidden */ private void updateIconsForLayout(Function function, - NotificationIconContainer hostLayout, boolean showAmbient, boolean showLowPriority, + NotificationIconContainer hostLayout, boolean showAmbient, boolean hideDismissed, boolean hideRepliedMessages, boolean hideCurrentMedia, boolean hideCenteredIcon, boolean hidePulsing, boolean onlyShowCenteredIcon) { ArrayList toShow = new ArrayList<>( @@ -364,7 +349,7 @@ public class NotificationIconAreaController implements DarkReceiver, View view = mNotificationScrollLayout.getChildAt(i); if (view instanceof ExpandableNotificationRow) { NotificationEntry ent = ((ExpandableNotificationRow) view).getEntry(); - if (shouldShowNotificationIcon(ent, showAmbient, showLowPriority, hideDismissed, + if (shouldShowNotificationIcon(ent, showAmbient, hideDismissed, hideRepliedMessages, hideCurrentMedia, hideCenteredIcon, hidePulsing, onlyShowCenteredIcon)) { StatusBarIconView iconView = function.apply(ent); -- GitLab From e3f111ad7ef32346bcbc09ec0deedec49f1f1d54 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 20 Jul 2019 10:14:43 -0700 Subject: [PATCH 380/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I5bc0c666b5733a049ecffef86891a1d564bfdfc8 --- core/res/res/values-ca/strings.xml | 2 +- core/res/res/values-pl/strings.xml | 2 +- core/res/res/values-vi/strings.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 5c7dba85e90d..72890ab01bef 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -594,7 +594,7 @@ "Icona facial" "llegir la configuració de sincronització" - "Permet que l\'aplicació llegeixi la configuració de sincronització d\'un compte. Per exemple, això pot determinar que l\'aplicació Persones estigui sincronitzada amb un compte." + "Permet que l\'aplicació llegeixi la configuració de sincronització d\'un compte. Per exemple, això pot determinar que l\'aplicació Contactes estigui sincronitzada amb un compte." "activar o desactivar la sincronització" "Permet que una aplicació modifiqui la configuració de sincronització d\'un compte. Per exemple, aquesta acció es pot fer servir per activar la sincronització de l\'aplicació Persones amb un compte." "llegir les estadístiques de sincronització" diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 99f448b6ad7d..6569b34f7254 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1711,7 +1711,7 @@ "Gdy skrót jest włączony, jednoczesne naciśnięcie przez trzy sekundy obu klawiszy sterowania głośnością uruchomi funkcję ułatwień dostępu.\n\nBieżąca funkcja ułatwień dostępu:\n%1$s\n\nFunkcję możesz zmienić, wybierając Ustawienia > Ułatwienia dostępu." "Wyłącz skrót" "Użyj skrótu" - "Inwersja kolorów" + "Odwrócenie kolorów" "Korekcja kolorów" "Skrót ułatwień dostępu wyłączył usługę %1$s" "Skrót ułatwień dostępu wyłączył usługę %1$s" diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 2631d87cd67c..8326bec7c0d3 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -520,7 +520,7 @@ "Cho phép ứng dụng này sửa đổi bộ sưu tập ảnh của bạn." "đọc vị trí từ bộ sưu tập phương tiện" "Cho phép ứng dụng này đọc vị trí từ bộ sưu tập phương tiện của bạn." - "Hãy xác minh đó là bạn" + "Xác minh danh tính của bạn" "Không có phần cứng sinh trắc học" "Đã hủy xác thực" "Không nhận dạng được" -- GitLab From 82f109936132e57368ca06da4bd8bb2fc4b76cdd Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 20 Jul 2019 21:30:49 -0700 Subject: [PATCH 381/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I9041213adcd88452a12b56e110017a314f7a8139 --- packages/SystemUI/res/values-sq/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 7e97a3decf32..928644ccdbb1 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -613,7 +613,7 @@ "Të hiqet Sintonizuesi i Sistemit të Ndërfaqes së Përdoruesit nga Cilësimet dhe të ndërpritet përdorimi i të gjitha funksioneve të tij?" "Aplikacioni nuk është instaluar në pajisjen tënde." "Trego sekondat e orës" - "Trego sekondat e orës në shiritin e statusit. Mund të ndikojë te jeta e baterisë." + "Trego sekondat e orës në shiritin e statusit. Mund të ndikojë te kohëzgjatja e baterisë." "Risistemo Cilësimet e shpejta" "Shfaq ndriçimin te Cilësimet e shpejta" "Eksperimentale" -- GitLab From 15fd49ceb0db378a8ffdc993b785b6e4364fc6c6 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 20 Jul 2019 21:47:56 -0700 Subject: [PATCH 382/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: If28671c4e7d65d7bd9d79effac18e791fe151028 --- packages/SystemUI/res/values-sq/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 08816c7d51e4..83a7aaa684c3 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -614,7 +614,7 @@ "Të hiqet Sintonizuesi i Sistemit të Ndërfaqes së Përdoruesit nga Cilësimet dhe të ndërpritet përdorimi i të gjitha funksioneve të tij?" "Aplikacioni nuk është instaluar në pajisjen tënde." "Trego sekondat e orës" - "Trego sekondat e orës në shiritin e statusit. Mund të ndikojë te jeta e baterisë." + "Trego sekondat e orës në shiritin e statusit. Mund të ndikojë te kohëzgjatja e baterisë." "Risistemo Cilësimet e shpejta" "Shfaq ndriçimin te Cilësimet e shpejta" "Eksperimentale" -- GitLab From c014fb5ca964ed67963ccd05b4ade7dddca65a83 Mon Sep 17 00:00:00 2001 From: Andrei Onea Date: Fri, 28 Jun 2019 18:42:22 +0100 Subject: [PATCH 383/620] Add adb command for overriding platform compat config New adb command supports has the format: adb shell am compat enable|disable|reset Bug: 136051618 Test: adb shell am compat enable 42 foo.bar.baz Test: adb shell am compat disable 42 foo.bar.baz Test: adb shell am compat reset 42 foo.bar.baz Test: adb shell am compat enable fooChange foo.bar.baz Change-Id: I981067477f6f4aa435459c0bc9a52099e6f5d445 Merged-In: I981067477f6f4aa435459c0bc9a52099e6f5d445 Exempted-From-Owner-Approval: cherry-pick of an already approved CL (cherry picked from commit a2055011db32f19288d8da9fb061f9502b3182e1) --- .../am/ActivityManagerShellCommand.java | 49 +++++++++++++++++++ .../android/server/compat/CompatConfig.java | 14 ++++-- 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index cba9674d7360..6db9702b8370 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -88,6 +88,7 @@ import android.view.Display; import com.android.internal.util.HexDump; import com.android.internal.util.MemInfoReader; import com.android.internal.util.Preconditions; +import com.android.server.compat.CompatConfig; import java.io.BufferedReader; import java.io.File; @@ -288,6 +289,8 @@ final class ActivityManagerShellCommand extends ShellCommand { return runNoHomeScreen(pw); case "wait-for-broadcast-idle": return runWaitForBroadcastIdle(pw); + case "compat": + return runCompat(pw); default: return handleDefaultCommands(cmd); } @@ -2865,6 +2868,50 @@ final class ActivityManagerShellCommand extends ShellCommand { return 0; } + private int runCompat(PrintWriter pw) { + final CompatConfig config = CompatConfig.get(); + String toggleValue = getNextArgRequired(); + long changeId; + String changeIdString = getNextArgRequired(); + try { + changeId = Long.parseLong(changeIdString); + } catch (NumberFormatException e) { + changeId = config.lookupChangeId(changeIdString); + } + if (changeId == -1) { + pw.println("Unknown or invalid change: '" + changeIdString + "'."); + } + String packageName = getNextArgRequired(); + switch(toggleValue) { + case "enable": + if (!config.addOverride(changeId, packageName, true)) { + pw.println("Warning! Change " + changeId + " is not known yet. Enabling it" + + " could have no effect."); + } + pw.println("Enabled change " + changeId + " for " + packageName + "."); + return 0; + case "disable": + if (!config.addOverride(changeId, packageName, false)) { + pw.println("Warning! Change " + changeId + " is not known yet. Disabling it" + + " could have no effect."); + } + pw.println("Disabled change " + changeId + " for " + packageName + "."); + return 0; + case "reset": + if (config.removeOverride(changeId, packageName)) { + pw.println("Reset change " + changeId + " for " + packageName + + " to default value."); + } else { + pw.println("No override exists for changeId " + changeId + "."); + } + return 0; + default: + pw.println("Invalid toggle value: '" + toggleValue + "'."); + } + return -1; + } + + private Resources getResources(PrintWriter pw) throws RemoteException { // system resources does not contain all the device configuration, construct it manually. Configuration config = mInterface.getConfiguration(); @@ -3170,6 +3217,8 @@ final class ActivityManagerShellCommand extends ShellCommand { pw.println(" without restarting any processes."); pw.println(" write"); pw.println(" Write all pending state to storage."); + pw.println(" compat enable|disable|reset "); + pw.println(" Toggles a change either by id or by name for ."); pw.println(); Intent.printIntentArgsHelp(pw, ""); } diff --git a/services/core/java/com/android/server/compat/CompatConfig.java b/services/core/java/com/android/server/compat/CompatConfig.java index fea5d836ac25..bcf1d80781a6 100644 --- a/services/core/java/com/android/server/compat/CompatConfig.java +++ b/services/core/java/com/android/server/compat/CompatConfig.java @@ -128,20 +128,24 @@ public final class CompatConfig { *

Note, package overrides are not persistent and will be lost on system or runtime restart. * * @param changeId The ID of the change to be overridden. Note, this call will succeed even if - * this change is not known; it will only have any affect if any code in the + * this change is not known; it will only have any effect if any code in the * platform is gated on the ID given. * @param packageName The app package name to override the change for. * @param enabled If the change should be enabled or disabled. + * @return {@code true} if the change existed before adding the override. */ - public void addOverride(long changeId, String packageName, boolean enabled) { + public boolean addOverride(long changeId, String packageName, boolean enabled) { + boolean alreadyKnown = true; synchronized (mChanges) { CompatChange c = mChanges.get(changeId); if (c == null) { + alreadyKnown = false; c = new CompatChange(changeId); addChange(c); } c.addPackageOverride(packageName, enabled); } + return alreadyKnown; } /** @@ -151,14 +155,18 @@ public final class CompatConfig { * * @param changeId The ID of the change that was overridden. * @param packageName The app package name that was overridden. + * @return {@code true} if an override existed; */ - public void removeOverride(long changeId, String packageName) { + public boolean removeOverride(long changeId, String packageName) { + boolean overrideExists = false; synchronized (mChanges) { CompatChange c = mChanges.get(changeId); if (c != null) { + overrideExists = true; c.removePackageOverride(packageName); } } + return overrideExists; } } -- GitLab From 73d48ab970ac627a0dc54ada9b2d86c5e3083e05 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Tue, 16 Jul 2019 15:07:01 -0400 Subject: [PATCH 384/620] Add cleanup method to FalsingManager to prevent memory leaks. When the FalsingManager gets reloaded (due to plugins) it can leak its listeners and callbacks. This change fixes that. This is a CP of http://ag/8668802. Bug: 136351609 Test: manual Change-Id: I7ea8384678b60e78ed384e19bbd7932722fe2b9c Merged-In: I2b52d018d478dbcad4ecb7d8a5b361638d5c5877 --- .../src/com/android/systemui/plugins/FalsingManager.java | 4 +++- .../android/systemui/classifier/FalsingManagerImpl.java | 9 +++++++++ .../android/systemui/classifier/FalsingManagerProxy.java | 9 +++++++++ .../classifier/brightline/BrightLineFalsingManager.java | 5 +++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java index 28d5402bf707..52ec1f0bb330 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java @@ -30,7 +30,7 @@ import java.io.PrintWriter; */ @ProvidesInterface(version = FalsingManager.VERSION) public interface FalsingManager { - int VERSION = 1; + int VERSION = 2; void onSucccessfulUnlock(); @@ -103,4 +103,6 @@ public interface FalsingManager { void onTouchEvent(MotionEvent ev, int width, int height); void dump(PrintWriter pw); + + void cleanup(); } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java index 6fb6467d07b2..382c5d5c5954 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java @@ -168,6 +168,7 @@ public class FalsingManagerImpl implements FalsingManager { .append("enabled=").append(isEnabled() ? 1 : 0) .append(" mScreenOn=").append(mScreenOn ? 1 : 0) .append(" mState=").append(StatusBarState.toShortString(mState)) + .append(" mShowingAod=").append(mShowingAod ? 1 : 0) .toString() ); } @@ -550,6 +551,14 @@ public class FalsingManagerImpl implements FalsingManager { pw.println(); } + @Override + public void cleanup() { + mSensorManager.unregisterListener(mSensorEventListener); + mContext.getContentResolver().unregisterContentObserver(mSettingsObserver); + Dependency.get(StatusBarStateController.class).removeCallback(mStatusBarStateListener); + KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mKeyguardUpdateCallback); + } + public Uri reportRejectedTouch() { if (mDataCollector.isEnabled()) { return mDataCollector.reportRejectedTouch(); diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java index 69f243c8ed70..eb4edcc45c80 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java @@ -65,6 +65,7 @@ public class FalsingManagerProxy implements FalsingManager { public void onPluginConnected(FalsingPlugin plugin, Context context) { FalsingManager pluginFalsingManager = plugin.getFalsingManager(context); if (pluginFalsingManager != null) { + mInternalFalsingManager.cleanup(); mInternalFalsingManager = pluginFalsingManager; } } @@ -92,6 +93,9 @@ public class FalsingManagerProxy implements FalsingManager { public void setupFalsingManager(Context context) { boolean brightlineEnabled = DeviceConfig.getBoolean( DeviceConfig.NAMESPACE_SYSTEMUI, BRIGHTLINE_FALSING_MANAGER_ENABLED, true); + if (mInternalFalsingManager != null) { + mInternalFalsingManager.cleanup(); + } if (!brightlineEnabled) { mInternalFalsingManager = new FalsingManagerImpl(context); } else { @@ -290,4 +294,9 @@ public class FalsingManagerProxy implements FalsingManager { public void dump(PrintWriter pw) { mInternalFalsingManager.dump(pw); } + + @Override + public void cleanup() { + mInternalFalsingManager.cleanup(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java index 19c46e40f604..3d869bcc2e4b 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java @@ -309,6 +309,11 @@ public class BrightLineFalsingManager implements FalsingManager { public void dump(PrintWriter printWriter) { } + @Override + public void cleanup() { + unregisterSensors(); + } + static void logDebug(String msg) { logDebug(msg, null); } -- GitLab From 7b92b12342aeb33db5e78a79058e49080fabe1ae Mon Sep 17 00:00:00 2001 From: James O'Leary Date: Tue, 9 Jul 2019 12:43:45 -0400 Subject: [PATCH 385/620] Don't tell Assistant to hide on gesture completion or cancel hide() is called by DefaultUiController itself when a gesture fails to complete, or when the gesture animation finishes. (see DefaultUiController.animateInvocationCompletion() and progress == 0 branch in DefaultUiController.onInvocationProgress()) hide() calls AssistManager.hideAssist(), which ultimately calls VoiceInteractionSession#onCloseSystemDialogs(). We don't intend to ask the assist app to close its UI when the gesture completes or when invocation progress == 0. Specifically, NgaUiController.hide /does not/ actually hide the assistant (just our UI), and therefore [DefaultUiController|GoogleDefaultUiController] shouldn't either. There are times where NgaUiController does tell the assistant to close, but they're specific to the NGA UI (e.g. there was a tap outside). Bug: 136153254 Test: Verify WAI Change-Id: I1cb9cb28a1009808e22571b2658f50f57b3e25b4 --- .../SystemUI/src/com/android/systemui/assist/AssistManager.java | 2 +- .../src/com/android/systemui/assist/ui/DefaultUiController.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java index 97b6e7c58440..fe8cad2b5549 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java @@ -82,7 +82,7 @@ public class AssistManager implements ConfigurationChangedReceiver { void processBundle(Bundle hints); /** - * Hides the UI. + * Hides any SysUI for the assistant, but _does not_ close the assistant itself. */ void hide(); } diff --git a/packages/SystemUI/src/com/android/systemui/assist/ui/DefaultUiController.java b/packages/SystemUI/src/com/android/systemui/assist/ui/DefaultUiController.java index 662de3a5b5f5..0c4f05123c79 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/ui/DefaultUiController.java +++ b/packages/SystemUI/src/com/android/systemui/assist/ui/DefaultUiController.java @@ -118,7 +118,6 @@ public class DefaultUiController implements AssistManager.UiController { @Override // AssistManager.UiController public void hide() { - Dependency.get(AssistManager.class).hideAssist(); detach(); if (mInvocationAnimator.isRunning()) { mInvocationAnimator.cancel(); -- GitLab From db1d195e1eb99dfde708aa42595d7f84158fd335 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 22 Jul 2019 10:24:23 -0700 Subject: [PATCH 386/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I681ca87322a0adb4033884519eb6168470a433c9 --- core/res/res/values-zh-rCN/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 85d5cf9c7f95..ef50a39771ed 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -297,7 +297,7 @@ "麦克风" "录制音频" "允许<b>%1$s</b>录音吗?" - "健身运动" + "身体活动" "访问您的健身运动" "允许<b>%1$s</b>访问您的健身运动吗?" "相机" -- GitLab From 0e0c3b6070ef8d7eba6467bf2b127a926fc23112 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 22 Jul 2019 10:27:08 -0700 Subject: [PATCH 387/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: Ia5f78bd2c1d3037818b43b010b5c55c233ff1820 --- packages/SystemUI/res/values-da/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 08fb0b38c770..90ead3514b1d 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -255,8 +255,8 @@ "Lommelygten er tændt." "Lommelygten er slukket." "Lommelygten er tændt." - "Invertering af farver er slået fra." - "Invertering af farver er slået til." + "Ombytning af farver er slået fra." + "Ombytning af farver er slået til." "Mobilhotspot er slået fra." "Mobilhotspot er slået til." "Casting af din skærm er stoppet." -- GitLab From 75093f4f5df69e0725c0c5e51e9c080fe941550e Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 22 Jul 2019 11:00:54 -0700 Subject: [PATCH 388/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I9e12ebb9c597b7393a32d78a7b15c830326c2915 --- core/res/res/values-zh-rCN/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index ccbd5d293241..6247262793c2 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -297,7 +297,7 @@ "麦克风" "录制音频" "允许<b>%1$s</b>录音吗?" - "健身运动" + "身体活动" "访问您的健身运动" "允许<b>%1$s</b>访问您的健身运动吗?" "相机" -- GitLab From 09da14be408c63798455812bdff02c497238bc97 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 22 Jul 2019 11:01:57 -0700 Subject: [PATCH 389/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I8688211f4bb949f51359257a442b81d62e7057bf --- packages/SystemUI/res/values-da/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 271fa6915836..7ced76852607 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -254,8 +254,8 @@ "Lommelygten er tændt." "Lommelygten er slukket." "Lommelygten er tændt." - "Invertering af farver er slået fra." - "Invertering af farver er slået til." + "Ombytning af farver er slået fra." + "Ombytning af farver er slået til." "Mobilhotspot er slået fra." "Mobilhotspot er slået til." "Casting af din skærm er stoppet." -- GitLab From dc8fee7ea1f0f46cd49195846600c4a4da0d0d14 Mon Sep 17 00:00:00 2001 From: Robert Snoeberger Date: Fri, 19 Jul 2019 16:35:35 -0400 Subject: [PATCH 390/620] Don't animate clock when turning screen off. This change stops the animation because there isn't a transition from the no-header state to the music header state when turning the screen off (to AOD). Since there isn't a transition, there isn't an animation. This assumes that there isn't a transition from unlocked to lock screen. If there is, then there would be an animation of the music going away while arriving at the lock screen. Fixes: 137383007 Test: Checked repro steps in bug, clock doesn't animate. Test: Also checked repro steps when audio is paused, clock doesn't animate. Test: atest KeyguardSliceProviderTest.java Change-Id: If39777340b72bc623d6690bc4f784c7f5c26ea8d --- .../android/keyguard/KeyguardClockSwitch.java | 6 ++ .../android/keyguard/KeyguardSliceView.java | 66 ++++++++++++------- .../keyguard/KeyguardSliceProvider.java | 20 +++++- .../keyguard/KeyguardSliceProviderTest.java | 3 + 4 files changed, 67 insertions(+), 28 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java index 2483192eb04e..5097216a7405 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java @@ -584,6 +584,9 @@ public class KeyguardClockSwitch extends RelativeLayout { @Override public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues, TransitionValues endValues) { + if (!sceneRoot.isShown()) { + return null; + } final float cutoff = mCutoff; final int startVisibility = View.INVISIBLE; final int endVisibility = (int) endValues.values.get(PROPNAME_VISIBILITY); @@ -596,6 +599,9 @@ public class KeyguardClockSwitch extends RelativeLayout { @Override public Animator onDisappear(ViewGroup sceneRoot, View view, TransitionValues startValues, TransitionValues endValues) { + if (!sceneRoot.isShown()) { + return null; + } final float cutoff = 1f - mCutoff; final int startVisibility = View.VISIBLE; final int endVisibility = (int) endValues.values.get(PROPNAME_VISIBILITY); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java index e219e24a8944..af4e61b3f6bc 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java @@ -89,6 +89,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe private final HashMap mClickActions; private final ActivityStarter mActivityStarter; private final ConfigurationController mConfigurationController; + private final LayoutTransition mLayoutTransition; private Uri mKeyguardSliceUri; @VisibleForTesting TextView mTitle; @@ -126,16 +127,16 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe mActivityStarter = activityStarter; mConfigurationController = configurationController; - LayoutTransition transition = new LayoutTransition(); - transition.setStagger(LayoutTransition.CHANGE_APPEARING, DEFAULT_ANIM_DURATION / 2); - transition.setDuration(LayoutTransition.APPEARING, DEFAULT_ANIM_DURATION); - transition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 2); - transition.disableTransitionType(LayoutTransition.CHANGE_APPEARING); - transition.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); - transition.setInterpolator(LayoutTransition.APPEARING, Interpolators.FAST_OUT_SLOW_IN); - transition.setInterpolator(LayoutTransition.DISAPPEARING, Interpolators.ALPHA_OUT); - transition.setAnimateParentHierarchy(false); - setLayoutTransition(transition); + mLayoutTransition = new LayoutTransition(); + mLayoutTransition.setStagger(LayoutTransition.CHANGE_APPEARING, DEFAULT_ANIM_DURATION / 2); + mLayoutTransition.setDuration(LayoutTransition.APPEARING, DEFAULT_ANIM_DURATION); + mLayoutTransition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 2); + mLayoutTransition.disableTransitionType(LayoutTransition.CHANGE_APPEARING); + mLayoutTransition.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); + mLayoutTransition.setInterpolator(LayoutTransition.APPEARING, + Interpolators.FAST_OUT_SLOW_IN); + mLayoutTransition.setInterpolator(LayoutTransition.DISAPPEARING, Interpolators.ALPHA_OUT); + mLayoutTransition.setAnimateParentHierarchy(false); } @Override @@ -174,6 +175,12 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe mConfigurationController.removeCallback(this); } + @Override + public void onVisibilityAggregated(boolean isVisible) { + super.onVisibilityAggregated(isVisible); + setLayoutTransition(isVisible ? mLayoutTransition : null); + } + /** * Returns whether the current visible slice has a title/header. */ @@ -419,6 +426,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe * their desired positions. */ private final Animation.AnimationListener mKeepAwakeListener; + private LayoutTransition mLayoutTransition; private float mDarkAmount; public Row(Context context) { @@ -440,33 +448,41 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe @Override protected void onFinishInflate() { - LayoutTransition transition = new LayoutTransition(); - transition.setDuration(DEFAULT_ANIM_DURATION); + mLayoutTransition = new LayoutTransition(); + mLayoutTransition.setDuration(DEFAULT_ANIM_DURATION); PropertyValuesHolder left = PropertyValuesHolder.ofInt("left", 0, 1); PropertyValuesHolder right = PropertyValuesHolder.ofInt("right", 0, 1); ObjectAnimator changeAnimator = ObjectAnimator.ofPropertyValuesHolder((Object) null, left, right); - transition.setAnimator(LayoutTransition.CHANGE_APPEARING, changeAnimator); - transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeAnimator); - transition.setInterpolator(LayoutTransition.CHANGE_APPEARING, + mLayoutTransition.setAnimator(LayoutTransition.CHANGE_APPEARING, changeAnimator); + mLayoutTransition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeAnimator); + mLayoutTransition.setInterpolator(LayoutTransition.CHANGE_APPEARING, Interpolators.ACCELERATE_DECELERATE); - transition.setInterpolator(LayoutTransition.CHANGE_DISAPPEARING, + mLayoutTransition.setInterpolator(LayoutTransition.CHANGE_DISAPPEARING, Interpolators.ACCELERATE_DECELERATE); - transition.setStartDelay(LayoutTransition.CHANGE_APPEARING, DEFAULT_ANIM_DURATION); - transition.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, DEFAULT_ANIM_DURATION); + mLayoutTransition.setStartDelay(LayoutTransition.CHANGE_APPEARING, + DEFAULT_ANIM_DURATION); + mLayoutTransition.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, + DEFAULT_ANIM_DURATION); ObjectAnimator appearAnimator = ObjectAnimator.ofFloat(null, "alpha", 0f, 1f); - transition.setAnimator(LayoutTransition.APPEARING, appearAnimator); - transition.setInterpolator(LayoutTransition.APPEARING, Interpolators.ALPHA_IN); + mLayoutTransition.setAnimator(LayoutTransition.APPEARING, appearAnimator); + mLayoutTransition.setInterpolator(LayoutTransition.APPEARING, Interpolators.ALPHA_IN); ObjectAnimator disappearAnimator = ObjectAnimator.ofFloat(null, "alpha", 1f, 0f); - transition.setInterpolator(LayoutTransition.DISAPPEARING, Interpolators.ALPHA_OUT); - transition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 4); - transition.setAnimator(LayoutTransition.DISAPPEARING, disappearAnimator); + mLayoutTransition.setInterpolator(LayoutTransition.DISAPPEARING, + Interpolators.ALPHA_OUT); + mLayoutTransition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 4); + mLayoutTransition.setAnimator(LayoutTransition.DISAPPEARING, disappearAnimator); - transition.setAnimateParentHierarchy(false); - setLayoutTransition(transition); + mLayoutTransition.setAnimateParentHierarchy(false); + } + + @Override + public void onVisibilityAggregated(boolean isVisible) { + super.onVisibilityAggregated(isVisible); + setLayoutTransition(isVisible ? mLayoutTransition : null); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java index 5136682bb292..48f32cf04fb2 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java @@ -52,6 +52,7 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.R; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationMediaManager; +import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.policy.NextAlarmController; @@ -62,7 +63,6 @@ import com.android.systemui.util.wakelock.SettableWakeLock; import com.android.systemui.util.wakelock.WakeLock; import java.util.Date; -import java.util.HashSet; import java.util.Locale; import java.util.TimeZone; import java.util.concurrent.TimeUnit; @@ -128,6 +128,7 @@ public class KeyguardSliceProvider extends SliceProvider implements private CharSequence mMediaTitle; private CharSequence mMediaArtist; protected boolean mDozing; + private int mStatusBarState; private boolean mMediaIsVisible; /** @@ -231,7 +232,11 @@ public class KeyguardSliceProvider extends SliceProvider implements protected boolean needsMediaLocked() { boolean keepWhenAwake = mKeyguardBypassController != null && mKeyguardBypassController.getBypassEnabled() && mDozeParameters.getAlwaysOn(); - return !TextUtils.isEmpty(mMediaTitle) && mMediaIsVisible && (mDozing || keepWhenAwake); + // Show header if music is playing and the status bar is in the shade state. This way, an + // animation isn't necessary when pressing power and transitioning to AOD. + boolean keepWhenShade = mStatusBarState == StatusBarState.SHADE && mMediaIsVisible; + return !TextUtils.isEmpty(mMediaTitle) && mMediaIsVisible && (mDozing || keepWhenAwake + || keepWhenShade); } protected void addMediaLocked(ListBuilder listBuilder) { @@ -458,7 +463,7 @@ public class KeyguardSliceProvider extends SliceProvider implements synchronized (this) { boolean nextVisible = NotificationMediaManager.isPlayingState(state); mHandler.removeCallbacksAndMessages(mMediaToken); - if (mMediaIsVisible && !nextVisible) { + if (mMediaIsVisible && !nextVisible && mStatusBarState != StatusBarState.SHADE) { // We need to delay this event for a few millis when stopping to avoid jank in the // animation. The media app might not send its update when buffering, and the slice // would end up without a header for 0.5 second. @@ -515,5 +520,14 @@ public class KeyguardSliceProvider extends SliceProvider implements @Override public void onStateChanged(int newState) { + final boolean notify; + synchronized (this) { + boolean needsMedia = needsMediaLocked(); + mStatusBarState = newState; + notify = needsMedia != needsMediaLocked(); + } + if (notify) { + notifyChange(); + } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java index 893f3d184acb..9576cb2eec45 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java @@ -48,6 +48,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationMediaManager; +import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.policy.ZenModeController; @@ -197,6 +198,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { @Test public void onMetadataChanged_updatesSlice() { + mProvider.onStateChanged(StatusBarState.KEYGUARD); mProvider.onDozingChanged(true); reset(mContentResolver); mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING); @@ -210,6 +212,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { @Test public void onDozingChanged_updatesSliceIfMedia() { + mProvider.onStateChanged(StatusBarState.KEYGUARD); mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING); reset(mContentResolver); // Show media when dozing -- GitLab From f2cf8d1bc3e17481d260fbbc97548b66a8970330 Mon Sep 17 00:00:00 2001 From: Hai Zhang Date: Mon, 22 Jul 2019 14:01:32 -0700 Subject: [PATCH 391/620] Fix permission javadoc about whitelisting. Fixes: 138122977 Test: presubmit Change-Id: I8dec56e4385877789ea3504bc1efbe59ad0ddbb7 --- core/res/AndroidManifest.xml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index a3fccd96f224..e097e7c78474 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -726,7 +726,7 @@

Protection level: dangerous

This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> Protection level: dangerous

This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> Protection level: dangerous

This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> Protection level: dangerous

This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> Protection level: dangerous

This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> Protection level: dangerous

This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. @hide Pending API council approval --> @@ -851,7 +851,7 @@ targetSdkVersion} is 4 or higher.

This is a soft restricted permission which cannot be held by an app it its - full form until the installer on record did not whitelist the permission. + full form until the installer on record whitelists the permission. Specifically, if the permission is whitelisted the holder app can access external storage and the visual and aural media collections while if the permission is not whitelisted the holder app can only access to the visual @@ -948,7 +948,7 @@

Protection level: dangerous

This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> Protection level: dangerous

This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> Protection level: dangerous

This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> Protection level: dangerous

This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. @deprecated Applications should use {@link android.telecom.CallRedirectionService} instead -- GitLab From 8ee02b1e7d2110fd857414620f63ab15c168579f Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Mon, 22 Jul 2019 14:49:18 -0700 Subject: [PATCH 392/620] Improved the heads up experience when notifications were blocked When notifications were blocked due to proximity, the heads up would never show until unlocked. We're now showing it when the screen turns on. This also avoids the header to be shown while the notifications are fully collapsed, since that was the only element that changed before. Fixes: 137711785 Test: get hun in pocket, pull out, observe notification visible Change-Id: I9c3d0cdc341eb2d95bcb76099e59b0d561f81210 --- .../NotificationWakeUpCoordinator.kt | 38 +++++++++++-------- .../phone/HeadsUpAppearanceController.java | 38 ++++++++++++------- .../systemui/statusbar/phone/LockIcon.java | 2 +- .../phone/NotificationPanelView.java | 5 +++ .../systemui/statusbar/phone/StatusBar.java | 3 +- .../HeadsUpAppearanceControllerTest.java | 5 +++ 6 files changed, 60 insertions(+), 31 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt index 6a3816c50330..f7e5bcf4769c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt @@ -64,7 +64,6 @@ class NotificationWakeUpCoordinator @Inject constructor( private var mVisibilityAnimator: ObjectAnimator? = null private var mVisibilityAmount = 0.0f private var mLinearVisibilityAmount = 0.0f - private var mWakingUp = false private val mEntrySetToClearWhenFinished = mutableSetOf() private val mDozeParameters: DozeParameters private var pulseExpanding: Boolean = false @@ -73,6 +72,25 @@ class NotificationWakeUpCoordinator @Inject constructor( var fullyAwake: Boolean = false + var wakingUp = false + set(value) { + field = value + willWakeUp = false + if (value) { + if (mNotificationsVisible && !mNotificationsVisibleForExpansion + && !bypassController.bypassEnabled) { + // We're waking up while pulsing, let's make sure the animation looks nice + mStackScroller.wakeUpFromPulse(); + } + if (bypassController.bypassEnabled && !mNotificationsVisible) { + // Let's make sure our huns become visible once we are waking up in case + // they were blocked by the proximity sensor + updateNotificationVisibility(animate = shouldAnimateVisibility(), + increaseSpeed = false) + } + } + } + var willWakeUp = false set(value) { if (!value || mDozeAmount != 0.0f) { @@ -112,7 +130,7 @@ class NotificationWakeUpCoordinator @Inject constructor( var canShow = pulsing if (bypassController.bypassEnabled) { // We also allow pulsing on the lock screen! - canShow = canShow || (mWakingUp || willWakeUp || fullyAwake) + canShow = canShow || (wakingUp || willWakeUp || fullyAwake) && statusBarStateController.state == StatusBarState.KEYGUARD } return canShow @@ -160,7 +178,7 @@ class NotificationWakeUpCoordinator @Inject constructor( wakeUpListeners.add(listener); } - fun removeFullyHiddenChangedListener(listener: WakeUpListener) { + fun removeListener(listener: WakeUpListener) { wakeUpListeners.remove(listener); } @@ -169,7 +187,7 @@ class NotificationWakeUpCoordinator @Inject constructor( var visible = mNotificationsVisibleForExpansion || mHeadsUpManagerPhone.hasNotifications() visible = visible && canShowPulsingHuns - if (!visible && mNotificationsVisible && (mWakingUp || willWakeUp) && mDozeAmount != 0.0f) { + if (!visible && mNotificationsVisible && (wakingUp || willWakeUp) && mDozeAmount != 0.0f) { // let's not make notifications invisible while waking up, otherwise the animation // is strange return; @@ -307,16 +325,6 @@ class NotificationWakeUpCoordinator @Inject constructor( return if (bypassController.bypassEnabled) 0.0f else overflow } - fun setWakingUp(wakingUp: Boolean) { - willWakeUp = false - mWakingUp = wakingUp - if (wakingUp && mNotificationsVisible && !mNotificationsVisibleForExpansion - && !bypassController.bypassEnabled) { - // We're waking up while pulsing, let's make sure the animation looks nice - mStackScroller.wakeUpFromPulse(); - } - } - override fun onHeadsUpStateChanged(entry: NotificationEntry, isHeadsUp: Boolean) { var animate = shouldAnimateVisibility() if (!isHeadsUp) { @@ -325,7 +333,7 @@ class NotificationWakeUpCoordinator @Inject constructor( // if we animate, we see the shelf briefly visible. Instead we fully animate // the notification and its background out animate = false - } else if (!mWakingUp && !willWakeUp){ + } else if (!wakingUp && !willWakeUp){ // TODO: look that this is done properly and not by anyone else entry.setHeadsUpAnimatingAway(true) mEntrySetToClearWhenFinished.add(entry) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java index 46dd5e62ddda..f53c4e8c818e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java @@ -35,6 +35,7 @@ import com.android.systemui.statusbar.CrossFadeHelper; import com.android.systemui.statusbar.HeadsUpStatusBarView; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; +import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; @@ -48,7 +49,7 @@ import java.util.function.Consumer; * Controls the appearance of heads up notifications in the icon area and the header itself. */ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, - DarkIconDispatcher.DarkReceiver { + DarkIconDispatcher.DarkReceiver, NotificationWakeUpCoordinator.WakeUpListener { public static final int CONTENT_FADE_DURATION = 110; public static final int CONTENT_FADE_DELAY = 100; private final NotificationIconAreaController mNotificationIconAreaController; @@ -67,6 +68,7 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, private final KeyguardBypassController mBypassController; private final StatusBarStateController mStatusBarStateController; private final CommandQueue mCommandQueue; + private final NotificationWakeUpCoordinator mWakeUpCoordinator; @VisibleForTesting float mExpandedHeight; @VisibleForTesting @@ -95,9 +97,10 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, HeadsUpManagerPhone headsUpManager, View statusbarView, SysuiStatusBarStateController statusBarStateController, - KeyguardBypassController keyguardBypassController) { + KeyguardBypassController keyguardBypassController, + NotificationWakeUpCoordinator wakeUpCoordinator) { this(notificationIconAreaController, headsUpManager, statusBarStateController, - keyguardBypassController, + keyguardBypassController, wakeUpCoordinator, statusbarView.findViewById(R.id.heads_up_status_bar_view), statusbarView.findViewById(R.id.notification_stack_scroller), statusbarView.findViewById(R.id.notification_panel), @@ -112,6 +115,7 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, HeadsUpManagerPhone headsUpManager, StatusBarStateController stateController, KeyguardBypassController bypassController, + NotificationWakeUpCoordinator wakeUpCoordinator, HeadsUpStatusBarView headsUpStatusBarView, NotificationStackScrollLayout stackScroller, NotificationPanelView panelView, @@ -153,6 +157,8 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, }); mBypassController = bypassController; mStatusBarStateController = stateController; + mWakeUpCoordinator = wakeUpCoordinator; + wakeUpCoordinator.addListener(this); mCommandQueue = getComponent(headsUpStatusBarView.getContext(), CommandQueue.class); mKeyguardMonitor = Dependency.get(KeyguardMonitor.class); } @@ -161,6 +167,7 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, public void destroy() { mHeadsUpManager.removeListener(this); mHeadsUpStatusBarView.setOnDrawingRectChangedListener(null); + mWakeUpCoordinator.removeListener(this); mPanelView.removeTrackingHeadsUpListener(mSetTrackingHeadsUp); mPanelView.removeVerticalTranslationListener(mUpdatePanelTranslation); mPanelView.setHeadsUpAppearanceController(null); @@ -289,6 +296,11 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, updateParentClipping(true /* shouldClip */); }); } + // Show the status bar icons when the view gets shown / hidden + if (mStatusBarStateController.getState() != StatusBarState.SHADE) { + mCommandQueue.recomputeDisableFlags( + mHeadsUpStatusBarView.getContext().getDisplayId(), false); + } } } @@ -362,10 +374,12 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, * @return if the heads up status bar view should be shown */ public boolean shouldBeVisible() { - boolean canShow = !mIsExpanded; + boolean notificationsShown = !mWakeUpCoordinator.getNotificationsFullyHidden(); + boolean canShow = !mIsExpanded && notificationsShown; if (mBypassController.getBypassEnabled() && (mStatusBarStateController.getState() == StatusBarState.KEYGUARD - || mKeyguardMonitor.isKeyguardGoingAway())) { + || mKeyguardMonitor.isKeyguardGoingAway()) + && notificationsShown) { canShow = true; } return canShow && mHeadsUpManager.hasPinnedHeadsUp(); @@ -377,15 +391,6 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, updateHeader(entry); } - @Override - public void onHeadsUpPinnedModeChanged(boolean inPinnedMode) { - if (mStatusBarStateController.getState() != StatusBarState.SHADE) { - // Show the status bar icons when the pinned mode changes - mCommandQueue.recomputeDisableFlags( - mHeadsUpStatusBarView.getContext().getDisplayId(), false); - } - } - public void setAppearFraction(float expandedHeight, float appearFraction) { boolean changed = expandedHeight != mExpandedHeight; mExpandedHeight = expandedHeight; @@ -451,4 +456,9 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, mAppearFraction = oldController.mAppearFraction; } } + + @Override + public void onFullyHiddenChanged(boolean isFullyHidden) { + updateTopEntry(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index 1360a084207b..b13af8bea784 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -217,7 +217,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange mConfigurationController.removeCallback(this); mKeyguardUpdateMonitor.removeCallback(mUpdateMonitorCallback); mKeyguardMonitor.removeCallback(mKeyguardMonitorCallback); - mWakeUpCoordinator.removeFullyHiddenChangedListener(this); + mWakeUpCoordinator.removeListener(this); mUnlockMethodCache.removeListener(this); if (mDockManager != null) { mDockManager.removeListener(mDockEventListener); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 37855ae592a5..d8b665e11359 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -453,6 +453,11 @@ public class NotificationPanelView extends PanelView implements mQsFrame = findViewById(R.id.qs_frame); mPulseExpansionHandler.setUp(mNotificationStackScroller, this, mShadeController); mWakeUpCoordinator.addListener(new NotificationWakeUpCoordinator.WakeUpListener() { + @Override + public void onFullyHiddenChanged(boolean isFullyHidden) { + updateKeyguardStatusBarForHeadsUp(); + } + @Override public void onPulseExpansionChanged(boolean expandingChanged) { if (mKeyguardBypassController.getBypassEnabled()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index d93dc950a077..32e9b112a824 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -856,7 +856,8 @@ public class StatusBar extends SystemUI implements DemoMode, } mHeadsUpAppearanceController = new HeadsUpAppearanceController( mNotificationIconAreaController, mHeadsUpManager, mStatusBarWindow, - mStatusBarStateController, mKeyguardBypassController); + mStatusBarStateController, mKeyguardBypassController, + mWakeUpCoordinator); mHeadsUpAppearanceController.readFrom(oldController); mStatusBarWindow.setStatusBarView(mStatusBarView); updateAreThereNotifications(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java index b45707ef6c10..a38094da3e1c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java @@ -35,6 +35,7 @@ import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.HeadsUpStatusBarView; import com.android.systemui.statusbar.NotificationTestHelper; +import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; @@ -59,6 +60,7 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { private View mOperatorNameView; private StatusBarStateController mStatusbarStateController; private KeyguardBypassController mBypassController; + private NotificationWakeUpCoordinator mWakeUpCoordinator; @Before public void setUp() throws Exception { @@ -72,11 +74,13 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { mOperatorNameView = new View(mContext); mStatusbarStateController = mock(StatusBarStateController.class); mBypassController = mock(KeyguardBypassController.class); + mWakeUpCoordinator = mock(NotificationWakeUpCoordinator.class); mHeadsUpAppearanceController = new HeadsUpAppearanceController( mock(NotificationIconAreaController.class), mHeadsUpManager, mStatusbarStateController, mBypassController, + mWakeUpCoordinator, mHeadsUpStatusBarView, mStackScroller, mPanelView, @@ -153,6 +157,7 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { mHeadsUpManager, mStatusbarStateController, mBypassController, + mWakeUpCoordinator, mHeadsUpStatusBarView, mStackScroller, mPanelView, -- GitLab From 0555f98949f52704f2d6f846423ab63c54f71457 Mon Sep 17 00:00:00 2001 From: Paul Crowley Date: Fri, 21 Jun 2019 15:15:32 -0700 Subject: [PATCH 393/620] fsync directories as well as files When we create a new file, that file can be lost in a crash unless the containing directory is synced. Bug: 130637124 Bug: 137666560 Test: ensure pattern setting still works. Change-Id: I5ec05a98cb5077950d1a4214aca6801c73450b62 --- .../server/locksettings/LockSettingsStorage.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java index f0e431ee0354..84ae7c790a74 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java @@ -48,6 +48,8 @@ import java.io.DataOutputStream; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; +import java.nio.channels.FileChannel; +import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -390,6 +392,17 @@ class LockSettingsStorage { return stored; } + private void fsyncDirectory(File directory) { + try { + try (FileChannel file = FileChannel.open(directory.toPath(), + StandardOpenOption.READ)) { + file.force(true); + } + } catch (IOException e) { + Slog.e(TAG, "Error syncing directory: " + directory, e); + } + } + private void writeFile(String name, byte[] hash) { synchronized (mFileWriteLock) { RandomAccessFile raf = null; @@ -406,6 +419,7 @@ class LockSettingsStorage { raf.write(hash, 0, hash.length); } raf.close(); + fsyncDirectory((new File(name)).getAbsoluteFile().getParentFile()); } catch (IOException e) { Slog.e(TAG, "Error writing to file " + e); } finally { -- GitLab From c51bb548dc4e183f97e6fc9fd4dd54657375357a Mon Sep 17 00:00:00 2001 From: Robert Snoeberger Date: Fri, 19 Jul 2019 16:35:35 -0400 Subject: [PATCH 394/620] Don't animate clock when turning screen off. This change stops the animation because there isn't a transition from the no-header state to the music header state when turning the screen off (to AOD). Since there isn't a transition, there isn't an animation. This assumes that there isn't a transition from unlocked to lock screen. If there is, then there would be an animation of the music going away while arriving at the lock screen. Fixes: 137383007 Test: Checked repro steps in bug, clock doesn't animate. Test: Also checked repro steps when audio is paused, clock doesn't animate. Test: atest KeyguardSliceProviderTest.java Change-Id: If39777340b72bc623d6690bc4f784c7f5c26ea8d Merged-In: If39777340b72bc623d6690bc4f784c7f5c26ea8d --- .../android/keyguard/KeyguardClockSwitch.java | 6 ++ .../android/keyguard/KeyguardSliceView.java | 66 ++++++++++++------- .../keyguard/KeyguardSliceProvider.java | 18 ++++- .../keyguard/KeyguardSliceProviderTest.java | 3 + 4 files changed, 66 insertions(+), 27 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java index b1cba53c4bca..fee2c9b2505a 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java @@ -540,6 +540,9 @@ public class KeyguardClockSwitch extends RelativeLayout { @Override public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues, TransitionValues endValues) { + if (!sceneRoot.isShown()) { + return null; + } final float cutoff = mCutoff; final int startVisibility = View.INVISIBLE; final int endVisibility = (int) endValues.values.get(PROPNAME_VISIBILITY); @@ -552,6 +555,9 @@ public class KeyguardClockSwitch extends RelativeLayout { @Override public Animator onDisappear(ViewGroup sceneRoot, View view, TransitionValues startValues, TransitionValues endValues) { + if (!sceneRoot.isShown()) { + return null; + } final float cutoff = 1f - mCutoff; final int startVisibility = View.VISIBLE; final int endVisibility = (int) endValues.values.get(PROPNAME_VISIBILITY); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java index e219e24a8944..af4e61b3f6bc 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java @@ -89,6 +89,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe private final HashMap mClickActions; private final ActivityStarter mActivityStarter; private final ConfigurationController mConfigurationController; + private final LayoutTransition mLayoutTransition; private Uri mKeyguardSliceUri; @VisibleForTesting TextView mTitle; @@ -126,16 +127,16 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe mActivityStarter = activityStarter; mConfigurationController = configurationController; - LayoutTransition transition = new LayoutTransition(); - transition.setStagger(LayoutTransition.CHANGE_APPEARING, DEFAULT_ANIM_DURATION / 2); - transition.setDuration(LayoutTransition.APPEARING, DEFAULT_ANIM_DURATION); - transition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 2); - transition.disableTransitionType(LayoutTransition.CHANGE_APPEARING); - transition.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); - transition.setInterpolator(LayoutTransition.APPEARING, Interpolators.FAST_OUT_SLOW_IN); - transition.setInterpolator(LayoutTransition.DISAPPEARING, Interpolators.ALPHA_OUT); - transition.setAnimateParentHierarchy(false); - setLayoutTransition(transition); + mLayoutTransition = new LayoutTransition(); + mLayoutTransition.setStagger(LayoutTransition.CHANGE_APPEARING, DEFAULT_ANIM_DURATION / 2); + mLayoutTransition.setDuration(LayoutTransition.APPEARING, DEFAULT_ANIM_DURATION); + mLayoutTransition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 2); + mLayoutTransition.disableTransitionType(LayoutTransition.CHANGE_APPEARING); + mLayoutTransition.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); + mLayoutTransition.setInterpolator(LayoutTransition.APPEARING, + Interpolators.FAST_OUT_SLOW_IN); + mLayoutTransition.setInterpolator(LayoutTransition.DISAPPEARING, Interpolators.ALPHA_OUT); + mLayoutTransition.setAnimateParentHierarchy(false); } @Override @@ -174,6 +175,12 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe mConfigurationController.removeCallback(this); } + @Override + public void onVisibilityAggregated(boolean isVisible) { + super.onVisibilityAggregated(isVisible); + setLayoutTransition(isVisible ? mLayoutTransition : null); + } + /** * Returns whether the current visible slice has a title/header. */ @@ -419,6 +426,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe * their desired positions. */ private final Animation.AnimationListener mKeepAwakeListener; + private LayoutTransition mLayoutTransition; private float mDarkAmount; public Row(Context context) { @@ -440,33 +448,41 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe @Override protected void onFinishInflate() { - LayoutTransition transition = new LayoutTransition(); - transition.setDuration(DEFAULT_ANIM_DURATION); + mLayoutTransition = new LayoutTransition(); + mLayoutTransition.setDuration(DEFAULT_ANIM_DURATION); PropertyValuesHolder left = PropertyValuesHolder.ofInt("left", 0, 1); PropertyValuesHolder right = PropertyValuesHolder.ofInt("right", 0, 1); ObjectAnimator changeAnimator = ObjectAnimator.ofPropertyValuesHolder((Object) null, left, right); - transition.setAnimator(LayoutTransition.CHANGE_APPEARING, changeAnimator); - transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeAnimator); - transition.setInterpolator(LayoutTransition.CHANGE_APPEARING, + mLayoutTransition.setAnimator(LayoutTransition.CHANGE_APPEARING, changeAnimator); + mLayoutTransition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeAnimator); + mLayoutTransition.setInterpolator(LayoutTransition.CHANGE_APPEARING, Interpolators.ACCELERATE_DECELERATE); - transition.setInterpolator(LayoutTransition.CHANGE_DISAPPEARING, + mLayoutTransition.setInterpolator(LayoutTransition.CHANGE_DISAPPEARING, Interpolators.ACCELERATE_DECELERATE); - transition.setStartDelay(LayoutTransition.CHANGE_APPEARING, DEFAULT_ANIM_DURATION); - transition.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, DEFAULT_ANIM_DURATION); + mLayoutTransition.setStartDelay(LayoutTransition.CHANGE_APPEARING, + DEFAULT_ANIM_DURATION); + mLayoutTransition.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, + DEFAULT_ANIM_DURATION); ObjectAnimator appearAnimator = ObjectAnimator.ofFloat(null, "alpha", 0f, 1f); - transition.setAnimator(LayoutTransition.APPEARING, appearAnimator); - transition.setInterpolator(LayoutTransition.APPEARING, Interpolators.ALPHA_IN); + mLayoutTransition.setAnimator(LayoutTransition.APPEARING, appearAnimator); + mLayoutTransition.setInterpolator(LayoutTransition.APPEARING, Interpolators.ALPHA_IN); ObjectAnimator disappearAnimator = ObjectAnimator.ofFloat(null, "alpha", 1f, 0f); - transition.setInterpolator(LayoutTransition.DISAPPEARING, Interpolators.ALPHA_OUT); - transition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 4); - transition.setAnimator(LayoutTransition.DISAPPEARING, disappearAnimator); + mLayoutTransition.setInterpolator(LayoutTransition.DISAPPEARING, + Interpolators.ALPHA_OUT); + mLayoutTransition.setDuration(LayoutTransition.DISAPPEARING, DEFAULT_ANIM_DURATION / 4); + mLayoutTransition.setAnimator(LayoutTransition.DISAPPEARING, disappearAnimator); - transition.setAnimateParentHierarchy(false); - setLayoutTransition(transition); + mLayoutTransition.setAnimateParentHierarchy(false); + } + + @Override + public void onVisibilityAggregated(boolean isVisible) { + super.onVisibilityAggregated(isVisible); + setLayoutTransition(isVisible ? mLayoutTransition : null); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java index 20477975a6dd..0687b7d8efce 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java @@ -52,6 +52,7 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.R; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationMediaManager; +import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.NextAlarmControllerImpl; import com.android.systemui.statusbar.policy.ZenModeController; @@ -125,6 +126,7 @@ public class KeyguardSliceProvider extends SliceProvider implements private CharSequence mMediaTitle; private CharSequence mMediaArtist; protected boolean mDozing; + private int mStatusBarState; private boolean mMediaIsVisible; /** @@ -227,7 +229,10 @@ public class KeyguardSliceProvider extends SliceProvider implements } protected boolean needsMediaLocked() { - return !TextUtils.isEmpty(mMediaTitle) && mMediaIsVisible && mDozing; + // Show header if music is playing and the status bar is in the shade state. This way, an + // animation isn't necessary when pressing power and transitioning to AOD. + boolean keepWhenShade = mStatusBarState == StatusBarState.SHADE && mMediaIsVisible; + return !TextUtils.isEmpty(mMediaTitle) && mMediaIsVisible && (mDozing || keepWhenShade); } protected void addMediaLocked(ListBuilder listBuilder) { @@ -454,7 +459,7 @@ public class KeyguardSliceProvider extends SliceProvider implements synchronized (this) { boolean nextVisible = !mMediaInvisibleStates.contains(state); mHandler.removeCallbacksAndMessages(mMediaToken); - if (mMediaIsVisible && !nextVisible) { + if (mMediaIsVisible && !nextVisible && mStatusBarState != StatusBarState.SHADE) { // We need to delay this event for a few millis when stopping to avoid jank in the // animation. The media app might not send its update when buffering, and the slice // would end up without a header for 0.5 second. @@ -511,5 +516,14 @@ public class KeyguardSliceProvider extends SliceProvider implements @Override public void onStateChanged(int newState) { + final boolean notify; + synchronized (this) { + boolean needsMedia = needsMediaLocked(); + mStatusBarState = newState; + notify = needsMedia != needsMediaLocked(); + } + if (notify) { + notifyChange(); + } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java index 44191147f914..a83c4b653ce7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java @@ -48,6 +48,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationMediaManager; +import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.util.wakelock.SettableWakeLock; @@ -177,6 +178,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { @Test public void onMetadataChanged_updatesSlice() { + mProvider.onStateChanged(StatusBarState.KEYGUARD); mProvider.onDozingChanged(true); reset(mContentResolver); mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING); @@ -190,6 +192,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { @Test public void onDozingChanged_updatesSliceIfMedia() { + mProvider.onStateChanged(StatusBarState.KEYGUARD); mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING); reset(mContentResolver); // Show media when dozing -- GitLab From 9977f99aa5c7249df28677962cf6d82a9b2afcc7 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 23 Jul 2019 13:05:07 -0700 Subject: [PATCH 395/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: Icda8f9f62161a32ea41f73e62d74feb8e14afc72 --- core/res/res/values-hi/strings.xml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 7dc0b92437e2..acd206f34668 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -339,21 +339,21 @@ "फ़ोन कॉल का जवाब दें" "ऐप्लिकेशन को किसी इनकमिंग फ़ोन कॉल का जवाब देने देती है." "मैसेज (एसएमएस) पाएं" - "ऐप को मैसेज (एसएमएस) को प्राप्‍त और संसाधित करने देता है. इसका अर्थ है कि ऐप आपके डिवाइस पर भेजे गए संदेशों की निगरानी आपको दिखाए बिना कर सकता है और उन्‍हें हटा सकता है." + "एप्लिकेशन को मैसेज (एसएमएस) पाने और प्रोसेस करने देता है. इसका मतलब है कि एप्लिकेशन आपके डिवाइस पर भेजे गए मैसेज की निगरानी आपको दिखाए बिना कर सकता है और उन्‍हें हटा सकता है." "मैसेज (एमएमएस) पाएं" "ऐप को मल्टीमीडिया मैसेज (एमएमएस) को पाने और उन पर कार्रवाई करने देता है. इसका मतलब है कि ऐप आपके डिवाइस पर भेजे गए मैसेज की निगरानी आपको दिखाए बिना कर सकता है और उन्‍हें हटा सकता है." "सेल ब्रॉडकास्ट (CBC) मैसेज पढ़ें" "ऐप को, वो सेल ब्रॉडकास्ट (CBC) मैसेज पढ़ने देता है जो आपके डिवाइस को मिले हैं. सेल ब्रॉडकास्ट (CBC) अलर्ट कुछ स्थानों (लोकेशन) पर आपको आपातकालीन स्‍थितियों की चेतावनी देने के लिए दिए जाते हैं. आपातकालीन सेल ब्रॉडकास्ट (CBC) मिलने पर, धोखा देने वाले ऐप आपके डिवाइस के परफ़ॉर्मेंस या कार्यवाही में दखल दे सकते हैं." - "सदस्यता-प्राप्त फ़ीड पढ़ें" - "ऐप्स को वर्तमान में समन्वयित फ़ीड के बारे में विवरण प्राप्त करने देता है." + "सदस्यता वाली फ़ीड पढ़ें" + "एप्‍लिकेशन को मौजूदा समय में सिंक फ़ीड के बारे में जानकारी देता है." "मैसेज (एमएमएस) भेजें और देखें" "ऐप को मैसेज (एसएमएस) भेजने देता है. इसकी वजह से उम्मीद से ज़्यादा शुल्‍क लग सकते हैं. धोखा देने वाले ऐप आपकी पुष्टि के बिना मैसेज भेजकर आपका पैसा खर्च करवा सकते हैं." "अपने मैसेज (एसएमएस या एमएमएस) पढ़ें" "यह ऐप आपके टैबलेट पर सहेजे गए सभी मैसेज (एसएमएस) पढ़ सकता है." "यह ऐप आपके टीवी पर सहेजे गए सभी मैसेज (एसएमएस) पढ़ सकता है." "यह ऐप आपके फ़ोन पर सहेजे गए सभी मैसेज (एसएमएस) पढ़ सकता है." - "लेख संदेश (WAP) प्राप्त करें" - "ऐप्स को WAP संदेशों को प्राप्‍त और संसाधित करने देता है. इस अनुमति में आपको भेजे गए संदेशों की निगरानी आपको दिखाए बिना करने और हटाने की क्षमता शामिल है." + "टेक्सट मैसेज (WAP) पाएं" + "एप्लिकेशन को WAP मैसेज पाने और प्रोसेस करने देता है. इस अनुमति में आपको भेजे गए मैसेज की निगरानी आपको दिए एप्लिकेशन को दिखाए बिना करने और हटाने की क्षमता शामिल है." "चल रहे ऐप्स पुनर्प्राप्त करें" "ऐप को माजूदा समय में और हाल ही में चल रही कार्रवाइयों के बारे में जानकारी निकालने देता है. इससे ऐप डिवाइस पर इस्तेमाल किए गए ऐप के बारे में जानकारी खोज सकता है." "प्रोफ़ाइल और डिवाइस स्‍वामियों को प्रबंधित करें" @@ -467,9 +467,9 @@ "ऐप को टीवी का समय क्षेत्र बदलने देती है." "ऐप्स को टैबलेट का समय क्षेत्र बदलने देता है." "डिवाइस पर खाते ढूंढें" - "ऐप्स को टैबलेट द्वारा ज्ञात खातों की सूची प्राप्‍त करने देता है. इसमें वे खाते शामिल हो सकते हैं जिन्‍हें इंस्‍टॉल किए गए ऐप्स ने बनाया है." + "एप्लिकेशन को टैबलेट से ज्ञात खातों की सूची पाने देता है. इसमें वे खाते शामिल हो सकते हैं जिन्‍हें इंस्‍टॉल किए गए एप्लिकेशन ने बनाया है." "ऐप को टीवी द्वारा ज्ञात खातों की सूची प्राप्‍त करने देती है. इसमें इंस्‍टॉल किए गए ऐप्‍लिकेशन के द्वारा बनाए गए खाते शामिल हो सकते हैं." - "ऐप्स को फ़ोन द्वारा ज्ञात खातों की सूची प्राप्‍त करने देता है. इसमें वे खाते शामिल हो सकते हैं जिन्‍हें इंस्‍टॉल किए गए ऐप्स ने बनाया है." + "एप्लिकेशन को फ़ोन से ज्ञात खातों की सूची पाने देता है. इसमें वे खाते शामिल हो सकते हैं जिन्‍हें इंस्‍टॉल किए गए एप्लिकेशन ने बनाया है." "नेटवर्क कनेक्‍शन देखें" "ऐप को नेटवर्क कनेक्‍शन के बारे में जानकारी देखने देता है, जैसे कौन से नेटवर्क मौजूद हैं और कनेक्‍ट हैं." "नेटवर्क को पूरी तरह इस्तेमाल करें" @@ -483,9 +483,9 @@ "वाई-फ़ाई से कनेक्‍ट और डिस्‍कनेक्‍ट करें" "ऐप्स को वाई-फ़ाई पहुंच बिंदुओं से कनेक्ट और डिसकनेक्ट करने और वाई-फ़ाई नेटवर्क के लिए डिवाइस कॉन्फ़िगरेशन में परिवर्तन करने देता है." "वाई-फ़ाई मल्‍टीकास्‍ट पाने को अनुमति दें" - "ऐप्स को वाई-फ़ाई नेटवर्क पर मल्टीकास्ट पते के उपयोग से केवल आपके टैबलेट पर ही नहीं, बल्कि सभी डिवाइस पर भेजे गए पैकेट प्राप्‍त करने देता है. यह गैर-मल्टीकास्ट मोड से ज़्यादा पावर का उपयोग करता है." + "एप्लिकेशन को वाई-फ़ाई नेटवर्क पर मल्टीकास्ट पते के इस्तेमाल से सिर्फ़ आपके टैबलेट पर ही नहीं, बल्कि सभी डिवाइस पर भेजे गए पैकेट पाने देता है. यह गैर-मल्टीकास्ट मोड से ज़्यादा पावर का इस्तेमाल करता है." "ऐप को मल्‍टीकास्‍ट पतों का उपयोग करके ना केवल आपके टीवी को, बल्‍कि वाई-फ़ाई पर मौजूद सभी डिवाइसों को पैकेट भेजने और प्राप्‍त करने देती है. इसमें गैर-मल्‍टीकास्‍ट मोड की अपेक्षा ज़्यादा पावर का उपयोग होता है." - "ऐप्स को वाई-फ़ाई नेटवर्क पर मल्टीकास्ट पते के उपयोग से केवल आपके फ़ोन पर ही नहीं, बल्कि सभी डिवाइस पर भेजे गए पैकेट प्राप्‍त करने देता है. यह गैर-मल्टीकास्ट मोड से ज़्यादा पावर का उपयोग करता है." + "एप्लिकेशन को वाई-फ़ाई नेटवर्क पर मल्टीकास्ट पते के इस्तेमाल से सिर्फ़ आपके फ़ोन पर ही नहीं, बल्कि सभी डिवाइस पर भेजे गए पैकेट पाने देता है. यह गैर-मल्टीकास्ट मोड से ज़्यादा पावर का इस्तेमाल करता है." "ब्लूटूथ सेटिंग पर पहुंचें" "किसी ऐप्स को स्‍थानीय ब्लूटूथ टैबलेट कॉन्‍फ़िगर करने की और रिमोट डिवाइस के साथ खोजने और युग्‍मित करने देता है." "ऐप को स्‍थानीय ब्‍लूटूथ टीवी कॉन्‍फ़िगर करने देती है और दूरस्‍थ डिवाइसों को खोजने और उनसे युग्‍मित करने देती है." @@ -603,8 +603,8 @@ "ऐप्‍लिकेशन को आपकी शेयर की गई मेमोरी की सामग्री पढ़ने देती है." "आपकी शेयर की गई मेमोरी की सामग्री में बदलाव करना या उसे मिटाना" "ऐप्लिकेशन को आपकी शेयर की गई मेमोरी की सामग्री लिखने देती है." - "SIP कॉल करें/प्राप्‍त करें" - "ऐप्स को SIP कॉल करने और प्राप्‍त करने देती है." + "SIP कॉल करें/पाएं" + "ऐप्लिकेशन को SIP कॉल करने और पाने देता है." "नए टेलिकॉम सिम कनेक्‍शन रजिस्टर करें" "ऐप को नए टेलिकॉम सिम कनेक्‍शन पंजीकृत करने देती है." "नए टेलिकॉम कनेक्‍शन रजिस्टर करें" -- GitLab From cca78a72f82b3c8bedc42f64b01efaa71b80b6e5 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 23 Jul 2019 13:09:00 -0700 Subject: [PATCH 396/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I9ef7742eaa85199f18abe62e7b122eee9a8bc27e --- packages/SystemUI/res/values-fr-rCA/strings.xml | 2 +- packages/SystemUI/res/values-hi/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index a3069a1e174f..552d12ee6390 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -886,7 +886,7 @@ "Le mode Ne pas déranger a été activé par une application (%s)." "Le mode Ne pas déranger a été activé par une règle automatique ou une application." "Jusqu\'à %s" - "Garder" + "Conserver" "Remplacer" "Applications qui fonctionnent en arrière-plan" "Touchez pour afficher des détails sur l\'utilisation de la pile et des données" diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 263fe8a31a9a..17ee04e10304 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -205,7 +205,7 @@ "पूरी सूचनाएं देखें" "सूचना साफ़ करें" "GPS सक्षम." - "GPS प्राप्त करना." + "GPS पाना." "टेलीटाइपराइटर सक्षम." "रिंगर कंपन (वाइब्रेशन)." "रिंगर मौन." -- GitLab From ac743cb54e9e8d2c4bfb40f9218be02cee5d50c9 Mon Sep 17 00:00:00 2001 From: Hai Zhang Date: Wed, 17 Jul 2019 15:04:20 -0700 Subject: [PATCH 397/620] DO NOT MERGE Set app op mode to allowed when granting permissions to reset state. We grant GRANTED_BY_DEFAULT permissions again when user clears data for a package to reset its state, but the app op mode needs to be granted as well. Fixes: 137723522 Test: presubmit & manual Change-Id: Ibbbbff9e5d8161538637a4c542d7c0bc92a90501 --- .../com/android/server/pm/PackageManagerService.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 7fce4453b768..0fe022acdd9f 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -19865,6 +19865,9 @@ public class PackageManagerService extends IPackageManager.Stub } }; + final AppOpsManager appOpsManager = mContext.getSystemService(AppOpsManager.class); + final int uid = UserHandle.getUid(userId, ps.pkg.applicationInfo.uid); + final int permissionCount = ps.pkg.requestedPermissions.size(); for (int i = 0; i < permissionCount; i++) { final String permName = ps.pkg.requestedPermissions.get(i); @@ -19924,6 +19927,14 @@ public class PackageManagerService extends IPackageManager.Stub if ((oldFlags & FLAG_PERMISSION_GRANTED_BY_DEFAULT) != 0) { mPermissionManager.grantRuntimePermission(permName, packageName, false, Process.SYSTEM_UID, userId, delayingPermCallback); + // Allow app op later as we are holding mPackages + // PermissionPolicyService will handle the app op for foreground/background + // permissions. + String appOp = AppOpsManager.permissionToOp(permName); + if (appOp != null) { + mHandler.post(() -> appOpsManager.setUidMode(appOp, uid, + AppOpsManager.MODE_ALLOWED)); + } // If permission review is enabled the permissions for a legacy apps // are represented as constantly granted runtime ones, so don't revoke. } else if ((flags & FLAG_PERMISSION_REVIEW_REQUIRED) == 0) { -- GitLab From 80f5f1bfc3ed4640589d0dba24de9c5e8dd28973 Mon Sep 17 00:00:00 2001 From: Dmitry Dementyev Date: Thu, 11 Jul 2019 14:40:01 -0700 Subject: [PATCH 398/620] Tell KeyStore to ignore caller uid for PlatformKeyManager's keys. Without the change, keys created for secondary profiles are still bound to the primary profile lock screen secret. Test: manual Bug: 129845209 Change-Id: I7e180656f8dc81f5c05036a7e8c810c9582f8f82 --- .../PlatformKeyManager.java | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/PlatformKeyManager.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/PlatformKeyManager.java index c54bfc01e031..0ad6c2a69556 100644 --- a/services/core/java/com/android/server/locksettings/recoverablekeystore/PlatformKeyManager.java +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/PlatformKeyManager.java @@ -19,6 +19,7 @@ package com.android.server.locksettings.recoverablekeystore; import android.app.KeyguardManager; import android.content.Context; import android.os.RemoteException; +import android.os.UserHandle; import android.security.GateKeeper; import android.security.keystore.AndroidKeyStoreSecretKey; import android.security.keystore.KeyPermanentlyInvalidatedException; @@ -437,25 +438,31 @@ public class PlatformKeyManager { // so it may live in memory for some time. SecretKey secretKey = generateAesKey(); - long secureUserId = getGateKeeperService().getSecureUserId(userId); - // TODO(b/124095438): Propagate this failure instead of silently failing. - if (secureUserId == GateKeeper.INVALID_SECURE_USER_ID) { - Log.e(TAG, "No SID available for user " + userId); - return; - } - - // Store decryption key first since it is more likely to fail. - mKeyStore.setEntry( - decryptAlias, - new KeyStore.SecretKeyEntry(secretKey), + KeyProtection.Builder decryptionKeyProtection = new KeyProtection.Builder(KeyProperties.PURPOSE_DECRYPT) .setUserAuthenticationRequired(true) .setUserAuthenticationValidityDurationSeconds( USER_AUTHENTICATION_VALIDITY_DURATION_SECONDS) .setBlockModes(KeyProperties.BLOCK_MODE_GCM) - .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) + .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE); + if (userId != UserHandle.USER_SYSTEM) { + // Bind decryption key to secondary profile lock screen secret. + long secureUserId = getGateKeeperService().getSecureUserId(userId); + // TODO(b/124095438): Propagate this failure instead of silently failing. + if (secureUserId == GateKeeper.INVALID_SECURE_USER_ID) { + Log.e(TAG, "No SID available for user " + userId); + return; + } + decryptionKeyProtection .setBoundToSpecificSecureUserId(secureUserId) - .build()); + // Ignore caller uid which always belongs to the primary profile. + .setCriticalToDeviceEncryption(true); + } + // Store decryption key first since it is more likely to fail. + mKeyStore.setEntry( + decryptAlias, + new KeyStore.SecretKeyEntry(secretKey), + decryptionKeyProtection.build()); mKeyStore.setEntry( encryptAlias, new KeyStore.SecretKeyEntry(secretKey), -- GitLab From 4c50704670996bd8c25f9fcce281997c66ba9750 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Mon, 22 Jul 2019 16:47:34 -0700 Subject: [PATCH 399/620] Isolate DPM and SIM PIN states from UX User should still be able to swipe up to retry or still see the bypass lock screen when face auth is disabled or sim card is locked. Having different UX on those cases is confusing. Bug: 138125943 Change-Id: Iece4d28e7a988af846c9e8aa9eb0fff5a1d74249 --- .../keyguard/KeyguardSecurityContainer.java | 2 +- .../keyguard/KeyguardUpdateMonitor.java | 8 ++++--- .../statusbar/phone/KeyguardBouncer.java | 2 +- .../phone/KeyguardBypassController.kt | 2 +- .../systemui/statusbar/phone/StatusBar.java | 4 ++++ .../statusbar/phone/UnlockMethodCache.java | 23 ++++++++++++++----- .../phone/BiometricsUnlockControllerTest.java | 2 +- .../statusbar/phone/KeyguardBouncerTest.java | 2 +- 8 files changed, 31 insertions(+), 14 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 4ad262fee520..8059dcf33df7 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -269,7 +269,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe */ private void updateBiometricRetry() { SecurityMode securityMode = getSecurityMode(); - mSwipeUpToRetry = mUnlockMethodCache.isUnlockingWithFacePossible() + mSwipeUpToRetry = mUnlockMethodCache.isFaceAuthEnabled() && securityMode != SecurityMode.SimPin && securityMode != SecurityMode.SimPuk && securityMode != SecurityMode.None; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index fd618b05f348..4e7b15715243 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -1783,13 +1783,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { && mFpm.getEnrolledFingerprints(userId).size() > 0; } + private boolean isUnlockWithFacePossible(int userId) { + return isFaceAuthEnabledForUser(userId) && !isFaceDisabled(userId); + } + /** * If face hardware is available, user has enrolled and enabled auth via setting. - * Not considering encryption or lock down state. */ - public boolean isUnlockWithFacePossible(int userId) { + public boolean isFaceAuthEnabledForUser(int userId) { return mFaceManager != null && mFaceManager.isHardwareDetected() - && !isFaceDisabled(userId) && mFaceManager.hasEnrolledTemplates(userId) && mFaceSettingEnabledForUser.get(userId); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index d6f8a606af55..98704de612db 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -170,7 +170,7 @@ public class KeyguardBouncer { // Split up the work over multiple frames. DejankUtils.removeCallbacks(mResetRunnable); - if (mUnlockMethodCache.isUnlockingWithFacePossible() && !needsFullscreenBouncer() + if (mUnlockMethodCache.isFaceAuthEnabled() && !needsFullscreenBouncer() && !mKeyguardUpdateMonitor.userNeedsStrongAuth()) { mHandler.postDelayed(mShowRunnable, BOUNCER_FACE_DELAY); } else { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt index 0aec2b12fa92..70d3bff9b822 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt @@ -47,7 +47,7 @@ class KeyguardBypassController { * If face unlock dismisses the lock screen or keeps user on keyguard for the current user. */ var bypassEnabled: Boolean = false - get() = field && unlockMethodCache.isUnlockingWithFacePossible + get() = field && unlockMethodCache.isFaceAuthEnabled private set var bouncerShowing: Boolean = false diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index d93dc950a077..868d18fdb30d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -2388,6 +2388,10 @@ public class StatusBar extends SystemUI implements DemoMode, mLightBarController.dump(fd, pw, args); } + if (mUnlockMethodCache != null) { + mUnlockMethodCache.dump(pw); + } + if (mKeyguardBypassController != null) { mKeyguardBypassController.dump(pw); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java index a71fcdbd9914..b1d6ca6e5580 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java @@ -28,6 +28,7 @@ import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; +import java.io.PrintWriter; import java.util.ArrayList; /** @@ -51,7 +52,7 @@ public class UnlockMethodCache { private boolean mTrustManaged; private boolean mTrusted; private boolean mDebugUnlocked = false; - private boolean mIsUnlockingWithFacePossible; + private boolean mFaceAuthEnabled; private UnlockMethodCache(Context ctx) { mLockPatternUtils = new LockPatternUtils(ctx); @@ -110,8 +111,8 @@ public class UnlockMethodCache { /** * If there are faces enrolled and user enabled face auth on keyguard. */ - public boolean isUnlockingWithFacePossible() { - return mIsUnlockingWithFacePossible; + public boolean isFaceAuthEnabled() { + return mFaceAuthEnabled; } private void update(boolean updateAlways) { @@ -122,16 +123,16 @@ public class UnlockMethodCache { || (Build.IS_DEBUGGABLE && DEBUG_AUTH_WITH_ADB && mDebugUnlocked); boolean trustManaged = mKeyguardUpdateMonitor.getUserTrustIsManaged(user); boolean trusted = mKeyguardUpdateMonitor.getUserHasTrust(user); - boolean isUnlockingWithFacePossible = mKeyguardUpdateMonitor.isUnlockWithFacePossible(user); + boolean faceAuthEnabled = mKeyguardUpdateMonitor.isFaceAuthEnabledForUser(user); boolean changed = secure != mSecure || canSkipBouncer != mCanSkipBouncer || trustManaged != mTrustManaged - || mIsUnlockingWithFacePossible != isUnlockingWithFacePossible; + || mFaceAuthEnabled != faceAuthEnabled; if (changed || updateAlways) { mSecure = secure; mCanSkipBouncer = canSkipBouncer; mTrusted = trusted; mTrustManaged = trustManaged; - mIsUnlockingWithFacePossible = isUnlockingWithFacePossible; + mFaceAuthEnabled = faceAuthEnabled; notifyListeners(); } Trace.endSection(); @@ -143,6 +144,16 @@ public class UnlockMethodCache { } } + public void dump(PrintWriter pw) { + pw.println("UnlockMethodCache"); + pw.println(" mSecure: " + mSecure); + pw.println(" mCanSkipBouncer: " + mCanSkipBouncer); + pw.println(" mTrustManaged: " + mTrustManaged); + pw.println(" mTrusted: " + mTrusted); + pw.println(" mDebugUnlocked: " + mDebugUnlocked); + pw.println(" mFaceAuthEnabled: " + mFaceAuthEnabled); + } + private final KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() { @Override public void onUserSwitchComplete(int userId) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java index 7d9920db36a4..4a41349ca195 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java @@ -82,7 +82,7 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { MockitoAnnotations.initMocks(this); when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true); when(mUpdateMonitor.isDeviceInteractive()).thenReturn(true); - when(mUnlockMethodCache.isUnlockingWithFacePossible()).thenReturn(true); + when(mUnlockMethodCache.isFaceAuthEnabled()).thenReturn(true); when(mKeyguardBypassController.onBiometricAuthenticated(any())).thenReturn(true); when(mKeyguardBypassController.canPlaySubtleWindowAnimations()).thenReturn(true); mContext.addMockSystemService(PowerManager.class, mPowerManager); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java index 4e0ef56ad830..852271aa0382 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java @@ -379,7 +379,7 @@ public class KeyguardBouncerTest extends SysuiTestCase { @Test public void testShow_delaysIfFaceAuthIsRunning() { - when(mUnlockMethodCache.isUnlockingWithFacePossible()).thenReturn(true); + when(mUnlockMethodCache.isFaceAuthEnabled()).thenReturn(true); mBouncer.show(true /* reset */); ArgumentCaptor showRunnable = ArgumentCaptor.forClass(Runnable.class); -- GitLab From 273832d6acb2eb9a5cb49c07484f4ca3a3b75493 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Tue, 23 Jul 2019 13:44:12 -0700 Subject: [PATCH 400/620] Bouncer isn't in transit when fully visible/hidden Test: atest KeyguardBouncerTest Test: tap screen when unlocking without bypass mode Fixes: 138125943 Change-Id: I9d2b58aebf42fc0d3ff3e39e97cb8734b3bbed71 --- .../systemui/statusbar/phone/KeyguardBouncer.java | 2 +- .../systemui/statusbar/phone/KeyguardBouncerTest.java | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index 98704de612db..40085a48a58c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -349,7 +349,7 @@ public class KeyguardBouncer { * {@link #show(boolean)} was called but we're not showing yet, or being dragged. */ public boolean inTransit() { - return mShowingSoon || mExpansion != EXPANSION_HIDDEN; + return mShowingSoon || mExpansion != EXPANSION_HIDDEN && mExpansion != EXPANSION_VISIBLE; } /** diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java index 852271aa0382..907e695f2513 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java @@ -394,4 +394,15 @@ public class KeyguardBouncerTest extends SysuiTestCase { public void testRegisterUpdateMonitorCallback() { verify(mKeyguardUpdateMonitor).registerCallback(any()); } + + @Test + public void testInTransit_whenTranslation() { + mBouncer.show(true); + mBouncer.setExpansion(KeyguardBouncer.EXPANSION_HIDDEN); + assertThat(mBouncer.inTransit()).isFalse(); + mBouncer.setExpansion(0.5f); + assertThat(mBouncer.inTransit()).isTrue(); + mBouncer.setExpansion(KeyguardBouncer.EXPANSION_VISIBLE); + assertThat(mBouncer.inTransit()).isFalse(); + } } -- GitLab From 8c1b763dcf5df6e7fc7177dad5e7390adb229fa4 Mon Sep 17 00:00:00 2001 From: Ned Burns Date: Fri, 19 Jul 2019 14:26:15 -0400 Subject: [PATCH 401/620] Fix issue with media notifs being misbucketed Previous code assumed that "isHighPriority" == "is in top section", which is not always true. Media notifs and some other notifs can appear in the top section even if they're not high priority. Because we detect section boundaries by iterating through the list until we find the first notif where isHighPriority == false, we were sometimes drawing the section boundary way too high. This change creates a new propery, isInTopSection() that accurately tracks this state. Setting this value in the proper location would require some seriously destabilizing refactors, so instead we set it in the list comparator, which is awful but here are. Test: manual Bug: 136709564 Change-Id: I19223720bac534ab92219a2962169097819e8efb --- .../NotificationLockscreenUserManager.java | 3 +-- .../NotificationLockscreenUserManagerImpl.java | 7 +++---- .../NotificationViewHierarchyManager.java | 6 ++---- .../collection/NotificationData.java | 18 +++++++++++++----- .../collection/NotificationEntry.java | 15 +++++++++++++++ .../stack/NotificationSectionsManager.java | 4 ++-- .../stack/NotificationStackScrollLayout.java | 6 +++--- .../statusbar/phone/NotificationPanelView.java | 3 +-- .../NotificationLockscreenUserManagerTest.java | 6 +++--- .../stack/NotificationSectionsManagerTest.java | 2 ++ 10 files changed, 45 insertions(+), 25 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java index 0fe5f8a6af5a..4cc5b2144adc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java @@ -15,7 +15,6 @@ package com.android.systemui.statusbar; import android.content.pm.UserInfo; -import android.service.notification.StatusBarNotification; import android.util.SparseArray; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -58,7 +57,7 @@ public interface NotificationLockscreenUserManager { boolean shouldHideNotifications(int userId); boolean shouldHideNotifications(String key); - boolean shouldShowOnKeyguard(StatusBarNotification sbn); + boolean shouldShowOnKeyguard(NotificationEntry entry); boolean isAnyProfilePublicMode(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java index 4ea1ed5b9451..e08a5ae07bd8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java @@ -33,7 +33,6 @@ import android.os.ServiceManager; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; -import android.service.notification.StatusBarNotification; import android.util.Log; import android.util.SparseArray; import android.util.SparseBooleanArray; @@ -302,7 +301,7 @@ public class NotificationLockscreenUserManagerImpl implements Notification.VISIBILITY_SECRET; } - public boolean shouldShowOnKeyguard(StatusBarNotification sbn) { + public boolean shouldShowOnKeyguard(NotificationEntry entry) { if (getEntryManager() == null) { Log.wtf(TAG, "mEntryManager was null!", new Throwable()); return false; @@ -310,10 +309,10 @@ public class NotificationLockscreenUserManagerImpl implements boolean exceedsPriorityThreshold; if (NotificationUtils.useNewInterruptionModel(mContext) && hideSilentNotificationsOnLockscreen()) { - exceedsPriorityThreshold = getEntryManager().getNotificationData().isHighPriority(sbn); + exceedsPriorityThreshold = entry.isTopBucket(); } else { exceedsPriorityThreshold = - !getEntryManager().getNotificationData().isAmbient(sbn.getKey()); + !getEntryManager().getNotificationData().isAmbient(entry.key); } return mShowLockscreenNotifications && exceedsPriorityThreshold; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java index 22c91647d7f7..6e75c0375afc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java @@ -397,15 +397,13 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle int userId = entry.notification.getUserId(); boolean suppressedSummary = mGroupManager.isSummaryOfSuppressedGroup( entry.notification) && !entry.isRowRemoved(); - boolean showOnKeyguard = mLockscreenUserManager.shouldShowOnKeyguard(entry - .notification); + boolean showOnKeyguard = mLockscreenUserManager.shouldShowOnKeyguard(entry); if (!showOnKeyguard) { // min priority notifications should show if their summary is showing if (mGroupManager.isChildInGroupWithSummary(entry.notification)) { NotificationEntry summary = mGroupManager.getLogicalGroupSummary( entry.notification); - if (summary != null && mLockscreenUserManager.shouldShowOnKeyguard( - summary.notification)) { + if (summary != null && mLockscreenUserManager.shouldShowOnKeyguard(summary)) { showOnKeyguard = true; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java index fca520fe0521..1ce493444e25 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java @@ -25,7 +25,6 @@ import android.service.notification.NotificationListenerService.RankingMap; import android.service.notification.SnoozeCriterion; import android.service.notification.StatusBarNotification; import android.util.ArrayMap; -import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.Dependency; @@ -108,10 +107,19 @@ public class NotificationData { boolean bSystemMax = bImportance >= NotificationManager.IMPORTANCE_HIGH && isSystemNotification(nb); - boolean isHeadsUp = a.getRow().isHeadsUp(); - if (isHeadsUp != b.getRow().isHeadsUp()) { - return isHeadsUp ? -1 : 1; - } else if (isHeadsUp) { + + boolean aHeadsUp = a.getRow().isHeadsUp(); + boolean bHeadsUp = b.getRow().isHeadsUp(); + + // HACK: This should really go elsewhere, but it's currently not straightforward to + // extract the comparison code and we're guaranteed to touch every element, so this is + // the best place to set the buckets for the moment. + a.setIsTopBucket(aHeadsUp || aMedia || aSystemMax || a.isHighPriority()); + b.setIsTopBucket(bHeadsUp || bMedia || bSystemMax || b.isHighPriority()); + + if (aHeadsUp != bHeadsUp) { + return aHeadsUp ? -1 : 1; + } else if (aHeadsUp) { // Provide consistent ranking with headsUpManager return mHeadsUpManager.compare(a, b); } else if (aMedia != bMedia) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index b19d2ca29c96..d71857082229 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -173,6 +173,9 @@ public final class NotificationEntry { * the lock screen/status bar and in the top section in the shade. */ private boolean mHighPriority; + + private boolean mIsTopBucket; + private boolean mSensitive = true; private Runnable mOnSensitiveChangedListener; private boolean mAutoHeadsUp; @@ -224,6 +227,18 @@ public final class NotificationEntry { this.mHighPriority = highPriority; } + /** + * @return True if the notif should appear in the "top" or "important" section of notifications + * (as opposed to the "bottom" or "silent" section). This is usually the same as + * {@link #isHighPriority()}, but there are certain exceptions, such as media notifs. + */ + public boolean isTopBucket() { + return mIsTopBucket; + } + public void setIsTopBucket(boolean isTopBucket) { + mIsTopBucket = isTopBucket; + } + public boolean isBubble() { return (notification.getNotification().flags & FLAG_BUBBLE) != 0; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java index 170a4d570688..d119fb79e4c6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java @@ -133,7 +133,7 @@ class NotificationSectionsManager implements StackScrollAlgorithm.SectionProvide if (child instanceof ExpandableNotificationRow && child.getVisibility() != View.GONE) { ExpandableNotificationRow row = (ExpandableNotificationRow) child; - if (!row.getEntry().isHighPriority()) { + if (!row.getEntry().isTopBucket()) { firstGentleNotifIndex = i; mFirstGentleNotif = row; break; @@ -248,7 +248,7 @@ class NotificationSectionsManager implements StackScrollAlgorithm.SectionProvide View child = mParent.getChildAt(i); if (child.getVisibility() != View.GONE && child instanceof ExpandableNotificationRow) { ExpandableNotificationRow row = (ExpandableNotificationRow) child; - if (!row.getEntry().isHighPriority()) { + if (!row.getEntry().isTopBucket()) { break; } else { lastChildBeforeGap = row; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 8ebc87fbb355..aea780d9cf36 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -5746,7 +5746,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd currentIndex++; boolean beforeSpeedBump; if (mHighPriorityBeforeSpeedBump) { - beforeSpeedBump = row.getEntry().isHighPriority(); + beforeSpeedBump = row.getEntry().isTopBucket(); } else { beforeSpeedBump = !row.getEntry().ambient; } @@ -5804,9 +5804,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd case ROWS_ALL: return true; case ROWS_HIGH_PRIORITY: - return row.getEntry().isHighPriority(); + return row.getEntry().isTopBucket(); case ROWS_GENTLE: - return !row.getEntry().isHighPriority(); + return !row.getEntry().isTopBucket(); default: throw new IllegalArgumentException("Unknown selection: " + selection); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 37855ae592a5..f17496bbc7c3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -803,8 +803,7 @@ public class NotificationPanelView extends PanelView implements if (suppressedSummary) { continue; } - if (!mLockscreenUserManager.shouldShowOnKeyguard( - row.getStatusBarNotification())) { + if (!mLockscreenUserManager.shouldShowOnKeyguard(row.getEntry())) { continue; } if (row.isRemoved()) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java index 49a263a8d781..57dd8c94c790 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java @@ -38,7 +38,6 @@ import android.os.Handler; import android.os.Looper; import android.os.UserManager; import android.provider.Settings; -import android.service.notification.StatusBarNotification; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -48,6 +47,7 @@ import com.android.systemui.Dependency; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.collection.NotificationData; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.policy.DeviceProvisionedController; @@ -166,7 +166,7 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS, 1); when(mNotificationData.isHighPriority(any())).thenReturn(false); - assertTrue(mLockscreenUserManager.shouldShowOnKeyguard(mock(StatusBarNotification.class))); + assertTrue(mLockscreenUserManager.shouldShowOnKeyguard(mock(NotificationEntry.class))); } @Test @@ -179,7 +179,7 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS, 0); when(mNotificationData.isHighPriority(any())).thenReturn(false); - assertFalse(mLockscreenUserManager.shouldShowOnKeyguard(mock(StatusBarNotification.class))); + assertFalse(mLockscreenUserManager.shouldShowOnKeyguard(mock(NotificationEntry.class))); } private class TestNotificationLockscreenUserManager diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java index 73abda9a5da7..59d0f912d38e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java @@ -263,6 +263,8 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { when(notifRow.getVisibility()).thenReturn(View.VISIBLE); when(notifRow.getEntry().isHighPriority()) .thenReturn(children[i] == ChildType.HIPRI); + when(notifRow.getEntry().isTopBucket()) + .thenReturn(children[i] == ChildType.HIPRI); when(notifRow.getParent()).thenReturn(mNssl); child = notifRow; break; -- GitLab From aae9ad6770e612ad734ed6afbbec33c6f493a329 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Mon, 22 Jul 2019 18:36:54 -0700 Subject: [PATCH 402/620] Fixed the behavior when dragging down on home screen with a hun Previously the headsupmanager wouldn't be informed about the update and touches would not necessarily go through to the panelView because we were still considered small. Fixes: 138152555 Test: drag down on home while a hun is showing Change-Id: I1d28e3df8ccac297a65424fe1c9401968a364ee6 --- .../notification/stack/NotificationListContainer.java | 2 ++ .../stack/NotificationStackScrollLayout.java | 9 ++++++++- .../systemui/statusbar/phone/NotificationPanelView.java | 3 ++- .../com/android/systemui/statusbar/phone/StatusBar.java | 3 ++- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationListContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationListContainer.java index 212808dae8e3..15cc72c2d7a1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationListContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationListContainer.java @@ -184,4 +184,6 @@ public interface NotificationListContainer extends ExpandableView.OnHeightChange default boolean containsView(View v) { return true; } + + default void setWillExpand(boolean willExpand) {}; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 9e3d74b138fa..84d48b6043e4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -500,6 +500,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private boolean mAnimateBottomOnLayout; private float mLastSentAppear; private float mLastSentExpandedHeight; + private boolean mWillExpand; @Inject public NotificationStackScrollLayout( @@ -4398,6 +4399,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd mStateAnimator.setShadeExpanded(isExpanded); mSwipeHelper.setIsExpanded(isExpanded); if (changed) { + mWillExpand = false; if (!mIsExpanded) { mGroupManager.collapseAllGroups(); mExpandHelper.cancelImmediately(); @@ -5047,7 +5049,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd if (mAnimationsEnabled && (isHeadsUp || mHeadsUpGoingAwayAnimationsAllowed)) { mHeadsUpChangeAnimations.add(new Pair<>(row, isHeadsUp)); mNeedsAnimation = true; - if (!mIsExpanded && !isHeadsUp) { + if (!mIsExpanded && !mWillExpand && !isHeadsUp) { row.setHeadsUpAnimatingAway(true); } requestChildrenUpdate(); @@ -5068,6 +5070,11 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd requestChildrenUpdate(); } + @Override + public void setWillExpand(boolean willExpand) { + mWillExpand = willExpand; + } + @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public void setTrackingHeadsUp(ExpandableNotificationRow row) { mTrackingHeadsUp = row != null; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 37855ae592a5..501de5bb6e4e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -1278,6 +1278,7 @@ public class NotificationPanelView extends PanelView implements } mExpectingSynthesizedDown = true; onTrackingStarted(); + updatePanelExpanded(); } /** @@ -2029,7 +2030,7 @@ public class NotificationPanelView extends PanelView implements } private void updatePanelExpanded() { - boolean isExpanded = !isFullyCollapsed(); + boolean isExpanded = !isFullyCollapsed() || mExpectingSynthesizedDown; if (mPanelExpanded != isExpanded) { mHeadsUpManager.setIsPanelExpanded(isExpanded); mStatusBar.setPanelExpanded(isExpanded); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index d93dc950a077..010c70acc54b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1802,6 +1802,8 @@ public class StatusBar extends SystemUI implements DemoMode, mVibratorHelper.vibrate(VibrationEffect.EFFECT_TICK); } mNotificationPanel.expand(true /* animate */); + ((NotificationListContainer) mStackScroller).setWillExpand(true); + mHeadsUpManager.unpinAll(true /* userUnpinned */); mMetricsLogger.count(NotificationPanelView.COUNTER_PANEL_OPEN, 1); } else if (!mNotificationPanel.isInSettings() && !mNotificationPanel.isExpanding()){ mNotificationPanel.flingSettings(0 /* velocity */, @@ -1939,7 +1941,6 @@ public class StatusBar extends SystemUI implements DemoMode, if (start) { mNotificationPanel.startWaitingForOpenPanelGesture(); - setPanelExpanded(true); } else { mNotificationPanel.stopWaitingForOpenPanelGesture(velocity); } -- GitLab From 4e0300db40678c5b53244f8cdff276f980d3538c Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Mon, 22 Jul 2019 17:17:42 +0200 Subject: [PATCH 403/620] Mark screen rotation as early (1/2) To decrease jank while rotating. Test: Rotate screen Bug: 138083790 Change-Id: If0b4428253dbfa4dcb102b8146a847e2e9ab876b Merged-In: If0b4428253dbfa4dcb102b8146a847e2e9ab876b --- .../core/java/com/android/server/wm/ScreenRotationAnimation.java | 1 + 1 file changed, 1 insertion(+) diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index b90d60227be4..c0942c908f3b 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -936,6 +936,7 @@ class ScreenRotationAnimation { } } + t.setEarlyWakeup(); setSnapshotTransform(t, mSnapshotFinalMatrix, mExitTransformation.getAlpha()); } -- GitLab From 7a545ae9ccfd516a603f83da894658a7b3a8008b Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Tue, 16 Jul 2019 14:52:13 -0700 Subject: [PATCH 404/620] Modify deferred recents animation cancel to work without screenshot - Allow the recents animation runner to request deferring a cancel from stack order change until the next app transition start without using a screenshot. This allows launcher to set this state, then start an activity without a flash due to the animation not finishing immediately - Always prepare a transition when using the deferred cancel to ensure an app transition callback - Handle app transition canceled as well (if canceled, we continue to cancel recents the animation with/without the screenshot as requested) - Remove internal lock and use the global WM lock when setting the defer cancel state - Renamed a few methods to clarify the deferred cancel flow Bug: 137196872 Test: atest FrameworksServicesTests:RecentsAnimationControllerTest Test: atest WmTests:RecentsAnimationTest Change-Id: Ie8f6f60b6bf6777e36f24749b30f90c8c26ee848 --- .../view/IRecentsAnimationController.aidl | 44 ++-- .../android/view/IRecentsAnimationRunner.aidl | 2 +- .../RecentsAnimationControllerCompat.java | 9 + .../com/android/server/wm/AppWindowToken.java | 2 +- .../android/server/wm/RecentsAnimation.java | 16 +- .../server/wm/RecentsAnimationController.java | 188 +++++++++++------- .../server/wm/TaskScreenshotAnimatable.java | 2 +- .../wm/RecentsAnimationControllerTest.java | 37 +++- .../server/wm/RecentsAnimationTest.java | 9 +- 9 files changed, 206 insertions(+), 103 deletions(-) diff --git a/core/java/android/view/IRecentsAnimationController.aidl b/core/java/android/view/IRecentsAnimationController.aidl index 956161acd762..955be8d40c47 100644 --- a/core/java/android/view/IRecentsAnimationController.aidl +++ b/core/java/android/view/IRecentsAnimationController.aidl @@ -76,6 +76,21 @@ interface IRecentsAnimationController { */ void hideCurrentInputMethod(); + /** + * This call is deprecated, use #setDeferCancelUntilNextTransition() instead + * TODO(138144750): Remove this method once there are no callers + * @deprecated + */ + void setCancelWithDeferredScreenshot(boolean screenshot); + + /** + * Clean up the screenshot of previous task which was created during recents animation that + * was cancelled by a stack order change. + * + * @see {@link IRecentsAnimationRunner#onAnimationCanceled} + */ + void cleanupScreenshot(); + /** * Set a state for controller whether would like to cancel recents animations with deferred * task screenshot presentation. @@ -86,22 +101,23 @@ interface IRecentsAnimationController { * screenshot, so that Launcher can still control the leash lifecycle & make the next app * transition animate smoothly without flickering. * - * @param screenshot When set {@code true}, means recents animation will be canceled when the - * next app launch. System will take previous task's screenshot when the next - * app transition starting, and skip previous task's animation. - * Set {@code false} means will not take screenshot & skip animation - * for previous task. + * @param defer When set {@code true}, means that the recents animation will defer canceling the + * animation when a stack order change is triggered until the subsequent app + * transition start and skip previous task's animation. + * When set to {@code false}, means that the recents animation will be canceled + * immediately when the stack order changes. + * @param screenshot When set {@code true}, means that the system will take previous task's + * screenshot and replace the contents of the leash with it when the next app + * transition starting. The runner must call #cleanupScreenshot() to end the + * recents animation. + * When set to {@code false}, means that the system will simply wait for the + * next app transition start to immediately cancel the recents animation. This + * can be useful when you want an immediate transition into a state where the + * task is shown in the home/recents activity (without waiting for a + * screenshot). * * @see #cleanupScreenshot() * @see IRecentsAnimationRunner#onCancelled */ - void setCancelWithDeferredScreenshot(boolean screenshot); - - /** - * Clean up the screenshot of previous task which was created during recents animation that - * was cancelled by a stack order change. - * - * @see {@link IRecentsAnimationRunner#onAnimationCanceled} - */ - void cleanupScreenshot(); + void setDeferCancelUntilNextTransition(boolean defer, boolean screenshot); } diff --git a/core/java/android/view/IRecentsAnimationRunner.aidl b/core/java/android/view/IRecentsAnimationRunner.aidl index 9c652a8d990b..6cda60c80b7d 100644 --- a/core/java/android/view/IRecentsAnimationRunner.aidl +++ b/core/java/android/view/IRecentsAnimationRunner.aidl @@ -36,7 +36,7 @@ oneway interface IRecentsAnimationRunner { * @param deferredWithScreenshot If set to {@code true}, the contents of the task will be * replaced with a screenshot, such that the runner's leash is * still active. As soon as the runner doesn't need the leash - * anymore, it can call + * anymore, it must call * {@link IRecentsAnimationController#cleanupScreenshot). * * @see {@link RecentsAnimationController#cleanupScreenshot} diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java index d2fe5cd9ef64..2ef042210e67 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java @@ -91,6 +91,7 @@ public class RecentsAnimationControllerCompat { } } + @Deprecated public void setCancelWithDeferredScreenshot(boolean screenshot) { try { mAnimationController.setCancelWithDeferredScreenshot(screenshot); @@ -99,6 +100,14 @@ public class RecentsAnimationControllerCompat { } } + public void setDeferCancelUntilNextTransition(boolean defer, boolean screenshot) { + try { + mAnimationController.setDeferCancelUntilNextTransition(defer, screenshot); + } catch (RemoteException e) { + Log.e(TAG, "Failed to set deferred cancel with screenshot", e); + } + } + public void cleanupScreenshot() { try { mAnimationController.cleanupScreenshot(); diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index eab5e0dd270e..6c577e150e54 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -2477,7 +2477,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree // transformed the task. final RecentsAnimationController controller = mWmService.getRecentsAnimationController(); if (controller != null && controller.isAnimatingTask(getTask()) - && controller.shouldCancelWithDeferredScreenshot()) { + && controller.shouldDeferCancelUntilNextTransition()) { return false; } diff --git a/services/core/java/com/android/server/wm/RecentsAnimation.java b/services/core/java/com/android/server/wm/RecentsAnimation.java index bf627ec5680c..0a3e7a4860d5 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimation.java +++ b/services/core/java/com/android/server/wm/RecentsAnimation.java @@ -355,7 +355,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks, // launch-behind state is restored. That also prevents the next transition // type being disturbed if the visibility is updated after setting the next // transition (the target activity will be one of closing apps). - if (!controller.shouldCancelWithDeferredScreenshot() + if (!controller.shouldDeferCancelWithScreenshot() && !targetStack.isFocusedStackOnDisplay()) { targetStack.ensureActivitiesVisibleLocked(null /* starting */, 0 /* starting */, false /* preserveWindows */); @@ -415,16 +415,18 @@ class RecentsAnimation implements RecentsAnimationCallbacks, final DisplayContent dc = mService.mRootActivityContainer.getDefaultDisplay().mDisplayContent; dc.mBoundsAnimationController.setAnimationType( - controller.shouldCancelWithDeferredScreenshot() ? FADE_IN : BOUNDS); + controller.shouldDeferCancelUntilNextTransition() ? FADE_IN : BOUNDS); - // Cancel running recents animation and screenshot previous task when the next - // transition starts in below cases: - // 1) The next launching task is not in recents animation task. + // We defer canceling the recents animation until the next app transition in the following + // cases: + // 1) The next launching task is not being animated by the recents animation // 2) The next task is home activity. (i.e. pressing home key to back home in recents). if ((!controller.isAnimatingTask(stack.getTaskStack().getTopChild()) || controller.isTargetApp(stack.getTopActivity().mAppWindowToken)) - && controller.shouldCancelWithDeferredScreenshot()) { - controller.cancelOnNextTransitionStart(); + && controller.shouldDeferCancelUntilNextTransition()) { + // Always prepare an app transition since we rely on the transition callbacks to cleanup + mWindowManager.prepareAppTransition(TRANSIT_NONE, false); + controller.setCancelOnNextTransitionStart(); } else { // Just cancel directly to unleash from launcher when the next launching task is the // current top task. diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index c03dabe660ad..a8b00838577f 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -96,10 +96,9 @@ public class RecentsAnimationController implements DeathRecipient { private final Runnable mFailsafeRunnable = () -> cancelAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION, "failSafeRunnable"); - final Object mLock = new Object(); - // The recents component app token that is shown behind the visibile tasks private AppWindowToken mTargetAppToken; + private DisplayContent mDisplayContent; private int mTargetActivityType; private Rect mMinimizedHomeBounds = new Rect(); @@ -123,25 +122,47 @@ public class RecentsAnimationController implements DeathRecipient { private boolean mLinkedToDeathOfRunner; - private boolean mCancelWithDeferredScreenshot; - + // Whether to try to defer canceling from a stack order change until the next transition + private boolean mRequestDeferCancelUntilNextTransition; + // Whether to actually defer canceling until the next transition private boolean mCancelOnNextTransitionStart; + // Whether to take a screenshot when handling a deferred cancel + private boolean mCancelDeferredWithScreenshot; /** * Animates the screenshot of task that used to be controlled by RecentsAnimation. - * @see {@link #cancelOnNextTransitionStart} + * @see {@link #setCancelOnNextTransitionStart} */ SurfaceAnimator mRecentScreenshotAnimator; + /** + * An app transition listener to cancel the recents animation only after the app transition + * starts or is canceled. + */ final AppTransitionListener mAppTransitionListener = new AppTransitionListener() { @Override public int onAppTransitionStartingLocked(int transit, long duration, long statusBarAnimationStartTime, long statusBarAnimationDuration) { - onTransitionStart(); - mService.mRoot.getDisplayContent(mDisplayId).mAppTransition - .unregisterListener(this); + continueDeferredCancel(); return 0; } + + @Override + public void onAppTransitionCancelledLocked(int transit) { + continueDeferredCancel(); + } + + private void continueDeferredCancel() { + mDisplayContent.mAppTransition.unregisterListener(this); + if (mCanceled) { + return; + } + + if (mCancelOnNextTransitionStart) { + mCancelOnNextTransitionStart = false; + cancelAnimationWithScreenshot(mCancelDeferredWithScreenshot); + } + } }; public interface RecentsAnimationCallbacks { @@ -201,8 +222,7 @@ public class RecentsAnimationController implements DeathRecipient { ? REORDER_MOVE_TO_TOP : REORDER_MOVE_TO_ORIGINAL_POSITION, true /* runSynchronously */, sendUserLeaveHint); - final DisplayContent dc = mService.mRoot.getDisplayContent(mDisplayId); - dc.mBoundsAnimationController.setAnimationType(FADE_IN); + mDisplayContent.mBoundsAnimationController.setAnimationType(FADE_IN); } finally { Binder.restoreCallingIdentity(token); } @@ -239,8 +259,7 @@ public class RecentsAnimationController implements DeathRecipient { } mInputConsumerEnabled = enabled; - final InputMonitor inputMonitor = - mService.mRoot.getDisplayContent(mDisplayId).getInputMonitor(); + final InputMonitor inputMonitor = mDisplayContent.getInputMonitor(); inputMonitor.updateInputWindowsLw(true /*force*/); mService.scheduleAnimationLocked(); } @@ -281,15 +300,23 @@ public class RecentsAnimationController implements DeathRecipient { } @Override + @Deprecated public void setCancelWithDeferredScreenshot(boolean screenshot) { - synchronized (mLock) { - setCancelWithDeferredScreenshotLocked(screenshot); + synchronized (mService.mGlobalLock) { + setDeferredCancel(true /* deferred */, screenshot); + } + } + + @Override + public void setDeferCancelUntilNextTransition(boolean defer, boolean screenshot) { + synchronized (mService.mGlobalLock) { + setDeferredCancel(defer, screenshot); } } @Override public void cleanupScreenshot() { - synchronized (mLock) { + synchronized (mService.mGlobalLock) { if (mRecentScreenshotAnimator != null) { mRecentScreenshotAnimator.cancelAnimation(); mRecentScreenshotAnimator = null; @@ -311,10 +338,7 @@ public class RecentsAnimationController implements DeathRecipient { mCallbacks = callbacks; mDisplayId = displayId; mStatusBar = LocalServices.getService(StatusBarManagerInternal.class); - } - - public void initialize(int targetActivityType, SparseBooleanArray recentTaskIds) { - initialize(mService.mRoot.getDisplayContent(mDisplayId), targetActivityType, recentTaskIds); + mDisplayContent = service.mRoot.getDisplayContent(displayId); } /** @@ -322,15 +346,15 @@ public class RecentsAnimationController implements DeathRecipient { * because it may call cancelAnimation() which needs to properly clean up the controller * in the window manager. */ - @VisibleForTesting - void initialize(DisplayContent dc, int targetActivityType, SparseBooleanArray recentTaskIds) { + public void initialize(int targetActivityType, SparseBooleanArray recentTaskIds) { mTargetActivityType = targetActivityType; - dc.mAppTransition.registerListenerLocked(mAppTransitionListener); + mDisplayContent.mAppTransition.registerListenerLocked(mAppTransitionListener); // Make leashes for each of the visible/target tasks and add it to the recents animation to // be started - final ArrayList visibleTasks = dc.getVisibleTasks(); - final TaskStack targetStack = dc.getStack(WINDOWING_MODE_UNDEFINED, targetActivityType); + final ArrayList visibleTasks = mDisplayContent.getVisibleTasks(); + final TaskStack targetStack = mDisplayContent.getStack(WINDOWING_MODE_UNDEFINED, + targetActivityType); if (targetStack != null) { for (int i = targetStack.getChildCount() - 1; i >= 0; i--) { final Task t = targetStack.getChildAt(i); @@ -364,29 +388,31 @@ public class RecentsAnimationController implements DeathRecipient { } // Adjust the wallpaper visibility for the showing target activity - final AppWindowToken recentsComponentAppToken = dc.getStack(WINDOWING_MODE_UNDEFINED, - targetActivityType).getTopChild().getTopFullscreenAppToken(); + final AppWindowToken recentsComponentAppToken = + targetStack.getTopChild().getTopFullscreenAppToken(); if (recentsComponentAppToken != null) { if (DEBUG_RECENTS_ANIMATIONS) Slog.d(TAG, "setHomeApp(" + recentsComponentAppToken.getName() + ")"); mTargetAppToken = recentsComponentAppToken; if (recentsComponentAppToken.windowsCanBeWallpaperTarget()) { - dc.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; - dc.setLayoutNeeded(); + mDisplayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; + mDisplayContent.setLayoutNeeded(); } } // Save the minimized home height - final TaskStack dockedStack = dc.getSplitScreenPrimaryStackIgnoringVisibility(); - dc.getDockedDividerController().getHomeStackBoundsInDockedMode( - dc.getConfiguration(), + final TaskStack dockedStack = mDisplayContent.getSplitScreenPrimaryStackIgnoringVisibility(); + mDisplayContent.getDockedDividerController().getHomeStackBoundsInDockedMode( + mDisplayContent.getConfiguration(), dockedStack == null ? DOCKED_INVALID : dockedStack.getDockSide(), mMinimizedHomeBounds); mService.mWindowPlacerLocked.performSurfacePlacement(); // Notify that the animation has started - mStatusBar.onRecentsAnimationStateChanged(true /* running */); + if (mStatusBar != null) { + mStatusBar.onRecentsAnimationStateChanged(true /* running */); + } } @VisibleForTesting @@ -440,8 +466,7 @@ public class RecentsAnimationController implements DeathRecipient { // Perform layout if it was scheduled before to make sure that we get correct content // insets for the target app window after a rotation - final DisplayContent displayContent = mService.mRoot.getDisplayContent(mDisplayId); - displayContent.performLayout(false /* initial */, false /* updateInputWindows */); + mDisplayContent.performLayout(false /* initial */, false /* updateInputWindows */); final Rect minimizedHomeBounds = mTargetAppToken != null && mTargetAppToken.inSplitScreenSecondaryWindowingMode() @@ -479,9 +504,8 @@ public class RecentsAnimationController implements DeathRecipient { cancelAnimation(reorderMode, true /* runSynchronously */, false /* screenshot */, reason); } - void cancelAnimationWithScreenShot() { - cancelAnimation(REORDER_KEEP_IN_PLACE, true /* sync */, true /* screenshot */, - "stackOrderChanged"); + void cancelAnimationWithScreenshot(boolean screenshot) { + cancelAnimation(REORDER_KEEP_IN_PLACE, true /* sync */, screenshot, "stackOrderChanged"); } private void cancelAnimation(@ReorderMode int reorderMode, boolean runSynchronously, @@ -495,21 +519,29 @@ public class RecentsAnimationController implements DeathRecipient { } mService.mH.removeCallbacks(mFailsafeRunnable); mCanceled = true; - try { - if (screenshot) { - // Screen shot previous task when next task starts transition. - final Task task = mPendingAnimations.get(0).mTask; - screenshotRecentTask(task, reorderMode, runSynchronously); + + if (screenshot) { + // Screen shot previous task when next task starts transition and notify the runner. + // We will actually finish the animation once the runner calls cleanUpScreenshot(). + final Task task = mPendingAnimations.get(0).mTask; + screenshotRecentTask(task, reorderMode, runSynchronously); + try { mRunner.onAnimationCanceled(true /* deferredWithScreenshot */); - return; + } catch (RemoteException e) { + Slog.e(TAG, "Failed to cancel recents animation", e); + } + } else { + // Otherwise, notify the runner and clean up the animation immediately + // Note: In the fallback case, this can trigger multiple onAnimationCancel() calls + // to the runner if we this actually triggers cancel twice on the caller + try { + mRunner.onAnimationCanceled(false /* deferredWithScreenshot */); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to cancel recents animation", e); } - mRunner.onAnimationCanceled(false /* deferredWithScreenshot */); - } catch (RemoteException e) { - Slog.e(TAG, "Failed to cancel recents animation", e); + mCallbacks.onAnimationFinished(reorderMode, runSynchronously, + false /* sendUserLeaveHint */); } - // Clean up and return to the previous app - mCallbacks.onAnimationFinished(reorderMode, runSynchronously, - false /* sendUserLeaveHint */); } } @@ -522,27 +554,36 @@ public class RecentsAnimationController implements DeathRecipient { * screenshot, so that Launcher can still control the leash lifecycle & make the next app * transition animate smoothly without flickering. */ - void cancelOnNextTransitionStart() { + void setCancelOnNextTransitionStart() { mCancelOnNextTransitionStart = true; } - void setCancelWithDeferredScreenshotLocked(boolean screenshot) { - mCancelWithDeferredScreenshot = screenshot; + /** + * Requests that we attempt to defer the cancel until the next app transition if we are + * canceling from a stack order change. If {@param screenshot} is specified, then the system + * will replace the contents of the leash with a screenshot, which must be cleaned up when the + * runner calls cleanUpScreenshot(). + */ + void setDeferredCancel(boolean defer, boolean screenshot) { + mRequestDeferCancelUntilNextTransition = defer; + mCancelDeferredWithScreenshot = screenshot; } - boolean shouldCancelWithDeferredScreenshot() { - return mCancelWithDeferredScreenshot; + /** + * @return Whether we should defer the cancel from a stack order change until the next app + * transition. + */ + boolean shouldDeferCancelUntilNextTransition() { + return mRequestDeferCancelUntilNextTransition; } - void onTransitionStart() { - if (mCanceled) { - return; - } - - if (mCancelOnNextTransitionStart) { - mCancelOnNextTransitionStart = false; - cancelAnimationWithScreenShot(); - } + /** + * @return Whether we should both defer the cancel from a stack order change until the next + * app transition, and also that the deferred cancel should replace the contents of the leash + * with a screenshot. + */ + boolean shouldDeferCancelWithScreenshot() { + return mRequestDeferCancelUntilNextTransition && mCancelDeferredWithScreenshot; } void screenshotRecentTask(Task task, @ReorderMode int reorderMode, boolean runSynchronously) { @@ -575,6 +616,7 @@ public class RecentsAnimationController implements DeathRecipient { // Clear any pending failsafe runnables mService.mH.removeCallbacks(mFailsafeRunnable); + mDisplayContent.mAppTransition.unregisterListener(mAppTransitionListener); // Clear references to the runner unlinkToDeathOfRunner(); @@ -588,21 +630,22 @@ public class RecentsAnimationController implements DeathRecipient { } // Update the input windows after the animation is complete - final InputMonitor inputMonitor = - mService.mRoot.getDisplayContent(mDisplayId).getInputMonitor(); + final InputMonitor inputMonitor = mDisplayContent.getInputMonitor(); inputMonitor.updateInputWindowsLw(true /*force*/); // We have deferred all notifications to the target app as a part of the recents animation, // so if we are actually transitioning there, notify again here if (mTargetAppToken != null) { if (reorderMode == REORDER_MOVE_TO_TOP || reorderMode == REORDER_KEEP_IN_PLACE) { - mService.mRoot.getDisplayContent(mDisplayId) - .mAppTransition.notifyAppTransitionFinishedLocked(mTargetAppToken.token); + mDisplayContent.mAppTransition.notifyAppTransitionFinishedLocked( + mTargetAppToken.token); } } // Notify that the animation has ended - mStatusBar.onRecentsAnimationStateChanged(false /* running */); + if (mStatusBar != null) { + mStatusBar.onRecentsAnimationStateChanged(false /* running */); + } } void scheduleFailsafe() { @@ -629,8 +672,7 @@ public class RecentsAnimationController implements DeathRecipient { synchronized (mService.getWindowManagerLock()) { // Clear associated input consumers on runner death - final InputMonitor inputMonitor = - mService.mRoot.getDisplayContent(mDisplayId).getInputMonitor(); + final InputMonitor inputMonitor = mDisplayContent.getInputMonitor(); inputMonitor.destroyInputConsumer(INPUT_CONSUMER_RECENTS_ANIMATION); } } @@ -826,5 +868,11 @@ public class RecentsAnimationController implements DeathRecipient { pw.print(innerPrefix); pw.println("mSplitScreenMinimized=" + mSplitScreenMinimized); pw.print(innerPrefix); pw.println("mTargetAppToken=" + mTargetAppToken); pw.print(innerPrefix); pw.println("isTargetOverWallpaper=" + isTargetOverWallpaper()); + pw.print(innerPrefix); pw.println("mRequestDeferCancelUntilNextTransition=" + + mRequestDeferCancelUntilNextTransition); + pw.print(innerPrefix); pw.println("mCancelOnNextTransitionStart=" + + mCancelOnNextTransitionStart); + pw.print(innerPrefix); pw.println("mCancelDeferredWithScreenshot=" + + mCancelDeferredWithScreenshot); } } diff --git a/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java b/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java index bb1570e1ecb1..c0877a0a6752 100644 --- a/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java +++ b/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java @@ -28,7 +28,7 @@ import android.view.SurfaceSession; * Class used by {@link RecentsAnimationController} to create a surface control with taking * screenshot of task when canceling recents animation. * - * @see {@link RecentsAnimationController#cancelOnNextTransitionStart} + * @see {@link RecentsAnimationController#setCancelOnNextTransitionStart} */ class TaskScreenshotAnimatable implements SurfaceAnimator.Animatable { private static final String TAG = "TaskScreenshotAnim"; diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java index 26cd63c62cc1..cd292b2494ff 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java @@ -25,6 +25,7 @@ import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE; import static com.android.dx.mockito.inline.extended.ExtendedMockito.atLeast; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verifyNoMoreInteractions; @@ -35,10 +36,12 @@ import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_O import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import android.os.Binder; @@ -79,6 +82,7 @@ public class RecentsAnimationControllerTest extends WindowTestsBase { // Hold the lock to protect the stubbing from being accessed by other threads. spyOn(mWm.mRoot); doNothing().when(mWm.mRoot).performSurfacePlacement(anyBoolean()); + doReturn(mDisplayContent).when(mWm.mRoot).getDisplayContent(anyInt()); } when(mMockRunner.asBinder()).thenReturn(new Binder()); mController = new RecentsAnimationController(mWm, mMockRunner, mAnimationCallbacks, @@ -135,7 +139,7 @@ public class RecentsAnimationControllerTest extends WindowTestsBase { hiddenAppWindow.setHidden(true); mDisplayContent.getConfiguration().windowConfiguration.setRotation( mDisplayContent.getRotation()); - mController.initialize(mDisplayContent, ACTIVITY_TYPE_HOME, new SparseBooleanArray()); + mController.initialize(ACTIVITY_TYPE_HOME, new SparseBooleanArray()); // Ensure that we are animating the target activity as well assertTrue(mController.isAnimatingTask(homeAppWindow.getTask())); @@ -144,7 +148,7 @@ public class RecentsAnimationControllerTest extends WindowTestsBase { } @Test - public void testCancelAnimationWithScreenShot() throws Exception { + public void testDeferCancelAnimation() throws Exception { mWm.setRecentsAnimationController(mController); final AppWindowToken appWindow = createAppWindowToken(mDisplayContent, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD); @@ -156,8 +160,31 @@ public class RecentsAnimationControllerTest extends WindowTestsBase { mController.addAnimation(appWindow.getTask(), false /* isRecentTaskInvisible */); assertTrue(mController.isAnimatingTask(appWindow.getTask())); - mController.setCancelWithDeferredScreenshotLocked(true); - mController.cancelAnimationWithScreenShot(); + mController.setDeferredCancel(true /* deferred */, false /* screenshot */); + mController.cancelAnimationWithScreenshot(false /* screenshot */); + verify(mMockRunner).onAnimationCanceled(false /* deferredWithScreenshot */); + assertNull(mController.mRecentScreenshotAnimator); + + // Simulate the app transition finishing + mController.mAppTransitionListener.onAppTransitionStartingLocked(0, 0, 0, 0); + verify(mAnimationCallbacks).onAnimationFinished(REORDER_KEEP_IN_PLACE, true, false); + } + + @Test + public void testDeferCancelAnimationWithScreenShot() throws Exception { + mWm.setRecentsAnimationController(mController); + final AppWindowToken appWindow = createAppWindowToken(mDisplayContent, + WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD); + final WindowState win1 = createWindow(null, TYPE_BASE_APPLICATION, appWindow, "win1"); + appWindow.addWindow(win1); + assertEquals(appWindow.getTask().getTopVisibleAppToken(), appWindow); + assertEquals(appWindow.findMainWindow(), win1); + + mController.addAnimation(appWindow.getTask(), false /* isRecentTaskInvisible */); + assertTrue(mController.isAnimatingTask(appWindow.getTask())); + + mController.setDeferredCancel(true /* deferred */, true /* screenshot */); + mController.cancelAnimationWithScreenshot(true /* screenshot */); verify(mMockRunner).onAnimationCanceled(true /* deferredWithScreenshot */); assertNotNull(mController.mRecentScreenshotAnimator); assertTrue(mController.mRecentScreenshotAnimator.isAnimating()); @@ -185,7 +212,7 @@ public class RecentsAnimationControllerTest extends WindowTestsBase { // Assume appWindow transition should animate when no // IRecentsAnimationController#setCancelWithDeferredScreenshot called. - assertFalse(mController.shouldCancelWithDeferredScreenshot()); + assertFalse(mController.shouldDeferCancelWithScreenshot()); assertTrue(appWindow.shouldAnimate(TRANSIT_ACTIVITY_CLOSE)); } diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java index 9630b7d46e3c..0e119e3cc375 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java @@ -274,12 +274,13 @@ public class RecentsAnimationTest extends ActivityTestsBase { // Assume recents animation already started, set a state that cancel recents animation // with screenshot. - doReturn(true).when(mRecentsAnimationController).shouldCancelWithDeferredScreenshot(); + doReturn(true).when(mRecentsAnimationController).shouldDeferCancelUntilNextTransition(); + doReturn(true).when(mRecentsAnimationController).shouldDeferCancelWithScreenshot(); // Start another fullscreen activity. fullscreenStack2.moveToFront("Activity start"); - // Ensure that the recents animation was canceled by cancelOnNextTransitionStart(). - verify(mRecentsAnimationController, times(1)).cancelOnNextTransitionStart(); + // Ensure that the recents animation was canceled by setCancelOnNextTransitionStart(). + verify(mRecentsAnimationController, times(1)).setCancelOnNextTransitionStart(); } @Test @@ -315,7 +316,7 @@ public class RecentsAnimationTest extends ActivityTestsBase { // Ensure that the recents animation was NOT canceled verify(mService.mWindowManager, times(0)).cancelRecentsAnimationSynchronously( eq(REORDER_KEEP_IN_PLACE), any()); - verify(mRecentsAnimationController, times(0)).cancelOnNextTransitionStart(); + verify(mRecentsAnimationController, times(0)).setCancelOnNextTransitionStart(); } @Test -- GitLab From cb6454e68a7ece587353b99af00df8224161d514 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Tue, 23 Jul 2019 09:58:47 -0700 Subject: [PATCH 405/620] Proxy search disabled flag to Launcher Bug: 137652372 Test: Just adding a flag Change-Id: Ib1936dc0d2eed02bc2ef0dd7e091cbc4fa7af682 --- .../shared/system/QuickStepContract.java | 11 +++++--- ...askInfoCompat.java => TaskInfoCompat.java} | 27 ++++++++++--------- .../statusbar/phone/NavigationBarView.java | 3 +++ 3 files changed, 26 insertions(+), 15 deletions(-) rename packages/SystemUI/shared/src/com/android/systemui/shared/system/{RecentTaskInfoCompat.java => TaskInfoCompat.java} (51%) diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java index cc7863c0113b..2a890fe20d8a 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java @@ -80,6 +80,8 @@ public class QuickStepContract { public static final int SYSUI_STATE_HOME_DISABLED = 1 << 8; // The keyguard is showing, but occluded public static final int SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED = 1 << 9; + // The search feature is disabled (either by SUW/SysUI/device policy) + public static final int SYSUI_STATE_SEARCH_DISABLED = 1 << 10; @Retention(RetentionPolicy.SOURCE) @IntDef({SYSUI_STATE_SCREEN_PINNING, @@ -91,7 +93,8 @@ public class QuickStepContract { SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING, SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED, SYSUI_STATE_OVERVIEW_DISABLED, - SYSUI_STATE_HOME_DISABLED + SYSUI_STATE_HOME_DISABLED, + SYSUI_STATE_SEARCH_DISABLED }) public @interface SystemUiStateFlags {} @@ -100,6 +103,7 @@ public class QuickStepContract { str.add((flags & SYSUI_STATE_SCREEN_PINNING) != 0 ? "screen_pinned" : ""); str.add((flags & SYSUI_STATE_OVERVIEW_DISABLED) != 0 ? "overview_disabled" : ""); str.add((flags & SYSUI_STATE_HOME_DISABLED) != 0 ? "home_disabled" : ""); + str.add((flags & SYSUI_STATE_SEARCH_DISABLED) != 0 ? "search_disabled" : ""); str.add((flags & SYSUI_STATE_NAV_BAR_HIDDEN) != 0 ? "navbar_hidden" : ""); str.add((flags & SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED) != 0 ? "notif_visible" : ""); str.add((flags & SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING) != 0 ? "keygrd_visible" : ""); @@ -150,10 +154,11 @@ public class QuickStepContract { * disabled. */ public static boolean isAssistantGestureDisabled(int sysuiStateFlags) { - // Disable when in screen pinning, immersive, the bouncer is showing + // Disable when in screen pinning, immersive, the bouncer is showing, or search is disabled int disableFlags = SYSUI_STATE_SCREEN_PINNING | SYSUI_STATE_NAV_BAR_HIDDEN - | SYSUI_STATE_BOUNCER_SHOWING; + | SYSUI_STATE_BOUNCER_SHOWING + | SYSUI_STATE_SEARCH_DISABLED; if ((sysuiStateFlags & disableFlags) != 0) { return true; } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentTaskInfoCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskInfoCompat.java similarity index 51% rename from packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentTaskInfoCompat.java rename to packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskInfoCompat.java index a5299038d3a9..326c2aa37175 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentTaskInfoCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskInfoCompat.java @@ -17,29 +17,32 @@ package com.android.systemui.shared.system; import android.app.ActivityManager; +import android.app.TaskInfo; import android.content.ComponentName; -public class RecentTaskInfoCompat { +public class TaskInfoCompat { - private ActivityManager.RecentTaskInfo mInfo; + public static int getUserId(TaskInfo info) { + return info.userId; + } - public RecentTaskInfoCompat(ActivityManager.RecentTaskInfo info) { - mInfo = info; + public static int getActivityType(TaskInfo info) { + return info.configuration.windowConfiguration.getActivityType(); } - public int getUserId() { - return mInfo.userId; + public static int getWindowingMode(TaskInfo info) { + return info.configuration.windowConfiguration.getWindowingMode(); } - public boolean supportsSplitScreenMultiWindow() { - return mInfo.supportsSplitScreenMultiWindow; + public static boolean supportsSplitScreenMultiWindow(TaskInfo info) { + return info.supportsSplitScreenMultiWindow; } - public ComponentName getTopActivity() { - return mInfo.topActivity; + public static ComponentName getTopActivity(TaskInfo info) { + return info.topActivity; } - public ActivityManager.TaskDescription getTaskDescription() { - return mInfo.taskDescription; + public static ActivityManager.TaskDescription getTaskDescription(TaskInfo info) { + return info.taskDescription; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 22e3edb2bbd8..9296f7e32761 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -22,6 +22,7 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_H import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SEARCH_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.isGesturalMode; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE; @@ -719,6 +720,8 @@ public class NavigationBarView extends FrameLayout implements (mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0, displayId); mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_HOME_DISABLED, (mDisabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0, displayId); + mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_SEARCH_DISABLED, + (mDisabledFlags & View.STATUS_BAR_DISABLE_SEARCH) != 0, displayId); if (mPanelView != null) { mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED, mPanelView.isFullyExpanded() && !mPanelView.isInSettings(), displayId); -- GitLab From 4578854ad4dc3013b94e8068bca6533321b0a011 Mon Sep 17 00:00:00 2001 From: Curtis Belmonte Date: Tue, 23 Jul 2019 11:07:27 -0700 Subject: [PATCH 406/620] Use separate enroll timeout for fingerprint and face Currently, we use the same timeout for enrolling any biometric, including fingerprint and face. This commit requires each type of biometric to specify its own enrollment timeout and specifically changes the timeout for face from 60 to 75 seconds. Test: Multi-angle face enrollment w/ 1-24 buckets captured == 75 seconds Test: Single-capture face enrollment == 75 seconds Test: Fingerprint enrollment == 60 seconds Bug: 137688980 Change-Id: I2735ed4647956c8a4cba573215b551a5c0be6955 --- .../server/biometrics/BiometricServiceBase.java | 4 ++-- .../com/android/server/biometrics/EnrollClient.java | 10 +++++----- .../android/server/biometrics/face/FaceService.java | 4 +++- .../biometrics/fingerprint/FingerprintService.java | 4 +++- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java index 20eb6180832c..91a32f48ec9a 100644 --- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java +++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java @@ -282,10 +282,10 @@ public abstract class BiometricServiceBase extends SystemService public EnrollClientImpl(Context context, DaemonWrapper daemon, long halDeviceId, IBinder token, ServiceListener listener, int userId, int groupId, byte[] cryptoToken, boolean restricted, String owner, - final int[] disabledFeatures) { + final int[] disabledFeatures, int timeoutSec) { super(context, getConstants(), daemon, halDeviceId, token, listener, userId, groupId, cryptoToken, restricted, owner, getBiometricUtils(), - disabledFeatures); + disabledFeatures, timeoutSec); } @Override diff --git a/services/core/java/com/android/server/biometrics/EnrollClient.java b/services/core/java/com/android/server/biometrics/EnrollClient.java index 854528f0654d..7ebb7c059b4c 100644 --- a/services/core/java/com/android/server/biometrics/EnrollClient.java +++ b/services/core/java/com/android/server/biometrics/EnrollClient.java @@ -31,11 +31,11 @@ import java.util.Arrays; * A class to keep track of the enrollment state for a given client. */ public abstract class EnrollClient extends ClientMonitor { - private static final long MS_PER_SEC = 1000; - private static final int ENROLLMENT_TIMEOUT_MS = 60 * 1000; // 1 minute private final byte[] mCryptoToken; private final BiometricUtils mBiometricUtils; private final int[] mDisabledFeatures; + private final int mTimeoutSec; + private long mEnrollmentStartTimeMs; public abstract boolean shouldVibrate(); @@ -44,12 +44,13 @@ public abstract class EnrollClient extends ClientMonitor { BiometricServiceBase.DaemonWrapper daemon, long halDeviceId, IBinder token, BiometricServiceBase.ServiceListener listener, int userId, int groupId, byte[] cryptoToken, boolean restricted, String owner, BiometricUtils utils, - final int[] disabledFeatures) { + final int[] disabledFeatures, int timeoutSec) { super(context, constants, daemon, halDeviceId, token, listener, userId, groupId, restricted, owner, 0 /* cookie */); mBiometricUtils = utils; mCryptoToken = Arrays.copyOf(cryptoToken, cryptoToken.length); mDisabledFeatures = Arrays.copyOf(disabledFeatures, disabledFeatures.length); + mTimeoutSec = timeoutSec; } @Override @@ -94,14 +95,13 @@ public abstract class EnrollClient extends ClientMonitor { @Override public int start() { mEnrollmentStartTimeMs = System.currentTimeMillis(); - final int timeout = (int) (ENROLLMENT_TIMEOUT_MS / MS_PER_SEC); try { final ArrayList disabledFeatures = new ArrayList<>(); for (int i = 0; i < mDisabledFeatures.length; i++) { disabledFeatures.add(mDisabledFeatures[i]); } - final int result = getDaemonWrapper().enroll(mCryptoToken, getGroupId(), timeout, + final int result = getDaemonWrapper().enroll(mCryptoToken, getGroupId(), mTimeoutSec, disabledFeatures); if (result != 0) { Slog.w(getLogTag(), "startEnroll failed, result=" + result); diff --git a/services/core/java/com/android/server/biometrics/face/FaceService.java b/services/core/java/com/android/server/biometrics/face/FaceService.java index a38abdc1bed0..c26e53ff8583 100644 --- a/services/core/java/com/android/server/biometrics/face/FaceService.java +++ b/services/core/java/com/android/server/biometrics/face/FaceService.java @@ -329,6 +329,7 @@ public class FaceService extends BiometricServiceBase { * Receives the incoming binder calls from FaceManager. */ private final class FaceServiceWrapper extends IFaceService.Stub { + private static final int ENROLL_TIMEOUT_SEC = 75; /** * The following methods contain common code which is shared in biometrics/common. @@ -368,7 +369,8 @@ public class FaceService extends BiometricServiceBase { final boolean restricted = isRestricted(); final EnrollClientImpl client = new EnrollClientImpl(getContext(), mDaemonWrapper, mHalDeviceId, token, new ServiceListenerImpl(receiver), mCurrentUserId, - 0 /* groupId */, cryptoToken, restricted, opPackageName, disabledFeatures) { + 0 /* groupId */, cryptoToken, restricted, opPackageName, disabledFeatures, + ENROLL_TIMEOUT_SEC) { @Override public int[] getAcquireIgnorelist() { diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java index 28336f459863..320e1022873c 100644 --- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java @@ -176,6 +176,7 @@ public class FingerprintService extends BiometricServiceBase { * Receives the incoming binder calls from FingerprintManager. */ private final class FingerprintServiceWrapper extends IFingerprintService.Stub { + private static final int ENROLL_TIMEOUT_SEC = 60; /** * The following methods contain common code which is shared in biometrics/common. @@ -203,7 +204,8 @@ public class FingerprintService extends BiometricServiceBase { final int groupId = userId; // default group for fingerprint enrollment final EnrollClientImpl client = new EnrollClientImpl(getContext(), mDaemonWrapper, mHalDeviceId, token, new ServiceListenerImpl(receiver), mCurrentUserId, groupId, - cryptoToken, restricted, opPackageName, new int[0] /* disabledFeatures */) { + cryptoToken, restricted, opPackageName, new int[0] /* disabledFeatures */, + ENROLL_TIMEOUT_SEC) { @Override public boolean shouldVibrate() { return true; -- GitLab From 167a365824835688c475001717b852a719ed5103 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Tue, 23 Jul 2019 18:21:34 -0700 Subject: [PATCH 407/620] Disabled the media auto heads up experience Test: atest SystemUITests Fixes: 138253091 Change-Id: I611bfdac44bb91e55b5944f8880f369534dbf30c --- .../systemui/statusbar/notification/BypassHeadsUpNotifier.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/BypassHeadsUpNotifier.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/BypassHeadsUpNotifier.kt index ea474ced7632..fbaefdec90c1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/BypassHeadsUpNotifier.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/BypassHeadsUpNotifier.kt @@ -63,7 +63,7 @@ class BypassHeadsUpNotifier @Inject constructor( enabled = Settings.Secure.getIntForUser( context.contentResolver, Settings.Secure.SHOW_MEDIA_WHEN_BYPASSING, - 1 /* default */, + 0 /* default */, KeyguardUpdateMonitor.getCurrentUser()) != 0 }, Settings.Secure.SHOW_MEDIA_WHEN_BYPASSING) } -- GitLab From 5431a92fd5bcc59876f6b8c630e1e43757f88f08 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Wed, 3 Jul 2019 14:29:37 -0700 Subject: [PATCH 408/620] Fix breaking test Fixes: 138245190 Test: atest SystemUITests Merged-In: Ic1a937d3d81f4386ae744109076935921da9591b Change-Id: Ie6f1133cac2e0f4f73a3620c71bd0c44d3b9be0b --- .../statusbar/phone/StatusBarKeyguardViewManagerTest.java | 4 ++++ 1 file changed, 4 insertions(+) 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 1b33aefd1634..da2e8dc90854 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 @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.phone; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -31,6 +32,7 @@ import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.view.View; import android.view.ViewGroup; +import android.view.ViewPropertyAnimator; import androidx.test.filters.SmallTest; @@ -85,6 +87,8 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { mDependency.injectMockDependency(StatusBarWindowController.class); mDependency.injectTestDependency(StatusBarStateController.class, mStatusBarStateController); when(mLockIconContainer.getParent()).thenReturn(mock(ViewGroup.class)); + when(mLockIconContainer.animate()).thenReturn(mock(ViewPropertyAnimator.class, + RETURNS_DEEP_STUBS)); mStatusBarKeyguardViewManager = new TestableStatusBarKeyguardViewManager(getContext(), mViewMediatorCallback, mLockPatternUtils); mStatusBarKeyguardViewManager.registerStatusBar(mStatusBar, mContainer, -- GitLab From abcc201afb105d57d234e6fdd88b2e77ceed7707 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Tue, 23 Jul 2019 18:44:07 -0700 Subject: [PATCH 409/620] Not asking for the password when dragging down and bypass Instead we'll just keep them in there looking like locked notifications. Fixes: 138225058 Test: add notifications, enable dynamic privacy, drag down Change-Id: Ica49035ba3fe655c145f81be962817ddd294c48d --- core/java/android/app/Notification.java | 9 +++++++-- .../notification/row/NotificationContentInflater.java | 2 +- .../stack/NotificationStackScrollLayout.java | 2 ++ .../com/android/systemui/statusbar/phone/StatusBar.java | 3 +++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index f66448f518c8..ceadd8510e44 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -5437,10 +5437,11 @@ public class Notification implements Parcelable /** * Construct a RemoteViews for the display in public contexts like on the lockscreen. * + * @param isLowPriority is this notification low priority * @hide */ @UnsupportedAppUsage - public RemoteViews makePublicContentView() { + public RemoteViews makePublicContentView(boolean isLowPriority) { if (mN.publicVersion != null) { final Builder builder = recoverBuilder(mContext, mN.publicVersion); return builder.createContentView(); @@ -5467,7 +5468,11 @@ public class Notification implements Parcelable } mN.extras = publicExtras; RemoteViews view; - view = makeNotificationHeader(); + StandardTemplateParams params = mParams.reset().fillTextsFrom(this); + if (isLowPriority) { + params.forceDefaultColor(); + } + view = makeNotificationHeader(params); view.setBoolean(R.id.notification_header, "setExpandOnlyOnButton", true); mN.extras = savedBundle; mN.mLargeIcon = largeIcon; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java index d057a1d2f20b..48a82957bf1e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java @@ -349,7 +349,7 @@ public class NotificationContentInflater { } if ((reInflateFlags & FLAG_CONTENT_VIEW_PUBLIC) != 0) { - result.newPublicView = builder.makePublicContentView(); + result.newPublicView = builder.makePublicContentView(isLowPriority); } result.packageContext = packageContext; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 9e3d74b138fa..3dae283e4b7e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -5668,6 +5668,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd // The bottom might change because we're using the final actual height of the view mAnimateBottomOnLayout = true; } + // Let's update the footer once the notifications have been updated (in the next frame) + post(this::updateFooter); } public void setOnPulseHeightChangedListener(Runnable listener) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index d93dc950a077..f6467d61c332 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -3563,6 +3563,9 @@ public class StatusBar extends SystemUI implements DemoMode, userAllowsPrivateNotificationsInPublic(mLockscreenUserManager.getCurrentUserId()) || !mLockscreenUserManager.shouldShowLockscreenNotifications() || mFalsingManager.shouldEnforceBouncer(); + if (mKeyguardBypassController.getBypassEnabled()) { + fullShadeNeedsBouncer = false; + } if (mLockscreenUserManager.isLockscreenPublicMode(userId) && fullShadeNeedsBouncer) { mStatusBarStateController.setLeaveOpenOnKeyguardHide(true); showBouncerIfKeyguard(); -- GitLab From a678b0ee1f89c1f95d35bef5d83fc8856f6230d7 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Tue, 23 Jul 2019 13:12:55 -0700 Subject: [PATCH 410/620] Collapsing the heads up when showing the bouncer Previously we were keep showing heads up and music notifications when the shade was fully collapsed. We're now collapsing them as soon as you start collapsing the panel. Fixes: 136882221 Change-Id: I85783e8504b27110e16a0f15d2289d743ef0c3ea --- .../NotificationWakeUpCoordinator.kt | 23 ++++++++++- .../systemui/statusbar/phone/LockIcon.java | 28 ++++++++++---- .../phone/NotificationPanelView.java | 24 +----------- .../phone/PanelExpansionListener.java | 38 +++++++++++++++++++ .../systemui/statusbar/phone/PanelView.java | 12 +++--- .../systemui/statusbar/phone/StatusBar.java | 1 + .../phone/StatusBarKeyguardViewManager.java | 4 +- 7 files changed, 90 insertions(+), 40 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelExpansionListener.java diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt index 6a3816c50330..0e53ff3a5e5c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt @@ -29,6 +29,7 @@ import com.android.systemui.statusbar.phone.DozeParameters import com.android.systemui.statusbar.phone.HeadsUpManagerPhone import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.phone.NotificationIconAreaController +import com.android.systemui.statusbar.phone.PanelExpansionListener import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener import javax.inject.Inject @@ -40,7 +41,8 @@ class NotificationWakeUpCoordinator @Inject constructor( private val mHeadsUpManagerPhone: HeadsUpManagerPhone, private val statusBarStateController: StatusBarStateController, private val bypassController: KeyguardBypassController) - : OnHeadsUpChangedListener, StatusBarStateController.StateListener { + : OnHeadsUpChangedListener, StatusBarStateController.StateListener, + PanelExpansionListener { private val mNotificationVisibility = object : FloatProperty("notificationVisibility") { @@ -80,7 +82,9 @@ class NotificationWakeUpCoordinator @Inject constructor( } } + private var collapsedEnoughToHide: Boolean = false lateinit var iconAreaController : NotificationIconAreaController + var pulsing: Boolean = false set(value) { field = value @@ -102,7 +106,6 @@ class NotificationWakeUpCoordinator @Inject constructor( } } } - /** * True if we can show pulsing heads up notifications */ @@ -114,6 +117,10 @@ class NotificationWakeUpCoordinator @Inject constructor( // We also allow pulsing on the lock screen! canShow = canShow || (mWakingUp || willWakeUp || fullyAwake) && statusBarStateController.state == StatusBarState.KEYGUARD + // We want to hide the notifications when collapsed too much + if (collapsedEnoughToHide) { + canShow = false + } } return canShow } @@ -229,6 +236,18 @@ class NotificationWakeUpCoordinator @Inject constructor( this.state = newState } + override fun onPanelExpansionChanged(expansion: Float, tracking: Boolean) { + val collapsedEnough = expansion <= 0.9f + if (collapsedEnough != this.collapsedEnoughToHide) { + val couldShowPulsingHuns = canShowPulsingHuns; + this.collapsedEnoughToHide = collapsedEnough + if (couldShowPulsingHuns && !canShowPulsingHuns) { + updateNotificationVisibility(animate = true, increaseSpeed = true) + mHeadsUpManagerPhone.releaseAllImmediately() + } + } + } + private fun updateDozeAmountIfBypass(): Boolean { if (bypassController.bypassEnabled) { var amount = 1.0f; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index 1360a084207b..9b334f57706c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -323,14 +323,24 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange } updateDarkTint(); + updateIconVisibility(); + updateClickability(); + + return true; + } + + /** + * Update the icon visibility + * @return true if the visibility changed + */ + private boolean updateIconVisibility() { boolean onAodNotPulsingOrDocked = mDozing && (!mPulsing || mDocked); boolean invisible = onAodNotPulsingOrDocked || mWakeAndUnlockRunning || mShowingLaunchAffordance; if (mBypassController.getBypassEnabled() && !mBouncerShowingScrimmed) { - if (mHeadsUpManager.isHeadsUpGoingAway() - || mHeadsUpManager.hasPinnedHeadsUp() - || (mStatusBarStateController.getState() == StatusBarState.KEYGUARD - && !mWakeUpCoordinator.getNotificationsFullyHidden())) { + if ((mHeadsUpManager.isHeadsUpGoingAway() || mHeadsUpManager.hasPinnedHeadsUp()) + && mStatusBarStateController.getState() == StatusBarState.KEYGUARD + && !mWakeUpCoordinator.getNotificationsFullyHidden()) { invisible = true; } } @@ -349,10 +359,9 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange .setDuration(233) .start(); } + return true; } - updateClickability(); - - return true; + return false; } private boolean canBlockUpdates() { @@ -440,7 +449,10 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange @Override public void onFullyHiddenChanged(boolean isFullyHidden) { if (mBypassController.getBypassEnabled()) { - update(); + boolean changed = updateIconVisibility(); + if (changed) { + update(); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 37855ae592a5..5534850f2720 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -1717,8 +1717,8 @@ public class NotificationPanelView extends PanelView implements mStatusBar.executeRunnableDismissingKeyguard(null, null /* cancelAction */, false /* dismissShade */, true /* afterKeyguardGone */, false /* deferred */); } - if (mExpansionListener != null) { - mExpansionListener.onQsExpansionChanged(mQsMaxExpansionHeight != 0 + for (int i = 0; i < mExpansionListeners.size(); i++) { + mExpansionListeners.get(i).onQsExpansionChanged(mQsMaxExpansionHeight != 0 ? mQsExpansionHeight / mQsMaxExpansionHeight : 0); } if (DEBUG) { @@ -3374,24 +3374,4 @@ public class NotificationPanelView extends PanelView implements mOnReinflationListener = onReinflationListener; } - /** - * Panel and QS expansion callbacks. - */ - public interface PanelExpansionListener { - /** - * Invoked whenever the notification panel expansion changes, at every animation frame. - * This is the main expansion that happens when the user is swiping up to dismiss the - * lock screen. - * - * @param expansion 0 when collapsed, 1 when expanded. - * @param tracking {@code true} when the user is actively dragging the panel. - */ - void onPanelExpansionChanged(float expansion, boolean tracking); - - /** - * Invoked whenever the QS expansion changes, at every animation frame. - * @param expansion 0 when collapsed, 1 when expanded. - */ - void onQsExpansionChanged(float expansion); - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelExpansionListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelExpansionListener.java new file mode 100644 index 000000000000..655a25d22337 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelExpansionListener.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.phone; + +/** + * Panel and QS expansion callbacks. + */ +public interface PanelExpansionListener { + /** + * Invoked whenever the notification panel expansion changes, at every animation frame. + * This is the main expansion that happens when the user is swiping up to dismiss the + * lock screen. + * + * @param expansion 0 when collapsed, 1 when expanded. + * @param tracking {@code true} when the user is actively dragging the panel. + */ + void onPanelExpansionChanged(float expansion, boolean tracking); + + /** + * Invoked whenever the QS expansion changes, at every animation frame. + * @param expansion 0 when collapsed, 1 when expanded. + */ + default void onQsExpansionChanged(float expansion) {}; +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index a5b221bbad8c..98526b9207b2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -50,11 +50,11 @@ import com.android.systemui.statusbar.FlingAnimationUtils; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.VibratorHelper; -import com.android.systemui.statusbar.phone.NotificationPanelView.PanelExpansionListener; import com.android.systemui.statusbar.policy.KeyguardMonitor; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.ArrayList; public abstract class PanelView extends FrameLayout { public static final boolean DEBUG = PanelBar.DEBUG; @@ -69,7 +69,7 @@ public abstract class PanelView extends FrameLayout { private boolean mVibrateOnOpening; protected boolean mLaunchingNotification; private int mFixedDuration = NO_FIXED_DURATION; - protected PanelExpansionListener mExpansionListener; + protected ArrayList mExpansionListeners = new ArrayList<>(); private final void logf(String fmt, Object... args) { Log.v(TAG, (mViewName != null ? (mViewName + ": ") : "") + String.format(fmt, args)); @@ -1174,13 +1174,13 @@ public abstract class PanelView extends FrameLayout { || mPeekAnimator != null || mInstantExpanding || isPanelVisibleBecauseOfHeadsUp() || mTracking || mHeightAnimator != null); } - if (mExpansionListener != null) { - mExpansionListener.onPanelExpansionChanged(mExpandedFraction, mTracking); + for (int i = 0; i < mExpansionListeners.size(); i++) { + mExpansionListeners.get(i).onPanelExpansionChanged(mExpandedFraction, mTracking); } } - public void setExpansionListener(PanelExpansionListener panelExpansionListener) { - mExpansionListener = panelExpansionListener; + public void addExpansionListener(PanelExpansionListener panelExpansionListener) { + mExpansionListeners.add(panelExpansionListener); } protected abstract boolean isPanelVisibleBecauseOfHeadsUp(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index d93dc950a077..c6f193bf29f1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -814,6 +814,7 @@ public class StatusBar extends SystemUI implements DemoMode, inflateShelf(); mNotificationIconAreaController.setupShelf(mNotificationShelf); mNotificationPanel.setOnReinflationListener(mNotificationIconAreaController::initAodIcons); + mNotificationPanel.addExpansionListener(mWakeUpCoordinator); Dependency.get(DarkIconDispatcher.class).addDarkReceiver(mNotificationIconAreaController); // Allow plugins to reference DarkIconDispatcher and StatusBarStateController 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 1321784c978a..67b389eb5cb4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -69,7 +69,7 @@ import java.util.ArrayList; */ public class StatusBarKeyguardViewManager implements RemoteInputController.Callback, StatusBarStateController.StateListener, ConfigurationController.ConfigurationListener, - NotificationPanelView.PanelExpansionListener, NavigationModeController.ModeChangedListener { + PanelExpansionListener, NavigationModeController.ModeChangedListener { // When hiding the Keyguard with timing supplied from WindowManager, better be early than late. private static final long HIDE_TIMING_CORRECTION_MS = - 16 * 3; @@ -222,7 +222,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mViewMediatorCallback, mLockPatternUtils, container, dismissCallbackRegistry, mExpansionCallback); mNotificationPanelView = notificationPanelView; - notificationPanelView.setExpansionListener(this); + notificationPanelView.addExpansionListener(this); mBypassController = bypassController; mNotificationContainer = notificationContainer; } -- GitLab From 5584518d8cc83540eafe3ca04ec9d69dfc971da3 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Tue, 23 Jul 2019 19:26:38 -0700 Subject: [PATCH 411/620] Allowing to drag down while the quick settings are expanded Fixes: 137552697 Test: pull down after expanding quick settings Change-Id: I8246820b727d134c5432e6411218f0806d3899cc --- .../android/systemui/statusbar/phone/StatusBarWindowView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index 94054188d769..d98ac240d62f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -419,7 +419,7 @@ public class StatusBarWindowView extends FrameLayout { if (mNotificationPanel.isFullyExpanded() && mStatusBarStateController.getState() == StatusBarState.KEYGUARD && !mService.isBouncerShowing() - && !mBypassController.getBypassEnabled() + && (!mBypassController.getBypassEnabled() || mNotificationPanel.isQsExpanded()) && !mService.isDozing()) { intercept = mDragDownHelper.onInterceptTouchEvent(ev); } -- GitLab From eab3c90103c25a6cbeb0989847a687b39158384e Mon Sep 17 00:00:00 2001 From: Andrii Kulian Date: Tue, 23 Jul 2019 19:32:39 -0700 Subject: [PATCH 412/620] Use shell package name when starting activities When starting activities from shell it was passing null calling package name, which failed the uid-package match verification. Bug: 138224633 Test: atest CtsWindowManagerDeviceTestCases:ActivityVisibilityTests Change-Id: I5640b2b89d43b47e1573ce79758903394ea8c9a9 --- .../com/android/server/am/ActivityManagerShellCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index cba9674d7360..26b3f435dea1 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -510,12 +510,12 @@ final class ActivityManagerShellCommand extends ShellCommand { options.setLockTaskEnabled(true); } if (mWaitOption) { - result = mInternal.startActivityAndWait(null, null, intent, mimeType, + result = mInternal.startActivityAndWait(null, SHELL_PACKAGE_NAME, intent, mimeType, null, null, 0, mStartFlags, profilerInfo, options != null ? options.toBundle() : null, mUserId); res = result.result; } else { - res = mInternal.startActivityAsUser(null, null, intent, mimeType, + res = mInternal.startActivityAsUser(null, SHELL_PACKAGE_NAME, intent, mimeType, null, null, 0, mStartFlags, profilerInfo, options != null ? options.toBundle() : null, mUserId); } -- GitLab From 240daf679b8f0b53820380c0504f3829a3b6824a Mon Sep 17 00:00:00 2001 From: nathch Date: Wed, 24 Jul 2019 01:07:12 +0100 Subject: [PATCH 413/620] Unsubscribe listeners when stopping UserBackupManagerService Unsubscribe listeners as otherwise they schedule work on a stopped handler thread after the user backup manager service is stopped This also ensures that any dangling wakelocks are released when they are garbage collected This was already done in master in ag/8036218 Test: atest CtsBackupTestCases CtsBackupHostTestCases Test: m RunBackupFrameworksServicesRoboTests && atest RunBackupFrameworksServicesRoboTests Test: blaze run -- //experimental/users/nathch/py/bug_repros:repro 136264323 -m w_codechange followed by "adb shell kill -10 pid" (where pid = "adb shell pgrep system_server") to force GC see in logs: PowerManager: WakeLock finalized while still held: *backup*-0 Test: blaze run -- //experimental/users/nathch/py/bug_repros:repro 136264323 -m backup_w_codechange followed by same as above Bug: 136264323 Bug: 135261178 Change-Id: I769d750a46faa3d28634d302e0f8e18cce41a744 --- .../backup/UserBackupManagerService.java | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java index c0af99c30542..e24eaa50377a 100644 --- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java @@ -367,6 +367,9 @@ public class UserBackupManagerService { private long mCurrentToken = 0; @Nullable private File mAncestralSerialNumberFile; + private final ContentObserver mSetupObserver; + private final BroadcastReceiver mRunBackupReceiver; + private final BroadcastReceiver mRunInitReceiver; /** * Creates an instance of {@link UserBackupManagerService} and initializes state for it. This @@ -493,11 +496,11 @@ public class UserBackupManagerService { mAutoRestore = Settings.Secure.getIntForUser(resolver, Settings.Secure.BACKUP_AUTO_RESTORE, 1, userId) != 0; - ContentObserver setupObserver = new SetupObserver(this, mBackupHandler); + mSetupObserver = new SetupObserver(this, mBackupHandler); resolver.registerContentObserver( Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE), /* notifyForDescendents */ false, - setupObserver, + mSetupObserver, mUserId); mBaseStateDir = checkNotNull(baseStateDir, "baseStateDir cannot be null"); @@ -516,21 +519,21 @@ public class UserBackupManagerService { mBackupPasswordManager = new BackupPasswordManager(mContext, mBaseStateDir, mRng); // Receivers for scheduled backups and transport initialization operations. - BroadcastReceiver runBackupReceiver = new RunBackupReceiver(this); + mRunBackupReceiver = new RunBackupReceiver(this); IntentFilter filter = new IntentFilter(); filter.addAction(RUN_BACKUP_ACTION); context.registerReceiverAsUser( - runBackupReceiver, + mRunBackupReceiver, UserHandle.of(userId), filter, android.Manifest.permission.BACKUP, /* scheduler */ null); - BroadcastReceiver runInitReceiver = new RunInitializeReceiver(this); + mRunInitReceiver = new RunInitializeReceiver(this); filter = new IntentFilter(); filter.addAction(RUN_INITIALIZE_ACTION); context.registerReceiverAsUser( - runInitReceiver, + mRunInitReceiver, UserHandle.of(userId), filter, android.Manifest.permission.BACKUP, @@ -599,6 +602,12 @@ public class UserBackupManagerService { /** Cleans up state when the user of this service is stopped. */ void tearDownService() { + mAgentTimeoutParameters.stop(); + mConstants.stop(); + mContext.getContentResolver().unregisterContentObserver(mSetupObserver); + mContext.unregisterReceiver(mRunBackupReceiver); + mContext.unregisterReceiver(mRunInitReceiver); + mContext.unregisterReceiver(mPackageTrackingReceiver); mUserBackupThread.quit(); } @@ -747,7 +756,7 @@ public class UserBackupManagerService { @VisibleForTesting BroadcastReceiver getPackageTrackingReceiver() { - return mBroadcastReceiver; + return mPackageTrackingReceiver; } @Nullable @@ -874,7 +883,7 @@ public class UserBackupManagerService { filter.addAction(Intent.ACTION_PACKAGE_CHANGED); filter.addDataScheme("package"); mContext.registerReceiverAsUser( - mBroadcastReceiver, + mPackageTrackingReceiver, UserHandle.of(mUserId), filter, /* broadcastPermission */ null, @@ -885,7 +894,7 @@ public class UserBackupManagerService { sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE); sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE); mContext.registerReceiverAsUser( - mBroadcastReceiver, + mPackageTrackingReceiver, UserHandle.of(mUserId), sdFilter, /* broadcastPermission */ null, @@ -1158,7 +1167,7 @@ public class UserBackupManagerService { * A {@link BroadcastReceiver} tracking changes to packages and sd cards in order to update our * internal bookkeeping. */ - private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + private BroadcastReceiver mPackageTrackingReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { if (MORE_DEBUG) { Slog.d(TAG, "Received broadcast " + intent); -- GitLab From 47af13c8057796d2b33ba9fed16232bf2efc31df Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Wed, 24 Jul 2019 09:21:33 -0700 Subject: [PATCH 414/620] Add the defination of Intent - WIFI_NETWORK_SETTINGS_RESET_ACTION Bug: 135489675 Test: Do 'reset settings', registered app got the Intent. Change-Id: I39adae63269595edda79aaf3da82a3dfe613d59a --- wifi/java/android/net/wifi/WifiManager.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 4115663b8bb8..f540492266c5 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -670,6 +670,14 @@ public class WifiManager { */ public static final int IFACE_IP_MODE_LOCAL_ONLY = 2; + /** + * Broadcast intent action indicating that the wifi network settings + * had been reset. + * @hide + */ + public static final String WIFI_NETWORK_SETTINGS_RESET_ACTION = + "android.net.wifi.action.NETWORK_SETTINGS_RESET"; + /** * Broadcast intent action indicating that a connection to the supplicant has * been established (and it is now possible -- GitLab From 842369a82bad306f1ea5e2b74395f2651c54b117 Mon Sep 17 00:00:00 2001 From: nathch Date: Wed, 24 Jul 2019 18:11:40 +0100 Subject: [PATCH 415/620] DO NOT MERGE Add stop method to backup handler thread. Currently we call .quit() on the underlying thread which will cause all messages to stop being processed. This has the side effect that, because the backup system is a state machine where the state transitions are messages, the message to transition into a state where the WakeLock is released may not occur when a user is torn down. This change adds a stop method we can call instead of .quit() on the thread which drops any remaining messages and then releases the WakeLock. We also wrap the wakelock acquire/release calls to prevent any acquire/release on the underlying wakelock after a quit. For the acquire, this avoids a non-released wakelock and for the release, this avoids a runtime exception which can happen when we release a released wakelock Test: atest CtsBackupTestCases CtsBackupHostTestCases Test: m RunBackupFrameworksServicesRoboTests && atest RunBackupFrameworksServicesRoboTests Test: blaze run -- //experimental/users/nathch/py/bug_repros:repro 136264323 -m acquire_quit -log DEBUG Test: blaze run -- //experimental/users/nathch/py/bug_repros:repro 136264323 -m quit_acquire -log DEBUG Test: blaze run -- //experimental/users/nathch/py/bug_repros:repro 136264323 -m acquire_quit_release -log DEBUG Bug: 136264323 Change-Id: I42dcf997fc44cde05695a563aa19c8e47f6f9f26 --- .../backup/UserBackupManagerService.java | 63 ++++++++++++++++--- .../server/backup/internal/BackupHandler.java | 34 +++++++++- .../internal/RunInitializeReceiver.java | 4 +- .../backup/restore/ActiveRestoreSession.java | 5 +- .../keyvalue/KeyValueBackupTaskTest.java | 3 +- .../restore/ActiveRestoreSessionTest.java | 11 ++-- .../BackupManagerServiceTestUtils.java | 8 ++- 7 files changed, 102 insertions(+), 26 deletions(-) diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java index e24eaa50377a..2554433fb659 100644 --- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java @@ -166,6 +166,52 @@ import java.util.concurrent.atomic.AtomicInteger; /** System service that performs backup/restore operations. */ public class UserBackupManagerService { + /** Wrapper over {@link PowerManager.WakeLock} to prevent double-free exceptions on release() + * after quit(). + * */ + public static class BackupWakeLock { + private final PowerManager.WakeLock mPowerManagerWakeLock; + private boolean mHasQuit = false; + + public BackupWakeLock(PowerManager.WakeLock powerManagerWakeLock) { + mPowerManagerWakeLock = powerManagerWakeLock; + } + + /** Acquires the {@link PowerManager.WakeLock} if hasn't been quit. */ + public synchronized void acquire() { + if (mHasQuit) { + Slog.v(TAG, "Ignore wakelock acquire after quit:" + mPowerManagerWakeLock.getTag()); + return; + } + mPowerManagerWakeLock.acquire(); + } + + /** Releases the {@link PowerManager.WakeLock} if hasn't been quit. */ + public synchronized void release() { + if (mHasQuit) { + Slog.v(TAG, "Ignore wakelock release after quit:" + mPowerManagerWakeLock.getTag()); + return; + } + mPowerManagerWakeLock.release(); + } + + /** + * Returns true if the {@link PowerManager.WakeLock} has been acquired but not yet released. + */ + public synchronized boolean isHeld() { + return mPowerManagerWakeLock.isHeld(); + } + + /** Release the {@link PowerManager.WakeLock} till it isn't held. */ + public synchronized void quit() { + while (mPowerManagerWakeLock.isHeld()) { + Slog.v(TAG, "Releasing wakelock:" + mPowerManagerWakeLock.getTag()); + mPowerManagerWakeLock.release(); + } + mHasQuit = true; + } + } + // Persistently track the need to do a full init. private static final String INIT_SENTINEL_FILE_NAME = "_need_init_"; @@ -252,7 +298,6 @@ public class UserBackupManagerService { private final @UserIdInt int mUserId; private final BackupAgentTimeoutParameters mAgentTimeoutParameters; private final TransportManager mTransportManager; - private final HandlerThread mUserBackupThread; private final Context mContext; private final PackageManager mPackageManager; @@ -263,7 +308,7 @@ public class UserBackupManagerService { private final AlarmManager mAlarmManager; private final IStorageManager mStorageManager; private final BackupManagerConstants mConstants; - private final PowerManager.WakeLock mWakelock; + private final BackupWakeLock mWakelock; private final BackupHandler mBackupHandler; private final IBackupManager mBackupManagerBinder; @@ -487,8 +532,7 @@ public class UserBackupManagerService { mAgentTimeoutParameters.start(); checkNotNull(userBackupThread, "userBackupThread cannot be null"); - mUserBackupThread = userBackupThread; - mBackupHandler = new BackupHandler(this, userBackupThread.getLooper()); + mBackupHandler = new BackupHandler(this, userBackupThread); // Set up our bookkeeping final ContentResolver resolver = context.getContentResolver(); @@ -588,7 +632,10 @@ public class UserBackupManagerService { mBackupHandler.postDelayed(this::parseLeftoverJournals, INITIALIZATION_DELAY_MILLIS); // Power management - mWakelock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*-" + userId); + mWakelock = new BackupWakeLock( + mPowerManager.newWakeLock( + PowerManager.PARTIAL_WAKE_LOCK, + "*backup*-" + userId + "-" + userBackupThread.getThreadId())); // Set up the various sorts of package tracking we do mFullBackupScheduleFile = new File(mBaseStateDir, "fb-schedule"); @@ -608,7 +655,7 @@ public class UserBackupManagerService { mContext.unregisterReceiver(mRunBackupReceiver); mContext.unregisterReceiver(mRunInitReceiver); mContext.unregisterReceiver(mPackageTrackingReceiver); - mUserBackupThread.quit(); + mBackupHandler.stop(); } public @UserIdInt int getUserId() { @@ -668,7 +715,7 @@ public class UserBackupManagerService { mSetupComplete = setupComplete; } - public PowerManager.WakeLock getWakelock() { + public BackupWakeLock getWakelock() { return mWakelock; } @@ -679,7 +726,7 @@ public class UserBackupManagerService { @VisibleForTesting public void setWorkSource(@Nullable WorkSource workSource) { // TODO: This is for testing, unfortunately WakeLock is final and WorkSource is not exposed - mWakelock.setWorkSource(workSource); + mWakelock.mPowerManagerWakeLock.setWorkSource(workSource); } public Handler getBackupHandler() { diff --git a/services/backup/java/com/android/server/backup/internal/BackupHandler.java b/services/backup/java/com/android/server/backup/internal/BackupHandler.java index ba153bf90ebe..059b1b9379af 100644 --- a/services/backup/java/com/android/server/backup/internal/BackupHandler.java +++ b/services/backup/java/com/android/server/backup/internal/BackupHandler.java @@ -23,7 +23,7 @@ import static com.android.server.backup.BackupManagerService.TAG; import android.app.backup.RestoreSet; import android.content.Intent; import android.os.Handler; -import android.os.Looper; +import android.os.HandlerThread; import android.os.Message; import android.os.RemoteException; import android.os.UserHandle; @@ -83,19 +83,47 @@ public class BackupHandler extends Handler { // backup task state machine tick public static final int MSG_BACKUP_RESTORE_STEP = 20; public static final int MSG_OP_COMPLETE = 21; + // Release the wakelock. This is used to ensure we don't hold it after + // a user is removed. This will also terminate the looper thread. + public static final int MSG_STOP = 22; private final UserBackupManagerService backupManagerService; private final BackupAgentTimeoutParameters mAgentTimeoutParameters; - public BackupHandler(UserBackupManagerService backupManagerService, Looper looper) { - super(looper); + private final HandlerThread mBackupThread; + private volatile boolean mIsStopping = false; + + public BackupHandler( + UserBackupManagerService backupManagerService, HandlerThread backupThread) { + super(backupThread.getLooper()); + mBackupThread = backupThread; this.backupManagerService = backupManagerService; mAgentTimeoutParameters = Preconditions.checkNotNull( backupManagerService.getAgentTimeoutParameters(), "Timeout parameters cannot be null"); } + /** + * Put the BackupHandler into a stopping state where the remaining messages on the queue will be + * silently dropped and the {@link WakeLock} held by the {@link UserBackupManagerService} will + * then be released. + */ + public void stop() { + mIsStopping = true; + sendMessage(obtainMessage(BackupHandler.MSG_STOP)); + } + public void handleMessage(Message msg) { + if (msg.what == MSG_STOP) { + Slog.v(TAG, "Stopping backup handler"); + backupManagerService.getWakelock().quit(); + mBackupThread.quitSafely(); + } + + if (mIsStopping) { + // If we're finishing all other types of messages should be ignored + return; + } TransportManager transportManager = backupManagerService.getTransportManager(); switch (msg.what) { diff --git a/services/backup/java/com/android/server/backup/internal/RunInitializeReceiver.java b/services/backup/java/com/android/server/backup/internal/RunInitializeReceiver.java index 97711e3c27ed..96d61e5755c8 100644 --- a/services/backup/java/com/android/server/backup/internal/RunInitializeReceiver.java +++ b/services/backup/java/com/android/server/backup/internal/RunInitializeReceiver.java @@ -23,7 +23,6 @@ import static com.android.server.backup.UserBackupManagerService.RUN_INITIALIZE_ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.os.PowerManager; import android.util.Slog; import com.android.server.backup.UserBackupManagerService; @@ -57,7 +56,8 @@ public class RunInitializeReceiver extends BroadcastReceiver { mUserBackupManagerService.clearPendingInits(); - PowerManager.WakeLock wakelock = mUserBackupManagerService.getWakelock(); + UserBackupManagerService.BackupWakeLock wakelock = + mUserBackupManagerService.getWakelock(); wakelock.acquire(); OnTaskFinishedListener listener = caller -> wakelock.release(); diff --git a/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java b/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java index 10304c39f021..5a57cdc39402 100644 --- a/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java +++ b/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java @@ -34,7 +34,6 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.os.Binder; import android.os.Handler; import android.os.Message; -import android.os.PowerManager; import android.util.Slog; import com.android.server.backup.TransportManager; @@ -110,7 +109,7 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { // comes in. mBackupManagerService.getBackupHandler().removeMessages(MSG_RESTORE_SESSION_TIMEOUT); - PowerManager.WakeLock wakelock = mBackupManagerService.getWakelock(); + UserBackupManagerService.BackupWakeLock wakelock = mBackupManagerService.getWakelock(); wakelock.acquire(); // Prevent lambda from leaking 'this' @@ -392,7 +391,7 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { Handler backupHandler = mBackupManagerService.getBackupHandler(); backupHandler.removeMessages(MSG_RESTORE_SESSION_TIMEOUT); - PowerManager.WakeLock wakelock = mBackupManagerService.getWakelock(); + UserBackupManagerService.BackupWakeLock wakelock = mBackupManagerService.getWakelock(); wakelock.acquire(); if (MORE_DEBUG) { Slog.d(TAG, callerLogString); diff --git a/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java b/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java index cc64323e51c7..1d082c735d09 100644 --- a/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java +++ b/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java @@ -94,7 +94,6 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.ParcelFileDescriptor; -import android.os.PowerManager; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.util.Pair; @@ -184,7 +183,7 @@ public class KeyValueBackupTaskTest { private TransportData mTransport; private ShadowLooper mShadowBackupLooper; private Handler mBackupHandler; - private PowerManager.WakeLock mWakeLock; + private UserBackupManagerService.BackupWakeLock mWakeLock; private KeyValueBackupReporter mReporter; private PackageManager mPackageManager; private ShadowPackageManager mShadowPackageManager; diff --git a/services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java b/services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java index f4cea7ae86a6..3fc421dfb6e9 100644 --- a/services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java +++ b/services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java @@ -18,7 +18,7 @@ package com.android.server.backup.restore; import static com.android.server.backup.testing.BackupManagerServiceTestUtils.createBackupWakeLock; import static com.android.server.backup.testing.BackupManagerServiceTestUtils.setUpBackupManagerServiceBasics; -import static com.android.server.backup.testing.BackupManagerServiceTestUtils.startBackupThreadAndGetLooper; +import static com.android.server.backup.testing.BackupManagerServiceTestUtils.startBackupThread; import static com.android.server.backup.testing.TestUtils.assertEventLogged; import static com.android.server.backup.testing.TestUtils.assertEventNotLogged; import static com.android.server.backup.testing.TransportData.backupTransport; @@ -44,8 +44,8 @@ import android.app.backup.RestoreSet; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.os.Handler; +import android.os.HandlerThread; import android.os.Looper; -import android.os.PowerManager; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; @@ -98,7 +98,7 @@ public class ActiveRestoreSessionTest { @Mock private IBackupManagerMonitor mMonitor; private ShadowLooper mShadowBackupLooper; private ShadowApplication mShadowApplication; - private PowerManager.WakeLock mWakeLock; + private UserBackupManagerService.BackupWakeLock mWakeLock; private TransportData mTransport; private RestoreSet mRestoreSet1; private RestoreSet mRestoreSet2; @@ -118,7 +118,8 @@ public class ActiveRestoreSessionTest { mShadowPackageManager = shadowOf(application.getPackageManager()); - Looper backupLooper = startBackupThreadAndGetLooper(); + HandlerThread handlerThread = startBackupThread(null); + Looper backupLooper = handlerThread.getLooper(); mShadowBackupLooper = shadowOf(backupLooper); Handler mainHandler = new Handler(Looper.getMainLooper()); @@ -129,7 +130,7 @@ public class ActiveRestoreSessionTest { // We need to mock BMS timeout parameters before initializing the BackupHandler since // the constructor of BackupHandler relies on it. when(mBackupManagerService.getAgentTimeoutParameters()).thenReturn(agentTimeoutParameters); - BackupHandler backupHandler = new BackupHandler(mBackupManagerService, backupLooper); + BackupHandler backupHandler = new BackupHandler(mBackupManagerService, handlerThread); mWakeLock = createBackupWakeLock(application); diff --git a/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java b/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java index 47abcc5a2dd1..392d182328a5 100644 --- a/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java +++ b/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java @@ -113,7 +113,7 @@ public class BackupManagerServiceTestUtils { TransportManager transportManager, PackageManager packageManager, Handler backupHandler, - PowerManager.WakeLock wakeLock, + UserBackupManagerService.BackupWakeLock wakeLock, BackupAgentTimeoutParameters agentTimeoutParameters) { when(backupManagerService.getContext()).thenReturn(application); @@ -161,10 +161,12 @@ public class BackupManagerServiceTestUtils { }); } - public static PowerManager.WakeLock createBackupWakeLock(Application application) { + public static UserBackupManagerService.BackupWakeLock createBackupWakeLock( + Application application) { PowerManager powerManager = (PowerManager) application.getSystemService(Context.POWER_SERVICE); - return powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*"); + return new UserBackupManagerService.BackupWakeLock( + powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*")); } /** -- GitLab From e38da07841f8d226e2c024709adfd4b866036fb1 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Thu, 18 Jul 2019 17:20:11 -0400 Subject: [PATCH 416/620] Allow BrightLineFalsingManager settings to be experimented with via Phenotype. This is a CP of http://ag/8687829 Bug: 138308096 Test: atest SystemUITests Change-Id: I9e2b22b157c45da1606466acdfff3c5de7f182e1 Merged-In: I9fa4d1344bb184dea00f92f8d265667f0be11466 --- .../sysui/SystemUiDeviceConfigFlags.java | 83 +++++++++++++++++++ .../brightline/DiagonalClassifier.java | 24 +++++- .../brightline/DistanceClassifier.java | 65 ++++++++++++--- .../brightline/ProximityClassifier.java | 12 ++- .../brightline/ZigZagClassifier.java | 40 ++++++++- 5 files changed, 201 insertions(+), 23 deletions(-) diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 4daddfbfb204..8dc47a401580 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -186,6 +186,89 @@ public final class SystemUiDeviceConfigFlags { */ public static final String BRIGHTLINE_FALSING_MANAGER_ENABLED = "brightline_falsing_manager_enabled"; + /** + * (float) Maximum fraction of the screen required to qualify as a real swipe. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_SCREEN_FRACTION_MAX_DISTANCE = + "brightline_falsing_distance_screen_fraction_max_distance"; + + /** + * (float) Multiplier for swipe velocity to convert it to pixels for a fling. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_VELOCITY_TO_DISTANCE = + "brightline_falsing_distance_velcoity_to_distance"; + + /** + * (float) How far, in inches, must a fling travel horizontally to qualify as intentional. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_FLING_THRESHOLD_IN = + "brightline_falsing_distance_horizontal_fling_threshold_in"; + + /** + * (float) Maximum fraction of the screen required to qualify as a real swipe. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_VERTICAL_FLING_THRESHOLD_IN = + "brightline_falsing_distance_vertical_fling_threshold_in"; + + /** + * (float) How far, in inches, must a continuous swipe travel horizontally to be intentional. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_SWIPE_THRESHOLD_IN = + "brightline_falsing_distance_horizontal_swipe_threshold_in"; + + /** + * (float) How far, in inches, must a continuous swipe travel vertically to be intentional. + */ + public static final String BRIGHTLINE_FALSING_DISTANCE_VERTICAL_SWIPE_THRESHOLD_IN = + "brightline_falsing_distance_horizontal_swipe_threshold_in"; + + /** + * (float) Percentage of swipe with the proximity sensor covered that triggers a higher + * swipe distance requirement. + */ + public static final String BRIGHTLINE_FALSING_PROXIMITY_PERCENT_COVERED_THRESHOLD = + "brightline_falsing_proximity_percent_covered_threshold"; + + /** + * (float) Angle, in radians, that a swipe can vary from horizontal and sill be intentional. + */ + public static final String BRIGHTLINE_FALSING_DIAGONAL_HORIZONTAL_ANGLE_RANGE = + "brightline_falsing_diagonal_horizontal_angle_range"; + + /** + * (float) Angle, in radians, that a swipe can vary from vertical and sill be intentional. + */ + public static final String BRIGHTLINE_FALSING_DIAGONAL_VERTICAL_ANGLE_RANGE = + "brightline_falsing_diagonal_horizontal_angle_range"; + + /** + * (float) Distance, in inches, that a swipe is allowed to vary in the horizontal direction for + * horizontal swipes. + */ + public static final String BRIGHTLINE_FALSING_ZIGZAG_X_PRIMARY_DEVIANCE = + "brightline_falsing_zigzag_x_primary_deviance"; + + /** + * (float) Distance, in inches, that a swipe is allowed to vary in the vertical direction for + * vertical swipes. + */ + public static final String BRIGHTLINE_FALSING_ZIGZAG_Y_PRIMARY_DEVIANCE = + "brightline_falsing_zigzag_y_primary_deviance"; + + /** + * (float) Distance, in inches, that a swipe is allowed to vary in the horizontal direction for + * horizontal swipes. + */ + public static final String BRIGHTLINE_FALSING_ZIGZAG_X_SECONDARY_DEVIANCE = + "brightline_falsing_zigzag_x_secondary_deviance"; + + /** + * (float) Distance, in inches, that a swipe is allowed to vary in the vertical direction for + * vertical swipes. + */ + public static final String BRIGHTLINE_FALSING_ZIGZAG_Y_SECONDARY_DEVIANCE = + "brightline_falsing_zigzag_y_secondary_deviance"; + private SystemUiDeviceConfigFlags() { } } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java index 730907e1fa9c..cc6645415fd8 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java @@ -16,9 +16,13 @@ package com.android.systemui.classifier.brightline; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DIAGONAL_HORIZONTAL_ANGLE_RANGE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DIAGONAL_VERTICAL_ANGLE_RANGE; import static com.android.systemui.classifier.Classifier.LEFT_AFFORDANCE; import static com.android.systemui.classifier.Classifier.RIGHT_AFFORDANCE; +import android.provider.DeviceConfig; + /** * False on swipes that are too close to 45 degrees. * @@ -35,8 +39,20 @@ class DiagonalClassifier extends FalsingClassifier { private static final float ONE_HUNDRED_EIGHTY_DEG = (float) (Math.PI); private static final float THREE_HUNDRED_SIXTY_DEG = (float) (2 * Math.PI); + private final float mHorizontalAngleRange; + private final float mVerticalAngleRange; + DiagonalClassifier(FalsingDataProvider dataProvider) { super(dataProvider); + + mHorizontalAngleRange = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DIAGONAL_HORIZONTAL_ANGLE_RANGE, + HORIZONTAL_ANGLE_RANGE); + mVerticalAngleRange = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DIAGONAL_VERTICAL_ANGLE_RANGE, + VERTICAL_ANGLE_RANGE); } @Override @@ -52,11 +68,11 @@ class DiagonalClassifier extends FalsingClassifier { return false; } - float minAngle = DIAGONAL - HORIZONTAL_ANGLE_RANGE; - float maxAngle = DIAGONAL + HORIZONTAL_ANGLE_RANGE; + float minAngle = DIAGONAL - mHorizontalAngleRange; + float maxAngle = DIAGONAL + mHorizontalAngleRange; if (isVertical()) { - minAngle = DIAGONAL - VERTICAL_ANGLE_RANGE; - maxAngle = DIAGONAL + VERTICAL_ANGLE_RANGE; + minAngle = DIAGONAL - mVerticalAngleRange; + maxAngle = DIAGONAL + mVerticalAngleRange; } return angleBetween(angle, minAngle, maxAngle) diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java index 005ee12c4f61..a6a617dc51de 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java @@ -16,6 +16,14 @@ package com.android.systemui.classifier.brightline; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_FLING_THRESHOLD_IN; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_SWIPE_THRESHOLD_IN; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_SCREEN_FRACTION_MAX_DISTANCE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VELOCITY_TO_DISTANCE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VERTICAL_FLING_THRESHOLD_IN; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VERTICAL_SWIPE_THRESHOLD_IN; + +import android.provider.DeviceConfig; import android.view.MotionEvent; import android.view.VelocityTracker; @@ -31,12 +39,13 @@ class DistanceClassifier extends FalsingClassifier { private static final float HORIZONTAL_SWIPE_THRESHOLD_DISTANCE_IN = 3; private static final float VERTICAL_SWIPE_THRESHOLD_DISTANCE_IN = 3; private static final float VELOCITY_TO_DISTANCE = 80f; - private static final float SCREEN_FRACTION_MIN_DISTANCE = 0.8f; + private static final float SCREEN_FRACTION_MAX_DISTANCE = 0.8f; private final float mVerticalFlingThresholdPx; private final float mHorizontalFlingThresholdPx; private final float mVerticalSwipeThresholdPx; private final float mHorizontalSwipeThresholdPx; + private final float mVelocityToDistanceMultiplier; private boolean mDistanceDirty; private DistanceVectors mCachedDistance; @@ -44,18 +53,48 @@ class DistanceClassifier extends FalsingClassifier { DistanceClassifier(FalsingDataProvider dataProvider) { super(dataProvider); + mVelocityToDistanceMultiplier = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_VELOCITY_TO_DISTANCE, + VELOCITY_TO_DISTANCE); + + float horizontalFlingThresholdIn = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_FLING_THRESHOLD_IN, + HORIZONTAL_FLING_THRESHOLD_DISTANCE_IN); + + float verticalFlingThresholdIn = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_VERTICAL_FLING_THRESHOLD_IN, + VERTICAL_FLING_THRESHOLD_DISTANCE_IN); + + float horizontalSwipeThresholdIn = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_SWIPE_THRESHOLD_IN, + HORIZONTAL_SWIPE_THRESHOLD_DISTANCE_IN); + + float verticalSwipeThresholdIn = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_VERTICAL_SWIPE_THRESHOLD_IN, + VERTICAL_SWIPE_THRESHOLD_DISTANCE_IN); + + float screenFractionMaxDistance = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_DISTANCE_SCREEN_FRACTION_MAX_DISTANCE, + SCREEN_FRACTION_MAX_DISTANCE); + mHorizontalFlingThresholdPx = Math - .min(getWidthPixels() * SCREEN_FRACTION_MIN_DISTANCE, - HORIZONTAL_FLING_THRESHOLD_DISTANCE_IN * getXdpi()); + .min(getWidthPixels() * screenFractionMaxDistance, + horizontalFlingThresholdIn * getXdpi()); mVerticalFlingThresholdPx = Math - .min(getHeightPixels() * SCREEN_FRACTION_MIN_DISTANCE, - VERTICAL_FLING_THRESHOLD_DISTANCE_IN * getYdpi()); + .min(getHeightPixels() * screenFractionMaxDistance, + verticalFlingThresholdIn * getYdpi()); mHorizontalSwipeThresholdPx = Math - .min(getWidthPixels() * SCREEN_FRACTION_MIN_DISTANCE, - HORIZONTAL_SWIPE_THRESHOLD_DISTANCE_IN * getXdpi()); + .min(getWidthPixels() * screenFractionMaxDistance, + horizontalSwipeThresholdIn * getXdpi()); mVerticalSwipeThresholdPx = Math - .min(getHeightPixels() * SCREEN_FRACTION_MIN_DISTANCE, - VERTICAL_SWIPE_THRESHOLD_DISTANCE_IN * getYdpi()); + .min(getHeightPixels() * screenFractionMaxDistance, + verticalSwipeThresholdIn * getYdpi()); mDistanceDirty = true; } @@ -139,18 +178,18 @@ class DistanceClassifier extends FalsingClassifier { } boolean getPassedFlingThreshold() { - float dX = this.mDx + this.mVx * VELOCITY_TO_DISTANCE; - float dY = this.mDy + this.mVy * VELOCITY_TO_DISTANCE; + float dX = this.mDx + this.mVx * mVelocityToDistanceMultiplier; + float dY = this.mDy + this.mVy * mVelocityToDistanceMultiplier; if (isHorizontal()) { logDebug("Horizontal swipe and fling distance: " + this.mDx + ", " - + this.mVx * VELOCITY_TO_DISTANCE); + + this.mVx * mVelocityToDistanceMultiplier); logDebug("Threshold: " + mHorizontalFlingThresholdPx); return Math.abs(dX) >= mHorizontalFlingThresholdPx; } logDebug("Vertical swipe and fling distance: " + this.mDy + ", " - + this.mVy * VELOCITY_TO_DISTANCE); + + this.mVy * mVelocityToDistanceMultiplier); logDebug("Threshold: " + mVerticalFlingThresholdPx); return Math.abs(dY) >= mVerticalFlingThresholdPx; } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java index 94a8ac85b724..2644bf9f26ce 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java @@ -16,10 +16,12 @@ package com.android.systemui.classifier.brightline; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_PROXIMITY_PERCENT_COVERED_THRESHOLD; import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS; import android.hardware.Sensor; import android.hardware.SensorEvent; +import android.provider.DeviceConfig; import android.view.MotionEvent; @@ -31,8 +33,9 @@ import android.view.MotionEvent; */ class ProximityClassifier extends FalsingClassifier { - private static final double PERCENT_COVERED_THRESHOLD = 0.1; + private static final float PERCENT_COVERED_THRESHOLD = 0.1f; private final DistanceClassifier mDistanceClassifier; + private final float mPercentCoveredThreshold; private boolean mNear; private long mGestureStartTimeNs; @@ -44,6 +47,11 @@ class ProximityClassifier extends FalsingClassifier { FalsingDataProvider dataProvider) { super(dataProvider); this.mDistanceClassifier = distanceClassifier; + + mPercentCoveredThreshold = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_PROXIMITY_PERCENT_COVERED_THRESHOLD, + PERCENT_COVERED_THRESHOLD); } @Override @@ -107,7 +115,7 @@ class ProximityClassifier extends FalsingClassifier { logInfo("Percent of gesture in proximity: " + mPercentNear); - if (mPercentNear > PERCENT_COVERED_THRESHOLD) { + if (mPercentNear > mPercentCoveredThreshold) { return !mDistanceClassifier.isLongSwipe(); } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java index a62574f26399..c58b7db451b0 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java @@ -16,7 +16,13 @@ package com.android.systemui.classifier.brightline; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_X_PRIMARY_DEVIANCE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_X_SECONDARY_DEVIANCE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_Y_PRIMARY_DEVIANCE; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_Y_SECONDARY_DEVIANCE; + import android.graphics.Point; +import android.provider.DeviceConfig; import android.view.MotionEvent; import java.util.ArrayList; @@ -37,8 +43,34 @@ class ZigZagClassifier extends FalsingClassifier { private static final float MAX_X_SECONDARY_DEVIANCE = .3f; private static final float MAX_Y_SECONDARY_DEVIANCE = .3f; + private final float mMaxXPrimaryDeviance; + private final float mMaxYPrimaryDeviance; + private final float mMaxXSecondaryDeviance; + private final float mMaxYSecondaryDeviance; + ZigZagClassifier(FalsingDataProvider dataProvider) { super(dataProvider); + + mMaxXPrimaryDeviance = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_ZIGZAG_X_PRIMARY_DEVIANCE, + MAX_X_PRIMARY_DEVIANCE); + + mMaxYPrimaryDeviance = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_ZIGZAG_Y_PRIMARY_DEVIANCE, + MAX_Y_PRIMARY_DEVIANCE); + + mMaxXSecondaryDeviance = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_ZIGZAG_X_SECONDARY_DEVIANCE, + MAX_X_SECONDARY_DEVIANCE); + + mMaxYSecondaryDeviance = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_ZIGZAG_Y_SECONDARY_DEVIANCE, + MAX_Y_SECONDARY_DEVIANCE); + } @Override @@ -98,11 +130,11 @@ class ZigZagClassifier extends FalsingClassifier { float maxXDeviance; float maxYDeviance; if (actualDx > actualDy) { - maxXDeviance = MAX_X_PRIMARY_DEVIANCE * totalDistanceIn * getXdpi(); - maxYDeviance = MAX_Y_SECONDARY_DEVIANCE * totalDistanceIn * getYdpi(); + maxXDeviance = mMaxXPrimaryDeviance * totalDistanceIn * getXdpi(); + maxYDeviance = mMaxYSecondaryDeviance * totalDistanceIn * getYdpi(); } else { - maxXDeviance = MAX_X_SECONDARY_DEVIANCE * totalDistanceIn * getXdpi(); - maxYDeviance = MAX_Y_PRIMARY_DEVIANCE * totalDistanceIn * getYdpi(); + maxXDeviance = mMaxXSecondaryDeviance * totalDistanceIn * getXdpi(); + maxYDeviance = mMaxYPrimaryDeviance * totalDistanceIn * getYdpi(); } logDebug("Straightness Deviance: (" + devianceX + "," + devianceY + ") vs " -- GitLab From a8ccae4339f18d25e119b8714e86c74c31a427de Mon Sep 17 00:00:00 2001 From: Andrii Kulian Date: Wed, 24 Jul 2019 18:35:22 +0000 Subject: [PATCH 417/620] Revert "Add calling package verification for ATM binder calls" This reverts commit fbc35b907a9b635bd149386ef63e89c96965343b. Reason for revert: Some call points pass 'null', which breaks the verification. E.g. b/138224633 Bug: 137395936 Bug: 138224633 Change-Id: I990a2d0347ce23d7100ba71ceec10716281e9200 --- .../server/wm/ActivityStackSupervisor.java | 3 +- .../server/wm/ActivityTaskManagerService.java | 37 +++++-------------- .../com/android/server/wm/AppTaskImpl.java | 9 ++++- 3 files changed, 17 insertions(+), 32 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java index 9ca01d485a0d..19916bc617f4 100644 --- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java @@ -1187,8 +1187,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { final PackageInfo packageInfo; try { packageInfo = mService.mContext.getPackageManager() - .getPackageInfoAsUser(callingPackage, PackageManager.GET_PERMISSIONS, - UserHandle.getUserId(callingUid)); + .getPackageInfo(callingPackage, PackageManager.GET_PERMISSIONS); } catch (PackageManager.NameNotFoundException e) { Slog.i(TAG, "Cannot find package info for " + callingPackage); return ACTIVITY_RESTRICTION_NONE; diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 7186ed169f5d..8a9dfc7569dc 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -1015,7 +1015,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { public final int startActivities(IApplicationThread caller, String callingPackage, Intent[] intents, String[] resolvedTypes, IBinder resultTo, Bundle bOptions, int userId) { - assertPackageMatchesCallingUid(callingPackage); final String reason = "startActivities"; enforceNotIsolatedCaller(reason); userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, reason); @@ -1035,11 +1034,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { true /*validateIncomingUser*/); } - private int startActivityAsUser(IApplicationThread caller, String callingPackage, + int startActivityAsUser(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser) { - assertPackageMatchesCallingUid(callingPackage); enforceNotIsolatedCaller("startActivityAsUser"); userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser, @@ -1212,7 +1210,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { public final WaitResult startActivityAndWait(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) { - assertPackageMatchesCallingUid(callingPackage); final WaitResult res = new WaitResult(); synchronized (mGlobalLock) { enforceNotIsolatedCaller("startActivityAndWait"); @@ -1240,7 +1237,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { public final int startActivityWithConfig(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, Configuration config, Bundle bOptions, int userId) { - assertPackageMatchesCallingUid(callingPackage); synchronized (mGlobalLock) { enforceNotIsolatedCaller("startActivityWithConfig"); userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, @@ -1290,7 +1286,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, IBinder permissionToken, boolean ignoreTargetSecurity, int userId) { - assertPackageMatchesCallingUid(callingPackage); // This is very dangerous -- it allows you to perform a start activity (including // permission grants) as any app that may launch one of your own activities. So we only // allow this in two cases: @@ -1420,7 +1415,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { Intent intent, String resolvedType, IVoiceInteractionSession session, IVoiceInteractor interactor, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) { - assertPackageMatchesCallingUid(callingPackage); mAmInternal.enforceCallingPermission(BIND_VOICE_INTERACTION, "startVoiceActivity()"); if (session == null || interactor == null) { throw new NullPointerException("null session or interactor"); @@ -1444,7 +1438,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public int startAssistantActivity(String callingPackage, int callingPid, int callingUid, Intent intent, String resolvedType, Bundle bOptions, int userId) { - assertPackageMatchesCallingUid(callingPackage); mAmInternal.enforceCallingPermission(BIND_VOICE_INTERACTION, "startAssistantActivity()"); userId = handleIncomingUser(callingPid, callingUid, userId, "startAssistantActivity"); @@ -2370,9 +2363,15 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { void moveTaskToFrontLocked(@Nullable IApplicationThread appThread, @Nullable String callingPackage, int taskId, int flags, SafeActivityOptions options, boolean fromRecents) { + final int callingPid = Binder.getCallingPid(); final int callingUid = Binder.getCallingUid(); - assertPackageMatchesCallingUid(callingPackage); + if (!isSameApp(callingUid, callingPackage)) { + String msg = "Permission Denial: moveTaskToFrontLocked() from pid=" + + Binder.getCallingPid() + " as package " + callingPackage; + Slog.w(TAG, msg); + throw new SecurityException(msg); + } if (!checkAppSwitchAllowedLocked(callingPid, callingUid, -1, -1, "Task to front")) { SafeActivityOptions.abort(options); return; @@ -2424,7 +2423,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { /** * Return true if callingUid is system, or packageName belongs to that callingUid. */ - private boolean isSameApp(int callingUid, @Nullable String packageName) { + boolean isSameApp(int callingUid, @Nullable String packageName) { try { if (callingUid != 0 && callingUid != SYSTEM_UID) { if (packageName == null) { @@ -2441,21 +2440,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { return true; } - /** - * Checks that the provided package name matches the current calling UID, throws a security - * exception if it doesn't. - */ - void assertPackageMatchesCallingUid(@Nullable String packageName) { - final int callingUid = Binder.getCallingUid(); - if (isSameApp(callingUid, packageName)) { - return; - } - final String msg = "Permission Denial: package=" + packageName - + " does not belong to uid=" + callingUid; - Slog.w(TAG, msg); - throw new SecurityException(msg); - } - boolean checkAppSwitchAllowedLocked(int sourcePid, int sourceUid, int callingPid, int callingUid, String name) { if (mAppSwitchesAllowedTime < SystemClock.uptimeMillis()) { @@ -2989,7 +2973,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public List getAppTasks(String callingPackage) { int callingUid = Binder.getCallingUid(); - assertPackageMatchesCallingUid(callingPackage); long ident = Binder.clearCallingIdentity(); try { synchronized (mGlobalLock) { @@ -6210,7 +6193,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { SafeActivityOptions options, int userId, boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart) { - assertPackageMatchesCallingUid(callingPackage); synchronized (mGlobalLock) { return getActivityStartController().startActivitiesInPackage(uid, realCallingPid, realCallingUid, callingPackage, intents, resolvedTypes, resultTo, options, @@ -6226,7 +6208,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { int userId, TaskRecord inTask, String reason, boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart) { - assertPackageMatchesCallingUid(callingPackage); synchronized (mGlobalLock) { return getActivityStartController().startActivityInPackage(uid, realCallingPid, realCallingUid, callingPackage, intent, resolvedType, resultTo, resultWho, diff --git a/services/core/java/com/android/server/wm/AppTaskImpl.java b/services/core/java/com/android/server/wm/AppTaskImpl.java index a8f7768efc87..1eb7455135c7 100644 --- a/services/core/java/com/android/server/wm/AppTaskImpl.java +++ b/services/core/java/com/android/server/wm/AppTaskImpl.java @@ -27,6 +27,7 @@ import android.os.Binder; import android.os.Bundle; import android.os.IBinder; import android.os.UserHandle; +import android.util.Slog; /** * An implementation of IAppTask, that allows an app to manage its own tasks via @@ -96,7 +97,12 @@ class AppTaskImpl extends IAppTask.Stub { // Will bring task to front if it already has a root activity. final int callingPid = Binder.getCallingPid(); final int callingUid = Binder.getCallingUid(); - mService.assertPackageMatchesCallingUid(callingPackage); + if (!mService.isSameApp(callingUid, callingPackage)) { + String msg = "Permission Denial: moveToFront() from pid=" + + Binder.getCallingPid() + " as package " + callingPackage; + Slog.w(TAG, msg); + throw new SecurityException(msg); + } final long origId = Binder.clearCallingIdentity(); try { synchronized (mService.mGlobalLock) { @@ -128,7 +134,6 @@ class AppTaskImpl extends IAppTask.Stub { public int startActivity(IBinder whoThread, String callingPackage, Intent intent, String resolvedType, Bundle bOptions) { checkCaller(); - mService.assertPackageMatchesCallingUid(callingPackage); int callingUser = UserHandle.getCallingUserId(); TaskRecord tr; -- GitLab From 62f79d6b586ed3ae2627fa74b5eb5382a7d15c82 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 24 Jul 2019 11:19:25 -0700 Subject: [PATCH 418/620] Preventing system crash when pin slice fails ContentProvider calls can throw any generic exception it that was thrown on the remote process. Ignore all such exceptions Bug: 134802710 Test: atest PinnedSliceStateTest Change-Id: I6f037905117adccbf5a65ee4ce4031f02aaa7780 --- .../server/slice/PinnedSliceState.java | 4 ++-- .../server/slice/PinnedSliceStateTest.java | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/slice/PinnedSliceState.java b/services/core/java/com/android/server/slice/PinnedSliceState.java index e139ab86775d..4970862070bb 100644 --- a/services/core/java/com/android/server/slice/PinnedSliceState.java +++ b/services/core/java/com/android/server/slice/PinnedSliceState.java @@ -188,7 +188,7 @@ public class PinnedSliceState { b.putParcelable(SliceProvider.EXTRA_BIND_URI, mUri); try { client.call(SliceProvider.METHOD_PIN, null, b); - } catch (RemoteException e) { + } catch (Exception e) { Log.w(TAG, "Unable to contact " + mUri, e); } } @@ -201,7 +201,7 @@ public class PinnedSliceState { b.putParcelable(SliceProvider.EXTRA_BIND_URI, mUri); try { client.call(SliceProvider.METHOD_UNPIN, null, b); - } catch (RemoteException e) { + } catch (Exception e) { Log.w(TAG, "Unable to contact " + mUri, e); } } diff --git a/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java index f5002ace6690..3b336eb7aec9 100644 --- a/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java +++ b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java @@ -7,10 +7,12 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -159,4 +161,25 @@ public class PinnedSliceStateTest extends UiServiceTestCase { verify(mSliceService).removePinnedSlice(eq(TEST_URI)); assertFalse(mPinnedSliceManager.hasPinOrListener()); } + + @Test + public void testPinFailed() throws Exception { + // Throw exception when trying to pin + doAnswer(invocation -> { + throw new Exception("Pin failed"); + }).when(mIContentProvider).call( + anyString(), anyString(), anyString(), eq(null), any()); + + TestableLooper.get(this).processAllMessages(); + + // When pinned for the first time, a pinned message should be sent. + mPinnedSliceManager.pin("pkg", FIRST_SPECS, mToken); + TestableLooper.get(this).processAllMessages(); + + verify(mIContentProvider).call(anyString(), anyString(), eq(SliceProvider.METHOD_PIN), + eq(null), argThat(b -> { + assertEquals(TEST_URI, b.getParcelable(SliceProvider.EXTRA_BIND_URI)); + return true; + })); + } } -- GitLab From 8f6d27826a3625b3fa24786f0eeb9696f0d89d18 Mon Sep 17 00:00:00 2001 From: Peiyong Lin Date: Wed, 17 Jul 2019 16:05:10 -0700 Subject: [PATCH 419/620] Add proper color management into ColorFade. ColorFade will take a screenshot into Surface and then use it to do animation when the device is powering on and off. However, when EGLSurface is created, it doesn't have proper color management attributes if the Surface is in Display P3. For now wide color implies Display P3, and thus we hard code Display P3 here. For longer solution, we should lift this limit and make sure we manage color properly. BUG: b/136785946, b/131928312 Test: reproduced steps in bug no longer reproducible Change-Id: I063244d8b850187e62c8c10c7712bf615fdcaf87 --- .../com/android/server/display/ColorFade.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/services/core/java/com/android/server/display/ColorFade.java b/services/core/java/com/android/server/display/ColorFade.java index 36d9c0e4478e..f61306405daa 100644 --- a/services/core/java/com/android/server/display/ColorFade.java +++ b/services/core/java/com/android/server/display/ColorFade.java @@ -29,6 +29,7 @@ import android.opengl.GLES11Ext; import android.opengl.GLES20; import android.os.IBinder; import android.util.Slog; +import android.view.Display; import android.view.DisplayInfo; import android.view.Surface; import android.view.Surface.OutOfResourcesException; @@ -72,6 +73,9 @@ final class ColorFade { // See code for details. private static final int DEJANK_FRAMES = 3; + private static final int EGL_GL_COLORSPACE_KHR = 0x309D; + private static final int EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT = 0x3490; + private final int mDisplayId; // Set to true when the animation context has been fully prepared. @@ -93,6 +97,7 @@ final class ColorFade { private EGLSurface mEglSurface; private boolean mSurfaceVisible; private float mSurfaceAlpha; + private boolean mIsWideColor; // Texture names. We only use one texture, which contains the screenshot. private final int[] mTexNames = new int[1]; @@ -482,6 +487,8 @@ final class ColorFade { return false; } + mIsWideColor = SurfaceControl.getActiveColorMode(token) + == Display.COLOR_MODE_DISPLAY_P3; SurfaceControl.screenshot(token, s); st.updateTexImage(); st.getTransformMatrix(mTexMatrix); @@ -608,8 +615,16 @@ final class ColorFade { private boolean createEglSurface() { if (mEglSurface == null) { int[] eglSurfaceAttribList = new int[] { + EGL14.EGL_NONE, + EGL14.EGL_NONE, EGL14.EGL_NONE }; + + // If the current display is in wide color, then so is the screenshot. + if (mIsWideColor) { + eglSurfaceAttribList[0] = EGL_GL_COLORSPACE_KHR; + eglSurfaceAttribList[1] = EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT; + } // turn our SurfaceControl into a Surface mEglSurface = EGL14.eglCreateWindowSurface(mEglDisplay, mEglConfig, mSurface, eglSurfaceAttribList, 0); -- GitLab From 8987e830e248fd10a53098026a4b4bd97fa605da Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Tue, 23 Jul 2019 10:01:06 -0700 Subject: [PATCH 420/620] Only update overlays for target When a target package would update, the OMS would update the stat of overlays that target android as if the android overlays targeted the target package. This would cause the overlay state to change to STATE_MISSING_TARGET for android overlays. This change will only update state for overlays that target the updated package. Bug: 137038000 Bug: 136549878 Test: manual debugging Change-Id: I0430426d8e8588a0fb97096a1f2570a7930069b3 Merged-In: I0d545253179b3545307b88b3151d11fd9e6cbd5b --- .../server/om/OverlayManagerServiceImpl.java | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java index 6f28675d051b..934511bf88d1 100644 --- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java +++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java @@ -296,22 +296,12 @@ final class OverlayManagerServiceImpl { */ private void updateAndRefreshOverlaysForTarget(@NonNull final String targetPackageName, final int userId, final int flags) { - final List ois = new ArrayList<>(); - - // Framework overlays added first because order matters when resolving a resource - if (!"android".equals(targetPackageName)) { - ois.addAll(mSettings.getOverlaysForTarget("android", userId)); - } - - // Then add the targeted, non-framework overlays which have higher priority - ois.addAll(mSettings.getOverlaysForTarget(targetPackageName, userId)); - - final List enabledBaseCodePaths = new ArrayList<>(ois.size()); + final List targetOverlays = mSettings.getOverlaysForTarget(targetPackageName, + userId); + // Update the state for any overlay that targets this package. boolean modified = false; - final int n = ois.size(); - for (int i = 0; i < n; i++) { - final OverlayInfo oi = ois.get(i); + for (final OverlayInfo oi : targetOverlays) { final PackageInfo overlayPackage = mPackageManager.getPackageInfo(oi.packageName, userId); if (overlayPackage == null) { @@ -324,25 +314,39 @@ final class OverlayManagerServiceImpl { Slog.e(TAG, "failed to update settings", e); modified |= mSettings.remove(oi.packageName, userId); } - - if (oi.isEnabled() && overlayPackage.applicationInfo != null) { - enabledBaseCodePaths.add(overlayPackage.applicationInfo.getBaseCodePath()); - } } } if (!modified) { + // Update the overlay paths of the target within package manager if necessary. + final List enabledOverlayPaths = new ArrayList<>(targetOverlays.size()); + + // Framework overlays are first in the overlay paths of a package within PackageManager. + for (final OverlayInfo oi : mSettings.getOverlaysForTarget("android", userId)) { + if (oi.isEnabled()) { + enabledOverlayPaths.add(oi.baseCodePath); + } + } + + for (final OverlayInfo oi : targetOverlays) { + if (oi.isEnabled()) { + enabledOverlayPaths.add(oi.baseCodePath); + } + } + + // TODO(): Use getEnabledOverlayPaths(userId, targetPackageName) instead of + // resourceDirs if in the future resourceDirs contains APKs other than overlays PackageInfo packageInfo = mPackageManager.getPackageInfo(targetPackageName, userId); ApplicationInfo appInfo = packageInfo == null ? null : packageInfo.applicationInfo; String[] resourceDirs = appInfo == null ? null : appInfo.resourceDirs; // If the lists aren't the same length, the enabled overlays have changed - if (ArrayUtils.size(resourceDirs) != enabledBaseCodePaths.size()) { + if (ArrayUtils.size(resourceDirs) != enabledOverlayPaths.size()) { modified = true; } else if (resourceDirs != null) { // If any element isn't equal, an overlay or the order of overlays has changed for (int index = 0; index < resourceDirs.length; index++) { - if (!resourceDirs[index].equals(enabledBaseCodePaths.get(index))) { + if (!resourceDirs[index].equals(enabledOverlayPaths.get(index))) { modified = true; break; } -- GitLab From 55c4a592192fe3e943ac6bbdbce8f5d87f56b8f3 Mon Sep 17 00:00:00 2001 From: Ruslan Tkhakokhov Date: Wed, 24 Jul 2019 21:13:35 +0100 Subject: [PATCH 421/620] Several preferences lost during P->Q B&R SettingsBackupAgentduring restore doesn't account for the fact that some settings that were store in Global on source have been moved from to Secure. Fix it. Bug: 137948683 Test: 1. Do cloud B&R P->Q and ensure settings are restored 2. atest SettingsBackupTest Change-Id: Iefe451a7b3dd0ea1d4cb95a56a71cc3341b65d7c --- .../settings/SettingsBackupAgent.java | 43 +++++++++++++------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java index 9d398b5b69a1..d884fab518ce 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java @@ -56,6 +56,7 @@ import java.time.DateTimeException; import java.util.Arrays; import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.zip.CRC32; /** @@ -241,6 +242,8 @@ public class SettingsBackupAgent extends BackupAgentHelper { HashSet movedToGlobal = new HashSet(); Settings.System.getMovedToGlobalSettings(movedToGlobal); Settings.Secure.getMovedToGlobalSettings(movedToGlobal); + Set movedToSecure = getMovedToSecureSettings(); + byte[] restoredWifiSupplicantData = null; byte[] restoredWifiIpConfigData = null; @@ -259,16 +262,17 @@ public class SettingsBackupAgent extends BackupAgentHelper { switch (key) { case KEY_SYSTEM : - restoreSettings(data, Settings.System.CONTENT_URI, movedToGlobal); + restoreSettings(data, Settings.System.CONTENT_URI, movedToGlobal, + movedToSecure); mSettingsHelper.applyAudioSettings(); break; case KEY_SECURE : - restoreSettings(data, Settings.Secure.CONTENT_URI, movedToGlobal); + restoreSettings(data, Settings.Secure.CONTENT_URI, movedToGlobal, null); break; case KEY_GLOBAL : - restoreSettings(data, Settings.Global.CONTENT_URI, null); + restoreSettings(data, Settings.Global.CONTENT_URI, null, movedToSecure); break; case KEY_WIFI_SUPPLICANT : @@ -347,20 +351,22 @@ public class SettingsBackupAgent extends BackupAgentHelper { HashSet movedToGlobal = new HashSet(); Settings.System.getMovedToGlobalSettings(movedToGlobal); Settings.Secure.getMovedToGlobalSettings(movedToGlobal); + Set movedToSecure = getMovedToSecureSettings(); // system settings data first int nBytes = in.readInt(); if (DEBUG_BACKUP) Log.d(TAG, nBytes + " bytes of settings data"); byte[] buffer = new byte[nBytes]; in.readFully(buffer, 0, nBytes); - restoreSettings(buffer, nBytes, Settings.System.CONTENT_URI, movedToGlobal); + restoreSettings(buffer, nBytes, Settings.System.CONTENT_URI, movedToGlobal, + movedToSecure); // secure settings nBytes = in.readInt(); if (DEBUG_BACKUP) Log.d(TAG, nBytes + " bytes of secure settings data"); if (nBytes > buffer.length) buffer = new byte[nBytes]; in.readFully(buffer, 0, nBytes); - restoreSettings(buffer, nBytes, Settings.Secure.CONTENT_URI, movedToGlobal); + restoreSettings(buffer, nBytes, Settings.Secure.CONTENT_URI, movedToGlobal, null); // Global only if sufficiently new if (version >= FULL_BACKUP_ADDED_GLOBAL) { @@ -369,7 +375,8 @@ public class SettingsBackupAgent extends BackupAgentHelper { if (nBytes > buffer.length) buffer = new byte[nBytes]; in.readFully(buffer, 0, nBytes); movedToGlobal.clear(); // no redirection; this *is* the global namespace - restoreSettings(buffer, nBytes, Settings.Global.CONTENT_URI, movedToGlobal); + restoreSettings(buffer, nBytes, Settings.Global.CONTENT_URI, movedToGlobal, + movedToSecure); } // locale @@ -440,6 +447,13 @@ public class SettingsBackupAgent extends BackupAgentHelper { } } + private Set getMovedToSecureSettings() { + Set movedToSecureSettings = new HashSet<>(); + Settings.Global.getMovedToSecureSettings(movedToSecureSettings); + Settings.System.getMovedToSecureSettings(movedToSecureSettings); + return movedToSecureSettings; + } + private long[] readOldChecksums(ParcelFileDescriptor oldState) throws IOException { long[] stateChecksums = new long[STATE_SIZE]; @@ -564,7 +578,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { } private void restoreSettings(BackupDataInput data, Uri contentUri, - HashSet movedToGlobal) { + HashSet movedToGlobal, Set movedToSecure) { byte[] settings = new byte[data.getDataSize()]; try { data.readEntityData(settings, 0, settings.length); @@ -572,11 +586,11 @@ public class SettingsBackupAgent extends BackupAgentHelper { Log.e(TAG, "Couldn't read entity data"); return; } - restoreSettings(settings, settings.length, contentUri, movedToGlobal); + restoreSettings(settings, settings.length, contentUri, movedToGlobal, movedToSecure); } private void restoreSettings(byte[] settings, int bytes, Uri contentUri, - HashSet movedToGlobal) { + HashSet movedToGlobal, Set movedToSecure) { if (DEBUG) { Log.i(TAG, "restoreSettings: " + contentUri); } @@ -651,9 +665,14 @@ public class SettingsBackupAgent extends BackupAgentHelper { continue; } - final Uri destination = (movedToGlobal != null && movedToGlobal.contains(key)) - ? Settings.Global.CONTENT_URI - : contentUri; + final Uri destination; + if (movedToGlobal != null && movedToGlobal.contains(key)) { + destination = Settings.Global.CONTENT_URI; + } else if (movedToSecure != null && movedToSecure.contains(key)) { + destination = Settings.Secure.CONTENT_URI; + } else { + destination = contentUri; + } settingsHelper.restoreValue(this, cr, contentValues, destination, key, value, mRestoredFromSdkInt); -- GitLab From 91e425d793495ab4ea496ecdb80a6e7d33e28a8e Mon Sep 17 00:00:00 2001 From: Ned Burns Date: Fri, 19 Jul 2019 14:26:15 -0400 Subject: [PATCH 422/620] Fix issue with media notifs being misbucketed Previous code assumed that "isHighPriority" == "is in top section", which is not always true. Media notifs and some other notifs can appear in the top section even if they're not high priority. Because we detect section boundaries by iterating through the list until we find the first notif where isHighPriority == false, we were sometimes drawing the section boundary way too high. This change creates a new propery, isInTopSection() that accurately tracks this state. Setting this value in the proper location would require some seriously destabilizing refactors, so instead we set it in the list comparator, which is awful but here are. Test: manual Bug: 138320173 Change-Id: I19223720bac534ab92219a2962169097819e8efb Merged-In: I19223720bac534ab92219a2962169097819e8efb (cherry picked from commit 8c1b763dcf5df6e7fc7177dad5e7390adb229fa4) --- .../NotificationLockscreenUserManager.java | 3 +-- .../NotificationLockscreenUserManagerImpl.java | 7 +++---- .../NotificationViewHierarchyManager.java | 6 ++---- .../collection/NotificationData.java | 18 +++++++++++++----- .../collection/NotificationEntry.java | 14 ++++++++++++++ .../stack/NotificationSectionsManager.java | 4 ++-- .../stack/NotificationStackScrollLayout.java | 6 +++--- .../statusbar/phone/NotificationPanelView.java | 3 +-- .../NotificationLockscreenUserManagerTest.java | 6 +++--- .../stack/NotificationSectionsManagerTest.java | 2 ++ 10 files changed, 44 insertions(+), 25 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java index 0fe5f8a6af5a..4cc5b2144adc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java @@ -15,7 +15,6 @@ package com.android.systemui.statusbar; import android.content.pm.UserInfo; -import android.service.notification.StatusBarNotification; import android.util.SparseArray; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -58,7 +57,7 @@ public interface NotificationLockscreenUserManager { boolean shouldHideNotifications(int userId); boolean shouldHideNotifications(String key); - boolean shouldShowOnKeyguard(StatusBarNotification sbn); + boolean shouldShowOnKeyguard(NotificationEntry entry); boolean isAnyProfilePublicMode(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java index 4ea1ed5b9451..e08a5ae07bd8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java @@ -33,7 +33,6 @@ import android.os.ServiceManager; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; -import android.service.notification.StatusBarNotification; import android.util.Log; import android.util.SparseArray; import android.util.SparseBooleanArray; @@ -302,7 +301,7 @@ public class NotificationLockscreenUserManagerImpl implements Notification.VISIBILITY_SECRET; } - public boolean shouldShowOnKeyguard(StatusBarNotification sbn) { + public boolean shouldShowOnKeyguard(NotificationEntry entry) { if (getEntryManager() == null) { Log.wtf(TAG, "mEntryManager was null!", new Throwable()); return false; @@ -310,10 +309,10 @@ public class NotificationLockscreenUserManagerImpl implements boolean exceedsPriorityThreshold; if (NotificationUtils.useNewInterruptionModel(mContext) && hideSilentNotificationsOnLockscreen()) { - exceedsPriorityThreshold = getEntryManager().getNotificationData().isHighPriority(sbn); + exceedsPriorityThreshold = entry.isTopBucket(); } else { exceedsPriorityThreshold = - !getEntryManager().getNotificationData().isAmbient(sbn.getKey()); + !getEntryManager().getNotificationData().isAmbient(entry.key); } return mShowLockscreenNotifications && exceedsPriorityThreshold; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java index 404920187351..9c3ee96fe25b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java @@ -394,15 +394,13 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle int userId = entry.notification.getUserId(); boolean suppressedSummary = mGroupManager.isSummaryOfSuppressedGroup( entry.notification) && !entry.isRowRemoved(); - boolean showOnKeyguard = mLockscreenUserManager.shouldShowOnKeyguard(entry - .notification); + boolean showOnKeyguard = mLockscreenUserManager.shouldShowOnKeyguard(entry); if (!showOnKeyguard) { // min priority notifications should show if their summary is showing if (mGroupManager.isChildInGroupWithSummary(entry.notification)) { NotificationEntry summary = mGroupManager.getLogicalGroupSummary( entry.notification); - if (summary != null && mLockscreenUserManager.shouldShowOnKeyguard( - summary.notification)) { + if (summary != null && mLockscreenUserManager.shouldShowOnKeyguard(summary)) { showOnKeyguard = true; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java index 64b2f048ce2e..13f8f1a6a548 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java @@ -25,7 +25,6 @@ import android.service.notification.NotificationListenerService.RankingMap; import android.service.notification.SnoozeCriterion; import android.service.notification.StatusBarNotification; import android.util.ArrayMap; -import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.Dependency; @@ -108,10 +107,19 @@ public class NotificationData { boolean bSystemMax = bImportance >= NotificationManager.IMPORTANCE_HIGH && isSystemNotification(nb); - boolean isHeadsUp = a.getRow().isHeadsUp(); - if (isHeadsUp != b.getRow().isHeadsUp()) { - return isHeadsUp ? -1 : 1; - } else if (isHeadsUp) { + + boolean aHeadsUp = a.getRow().isHeadsUp(); + boolean bHeadsUp = b.getRow().isHeadsUp(); + + // HACK: This should really go elsewhere, but it's currently not straightforward to + // extract the comparison code and we're guaranteed to touch every element, so this is + // the best place to set the buckets for the moment. + a.setIsTopBucket(aHeadsUp || aMedia || aSystemMax || a.isHighPriority()); + b.setIsTopBucket(bHeadsUp || bMedia || bSystemMax || b.isHighPriority()); + + if (aHeadsUp != bHeadsUp) { + return aHeadsUp ? -1 : 1; + } else if (aHeadsUp) { // Provide consistent ranking with headsUpManager return mHeadsUpManager.compare(a, b); } else if (a.getRow().showingAmbientPulsing() != b.getRow().showingAmbientPulsing()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index 92c261c4cad7..d157f06c03e9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -173,6 +173,8 @@ public final class NotificationEntry { */ private boolean mHighPriority; + private boolean mIsTopBucket; + public NotificationEntry(StatusBarNotification n) { this(n, null); } @@ -220,6 +222,18 @@ public final class NotificationEntry { this.mHighPriority = highPriority; } + /** + * @return True if the notif should appear in the "top" or "important" section of notifications + * (as opposed to the "bottom" or "silent" section). This is usually the same as + * {@link #isHighPriority()}, but there are certain exceptions, such as media notifs. + */ + public boolean isTopBucket() { + return mIsTopBucket; + } + public void setIsTopBucket(boolean isTopBucket) { + mIsTopBucket = isTopBucket; + } + public boolean isBubble() { return (notification.getNotification().flags & FLAG_BUBBLE) != 0; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java index 170a4d570688..d119fb79e4c6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java @@ -133,7 +133,7 @@ class NotificationSectionsManager implements StackScrollAlgorithm.SectionProvide if (child instanceof ExpandableNotificationRow && child.getVisibility() != View.GONE) { ExpandableNotificationRow row = (ExpandableNotificationRow) child; - if (!row.getEntry().isHighPriority()) { + if (!row.getEntry().isTopBucket()) { firstGentleNotifIndex = i; mFirstGentleNotif = row; break; @@ -248,7 +248,7 @@ class NotificationSectionsManager implements StackScrollAlgorithm.SectionProvide View child = mParent.getChildAt(i); if (child.getVisibility() != View.GONE && child instanceof ExpandableNotificationRow) { ExpandableNotificationRow row = (ExpandableNotificationRow) child; - if (!row.getEntry().isHighPriority()) { + if (!row.getEntry().isTopBucket()) { break; } else { lastChildBeforeGap = row; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 80e1ac10e319..09352cfd17a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -5776,7 +5776,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd currentIndex++; boolean beforeSpeedBump; if (mHighPriorityBeforeSpeedBump) { - beforeSpeedBump = row.getEntry().isHighPriority(); + beforeSpeedBump = row.getEntry().isTopBucket(); } else { beforeSpeedBump = !row.getEntry().ambient; } @@ -5834,9 +5834,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd case ROWS_ALL: return true; case ROWS_HIGH_PRIORITY: - return row.getEntry().isHighPriority(); + return row.getEntry().isTopBucket(); case ROWS_GENTLE: - return !row.getEntry().isHighPriority(); + return !row.getEntry().isTopBucket(); default: throw new IllegalArgumentException("Unknown selection: " + selection); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index a423adfd34b7..bc205d676914 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -734,8 +734,7 @@ public class NotificationPanelView extends PanelView implements if (suppressedSummary) { continue; } - if (!mLockscreenUserManager.shouldShowOnKeyguard( - row.getStatusBarNotification())) { + if (!mLockscreenUserManager.shouldShowOnKeyguard(row.getEntry())) { continue; } if (row.isRemoved()) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java index 49a263a8d781..57dd8c94c790 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java @@ -38,7 +38,6 @@ import android.os.Handler; import android.os.Looper; import android.os.UserManager; import android.provider.Settings; -import android.service.notification.StatusBarNotification; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -48,6 +47,7 @@ import com.android.systemui.Dependency; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.collection.NotificationData; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.policy.DeviceProvisionedController; @@ -166,7 +166,7 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS, 1); when(mNotificationData.isHighPriority(any())).thenReturn(false); - assertTrue(mLockscreenUserManager.shouldShowOnKeyguard(mock(StatusBarNotification.class))); + assertTrue(mLockscreenUserManager.shouldShowOnKeyguard(mock(NotificationEntry.class))); } @Test @@ -179,7 +179,7 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { Settings.Secure.LOCK_SCREEN_SHOW_SILENT_NOTIFICATIONS, 0); when(mNotificationData.isHighPriority(any())).thenReturn(false); - assertFalse(mLockscreenUserManager.shouldShowOnKeyguard(mock(StatusBarNotification.class))); + assertFalse(mLockscreenUserManager.shouldShowOnKeyguard(mock(NotificationEntry.class))); } private class TestNotificationLockscreenUserManager diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java index 73abda9a5da7..59d0f912d38e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java @@ -263,6 +263,8 @@ public class NotificationSectionsManagerTest extends SysuiTestCase { when(notifRow.getVisibility()).thenReturn(View.VISIBLE); when(notifRow.getEntry().isHighPriority()) .thenReturn(children[i] == ChildType.HIPRI); + when(notifRow.getEntry().isTopBucket()) + .thenReturn(children[i] == ChildType.HIPRI); when(notifRow.getParent()).thenReturn(mNssl); child = notifRow; break; -- GitLab From 843f9dee8b3fa4ce5ba8981c74cf666c4db712cb Mon Sep 17 00:00:00 2001 From: Vadim Caen Date: Wed, 24 Jul 2019 16:24:33 +0200 Subject: [PATCH 423/620] DO NOT MERGE Do not call drawableChanged pre Q Some apps rely on not updating the window format when changing the background of the DecorView. To keep the compatibilty with these app we add only call DecoreView.drawableChanged() when the window background is changed on app targetting Q and above. Test: Manually test by lunching Instagram TV and pressing return twice. The window should aninate with no flickering. Bug: 136987724 Change-Id: I3593d30dc6f10519008151974e475f0dad86fc64 --- core/java/android/view/View.java | 15 +++++++++++++++ .../com/android/internal/policy/DecorView.java | 5 +++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index bf6191ec61eb..1275e46ed421 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -967,6 +967,19 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ static boolean sBrokenInsetsDispatch; + /** + * Prior to Q, calling + * {@link com.android.internal.policy.DecorView#setBackgroundDrawable(Drawable)} + * did not call update the window format so the opacity of the background was not correctly + * applied to the window. Some applications rely on this misbehavior to work properly. + *

+ * From Q, {@link com.android.internal.policy.DecorView#setBackgroundDrawable(Drawable)} is + * the same as {@link com.android.internal.policy.DecorView#setWindowBackground(Drawable)} + * which updates the window format. + * @hide + */ + protected static boolean sBrokenWindowBackground; + /** @hide */ @IntDef({NOT_FOCUSABLE, FOCUSABLE, FOCUSABLE_AUTO}) @Retention(RetentionPolicy.SOURCE) @@ -5104,6 +5117,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, sBrokenInsetsDispatch = ViewRootImpl.sNewInsetsMode != NEW_INSETS_MODE_FULL || targetSdkVersion < Build.VERSION_CODES.Q; + sBrokenWindowBackground = targetSdkVersion < Build.VERSION_CODES.Q; + sCompatibilityDone = true; } } diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index fe66cf9aab7d..7c52a40d4494 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -983,13 +983,14 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind @Override public void setBackgroundDrawable(Drawable background) { - // TODO: This should route through setWindowBackground, but late in the release to make this // change. if (mOriginalBackgroundDrawable != background) { mOriginalBackgroundDrawable = background; updateBackgroundDrawable(); - drawableChanged(); + if (!View.sBrokenWindowBackground) { + drawableChanged(); + } } } -- GitLab From 0ae8f2e36a6c86d54585fd57d55e184b0d99de1c Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Wed, 24 Jul 2019 18:06:44 -0400 Subject: [PATCH 424/620] Prevent the BrightLineFalsingManager from duping its session. The BrightLineFalsingManager should not be able to start a session when it's already in a session. Primarily, this caused the FalsingManager to hang onto extra registrations to the Proximity Sensor, per the bug. Bug: 138220274 Test: atest SystemUITests and manual. Change-Id: Id10d2697a96524e98c87aaa87702209d1752fe68 --- .../brightline/BrightLineFalsingManager.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java index 3d869bcc2e4b..6280c9f7c00f 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java @@ -98,10 +98,12 @@ public class BrightLineFalsingManager implements FalsingManager { } private void sessionStart() { - logDebug("Starting Session"); - mSessionStarted = true; - registerSensors(); - mClassifiers.forEach(FalsingClassifier::onSessionStarted); + if (!mSessionStarted) { + logDebug("Starting Session"); + mSessionStarted = true; + registerSensors(); + mClassifiers.forEach(FalsingClassifier::onSessionStarted); + } } private void sessionEnd() { -- GitLab From a7eacf93fd6bac39cc6693bdc7e31c9a09cb8a7b Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Wed, 24 Jul 2019 12:40:34 -0700 Subject: [PATCH 425/620] Make sure scrims will fade from black Scrims might be light if the wallpaper is light, but when turning on the screen, we should always fade from black, otherwise the display will bright up before dimming down. Test: pulse with light wallpaper and AOD on/off Test: press power with AOD on/off Test: atest ScrimControllerTest Fixes: 138097741 Change-Id: Icc1ce276c839bce248ab9362a5d8cf4905201e0e --- .../com/android/systemui/statusbar/phone/ScrimController.java | 4 +++- .../src/com/android/systemui/statusbar/phone/ScrimState.java | 3 +++ .../android/systemui/statusbar/phone/ScrimControllerTest.java | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 1aec5e4d0b1d..b12bf5c39970 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -491,8 +491,10 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo * away once the display turns on. */ public void prepareForGentleWakeUp() { - if (mState == ScrimState.AOD && mDozeParameters.getAlwaysOn()) { + if (mState == ScrimState.AOD) { mCurrentInFrontAlpha = 1f; + mCurrentInFrontTint = Color.BLACK; + mCurrentBehindTint = Color.BLACK; mAnimateChange = false; updateScrims(); mAnimateChange = true; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java index 763e0d70469b..c706062d3bb3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java @@ -129,7 +129,10 @@ public enum ScrimState { public void prepare(ScrimState previousState) { mCurrentInFrontAlpha = 0f; mCurrentBehindTint = Color.BLACK; + mCurrentInFrontTint = Color.BLACK; mBlankScreen = mDisplayRequiresBlanking; + mAnimationDuration = mWakeLockScreenSensorActive + ? ScrimController.ANIMATION_DURATION_LONG : ScrimController.ANIMATION_DURATION; } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index d8e90a584058..0dbf30881ffe 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -225,11 +225,12 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.transitionTo(ScrimState.PULSING); mScrimController.finishAnimationsImmediately(); - // Front scrim should be transparent + // Front scrim should be transparent, but tinted // Back scrim should be semi-transparent so the user can see the wallpaper // Pulse callback should have been invoked assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE); assertScrimTint(mScrimBehind, true /* tinted */); + assertScrimTint(mScrimInFront, true /* tinted */); mScrimController.setWakeLockScreenSensorActive(true); mScrimController.finishAnimationsImmediately(); -- GitLab From 64f0a348bab11bdf73e58c3f3b0427500304dca4 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Mon, 22 Jul 2019 17:32:38 -0700 Subject: [PATCH 426/620] Fixed that autoheads up were not visible or accidentally visible at times We were auto heads upping in the past even when the notification would be hidden from the lockscreen which created some weird UI Bug: 137873156 Test: add media notification with silent notifications hidden on lockscreen Change-Id: Ic8f7d5b89f29b99571bbb905bced5b7880ded68d --- .../notification/BypassHeadsUpNotifier.kt | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/BypassHeadsUpNotifier.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/BypassHeadsUpNotifier.kt index ea474ced7632..10bca52c422c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/BypassHeadsUpNotifier.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/BypassHeadsUpNotifier.kt @@ -21,6 +21,7 @@ import android.media.MediaMetadata import android.provider.Settings import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.statusbar.NotificationMediaManager import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.notification.collection.NotificationEntry @@ -40,6 +41,7 @@ class BypassHeadsUpNotifier @Inject constructor( private val bypassController: KeyguardBypassController, private val statusBarStateController: StatusBarStateController, private val headsUpManager: HeadsUpManagerPhone, + private val notificationLockscreenUserManager: NotificationLockscreenUserManager, private val mediaManager: NotificationMediaManager, tunerService: TunerService) : StatusBarStateController.StateListener, NotificationMediaManager.MediaListener { @@ -79,9 +81,6 @@ class BypassHeadsUpNotifier @Inject constructor( if (!NotificationMediaManager.isPlayingState(state)) { newEntry = null } - if (newEntry?.isSensitive == true) { - newEntry = null - } currentMediaEntry = newEntry updateAutoHeadsUp(previous) updateAutoHeadsUp(currentMediaEntry) @@ -89,7 +88,7 @@ class BypassHeadsUpNotifier @Inject constructor( private fun updateAutoHeadsUp(entry: NotificationEntry?) { entry?.let { - val autoHeadsUp = it == currentMediaEntry && canAutoHeadsUp() + val autoHeadsUp = it == currentMediaEntry && canAutoHeadsUp(it) it.isAutoHeadsUp = autoHeadsUp if (autoHeadsUp) { headsUpManager.showNotification(it) @@ -97,11 +96,36 @@ class BypassHeadsUpNotifier @Inject constructor( } } + /** + * @return {@code true} if this entry be autoHeadsUpped right now. + */ + private fun canAutoHeadsUp(entry: NotificationEntry): Boolean { + if (!isAutoHeadsUpAllowed()) { + return false; + } + if (entry.isSensitive) { + // filter sensitive notifications + return false + } + if (!notificationLockscreenUserManager.shouldShowOnKeyguard(entry)) { + // filter notifications invisible on Keyguard + return false + } + if (!entryManager.notificationData.activeNotifications.contains(entry)) { + // filter notifications not the active list currently + return false + } + return true + } + override fun onStatePostChange() { updateAutoHeadsUp(currentMediaEntry) } - private fun canAutoHeadsUp() : Boolean { + /** + * @return {@code true} if autoHeadsUp is possible right now. + */ + private fun isAutoHeadsUpAllowed() : Boolean { if (!enabled) { return false } -- GitLab From 9b8e5e3875f1cb1081814f2ac94ac4ce0c02b24d Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Wed, 24 Jul 2019 16:36:14 -0700 Subject: [PATCH 427/620] Cancel show runnable when bouncer is hidden Otherwise the bouncer might report "showing soon" and future show() calls will be aborted. Test: swipe up and down, wait for face, swipe up Test: tap on notification on bouncer Test: swipe up, unlock from bouncer Test: unlock on lock screen, swipe up to dismiss bouncer Fixes: 132846921 Change-Id: I22a1af2ef903b266ae8d8fcb9eb55f6cc11aeae2 --- .../systemui/statusbar/phone/KeyguardBouncer.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index 40085a48a58c..c4d346ccaefb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -207,14 +207,12 @@ public class KeyguardBouncer { * @see #onFullyShown() */ private void onFullyHidden() { - if (!mShowingSoon) { - cancelShowRunnable(); - if (mRoot != null) { - mRoot.setVisibility(View.INVISIBLE); - } - mFalsingManager.onBouncerHidden(); - DejankUtils.postAfterTraversal(mResetRunnable); + cancelShowRunnable(); + if (mRoot != null) { + mRoot.setVisibility(View.INVISIBLE); } + mFalsingManager.onBouncerHidden(); + DejankUtils.postAfterTraversal(mResetRunnable); } private final Runnable mShowRunnable = new Runnable() { -- GitLab From f24ae8da0e45ef77e2405adced21978a98f8ed87 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Tue, 23 Jul 2019 16:51:02 -0700 Subject: [PATCH 428/620] Log acquired vendorCode Bug: 137688980 Test: adb shell cmd stats print-logs adb logcat | grep -i statsd Change-Id: Icdbc4a4ba004b5f4b7407de6e8ee256bee8ef97a --- .../java/com/android/server/biometrics/LoggableMonitor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/biometrics/LoggableMonitor.java b/services/core/java/com/android/server/biometrics/LoggableMonitor.java index 6c7cbc166241..ecf3864e3362 100644 --- a/services/core/java/com/android/server/biometrics/LoggableMonitor.java +++ b/services/core/java/com/android/server/biometrics/LoggableMonitor.java @@ -93,7 +93,7 @@ public abstract class LoggableMonitor { statsAction(), statsClient(), acquiredInfo, - 0 /* vendorCode */, // Don't log vendorCode for now + vendorCode, Utils.isDebugEnabled(context, targetUserId)); } -- GitLab From a4772064dfb6c463eebb831563a7dd8182010cc2 Mon Sep 17 00:00:00 2001 From: joshmccloskey Date: Wed, 24 Jul 2019 17:13:16 -0700 Subject: [PATCH 429/620] Fixed race condition with different profiles Test: Verified that setting/getting features in one profile does not change the other. Fixes: 138127704 Change-Id: Id8627fc84f0d2f4ec642cfb3e9a4d9884209a91f --- .../biometrics/BiometricServiceBase.java | 8 +++-- .../server/biometrics/face/FaceService.java | 32 ++++++++++++------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java index 20eb6180832c..bbb7cdea80b0 100644 --- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java +++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java @@ -912,8 +912,12 @@ public abstract class BiometricServiceBase extends SystemService } protected void setActiveUserInternal(int userId) { - // Do not put on handler, since it should finish before returning to caller. - updateActiveGroup(userId, null /* clientPackage */); + mHandler.post(() -> { + if (DEBUG) { + Slog.d(getTag(), "setActiveUser(" + userId + ")"); + } + updateActiveGroup(userId, null /* clientPackage */); + }); } protected void removeInternal(RemovalClient client) { diff --git a/services/core/java/com/android/server/biometrics/face/FaceService.java b/services/core/java/com/android/server/biometrics/face/FaceService.java index a38abdc1bed0..ff9762101a93 100644 --- a/services/core/java/com/android/server/biometrics/face/FaceService.java +++ b/services/core/java/com/android/server/biometrics/face/FaceService.java @@ -609,27 +609,32 @@ public class FaceService extends BiometricServiceBase { public void resetLockout(byte[] token) { checkPermission(MANAGE_BIOMETRIC); - if (!FaceService.this.hasEnrolledBiometrics(mCurrentUserId)) { - Slog.w(TAG, "Ignoring lockout reset, no templates enrolled"); - return; - } + mHandler.post(() -> { + if (!FaceService.this.hasEnrolledBiometrics(mCurrentUserId)) { + Slog.w(TAG, "Ignoring lockout reset, no templates enrolled"); + return; + } - Slog.d(TAG, "Resetting lockout for user: " + mCurrentUserId); + Slog.d(TAG, "Resetting lockout for user: " + mCurrentUserId); - try { - mDaemonWrapper.resetLockout(token); - } catch (RemoteException e) { - Slog.e(getTag(), "Unable to reset lockout", e); - } + try { + mDaemonWrapper.resetLockout(token); + } catch (RemoteException e) { + Slog.e(getTag(), "Unable to reset lockout", e); + } + }); } @Override public void setFeature(int userId, int feature, boolean enabled, final byte[] token, IFaceServiceReceiver receiver, final String opPackageName) { checkPermission(MANAGE_BIOMETRIC); - updateActiveGroup(userId, opPackageName); mHandler.post(() -> { + if (DEBUG) { + Slog.d(TAG, "setFeature for user(" + userId + ")"); + } + updateActiveGroup(userId, opPackageName); if (!FaceService.this.hasEnrolledBiometrics(mCurrentUserId)) { Slog.e(TAG, "No enrolled biometrics while setting feature: " + feature); return; @@ -660,9 +665,12 @@ public class FaceService extends BiometricServiceBase { public void getFeature(int userId, int feature, IFaceServiceReceiver receiver, final String opPackageName) { checkPermission(MANAGE_BIOMETRIC); - updateActiveGroup(userId, opPackageName); mHandler.post(() -> { + if (DEBUG) { + Slog.d(TAG, "getFeature for user(" + userId + ")"); + } + updateActiveGroup(userId, opPackageName); // This should ideally return tri-state, but the user isn't shown settings unless // they are enrolled so it's fine for now. if (!FaceService.this.hasEnrolledBiometrics(mCurrentUserId)) { -- GitLab From 906bde542322caf70785191af5a9880c476c6859 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Wed, 24 Jul 2019 18:45:42 -0700 Subject: [PATCH 430/620] Ensure BiometricDialogView dismiss animation is run postOnAnimation requests the animation be started on the next frame. The behavior is undefined if an animation is already running. Currently if this happens, the second animation is never initiated. Fixes: 138199986 Test: Modify BiometricPromptDemo to cancel authentication immediately after requesting authentication. BiometricDialogView isn't stuck anymore Change-Id: Ia62dccc2d484d1eaca5587bffa4d3def89730533 --- .../biometrics/BiometricDialogView.java | 17 +++++++++++++++++ .../systemui/biometrics/FaceDialogView.java | 1 + 2 files changed, 18 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java index a5857df8ba5a..ce67577ea483 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java @@ -111,6 +111,9 @@ public abstract class BiometricDialogView extends LinearLayout { protected boolean mRequireConfirmation; private int mUserId; // used to determine if we should show work background + private boolean mCompletedAnimatingIn; + private boolean mPendingDismissDialog; + protected abstract int getHintStringResourceId(); protected abstract int getAuthenticatedAccessibilityResourceId(); protected abstract int getIconDescriptionResourceId(); @@ -332,6 +335,7 @@ public abstract class BiometricDialogView extends LinearLayout { mDialog.setAlpha(1.0f); mDialog.setTranslationY(0); mLayout.setAlpha(1.0f); + mCompletedAnimatingIn = true; } else { // Dim the background and slide the dialog up mDialog.setTranslationY(mAnimationTranslationOffset); @@ -352,6 +356,12 @@ public abstract class BiometricDialogView extends LinearLayout { } public void startDismiss() { + if (!mCompletedAnimatingIn) { + Log.w(TAG, "startDismiss(): waiting for onDialogAnimatedIn"); + mPendingDismissDialog = true; + return; + } + mAnimatingAway = true; // This is where final cleanup should occur. @@ -499,6 +509,13 @@ public abstract class BiometricDialogView extends LinearLayout { } public void onDialogAnimatedIn() { + mCompletedAnimatingIn = true; + + if (mPendingDismissDialog) { + Log.d(TAG, "onDialogAnimatedIn(): mPendingDismissDialog=true, dismissing now"); + startDismiss(); + mPendingDismissDialog = false; + } } public void restoreState(Bundle bundle) { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java index 729242e3144f..ae6cb5ce23d3 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java @@ -460,6 +460,7 @@ public class FaceDialogView extends BiometricDialogView { @Override public void onDialogAnimatedIn() { + super.onDialogAnimatedIn(); mDialogAnimatedIn = true; mIconController.startPulsing(); } -- GitLab From 7a9b4b32130f9d79bfab18bc23c77375db8fe69c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 24 Jul 2019 21:29:51 -0700 Subject: [PATCH 431/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: Ia021fdbbb52c29df590f827e07f439f9241fa7be --- core/res/res/values-hi/strings.xml | 8 ++++---- core/res/res/values-or/strings.xml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index acd206f34668..5169c1de0ea4 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -468,7 +468,7 @@ "ऐप्स को टैबलेट का समय क्षेत्र बदलने देता है." "डिवाइस पर खाते ढूंढें" "एप्लिकेशन को टैबलेट से ज्ञात खातों की सूची पाने देता है. इसमें वे खाते शामिल हो सकते हैं जिन्‍हें इंस्‍टॉल किए गए एप्लिकेशन ने बनाया है." - "ऐप को टीवी द्वारा ज्ञात खातों की सूची प्राप्‍त करने देती है. इसमें इंस्‍टॉल किए गए ऐप्‍लिकेशन के द्वारा बनाए गए खाते शामिल हो सकते हैं." + "ऐप्लिकेशन को टीवी से ज्ञात खातों की सूची पाने देती है. इसमें इंस्‍टॉल किए गए ऐप्‍लिकेशन से बनाए गए खाते शामिल हो सकते हैं." "एप्लिकेशन को फ़ोन से ज्ञात खातों की सूची पाने देता है. इसमें वे खाते शामिल हो सकते हैं जिन्‍हें इंस्‍टॉल किए गए एप्लिकेशन ने बनाया है." "नेटवर्क कनेक्‍शन देखें" "ऐप को नेटवर्क कनेक्‍शन के बारे में जानकारी देखने देता है, जैसे कौन से नेटवर्क मौजूद हैं और कनेक्‍ट हैं." @@ -484,7 +484,7 @@ "ऐप्स को वाई-फ़ाई पहुंच बिंदुओं से कनेक्ट और डिसकनेक्ट करने और वाई-फ़ाई नेटवर्क के लिए डिवाइस कॉन्फ़िगरेशन में परिवर्तन करने देता है." "वाई-फ़ाई मल्‍टीकास्‍ट पाने को अनुमति दें" "एप्लिकेशन को वाई-फ़ाई नेटवर्क पर मल्टीकास्ट पते के इस्तेमाल से सिर्फ़ आपके टैबलेट पर ही नहीं, बल्कि सभी डिवाइस पर भेजे गए पैकेट पाने देता है. यह गैर-मल्टीकास्ट मोड से ज़्यादा पावर का इस्तेमाल करता है." - "ऐप को मल्‍टीकास्‍ट पतों का उपयोग करके ना केवल आपके टीवी को, बल्‍कि वाई-फ़ाई पर मौजूद सभी डिवाइसों को पैकेट भेजने और प्राप्‍त करने देती है. इसमें गैर-मल्‍टीकास्‍ट मोड की अपेक्षा ज़्यादा पावर का उपयोग होता है." + "ऐप्लिकेशन को मल्‍टीकास्‍ट पतों का उपयोग करके न सिर्फ़ आपके टीवी को, बल्‍कि वाई-फ़ाई पर मौजूद सभी डिवाइसों को पैकेट भेजने और पाने देती है. इसमें गैर-मल्‍टीकास्‍ट मोड की अपेक्षा ज़्यादा पावर का उपयोग होता है." "एप्लिकेशन को वाई-फ़ाई नेटवर्क पर मल्टीकास्ट पते के इस्तेमाल से सिर्फ़ आपके फ़ोन पर ही नहीं, बल्कि सभी डिवाइस पर भेजे गए पैकेट पाने देता है. यह गैर-मल्टीकास्ट मोड से ज़्यादा पावर का इस्तेमाल करता है." "ब्लूटूथ सेटिंग पर पहुंचें" "किसी ऐप्स को स्‍थानीय ब्लूटूथ टैबलेट कॉन्‍फ़िगर करने की और रिमोट डिवाइस के साथ खोजने और युग्‍मित करने देता है." @@ -503,7 +503,7 @@ "नियर फ़ील्‍ड कम्‍यूनिकेशन नियंत्रित करें" "ऐप्स को नियर फ़ील्ड कम्यूनिकेशन (NFC) टैग, कार्ड, और रीडर के साथ संचार करने देता है." "अपना स्‍क्रीन लॉक अक्षम करें" - "ऐप्स को कीलॉक और कोई भी संबद्ध पासवर्ड सुरक्षा अक्षम करने देता है. उदाहरण के लिए, इनकमिंग फ़ोन कॉल प्राप्त करते समय फ़ोन, कीलॉक को अक्षम कर देता है, फिर कॉल खत्म होने पर कीलॉक को फिर से सक्षम कर देता है." + "ऐप्स को कीलॉक और कोई भी संबद्ध पासवर्ड सुरक्षा बंद करने देता है. उदाहरण के लिए, इनकमिंग फ़ोन कॉल पाते समय फ़ोन, कीलॉक को बंद कर देता है, फिर कॉल खत्म होने पर कीलॉक को फिर से चालू कर देता है." "जानें कि स्क्रीन लॉक कितना मुश्किल बनाया गया है" "यह मंज़ूरी मिलने के बाद ऐप्लिकेशन जान पाता है कि स्क्रीन लॉक कितना मुश्किल (बहुत ज़्यादा, मध्यम, कम या बिल्कुल नहीं) है. इस स्तर से यह पता चलता है कि स्क्रीन लॉक कितना लंबा या किस तरह का है. ऐप्लिकेशन उपयोगकर्ताओं को यह सुझाव भी दे सकता है कि वे स्क्रीन लॉक को एक तय लेवल तक अपडेट करें. लेकिन उपयोगकर्ता इसे बेझिझक अनदेखा करके छोड़ सकते हैं. ध्यान दें कि स्क्रीन लॉक को सादे टेक्स्ट में सेव नहीं किया जाता है इसलिए ऐप्लिकेशन को सटीक पासवर्ड पता नहीं होता है." "बायोमीट्रिक हार्डवेयर इस्तेमाल करने दें" @@ -614,7 +614,7 @@ "इन-कॉल स्क्रीन से सहभागिता करें" "ऐप को यह नियंत्रित करने देती है कि उपयोगकर्ता को इन-कॉल स्क्रीन कब और कैसी दिखाई देती है." "टेलीफ़ोनी सेवाओं के साथ सहभागिता करें" - "कॉल करने/प्राप्‍त करने के लिए ऐप्स को टेलीफ़ोनी सेवा के साथ सहभागिता करने दें." + "कॉल करने/पाने के लिए ऐप्स को टेलीफ़ोनी सेवा के साथ सहभागिता करने दें." "इन कॉल उपयोगकर्ता अनुभव लें" "ऐप को इन कॉल उपयोगकर्ता अनुभव लेने देती है." "ऐतिहासिक नेटवर्क उपयोग पढें" diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 176d01c0273a..053b1cd8577d 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -1658,7 +1658,7 @@ "ଆପଣଙ୍କ ଅନଲକ୍‍ ପାଟର୍ନକୁ ଆପଣ %1$d ଥର ଭୁଲ ଭାବେ ଅଙ୍କନ କରିଛନ୍ତି। ଆଉ %2$dଟି ଭୁଲ ପ୍ରୟାସ ପରେ ଏକ ଇମେଲ୍‍ ଆକାଉଣ୍ଟ ବ୍ୟବହାର କରି ନିଜ ଫୋନ୍‌କୁ ଅନଲକ୍‌ କରିବା ପାଇଁ କୁହାଯିବ।\n\n%3$d ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।" " — " "ବାହାର କରନ୍ତୁ" - "ମାତ୍ରା ବଢ଼ାଇ ସୁପାରିସ ସ୍ତର ବଢ଼ାଉଛନ୍ତି? \n\n ଲମ୍ବା ସମୟ ପର୍ଯ୍ୟନ୍ତ ଉଚ୍ଚ ଶବ୍ଦରେ ଶୁଣିଲେ ଆପଣଙ୍କ ଶ୍ରବଣ ଶକ୍ତି ଖରାପ ହୋଇପାରେ।" + "ମାତ୍ରା ବଢ଼ାଇ ସୁପାରିଶ ସ୍ତର ବଢ଼ାଉଛନ୍ତି? \n\n ଲମ୍ବା ସମୟ ପର୍ଯ୍ୟନ୍ତ ଉଚ୍ଚ ଶବ୍ଦରେ ଶୁଣିଲେ ଆପଣଙ୍କ ଶ୍ରବଣ ଶକ୍ତି ଖରାପ ହୋଇପାରେ।" "ଆକ୍ସେସବିଲିଟି ଶର୍ଟକଟ୍‍ ବ୍ୟବହାର କରିବେ?" "ସର୍ଟକଟ୍‌ ଅନ୍‌ ଥିବା ବେଳେ, ଉଭୟ ଭଲ୍ୟୁମ୍‍ ବଟନ୍‍ 3 ସେକେଣ୍ଡ ପାଇଁ ଦବାଇବା ଦ୍ୱାରା ଆକ୍ସେସବିଲିଟି ବୈଶିଷ୍ଟ ଆରମ୍ଭ ହେବ।\n\n ସମ୍ପ୍ରତି ଆକ୍ସେସବିଲିଟି ବୈଶିଷ୍ଟ୍ୟ:\n %1$s\n\n ସେଟିଙ୍ଗ ଓ ଆକ୍ସେସବିଲିଟିରେ ଆପଣ ବୈଶିଷ୍ଟ୍ୟ ବଦଳାଇ ପାରିବେ।" "ଶର୍ଟକଟ୍‍ ବନ୍ଦ କରନ୍ତୁ" -- GitLab From df301b88872d00794cb3e7320ce664bf610fed96 Mon Sep 17 00:00:00 2001 From: Andrei Onea Date: Wed, 17 Jul 2019 19:03:10 +0100 Subject: [PATCH 432/620] Make PlatformCompat a Binder class This allows PlatformCompat to be called from anywhere in the platform. In follow-up CLs, we'll define permissions for each method and/or filtering rules to prevent abuse from apps. Test: m Bug: 137769727 Change-Id: I19e5fbfefcf59e0b53b197ea8e9e3cb78439b4c4 Merged-In: I19e5fbfefcf59e0b53b197ea8e9e3cb78439b4c4 --- services/core/Android.bp | 9 +++ .../server/compat/IPlatformCompat.aidl | 57 +++++++++++++++++++ .../android/server/compat/PlatformCompat.java | 52 ++++++++--------- .../java/com/android/server/SystemServer.java | 6 ++ 4 files changed, 95 insertions(+), 29 deletions(-) create mode 100644 services/core/java/com/android/server/compat/IPlatformCompat.aidl diff --git a/services/core/Android.bp b/services/core/Android.bp index 9855e4ea339a..9518196c40df 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -13,6 +13,7 @@ java_library_static { }, srcs: [ "java/**/*.java", + ":platformcompat_aidl", ":dumpstate_aidl", ":idmap2_aidl", ":installd_aidl", @@ -80,3 +81,11 @@ prebuilt_etc { name: "gps_debug.conf", src: "java/com/android/server/location/gps_debug.conf", } + +filegroup { + name: "platformcompat_aidl", + srcs: [ + "java/com/android/server/compat/IPlatformCompat.aidl", + ], + path: "java", +} \ No newline at end of file diff --git a/services/core/java/com/android/server/compat/IPlatformCompat.aidl b/services/core/java/com/android/server/compat/IPlatformCompat.aidl new file mode 100644 index 000000000000..8ab08f9047cb --- /dev/null +++ b/services/core/java/com/android/server/compat/IPlatformCompat.aidl @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.compat; + +import android.content.pm.ApplicationInfo; + +/** + * System private API for talking with the PlatformCompat service. + * {@hide} + */ +interface IPlatformCompat +{ + + /** + * Reports that a compatibility change is affecting an app process now. + * + *

Note: for changes that are gated using {@link #isChangeEnabled(long, ApplicationInfo)}, + * you do not need to call this API directly. The change will be reported for you in the case + * that {@link #isChangeEnabled(long, ApplicationInfo)} returns {@code true}. + * + * @param changeId The ID of the compatibility change taking effect. + * @param appInfo Representing the affected app. + */ + void reportChange(long changeId, in ApplicationInfo appInfo); + + /** + * Query if a given compatibility change is enabled for an app process. This method should + * be called when implementing functionality on behalf of the affected app. + * + *

If this method returns {@code true}, the calling code should implement the compatibility + * change, resulting in differing behaviour compared to earlier releases. If this method returns + * {@code false}, the calling code should behave as it did in earlier releases. + * + *

When this method returns {@code true}, it will also report the change as + * {@link #reportChange(long, ApplicationInfo)} would, so there is no need to call that method + * directly. + * + * @param changeId The ID of the compatibility change in question. + * @param appInfo Representing the app in question. + * @return {@code true} if the change is enabled for the current app. + */ + boolean isChangeEnabled(long changeId, in ApplicationInfo appInfo); +} \ No newline at end of file diff --git a/services/core/java/com/android/server/compat/PlatformCompat.java b/services/core/java/com/android/server/compat/PlatformCompat.java index 456d15e4fba8..09e818dacae1 100644 --- a/services/core/java/com/android/server/compat/PlatformCompat.java +++ b/services/core/java/com/android/server/compat/PlatformCompat.java @@ -16,52 +16,46 @@ package com.android.server.compat; +import android.content.Context; import android.content.pm.ApplicationInfo; import android.util.Slog; +import com.android.internal.util.DumpUtils; + +import java.io.FileDescriptor; +import java.io.PrintWriter; + /** * System server internal API for gating and reporting compatibility changes. */ -public class PlatformCompat { +public class PlatformCompat extends IPlatformCompat.Stub { private static final String TAG = "Compatibility"; - /** - * Reports that a compatibility change is affecting an app process now. - * - *

Note: for changes that are gated using {@link #isChangeEnabled(long, ApplicationInfo)}, - * you do not need to call this API directly. The change will be reported for you in the case - * that {@link #isChangeEnabled(long, ApplicationInfo)} returns {@code true}. - * - * @param changeId The ID of the compatibility change taking effect. - * @param appInfo Representing the affected app. - */ - public static void reportChange(long changeId, ApplicationInfo appInfo) { + private final Context mContext; + + public PlatformCompat(Context context) { + mContext = context; + } + + @Override + public void reportChange(long changeId, ApplicationInfo appInfo) { Slog.d(TAG, "Compat change reported: " + changeId + "; UID " + appInfo.uid); // TODO log via StatsLog } - /** - * Query if a given compatibility change is enabled for an app process. This method should - * be called when implementing functionality on behalf of the affected app. - * - *

If this method returns {@code true}, the calling code should implement the compatibility - * change, resulting in differing behaviour compared to earlier releases. If this method returns - * {@code false}, the calling code should behave as it did in earlier releases. - * - *

When this method returns {@code true}, it will also report the change as - * {@link #reportChange(long, ApplicationInfo)} would, so there is no need to call that method - * directly. - * - * @param changeId The ID of the compatibility change in question. - * @param appInfo Representing the app in question. - * @return {@code true} if the change is enabled for the current app. - */ - public static boolean isChangeEnabled(long changeId, ApplicationInfo appInfo) { + @Override + public boolean isChangeEnabled(long changeId, ApplicationInfo appInfo) { if (CompatConfig.get().isChangeEnabled(changeId, appInfo)) { reportChange(changeId, appInfo); return true; } return false; } + + @Override + protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, "platform_compat", pw)) return; + // TODO: Dump info about compatibility changes. + } } diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index d99f3e4ef53e..1919f505f40a 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -87,6 +87,7 @@ import com.android.server.biometrics.iris.IrisService; import com.android.server.broadcastradio.BroadcastRadioService; import com.android.server.camera.CameraServiceProxy; import com.android.server.clipboard.ClipboardService; +import com.android.server.compat.PlatformCompat; import com.android.server.connectivity.IpConnectivityMetrics; import com.android.server.contentcapture.ContentCaptureManagerInternal; import com.android.server.coverage.CoverageService; @@ -1089,6 +1090,11 @@ public final class SystemServer { traceBeginAndSlog("SignedConfigService"); SignedConfigService.registerUpdateReceiver(mSystemContext); traceEnd(); + + traceBeginAndSlog("PlatformCompat"); + ServiceManager.addService("platform_compat", new PlatformCompat(context)); + traceEnd(); + } catch (RuntimeException e) { Slog.e("System", "******************************************"); Slog.e("System", "************ Failure starting core service", e); -- GitLab From ccb9130c45ae2ba9a4018332f566b5669ab4036f Mon Sep 17 00:00:00 2001 From: Andrei Onea Date: Wed, 10 Jul 2019 16:43:09 +0100 Subject: [PATCH 433/620] Dump PlatformCompat overrides to dumpsys Dump info related to compat flags. Test: adb shell am compat enable 42 foo.bar; \ dumpsys platform_compat Bug: 137183175 Change-Id: Ic429731a3364dab5902caeb12f48fecf2e49bb65 Merged-In: Ic429731a3364dab5902caeb12f48fecf2e49bb65 --- .../android/server/compat/CompatConfig.java | 19 +++++++++++++++++++ .../android/server/compat/PlatformCompat.java | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/compat/CompatConfig.java b/services/core/java/com/android/server/compat/CompatConfig.java index bcf1d80781a6..c59b0652af15 100644 --- a/services/core/java/com/android/server/compat/CompatConfig.java +++ b/services/core/java/com/android/server/compat/CompatConfig.java @@ -24,6 +24,7 @@ import android.util.LongSparseArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; +import java.io.PrintWriter; /** * This class maintains state relating to platform compatibility changes. * @@ -169,4 +170,22 @@ public final class CompatConfig { return overrideExists; } + /** + * Dumps the current list of compatibility config information. + * + * @param pw The {@link PrintWriter} instance to which the information will be dumped. + */ + public void dumpConfig(PrintWriter pw) { + synchronized (mChanges) { + if (mChanges.size() == 0) { + pw.println("No compat overrides."); + return; + } + for (int i = 0; i < mChanges.size(); ++i) { + CompatChange c = mChanges.valueAt(i); + pw.println(c.toString()); + } + } + } + } diff --git a/services/core/java/com/android/server/compat/PlatformCompat.java b/services/core/java/com/android/server/compat/PlatformCompat.java index 09e818dacae1..3eea194fd73e 100644 --- a/services/core/java/com/android/server/compat/PlatformCompat.java +++ b/services/core/java/com/android/server/compat/PlatformCompat.java @@ -56,6 +56,6 @@ public class PlatformCompat extends IPlatformCompat.Stub { @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, "platform_compat", pw)) return; - // TODO: Dump info about compatibility changes. + CompatConfig.get().dumpConfig(pw); } } -- GitLab From 47efc132a9daccc6aeab32603a021367b90b2f76 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 25 Jul 2019 04:10:58 -0700 Subject: [PATCH 434/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: Ib0deb156a13690977edcdb4f23a1c3f6d9ebff46 --- packages/PrintSpooler/res/values-or/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/PrintSpooler/res/values-or/strings.xml b/packages/PrintSpooler/res/values-or/strings.xml index 7eeac8771032..f385391c8d78 100644 --- a/packages/PrintSpooler/res/values-or/strings.xml +++ b/packages/PrintSpooler/res/values-or/strings.xml @@ -72,7 +72,7 @@ "ପ୍ରିଣ୍ଟର ଯୋଡ଼ିବାକୁ ଚୟନ କରନ୍ତୁ" "ସକ୍ଷମ କରିବା ପାଇଁ ଚୟନ କରନ୍ତୁ" "ସକ୍ଷମ କରାଯାଇଥିବା ସର୍ଭିସ୍‌" - "ସୁପାରିସ କରାଯାଇଥିବା ସର୍ଭିସ୍‌" + "ସୁପାରିଶ କରାଯାଇଥିବା ସର୍ଭିସ୍‌" "ଅକ୍ଷମ କରାଯାଇଥିବା ସର୍ଭିସ୍‌" "ସମସ୍ତ ସର୍ଭିସ୍‌" -- GitLab From e9ebf622d7d7d5b5439c65226e887f44d70b3113 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Wed, 10 Jul 2019 12:41:55 -0400 Subject: [PATCH 435/620] Remove icon name from NR dump While occasionally useful, the call to create the Resources object can take long enough that threads waiting on the notificationlist lock (that we hold while dump()-ing) will ANR and crash system_process. Test: none Fixes: 134505821 Change-Id: I8c6246cb1debc2c3d548c300e76d9279e29e2d4f (cherry picked from commit c4ced6544d6e0160507e9477140a5903c72c2bf7) --- .../notification/NotificationRecord.java | 32 +------------------ 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java index c2e559a8a96b..3c2169a446a1 100644 --- a/services/core/java/com/android/server/notification/NotificationRecord.java +++ b/services/core/java/com/android/server/notification/NotificationRecord.java @@ -34,11 +34,8 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManagerInternal; -import android.content.res.Resources; import android.graphics.Bitmap; -import android.graphics.drawable.Icon; import android.media.AudioAttributes; import android.media.AudioSystem; import android.metrics.LogMaker; @@ -453,16 +450,11 @@ public final class NotificationRecord { void dump(PrintWriter pw, String prefix, Context baseContext, boolean redact) { final Notification notification = sbn.getNotification(); - final Icon icon = notification.getSmallIcon(); - String iconStr = String.valueOf(icon); - if (icon != null && icon.getType() == Icon.TYPE_RESOURCE) { - iconStr += " / " + idDebugString(baseContext, icon.getResPackage(), icon.getResId()); - } pw.println(prefix + this); prefix = prefix + " "; pw.println(prefix + "uid=" + sbn.getUid() + " userId=" + sbn.getUserId()); pw.println(prefix + "opPkg=" + sbn.getOpPkg()); - pw.println(prefix + "icon=" + iconStr); + pw.println(prefix + "icon=" + notification.getSmallIcon()); pw.println(prefix + "flags=0x" + Integer.toHexString(notification.flags)); pw.println(prefix + "pri=" + notification.priority); pw.println(prefix + "key=" + sbn.getKey()); @@ -592,28 +584,6 @@ public final class NotificationRecord { pw.println(prefix + "mAdjustments=" + mAdjustments); } - - static String idDebugString(Context baseContext, String packageName, int id) { - Context c; - - if (packageName != null) { - try { - c = baseContext.createPackageContext(packageName, 0); - } catch (NameNotFoundException e) { - c = baseContext; - } - } else { - c = baseContext; - } - - Resources r = c.getResources(); - try { - return r.getResourceName(id); - } catch (Resources.NotFoundException e) { - return ""; - } - } - @Override public final String toString() { return String.format( -- GitLab From 94787d0b86494b5ea89e70aee1b474324c47147d Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 25 Jul 2019 06:46:53 -0700 Subject: [PATCH 436/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I53ca896aa7b7ad0b37d97f803a18ecdc851586c0 --- packages/SystemUI/res/values-hi/strings.xml | 8 ++++---- packages/SystemUI/res/values-mr/strings.xml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 17ee04e10304..3fa2a48188c9 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -46,8 +46,8 @@ "ब्लूटूथ टीदर किया गया" "इनपुट का तरीका सेट करें" "सामान्य कीबोर्ड" - "%1$s को %2$s के एक्सेस की अनुमति दें?" - "%1$s को %2$s के एक्सेस की अनुमति दें?" + "%1$s को %2$s के ऐक्सेस की अनुमति दें?" + "%1$s को %2$s के ऐक्सेस की अनुमति दें?" "%2$s के लिए %1$s खोलें?" "%2$s के लिए %1$s खोलें?" "इस USB सहायक डिवाइस के साथ कोई भी इंस्टॉल ऐप्स काम नहीं करता. इस सहायक डिवाइस के बारे में यहां ज़्यादा जानें: %1$s" @@ -452,8 +452,8 @@ "बैटरी सेवर चालू है" "निष्‍पादन और पृष्ठभूमि डेटा को कम करता है" "बैटरी सेवर बंद करें" - "रिकॉर्ड या कास्ट करते समय, %s आपकी स्क्रीन पर दिखाई जा रही या आपके डिवाइस पर चलाई जा रही संवेदनशील जानकारी एक्सेस कर सकता है. इस जानकारी में ऑडियो, पासवर्ड, भुगतान की जानकारी, फ़ोटो और मैसेज शामिल हैं." - "रिकॉर्ड या कास्ट करते समय, यह सेवा देने वाला ऐप्लिकेशन आपकी स्क्रीन पर दिखाई जा रही या आपके डिवाइस पर चलाई जा रही संवेदनशील जानकारी एक्सेस कर सकता है. इस जानकारी में ऑडियो, पासवर्ड, भुगतान की जानकारी, फ़ोटो और मैसेज शामिल हैं." + "रिकॉर्ड या कास्ट करते समय, %s आपकी स्क्रीन पर दिखाई जा रही या आपके डिवाइस पर चलाई जा रही संवेदनशील जानकारी ऐक्सेस कर सकता है. इस जानकारी में ऑडियो, पासवर्ड, भुगतान की जानकारी, फ़ोटो और मैसेज शामिल हैं." + "रिकॉर्ड या कास्ट करते समय, यह सेवा देने वाला ऐप्लिकेशन आपकी स्क्रीन पर दिखाई जा रही या आपके डिवाइस पर चलाई जा रही संवेदनशील जानकारी ऐक्सेस कर सकता है. इस जानकारी में ऑडियो, पासवर्ड, भुगतान की जानकारी, फ़ोटो और मैसेज शामिल हैं." "कास्ट करने/रिकॉर्ड करने के दौरान संवेदनशील जानकारी का सबके सामने आ जाना" "फिर से न दिखाएं" "सभी को हटाएं" diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 20f638d04077..676208bb02f7 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -747,7 +747,7 @@ "डेटा सेव्हर" "डेटा सेव्हर चालू आहे" "डेटा सेव्हर बंद आहे" - "चालू" + "सुरू" "बंद" "नॅव्हिगेशन बार" "लेआउट" -- GitLab From 56428f3e459d76c5dce04beee6f9eda430bcad1a Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 25 Jul 2019 06:55:57 -0700 Subject: [PATCH 437/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I2a3f5b0be93d5c821f91b4b0986ba8e42f1e9da2 --- packages/VpnDialogs/res/values-hi/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/VpnDialogs/res/values-hi/strings.xml b/packages/VpnDialogs/res/values-hi/strings.xml index 34b79cb4100a..eed0858787d9 100644 --- a/packages/VpnDialogs/res/values-hi/strings.xml +++ b/packages/VpnDialogs/res/values-hi/strings.xml @@ -22,7 +22,7 @@ "सत्र:" "अवधि:" "भेजे गए:" - "प्राप्त:" + "पाया:" "%1$s बाइट / %2$s पैकेट" "हमेशा चालू रहने वाले VPN से नहीं जुड़ पा रहा है" "%1$s को हर समय जुड़े रहने के लिए सेट अप किया गया है, लेकिन वह इस समय नहीं जुड़ पा रहा है. जब तक आपका फ़ोन %1$s से नहीं जुड़ जाता, तब तक वह सार्वजनिक नेटवर्क का इस्तेमाल करेगा." -- GitLab From 07f7d1947af6ceecb19fccf9ae44e88bae6b3f57 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Tue, 16 Jul 2019 17:43:15 +0200 Subject: [PATCH 438/620] Only consider gone for layout if parent is gone for layout If we check getParentWindowHidden, that determines mostly actual visibility. However, we don't want that because we still would like to follow the parent's window layout lifecycle, as otherwise we may be stuck in a transition in case the parent window is hidden but the child is waiting for a layout to happen. Test: Click "Customize" on wallpaper picker, go back, ensure no transition timeout Fixes: 135976008 Change-Id: I66aeab29a81cd82b170aaf337249616b1f559848 (cherry picked from commit b52b0457e1bad14697341cb81f6d391755b009be) --- services/core/java/com/android/server/wm/WindowState.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index c6c9e1b39db4..dcf0f8a99883 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1611,7 +1611,7 @@ class WindowState extends WindowContainer implements WindowManagerP || !mRelayoutCalled || (atoken == null && mToken.isHidden()) || (atoken != null && atoken.hiddenRequested) - || isParentWindowHidden() + || isParentWindowGoneForLayout() || (mAnimatingExit && !isAnimatingLw()) || mDestroying; } @@ -3764,6 +3764,11 @@ class WindowState extends WindowContainer implements WindowManagerP return parent != null && parent.mHidden; } + private boolean isParentWindowGoneForLayout() { + final WindowState parent = getParentWindow(); + return parent != null && parent.isGoneForLayoutLw(); + } + void setWillReplaceWindow(boolean animate) { for (int i = mChildren.size() - 1; i >= 0; i--) { final WindowState c = mChildren.get(i); -- GitLab From 8adbd1e4ae59a4b5551c10b35e188694592bc81c Mon Sep 17 00:00:00 2001 From: Beverly Date: Thu, 25 Jul 2019 14:27:17 -0400 Subject: [PATCH 439/620] Force status bar visible when plugin holds it open Test: manual Bug: 138275859 Change-Id: Ic2c2958eec95afa15eb46b67571d14ca461f0337 --- .../systemui/statusbar/phone/StatusBarWindowController.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java index 4ddd0e9962ad..d9a9f7cbc2a8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java @@ -51,12 +51,13 @@ import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; import com.google.android.collect.Lists; + import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.lang.reflect.Field; - import java.util.ArrayList; + import javax.inject.Inject; import javax.inject.Singleton; @@ -352,7 +353,7 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat } private void applyForceStatusBarVisibleFlag(State state) { - if (state.forceStatusBarVisible) { + if (state.forceStatusBarVisible || state.forcePluginOpen) { mLpChanged.privateFlags |= WindowManager .LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT; } else { -- GitLab From 9dc158a9c8ecf58cad52729fd299f736e0bfc650 Mon Sep 17 00:00:00 2001 From: James O'Leary Date: Thu, 25 Jul 2019 15:00:16 -0400 Subject: [PATCH 440/620] Fix handles redrawing when not visible Bug: 137877559 Test: Verify CornerHandleView.onDraw() is no longer called when swiping along navbar Change-Id: I10b89fc2d88f93bbbb86bf60db15869d6480a3e2 --- .../SystemUI/src/com/android/systemui/CornerHandleView.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/CornerHandleView.java b/packages/SystemUI/src/com/android/systemui/CornerHandleView.java index 54a36355decb..a94952c5bc19 100644 --- a/packages/SystemUI/src/com/android/systemui/CornerHandleView.java +++ b/packages/SystemUI/src/com/android/systemui/CornerHandleView.java @@ -107,7 +107,9 @@ public class CornerHandleView extends View { mPaint.setColor((int) ArgbEvaluator.getInstance().evaluate(darkIntensity, mLightColor, mDarkColor)); - invalidate(); + if (getVisibility() == VISIBLE) { + invalidate(); + } } @Override -- GitLab From bd2c943af39ae7748b7c69b56ad9e355e2f45315 Mon Sep 17 00:00:00 2001 From: Evan Laird Date: Thu, 25 Jul 2019 15:04:38 -0400 Subject: [PATCH 441/620] Send ChannelDialogController finish message on dismiss NotificationInfo keeps track of whether or not it's presenting the channel dialog editor, but was missing messages from the "tap outside" dismissal of the dialog and would not present the dialog on subesquent taps. This change makes the controller send the finish message on any dismiss event Fixes: 135484257 Test: atest ChannelEditorDialogControllerTest; visual Change-Id: I25a124e4d875c146024a2051cd7c2e896d801c23 --- .../notification/row/ChannelEditorDialogController.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt index 8e6822770694..782aad17345e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt @@ -23,6 +23,7 @@ import android.app.NotificationChannel.DEFAULT_CHANNEL_ID import android.app.NotificationChannelGroup import android.app.NotificationManager.IMPORTANCE_NONE import android.content.Context +import android.content.DialogInterface import android.graphics.Color import android.graphics.PixelFormat import android.graphics.drawable.Drawable @@ -171,7 +172,6 @@ class ChannelEditorDialogController @Inject constructor( private fun done() { resetState() dialog.dismiss() - onFinishListener?.onChannelEditorDialogFinished() } private fun resetState() { @@ -261,6 +261,11 @@ class ChannelEditorDialogController @Inject constructor( dialog.apply { setContentView(R.layout.notif_half_shelf) setCanceledOnTouchOutside(true) + setOnDismissListener(object : DialogInterface.OnDismissListener { + override fun onDismiss(dialog: DialogInterface?) { + onFinishListener?.onChannelEditorDialogFinished() + } + }) findViewById(R.id.half_shelf_container).apply { controller = this@ChannelEditorDialogController appIcon = this@ChannelEditorDialogController.appIcon -- GitLab From 390d9e6a1806626eb521d55a36b1578d28714cc8 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Wed, 24 Jul 2019 15:40:57 -0700 Subject: [PATCH 442/620] SharedMemory: break Cleaner reference cycle. Previously, the Cleaner we create to close the ashmem file descriptor used a thunk that held a strong reference to the FileDescriptor we wanted to clean up, which prevented the Cleaner from ever running. Break the cycle by storing the integer value of the file descriptor instead. Bug: http://b/138323667 Test: treehugger Change-Id: I613a7d035892032f9567d59acb04672957c96011 (cherry picked from commit 6ca916a657cd56158212a57601108716ce78cbe8) --- core/java/android/os/SharedMemory.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/java/android/os/SharedMemory.java b/core/java/android/os/SharedMemory.java index 57a88012a31a..3e2ba3d3115f 100644 --- a/core/java/android/os/SharedMemory.java +++ b/core/java/android/os/SharedMemory.java @@ -62,7 +62,7 @@ public final class SharedMemory implements Parcelable, Closeable { mMemoryRegistration = new MemoryRegistration(mSize); mCleaner = Cleaner.create(mFileDescriptor, - new Closer(mFileDescriptor, mMemoryRegistration)); + new Closer(mFileDescriptor.getInt$(), mMemoryRegistration)); } /** @@ -290,10 +290,10 @@ public final class SharedMemory implements Parcelable, Closeable { * Cleaner that closes the FD */ private static final class Closer implements Runnable { - private FileDescriptor mFd; + private int mFd; private MemoryRegistration mMemoryReference; - private Closer(FileDescriptor fd, MemoryRegistration memoryReference) { + private Closer(int fd, MemoryRegistration memoryReference) { mFd = fd; mMemoryReference = memoryReference; } @@ -301,7 +301,9 @@ public final class SharedMemory implements Parcelable, Closeable { @Override public void run() { try { - Os.close(mFd); + FileDescriptor fd = new FileDescriptor(); + fd.setInt$(mFd); + Os.close(fd); } catch (ErrnoException e) { /* swallow error */ } mMemoryReference.release(); mMemoryReference = null; -- GitLab From c075f153d2247ca3bc0ac8cddff26e1ae465bc22 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Wed, 24 Jul 2019 15:32:17 -0700 Subject: [PATCH 443/620] Fading away the lockscreen wallpaper properly Previously the duration and delay was wrong. This now properly overrided the fading away duration to apply everywhere. Fixes: 138305791 Test: add lockscreen wallpaper observe normal fading Change-Id: Ib93e6647968047a8690201e01bcb13a3377b110d --- .../statusbar/NotificationMediaManager.java | 14 +++++---- .../phone/NotificationPanelView.java | 16 ++++++---- .../systemui/statusbar/phone/StatusBar.java | 9 +++--- .../phone/StatusBarKeyguardViewManager.java | 16 ++++++---- .../statusbar/policy/KeyguardMonitor.java | 29 ++++++++++++++++++- .../statusbar/policy/KeyguardMonitorImpl.java | 9 +++++- 6 files changed, 71 insertions(+), 22 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java index f001561754aa..00a12a9e4409 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java @@ -17,6 +17,10 @@ package com.android.systemui.statusbar; import static com.android.systemui.Dependency.MAIN_HANDLER; import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; +import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_UNLOCK_FADING; +import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK; +import static com.android.systemui.statusbar.phone.BiometricUnlockController + .MODE_WAKE_AND_UNLOCK_PULSING; import static com.android.systemui.statusbar.phone.StatusBar.DEBUG_MEDIA_FAKE_ARTWORK; import static com.android.systemui.statusbar.phone.StatusBar.ENABLE_LOCKSCREEN_WALLPAPER; import static com.android.systemui.statusbar.phone.StatusBar.SHOW_LOCKSCREEN_MEDIA_ARTWORK; @@ -595,9 +599,11 @@ public class NotificationMediaManager implements Dumpable { boolean cannotAnimateDoze = shadeController != null && shadeController.isDozing() && !ScrimState.AOD.getAnimateChange(); - if (mBiometricUnlockController != null && mBiometricUnlockController.getMode() + boolean needsBypassFading = mKeyguardMonitor.isBypassFadingAnimation(); + if (((mBiometricUnlockController != null && mBiometricUnlockController.getMode() == BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING - || hideBecauseOccluded || cannotAnimateDoze) { + || cannotAnimateDoze) && !needsBypassFading) + || hideBecauseOccluded) { // We are unlocking directly - no animation! mBackdrop.setVisibility(View.GONE); @@ -622,9 +628,7 @@ public class NotificationMediaManager implements Dumpable { }); if (mKeyguardMonitor.isKeyguardFadingAway()) { mBackdrop.animate() - // Make it disappear faster, as the focus should be on the activity - // behind. - .setDuration(mKeyguardMonitor.getKeyguardFadingAwayDuration() / 2) + .setDuration(mKeyguardMonitor.getShortenedFadingAwayDuration()) .setStartDelay(mKeyguardMonitor.getKeyguardFadingAwayDelay()) .setInterpolator(Interpolators.LINEAR) .start(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 37855ae592a5..da01c572b2c5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -1560,9 +1560,15 @@ public class NotificationPanelView extends PanelView implements anim.setStartDelay(mKeyguardMonitor.isKeyguardFadingAway() ? mKeyguardMonitor.getKeyguardFadingAwayDelay() : 0); - anim.setDuration(mKeyguardMonitor.isKeyguardFadingAway() - ? mKeyguardMonitor.getKeyguardFadingAwayDuration() / 2 - : StackStateAnimator.ANIMATION_DURATION_STANDARD); + + long duration; + if (mKeyguardMonitor.isKeyguardFadingAway()) { + duration = mKeyguardMonitor.getShortenedFadingAwayDuration(); + } else { + duration = StackStateAnimator.ANIMATION_DURATION_STANDARD; + } + anim.setDuration(duration); + anim.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN); anim.addListener(new AnimatorListenerAdapter() { @Override @@ -1605,7 +1611,7 @@ public class NotificationPanelView extends PanelView implements mKeyguardBottomArea.animate() .alpha(0f) .setStartDelay(mKeyguardMonitor.getKeyguardFadingAwayDelay()) - .setDuration(mKeyguardMonitor.getKeyguardFadingAwayDuration() / 2) + .setDuration(mKeyguardMonitor.getShortenedFadingAwayDuration()) .setInterpolator(Interpolators.ALPHA_OUT) .withEndAction(mAnimateKeyguardBottomAreaInvisibleEndRunnable) .start(); @@ -1634,7 +1640,7 @@ public class NotificationPanelView extends PanelView implements if (keyguardFadingAway) { mKeyguardStatusView.animate() .setStartDelay(mKeyguardMonitor.getKeyguardFadingAwayDelay()) - .setDuration(mKeyguardMonitor.getKeyguardFadingAwayDuration() / 2) + .setDuration(mKeyguardMonitor.getShortenedFadingAwayDuration()) .start(); } } else if (mBarState == StatusBarState.SHADE_LOCKED diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index d93dc950a077..f729e96299f3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -3200,12 +3200,13 @@ public class StatusBar extends SystemUI implements DemoMode, /** * Notifies the status bar the Keyguard is fading away with the specified timings. - * - * @param startTime the start time of the animations in uptime millis + * @param startTime the start time of the animations in uptime millis * @param delay the precalculated animation delay in milliseconds * @param fadeoutDuration the duration of the exit animation, in milliseconds + * @param isBypassFading is this a fading away animation while bypassing */ - public void setKeyguardFadingAway(long startTime, long delay, long fadeoutDuration) { + public void setKeyguardFadingAway(long startTime, long delay, long fadeoutDuration, + boolean isBypassFading) { mCommandQueue.appTransitionStarting(mDisplayId, startTime + fadeoutDuration - LightBarTransitionsController.DEFAULT_TINT_ANIMATION_DURATION, LightBarTransitionsController.DEFAULT_TINT_ANIMATION_DURATION, true); @@ -3213,7 +3214,7 @@ public class StatusBar extends SystemUI implements DemoMode, mCommandQueue.appTransitionStarting(mDisplayId, startTime - LightBarTransitionsController.DEFAULT_TINT_ANIMATION_DURATION, LightBarTransitionsController.DEFAULT_TINT_ANIMATION_DURATION, true); - mKeyguardMonitor.notifyKeyguardFadingAway(delay, fadeoutDuration); + mKeyguardMonitor.notifyKeyguardFadingAway(delay, fadeoutDuration, isBypassFading); } /** 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 1321784c978a..09e5a1d93b6f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -560,18 +560,22 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb executeAfterKeyguardGoneAction(); boolean wakeUnlockPulsing = mBiometricUnlockController.getMode() == MODE_WAKE_AND_UNLOCK_PULSING; - if (wakeUnlockPulsing) { + boolean needsFading = needsBypassFading(); + if (needsFading) { + delay = 0; + fadeoutDuration = KeyguardBypassController.BYPASS_PANEL_FADE_DURATION; + } else if (wakeUnlockPulsing) { delay = 0; fadeoutDuration = 240; } - mStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration); + mStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration, needsFading); mBiometricUnlockController.startKeyguardFadingAway(); hideBouncer(true /* destroyView */); if (wakeUnlockPulsing) { - if (needsBypassFading()) { + if (needsFading) { ViewGroupFadeHelper.fadeOutAllChildrenExcept(mNotificationPanelView, mNotificationContainer, - KeyguardBypassController.BYPASS_PANEL_FADE_DURATION, + fadeoutDuration, () -> { mStatusBar.hideKeyguard(); onKeyguardFadedAway(); @@ -584,10 +588,10 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb boolean staying = mStatusBarStateController.leaveOpenOnKeyguardHide(); if (!staying) { mStatusBarWindowController.setKeyguardFadingAway(true); - if (needsBypassFading()) { + if (needsFading) { ViewGroupFadeHelper.fadeOutAllChildrenExcept(mNotificationPanelView, mNotificationContainer, - KeyguardBypassController.BYPASS_PANEL_FADE_DURATION, + fadeoutDuration, () -> { mStatusBar.hideKeyguard(); }); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitor.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitor.java index f61b556e22ab..070136ec94c1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitor.java @@ -29,6 +29,19 @@ public interface KeyguardMonitor extends CallbackController { long getKeyguardFadingAwayDelay(); long calculateGoingToFullShadeDelay(); + /** + * @return a shortened fading away duration similar to + * {{@link #getKeyguardFadingAwayDuration()}} which may only span half of the duration, unless + * we're bypassing + */ + default long getShortenedFadingAwayDuration() { + if (isBypassFadingAnimation()) { + return getKeyguardFadingAwayDuration(); + } else { + return getKeyguardFadingAwayDuration() / 2; + } + } + default boolean isDeviceInteractive() { return false; } @@ -39,7 +52,21 @@ public interface KeyguardMonitor extends CallbackController { default void notifyKeyguardGoingAway(boolean b) { } - default void notifyKeyguardFadingAway(long delay, long fadeoutDuration) { + /** + * @return {@code true} if the current fading away animation is the fast bypass fading. + */ + default boolean isBypassFadingAnimation() { + return false; + } + + /** + * Notifies that the Keyguard is fading away with the specified timings. + * @param delay the precalculated animation delay in milliseconds + * @param fadeoutDuration the duration of the exit animation, in milliseconds + * @param isBypassFading is this a fading away animation while bypassing + */ + default void notifyKeyguardFadingAway(long delay, long fadeoutDuration, + boolean isBypassFading) { } default void notifyKeyguardDoneFading() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java index 68d00708b0d3..8829be4ee0f8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java @@ -54,6 +54,7 @@ public class KeyguardMonitorImpl extends KeyguardUpdateMonitorCallback private long mKeyguardFadingAwayDuration; private boolean mKeyguardGoingAway; private boolean mLaunchTransitionFadingAway; + private boolean mBypassFadingAnimation; /** */ @@ -140,10 +141,11 @@ public class KeyguardMonitorImpl extends KeyguardUpdateMonitorCallback new ArrayList<>(mCallbacks).forEach(Callback::onKeyguardShowingChanged); } - public void notifyKeyguardFadingAway(long delay, long fadeoutDuration) { + public void notifyKeyguardFadingAway(long delay, long fadeoutDuration, boolean isBypassFading) { setKeyguardFadingAway(true); mKeyguardFadingAwayDelay = delay; mKeyguardFadingAwayDuration = fadeoutDuration; + mBypassFadingAnimation = isBypassFading; } private void setKeyguardFadingAway(boolean keyguardFadingAway) { @@ -171,6 +173,11 @@ public class KeyguardMonitorImpl extends KeyguardUpdateMonitorCallback return mKeyguardGoingAway; } + @Override + public boolean isBypassFadingAnimation() { + return mBypassFadingAnimation; + } + @Override public long getKeyguardFadingAwayDelay() { return mKeyguardFadingAwayDelay; -- GitLab From 4be12ea1e26e303e1cb0b77a66048c3234c9470f Mon Sep 17 00:00:00 2001 From: Siarhei Vishniakou Date: Thu, 25 Jul 2019 09:59:17 -0700 Subject: [PATCH 444/620] syncInputWindows for mouse events Add back the syncInputWindows calls for mouse events, because there are tests that rely on this behaviour (they might inject only a few events, which is not very realistic, but we still have to support this). Bug: 137072767 Bug: 138263890 Test: atest android.view.cts.HoverTest Change-Id: I37b621bc6dc6a844ca86324962124bb06857b906 --- .../core/java/com/android/server/wm/WindowManagerService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index fb57d73c9a21..436a5c729b86 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -7670,10 +7670,12 @@ public class WindowManagerService extends IWindowManager.Stub isDown = motionEvent.getAction() == MotionEvent.ACTION_DOWN; isUp = motionEvent.getAction() == MotionEvent.ACTION_UP; } + final boolean isMouseEvent = ev.getSource() == InputDevice.SOURCE_MOUSE; // For ACTION_DOWN, syncInputTransactions before injecting input. + // For all mouse events, also sync before injecting. // For ACTION_UP, sync after injecting. - if (isDown) { + if (isDown || isMouseEvent) { syncInputTransactions(); } final boolean result = -- GitLab From 20ab1e34273aa179053f5dc93e70c0191a39e91b Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Thu, 25 Jul 2019 13:54:23 -0700 Subject: [PATCH 445/620] SharedMemory: clear file descriptor when explicitly closed. We run the Cleaner in close, but after the fix in commit 6ca916a6, this no longer clears the value stored in the FileDescriptor, which means that subsequent operations on an explicitly closed SharedMemory will operate on a bogus fd number. Clearing the FileDescriptor value in close is sufficient, because Cleaner.clean is idempotent, and the only other case where it executes is when the FileDescriptor is phantom reachable, which means no one can access it to get its integer value. Bug: http://b/138392115 Bug: http://b/138323667 Test: treehugger Change-Id: I8bdb4c745466532a0712976416184c53fcf0dbf6 (cherry picked from commit a7641806ddf1099239632d53c629c062ff2168f4) --- core/java/android/os/SharedMemory.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/java/android/os/SharedMemory.java b/core/java/android/os/SharedMemory.java index 3e2ba3d3115f..0540e3611b52 100644 --- a/core/java/android/os/SharedMemory.java +++ b/core/java/android/os/SharedMemory.java @@ -259,6 +259,9 @@ public final class SharedMemory implements Parcelable, Closeable { mCleaner.clean(); mCleaner = null; } + + // Cleaner.clean doesn't clear the value of the file descriptor. + mFileDescriptor.setInt$(-1); } @Override -- GitLab From be8ecaa59ef9dacda25f47ee2c87178a37b4036b Mon Sep 17 00:00:00 2001 From: Frank Li Date: Tue, 18 Jun 2019 05:45:25 -0700 Subject: [PATCH 446/620] Refine the proto dns_resolver.proto 1. refine the enum type Transport The name of 1st enum value is TRANSPORT_UNKNOWN 2. remove the wrong character "CR" Bug: 119862317 Test: ./out/host/linux-x86/bin/statsd_testdrive 116 Merged-In: Iaf7abac6170d5818a263392731069d7bf021d981 Merged-In: I8f0e7449036062ecc3827e477ced325d84c1bf54 (cherry picked from commit aee26c026c203a50ffb3b28baaf9aace73f335c7) Change-Id: Ie33a2ea58d6f39345d0f1d4141eea8b9c458dcfc --- cmds/statsd/src/atoms.proto | 2 +- .../stats/dnsresolver/dns_resolver.proto | 430 +++++++++--------- 2 files changed, 217 insertions(+), 215 deletions(-) diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 3d060feff70e..f76037af0508 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -5301,7 +5301,7 @@ message NetworkDnsEventReported { // Only valid for event_type = EVENT_RESNSEND. optional int32 res_nsend_flags = 5; - optional android.stats.dnsresolver.Transport network_type = 6; + optional android.stats.dnsresolver.NetworkType network_type = 6; // The DNS over TLS mode on a specific netId. optional android.stats.dnsresolver.PrivateDnsModes private_dns_modes = 7; diff --git a/core/proto/android/stats/dnsresolver/dns_resolver.proto b/core/proto/android/stats/dnsresolver/dns_resolver.proto index af6fea017bef..b7bf3848d921 100644 --- a/core/proto/android/stats/dnsresolver/dns_resolver.proto +++ b/core/proto/android/stats/dnsresolver/dns_resolver.proto @@ -1,214 +1,216 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -syntax = "proto2"; -package android.stats.dnsresolver; - -enum EventType { - EVENT_UNKNOWN = 0; - EVENT_GETADDRINFO = 1; - EVENT_GETHOSTBYNAME = 2; - EVENT_GETHOSTBYADDR = 3; - EVENT_RES_NSEND = 4; -} - -// The return value of the DNS resolver for each DNS lookups. -// bionic/libc/include/netdb.h -// system/netd/resolv/include/netd_resolv/resolv.h -enum ReturnCode { - RC_EAI_NO_ERROR = 0; - RC_EAI_ADDRFAMILY = 1; - RC_EAI_AGAIN = 2; - RC_EAI_BADFLAGS = 3; - RC_EAI_FAIL = 4; - RC_EAI_FAMILY = 5; - RC_EAI_MEMORY = 6; - RC_EAI_NODATA = 7; - RC_EAI_NONAME = 8; - RC_EAI_SERVICE = 9; - RC_EAI_SOCKTYPE = 10; - RC_EAI_SYSTEM = 11; - RC_EAI_BADHINTS = 12; - RC_EAI_PROTOCOL = 13; - RC_EAI_OVERFLOW = 14; - RC_RESOLV_TIMEOUT = 255; - RC_EAI_MAX = 256; -} - -enum NsRcode { - NS_R_NO_ERROR = 0; // No error occurred. - NS_R_FORMERR = 1; // Format error. - NS_R_SERVFAIL = 2; // Server failure. - NS_R_NXDOMAIN = 3; // Name error. - NS_R_NOTIMPL = 4; // Unimplemented. - NS_R_REFUSED = 5; // Operation refused. - // these are for BIND_UPDATE - NS_R_YXDOMAIN = 6; // Name exists - NS_R_YXRRSET = 7; // RRset exists - NS_R_NXRRSET = 8; // RRset does not exist - NS_R_NOTAUTH = 9; // Not authoritative for zone - NS_R_NOTZONE = 10; // Zone of record different from zone section - NS_R_MAX = 11; - // The following are EDNS extended rcodes - NS_R_BADVERS = 16; - // The following are TSIG errors - // NS_R_BADSIG = 16, - NS_R_BADKEY = 17; - NS_R_BADTIME = 18; -} - -// Currently defined type values for resources and queries. -enum NsType { - NS_T_INVALID = 0; // Cookie. - NS_T_A = 1; // Host address. - NS_T_NS = 2; // Authoritative server. - NS_T_MD = 3; // Mail destination. - NS_T_MF = 4; // Mail forwarder. - NS_T_CNAME = 5; // Canonical name. - NS_T_SOA = 6; // Start of authority zone. - NS_T_MB = 7; // Mailbox domain name. - NS_T_MG = 8; // Mail group member. - NS_T_MR = 9; // Mail rename name. - NS_T_NULL = 10; // Null resource record. - NS_T_WKS = 11; // Well known service. - NS_T_PTR = 12; // Domain name pointer. - NS_T_HINFO = 13; // Host information. - NS_T_MINFO = 14; // Mailbox information. - NS_T_MX = 15; // Mail routing information. - NS_T_TXT = 16; // Text strings. - NS_T_RP = 17; // Responsible person. - NS_T_AFSDB = 18; // AFS cell database. - NS_T_X25 = 19; // X_25 calling address. - NS_T_ISDN = 20; // ISDN calling address. - NS_T_RT = 21; // Router. - NS_T_NSAP = 22; // NSAP address. - NS_T_NSAP_PTR = 23; // Reverse NSAP lookup (deprecated). - NS_T_SIG = 24; // Security signature. - NS_T_KEY = 25; // Security key. - NS_T_PX = 26; // X.400 mail mapping. - NS_T_GPOS = 27; // Geographical position (withdrawn). - NS_T_AAAA = 28; // IPv6 Address. - NS_T_LOC = 29; // Location Information. - NS_T_NXT = 30; // Next domain (security). - NS_T_EID = 31; // Endpoint identifier. - NS_T_NIMLOC = 32; // Nimrod Locator. - NS_T_SRV = 33; // Server Selection. - NS_T_ATMA = 34; // ATM Address - NS_T_NAPTR = 35; // Naming Authority PoinTeR - NS_T_KX = 36; // Key Exchange - NS_T_CERT = 37; // Certification record - NS_T_A6 = 38; // IPv6 address (experimental) - NS_T_DNAME = 39; // Non-terminal DNAME - NS_T_SINK = 40; // Kitchen sink (experimentatl) - NS_T_OPT = 41; // EDNS0 option (meta-RR) - NS_T_APL = 42; // Address prefix list (RFC 3123) - NS_T_DS = 43; // Delegation Signer - NS_T_SSHFP = 44; // SSH Fingerprint - NS_T_IPSECKEY = 45; // IPSEC Key - NS_T_RRSIG = 46; // RRset Signature - NS_T_NSEC = 47; // Negative security - NS_T_DNSKEY = 48; // DNS Key - NS_T_DHCID = 49; // Dynamic host configuratin identifier - NS_T_NSEC3 = 50; // Negative security type 3 - NS_T_NSEC3PARAM = 51; // Negative security type 3 parameters - NS_T_HIP = 55; // Host Identity Protocol - NS_T_SPF = 99; // Sender Policy Framework - NS_T_TKEY = 249; // Transaction key - NS_T_TSIG = 250; // Transaction signature. - NS_T_IXFR = 251; // Incremental zone transfer. - NS_T_AXFR = 252; // Transfer zone of authority. - NS_T_MAILB = 253; // Transfer mailbox records. - NS_T_MAILA = 254; // Transfer mail agent records. - NS_T_ANY = 255; // Wildcard match. - NS_T_ZXFR = 256; // BIND-specific, nonstandard. - NS_T_DLV = 32769; // DNSSEC look-aside validatation. - NS_T_MAX = 65536; -} - -enum IpVersion { - IV_UNKNOWN = 0; - IV_IPV4 = 1; - IV_IPV6 = 2; -} - -enum TransportType { - TT_UNKNOWN = 0; - TT_UDP = 1; - TT_TCP = 2; - TT_DOT = 3; -} - -enum PrivateDnsModes { - PDM_UNKNOWN = 0; - PDM_OFF = 1; - PDM_OPPORTUNISTIC = 2; - PDM_STRICT = 3; -} - -enum Transport { - // Indicates this network uses a Cellular transport. - TRANSPORT_DEFAULT = 0; // TRANSPORT_CELLULAR - // Indicates this network uses a Wi-Fi transport. - TRANSPORT_WIFI = 1; - // Indicates this network uses a Bluetooth transport. - TRANSPORT_BLUETOOTH = 2; - // Indicates this network uses an Ethernet transport. - TRANSPORT_ETHERNET = 3; - // Indicates this network uses a VPN transport. - TRANSPORT_VPN = 4; - // Indicates this network uses a Wi-Fi Aware transport. - TRANSPORT_WIFI_AWARE = 5; - // Indicates this network uses a LoWPAN transport. - TRANSPORT_LOWPAN = 6; -} - -enum CacheStatus{ - // the cache can't handle that kind of queries. - // or the answer buffer is too small. - CS_UNSUPPORTED = 0; - // the cache doesn't know about this query. - CS_NOTFOUND = 1; - // the cache found the answer. - CS_FOUND = 2; - // Don't do anything on cache. - CS_SKIP = 3; -} - -message DnsQueryEvent { - optional android.stats.dnsresolver.NsRcode rcode = 1; - - optional android.stats.dnsresolver.NsType type = 2; - - optional android.stats.dnsresolver.CacheStatus cache_hit = 3; - - optional android.stats.dnsresolver.IpVersion ip_version = 4; - - optional android.stats.dnsresolver.TransportType transport = 5; - - // Number of DNS query retry times - optional int32 retry_times = 6; - - // Ordinal number of name server. - optional int32 dns_server_count = 7; - - // Used only by TCP and DOT. True for new connections. - optional bool connected = 8; - - optional int32 latency_micros = 9; -} - -message DnsQueryEvents { - repeated DnsQueryEvent dns_query_event = 1; -} +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +syntax = "proto2"; +package android.stats.dnsresolver; + +enum EventType { + EVENT_UNKNOWN = 0; + EVENT_GETADDRINFO = 1; + EVENT_GETHOSTBYNAME = 2; + EVENT_GETHOSTBYADDR = 3; + EVENT_RES_NSEND = 4; +} + +// The return value of the DNS resolver for each DNS lookups. +// bionic/libc/include/netdb.h +// system/netd/resolv/include/netd_resolv/resolv.h +enum ReturnCode { + RC_EAI_NO_ERROR = 0; + RC_EAI_ADDRFAMILY = 1; + RC_EAI_AGAIN = 2; + RC_EAI_BADFLAGS = 3; + RC_EAI_FAIL = 4; + RC_EAI_FAMILY = 5; + RC_EAI_MEMORY = 6; + RC_EAI_NODATA = 7; + RC_EAI_NONAME = 8; + RC_EAI_SERVICE = 9; + RC_EAI_SOCKTYPE = 10; + RC_EAI_SYSTEM = 11; + RC_EAI_BADHINTS = 12; + RC_EAI_PROTOCOL = 13; + RC_EAI_OVERFLOW = 14; + RC_RESOLV_TIMEOUT = 255; + RC_EAI_MAX = 256; +} + +enum NsRcode { + NS_R_NO_ERROR = 0; // No error occurred. + NS_R_FORMERR = 1; // Format error. + NS_R_SERVFAIL = 2; // Server failure. + NS_R_NXDOMAIN = 3; // Name error. + NS_R_NOTIMPL = 4; // Unimplemented. + NS_R_REFUSED = 5; // Operation refused. + // these are for BIND_UPDATE + NS_R_YXDOMAIN = 6; // Name exists + NS_R_YXRRSET = 7; // RRset exists + NS_R_NXRRSET = 8; // RRset does not exist + NS_R_NOTAUTH = 9; // Not authoritative for zone + NS_R_NOTZONE = 10; // Zone of record different from zone section + NS_R_MAX = 11; + // The following are EDNS extended rcodes + NS_R_BADVERS = 16; + // The following are TSIG errors + // NS_R_BADSIG = 16, + NS_R_BADKEY = 17; + NS_R_BADTIME = 18; + NS_R_TIMEOUT = 255; +} + +// Currently defined type values for resources and queries. +enum NsType { + NS_T_INVALID = 0; // Cookie. + NS_T_A = 1; // Host address. + NS_T_NS = 2; // Authoritative server. + NS_T_MD = 3; // Mail destination. + NS_T_MF = 4; // Mail forwarder. + NS_T_CNAME = 5; // Canonical name. + NS_T_SOA = 6; // Start of authority zone. + NS_T_MB = 7; // Mailbox domain name. + NS_T_MG = 8; // Mail group member. + NS_T_MR = 9; // Mail rename name. + NS_T_NULL = 10; // Null resource record. + NS_T_WKS = 11; // Well known service. + NS_T_PTR = 12; // Domain name pointer. + NS_T_HINFO = 13; // Host information. + NS_T_MINFO = 14; // Mailbox information. + NS_T_MX = 15; // Mail routing information. + NS_T_TXT = 16; // Text strings. + NS_T_RP = 17; // Responsible person. + NS_T_AFSDB = 18; // AFS cell database. + NS_T_X25 = 19; // X_25 calling address. + NS_T_ISDN = 20; // ISDN calling address. + NS_T_RT = 21; // Router. + NS_T_NSAP = 22; // NSAP address. + NS_T_NSAP_PTR = 23; // Reverse NSAP lookup (deprecated). + NS_T_SIG = 24; // Security signature. + NS_T_KEY = 25; // Security key. + NS_T_PX = 26; // X.400 mail mapping. + NS_T_GPOS = 27; // Geographical position (withdrawn). + NS_T_AAAA = 28; // IPv6 Address. + NS_T_LOC = 29; // Location Information. + NS_T_NXT = 30; // Next domain (security). + NS_T_EID = 31; // Endpoint identifier. + NS_T_NIMLOC = 32; // Nimrod Locator. + NS_T_SRV = 33; // Server Selection. + NS_T_ATMA = 34; // ATM Address + NS_T_NAPTR = 35; // Naming Authority PoinTeR + NS_T_KX = 36; // Key Exchange + NS_T_CERT = 37; // Certification record + NS_T_A6 = 38; // IPv6 address (experimental) + NS_T_DNAME = 39; // Non-terminal DNAME + NS_T_SINK = 40; // Kitchen sink (experimentatl) + NS_T_OPT = 41; // EDNS0 option (meta-RR) + NS_T_APL = 42; // Address prefix list (RFC 3123) + NS_T_DS = 43; // Delegation Signer + NS_T_SSHFP = 44; // SSH Fingerprint + NS_T_IPSECKEY = 45; // IPSEC Key + NS_T_RRSIG = 46; // RRset Signature + NS_T_NSEC = 47; // Negative security + NS_T_DNSKEY = 48; // DNS Key + NS_T_DHCID = 49; // Dynamic host configuratin identifier + NS_T_NSEC3 = 50; // Negative security type 3 + NS_T_NSEC3PARAM = 51; // Negative security type 3 parameters + NS_T_HIP = 55; // Host Identity Protocol + NS_T_SPF = 99; // Sender Policy Framework + NS_T_TKEY = 249; // Transaction key + NS_T_TSIG = 250; // Transaction signature. + NS_T_IXFR = 251; // Incremental zone transfer. + NS_T_AXFR = 252; // Transfer zone of authority. + NS_T_MAILB = 253; // Transfer mailbox records. + NS_T_MAILA = 254; // Transfer mail agent records. + NS_T_ANY = 255; // Wildcard match. + NS_T_ZXFR = 256; // BIND-specific, nonstandard. + NS_T_DLV = 32769; // DNSSEC look-aside validatation. + NS_T_MAX = 65536; +} + +enum IpVersion { + IV_UNKNOWN = 0; + IV_IPV4 = 1; + IV_IPV6 = 2; +} + +enum Protocol { + PROTO_UNKNOWN = 0; + PROTO_UDP = 1; + PROTO_TCP = 2; + PROTO_DOT = 3; +} + +enum PrivateDnsModes { + PDM_UNKNOWN = 0; + PDM_OFF = 1; + PDM_OPPORTUNISTIC = 2; + PDM_STRICT = 3; +} + +enum NetworkType { + NT_UNKNOWN = 0; + // Indicates this network uses a Cellular transport. + NT_CELLULAR = 1; + // Indicates this network uses a Wi-Fi transport. + NT_WIFI = 2; + // Indicates this network uses a Bluetooth transport. + NT_BLUETOOTH = 3; + // Indicates this network uses an Ethernet transport. + NT_ETHERNET = 4; + // Indicates this network uses a VPN transport. + NT_VPN = 5; + // Indicates this network uses a Wi-Fi Aware transport. + NT_WIFI_AWARE = 6; + // Indicates this network uses a LoWPAN transport. + NT_LOWPAN = 7; +} + +enum CacheStatus{ + // the cache can't handle that kind of queries. + // or the answer buffer is too small. + CS_UNSUPPORTED = 0; + // the cache doesn't know about this query. + CS_NOTFOUND = 1; + // the cache found the answer. + CS_FOUND = 2; + // Don't do anything on cache. + CS_SKIP = 3; +} + +message DnsQueryEvent { + optional android.stats.dnsresolver.NsRcode rcode = 1; + + optional android.stats.dnsresolver.NsType type = 2; + + optional android.stats.dnsresolver.CacheStatus cache_hit = 3; + + optional android.stats.dnsresolver.IpVersion ip_version = 4; + + optional android.stats.dnsresolver.Protocol protocol = 5; + + // Number of DNS query retry times + optional int32 retry_times = 6; + + // Ordinal number of name server. + optional int32 dns_server_index = 7; + + // Used only by TCP and DOT. True for new connections. + optional bool connected = 8; + + optional int32 latency_micros = 9; +} + +message DnsQueryEvents { + repeated DnsQueryEvent dns_query_event = 1; +} -- GitLab From fa499f92591391eb7dc1e1d119bd56fb33bfdc4c Mon Sep 17 00:00:00 2001 From: Bernie Innocenti Date: Wed, 26 Jun 2019 01:39:57 -0700 Subject: [PATCH 447/620] Add NS_R_INTERNAL_ERROR item into NsRcode Bug: 119862317 Test: ./out/host/linux-x86/bin/statsd_testdrive 116 Merged-In: I023ff5dc0ae2efe45f81494929640c9b96821a0d Merged-In: I0cf28032f8079c64253ed3f90fcf9d4705a5b492 (cherry picked from commit 83ef1697e3fdebf03c0a94fa1c41fa2ca053d669) Change-Id: I106f73e8b0251bc7a64c68dfb450269ac7cd4feb --- core/proto/android/stats/dnsresolver/dns_resolver.proto | 1 + 1 file changed, 1 insertion(+) diff --git a/core/proto/android/stats/dnsresolver/dns_resolver.proto b/core/proto/android/stats/dnsresolver/dns_resolver.proto index b7bf3848d921..9eaabfbca463 100644 --- a/core/proto/android/stats/dnsresolver/dns_resolver.proto +++ b/core/proto/android/stats/dnsresolver/dns_resolver.proto @@ -67,6 +67,7 @@ enum NsRcode { // NS_R_BADSIG = 16, NS_R_BADKEY = 17; NS_R_BADTIME = 18; + NS_R_INTERNAL_ERROR = 254; NS_R_TIMEOUT = 255; } -- GitLab From 762eb4a2158de14414e746acf8d3270ea65d1143 Mon Sep 17 00:00:00 2001 From: Frank Li Date: Mon, 22 Jul 2019 08:13:03 -0700 Subject: [PATCH 448/620] Add one field(sampling_rate_denom) in NetworkDnsEventReported for recording sample rate. The sample rate of DNS stats(to statsd) is 1/sampling_rate_denom. Bug: 119862317 Test: ./out/host/linux-x86/bin/statsd_testdrive 116 Merged-In: Iab542b32a8a18ae0bdbd8e005c430a876f056806 Merged-In: I9d37cac0bca53b3d7c6751ca69c1d304dfe17098 (cherry picked from commit 60d4f1a5bdc2a8412e285baf74e0e9a54b8c42d2) Change-Id: If380a730942195db91a66944f103674c539ca7ad --- cmds/statsd/src/atoms.proto | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index f76037af0508..f08be4922495 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -5309,6 +5309,9 @@ message NetworkDnsEventReported { // Additional pass-through fields opaque to statsd. // The DNS resolver Mainline module can add new fields here without requiring an OS update. optional android.stats.dnsresolver.DnsQueryEvents dns_query_events = 8 [(log_mode) = MODE_BYTES]; + + // The sample rate of DNS stats (to statsd) is 1/sampling_rate_denom. + optional int32 sampling_rate_denom = 9; } /** -- GitLab From e81a8b2419203e9ecf901aa7cfd0eae0d7e9750f Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 25 Jul 2019 16:00:04 -0700 Subject: [PATCH 449/620] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I378efe4ecf659edc7846eee5e6bd55416c6c9bf9 --- packages/SettingsLib/res/values-hi/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 238eba58e0a5..3a20d04d7ab2 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -46,7 +46,7 @@ "सीमित कनेक्शन" "इंटरनेट कनेक्शन नहीं है" "साइन इन करना ज़रूरी है" - "एक्सेस पॉइंट फ़िलहाल भरा हुआ है" + "ऐक्सेस पॉइंट फ़िलहाल भरा हुआ है" "%1$s के ज़रिए कनेक्ट" "%1$s के ज़रिए उपलब्ध" "%1$s खोला जा रहा है" @@ -68,7 +68,7 @@ "युग्‍मित कर रहा है…" "जुड़ गया (फ़ोन के ऑडियो को छोड़कर)%1$s" "जुड़ गया (मीडिया ऑडियो को छोड़कर)%1$s" - "जुड़ गया (मैसेज का एक्सेस नहीं)%1$s" + "जुड़ गया (मैसेज का ऐक्सेस नहीं)%1$s" "जुड़ गया (फ़ोन या मीडिया ऑडियो को छोड़कर)%1$s" "जुड़ गया, बैटरी का लेवल %1$s%2$s" "जुड़ गया (फ़ोन के ऑडियो को छोड़कर), बैटरी का लेवल %1$s%2$s" @@ -88,7 +88,7 @@ "संपर्क साझाकरण के लिए उपयोग करें" "इंटरनेट कनेक्शन साझाकरण" "लेख संदेश" - "सिम एक्सेस" + "सिम ऐक्सेस" "HD ऑडियो: %1$s" "HD ऑडियो" "सुनने में मदद करने वाले डिवाइस" @@ -200,7 +200,7 @@ "यह उपयोगकर्ता, डेवलपर के लिए सेटिंग और टूल का इस्तेमाल नहीं कर सकता" "VPN सेटिंग इस उपयोगकर्ता के लिए उपलब्ध नहीं हैं" "टेदरिंग सेटिंग इस उपयोगकर्ता के लिए उपलब्ध नहीं हैं" - "एक्सेस पॉइंट के नाम की सेटिंग इस उपयोगकर्ता के लिए मौजूद नहीं हैं" + "ऐक्सेस पॉइंट के नाम की सेटिंग इस उपयोगकर्ता के लिए मौजूद नहीं हैं" "USB डीबग करना" "डीबग मोड जब USB कनेक्‍ट किया गया हो" "USB डीबग करने की मंज़ूरी रद्द करें" @@ -414,7 +414,7 @@ "बंद किया गया" "अनुमति है" "अनुमति नहीं है" - "अनजान ऐप्लिकेशन इंस्टॉल करने का एक्सेस" + "अनजान ऐप्लिकेशन इंस्टॉल करने का ऐक्सेस" "सेटिंग का होम पेज" "0%" -- GitLab From 3a9f1f547a03c509c4f160258075da6976276854 Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Wed, 24 Jul 2019 11:40:47 -0700 Subject: [PATCH 450/620] Prevent key removal on cache update Recent thumbnail cache keys were prematurely deleted from the TaskKeyCache. Test: atest SystemUITests:TaskKeyLruCacheTest fixes: 111077107 Change-Id: I4d38ba1f69b4a4b9898e1951b68181f27f92c116 --- .../shared/recents/model/TaskKeyLruCache.java | 6 +- .../recents/model/TaskKeyLruCacheTest.java | 106 ++++++++++++++++++ 2 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 packages/SystemUI/tests/src/com/android/systemui/shared/recents/model/TaskKeyLruCacheTest.java diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/TaskKeyLruCache.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/TaskKeyLruCache.java index b2c79a4c0a32..e106c657109d 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/TaskKeyLruCache.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/TaskKeyLruCache.java @@ -52,7 +52,11 @@ public class TaskKeyLruCache extends TaskKeyCache { if (mEvictionCallback != null) { mEvictionCallback.onEntryEvicted(mKeys.get(taskId)); } - mKeys.remove(taskId); + + // Only remove from mKeys on cache remove, not a cache update. + if (newV == null) { + mKeys.remove(taskId); + } } }; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/recents/model/TaskKeyLruCacheTest.java b/packages/SystemUI/tests/src/com/android/systemui/shared/recents/model/TaskKeyLruCacheTest.java new file mode 100644 index 000000000000..eb71dd6ee677 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/shared/recents/model/TaskKeyLruCacheTest.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.shared.recents.model; + + +import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertNull; + +import android.test.suitebuilder.annotation.SmallTest; + +import com.android.systemui.SysuiTestCase; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@SmallTest +@RunWith(JUnit4.class) +public class TaskKeyLruCacheTest extends SysuiTestCase { + private static int sCacheSize = 3; + private static int sIdTask1 = 1; + private static int sIdTask2 = 2; + private static int sIdTask3 = 3; + private static int sIdUser1 = 1; + + TaskKeyCache mCache = new TaskKeyLruCache<>(sCacheSize, null); + Task.TaskKey mKey1; + Task.TaskKey mKey2; + Task.TaskKey mKey3; + + @Before + public void setup() { + mKey1 = new Task.TaskKey(sIdTask1, 0, null, null, sIdUser1, System.currentTimeMillis()); + mKey2 = new Task.TaskKey(sIdTask2, 0, null, null, sIdUser1, System.currentTimeMillis()); + mKey3 = new Task.TaskKey(sIdTask3, 0, null, null, sIdUser1, System.currentTimeMillis()); + } + + @Test + public void addSingleItem_get_success() { + mCache.put(mKey1, 1); + + assertEquals(1, (int) mCache.get(mKey1)); + } + + @Test + public void addSingleItem_getUninsertedItem_returnsNull() { + mCache.put(mKey1, 1); + + assertNull(mCache.get(mKey2)); + } + + @Test + public void emptyCache_get_returnsNull() { + assertNull(mCache.get(mKey1)); + } + + @Test + public void updateItem_get_returnsSecond() { + mCache.put(mKey1, 1); + mCache.put(mKey1, 2); + + assertEquals(2, (int) mCache.get(mKey1)); + assertEquals(1, mCache.mKeys.size()); + } + + @Test + public void fillCache_put_evictsOldest() { + mCache.put(mKey1, 1); + mCache.put(mKey2, 2); + mCache.put(mKey3, 3); + Task.TaskKey key4 = new Task.TaskKey(sIdTask3 + 1, 0, + null, null, sIdUser1, System.currentTimeMillis()); + mCache.put(key4, 4); + + assertNull(mCache.get(mKey1)); + assertEquals(3, mCache.mKeys.size()); + assertEquals(mKey2, mCache.mKeys.valueAt(0)); + } + + @Test + public void fillCache_remove_success() { + mCache.put(mKey1, 1); + mCache.put(mKey2, 2); + mCache.put(mKey3, 3); + + mCache.remove(mKey2); + + assertNull(mCache.get(mKey2)); + assertEquals(2, mCache.mKeys.size()); + } +} -- GitLab From d5d97d76ba1a612e6bd4d36f53c05266f9036093 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Tue, 23 Jul 2019 16:51:02 -0700 Subject: [PATCH 451/620] Log acquired vendorCode Bug: 137688980 Test: adb shell cmd stats print-logs adb logcat | grep -i statsd Change-Id: Icdbc4a4ba004b5f4b7407de6e8ee256bee8ef97a (cherry picked from commit f24ae8da0e45ef77e2405adced21978a98f8ed87) --- .../java/com/android/server/biometrics/LoggableMonitor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/biometrics/LoggableMonitor.java b/services/core/java/com/android/server/biometrics/LoggableMonitor.java index 6c7cbc166241..ecf3864e3362 100644 --- a/services/core/java/com/android/server/biometrics/LoggableMonitor.java +++ b/services/core/java/com/android/server/biometrics/LoggableMonitor.java @@ -93,7 +93,7 @@ public abstract class LoggableMonitor { statsAction(), statsClient(), acquiredInfo, - 0 /* vendorCode */, // Don't log vendorCode for now + vendorCode, Utils.isDebugEnabled(context, targetUserId)); } -- GitLab From d935197888d183eabd928d4f67027356b04d89b6 Mon Sep 17 00:00:00 2001 From: joshmccloskey Date: Wed, 24 Jul 2019 17:13:16 -0700 Subject: [PATCH 452/620] Fixed race condition with different profiles Test: Verified that setting/getting features in one profile does not change the other. Fixes: 138127704 Change-Id: Id8627fc84f0d2f4ec642cfb3e9a4d9884209a91f (cherry picked from commit a4772064dfb6c463eebb831563a7dd8182010cc2) --- .../biometrics/BiometricServiceBase.java | 8 +++-- .../server/biometrics/face/FaceService.java | 32 ++++++++++++------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java index 91a32f48ec9a..f3f9754bd32b 100644 --- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java +++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java @@ -912,8 +912,12 @@ public abstract class BiometricServiceBase extends SystemService } protected void setActiveUserInternal(int userId) { - // Do not put on handler, since it should finish before returning to caller. - updateActiveGroup(userId, null /* clientPackage */); + mHandler.post(() -> { + if (DEBUG) { + Slog.d(getTag(), "setActiveUser(" + userId + ")"); + } + updateActiveGroup(userId, null /* clientPackage */); + }); } protected void removeInternal(RemovalClient client) { diff --git a/services/core/java/com/android/server/biometrics/face/FaceService.java b/services/core/java/com/android/server/biometrics/face/FaceService.java index c26e53ff8583..9d51abeed114 100644 --- a/services/core/java/com/android/server/biometrics/face/FaceService.java +++ b/services/core/java/com/android/server/biometrics/face/FaceService.java @@ -611,27 +611,32 @@ public class FaceService extends BiometricServiceBase { public void resetLockout(byte[] token) { checkPermission(MANAGE_BIOMETRIC); - if (!FaceService.this.hasEnrolledBiometrics(mCurrentUserId)) { - Slog.w(TAG, "Ignoring lockout reset, no templates enrolled"); - return; - } + mHandler.post(() -> { + if (!FaceService.this.hasEnrolledBiometrics(mCurrentUserId)) { + Slog.w(TAG, "Ignoring lockout reset, no templates enrolled"); + return; + } - Slog.d(TAG, "Resetting lockout for user: " + mCurrentUserId); + Slog.d(TAG, "Resetting lockout for user: " + mCurrentUserId); - try { - mDaemonWrapper.resetLockout(token); - } catch (RemoteException e) { - Slog.e(getTag(), "Unable to reset lockout", e); - } + try { + mDaemonWrapper.resetLockout(token); + } catch (RemoteException e) { + Slog.e(getTag(), "Unable to reset lockout", e); + } + }); } @Override public void setFeature(int userId, int feature, boolean enabled, final byte[] token, IFaceServiceReceiver receiver, final String opPackageName) { checkPermission(MANAGE_BIOMETRIC); - updateActiveGroup(userId, opPackageName); mHandler.post(() -> { + if (DEBUG) { + Slog.d(TAG, "setFeature for user(" + userId + ")"); + } + updateActiveGroup(userId, opPackageName); if (!FaceService.this.hasEnrolledBiometrics(mCurrentUserId)) { Slog.e(TAG, "No enrolled biometrics while setting feature: " + feature); return; @@ -662,9 +667,12 @@ public class FaceService extends BiometricServiceBase { public void getFeature(int userId, int feature, IFaceServiceReceiver receiver, final String opPackageName) { checkPermission(MANAGE_BIOMETRIC); - updateActiveGroup(userId, opPackageName); mHandler.post(() -> { + if (DEBUG) { + Slog.d(TAG, "getFeature for user(" + userId + ")"); + } + updateActiveGroup(userId, opPackageName); // This should ideally return tri-state, but the user isn't shown settings unless // they are enrolled so it's fine for now. if (!FaceService.this.hasEnrolledBiometrics(mCurrentUserId)) { -- GitLab From 6a7029b74529471b87ab55bdcf5b02d1c19d0716 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Wed, 24 Jul 2019 18:45:42 -0700 Subject: [PATCH 453/620] Ensure BiometricDialogView dismiss animation is run postOnAnimation requests the animation be started on the next frame. The behavior is undefined if an animation is already running. Currently if this happens, the second animation is never initiated. Fixes: 138199986 Test: Modify BiometricPromptDemo to cancel authentication immediately after requesting authentication. BiometricDialogView isn't stuck anymore Change-Id: Ia62dccc2d484d1eaca5587bffa4d3def89730533 (cherry picked from commit 906bde542322caf70785191af5a9880c476c6859) --- .../biometrics/BiometricDialogView.java | 17 +++++++++++++++++ .../systemui/biometrics/FaceDialogView.java | 1 + 2 files changed, 18 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java index a5857df8ba5a..ce67577ea483 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java @@ -111,6 +111,9 @@ public abstract class BiometricDialogView extends LinearLayout { protected boolean mRequireConfirmation; private int mUserId; // used to determine if we should show work background + private boolean mCompletedAnimatingIn; + private boolean mPendingDismissDialog; + protected abstract int getHintStringResourceId(); protected abstract int getAuthenticatedAccessibilityResourceId(); protected abstract int getIconDescriptionResourceId(); @@ -332,6 +335,7 @@ public abstract class BiometricDialogView extends LinearLayout { mDialog.setAlpha(1.0f); mDialog.setTranslationY(0); mLayout.setAlpha(1.0f); + mCompletedAnimatingIn = true; } else { // Dim the background and slide the dialog up mDialog.setTranslationY(mAnimationTranslationOffset); @@ -352,6 +356,12 @@ public abstract class BiometricDialogView extends LinearLayout { } public void startDismiss() { + if (!mCompletedAnimatingIn) { + Log.w(TAG, "startDismiss(): waiting for onDialogAnimatedIn"); + mPendingDismissDialog = true; + return; + } + mAnimatingAway = true; // This is where final cleanup should occur. @@ -499,6 +509,13 @@ public abstract class BiometricDialogView extends LinearLayout { } public void onDialogAnimatedIn() { + mCompletedAnimatingIn = true; + + if (mPendingDismissDialog) { + Log.d(TAG, "onDialogAnimatedIn(): mPendingDismissDialog=true, dismissing now"); + startDismiss(); + mPendingDismissDialog = false; + } } public void restoreState(Bundle bundle) { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java index 729242e3144f..ae6cb5ce23d3 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java @@ -460,6 +460,7 @@ public class FaceDialogView extends BiometricDialogView { @Override public void onDialogAnimatedIn() { + super.onDialogAnimatedIn(); mDialogAnimatedIn = true; mIconController.startPulsing(); } -- GitLab From 5630166e4ce8c0213d57726eb7c69474ba3fa1cb Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Wed, 24 Jul 2019 16:36:14 -0700 Subject: [PATCH 454/620] Cancel show runnable when bouncer is hidden Otherwise the bouncer might report "showing soon" and future show() calls will be aborted. Test: swipe up and down, wait for face, swipe up Test: tap on notification on bouncer Test: swipe up, unlock from bouncer Test: unlock on lock screen, swipe up to dismiss bouncer Fixes: 132846921 Change-Id: I22a1af2ef903b266ae8d8fcb9eb55f6cc11aeae2 (cherry picked from commit 9b8e5e3875f1cb1081814f2ac94ac4ce0c02b24d) --- .../systemui/statusbar/phone/KeyguardBouncer.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index 40085a48a58c..c4d346ccaefb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -207,14 +207,12 @@ public class KeyguardBouncer { * @see #onFullyShown() */ private void onFullyHidden() { - if (!mShowingSoon) { - cancelShowRunnable(); - if (mRoot != null) { - mRoot.setVisibility(View.INVISIBLE); - } - mFalsingManager.onBouncerHidden(); - DejankUtils.postAfterTraversal(mResetRunnable); + cancelShowRunnable(); + if (mRoot != null) { + mRoot.setVisibility(View.INVISIBLE); } + mFalsingManager.onBouncerHidden(); + DejankUtils.postAfterTraversal(mResetRunnable); } private final Runnable mShowRunnable = new Runnable() { -- GitLab From 65c96f2fd4eadb1e61b3cf81a76254d3809f96f9 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Thu, 25 Jul 2019 20:09:04 -0700 Subject: [PATCH 455/620] Showing the notification icon properly now when the pulse is suppressed Previously the notification would be hidden so if the user would pull out the phone from the pocket, they might not see what notification actually alerted. Bug: 138336424 Test: add notification while on AOD, block prox sensor, see icon Change-Id: I8f7bd7a6a0562942ed3e12f28705043722d177e8 --- .../com/android/systemui/doze/DozeHost.java | 4 ++- .../android/systemui/doze/DozeTriggers.java | 30 ++++++++++++++----- .../collection/NotificationEntry.java | 9 ++++++ .../phone/NotificationIconAreaController.java | 5 +++- .../systemui/statusbar/phone/StatusBar.java | 11 +++++-- .../systemui/doze/DozeTriggersTest.java | 4 +-- 6 files changed, 48 insertions(+), 15 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java index ae6dac59b2f5..07dd2cd77043 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java @@ -77,8 +77,10 @@ public interface DozeHost { interface Callback { /** * Called when a high priority notification is added. + * @param onPulseSuppressedListener A listener that is invoked if the pulse is being + * supressed. */ - default void onNotificationAlerted() {} + default void onNotificationAlerted(Runnable onPulseSuppressedListener) {} /** * Called when battery state or power save mode changes. diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index 8ef01e8d608e..2ca85c074a89 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -106,22 +106,31 @@ public class DozeTriggers implements DozeMachine.Part { mDockManager = dockManager; } - private void onNotification() { + private void onNotification(Runnable onPulseSuppressedListener) { if (DozeMachine.DEBUG) { Log.d(TAG, "requestNotificationPulse"); } if (!sWakeDisplaySensorState) { Log.d(TAG, "Wake display false. Pulse denied."); + runIfNotNull(onPulseSuppressedListener); return; } mNotificationPulseTime = SystemClock.elapsedRealtime(); if (!mConfig.pulseOnNotificationEnabled(UserHandle.USER_CURRENT)) { + runIfNotNull(onPulseSuppressedListener); return; } - requestPulse(DozeLog.PULSE_REASON_NOTIFICATION, false /* performedProxCheck */); + requestPulse(DozeLog.PULSE_REASON_NOTIFICATION, false /* performedProxCheck */, + onPulseSuppressedListener); DozeLog.traceNotificationPulse(mContext); } + private static void runIfNotNull(Runnable runnable) { + if (runnable != null) { + runnable.run(); + } + } + private void proximityCheckThenCall(IntConsumer callback, boolean alreadyPerformedProxCheck, int reason) { @@ -158,10 +167,11 @@ public class DozeTriggers implements DozeMachine.Part { if (isWakeDisplay) { onWakeScreen(wakeEvent, mMachine.isExecutingTransition() ? null : mMachine.getState()); } else if (isLongPress) { - requestPulse(pulseReason, sensorPerformedProxCheck); + requestPulse(pulseReason, sensorPerformedProxCheck, null /* onPulseSupressedListener */); } else if (isWakeLockScreen) { if (wakeEvent) { - requestPulse(pulseReason, sensorPerformedProxCheck); + requestPulse(pulseReason, sensorPerformedProxCheck, + null /* onPulseSupressedListener */); } } else { proximityCheckThenCall((result) -> { @@ -340,7 +350,8 @@ public class DozeTriggers implements DozeMachine.Part { } } - private void requestPulse(final int reason, boolean performedProxCheck) { + private void requestPulse(final int reason, boolean performedProxCheck, + Runnable onPulseSuppressedListener) { Assert.isMainThread(); mDozeHost.extendPulse(reason); @@ -357,6 +368,7 @@ public class DozeTriggers implements DozeMachine.Part { DozeLog.tracePulseDropped(mContext, mPulsePending, mMachine.getState(), mDozeHost.isPulsingBlocked()); } + runIfNotNull(onPulseSuppressedListener); return; } @@ -365,6 +377,7 @@ public class DozeTriggers implements DozeMachine.Part { if (result == ProximityCheck.RESULT_NEAR) { // in pocket, abort pulse mPulsePending = false; + runIfNotNull(onPulseSuppressedListener); } else { // not in pocket, continue pulsing continuePulseRequest(reason); @@ -482,7 +495,8 @@ public class DozeTriggers implements DozeMachine.Part { public void onReceive(Context context, Intent intent) { if (PULSE_ACTION.equals(intent.getAction())) { if (DozeMachine.DEBUG) Log.d(TAG, "Received pulse intent"); - requestPulse(DozeLog.PULSE_REASON_INTENT, false /* performedProxCheck */); + requestPulse(DozeLog.PULSE_REASON_INTENT, false, /* performedProxCheck */ + null /* onPulseSupressedListener */); } if (UiModeManager.ACTION_ENTER_CAR_MODE.equals(intent.getAction())) { mMachine.requestState(DozeMachine.State.FINISH); @@ -532,8 +546,8 @@ public class DozeTriggers implements DozeMachine.Part { private DozeHost.Callback mHostCallback = new DozeHost.Callback() { @Override - public void onNotificationAlerted() { - onNotification(); + public void onNotificationAlerted(Runnable onPulseSuppressedListener) { + onNotification(onPulseSuppressedListener); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index b19d2ca29c96..3c4f6afdabf8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -176,6 +176,7 @@ public final class NotificationEntry { private boolean mSensitive = true; private Runnable mOnSensitiveChangedListener; private boolean mAutoHeadsUp; + private boolean mPulseSupressed; public NotificationEntry(StatusBarNotification n) { this(n, null); @@ -900,6 +901,14 @@ public final class NotificationEntry { mOnSensitiveChangedListener = listener; } + public boolean isPulseSuppressed() { + return mPulseSupressed; + } + + public void setPulseSuppressed(boolean suppressed) { + mPulseSupressed = suppressed; + } + /** Information about a suggestion that is being edited. */ public static class EditedSuggestionInfo { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index 21de8a59836e..ba3406999388 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -78,6 +78,7 @@ public class NotificationIconAreaController implements DarkReceiver, private int mAodIconTint; private boolean mFullyHidden; private boolean mAodIconsVisible; + private boolean mIsPulsing; public NotificationIconAreaController(Context context, StatusBar statusBar, StatusBarStateController statusBarStateController, @@ -265,7 +266,9 @@ public class NotificationIconAreaController implements DarkReceiver, if (!showAmbient && entry.shouldSuppressStatusBar()) { return false; } - if (hidePulsing && entry.showingPulsing()) { + if (hidePulsing && entry.showingPulsing() + && (!mWakeUpCoordinator.getNotificationsFullyHidden() + || !entry.isPulseSuppressed())) { return false; } return true; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index d93dc950a077..aefb79c22ef1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1578,7 +1578,8 @@ public class StatusBar extends SystemUI implements DemoMode, public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) { mEntryManager.updateNotifications(); if (isDozing() && isHeadsUp) { - mDozeServiceHost.fireNotificationPulse(); + entry.setPulseSuppressed(false); + mDozeServiceHost.fireNotificationPulse(entry); if (mPulsing) { mDozeScrimController.cancelPendingPulseTimeout(); } @@ -3920,9 +3921,13 @@ public class StatusBar extends SystemUI implements DemoMode, } } - public void fireNotificationPulse() { + public void fireNotificationPulse(NotificationEntry entry) { + Runnable pulseSupressedListener = () -> { + entry.setPulseSuppressed(true); + mNotificationIconAreaController.updateAodNotificationIcons(); + }; for (Callback callback : mCallbacks) { - callback.onNotificationAlerted(); + callback.onNotificationAlerted(pulseSupressedListener); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java index eb8ef09d0635..d4642238d8fd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java @@ -95,13 +95,13 @@ public class DozeTriggersTest extends SysuiTestCase { mTriggers.transitionTo(DozeMachine.State.INITIALIZED, DozeMachine.State.DOZE); clearInvocations(mMachine); - mHost.callback.onNotificationAlerted(); + mHost.callback.onNotificationAlerted(null /* pulseSuppressedListener */); mSensors.getMockProximitySensor().sendProximityResult(false); /* Near */ verify(mMachine, never()).requestState(any()); verify(mMachine, never()).requestPulse(anyInt()); - mHost.callback.onNotificationAlerted(); + mHost.callback.onNotificationAlerted(null /* pulseSuppressedListener */); mSensors.getMockProximitySensor().sendProximityResult(true); /* Far */ verify(mMachine).requestPulse(anyInt()); -- GitLab From 81cdfa4a82f5fc9450d20d3bfa91bcadf01ac371 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Thu, 25 Jul 2019 20:28:28 -0700 Subject: [PATCH 456/620] Show bouncer when unlocking and not interactive We cannot dismiss the bouncer when the device cannot be unlocked, otherwise we'll be stuck looking since gatekeeper is not unlocked. Test: face auth from AOD2 encrypted Test: face auth from lock screen encrypted Test: face auth from AOD2 Test: atest BiometricsUnlockControllerTest Fixes: 138093575 Change-Id: I5c5b89ee9fa1a10cedceaf1ab227e26910beed2a --- .../statusbar/phone/BiometricUnlockController.java | 10 +++++----- .../phone/BiometricsUnlockControllerTest.java | 10 ++++++++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 94cd2cdaa9d3..41c6a7ba7848 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -445,14 +445,13 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { if (!mUpdateMonitor.isDeviceInteractive()) { if (!mStatusBarKeyguardViewManager.isShowing()) { return bypass ? MODE_WAKE_AND_UNLOCK : MODE_ONLY_WAKE; - } else if (mDozeScrimController.isPulsing() && unlockingAllowed) { + } else if (!unlockingAllowed) { + return bypass ? MODE_SHOW_BOUNCER : MODE_NONE; + } else if (mDozeScrimController.isPulsing()) { // Let's not wake-up to lock screen when not bypassing, otherwise the notification // would move as the user tried to tap it. return bypass ? MODE_WAKE_AND_UNLOCK_PULSING : MODE_NONE; } else { - if (!(mDozeScrimController.isPulsing() && !unlockingAllowed)) { - Log.wtf(TAG, "Face somehow arrived when the device was not interactive"); - } if (bypass) { // Wake-up fading out nicely return MODE_WAKE_AND_UNLOCK_PULSING; @@ -530,7 +529,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { mStatusBar.notifyBiometricAuthModeChanged(); } - private final WakefulnessLifecycle.Observer mWakefulnessObserver = + @VisibleForTesting + final WakefulnessLifecycle.Observer mWakefulnessObserver = new WakefulnessLifecycle.Observer() { @Override public void onFinishedWakingUp() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java index 4a41349ca195..fd676111b1da 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java @@ -161,6 +161,7 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { @Test public void onBiometricAuthenticated_whenFace_andBypass_encrypted_showBouncer() { + reset(mUpdateMonitor); when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true); mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); @@ -168,11 +169,18 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT, BiometricSourceType.FACE); + // Wake up before showing the bouncer + verify(mStatusBarKeyguardViewManager, never()).showBouncer(eq(false)); + mBiometricUnlockController.mWakefulnessObserver.onFinishedWakingUp(); + verify(mStatusBarKeyguardViewManager).showBouncer(eq(false)); + assertThat(mBiometricUnlockController.getMode()) + .isEqualTo(BiometricUnlockController.MODE_SHOW_BOUNCER); } @Test public void onBiometricAuthenticated_whenFace_noBypass_encrypted_doNothing() { + reset(mUpdateMonitor); mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(false); @@ -181,6 +189,8 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { verify(mStatusBarKeyguardViewManager, never()).showBouncer(anyBoolean()); verify(mStatusBarKeyguardViewManager, never()).animateCollapsePanels(anyFloat()); + assertThat(mBiometricUnlockController.getMode()) + .isEqualTo(BiometricUnlockController.MODE_NONE); } @Test -- GitLab From 0e17480b1f15635aa9ed05e662deb0aba855bdfa Mon Sep 17 00:00:00 2001 From: Ahan Wu Date: Tue, 23 Jul 2019 20:41:52 +0800 Subject: [PATCH 457/620] Only supports ambient mode when necessary. We only need support ambient mode on specified devices but we currently enable this attribute on all devices, that means we need redraw every time when ambient mode changes. However, we can just show / hide wallpaper window on the devices which not support ambient transition. In addition, always use portrait dimension as scissor area since we only do transition in portrait. Bug: 138021396 Bug: 137962047 Test: Manually test on F2, C1, B4, S4 and walleye. Test: Set an image wallpaper, switch between home, aod and lockscreen. Test: Also use finger print to unlock from aod to home directly. Test: Rotate to landscape, set a new image wallpaper. Test: Switch between home, aod and lockscreen. Change-Id: I36dd49363e81df5a260b10695d90aa9d8c70a45a --- .../com/android/systemui/ImageWallpaper.java | 8 ++--- .../glwallpaper/ImageRevealHelper.java | 17 +++++----- .../glwallpaper/ImageWallpaperRenderer.java | 32 +++++++++++++------ .../systemui/statusbar/phone/StatusBar.java | 5 ++- 4 files changed, 38 insertions(+), 24 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java index c9d4957494e4..bd91333100bd 100644 --- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java @@ -47,7 +47,7 @@ public class ImageWallpaper extends WallpaperService { // This is to avoid destroying then recreating render context in a very short time. private static final int DELAY_FINISH_RENDERING = 1000; private static final int INTERVAL_WAIT_FOR_RENDERING = 100; - private static final int PATIENCE_WAIT_FOR_RENDERING = 5; + private static final int PATIENCE_WAIT_FOR_RENDERING = 10; private HandlerThread mWorker; @Override @@ -124,10 +124,10 @@ public class ImageWallpaper extends WallpaperService { @Override public void onAmbientModeChanged(boolean inAmbientMode, long animationDuration) { - long duration = mNeedTransition || animationDuration != 0 ? animationDuration : 0; + if (!mNeedTransition) return; mWorker.getThreadHandler().post( - () -> mRenderer.updateAmbientMode(inAmbientMode, duration)); - if (inAmbientMode && duration == 0) { + () -> mRenderer.updateAmbientMode(inAmbientMode, animationDuration)); + if (inAmbientMode && animationDuration == 0) { // This means that we are transiting from home to aod, to avoid // race condition between window visibility and transition, // we don't return until the transition is finished. See b/136643341. diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java index 45e97b38d87e..b154e66a846e 100644 --- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java +++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java @@ -65,7 +65,7 @@ class ImageRevealHelper { @Override public void onAnimationStart(Animator animation) { if (mRevealListener != null) { - mRevealListener.onRevealStart(); + mRevealListener.onRevealStart(true /* animate */); } } }); @@ -73,7 +73,7 @@ class ImageRevealHelper { private void animate() { mAnimator.cancel(); - mAnimator.setFloatValues(mReveal, !mAwake ? MIN_REVEAL : MAX_REVEAL); + mAnimator.setFloatValues(mReveal, mAwake ? MAX_REVEAL : MIN_REVEAL); mAnimator.start(); } @@ -84,12 +84,11 @@ class ImageRevealHelper { void updateAwake(boolean awake, long duration) { mAwake = awake; mAnimator.setDuration(duration); - if (!mAwake && duration == 0) { - // We are transiting from home to aod, - // since main thread is waiting for rendering finished, we only need draw - // the last state directly, which is a black screen. - mReveal = MIN_REVEAL; - mRevealListener.onRevealStart(); + if (duration == 0) { + // We are transiting from home to aod or aod to home directly, + // we don't need to do transition in these cases. + mReveal = mAwake ? MAX_REVEAL : MIN_REVEAL; + mRevealListener.onRevealStart(false /* animate */); mRevealListener.onRevealStateChanged(); mRevealListener.onRevealEnd(); } else { @@ -110,7 +109,7 @@ class ImageRevealHelper { /** * Called back while reveal starts. */ - void onRevealStart(); + void onRevealStart(boolean animate); /** * Called back while reveal ends. diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java index 93d8dd6146a6..7b22a49fc88a 100644 --- a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java +++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java @@ -24,6 +24,7 @@ import static android.opengl.GLES20.glViewport; import android.app.WallpaperManager; import android.content.Context; +import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Rect; import android.util.Log; @@ -70,7 +71,14 @@ public class ImageWallpaperRenderer implements GLWallpaperRenderer, DisplayInfo displayInfo = new DisplayInfo(); WindowManager wm = context.getSystemService(WindowManager.class); wm.getDefaultDisplay().getDisplayInfo(displayInfo); - mScissor = new Rect(0, 0, displayInfo.logicalWidth, displayInfo.logicalHeight); + + // We only do transition in portrait currently, b/137962047. + int orientation = context.getResources().getConfiguration().orientation; + if (orientation == Configuration.ORIENTATION_PORTRAIT) { + mScissor = new Rect(0, 0, displayInfo.logicalWidth, displayInfo.logicalHeight); + } else { + mScissor = new Rect(0, 0, displayInfo.logicalHeight, displayInfo.logicalWidth); + } mProxy = proxy; mProgram = new ImageGLProgram(context); @@ -179,20 +187,24 @@ public class ImageWallpaperRenderer implements GLWallpaperRenderer, } @Override - public void onRevealStart() { - mScissorMode = true; - // Use current display area of texture. - mWallpaper.adjustTextureCoordinates(mSurfaceSize, mScissor, mXOffset, mYOffset); + public void onRevealStart(boolean animate) { + if (animate) { + mScissorMode = true; + // Use current display area of texture. + mWallpaper.adjustTextureCoordinates(mSurfaceSize, mScissor, mXOffset, mYOffset); + } mProxy.preRender(); } @Override public void onRevealEnd() { - mScissorMode = false; - // reset texture coordinates to use full texture. - mWallpaper.adjustTextureCoordinates(null, null, 0, 0); - // We need draw full texture back before finishing render. - mProxy.requestRender(); + if (mScissorMode) { + mScissorMode = false; + // reset texture coordinates to use full texture. + mWallpaper.adjustTextureCoordinates(null, null, 0, 0); + // We need draw full texture back before finishing render. + mProxy.requestRender(); + } mProxy.postRender(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 7d6799bf638e..c6de829e49be 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -482,9 +482,12 @@ public class StatusBar extends SystemUI implements DemoMode, WallpaperInfo info = wallpaperManager.getWallpaperInfo(UserHandle.USER_CURRENT); final boolean deviceSupportsAodWallpaper = mContext.getResources().getBoolean( com.android.internal.R.bool.config_dozeSupportsAodWallpaper); + final boolean imageWallpaperInAmbient = + !DozeParameters.getInstance(mContext).getDisplayNeedsBlanking(); // If WallpaperInfo is null, it must be ImageWallpaper. final boolean supportsAmbientMode = deviceSupportsAodWallpaper - && (info == null || info.supportsAmbientMode()); + && ((info == null && imageWallpaperInAmbient) + || (info != null && info.supportsAmbientMode())); mStatusBarWindowController.setWallpaperSupportsAmbientMode(supportsAmbientMode); mScrimController.setWallpaperSupportsAmbientMode(supportsAmbientMode); -- GitLab From e6feb7d19842c3fe0c3f45a4ddfdc430fa822ee1 Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Thu, 25 Jul 2019 20:29:07 +0200 Subject: [PATCH 458/620] GestureNav: Clarify javadoc in regards to exclusion limits Bug: 124518180 Test: m checkapi Change-Id: I43b0b890a763e339deb246cabf9adbf011eae088 --- core/java/android/view/View.java | 7 +++++++ core/java/android/view/WindowInsets.java | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index bf6191ec61eb..a8bce62b3b1e 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -10556,6 +10556,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * *

Do not modify the provided list after this method is called.

* + *

Note: the system will put a limit of 200dp on the vertical extent of the + * exclusions it takes into account. The limit does not apply while the navigation + * bar is {@link #SYSTEM_UI_FLAG_IMMERSIVE_STICKY stickily} hidden, nor to the + * {@link android.inputmethodservice.InputMethodService input method} and + * {@link Intent#CATEGORY_HOME home activity}. + *

+ * * @param rects A list of precision gesture regions that this view needs to function correctly */ public void setSystemGestureExclusionRects(@NonNull List rects) { diff --git a/core/java/android/view/WindowInsets.java b/core/java/android/view/WindowInsets.java index 9340b71a5280..bcc6a552f569 100644 --- a/core/java/android/view/WindowInsets.java +++ b/core/java/android/view/WindowInsets.java @@ -35,6 +35,7 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UnsupportedAppUsage; +import android.content.Intent; import android.graphics.Insets; import android.graphics.Rect; import android.util.SparseArray; @@ -644,6 +645,14 @@ public final class WindowInsets { * {@link View#setSystemGestureExclusionRects} outside of the * {@link #getMandatorySystemGestureInsets() mandatory system gesture insets}. * + *

Note: the system will put a limit of 200dp on the vertical extent of the + * exclusions it takes into account. The limit does not apply while the navigation + * bar is {@link View#SYSTEM_UI_FLAG_IMMERSIVE_STICKY stickily} hidden, nor to the + * {@link android.inputmethodservice.InputMethodService input method} and + * {@link Intent#CATEGORY_HOME home activity}. + *

+ * + * *

Simple taps are guaranteed to reach the window even within the system gesture insets, * as long as they are outside the {@link #getTappableElementInsets() system window insets}. * -- GitLab From 3c4a8e48d404649bd03ee8e6e377dcf9a65afee9 Mon Sep 17 00:00:00 2001 From: Beth Thibodeau Date: Thu, 25 Jul 2019 16:42:51 -0400 Subject: [PATCH 459/620] Stop timer when notification isn't visible Fixes: 138261464 Test: manual, atest com.android.systemui.statusbar.notification.row.wrapper.NotificationMediaTemplateViewWrapperTest Change-Id: Id7b1b586f3ab258fad8670070240ef951080c969 --- .../widget/MediaNotificationView.java | 47 +++++++++++++++++++ .../NotificationMediaTemplateViewWrapper.java | 47 +++++++++++++++---- 2 files changed, 86 insertions(+), 8 deletions(-) diff --git a/core/java/com/android/internal/widget/MediaNotificationView.java b/core/java/com/android/internal/widget/MediaNotificationView.java index e7d240a1035e..0d87afa42e3e 100644 --- a/core/java/com/android/internal/widget/MediaNotificationView.java +++ b/core/java/com/android/internal/widget/MediaNotificationView.java @@ -26,6 +26,8 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.RemoteViews; +import java.util.ArrayList; + /** * A TextView that can float around an image on the end. * @@ -42,6 +44,7 @@ public class MediaNotificationView extends FrameLayout { private View mMainColumn; private View mMediaContent; private int mImagePushIn; + private ArrayList mListeners; public MediaNotificationView(Context context) { this(context, null); @@ -168,4 +171,48 @@ public class MediaNotificationView extends FrameLayout { mMainColumn = findViewById(com.android.internal.R.id.notification_main_column); mMediaContent = findViewById(com.android.internal.R.id.notification_media_content); } + + @Override + public void onVisibilityAggregated(boolean isVisible) { + super.onVisibilityAggregated(isVisible); + for (int i = 0; i < mListeners.size(); i++) { + mListeners.get(i).onAggregatedVisibilityChanged(isVisible); + } + } + + /** + * Add a listener to receive updates on the visibility of this view + * + * @param listener The listener to add. + */ + public void addVisibilityListener(VisibilityChangeListener listener) { + if (mListeners == null) { + mListeners = new ArrayList<>(); + } + if (!mListeners.contains(listener)) { + mListeners.add(listener); + } + } + + /** + * Remove the specified listener + * + * @param listener The listener to remove. + */ + public void removeVisibilityListener(VisibilityChangeListener listener) { + if (mListeners != null) { + mListeners.remove(listener); + } + } + + /** + * Interface for receiving updates when the view's visibility changes + */ + public interface VisibilityChangeListener { + /** + * Method called when the visibility of this view has changed + * @param isVisible true if the view is now visible + */ + void onAggregatedVisibilityChanged(boolean isVisible); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java index 20e8b733ce6a..38f9bff2a63f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java @@ -39,6 +39,7 @@ import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.internal.widget.MediaNotificationView; import com.android.systemui.Dependency; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.TransformableView; @@ -67,6 +68,7 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi private View mSeekBarView; private Context mContext; private MetricsLogger mMetricsLogger; + private boolean mIsViewVisible; @VisibleForTesting protected SeekBar.OnSeekBarChangeListener mSeekListener = @@ -88,11 +90,33 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi } }; + MediaNotificationView.VisibilityChangeListener mVisibilityListener = + new MediaNotificationView.VisibilityChangeListener() { + @Override + public void onAggregatedVisibilityChanged(boolean isVisible) { + mIsViewVisible = isVisible; + if (isVisible) { + // Restart timer if we're currently playing and didn't already have one going + PlaybackState state = mMediaController.getPlaybackState(); + if (state != null && state.getState() == PlaybackState.STATE_PLAYING + && mSeekBarTimer == null && mSeekBarView != null + && mSeekBarView.getVisibility() != View.GONE) { + startTimer(); + } + } else { + clearTimer(); + } + } + }; + private MediaController.Callback mMediaCallback = new MediaController.Callback() { @Override public void onSessionDestroyed() { clearTimer(); mMediaController.unregisterCallback(this); + if (mView instanceof MediaNotificationView) { + ((MediaNotificationView) mView).removeVisibilityListener(mVisibilityListener); + } } @Override @@ -126,10 +150,16 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi mContext = ctx; mMediaManager = Dependency.get(NotificationMediaManager.class); mMetricsLogger = Dependency.get(MetricsLogger.class); + + if (mView instanceof MediaNotificationView) { + MediaNotificationView mediaView = (MediaNotificationView) mView; + mediaView.addVisibilityListener(mVisibilityListener); + } } private void resolveViews() { mActions = mView.findViewById(com.android.internal.R.id.media_actions); + mIsViewVisible = mView.isShown(); final MediaSession.Token token = mRow.getEntry().notification.getNotification().extras .getParcelable(Notification.EXTRA_MEDIA_SESSION); @@ -208,18 +238,19 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi private void startTimer() { clearTimer(); - mSeekBarTimer = new Timer(true /* isDaemon */); - mSeekBarTimer.schedule(new TimerTask() { - @Override - public void run() { - mHandler.post(mOnUpdateTimerTick); - } - }, 0, PROGRESS_UPDATE_INTERVAL); + if (mIsViewVisible) { + mSeekBarTimer = new Timer(true /* isDaemon */); + mSeekBarTimer.schedule(new TimerTask() { + @Override + public void run() { + mHandler.post(mOnUpdateTimerTick); + } + }, 0, PROGRESS_UPDATE_INTERVAL); + } } private void clearTimer() { if (mSeekBarTimer != null) { - // TODO: also trigger this when the notification panel is collapsed mSeekBarTimer.cancel(); mSeekBarTimer.purge(); mSeekBarTimer = null; -- GitLab From bc0f406751662318e2ed4d5811cc9937badd19d1 Mon Sep 17 00:00:00 2001 From: atrost Date: Wed, 24 Jul 2019 14:12:48 +0100 Subject: [PATCH 460/620] Read compat config in CompatConfig class. Use the auto generated parser, and test by feeding streams of XML. Test: atest FrameworksServicesTests Bug: 138222871 Change-Id: Id523d31e7b6d2def9371753ae34cba883cd62a54 --- services/core/Android.bp | 3 +- .../android/server/compat/CompatChange.java | 12 ++++ .../android/server/compat/CompatConfig.java | 45 +++++++++++- services/tests/servicestests/Android.bp | 1 + .../server/compat/CompatConfigTest.java | 70 +++++++++++++++++++ 5 files changed, 129 insertions(+), 2 deletions(-) diff --git a/services/core/Android.bp b/services/core/Android.bp index 9518196c40df..474dbfe49d70 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -20,6 +20,7 @@ java_library_static { ":storaged_aidl", ":vold_aidl", ":gsiservice_aidl", + ":platform-compat-config", "java/com/android/server/EventLogTags.logtags", "java/com/android/server/am/EventLogTags.logtags", "java/com/android/server/policy/EventLogTags.logtags", @@ -88,4 +89,4 @@ filegroup { "java/com/android/server/compat/IPlatformCompat.aidl", ], path: "java", -} \ No newline at end of file +} diff --git a/services/core/java/com/android/server/compat/CompatChange.java b/services/core/java/com/android/server/compat/CompatChange.java index 2a866f390283..6f32beea66d3 100644 --- a/services/core/java/com/android/server/compat/CompatChange.java +++ b/services/core/java/com/android/server/compat/CompatChange.java @@ -20,6 +20,8 @@ import android.annotation.Nullable; import android.compat.annotation.EnabledAfter; import android.content.pm.ApplicationInfo; +import com.android.server.compat.config.Change; + import java.util.HashMap; import java.util.Map; @@ -60,6 +62,16 @@ public final class CompatChange { mDisabled = disabled; } + /** + * @param change an object generated by services/core/xsd/platform-compat-config.xsd + */ + public CompatChange(Change change) { + mChangeId = change.getId(); + mName = change.getName(); + mEnableAfterTargetSdk = change.getEnableAfterTargetSdk(); + mDisabled = change.getDisabled(); + } + long getId() { return mChangeId; } diff --git a/services/core/java/com/android/server/compat/CompatConfig.java b/services/core/java/com/android/server/compat/CompatConfig.java index c59b0652af15..044e41789bb2 100644 --- a/services/core/java/com/android/server/compat/CompatConfig.java +++ b/services/core/java/com/android/server/compat/CompatConfig.java @@ -17,14 +17,27 @@ package com.android.server.compat; import android.content.pm.ApplicationInfo; +import android.os.Environment; import android.text.TextUtils; import android.util.LongArray; import android.util.LongSparseArray; +import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; +import com.android.server.compat.config.Change; +import com.android.server.compat.config.XmlParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; import java.io.PrintWriter; + +import javax.xml.datatype.DatatypeConfigurationException; /** * This class maintains state relating to platform compatibility changes. * @@ -33,7 +46,12 @@ import java.io.PrintWriter; */ public final class CompatConfig { - private static final CompatConfig sInstance = new CompatConfig(); + private static final String TAG = "CompatConfig"; + private static final String CONFIG_FILE_SUFFIX = "platform_compat_config.xml"; + + private static final CompatConfig sInstance = new CompatConfig().initConfigFromLib( + Environment.buildPath( + Environment.getRootDirectory(), "etc", "sysconfig")); @GuardedBy("mChanges") private final LongSparseArray mChanges = new LongSparseArray<>(); @@ -188,4 +206,29 @@ public final class CompatConfig { } } + CompatConfig initConfigFromLib(File libraryDir) { + if (!libraryDir.exists() || !libraryDir.isDirectory()) { + Slog.e(TAG, "No directory " + libraryDir + ", skipping"); + return this; + } + for (File f : libraryDir.listFiles()) { + //TODO(b/138222363): Handle duplicate ids across config files. + if (f.getPath().endsWith(CONFIG_FILE_SUFFIX)) { + readConfig(f); + } + } + return this; + } + + private void readConfig(File configFile) { + try (InputStream in = new BufferedInputStream(new FileInputStream(configFile))) { + for (Change change : XmlParser.read(in).getCompatChange()) { + Slog.w(TAG, "Adding: " + change.toString()); + addChange(new CompatChange(change)); + } + } catch (IOException | DatatypeConfigurationException | XmlPullParserException e) { + Slog.e(TAG, "Encountered an error while reading/parsing compat config file", e); + } + } + } diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp index 869913dec646..0614b3a40cb2 100644 --- a/services/tests/servicestests/Android.bp +++ b/services/tests/servicestests/Android.bp @@ -39,6 +39,7 @@ android_test { "platformprotosnano", "hamcrest-library", "servicestests-utils", + "xml-writer-device-lib", ], aidl: { diff --git a/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java b/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java index d008ca66b762..f3c5e99f5f90 100644 --- a/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java +++ b/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java @@ -22,9 +22,17 @@ import android.content.pm.ApplicationInfo; import androidx.test.runner.AndroidJUnit4; +import com.android.compat.annotation.Change; +import com.android.compat.annotation.XmlWriter; + import org.junit.Test; import org.junit.runner.RunWith; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.UUID; + @RunWith(AndroidJUnit4.class) public class CompatConfigTest { @@ -35,6 +43,27 @@ public class CompatConfigTest { return ai; } + private File createTempDir() { + String base = System.getProperty("java.io.tmpdir"); + File dir = new File(base, UUID.randomUUID().toString()); + assertThat(dir.mkdirs()).isTrue(); + return dir; + } + + private void writeChangesToFile(Change[] changes, File f) { + XmlWriter writer = new XmlWriter(); + for (Change change: changes) { + writer.addChange(change); + } + try { + f.createNewFile(); + writer.write(new FileOutputStream(f)); + } catch (IOException e) { + throw new RuntimeException( + "Encountered an error while writing compat config file", e); + } + } + @Test public void testUnknownChangeEnabled() { CompatConfig pc = new CompatConfig(); @@ -170,4 +199,45 @@ public class CompatConfigTest { sysApp.flags |= ApplicationInfo.FLAG_SYSTEM; assertThat(pc.isChangeEnabled(1234L, sysApp)).isTrue(); } + + @Test + public void testReadConfig() { + Change[] changes = {new Change(1234L, "MY_CHANGE1", false, 2), new Change(1235L, + "MY_CHANGE2", true, null), new Change(1236L, "MY_CHANGE3", false, null)}; + + File dir = createTempDir(); + writeChangesToFile(changes, new File(dir.getPath() + "/platform_compat_config.xml")); + + CompatConfig pc = new CompatConfig(); + pc.initConfigFromLib(dir); + + assertThat(pc.isChangeEnabled(1234L, makeAppInfo("com.some.package", 1))).isFalse(); + assertThat(pc.isChangeEnabled(1234L, makeAppInfo("com.some.package", 3))).isTrue(); + assertThat(pc.isChangeEnabled(1235L, makeAppInfo("com.some.package", 5))).isFalse(); + assertThat(pc.isChangeEnabled(1236L, makeAppInfo("com.some.package", 1))).isTrue(); + } + + @Test + public void testReadConfigMultipleFiles() { + Change[] changes1 = {new Change(1234L, "MY_CHANGE1", false, 2)}; + Change[] changes2 = {new Change(1235L, "MY_CHANGE2", true, null), new Change(1236L, + "MY_CHANGE3", false, null)}; + + File dir = createTempDir(); + writeChangesToFile(changes1, + new File(dir.getPath() + "/libcore_platform_compat_config.xml")); + writeChangesToFile(changes2, + new File(dir.getPath() + "/frameworks_platform_compat_config.xml")); + + + CompatConfig pc = new CompatConfig(); + pc.initConfigFromLib(dir); + + assertThat(pc.isChangeEnabled(1234L, makeAppInfo("com.some.package", 1))).isFalse(); + assertThat(pc.isChangeEnabled(1234L, makeAppInfo("com.some.package", 3))).isTrue(); + assertThat(pc.isChangeEnabled(1235L, makeAppInfo("com.some.package", 5))).isFalse(); + assertThat(pc.isChangeEnabled(1236L, makeAppInfo("com.some.package", 1))).isTrue(); + } } + + -- GitLab From acad244c70ca74d25d4e0d2bc7b738e7b5fa6356 Mon Sep 17 00:00:00 2001 From: Hongwei Wang Date: Wed, 24 Jul 2019 11:23:57 -0700 Subject: [PATCH 461/620] Allow resume of parent activity that launches PiP For an application that - Targets pre-Q - Launches activity A which goes into PiP mode from activity B We prevents launching activity B from recents since we only allow top-most visible activities for pre-Q app. The restriction is first introduced in ag/6077827 Bug: 137085496 Test: Launch parent activity of PiP from recents Test: atest ActivityLifecyclePipTests Test: atest ActivityLifecycleSplitScreenTests Test: atest WindowProcessControllerTests Change-Id: I3a4a2c874e401a6d278d1b1b8b3fb5ee8548b8c7 --- .../android/server/wm/WindowProcessController.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index bc5e32823547..b6960f0d1fe6 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -565,7 +565,8 @@ public class WindowProcessController extends ConfigurationContainer= Q || mPreQTopResumedActivity == activity) { @@ -581,9 +582,13 @@ public class WindowProcessController extends ConfigurationContainer Date: Fri, 26 Jul 2019 17:14:01 +0000 Subject: [PATCH 462/620] Revert "SharedMemory: clear file descriptor when explicitly closed." Bug: 138422309 This reverts commit 20ab1e34273aa179053f5dc93e70c0191a39e91b. Reason for revert: crashes documented in b/138422309 Change-Id: Ic9e33fdb24bad2b30f0eb357d6752c1834df41d5 --- core/java/android/os/SharedMemory.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/java/android/os/SharedMemory.java b/core/java/android/os/SharedMemory.java index 0540e3611b52..3e2ba3d3115f 100644 --- a/core/java/android/os/SharedMemory.java +++ b/core/java/android/os/SharedMemory.java @@ -259,9 +259,6 @@ public final class SharedMemory implements Parcelable, Closeable { mCleaner.clean(); mCleaner = null; } - - // Cleaner.clean doesn't clear the value of the file descriptor. - mFileDescriptor.setInt$(-1); } @Override -- GitLab From b16411f83aee0847fec77d79fb4e98b2e3fa8828 Mon Sep 17 00:00:00 2001 From: Adam Seaton Date: Fri, 26 Jul 2019 17:13:18 +0000 Subject: [PATCH 463/620] Revert "SharedMemory: break Cleaner reference cycle." Bug: 138422309 This reverts commit 390d9e6a1806626eb521d55a36b1578d28714cc8. Reason for revert: crashes documented in b/138422309 Change-Id: I235f727d0fe87c09f6f05dddcae7759bab64dfd8 --- core/java/android/os/SharedMemory.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/core/java/android/os/SharedMemory.java b/core/java/android/os/SharedMemory.java index 3e2ba3d3115f..57a88012a31a 100644 --- a/core/java/android/os/SharedMemory.java +++ b/core/java/android/os/SharedMemory.java @@ -62,7 +62,7 @@ public final class SharedMemory implements Parcelable, Closeable { mMemoryRegistration = new MemoryRegistration(mSize); mCleaner = Cleaner.create(mFileDescriptor, - new Closer(mFileDescriptor.getInt$(), mMemoryRegistration)); + new Closer(mFileDescriptor, mMemoryRegistration)); } /** @@ -290,10 +290,10 @@ public final class SharedMemory implements Parcelable, Closeable { * Cleaner that closes the FD */ private static final class Closer implements Runnable { - private int mFd; + private FileDescriptor mFd; private MemoryRegistration mMemoryReference; - private Closer(int fd, MemoryRegistration memoryReference) { + private Closer(FileDescriptor fd, MemoryRegistration memoryReference) { mFd = fd; mMemoryReference = memoryReference; } @@ -301,9 +301,7 @@ public final class SharedMemory implements Parcelable, Closeable { @Override public void run() { try { - FileDescriptor fd = new FileDescriptor(); - fd.setInt$(mFd); - Os.close(fd); + Os.close(mFd); } catch (ErrnoException e) { /* swallow error */ } mMemoryReference.release(); mMemoryReference = null; -- GitLab From fb649853f9e297e8a4b13a471c09431ca69e7b97 Mon Sep 17 00:00:00 2001 From: Miguel de Dios Date: Tue, 23 Jul 2019 13:50:10 -0700 Subject: [PATCH 464/620] oomAdjuster: Change default demotion of renderthreads to default graphics priority Bug: 137118936 Test: manual - continuously maximize/minimize app and take traces Change-Id: I9980d93f18132fa4a5653ceb68a2b482f95a22b1 --- .../core/java/com/android/server/am/OomAdjuster.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index bcfe71b82a6a..dbf8acf74dbd 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -34,6 +34,7 @@ import static android.os.Process.THREAD_GROUP_BG_NONINTERACTIVE; import static android.os.Process.THREAD_GROUP_DEFAULT; import static android.os.Process.THREAD_GROUP_RESTRICTED; import static android.os.Process.THREAD_GROUP_TOP_APP; +import static android.os.Process.THREAD_PRIORITY_DISPLAY; import static android.os.Process.setProcessGroup; import static android.os.Process.setThreadPriority; import static android.os.Process.setThreadScheduler; @@ -1803,7 +1804,6 @@ public final class OomAdjuster { if (app.renderThreadTid != 0) { setThreadScheduler(app.renderThreadTid, SCHED_OTHER, 0); - setThreadPriority(app.renderThreadTid, -4); } } catch (IllegalArgumentException e) { Slog.w(TAG, @@ -1815,9 +1815,10 @@ public final class OomAdjuster { } else { // Reset priority for top app UI and render threads setThreadPriority(app.pid, 0); - if (app.renderThreadTid != 0) { - setThreadPriority(app.renderThreadTid, 0); - } + } + + if (app.renderThreadTid != 0) { + setThreadPriority(app.renderThreadTid, THREAD_PRIORITY_DISPLAY); } } } catch (Exception e) { -- GitLab From 1364df709e5a2179f76787813ca2c78ae9687b40 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Thu, 25 Jul 2019 20:28:28 -0700 Subject: [PATCH 465/620] Show bouncer when unlocking and not interactive We cannot dismiss the bouncer when the device cannot be unlocked, otherwise we'll be stuck looking since gatekeeper is not unlocked. Test: face auth from AOD2 encrypted Test: face auth from lock screen encrypted Test: face auth from AOD2 Test: atest BiometricsUnlockControllerTest Fixes: 138093575 Change-Id: I5c5b89ee9fa1a10cedceaf1ab227e26910beed2a (cherry picked from commit 81cdfa4a82f5fc9450d20d3bfa91bcadf01ac371) --- .../statusbar/phone/BiometricUnlockController.java | 10 +++++----- .../phone/BiometricsUnlockControllerTest.java | 10 ++++++++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 94cd2cdaa9d3..41c6a7ba7848 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -445,14 +445,13 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { if (!mUpdateMonitor.isDeviceInteractive()) { if (!mStatusBarKeyguardViewManager.isShowing()) { return bypass ? MODE_WAKE_AND_UNLOCK : MODE_ONLY_WAKE; - } else if (mDozeScrimController.isPulsing() && unlockingAllowed) { + } else if (!unlockingAllowed) { + return bypass ? MODE_SHOW_BOUNCER : MODE_NONE; + } else if (mDozeScrimController.isPulsing()) { // Let's not wake-up to lock screen when not bypassing, otherwise the notification // would move as the user tried to tap it. return bypass ? MODE_WAKE_AND_UNLOCK_PULSING : MODE_NONE; } else { - if (!(mDozeScrimController.isPulsing() && !unlockingAllowed)) { - Log.wtf(TAG, "Face somehow arrived when the device was not interactive"); - } if (bypass) { // Wake-up fading out nicely return MODE_WAKE_AND_UNLOCK_PULSING; @@ -530,7 +529,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { mStatusBar.notifyBiometricAuthModeChanged(); } - private final WakefulnessLifecycle.Observer mWakefulnessObserver = + @VisibleForTesting + final WakefulnessLifecycle.Observer mWakefulnessObserver = new WakefulnessLifecycle.Observer() { @Override public void onFinishedWakingUp() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java index 4a41349ca195..fd676111b1da 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java @@ -161,6 +161,7 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { @Test public void onBiometricAuthenticated_whenFace_andBypass_encrypted_showBouncer() { + reset(mUpdateMonitor); when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true); mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); @@ -168,11 +169,18 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT, BiometricSourceType.FACE); + // Wake up before showing the bouncer + verify(mStatusBarKeyguardViewManager, never()).showBouncer(eq(false)); + mBiometricUnlockController.mWakefulnessObserver.onFinishedWakingUp(); + verify(mStatusBarKeyguardViewManager).showBouncer(eq(false)); + assertThat(mBiometricUnlockController.getMode()) + .isEqualTo(BiometricUnlockController.MODE_SHOW_BOUNCER); } @Test public void onBiometricAuthenticated_whenFace_noBypass_encrypted_doNothing() { + reset(mUpdateMonitor); mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(false); @@ -181,6 +189,8 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { verify(mStatusBarKeyguardViewManager, never()).showBouncer(anyBoolean()); verify(mStatusBarKeyguardViewManager, never()).animateCollapsePanels(anyFloat()); + assertThat(mBiometricUnlockController.getMode()) + .isEqualTo(BiometricUnlockController.MODE_NONE); } @Test -- GitLab From 08bd435a91100c674d15d5c8759c576358df6685 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Fri, 26 Jul 2019 11:37:14 -0700 Subject: [PATCH 466/620] Fixed some issues when expanding from the launcher We didn't exceed the touchslop automatically when we got a touch from launcher which may have led us to not expand when the user flung pretty fast. Additionally could the velocity be very low if we only had very few touch events, leading to the panel also not expanding. We allow the panel to expand easier in those cases. This also fixed the vibration and the animation when the fling happens really fast. Fixes: 137707746 Test: expand from launcher like crazy and observe that it does Change-Id: Ie7d739f829a0c81352c86071f0e888ecc6c57108 --- .../phone/NotificationPanelView.java | 42 ++++++++++++++++++- .../systemui/statusbar/phone/PanelView.java | 23 ++++++---- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 37855ae592a5..035a5e427039 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -40,6 +40,7 @@ import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.Region; import android.os.PowerManager; +import android.os.SystemClock; import android.util.AttributeSet; import android.util.Log; import android.util.MathUtils; @@ -140,6 +141,12 @@ public class NotificationPanelView extends PanelView implements private static final int CAP_HEIGHT = 1456; private static final int FONT_HEIGHT = 2163; + /** + * Maximum time before which we will expand the panel even for slow motions when getting a + * touch passed over from launcher. + */ + private static final int MAX_TIME_TO_OPEN_WHEN_FLINGING_FROM_LAUNCHER = 300; + static final String COUNTER_PANEL_OPEN = "panel_open"; static final String COUNTER_PANEL_OPEN_QS = "panel_open_qs"; private static final String COUNTER_PANEL_OPEN_PEEK = "panel_open_peek"; @@ -375,6 +382,8 @@ public class NotificationPanelView extends PanelView implements private boolean mHeadsUpPinnedMode; private float mKeyguardHeadsUpShowingAmount = 0.0f; private boolean mShowingKeyguardHeadsUp; + private boolean mAllowExpandForSmallExpansion; + private Runnable mExpandAfterLayoutRunnable; @Inject public NotificationPanelView(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, @@ -666,6 +675,10 @@ public class NotificationPanelView extends PanelView implements } updateMaxHeadsUpTranslation(); updateGestureExclusionRect(); + if (mExpandAfterLayoutRunnable != null) { + mExpandAfterLayoutRunnable.run(); + mExpandAfterLayoutRunnable = null; + } } private void updateGestureExclusionRect() { @@ -1065,6 +1078,8 @@ public class NotificationPanelView extends PanelView implements mDownY = event.getY(); mCollapsedOnDown = isFullyCollapsed(); mListenForHeadsUp = mCollapsedOnDown && mHeadsUpManager.hasPinnedHeadsUp(); + mAllowExpandForSmallExpansion = mExpectingSynthesizedDown; + mTouchSlopExceededBeforeDown = mExpectingSynthesizedDown; if (mExpectingSynthesizedDown) { mLastEventSynthesizedDown = true; } else { @@ -1122,6 +1137,20 @@ public class NotificationPanelView extends PanelView implements / (mQsMaxExpansionHeight - mQsMinExpansionHeight)); } + @Override + protected boolean shouldExpandWhenNotFlinging() { + if (super.shouldExpandWhenNotFlinging()) { + return true; + } + if (mAllowExpandForSmallExpansion) { + // When we get a touch that came over from launcher, the velocity isn't always correct + // Let's err on expanding if the gesture has been reasonably slow + long timeSinceDown = SystemClock.uptimeMillis() - mDownTime; + return timeSinceDown <= MAX_TIME_TO_OPEN_WHEN_FLINGING_FROM_LAUNCHER; + } + return false; + } + @Override protected float getOpeningHeight() { return mNotificationStackScroller.getOpeningHeight(); @@ -1294,10 +1323,19 @@ public class NotificationPanelView extends PanelView implements * * @param velocity unit is in px / millis */ - public void stopWaitingForOpenPanelGesture(float velocity) { + public void stopWaitingForOpenPanelGesture(final float velocity) { if (mExpectingSynthesizedDown) { mExpectingSynthesizedDown = false; - fling(velocity > 1f ? 1000f * velocity : 0, true /* animate */); + maybeVibrateOnOpening(); + Runnable runnable = () -> fling(velocity > 1f ? 1000f * velocity : 0, + true /* expand */); + if (mStatusBar.getStatusBarWindow().getHeight() + != mStatusBar.getStatusBarHeight()) { + // The panel is already expanded to its full size, let's expand directly + runnable.run(); + } else { + mExpandAfterLayoutRunnable = runnable; + } onTrackingStopped(false); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index a5b221bbad8c..65ecb88dd41c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -62,7 +62,8 @@ public abstract class PanelView extends FrameLayout { private static final int INITIAL_OPENING_PEEK_DURATION = 200; private static final int PEEK_ANIMATION_DURATION = 360; private static final int NO_FIXED_DURATION = -1; - private long mDownTime; + protected long mDownTime; + protected boolean mTouchSlopExceededBeforeDown; private float mMinExpandHeight; private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger(); private boolean mPanelUpdateWhenAnimatorEnds; @@ -323,7 +324,7 @@ public abstract class PanelView extends FrameLayout { if (!mGestureWaitForTouchSlop || (mHeightAnimator != null && !mHintAnimationRunning) || mPeekAnimator != null) { mTouchSlopExceeded = (mHeightAnimator != null && !mHintAnimationRunning) - || mPeekAnimator != null; + || mPeekAnimator != null || mTouchSlopExceededBeforeDown; cancelHeightAnimator(); cancelPeek(); onTrackingStarted(); @@ -409,9 +410,7 @@ public abstract class PanelView extends FrameLayout { runPeekAnimation(INITIAL_OPENING_PEEK_DURATION, getOpeningHeight(), false /* collapseWhenFinished */); notifyBarPanelExpansionChanged(); - if (mVibrateOnOpening) { - mVibratorHelper.vibrate(VibrationEffect.EFFECT_TICK); - } + maybeVibrateOnOpening(); //TODO: keyguard opens QS a different way; log that too? @@ -426,6 +425,12 @@ public abstract class PanelView extends FrameLayout { rot); } + protected void maybeVibrateOnOpening() { + if (mVibrateOnOpening) { + mVibratorHelper.vibrate(VibrationEffect.EFFECT_TICK); + } + } + protected abstract float getOpeningHeight(); /** @@ -577,7 +582,7 @@ public abstract class PanelView extends FrameLayout { mInitialTouchY = y; mInitialTouchX = x; mTouchStartedInEmptyArea = !isInContentBounds(x, y); - mTouchSlopExceeded = false; + mTouchSlopExceeded = mTouchSlopExceededBeforeDown; mJustPeeked = false; mMotionAborted = false; mPanelClosedOnDown = isFullyCollapsed(); @@ -680,12 +685,16 @@ public abstract class PanelView extends FrameLayout { return true; } if (Math.abs(vectorVel) < mFlingAnimationUtils.getMinVelocityPxPerSecond()) { - return getExpandedFraction() > 0.5f; + return shouldExpandWhenNotFlinging(); } else { return vel > 0; } } + protected boolean shouldExpandWhenNotFlinging() { + return getExpandedFraction() > 0.5f; + } + /** * @param x the final x-coordinate when the finger was lifted * @param y the final y-coordinate when the finger was lifted -- GitLab From 27f9231e496a725b4752b59f0bb66b7632fe5643 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Fri, 26 Jul 2019 12:41:33 -0700 Subject: [PATCH 467/620] Do not use canAuthenticate() to check if user can reset lockout canAuthenticate() is meant for apps so it will reflect the FACE_UNLOCK_APP_ENABLED setting. If disabled, resetLockout will not be run for that user. Fixes: 138269776 Test: Disable unlocking for apps, get locked out, enter password. Lockout is reset now. Change-Id: I5d7bf3abbac7c8982595d5733464a887ab5184ab --- .../hardware/biometrics/BiometricManager.java | 19 +++++++++++++++++++ .../biometrics/IBiometricService.aidl | 3 +++ .../server/biometrics/BiometricService.java | 17 +++++++++++++++++ .../locksettings/LockSettingsService.java | 2 +- 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/core/java/android/hardware/biometrics/BiometricManager.java b/core/java/android/hardware/biometrics/BiometricManager.java index af66dc161343..d8110f33d723 100644 --- a/core/java/android/hardware/biometrics/BiometricManager.java +++ b/core/java/android/hardware/biometrics/BiometricManager.java @@ -128,6 +128,25 @@ public class BiometricManager { } } + /** + * @hide + * @param userId + * @return + */ + @RequiresPermission(USE_BIOMETRIC_INTERNAL) + public boolean hasEnrolledBiometrics(int userId) { + if (mService != null) { + try { + return mService.hasEnrolledBiometrics(userId); + } catch (RemoteException e) { + Slog.w(TAG, "Remote exception in hasEnrolledBiometrics(): " + e); + return false; + } + } else { + return false; + } + } + /** * Listens for changes to biometric eligibility on keyguard from user settings. * @param callback diff --git a/core/java/android/hardware/biometrics/IBiometricService.aidl b/core/java/android/hardware/biometrics/IBiometricService.aidl index 18c14cb835a8..f0a0b2f0235f 100644 --- a/core/java/android/hardware/biometrics/IBiometricService.aidl +++ b/core/java/android/hardware/biometrics/IBiometricService.aidl @@ -42,6 +42,9 @@ interface IBiometricService { // Checks if biometrics can be used. int canAuthenticate(String opPackageName, int userId); + // Checks if any biometrics are enrolled. + boolean hasEnrolledBiometrics(int userId); + // Register callback for when keyguard biometric eligibility changes. void registerEnabledOnKeyguardCallback(IBiometricEnabledOnKeyguardCallback callback); diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java index bd3cd5439b32..af2f24f959b4 100644 --- a/services/core/java/com/android/server/biometrics/BiometricService.java +++ b/services/core/java/com/android/server/biometrics/BiometricService.java @@ -789,6 +789,23 @@ public class BiometricService extends SystemService { return error; } + @Override + public boolean hasEnrolledBiometrics(int userId) { + checkInternalPermission(); + + final long ident = Binder.clearCallingIdentity(); + try { + for (int i = 0; i < mAuthenticators.size(); i++) { + if (mAuthenticators.get(i).mAuthenticator.hasEnrolledTemplates(userId)) { + return true; + } + } + } finally { + Binder.restoreCallingIdentity(ident); + } + return false; + } + @Override // Binder call public void registerEnabledOnKeyguardCallback(IBiometricEnabledOnKeyguardCallback callback) throws RemoteException { diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index 433ce811c8d7..9510db09aa25 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -446,7 +446,7 @@ public class LockSettingsService extends ILockSettings.Stub { public boolean hasEnrolledBiometrics(int userId) { BiometricManager bm = mContext.getSystemService(BiometricManager.class); - return bm.canAuthenticate(userId) == BiometricManager.BIOMETRIC_SUCCESS; + return bm.hasEnrolledBiometrics(userId); } public int binderGetCallingUid() { -- GitLab From 6369fc0379f348672d75401e769c58b11cc3de07 Mon Sep 17 00:00:00 2001 From: Miranda Kephart Date: Thu, 25 Jul 2019 13:32:42 -0400 Subject: [PATCH 468/620] Add phenotype flags for transcription speed Bug: 138305857 Test: manual (tested along with changes to pick up/use the flags) Change-Id: I9b65079c75e01829a243ffd1286e8c171438cc6f --- .../sysui/SystemUiDeviceConfigFlags.java | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index e91a0eac1264..40ee511b0727 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -186,6 +186,38 @@ public final class SystemUiDeviceConfigFlags { */ public static final String ASSIST_HANDLES_SHOW_WHEN_TAUGHT = "assist_handles_show_when_taught"; + /** + * (long) Duration per pixel, in milliseconds, of scrolling text at fast speed. + */ + public static final String ASSIST_TRANSCRIPTION_DURATION_PER_PX_FAST = + "assist_transcription_duration_per_px_fast"; + + /** + * (long) Duration per pixel, in milliseconds, of scrolling text at regular speed. + */ + public static final String ASSIST_TRANSCRIPTION_DURATION_PER_PX_REGULAR = + "assist_transcription_duration_per_px_regular"; + + /** + * (long) Duration, in milliseconds, over which text fades in. + */ + public static final String ASSIST_TRANSCRIPTION_FADE_IN_DURATION = + "assist_transcription_fade_in_duration"; + + /** + * (long) Maximum total duration, in milliseconds, for a given transcription. + */ + public static final String ASSIST_TRANSCRIPTION_MAX_DURATION = + "assist_transcription_max_duration"; + + /** + * (long) Minimum total duration, in milliseconds, for a given transcription. + */ + public static final String ASSIST_TRANSCRIPTION_MIN_DURATION = + "assist_transcription_min_duration"; + + // Flags related to brightline falsing + /** * (bool) Whether to use the new BrightLineFalsingManager. */ @@ -275,5 +307,6 @@ public final class SystemUiDeviceConfigFlags { "brightline_falsing_zigzag_y_secondary_deviance"; - private SystemUiDeviceConfigFlags() { } + private SystemUiDeviceConfigFlags() { + } } -- GitLab From 516ef793c0753734ca8dd1d6ff853881b3f27831 Mon Sep 17 00:00:00 2001 From: chaviw Date: Fri, 26 Jul 2019 16:11:55 -0700 Subject: [PATCH 469/620] Use alpha instead of show/hide when creating animation leashes. Relative layers inherit visibility flag from the layer they are relative to. This caused dim layers to disappear when the dim layer was transferred from one window to another that was starting an animation. The animation leash was set to hidden so the dim layer was also hidden. Instead set alpha to 0 and 1 when trying to show and hide the animation leash. This will not update the dim layer's visibility since only the show/hide flag is inherited. Test: Steps from bug Fixes: 138337187 Change-Id: Id7d82335889a42020ad0adccf9bd5c5d987cc813 --- .../java/com/android/server/wm/SurfaceAnimationRunner.java | 4 +++- .../core/java/com/android/server/wm/SurfaceAnimator.java | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java index cb504607420c..85176bee67df 100644 --- a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java +++ b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java @@ -193,7 +193,9 @@ class SurfaceAnimationRunner { public void onAnimationStart(Animator animation) { synchronized (mCancelLock) { if (!a.mCancelled) { - mFrameTransaction.show(a.mLeash); + // TODO: change this back to use show instead of alpha when b/138459974 is + // fixed. + mFrameTransaction.setAlpha(a.mLeash, 1); } } } diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java index 3d9dfeb4ecec..cd211a28a908 100644 --- a/services/core/java/com/android/server/wm/SurfaceAnimator.java +++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java @@ -324,9 +324,9 @@ class SurfaceAnimator { .setName(surface + " - animation-leash"); final SurfaceControl leash = builder.build(); t.setWindowCrop(leash, width, height); - if (!hidden) { - t.show(leash); - } + t.show(leash); + // TODO: change this back to use show instead of alpha when b/138459974 is fixed. + t.setAlpha(leash, hidden ? 0 : 1); t.reparent(surface, leash); return leash; } -- GitLab From 12ea937f8f22987654f7a04f025570c29876962c Mon Sep 17 00:00:00 2001 From: John Reck Date: Fri, 26 Jul 2019 12:19:56 -0700 Subject: [PATCH 470/620] Fix regression in PFD#fromData Don't rely on the GC to clean up FD resources when they can just be cleaned up immediately. We know the MemoryFile isn't going to be used any further, so just close it. Bug: 138323667 Test: Repro steps in bug. Verified addresses FD leak in system_server from repeatedly opening & closing settings. Change-Id: Ic82006c9cb48f580aaad942c4679e774186382c9 --- core/java/android/os/ParcelFileDescriptor.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java index 8355e08b6aa8..2a4576adf192 100644 --- a/core/java/android/os/ParcelFileDescriptor.java +++ b/core/java/android/os/ParcelFileDescriptor.java @@ -581,12 +581,16 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { public static ParcelFileDescriptor fromData(byte[] data, String name) throws IOException { if (data == null) return null; MemoryFile file = new MemoryFile(name, data.length); - if (data.length > 0) { - file.writeBytes(data, 0, 0, data.length); + try { + if (data.length > 0) { + file.writeBytes(data, 0, 0, data.length); + } + file.deactivate(); + FileDescriptor fd = file.getFileDescriptor(); + return fd != null ? ParcelFileDescriptor.dup(fd) : null; + } finally { + file.close(); } - file.deactivate(); - FileDescriptor fd = file.getFileDescriptor(); - return fd != null ? ParcelFileDescriptor.dup(fd) : null; } /** -- GitLab From 622eeaf0d5f147a6942479250cc269d203ab961a Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Fri, 26 Jul 2019 13:50:08 -0400 Subject: [PATCH 471/620] Do not allow the FalsingManager sesion to start when AOD is showing. Bug: 138220274 Test: manual Change-Id: I6d14db66d53a668b7cf8dd15ebb489fb3ebf4c7c Merged-In: I6d14db66d53a668b7cf8dd15ebb489fb3ebf4c7c --- .../brightline/BrightLineFalsingManager.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java index 41f20ec28902..ce82bbfb1512 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java @@ -50,6 +50,8 @@ public class BrightLineFalsingManager implements FalsingManager { private boolean mSessionStarted; private MetricsLogger mMetricsLogger; private int mIsFalseTouchCalls; + private boolean mShowingAod; + private boolean mScreenOn; private final ExecutorService mBackgroundExecutor = Executors.newSingleThreadExecutor(); @@ -105,7 +107,7 @@ public class BrightLineFalsingManager implements FalsingManager { } private void sessionStart() { - if (!mSessionStarted) { + if (!mSessionStarted && !mShowingAod && mScreenOn) { logDebug("Starting Session"); mSessionStarted = true; registerSensors(); @@ -174,6 +176,7 @@ public class BrightLineFalsingManager implements FalsingManager { mMetricsLogger.histogram(FALSING_SUCCESS, mIsFalseTouchCalls); mIsFalseTouchCalls = 0; } + sessionEnd(); } @Override @@ -182,6 +185,7 @@ public class BrightLineFalsingManager implements FalsingManager { @Override public void setShowingAod(boolean showingAod) { + mShowingAod = showingAod; if (showingAod) { sessionEnd(); } else { @@ -266,7 +270,7 @@ public class BrightLineFalsingManager implements FalsingManager { @Override public void onScreenOnFromTouch() { - sessionStart(); + onScreenTurningOn(); } @Override @@ -288,11 +292,13 @@ public class BrightLineFalsingManager implements FalsingManager { @Override public void onScreenTurningOn() { + mScreenOn = true; sessionStart(); } @Override public void onScreenOff() { + mScreenOn = false; sessionEnd(); } -- GitLab From b78e2d0fb11f49dfc4b5bad873370f1e02488d69 Mon Sep 17 00:00:00 2001 From: Amit Mahajan Date: Sat, 27 Jul 2019 00:15:03 +0000 Subject: [PATCH 472/620] Revert "Do not notify SS change with invalid subId" This reverts commit 6db77174a2171157bfc93c5836704fd6609c9ae7. Reason for revert: b/138357571 (no signal bars even when device is in service) Change-Id: I98eb708ef4f624bfba541d409837846662255d72 --- .../java/com/android/server/TelephonyRegistry.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index f7e825eecc12..e66e596d5038 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -1027,12 +1027,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { log(str); } mLocalLog.log(str); - // for service state updates, don't notify clients when subId is invalid. This prevents - // us from sending incorrect notifications like b/133140128 - // In the future, we can remove this logic for every notification here and add a - // callback so listeners know when their PhoneStateListener's subId becomes invalid, but - // for now we use the simplest fix. - if (validatePhoneId(phoneId) && SubscriptionManager.isValidSubscriptionId(subId)) { + if (validatePhoneId(phoneId)) { mServiceState[phoneId] = state; for (Record r : mRecords) { @@ -1064,8 +1059,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } } } else { - log("notifyServiceStateForSubscriber: INVALID phoneId=" + phoneId - + " or subId=" + subId); + log("notifyServiceStateForSubscriber: INVALID phoneId=" + phoneId); } handleRemoveListLocked(); } -- GitLab From 15803b51e3ec5e3335f54cab12bdd7697df865d9 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Thu, 25 Jul 2019 20:41:29 -0700 Subject: [PATCH 473/620] Showing the notification icon properly now when the pulse is suppressed Previously the notification would be hidden so if the user would pull out the phone from the pocket, they might not see what notification actually alerted. Bug: 138336424 Test: add notification while on AOD, block prox sensor, see icon Change-Id: I101640c9d0226948e44a4bf36a7ca91dd135fe66 Merged-In: I8f7bd7a6a0562942ed3e12f28705043722d177e8 --- .../com/android/systemui/statusbar/NotificationShelf.java | 7 ++++--- .../notification/stack/NotificationStackScrollLayout.java | 3 ++- .../statusbar/notification/stack/StackScrollAlgorithm.java | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 312ea473d9e6..165c64e7a6a4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -512,7 +512,7 @@ public class NotificationShelf extends ActivatableNotificationView implements float viewEnd = row.getTranslationY() + row.getActualHeight(); boolean isPinned = (row.isPinned() || row.isHeadsUpAnimatingAway()) && !mAmbientState.isDozingAndNotPulsing(row); - boolean shouldClipOwnTop = row.showingAmbientPulsing() + boolean shouldClipOwnTop = row.showingAmbientPulsing() && !mAmbientState.isFullyDark() || (mAmbientState.isPulseExpanding() && childIndex == 0); if (viewEnd > notificationClipEnd && !shouldClipOwnTop && (mAmbientState.isShadeExpanded() || !isPinned)) { @@ -752,8 +752,9 @@ public class NotificationShelf extends ActivatableNotificationView implements iconState.scaleY = 1.0f; iconState.hidden = false; } - if (row.isAboveShelf() || (!row.isInShelf() && (isLastChild && row.areGutsExposed() - || row.getTranslationZ() > mAmbientState.getBaseZHeight()))) { + if ((row.isAboveShelf() || (!row.isInShelf() && (isLastChild && row.areGutsExposed() + || row.getTranslationZ() > mAmbientState.getBaseZHeight()))) + && !mAmbientState.isFullyDark()) { iconState.hidden = true; } int backgroundColor = getBackgroundColorWithoutTint(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 8fe34180203f..031911260f83 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -1355,7 +1355,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd mIsClipped = clipped; } - if (!mAmbientPulseManager.hasNotifications() && mAmbientState.isFullyDark()) { + if (!mPulsing && mAmbientState.isFullyDark()) { setClipBounds(null); } else if (mAmbientState.isDarkAtAll()) { clipToOutline = true; @@ -5161,6 +5161,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd return; } mPulsing = pulsing; + updateClipping(); mAmbientState.setPulsing(pulsing); mSwipeHelper.setPulsing(pulsing); updateNotificationAnimationStates(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index 60061c6a9ad2..d9f8c88e0d13 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -501,7 +501,8 @@ public class StackScrollAlgorithm { continue; } ExpandableNotificationRow row = (ExpandableNotificationRow) child; - if (!row.showingAmbientPulsing() || (i == 0 && ambientState.isPulseExpanding())) { + if (!row.showingAmbientPulsing() || ambientState.isFullyDark() + || (i == 0 && ambientState.isPulseExpanding())) { continue; } ExpandableViewState viewState = row.getViewState(); -- GitLab From e1ac0c0468d4ff50ac423b26bd09f9f5dee078b5 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Fri, 26 Jul 2019 17:54:46 -0700 Subject: [PATCH 474/620] Add retry logic for UNABLE_TO_PROCESS Fixes: 137153901 Test: Open camera on lockscreen, turn screen off, turn screen on. Able to authenticate Change-Id: If12203fdd457bec217006024d85322ddb19a9ff3 --- .../android/keyguard/KeyguardUpdateMonitor.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 4e7b15715243..109f270063d6 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -264,11 +264,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { */ private static final int BIOMETRIC_CONTINUE_DELAY_MS = 500; - // If FP daemon dies, keyguard should retry after a short delay + // If the HAL dies or is unable to authenticate, keyguard should retry after a short delay private int mHardwareFingerprintUnavailableRetryCount = 0; private int mHardwareFaceUnavailableRetryCount = 0; - private static final int HW_UNAVAILABLE_TIMEOUT = 3000; // ms - private static final int HW_UNAVAILABLE_RETRY_MAX = 3; + private static final int HAL_ERROR_RETRY_TIMEOUT = 500; // ms + private static final int HAL_ERROR_RETRY_MAX = 10; private final Handler mHandler = new Handler(Looper.getMainLooper()) { @Override @@ -671,10 +671,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } if (msgId == FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE) { - if (mHardwareFingerprintUnavailableRetryCount < HW_UNAVAILABLE_RETRY_MAX) { + if (mHardwareFingerprintUnavailableRetryCount < HAL_ERROR_RETRY_MAX) { mHardwareFingerprintUnavailableRetryCount++; mHandler.removeCallbacks(mRetryFingerprintAuthentication); - mHandler.postDelayed(mRetryFingerprintAuthentication, HW_UNAVAILABLE_TIMEOUT); + mHandler.postDelayed(mRetryFingerprintAuthentication, HAL_ERROR_RETRY_TIMEOUT); } } @@ -830,11 +830,12 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { setFaceRunningState(BIOMETRIC_STATE_STOPPED); } - if (msgId == FaceManager.FACE_ERROR_HW_UNAVAILABLE) { - if (mHardwareFaceUnavailableRetryCount < HW_UNAVAILABLE_RETRY_MAX) { + if (msgId == FaceManager.FACE_ERROR_HW_UNAVAILABLE + || msgId == FaceManager.FACE_ERROR_UNABLE_TO_PROCESS) { + if (mHardwareFaceUnavailableRetryCount < HAL_ERROR_RETRY_MAX) { mHardwareFaceUnavailableRetryCount++; mHandler.removeCallbacks(mRetryFaceAuthentication); - mHandler.postDelayed(mRetryFaceAuthentication, HW_UNAVAILABLE_TIMEOUT); + mHandler.postDelayed(mRetryFaceAuthentication, HAL_ERROR_RETRY_TIMEOUT); } } -- GitLab From bbc11cafee6fb1bf2768bc0b4befcb6f7e02d251 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Fri, 26 Jul 2019 13:50:08 -0400 Subject: [PATCH 475/620] Do not allow the FalsingManager sesion to start when AOD is showing. Bug: 138220274 Test: manual Change-Id: I6d14db66d53a668b7cf8dd15ebb489fb3ebf4c7c Merged-In: I6d14db66d53a668b7cf8dd15ebb489fb3ebf4c7c --- .../brightline/BrightLineFalsingManager.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java index 6280c9f7c00f..fbbba57381c6 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java @@ -44,6 +44,8 @@ public class BrightLineFalsingManager implements FalsingManager { private final SensorManager mSensorManager; private final FalsingDataProvider mDataProvider; private boolean mSessionStarted; + private boolean mShowingAod; + private boolean mScreenOn; private final ExecutorService mBackgroundExecutor = Executors.newSingleThreadExecutor(); @@ -98,7 +100,7 @@ public class BrightLineFalsingManager implements FalsingManager { } private void sessionStart() { - if (!mSessionStarted) { + if (!mSessionStarted && !mShowingAod && mScreenOn) { logDebug("Starting Session"); mSessionStarted = true; registerSensors(); @@ -159,6 +161,7 @@ public class BrightLineFalsingManager implements FalsingManager { @Override public void onSucccessfulUnlock() { + sessionEnd(); } @Override @@ -167,6 +170,7 @@ public class BrightLineFalsingManager implements FalsingManager { @Override public void setShowingAod(boolean showingAod) { + mShowingAod = showingAod; if (showingAod) { sessionEnd(); } else { @@ -251,7 +255,7 @@ public class BrightLineFalsingManager implements FalsingManager { @Override public void onScreenOnFromTouch() { - sessionStart(); + onScreenTurningOn(); } @Override @@ -273,11 +277,13 @@ public class BrightLineFalsingManager implements FalsingManager { @Override public void onScreenTurningOn() { + mScreenOn = true; sessionStart(); } @Override public void onScreenOff() { + mScreenOn = false; sessionEnd(); } -- GitLab From 33295a482d21b967f9c01764aef9026a545d5174 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Fri, 26 Jul 2019 19:49:08 -0700 Subject: [PATCH 476/620] Fixed the shadows on the lockscreen for bypass The shadows were clipped before which made them appear very jarringly. They now appear smoother. Also, the shelf wasn't actually hidden when it was fully clipped leading to an ugly remainder on the lockscreen Fixes: 138258095 Test: atest SystemUITests Change-Id: I070c307119572aa41423d1370a55010b2f428be4 --- .../systemui/statusbar/NotificationShelf.java | 4 ++++ .../stack/NotificationStackScrollLayout.java | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 4ccd0cd3353b..99682fcfccbf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -374,6 +374,10 @@ public class NotificationShelf extends ActivatableNotificationView implements clipTransientViews(); setClipTopAmount(clipTopAmount); + boolean isHidden = getViewState().hidden || clipTopAmount >= getIntrinsicHeight(); + if (mShowNotificationShelf) { + setVisibility(isHidden ? View.INVISIBLE : View.VISIBLE); + } setBackgroundTop(backgroundTop); setFirstElementRoundness(firstElementRoundness); mShelfIcons.setSpeedBumpIndex(mAmbientState.getSpeedBumpIndex()); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 9e3d74b138fa..4db31d5dee69 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -412,6 +412,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd outline.setRoundRect(mBackgroundAnimationRect, MathUtils.lerp(mCornerRadius / 2.0f, mCornerRadius, xProgress)); + outline.setAlpha(1.0f - mAmbientState.getHideAmount()); } else { ViewOutlineProvider.BACKGROUND.getOutline(view, outline); } @@ -1043,6 +1044,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd requestChildrenUpdate(); updateFirstAndLastBackgroundViews(); updateAlgorithmLayoutMinHeight(); + updateOwnTranslationZ(); } @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) @@ -4766,6 +4768,20 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd updateAlgorithmHeightAndPadding(); updateBackgroundDimming(); requestChildrenUpdate(); + updateOwnTranslationZ(); + } + + private void updateOwnTranslationZ() { + // Since we are clipping to the outline we need to make sure that the shadows aren't + // clipped when pulsing + float ownTranslationZ = 0; + if (mKeyguardBypassController.getBypassEnabled() && mAmbientState.isHiddenAtAll()) { + ExpandableView firstChildNotGone = getFirstChildNotGone(); + if (firstChildNotGone != null && firstChildNotGone.showingPulsing()) { + ownTranslationZ = firstChildNotGone.getTranslationZ(); + } + } + setTranslationZ(ownTranslationZ); } private void updateVisibility() { -- GitLab From 7c236e9ca79ac7ea50449f77709bbc1f5dcd4b79 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Fri, 26 Jul 2019 21:47:19 -0700 Subject: [PATCH 477/620] Fixed an issue where the notification wouldn't collapse When clicking on a notification with an activity that wouldn't start an opening animation, the panel could remain open. We're now closing it in that case. Fixes: 138468703 Test: follow test on bug and observe normal closing Change-Id: I0b867302d616c017d82f944ee983d4ba4356701a --- .../systemui/statusbar/notification/ActivityLaunchAnimator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java index 0d9f4e7b909d..91d47077fc31 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java @@ -153,6 +153,7 @@ public class ActivityLaunchAnimator { if (primary == null) { setAnimationPending(false); invokeCallback(iRemoteAnimationFinishedCallback); + mNotificationPanel.collapse(false /* delayed */, 1.0f /* speedUpFactor */); return; } -- GitLab From 5bc77a116802e7fe2843aeec712f4f1037d4edeb Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Fri, 26 Jul 2019 22:25:49 -0700 Subject: [PATCH 478/620] Made sure the the lock icon hides again when dragging down Previously we were requiring a heads up to be present but that's not necessary and would lead to issues when dragging down Fixes: 138469678 Test: get notification / drag down, observe normal lock icon Change-Id: I1bfa7c1f9fb6b0bb0a76eb1ed15f25be6da2fab3 --- .../src/com/android/systemui/statusbar/phone/LockIcon.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index c9c80d464b46..06a2225ed0bf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -338,8 +338,8 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange boolean invisible = onAodNotPulsingOrDocked || mWakeAndUnlockRunning || mShowingLaunchAffordance; if (mBypassController.getBypassEnabled() && !mBouncerShowingScrimmed) { - if ((mHeadsUpManager.isHeadsUpGoingAway() || mHeadsUpManager.hasPinnedHeadsUp()) - && mStatusBarStateController.getState() == StatusBarState.KEYGUARD + if ((mHeadsUpManager.isHeadsUpGoingAway() || mHeadsUpManager.hasPinnedHeadsUp() + || mStatusBarStateController.getState() == StatusBarState.KEYGUARD) && !mWakeUpCoordinator.getNotificationsFullyHidden()) { invisible = true; } -- GitLab From e219ae1fba4b1a32d25995445e88201b637fdb2f Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Thu, 18 Jul 2019 13:43:23 -0700 Subject: [PATCH 479/620] Also apply freeze-task-list when starting an activity - We previously only did this for startActivityFromRecents(), but for 3p launchers, we need to start the RecentsActivity mid-gesture and don't want to punt the excluded task from the front of the list Bug: 137199105 Test: Install 3p Launcher, force-enable gesture nav, swipe up from exclude-from-recents activity Change-Id: I7881ea103e83d28df1ec94d1874295188bed1064 --- .../android/server/wm/ActivityStarter.java | 19 ++++++++ .../server/wm/ActivityStarterTests.java | 47 +++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index b0ca0af8fe88..5a1eed8897b6 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -187,6 +187,7 @@ class ActivityStarter { private boolean mNoAnimation; private boolean mKeepCurTransition; private boolean mAvoidMoveToFront; + private boolean mFrozeTaskList; // We must track when we deliver the new intent since multiple code paths invoke // {@link #deliverNewIntent}. This is due to early returns in the code path. This flag is used @@ -483,6 +484,7 @@ class ActivityStarter { mNoAnimation = starter.mNoAnimation; mKeepCurTransition = starter.mKeepCurTransition; mAvoidMoveToFront = starter.mAvoidMoveToFront; + mFrozeTaskList = starter.mFrozeTaskList; mVoiceSession = starter.mVoiceSession; mVoiceInteractor = starter.mVoiceInteractor; @@ -1093,6 +1095,14 @@ class ActivityStarter { void postStartActivityProcessing(ActivityRecord r, int result, ActivityStack startedActivityStack) { + if (!ActivityManager.isStartResultSuccessful(result)) { + if (mFrozeTaskList) { + // If we specifically froze the task list as part of starting an activity, then + // reset the frozen list state if it failed to start. This is normally otherwise + // called when the freeze-timeout has elapsed. + mSupervisor.mRecentTasks.resetFreezeTaskListReorderingOnTimeout(); + } + } if (ActivityManager.isStartResultFatalError(result)) { return; } @@ -1485,6 +1495,14 @@ class ActivityStarter { mLaunchParams.hasPreferredDisplay() ? mLaunchParams.mPreferredDisplayId : DEFAULT_DISPLAY; + // If requested, freeze the task list + if (mOptions != null && mOptions.freezeRecentTasksReordering() + && mSupervisor.mRecentTasks.isCallerRecents(r.launchedFromUid) + && !mSupervisor.mRecentTasks.isFreezeTaskListReorderingSet()) { + mFrozeTaskList = true; + mSupervisor.mRecentTasks.setFreezeTaskListReordering(); + } + // Do not start home activity if it cannot be launched on preferred display. We are not // doing this in ActivityStackSupervisor#canPlaceEntityOnDisplay because it might // fallback to launch on other displays. @@ -1775,6 +1793,7 @@ class ActivityStarter { mNoAnimation = false; mKeepCurTransition = false; mAvoidMoveToFront = false; + mFrozeTaskList = false; mVoiceSession = null; mVoiceInteractor = null; diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java index a08923bafe28..3d944671ef25 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java @@ -842,4 +842,51 @@ public class ActivityStarterTests extends ActivityTestsBase { // Ensure the activity is moved to secondary display. assertEquals(secondaryDisplay, topActivity.getDisplay()); } + + /** + * This test ensures that starting an activity with the freeze-task-list activity option will + * actually freeze the task list + */ + @Test + public void testFreezeTaskListActivityOption() { + RecentTasks recentTasks = mock(RecentTasks.class); + mService.mStackSupervisor.setRecentTasks(recentTasks); + doReturn(true).when(recentTasks).isCallerRecents(anyInt()); + + final ActivityStarter starter = prepareStarter(0 /* flags */); + final ActivityOptions options = ActivityOptions.makeBasic(); + options.setFreezeRecentTasksReordering(); + + starter.setReason("testFreezeTaskListActivityOption") + .setActivityOptions(new SafeActivityOptions(options)) + .execute(); + + verify(recentTasks, times(1)).setFreezeTaskListReordering(); + verify(recentTasks, times(0)).resetFreezeTaskListReorderingOnTimeout(); + } + + /** + * This test ensures that if we froze the task list as a part of starting an activity that fails + * to start, that we also reset the task list. + */ + @Test + public void testFreezeTaskListActivityOptionFailedStart_expectResetFreezeTaskList() { + RecentTasks recentTasks = mock(RecentTasks.class); + mService.mStackSupervisor.setRecentTasks(recentTasks); + doReturn(true).when(recentTasks).isCallerRecents(anyInt()); + + final ActivityStarter starter = prepareStarter(0 /* flags */); + final ActivityOptions options = ActivityOptions.makeBasic(); + options.setFreezeRecentTasksReordering(); + + starter.setReason("testFreezeTaskListActivityOptionFailedStart") + .setActivityOptions(new SafeActivityOptions(options)) + .execute(); + + // Simulate a failed start + starter.postStartActivityProcessing(null, START_ABORTED, null); + + verify(recentTasks, times(1)).setFreezeTaskListReordering(); + verify(recentTasks, times(1)).resetFreezeTaskListReorderingOnTimeout(); + } } -- GitLab From 0b41c8940a44a9eff4b277ce019a1ffdb3a44b7e Mon Sep 17 00:00:00 2001 From: Svet Ganov Date: Fri, 26 Jul 2019 17:45:56 -0700 Subject: [PATCH 480/620] [DO NOT MERGE] Don't drop restricted permissions on upgrade Restricted permissions cannot be held until whitelisted. In a P -> Q upgrade we grandfather all restricted permissions. However, the whitelisting code runs after the internal update of permission happens for the first time resulting in a revocation of the restricted permissions we were about to grandfather. The fix is to not deal with restricted permission when updating the permissions state until the permission controller has run the grandfathering logic and once the latter happens we do run the permission update logic again to properly handle the restricted permissions. Bug: 138263882 Test: atest CtsPermissionTestCases atest CtsPermission2TestCases atest CtsAppSecurityHostTestCases:android.appsecurity.cts.PermissionsHostTest P -> Q upgrade preserves grandfathered restricted permissions P -> Bad Q build -> Q fixes up broken fixed restricted permissions Change-Id: Iaef80426bf50181df93d1380af1d0855340def8e --- .../server/pm/PackageManagerService.java | 13 +++ .../DefaultPermissionGrantPolicy.java | 16 +++- .../permission/PermissionManagerService.java | 83 ++++++++++++------- .../policy/PermissionPolicyInternal.java | 27 ++++++ .../policy/PermissionPolicyService.java | 25 ++++++ .../java/com/android/server/SystemServer.java | 10 +-- 6 files changed, 136 insertions(+), 38 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 7fce4453b768..d60fa2e5c110 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -319,6 +319,8 @@ import com.android.server.pm.permission.PermissionManagerService; import com.android.server.pm.permission.PermissionManagerServiceInternal; import com.android.server.pm.permission.PermissionManagerServiceInternal.PermissionCallback; import com.android.server.pm.permission.PermissionsState; +import com.android.server.policy.PermissionPolicyInternal; +import com.android.server.policy.PermissionPolicyInternal.OnInitializedCallback; import com.android.server.security.VerityUtils; import com.android.server.storage.DeviceStorageMonitorInternal; import com.android.server.wm.ActivityTaskManagerInternal; @@ -21633,6 +21635,17 @@ public class PackageManagerService extends IPackageManager.Stub mPermissionManager.updateAllPermissions( StorageManager.UUID_PRIVATE_INTERNAL, false, mPackages.values(), mPermissionCallback); + + final PermissionPolicyInternal permissionPolicyInternal = + LocalServices.getService(PermissionPolicyInternal.class); + permissionPolicyInternal.setOnInitializedCallback(userId -> { + // The SDK updated case is already handled when we run during the ctor. + synchronized (mPackages) { + mPermissionManager.updateAllPermissions( + StorageManager.UUID_PRIVATE_INTERNAL, false /*sdkUpdated*/, + mPackages.values(), mPermissionCallback); + } + }); } // Watch for external volumes that come and go over time diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java index f8c4f6b2cdba..4550446f88c5 100644 --- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java @@ -1170,6 +1170,11 @@ public final class DefaultPermissionGrantPolicy { final int flags = mContext.getPackageManager().getPermissionFlags( permission, pkg.packageName, user); + // If we are trying to grant as system fixed and already system fixed + // then the system can change the system fixed grant state. + final boolean changingGrantForSystemFixed = systemFixed + && (flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0; + // Certain flags imply that the permission's current state by the system or // device/profile owner or the user. In these cases we do not want to clobber the // current state. @@ -1177,7 +1182,8 @@ public final class DefaultPermissionGrantPolicy { // Unless the caller wants to override user choices. The override is // to make sure we can grant the needed permission to the default // sms and phone apps after the user chooses this in the UI. - if (!isFixedOrUserSet(flags) || ignoreSystemPackage) { + if (!isFixedOrUserSet(flags) || ignoreSystemPackage + || changingGrantForSystemFixed) { // Never clobber policy fixed permissions. // We must allow the grant of a system-fixed permission because // system-fixed is sticky, but the permission itself may be revoked. @@ -1196,6 +1202,14 @@ public final class DefaultPermissionGrantPolicy { PackageManager.FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT, user); } + // If the system tries to change a system fixed permission from one fixed + // state to another we need to drop the fixed flag to allow the grant. + if (changingGrantForSystemFixed) { + mContext.getPackageManager().updatePermissionFlags(permission, + pkg.packageName, flags, + flags & ~PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, user); + } + if (pm.checkPermission(permission, pkg.packageName) != PackageManager.PERMISSION_GRANTED) { mContext.getPackageManager() diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index d3e5df5d62d1..8884821c770e 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -97,6 +97,7 @@ import com.android.server.pm.SharedUserSetting; import com.android.server.pm.UserManagerService; import com.android.server.pm.permission.PermissionManagerServiceInternal.PermissionCallback; import com.android.server.pm.permission.PermissionsState.PermissionState; +import com.android.server.policy.PermissionPolicyInternal; import com.android.server.policy.SoftRestrictedPermissionPolicy; import libcore.util.EmptyArray; @@ -197,6 +198,9 @@ public class PermissionManagerService { @GuardedBy("mLock") private boolean mSystemReady; + @GuardedBy("mLock") + private PermissionPolicyInternal mPermissionPolicyInternal; + /** * For each foreground/background permission the mapping: * Background permission -> foreground permissions @@ -1080,6 +1084,13 @@ public class PermissionManagerService { boolean softRestricted = bp.isSoftRestricted(); for (int userId : currentUserIds) { + // If permission policy is not ready we don't deal with restricted + // permissions as the policy may whitelist some permissions. Once + // the policy is initialized we would re-evaluate permissions. + final boolean permissionPolicyInitialized = + mPermissionPolicyInternal != null + && mPermissionPolicyInternal.isInitialized(userId); + PermissionState permState = origPermissions .getRuntimePermissionState(perm, userId); int flags = permState != null ? permState.getFlags() : 0; @@ -1094,7 +1105,7 @@ public class PermissionManagerService { if (appSupportsRuntimePermissions) { // If hard restricted we don't allow holding it - if (hardRestricted) { + if (permissionPolicyInitialized && hardRestricted) { if (!restrictionExempt) { if (permState != null && permState.isGranted() && permissionsState.revokeRuntimePermission( @@ -1107,7 +1118,7 @@ public class PermissionManagerService { } } // If soft restricted we allow holding in a restricted form - } else if (softRestricted) { + } else if (permissionPolicyInitialized && softRestricted) { // Regardless if granted set the restriction flag as it // may affect app treatment based on this permission. if (!restrictionExempt && !restrictionApplied) { @@ -1126,7 +1137,8 @@ public class PermissionManagerService { flags &= ~FLAG_PERMISSION_REVOKE_ON_UPGRADE; wasChanged = true; // Hard restricted permissions cannot be held. - } else if (!hardRestricted || restrictionExempt) { + } else if (!permissionPolicyInitialized + || (!hardRestricted || restrictionExempt)) { if (permState != null && permState.isGranted()) { if (permissionsState.grantRuntimePermission(bp, userId) == PERMISSION_OPERATION_FAILURE) { @@ -1155,33 +1167,28 @@ public class PermissionManagerService { // If legacy app always grant the permission but if restricted // and not exempt take a note a restriction should be applied. - if ((hardRestricted || softRestricted) - && !restrictionExempt && !restrictionApplied) { + if (permissionPolicyInitialized + && (hardRestricted || softRestricted) + && !restrictionExempt && !restrictionApplied) { flags |= FLAG_PERMISSION_APPLY_RESTRICTION; wasChanged = true; } } // If unrestricted or restriction exempt, don't apply restriction. - if (!(hardRestricted || softRestricted) || restrictionExempt) { - if (restrictionApplied) { - flags &= ~FLAG_PERMISSION_APPLY_RESTRICTION; - // Dropping restriction on a legacy app requires a review. - if (!appSupportsRuntimePermissions) { - flags |= FLAG_PERMISSION_REVIEW_REQUIRED; + if (permissionPolicyInitialized) { + if (!(hardRestricted || softRestricted) || restrictionExempt) { + if (restrictionApplied) { + flags &= ~FLAG_PERMISSION_APPLY_RESTRICTION; + // Dropping restriction on a legacy app implies a review + if (!appSupportsRuntimePermissions) { + flags |= FLAG_PERMISSION_REVIEW_REQUIRED; + } + wasChanged = true; } - wasChanged = true; } } - if (hardRestricted && !restrictionExempt - && (flags & FLAG_PERMISSION_SYSTEM_FIXED) != 0) { - // Applying a hard restriction implies revoking it. This might - // lead to a system-fixed, revoked permission. - flags &= ~FLAG_PERMISSION_SYSTEM_FIXED; - wasChanged = true; - } - if (wasChanged) { updatedUserIds = ArrayUtils.appendInt(updatedUserIds, userId); } @@ -1216,6 +1223,13 @@ public class PermissionManagerService { boolean softRestricted = bp.isSoftRestricted(); for (int userId : currentUserIds) { + // If permission policy is not ready we don't deal with restricted + // permissions as the policy may whitelist some permissions. Once + // the policy is initialized we would re-evaluate permissions. + final boolean permissionPolicyInitialized = + mPermissionPolicyInternal != null + && mPermissionPolicyInternal.isInitialized(userId); + boolean wasChanged = false; boolean restrictionExempt = @@ -1226,7 +1240,7 @@ public class PermissionManagerService { if (appSupportsRuntimePermissions) { // If hard restricted we don't allow holding it - if (hardRestricted) { + if (permissionPolicyInitialized && hardRestricted) { if (!restrictionExempt) { if (permState != null && permState.isGranted() && permissionsState.revokeRuntimePermission( @@ -1239,7 +1253,7 @@ public class PermissionManagerService { } } // If soft restricted we allow holding in a restricted form - } else if (softRestricted) { + } else if (permissionPolicyInitialized && softRestricted) { // Regardless if granted set the restriction flag as it // may affect app treatment based on this permission. if (!restrictionExempt && !restrictionApplied) { @@ -1258,7 +1272,8 @@ public class PermissionManagerService { flags &= ~FLAG_PERMISSION_REVOKE_ON_UPGRADE; wasChanged = true; // Hard restricted permissions cannot be held. - } else if (!hardRestricted || restrictionExempt) { + } else if (!permissionPolicyInitialized || + (!hardRestricted || restrictionExempt)) { if (permissionsState.grantRuntimePermission(bp, userId) != PERMISSION_OPERATION_FAILURE) { wasChanged = true; @@ -1274,22 +1289,25 @@ public class PermissionManagerService { // If legacy app always grant the permission but if restricted // and not exempt take a note a restriction should be applied. - if ((hardRestricted || softRestricted) - && !restrictionExempt && !restrictionApplied) { + if (permissionPolicyInitialized + && (hardRestricted || softRestricted) + && !restrictionExempt && !restrictionApplied) { flags |= FLAG_PERMISSION_APPLY_RESTRICTION; wasChanged = true; } } // If unrestricted or restriction exempt, don't apply restriction. - if (!(hardRestricted || softRestricted) || restrictionExempt) { - if (restrictionApplied) { - flags &= ~FLAG_PERMISSION_APPLY_RESTRICTION; - // Dropping restriction on a legacy app requires a review. - if (!appSupportsRuntimePermissions) { - flags |= FLAG_PERMISSION_REVIEW_REQUIRED; + if (permissionPolicyInitialized) { + if (!(hardRestricted || softRestricted) || restrictionExempt) { + if (restrictionApplied) { + flags &= ~FLAG_PERMISSION_APPLY_RESTRICTION; + // Dropping restriction on a legacy app implies a review + if (!appSupportsRuntimePermissions) { + flags |= FLAG_PERMISSION_REVIEW_REQUIRED; + } + wasChanged = true; } - wasChanged = true; } } @@ -2900,6 +2918,7 @@ public class PermissionManagerService { } mPermissionControllerManager = mContext.getSystemService(PermissionControllerManager.class); + mPermissionPolicyInternal = LocalServices.getService(PermissionPolicyInternal.class); } private static String getVolumeUuidForPackage(PackageParser.Package pkg) { diff --git a/services/core/java/com/android/server/policy/PermissionPolicyInternal.java b/services/core/java/com/android/server/policy/PermissionPolicyInternal.java index 7760c1edd9e6..6084c6718577 100644 --- a/services/core/java/com/android/server/policy/PermissionPolicyInternal.java +++ b/services/core/java/com/android/server/policy/PermissionPolicyInternal.java @@ -18,6 +18,7 @@ package com.android.server.policy; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.UserIdInt; import android.content.Intent; /** @@ -25,6 +26,19 @@ import android.content.Intent; */ public abstract class PermissionPolicyInternal { + /** + * Callback for initializing the permission policy service. + */ + public interface OnInitializedCallback { + + /** + * Called when initialized for the given user. + * + * @param userId The initialized user. + */ + void onInitialized(@UserIdInt int userId); + } + /** * Check whether an activity should be started. * @@ -36,4 +50,17 @@ public abstract class PermissionPolicyInternal { */ public abstract boolean checkStartActivity(@NonNull Intent intent, int callingUid, @Nullable String callingPackage); + + /** + * @return Whether the policy is initialized for a user. + */ + public abstract boolean isInitialized(@UserIdInt int userId); + + /** + * Set a callback for users being initialized. If the user is already + * initialized the callback will not be invoked. + * + * @param callback The callback to register. + */ + public abstract void setOnInitializedCallback(@NonNull OnInitializedCallback callback); } diff --git a/services/core/java/com/android/server/policy/PermissionPolicyService.java b/services/core/java/com/android/server/policy/PermissionPolicyService.java index a569bffef141..3d543c96aacc 100644 --- a/services/core/java/com/android/server/policy/PermissionPolicyService.java +++ b/services/core/java/com/android/server/policy/PermissionPolicyService.java @@ -66,6 +66,7 @@ import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.pm.permission.PermissionManagerServiceInternal; +import com.android.server.policy.PermissionPolicyInternal.OnInitializedCallback; import java.util.ArrayList; import java.util.concurrent.CountDownLatch; @@ -86,6 +87,10 @@ public final class PermissionPolicyService extends SystemService { @GuardedBy("mLock") private final SparseBooleanArray mIsStarted = new SparseBooleanArray(); + /** Callbacks for when a user is initialized */ + @GuardedBy("mLock") + private OnInitializedCallback mOnInitializedCallback; + /** * Whether an async {@link #synchronizePackagePermissionsAndAppOpsForUser} is currently * scheduled for a package/user. @@ -240,12 +245,20 @@ public final class PermissionPolicyService extends SystemService { grantOrUpgradeDefaultRuntimePermissionsIfNeeded(userId); + final OnInitializedCallback callback; + synchronized (mLock) { mIsStarted.put(userId, true); + callback = mOnInitializedCallback; } // Force synchronization as permissions might have changed synchronizePermissionsAndAppOpsForUser(userId); + + // Tell observers we are initialized for this user. + if (callback != null) { + callback.onInitialized(userId); + } } @Override @@ -807,6 +820,18 @@ public final class PermissionPolicyService extends SystemService { return true; } + @Override + public boolean isInitialized(int userId) { + return isStarted(userId); + } + + @Override + public void setOnInitializedCallback(@NonNull OnInitializedCallback callback) { + synchronized (mLock) { + mOnInitializedCallback = callback; + } + } + /** * Check if the intent action is removed for the calling package (often based on target SDK * version). If the action is removed, we'll silently cancel the activity launch. diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 3a7cbf8cc06a..133b82f72746 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1973,6 +1973,11 @@ public final class SystemServer { } traceEnd(); + // Permission policy service + traceBeginAndSlog("StartPermissionPolicyService"); + mSystemServiceManager.startService(PermissionPolicyService.class); + traceEnd(); + traceBeginAndSlog("MakePackageManagerServiceReady"); mPackageManagerService.systemReady(); traceEnd(); @@ -2007,11 +2012,6 @@ public final class SystemServer { mSystemServiceManager.startBootPhase(SystemService.PHASE_DEVICE_SPECIFIC_SERVICES_READY); traceEnd(); - // Permission policy service - traceBeginAndSlog("StartPermissionPolicyService"); - mSystemServiceManager.startService(PermissionPolicyService.class); - traceEnd(); - // These are needed to propagate to the runnable below. final NetworkManagementService networkManagementF = networkManagement; final NetworkStatsService networkStatsF = networkStats; -- GitLab From 7a207e47163fd57d0b59d165f741f77560ae1303 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Sat, 27 Jul 2019 17:50:33 -0700 Subject: [PATCH 481/620] ResetLockout should be scheduled on FaceService's handler Fixes: 138501368 Test: Reject 5 times and get locked out Enter password Go back to lockscreen, no longer locked out Change-Id: I23e3022bcca533f3cacb03aa79bf0a68a9e01de2 --- .../server/biometrics/face/FaceService.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/biometrics/face/FaceService.java b/services/core/java/com/android/server/biometrics/face/FaceService.java index 9d51abeed114..a7065216f6a3 100644 --- a/services/core/java/com/android/server/biometrics/face/FaceService.java +++ b/services/core/java/com/android/server/biometrics/face/FaceService.java @@ -344,16 +344,19 @@ public class FaceService extends BiometricServiceBase { @Override // Binder call public int revokeChallenge(IBinder token) { checkPermission(MANAGE_BIOMETRIC); - // TODO(b/137106905): Schedule binder calls in FaceService to avoid deadlocks. - if (getCurrentClient() == null) { - // if we aren't handling any other HIDL calls (mCurrentClient == null), revoke the - // challenge right away. - return startRevokeChallenge(token); - } else { - // postpone revoking the challenge until we finish processing the current HIDL call. - mRevokeChallengePending = true; - return Status.OK; - } + mHandler.post(() -> { + // TODO(b/137106905): Schedule binder calls in FaceService to avoid deadlocks. + if (getCurrentClient() == null) { + // if we aren't handling any other HIDL calls (mCurrentClient == null), revoke + // the challenge right away. + startRevokeChallenge(token); + } else { + // postpone revoking the challenge until we finish processing the current HIDL + // call. + mRevokeChallengePending = true; + } + }); + return Status.OK; } @Override // Binder call -- GitLab From 5b6a1fe8a805ad86ef402ec2150434348ae73666 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 26 Jul 2019 16:38:08 -0700 Subject: [PATCH 482/620] Adding quick settings flag to sysui state - We were previously ignoring the QS state for notifications expanded since we were only using that flag for gating whether to allow back. But since we also use the state for gating swipe up, we should be explicit and check that both notifications are hidden and we are not in QS. Bug: 135969043 Test: Swipe into QS, ensure the state is set Change-Id: Ia284938e32f54998bf7aba3a051de2b30cdc0e26 --- .../systemui/shared/system/QuickStepContract.java | 11 +++++++++-- .../systemui/statusbar/phone/NavigationBarView.java | 5 ++++- .../systemui/statusbar/phone/PhoneStatusBarView.java | 3 +-- .../android/systemui/statusbar/phone/StatusBar.java | 3 +++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java index 2a890fe20d8a..c732584eddfc 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java @@ -82,11 +82,15 @@ public class QuickStepContract { public static final int SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED = 1 << 9; // The search feature is disabled (either by SUW/SysUI/device policy) public static final int SYSUI_STATE_SEARCH_DISABLED = 1 << 10; + // The notification panel is expanded and interactive (either locked or unlocked), and the + // quick settings is not expanded + public static final int SYSUI_STATE_QUICK_SETTINGS_EXPANDED = 1 << 11; @Retention(RetentionPolicy.SOURCE) @IntDef({SYSUI_STATE_SCREEN_PINNING, SYSUI_STATE_NAV_BAR_HIDDEN, SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED, + SYSUI_STATE_QUICK_SETTINGS_EXPANDED, SYSUI_STATE_BOUNCER_SHOWING, SYSUI_STATE_A11Y_BUTTON_CLICKABLE, SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE, @@ -106,6 +110,7 @@ public class QuickStepContract { str.add((flags & SYSUI_STATE_SEARCH_DISABLED) != 0 ? "search_disabled" : ""); str.add((flags & SYSUI_STATE_NAV_BAR_HIDDEN) != 0 ? "navbar_hidden" : ""); str.add((flags & SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED) != 0 ? "notif_visible" : ""); + str.add((flags & SYSUI_STATE_QUICK_SETTINGS_EXPANDED) != 0 ? "qs_visible" : ""); str.add((flags & SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING) != 0 ? "keygrd_visible" : ""); str.add((flags & SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED) != 0 ? "keygrd_occluded" : ""); @@ -154,11 +159,13 @@ public class QuickStepContract { * disabled. */ public static boolean isAssistantGestureDisabled(int sysuiStateFlags) { - // Disable when in screen pinning, immersive, the bouncer is showing, or search is disabled + // Disable when in quick settings, screen pinning, immersive, the bouncer is showing, + // or search is disabled int disableFlags = SYSUI_STATE_SCREEN_PINNING | SYSUI_STATE_NAV_BAR_HIDDEN | SYSUI_STATE_BOUNCER_SHOWING - | SYSUI_STATE_SEARCH_DISABLED; + | SYSUI_STATE_SEARCH_DISABLED + | SYSUI_STATE_QUICK_SETTINGS_EXPANDED; if ((sysuiStateFlags & disableFlags) != 0) { return true; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 9296f7e32761..081e29381a65 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -21,6 +21,7 @@ import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_HOME_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED; +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SEARCH_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.isGesturalMode; @@ -707,7 +708,7 @@ public class NavigationBarView extends FrameLayout implements } } - public void onPanelExpandedChange() { + public void onStatusBarPanelStateChanged() { updateSlippery(); updateSystemUiStateFlags(); } @@ -725,6 +726,8 @@ public class NavigationBarView extends FrameLayout implements if (mPanelView != null) { mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED, mPanelView.isFullyExpanded() && !mPanelView.isInSettings(), displayId); + mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_QUICK_SETTINGS_EXPANDED, + mPanelView.isInSettings(), displayId); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index 660810fe7eb9..8efd952e67c5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -46,7 +46,6 @@ import com.android.systemui.R; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; import com.android.systemui.statusbar.CommandQueue; -import com.android.systemui.statusbar.policy.HeadsUpManager; import java.util.Objects; @@ -279,7 +278,7 @@ public class PhoneStatusBarView extends PanelBar { super.panelExpansionChanged(frac, expanded); updateScrimFraction(); if ((frac == 0 || frac == 1) && mBar.getNavigationBarView() != null) { - mBar.getNavigationBarView().onPanelExpandedChange(); + mBar.getNavigationBarView().onStatusBarPanelStateChanged(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index f85751e71c63..06701f9ef9ba 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1510,6 +1510,9 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationPanel.setStatusAccessibilityImportance(expanded ? View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS : View.IMPORTANT_FOR_ACCESSIBILITY_AUTO); + if (getNavigationBarView() != null) { + getNavigationBarView().onStatusBarPanelStateChanged(); + } } public boolean isWakeUpComingFromTouch() { -- GitLab From 4184a1d9079bebd2993497b27b816eed659bcc89 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 26 Jul 2019 16:35:35 -0700 Subject: [PATCH 483/620] Tweak home handle colors to have some opacity Bug: 138145469 Test: Just updating some colors Change-Id: I20f79c487df86af18d54d232da09af55907a9f1a --- packages/SystemUI/res/values/attrs.xml | 5 +++-- packages/SystemUI/res/values/colors.xml | 3 +++ packages/SystemUI/res/values/styles.xml | 2 ++ .../android/systemui/statusbar/phone/NavigationHandle.java | 4 ++-- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml index f124d89070bf..6becd21984b9 100644 --- a/packages/SystemUI/res/values/attrs.xml +++ b/packages/SystemUI/res/values/attrs.xml @@ -75,14 +75,15 @@ - + diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index e7a1a660abc2..61816f60d0ba 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -116,6 +116,9 @@ #E5FFFFFF + #EBffffff + #99000000 + #30000000 diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 2f1770a39f02..6374191c4d7b 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -366,11 +366,13 @@ @color/light_mode_icon_color_dual_tone_background @color/light_mode_icon_color_dual_tone_fill @color/light_mode_icon_color_single_tone + @color/navigation_bar_home_handle_light_color