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:
+ *
+ *
+ *
Call {@link ContentCaptureManager#getContentCaptureConditions()} to infer content
+ * capture events should be generate for that URL.
+ *
Create a new {@link ContentCaptureSession} child for every HTML element that
+ * renders a new URL (like an {@code IFRAME}) and use that session to notify events from
+ * that subtree.
+ *
+ *
+ *
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:
+ *
+ *
+ *
It should only be called when content capture is enabled for the view.
+ *
It must call viewAppeared() before viewDisappeared()
+ *
viewAppearead() can only be called when the view is visible and laidout
+ *
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
--
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
+
+ 16dp90%
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
+
+ 16dp90%
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$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-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
+ 100006000
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: 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: 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
+ 106dp64dp
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_height146dp
--
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)}.
-->