Merge "SettingsProvider should use correct cache when redirecting to user 0." into lmp-dev
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 25c4897..9f683e3 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -5466,27 +5466,33 @@
/**
* Activities that want to remain visible behind a translucent activity above them must call
- * this method anytime before a return from {@link #onPause()}. If this call is successful
- * then the activity will remain visible when {@link #onPause()} is called, and can continue to
- * play media in the background, but it must stop playing and release resources prior to or
- * within the call to {@link #onVisibleBehindCanceled()}. If this call returns false, the
- * activity will not be visible in the background, and must release any media resources
- * immediately.
+ * this method anytime between the start of {@link #onResume()} and the return from
+ * {@link #onPause()}. If this call is successful then the activity will remain visible after
+ * {@link #onPause()} is called, and is allowed to continue playing media in the background.
+ *
+ * <p>The actions of this call are reset each time that this activity is brought to the
+ * front. That is, every time {@link #onResume()} is called the activity will be assumed
+ * to not have requested visible behind. Therefore, if you want this activity to continue to
+ * be visible in the background you must call this method again.
*
* <p>Only fullscreen opaque activities may make this call. I.e. this call is a nop
* for dialog and translucent activities.
*
- * <p>False will be returned any time this method is call between the return of onPause and
+ * <p>Under all circumstances, the activity must stop playing and release resources prior to or
+ * within a call to {@link #onVisibleBehindCanceled()} or if this call returns false.
+ *
+ * <p>False will be returned any time this method is called between the return of onPause and
* the next call to onResume.
*
* @param visible true to notify the system that the activity wishes to be visible behind other
* translucent activities, false to indicate otherwise. Resources must be
* released when passing false to this method.
- * @return the resulting visibiity state. If true the activity may remain visible beyond
- * {@link #onPause()}. If false then the activity may not count on being visible behind
- * other translucent activities, and must stop any media playback and release resources.
- * Returning false may occur in lieu of a call to onVisibleBehindCanceled() so the return
- * value must be checked.
+ * @return the resulting visibiity state. If true the activity will remain visible beyond
+ * {@link #onPause()} if the next activity is translucent or not fullscreen. If false
+ * then the activity may not count on being visible behind other translucent activities,
+ * and must stop any media playback and release resources.
+ * Returning false may occur in lieu of a call to {@link #onVisibleBehindCanceled()} so
+ * the return value must be checked.
*
* @see #onVisibleBehindCanceled()
* @see #onBackgroundVisibleBehindChanged(boolean)
diff --git a/core/java/android/content/ClipData.java b/core/java/android/content/ClipData.java
index d19604b..0cafff8 100644
--- a/core/java/android/content/ClipData.java
+++ b/core/java/android/content/ClipData.java
@@ -78,7 +78,7 @@
* can use the convenience method {@link Item#coerceToText Item.coerceToText}.
* In this case there is generally no need to worry about the MIME types
* reported by {@link ClipDescription#getMimeType(int) getDescription().getMimeType(int)},
- * since any clip item an always be converted to a string.
+ * since any clip item can always be converted to a string.
*
* <p>More complicated exchanges will be done through URIs, in particular
* "content:" URIs. A content URI allows the recipient of a ClippedData item
diff --git a/core/java/android/content/UriMatcher.java b/core/java/android/content/UriMatcher.java
index 1a8ea47..8487dae 100644
--- a/core/java/android/content/UriMatcher.java
+++ b/core/java/android/content/UriMatcher.java
@@ -150,7 +150,7 @@
* numbers.
* <p>
* Starting from API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
- * this method will accept leading slash in the path.
+ * this method will accept a leading slash in the path.
*
* @param authority the authority to match
* @param path the path to match. * may be used as a wild card for
diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java
index ce70455..2099c3f 100644
--- a/core/java/android/net/Uri.java
+++ b/core/java/android/net/Uri.java
@@ -151,7 +151,7 @@
}
/**
- * Returns true if this URI is relative, i.e. if it doesn't contain an
+ * Returns true if this URI is relative, i.e. if it doesn't contain an
* explicit scheme.
*
* @return true if this URI is relative, false if it's absolute
@@ -159,7 +159,7 @@
public abstract boolean isRelative();
/**
- * Returns true if this URI is absolute, i.e. if it contains an
+ * Returns true if this URI is absolute, i.e. if it contains an
* explicit scheme.
*
* @return true if this URI is absolute, false if it's relative
@@ -176,8 +176,8 @@
public abstract String getScheme();
/**
- * Gets the scheme-specific part of this URI, i.e. everything between the
- * scheme separator ':' and the fragment separator '#'. If this is a
+ * Gets the scheme-specific part of this URI, i.e. everything between
+ * the scheme separator ':' and the fragment separator '#'. If this is a
* relative URI, this method returns the entire URI. Decodes escaped octets.
*
* <p>Example: "//www.google.com/search?q=android"
@@ -187,8 +187,8 @@
public abstract String getSchemeSpecificPart();
/**
- * Gets the scheme-specific part of this URI, i.e. everything between the
- * scheme separator ':' and the fragment separator '#'. If this is a
+ * Gets the scheme-specific part of this URI, i.e. everything between
+ * the scheme separator ':' and the fragment separator '#'. If this is a
* relative URI, this method returns the entire URI. Leaves escaped octets
* intact.
*
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl
index fca15ac..16250c7 100644
--- a/core/java/android/os/INetworkManagementService.aidl
+++ b/core/java/android/os/INetworkManagementService.aidl
@@ -395,7 +395,7 @@
void setDefaultNetId(int netId);
void clearDefaultNetId();
- void setPermission(boolean internal, boolean changeNetState, in int[] uids);
+ void setPermission(String permission, in int[] uids);
void clearPermission(in int[] uids);
/**
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index 0e561bd..0ee8d86f 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -1725,10 +1725,25 @@
for (int i = 0; i < numViolations; ++i) {
if (LOG_V) Log.d(TAG, "strict mode violation stacks read from binder call. i=" + i);
ViolationInfo info = new ViolationInfo(p, !currentlyGathering);
- if (info.crashInfo.stackTrace.length() > 5000) {
- RuntimeException here = new RuntimeException("here");
- here.fillInStackTrace();
- Slog.w(TAG, "Stack is getting large: " + info.crashInfo.stackTrace, here);
+ if (info.crashInfo.stackTrace.length() > 10000) {
+ // 10000 characters is way too large for this to be any sane kind of
+ // strict mode collection of stacks. We've had a problem where we leave
+ // strict mode violations associated with the thread, and it keeps tacking
+ // more and more stacks on to the violations. Looks like we're in this casse,
+ // so we'll report it and bail on all of the current strict mode violations
+ // we currently are maintaining for this thread.
+ // First, drain the remaining violations from the parcel.
+ while (i < numViolations) {
+ info = new ViolationInfo(p, !currentlyGathering);
+ i++;
+ }
+ // Next clear out all gathered violations.
+ clearGatheredViolations();
+ // Now report the problem.
+ Slog.wtfStack(TAG, "Stack is too large: numViolations=" + numViolations
+ + " policy=#" + Integer.toHexString(policyMask)
+ + " front=" + info.crashInfo.stackTrace.substring(256));
+ return;
}
info.crashInfo.stackTrace += "# via Binder call with stack:\n" + ourStack;
BlockGuard.Policy policy = BlockGuard.getThreadPolicy();
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index ec4a53e..e40c88f 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2001,7 +2001,10 @@
public static final String DIM_SCREEN = "dim_screen";
/**
- * The timeout before the screen turns off.
+ * The amount of time in milliseconds before the device goes to sleep or begins
+ * to dream after a period of inactivity. This value is also known as the
+ * user activity timeout period since the screen isn't necessarily turned off
+ * when it expires.
*/
public static final String SCREEN_OFF_TIMEOUT = "screen_off_timeout";
@@ -4817,6 +4820,20 @@
"usb_audio_automatic_routing_disabled";
/**
+ * The timeout in milliseconds before the device fully goes to sleep after
+ * a period of inactivity. This value sets an upper bound on how long the device
+ * will stay awake or dreaming without user activity. It should generally
+ * be longer than {@link #SCREEN_OFF_TIMEOUT} as otherwise the device
+ * will sleep before it ever has a chance to dream.
+ * <p>
+ * Use -1 to disable this timeout.
+ * </p>
+ *
+ * @hide
+ */
+ public static final String SLEEP_TIMEOUT = "sleep_timeout";
+
+ /**
* This are the settings to be backed up.
*
* NOTE: Settings are backed up and restored in the order they appear
@@ -4865,7 +4882,8 @@
MOUNT_UMS_AUTOSTART,
MOUNT_UMS_PROMPT,
MOUNT_UMS_NOTIFY_ENABLED,
- UI_NIGHT_MODE
+ UI_NIGHT_MODE,
+ SLEEP_TIMEOUT
};
/**
diff --git a/core/java/android/text/method/KeyListener.java b/core/java/android/text/method/KeyListener.java
index bb79ecd..ce7054c 100644
--- a/core/java/android/text/method/KeyListener.java
+++ b/core/java/android/text/method/KeyListener.java
@@ -57,7 +57,7 @@
/**
* If the key listener wants to handle this key, return true,
- * otherwise return false and the caller (i.e. the widget host)
+ * otherwise return false and the caller (i.e. the widget host)
* will handle the key.
*/
public boolean onKeyDown(View view, Editable text,
@@ -65,7 +65,7 @@
/**
* If the key listener wants to handle this key release, return true,
- * otherwise return false and the caller (i.e. the widget host)
+ * otherwise return false and the caller (i.e. the widget host)
* will handle the key.
*/
public boolean onKeyUp(View view, Editable text,
@@ -73,7 +73,7 @@
/**
* If the key listener wants to other kinds of key events, return true,
- * otherwise return false and the caller (i.e. the widget host)
+ * otherwise return false and the caller (i.e. the widget host)
* will handle the key.
*/
public boolean onKeyOther(View view, Editable text, KeyEvent event);
diff --git a/core/java/android/transition/ChangeTransform.java b/core/java/android/transition/ChangeTransform.java
index 1b8d57c..3fd28a6 100644
--- a/core/java/android/transition/ChangeTransform.java
+++ b/core/java/android/transition/ChangeTransform.java
@@ -228,7 +228,8 @@
}
// Next handle the normal matrix transform:
- ObjectAnimator transformAnimator = createTransformAnimator(startValues, endValues);
+ ObjectAnimator transformAnimator = createTransformAnimator(startValues, endValues,
+ handleParentChange);
if (handleParentChange && transformAnimator != null && mUseOverlay) {
createGhostView(sceneRoot, startValues, endValues);
@@ -238,7 +239,7 @@
}
private ObjectAnimator createTransformAnimator(TransitionValues startValues,
- TransitionValues endValues) {
+ TransitionValues endValues, final boolean handleParentChange) {
Matrix startMatrix = (Matrix) startValues.values.get(PROPNAME_MATRIX);
Matrix endMatrix = (Matrix) endValues.values.get(PROPNAME_MATRIX);
@@ -277,7 +278,12 @@
@Override
public void onAnimationEnd(Animator animation) {
if (!mIsCanceled) {
- setCurrentMatrix(finalEndMatrix);
+ if (handleParentChange && mUseOverlay) {
+ setCurrentMatrix(finalEndMatrix);
+ } else {
+ view.setTagInternal(R.id.transitionTransform, null);
+ view.setTagInternal(R.id.parentMatrix, null);
+ }
}
ANIMATION_MATRIX_PROPERTY.set(view, null);
transforms.restore(view);
diff --git a/core/java/android/util/Slog.java b/core/java/android/util/Slog.java
index 7a5fd50..e92b846 100644
--- a/core/java/android/util/Slog.java
+++ b/core/java/android/util/Slog.java
@@ -73,18 +73,38 @@
msg + '\n' + Log.getStackTraceString(tr));
}
+ /**
+ * Like {@link Log#wtf(String, String)}, but will never cause the caller to crash, and
+ * will always be handled asynchronously. Primarily for use by coding running within
+ * the system process.
+ */
public static int wtf(String tag, String msg) {
return Log.wtf(Log.LOG_ID_SYSTEM, tag, msg, null, false, true);
}
+ /**
+ * Like {@link Log#wtfStack(String, String)}, but will never cause the caller to crash, and
+ * will always be handled asynchronously. Primarily for use by coding running within
+ * the system process.
+ */
public static int wtfStack(String tag, String msg) {
return Log.wtf(Log.LOG_ID_SYSTEM, tag, msg, null, true, true);
}
+ /**
+ * Like {@link Log#wtf(String, Throwable)}, but will never cause the caller to crash,
+ * and will always be handled asynchronously. Primarily for use by coding running within
+ * the system process.
+ */
public static int wtf(String tag, Throwable tr) {
return Log.wtf(Log.LOG_ID_SYSTEM, tag, tr.getMessage(), tr, false, true);
}
+ /**
+ * Like {@link Log#wtf(String, String, Throwable)}, but will never cause the caller to crash,
+ * and will always be handled asynchronously. Primarily for use by coding running within
+ * the system process.
+ */
public static int wtf(String tag, String msg, Throwable tr) {
return Log.wtf(Log.LOG_ID_SYSTEM, tag, msg, tr, false, true);
}
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index a2a4540..afc804c 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -256,9 +256,8 @@
updateWindow(false, false);
}
- /** @hide */
@Override
- protected void onDetachedFromWindowInternal() {
+ protected void onDetachedFromWindow() {
if (mGlobalListenersAdded) {
ViewTreeObserver observer = getViewTreeObserver();
observer.removeOnScrollChangedListener(mScrollChangedListener);
@@ -280,7 +279,7 @@
mSession = null;
mLayout.token = null;
- super.onDetachedFromWindowInternal();
+ super.onDetachedFromWindow();
}
@Override
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index b454681..1ecc8d9 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -5033,7 +5033,7 @@
* <strong>Note:</strong> When a View clears focus the framework is trying
* to give focus to the first focusable View from the top. Hence, if this
* View is the first from the top that can take focus, then all callbacks
- * related to clearing focus will be invoked after wich the framework will
+ * related to clearing focus will be invoked after which the framework will
* give focus to this view.
* </p>
*/
@@ -6379,7 +6379,7 @@
* @see #setFitsSystemWindows(boolean)
* @see #setSystemUiVisibility(int)
*
- * @deprecated As of API XX use {@link #dispatchApplyWindowInsets(WindowInsets)} to apply
+ * @deprecated As of API 20 use {@link #dispatchApplyWindowInsets(WindowInsets)} to apply
* insets to views. Views should override {@link #onApplyWindowInsets(WindowInsets)} or use
* {@link #setOnApplyWindowInsetsListener(android.view.View.OnApplyWindowInsetsListener)}
* to implement handling their own insets.
diff --git a/core/java/android/view/inputmethod/InputConnection.java b/core/java/android/view/inputmethod/InputConnection.java
index c51d8a7..ff992d3 100644
--- a/core/java/android/view/inputmethod/InputConnection.java
+++ b/core/java/android/view/inputmethod/InputConnection.java
@@ -75,7 +75,7 @@
* behavior you should adopt for a particular call, please mimic the
* default TextView implementation in the latest Android version, and
* if you decide to drift from it, please consider carefully that
- * inconsistencies in text edition behavior is almost universally felt
+ * inconsistencies in text editor behavior is almost universally felt
* as a bad thing by users.</p>
*
* <h3>Cursors, selections and compositions</h3>
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index 23f911c..5b604cd 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -1403,7 +1403,7 @@
* {@link android.widget.RelativeLayout RelativeLayout}, such as
* ALIGN_WITH_PARENT_LEFT.
* @param anchor The id of another view to use as an anchor,
- * or a boolean value(represented as {@link RelativeLayout#TRUE})
+ * or a boolean value (represented as {@link RelativeLayout#TRUE}
* for true or 0 for false). For verbs that don't refer to another sibling
* (for example, ALIGN_WITH_PARENT_BOTTOM) just use -1.
* @see #addRule(int)
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index a80d70a..5cdee53 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -7378,8 +7378,8 @@
* to turn off ellipsizing.
*
* If {@link #setMaxLines} has been used to set two or more lines,
- * {@link android.text.TextUtils.TruncateAt#END} and
- * {@link android.text.TextUtils.TruncateAt#MARQUEE}* are only supported
+ * only {@link android.text.TextUtils.TruncateAt#END} and
+ * {@link android.text.TextUtils.TruncateAt#MARQUEE} are supported
* (other ellipsizing types will not do anything).
*
* @attr ref android.R.styleable#TextView_ellipsize
diff --git a/core/java/com/android/server/BootReceiver.java b/core/java/com/android/server/BootReceiver.java
index 468d7f1..d39bf07 100644
--- a/core/java/com/android/server/BootReceiver.java
+++ b/core/java/com/android/server/BootReceiver.java
@@ -155,8 +155,10 @@
// Scan existing tombstones (in case any new ones appeared)
File[] tombstoneFiles = TOMBSTONE_DIR.listFiles();
for (int i = 0; tombstoneFiles != null && i < tombstoneFiles.length; i++) {
- addFileToDropBox(db, prefs, headers, tombstoneFiles[i].getPath(),
- LOG_SIZE, "SYSTEM_TOMBSTONE");
+ if (tombstoneFiles[i].isFile()) {
+ addFileToDropBox(db, prefs, headers, tombstoneFiles[i].getPath(),
+ LOG_SIZE, "SYSTEM_TOMBSTONE");
+ }
}
// Start watching for new tombstone files; will record them as they occur.
@@ -165,8 +167,10 @@
@Override
public void onEvent(int event, String path) {
try {
- String filename = new File(TOMBSTONE_DIR, path).getPath();
- addFileToDropBox(db, prefs, headers, filename, LOG_SIZE, "SYSTEM_TOMBSTONE");
+ File file = new File(TOMBSTONE_DIR, path);
+ if (file.isFile()) {
+ addFileToDropBox(db, prefs, headers, file.getPath(), LOG_SIZE, "SYSTEM_TOMBSTONE");
+ }
} catch (IOException e) {
Slog.e(TAG, "Can't log tombstone", e);
}
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
index 8753660..4859ee6 100644
--- a/core/jni/android_util_AssetManager.cpp
+++ b/core/jni/android_util_AssetManager.cpp
@@ -1324,21 +1324,7 @@
config.density = 0;
// Skip through XML attributes until the end or the next possible match.
- // We make two assumptions about the order of attributes:
- // 1) Among attributes with the same package ID, the attributes are
- // sorted by increasing resource ID.
- // 2) Groups of attributes with the same package ID are in the same
- // order.
- // 3) The same sorting is applied to the input attributes as is
- // to the attributes in the XML.
- //
- // ex: 02010000, 02010001, 010100f4, 010100f5
- //
- // The total order of attributes (including package ID) can not be linear
- // as shared libraries get assigned dynamic package IDs at runtime, which
- // may break the sort order established at build time.
- while (ix < NX && (Res_GETPACKAGE(curIdent) != Res_GETPACKAGE(curXmlAttr) ||
- curIdent > curXmlAttr)) {
+ while (ix < NX && curIdent > curXmlAttr) {
ix++;
curXmlAttr = xmlParser->getAttributeNameResID(ix);
}
@@ -1353,9 +1339,7 @@
}
// Skip through the style values until the end or the next possible match.
- while (styleEnt < endStyleEnt &&
- (Res_GETPACKAGE(curIdent) != Res_GETPACKAGE(styleEnt->map.name.ident) ||
- curIdent > styleEnt->map.name.ident)) {
+ while (styleEnt < endStyleEnt && curIdent > styleEnt->map.name.ident) {
styleEnt++;
}
// Retrieve the current style attribute if it matches, and step to next.
@@ -1371,9 +1355,7 @@
}
// Skip through the default style values until the end or the next possible match.
- while (defStyleEnt < endDefStyleEnt &&
- (Res_GETPACKAGE(curIdent) != Res_GETPACKAGE(defStyleEnt->map.name.ident) ||
- curIdent > defStyleEnt->map.name.ident)) {
+ while (defStyleEnt < endDefStyleEnt && curIdent > defStyleEnt->map.name.ident) {
defStyleEnt++;
}
// Retrieve the current default style attribute if it matches, and step to next.
@@ -1535,8 +1517,7 @@
config.density = 0;
// Skip through XML attributes until the end or the next possible match.
- while (ix < NX && (Res_GETPACKAGE(curIdent) != Res_GETPACKAGE(curXmlAttr) ||
- curIdent > curXmlAttr)) {
+ while (ix < NX && curIdent > curXmlAttr) {
ix++;
curXmlAttr = xmlParser->getAttributeNameResID(ix);
}
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 824ed9e..26d3133 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -412,7 +412,7 @@
<dimen name="light_y">-200dp</dimen>
<dimen name="light_z">800dp</dimen>
<dimen name="light_radius">800dp</dimen>
- <item type="dimen" format="float" name="ambient_shadow_alpha">0.047</item>
- <item type="dimen" format="float" name="spot_shadow_alpha">0.098</item>
+ <item type="dimen" format="float" name="ambient_shadow_alpha">0.075</item>
+ <item type="dimen" format="float" name="spot_shadow_alpha">0.15</item>
</resources>
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 91f5896..d3869b8 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -113,6 +113,12 @@
<group gid="loop_radio" />
</permission>
+ <!-- Hotword training apps sometimes need a GID to talk with low-level
+ hardware; give them audio for now until full HAL support is added. -->
+ <permission name="android.permission.MANAGE_VOICE_KEYPHRASES">
+ <group gid="audio" />
+ </permission>
+
<!-- ================================================================== -->
<!-- ================================================================== -->
<!-- ================================================================== -->
diff --git a/docs/html/google/gcm/ccs.jd b/docs/html/google/gcm/ccs.jd
index 1c7c802..2faf97f 100644
--- a/docs/html/google/gcm/ccs.jd
+++ b/docs/html/google/gcm/ccs.jd
@@ -81,10 +81,14 @@
<p>The CCS XMPP endpoint runs at {@code gcm.googleapis.com:5235}. When testing
functionality (with non-production users), you should instead connect to
-{@code gcm-staging.googleapis.com:5236} (note the different port). Testing on
-staging (a smaller environment where the latest CCS builds run) is beneficial
-both for isolating real users from test code, as well as for early detection of
-unexpected behavior changes.</p>
+{@code gcm-preprod.googleapis.com:5236} (note the different port). Regular
+testing on preprod (a smaller environment where the latest CCS builds run) is
+beneficial both for isolating real users from test code, as well as for early
+detection of unexpected behavior changes. Note that a connection receives upstream
+messages destined for its GCM sender ID, regardless of which environment (gcm or
+gcm-preprod) it is connected to. Therefore, test code connecting to
+{@code gcm-preprod.googleapis.com:5236} should use a different GCM sender ID to
+avoid upstream messages from production traffic being sent over test connections.</p>
<p>The connection has two important requirements:</p>
diff --git a/docs/html/guide/topics/resources/drawable-resource.jd b/docs/html/guide/topics/resources/drawable-resource.jd
index dee28fe..06bd2d0 100644
--- a/docs/html/guide/topics/resources/drawable-resource.jd
+++ b/docs/html/guide/topics/resources/drawable-resource.jd
@@ -67,7 +67,7 @@
<h2 id="Bitmap">Bitmap</h2>
-<p>A bitmap image. Android supports bitmap files in a three formats:
+<p>A bitmap image. Android supports bitmap files in three formats:
{@code .png} (preferred), {@code .jpg} (acceptable), {@code .gif} (discouraged).</p>
<p>You can reference a bitmap file directly, using the filename as the resource ID, or create an
diff --git a/docs/html/training/basics/fragments/fragment-ui.jd b/docs/html/training/basics/fragments/fragment-ui.jd
index 14469bf..4fa5b70 100644
--- a/docs/html/training/basics/fragments/fragment-ui.jd
+++ b/docs/html/training/basics/fragments/fragment-ui.jd
@@ -66,9 +66,9 @@
initial fragment(s) to the activity during the activity's
{@link android.app.Activity#onCreate onCreate()} method.</p>
-<p>An important rule when dealing with fragments—especially those that you add at
-runtime—is that the fragment must have a container {@link android.view.View} in the layout in
-which the fragment's layout will reside.</p>
+<p>An important rule when dealing with fragments—especially when adding fragments at
+runtime—is that your activity layout must include a container {@link android.view.View}
+in which you can insert the fragment.</p>
<p>The following layout is an alternative to the layout shown in the <a
href="creating.html">previous lesson</a> that shows only one fragment at a time. In order to replace
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index 61a767c..8cef137 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -1185,11 +1185,7 @@
{
int32_t id = getAttributeNameID(idx);
if (id >= 0 && (size_t)id < mTree.mNumResIds) {
- uint32_t resId = dtohl(mTree.mResIds[id]);
- if (mTree.mDynamicRefTable == NULL ||
- mTree.mDynamicRefTable->lookupResourceId(&resId) == NO_ERROR) {
- return resId;
- }
+ return dtohl(mTree.mResIds[id]);
}
return 0;
}
diff --git a/libs/hwui/ShadowTessellator.cpp b/libs/hwui/ShadowTessellator.cpp
index 35cc7a4..c1ffa0a 100644
--- a/libs/hwui/ShadowTessellator.cpp
+++ b/libs/hwui/ShadowTessellator.cpp
@@ -37,7 +37,7 @@
// A bunch of parameters to tweak the shadow.
// TODO: Allow some of these changable by debug settings or APIs.
- float heightFactor = 1.0f / 86;
+ float heightFactor = 1.0f / 128;
const float geomFactor = 64;
Caches& caches = Caches::getInstance();
diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java
index 1406f6b..3c76115 100644
--- a/opengl/java/android/opengl/GLSurfaceView.java
+++ b/opengl/java/android/opengl/GLSurfaceView.java
@@ -595,9 +595,8 @@
mDetached = false;
}
- /** @hide */
@Override
- protected void onDetachedFromWindowInternal() {
+ protected void onDetachedFromWindow() {
if (LOG_ATTACH_DETACH) {
Log.d(TAG, "onDetachedFromWindow");
}
@@ -605,7 +604,7 @@
mGLThread.requestExitAndWait();
}
mDetached = true;
- super.onDetachedFromWindowInternal();
+ super.onDetachedFromWindow();
}
// ----------------------------------------------------------------------
diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index 934ed38..efba03d 100644
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -19,6 +19,7 @@
<resources>
<bool name="def_dim_screen">true</bool>
<integer name="def_screen_off_timeout">60000</integer>
+ <integer name="def_sleep_timeout">-1</integer>
<bool name="def_airplane_mode_on">false</bool>
<!-- Comma-separated list of bluetooth, wifi, and cell. -->
<string name="def_airplane_mode_radios" translatable="false">cell,bluetooth,wifi,nfc,wimax</string>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index 873257c..b17b4cc 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -70,7 +70,7 @@
// database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion'
// is properly propagated through your change. Not doing so will result in a loss of user
// settings.
- private static final int DATABASE_VERSION = 112;
+ private static final int DATABASE_VERSION = 113;
private Context mContext;
private int mUserHandle;
@@ -1811,6 +1811,22 @@
upgradeVersion = 112;
}
+ if (upgradeVersion < 113) {
+ db.beginTransaction();
+ SQLiteStatement stmt = null;
+ try {
+ stmt = db.compileStatement("INSERT OR IGNORE INTO secure(name,value)"
+ + " VALUES(?,?);");
+ loadIntegerSetting(stmt, Settings.Secure.SLEEP_TIMEOUT,
+ R.integer.def_sleep_timeout);
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ if (stmt != null) stmt.close();
+ }
+ upgradeVersion = 113;
+ }
+
// *** Remember to update DATABASE_VERSION above!
if (upgradeVersion != currentVersion) {
@@ -2382,6 +2398,8 @@
loadBooleanSetting(stmt, Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS,
R.bool.def_lock_screen_allow_private_notifications);
+ loadIntegerSetting(stmt, Settings.Secure.SLEEP_TIMEOUT,
+ R.integer.def_sleep_timeout);
} finally {
if (stmt != null) stmt.close();
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 2502088..3453a67 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -351,8 +351,11 @@
}
public void onEvent(int event, String path) {
- int modsInFlight = sKnownMutationsInFlight.get(mUserHandle).get();
- if (modsInFlight > 0) {
+ final AtomicInteger mutationCount;
+ synchronized (SettingsProvider.this) {
+ mutationCount = sKnownMutationsInFlight.get(mUserHandle);
+ }
+ if (mutationCount != null && mutationCount.get() > 0) {
// our own modification.
return;
}
@@ -950,8 +953,13 @@
checkWritePermissions(args);
SettingsCache cache = cacheForTable(callingUser, args.table);
- final AtomicInteger mutationCount = sKnownMutationsInFlight.get(callingUser);
- mutationCount.incrementAndGet();
+ final AtomicInteger mutationCount;
+ synchronized (this) {
+ mutationCount = sKnownMutationsInFlight.get(callingUser);
+ }
+ if (mutationCount != null) {
+ mutationCount.incrementAndGet();
+ }
DatabaseHelper dbH = getOrEstablishDatabase(
TABLE_GLOBAL.equals(args.table) ? UserHandle.USER_OWNER : callingUser);
SQLiteDatabase db = dbH.getWritableDatabase();
@@ -967,7 +975,9 @@
db.setTransactionSuccessful();
} finally {
db.endTransaction();
- mutationCount.decrementAndGet();
+ if (mutationCount != null) {
+ mutationCount.decrementAndGet();
+ }
}
sendNotify(uri, callingUser);
@@ -1103,12 +1113,19 @@
return Uri.withAppendedPath(url, name);
}
- final AtomicInteger mutationCount = sKnownMutationsInFlight.get(desiredUserHandle);
- mutationCount.incrementAndGet();
+ final AtomicInteger mutationCount;
+ synchronized (this) {
+ mutationCount = sKnownMutationsInFlight.get(callingUser);
+ }
+ if (mutationCount != null) {
+ mutationCount.incrementAndGet();
+ }
DatabaseHelper dbH = getOrEstablishDatabase(desiredUserHandle);
SQLiteDatabase db = dbH.getWritableDatabase();
final long rowId = db.insert(args.table, null, initialValues);
- mutationCount.decrementAndGet();
+ if (mutationCount != null) {
+ mutationCount.decrementAndGet();
+ }
if (rowId <= 0) return null;
SettingsCache.populate(cache, initialValues); // before we notify
@@ -1135,12 +1152,19 @@
}
checkWritePermissions(args);
- final AtomicInteger mutationCount = sKnownMutationsInFlight.get(callingUser);
- mutationCount.incrementAndGet();
+ final AtomicInteger mutationCount;
+ synchronized (this) {
+ mutationCount = sKnownMutationsInFlight.get(callingUser);
+ }
+ if (mutationCount != null) {
+ mutationCount.incrementAndGet();
+ }
DatabaseHelper dbH = getOrEstablishDatabase(callingUser);
SQLiteDatabase db = dbH.getWritableDatabase();
int count = db.delete(args.table, args.where, args.args);
- mutationCount.decrementAndGet();
+ if (mutationCount != null) {
+ mutationCount.decrementAndGet();
+ }
if (count > 0) {
invalidateCache(callingUser, args.table); // before we notify
sendNotify(url, callingUser);
@@ -1168,12 +1192,19 @@
checkWritePermissions(args);
checkUserRestrictions(initialValues.getAsString(Settings.Secure.NAME), callingUser);
- final AtomicInteger mutationCount = sKnownMutationsInFlight.get(callingUser);
- mutationCount.incrementAndGet();
+ final AtomicInteger mutationCount;
+ synchronized (this) {
+ mutationCount = sKnownMutationsInFlight.get(callingUser);
+ }
+ if (mutationCount != null) {
+ mutationCount.incrementAndGet();
+ }
DatabaseHelper dbH = getOrEstablishDatabase(callingUser);
SQLiteDatabase db = dbH.getWritableDatabase();
int count = db.update(args.table, initialValues, args.where, args.args);
- mutationCount.decrementAndGet();
+ if (mutationCount != null) {
+ mutationCount.decrementAndGet();
+ }
if (count > 0) {
invalidateCache(callingUser, args.table); // before we notify
sendNotify(url, callingUser);
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index fb0faac..bbc7ccd0e 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Nee dankie"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Stel op"</string>
<string name="muted_by" msgid="6147073845094180001">"Gedemp deur <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index d81186e..52ea8f5 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -70,7 +70,7 @@
<string name="screenshot_saving_title" msgid="8242282144535555697">"ቅጽበታዊ ገጽ እይታ በማስቀመጥ ላይ..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"ቅጽበታዊ ገጽ እይታ እየተቀመጠ ነው::"</string>
<string name="screenshot_saved_title" msgid="6461865960961414961">"ቅጽበታዊ ገጽ እይታ ተቀርጿል"</string>
- <string name="screenshot_saved_text" msgid="1152839647677558815">"የአንተን ቅጽበታዊ ገጽ እይታ ለማየት ንካ"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"የእርስዎን ቅጽበታዊ ገጽ እይታ ለማየት ይንኩ"</string>
<string name="screenshot_failed_title" msgid="705781116746922771">"ቅጽበታዊ ገጽ እይታ መቅረጽ አልተቻለም::"</string>
<string name="screenshot_failed_text" msgid="1260203058661337274">"በተገደበ የማከማቻ ቦታ ምክንያት ወይም በመተግበሪያው ወይም በድርጅትዎ ስለማይፈቀድ የማያ ገጽ ቅጽበታዊ እይታዎችን ማንሳት አይቻልም።"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"የUSB ፋይል ሰደዳ አማራጮች"</string>
@@ -233,7 +233,7 @@
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"ብሩህነት"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"በራስ ሰር አሽከርክር"</string>
<string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"አዙሪት ተቆልፏል"</string>
- <string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"ምስል ገላጭ"</string>
+ <string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"በቁመት"</string>
<string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"በወርድ"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"የግቤት ስልት"</string>
<string name="quick_settings_location_label" msgid="5011327048748762257">"አካባቢ"</string>
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"አይ፣ አመሰግናለሁ"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"አዋቅር"</string>
<string name="muted_by" msgid="6147073845094180001">"ድምጽ በ<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ተዘግቷል"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>። <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index f3ca5c2..ea5be80 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"لا، شكرًا"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"إعداد"</string>
<string name="muted_by" msgid="6147073845094180001">"تم كتم الصوت بواسطة <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index bbf7a15..88b5f7e 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Няма нужда"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Настройване"</string>
<string name="muted_by" msgid="6147073845094180001">"Заглушено от <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml
index ddc959d..482ac90 100644
--- a/packages/SystemUI/res/values-bn-rBD/strings.xml
+++ b/packages/SystemUI/res/values-bn-rBD/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"না থাক"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"সেট আপ"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> দ্বারা নিঃশব্দ করা হয়েছে"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index a63cd71..99e7f19 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -358,6 +358,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"No"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configura"</string>
<string name="muted_by" msgid="6147073845094180001">"Silenciat per <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 7695154..3e1a9cc 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -358,6 +358,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Ne, děkuji"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Nastavit"</string>
<string name="muted_by" msgid="6147073845094180001">"Ignorováno stranou <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index f066e69..53b6de4 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Nej tak"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Konfigurer"</string>
<string name="muted_by" msgid="6147073845094180001">"Lyden blev afbrudt af <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index c5d7c06..1e8e8b70 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -358,6 +358,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Nein danke"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Einrichten"</string>
<string name="muted_by" msgid="6147073845094180001">"Stummgeschaltet durch <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index a0eadb4..86dd4e7 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -358,6 +358,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Όχι"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Ρύθμιση"</string>
<string name="muted_by" msgid="6147073845094180001">"Σίγαση από <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 2571add..460d2ac 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"No, thanks"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Setup"</string>
<string name="muted_by" msgid="6147073845094180001">"Muted by <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 2571add..460d2ac 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"No, thanks"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Setup"</string>
<string name="muted_by" msgid="6147073845094180001">"Muted by <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index f1ead9a..a34096b 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -358,6 +358,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"No"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configurar"</string>
<string name="muted_by" msgid="6147073845094180001">"Silenciados por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index ac04ecc..f6fc435 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"No, gracias"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configurar"</string>
<string name="muted_by" msgid="6147073845094180001">"Silenciado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml
index 83775ad..80a75dd 100644
--- a/packages/SystemUI/res/values-et-rEE/strings.xml
+++ b/packages/SystemUI/res/values-et-rEE/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Tänan, ei"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Seadistus"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> vaigistas"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml
index 20b9e82..ede3139 100644
--- a/packages/SystemUI/res/values-eu-rES/strings.xml
+++ b/packages/SystemUI/res/values-eu-rES/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Ez, eskerrik asko"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Konfiguratu"</string>
<string name="muted_by" msgid="6147073845094180001">"Audioa desaktibatu da (<xliff:g id="THIRD_PARTY">%1$s</xliff:g>)"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index ac47544..98ece3c 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"خیر، سپاسگزارم"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"راهاندازی"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> آن را بیصدا کرد"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index b5380ee..9fe1e4c 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -358,6 +358,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Non, merci"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configurer"</string>
<string name="muted_by" msgid="6147073845094180001">"Mis en sourdine par <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 3657395..b697bbe 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -358,6 +358,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Non, merci"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configurer"</string>
<string name="muted_by" msgid="6147073845094180001">"Son coupé par : <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml
index ae4211e..ce02ae9 100644
--- a/packages/SystemUI/res/values-gl-rES/strings.xml
+++ b/packages/SystemUI/res/values-gl-rES/strings.xml
@@ -253,7 +253,7 @@
<string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Non hai rede"</string>
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wifi desactivada"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="2831702993995222755">"Non hai redes gardadas dispoñibles"</string>
- <string name="quick_settings_cast_title" msgid="1893629685050355115">"Pantalla de emisión"</string>
+ <string name="quick_settings_cast_title" msgid="1893629685050355115">"Enviar pantalla"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Emitindo"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sen nome"</string>
<string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Listo para emitir"</string>
@@ -358,6 +358,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Non grazas"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configurar"</string>
<string name="muted_by" msgid="6147073845094180001">"Silenciado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 6ca12b6..5cdae2a 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"नहीं धन्यवाद"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"सेट करें"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> द्वारा म्यूट किया गया"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index b7b097a..c963398 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Ne, hvala"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Postavi"</string>
<string name="muted_by" msgid="6147073845094180001">"Zvuk je isklj. treća strana <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 039df8c..6272417 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Nem, köszönöm"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Beállítás"</string>
<string name="muted_by" msgid="6147073845094180001">"A(z) <xliff:g id="THIRD_PARTY">%1$s</xliff:g> elnémította"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 9a5521c..d863d5e 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Tidak"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Siapkan"</string>
<string name="muted_by" msgid="6147073845094180001">"Dinonaktifkan oleh <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml
index 258435a..e93a341 100644
--- a/packages/SystemUI/res/values-is-rIS/strings.xml
+++ b/packages/SystemUI/res/values-is-rIS/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Nei, takk"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Setja upp"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> tók hljóðið af"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 0acb102..2519317 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -358,6 +358,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"No, grazie"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configura"</string>
<string name="muted_by" msgid="6147073845094180001">"Audio disattivato da <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 4accd22..8c710e5 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"לא, תודה"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"הגדר"</string>
<string name="muted_by" msgid="6147073845094180001">"הושתק על ידי <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 17c7866..d313668 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -358,6 +358,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"キャンセル"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"設定"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>によりミュートになっています"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml
index 07c0e6b..79baeb7 100644
--- a/packages/SystemUI/res/values-kk-rKZ/strings.xml
+++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Жоқ, рақмет"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Реттеу"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> үнін өшірген"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml
index 461137b..31fb4637 100644
--- a/packages/SystemUI/res/values-km-rKH/strings.xml
+++ b/packages/SystemUI/res/values-km-rKH/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"ទេ អរគុណ!"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"រៀបចំ"</string>
<string name="muted_by" msgid="6147073845094180001">"បានបិទសំឡេងដោយ <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml
index 1ae6cb9..c867aba 100644
--- a/packages/SystemUI/res/values-kn-rIN/strings.xml
+++ b/packages/SystemUI/res/values-kn-rIN/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"ಬೇಡ ಧನ್ಯವಾದಗಳು"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"ಹೊಂದಿಸು"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ಅವರಿಂದ ಮ್ಯೂಟ್ ಮಾಡಲಾಗಿದೆ"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index cb92867..8bb6b53a 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -358,6 +358,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"사용 안함"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"설정"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>에서 알림음 음소거"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml
index bea18fe..e729d95 100644
--- a/packages/SystemUI/res/values-ky-rKG/strings.xml
+++ b/packages/SystemUI/res/values-ky-rKG/strings.xml
@@ -382,6 +382,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Жок, рахмат"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Орнотуу"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> тарабынан үнсүздөлдү"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index fc07127..7439b97 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Ne, ačiū"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Nustatyti"</string>
<string name="muted_by" msgid="6147073845094180001">"Nutildė <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 2795e67..e1ee182 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Nē"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Iestatīt"</string>
<string name="muted_by" msgid="6147073845094180001">"Skaņu izslēdza <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml
index 35c06cd..cde9d24 100644
--- a/packages/SystemUI/res/values-mk-rMK/strings.xml
+++ b/packages/SystemUI/res/values-mk-rMK/strings.xml
@@ -358,6 +358,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Не, фала"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Постави"</string>
<string name="muted_by" msgid="6147073845094180001">"Звукот го исклучи <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml
index c74e071..a42bd51 100644
--- a/packages/SystemUI/res/values-ml-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ml-rIN/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"വേണ്ട, നന്ദി"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"സജ്ജീകരിക്കുക"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>, മ്യൂട്ടുചെയ്തു"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml
index e160d60..f5e2115 100644
--- a/packages/SystemUI/res/values-mr-rIN/strings.xml
+++ b/packages/SystemUI/res/values-mr-rIN/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"नाही धन्यवाद"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"सेट अप"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> द्वारे नि:शब्द केले"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml
index b523450..47af85f 100644
--- a/packages/SystemUI/res/values-my-rMM/strings.xml
+++ b/packages/SystemUI/res/values-my-rMM/strings.xml
@@ -354,6 +354,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"မလိုအပ်ပါ"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"သတ်မှတ်ရန်"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> အသံပိတ်သည်"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>။ <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index a9d2bd6..6a02ff0 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Nei takk"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Konfigurer"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> har kuttet lyden"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 2fa3b30..966f2f6 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Nee, bedankt"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configureren"</string>
<string name="muted_by" msgid="6147073845094180001">"Gedempt door <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 89143690..fa15c8b 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Nie, dziękuję"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Skonfiguruj"</string>
<string name="muted_by" msgid="6147073845094180001">"Ściszone przez: <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index d315ffa..9202ef4 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Não, obrigado"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configurar"</string>
<string name="muted_by" msgid="6147073845094180001">"Som desativado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index db73032..6072ec0 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -358,6 +358,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Закрыть"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Настроить"</string>
<string name="muted_by" msgid="6147073845094180001">"Звук отключен приложением \"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>\""</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>."</string>
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 9fa532a..3d3eefd 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -358,6 +358,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Nie, vďaka"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Nastaviť"</string>
<string name="muted_by" msgid="6147073845094180001">"Stlmené aplikáciou <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 24e2a5a0..5f6bd1c 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Ne, hvala"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Nastavitev"</string>
<string name="muted_by" msgid="6147073845094180001">"Izklop zvoka: <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 1515434..5f297c3 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Не, хвала"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Подеси"</string>
<string name="muted_by" msgid="6147073845094180001">"Звук је искључио/ла <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 0bf864d..5f445be 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Nej tack"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Konfig."</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> har stängt av ljudet"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index f43d30f..91dcaab 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -354,6 +354,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Hapana, asante"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Sanidi"</string>
<string name="muted_by" msgid="6147073845094180001">"Sauti imezimwa na <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml
index f19ee7f..f769e63 100644
--- a/packages/SystemUI/res/values-ta-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ta-rIN/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"வேண்டாம்"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"அமை"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ஒலியடக்கினார்"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml
index 418ff72..e6d4fad 100644
--- a/packages/SystemUI/res/values-te-rIN/strings.xml
+++ b/packages/SystemUI/res/values-te-rIN/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"వద్దు, ధన్యవాదాలు"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"సెటప్ చేయి"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ద్వారా మ్యూట్ చేయబడింది"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 04a9b07..8a805b5 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"ไม่เป็นไร"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"ตั้งค่า"</string>
<string name="muted_by" msgid="6147073845094180001">"ปิดเสียงโดย <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g> <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 50f6558..4896786 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Hindi"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"I-set up"</string>
<string name="muted_by" msgid="6147073845094180001">"Na-mute ng <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 917fe1f..4da5564 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Hayır, teşekkürler"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Kur"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> tarafından kapatıldı"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index c1378aa..8887c7f 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Ні, дякую"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Налаштув."</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> вимикає звук"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml
index bc78d49..8972ce5 100644
--- a/packages/SystemUI/res/values-ur-rPK/strings.xml
+++ b/packages/SystemUI/res/values-ur-rPK/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"نہیں شکریہ"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"ترتیب دیں"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> کے ذریعے خاموش کردہ"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>۔ <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml
index 7edcc2a..10781ea 100644
--- a/packages/SystemUI/res/values-uz-rUZ/strings.xml
+++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Yo‘q, kerak emas"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Sozlash"</string>
<string name="muted_by" msgid="6147073845094180001">"“<xliff:g id="THIRD_PARTY">%1$s</xliff:g>” tomonidan ovozsiz qilingan"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index ae584fc..a4dccba 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Ko, cảm ơn"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Thiết lập"</string>
<string name="muted_by" msgid="6147073845094180001">"Do <xliff:g id="THIRD_PARTY">%1$s</xliff:g> tắt tiếng"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 6a8e3b6..6cc64f9 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -358,6 +358,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"不用了"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"设置"</string>
<string name="muted_by" msgid="6147073845094180001">"已被<xliff:g id="THIRD_PARTY">%1$s</xliff:g>设为静音"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>(<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>)"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 674473b..e18d0a2 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -358,6 +358,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"不用了,謝謝"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"設定"</string>
<string name="muted_by" msgid="6147073845094180001">"靜音設定者:<xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 5166adf..e890922 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -256,7 +256,7 @@
<string name="quick_settings_cast_title" msgid="1893629685050355115">"投放螢幕"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"投放"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"未命名的裝置"</string>
- <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"投放準備完成"</string>
+ <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"可以開始投放了"</string>
<string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"沒有可用裝置"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"亮度"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"自動"</string>
@@ -358,6 +358,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"不用了,謝謝"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"設定"</string>
<string name="muted_by" msgid="6147073845094180001">"由 <xliff:g id="THIRD_PARTY">%1$s</xliff:g> 設為靜音"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 89b263b..735bf9c 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -356,6 +356,5 @@
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Cha ngiyabonga"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"Lungisa"</string>
<string name="muted_by" msgid="6147073845094180001">"Ithuliswe ngu-<xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
- <!-- no translation found for zen_mode_and_condition (4462471036429759903) -->
- <skip />
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
</resources>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 08bda1f..cd82c45 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -161,12 +161,9 @@
duration of the transition in to recents from home. -->
<integer name="recents_animate_task_enter_from_home_delay">150</integer>
<!-- The min animation duration for animating the task in when transitioning from home. -->
- <integer name="recents_animate_task_enter_from_home_duration">200</integer>
- <!-- The total animation stagger delay when entering from home. -->
- <integer name="recents_animate_task_enter_from_home_stagger_delay">110</integer>
- <!-- The total animation duration added to the last card when entering from home.
- This value is partialy also added to the previous tasks -->
- <integer name="recents_animate_task_enter_from_home_stagger_duration">72</integer>
+ <integer name="recents_animate_task_enter_from_home_duration">250</integer>
+ <!-- The animation stagger to apply to each task animation when transitioning from home. -->
+ <integer name="recents_animate_task_enter_from_home_stagger_delay">12</integer>
<!-- The short duration when animating in/out the lock to app button. -->
<integer name="recents_animate_lock_to_app_button_short_duration">150</integer>
<!-- The long duration when animating in/out the lock to app button. -->
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 1a44c8c..9ee18f3 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -858,37 +858,37 @@
<!-- Monitoring dialog disconnect vpn button [CHAR LIMIT=30] -->
<string name="disconnect_vpn">Disconnect VPN</string>
- <!-- Monitoring dialog device owner body text [CHAR LIMIT=300] -->
+ <!-- Monitoring dialog device owner body text [CHAR LIMIT=400] -->
<string name="monitoring_description_device_owned">This device is managed by:\n<xliff:g id="organization">%1$s</xliff:g>\n\nYour administrator can monitor your device and network activity, including emails, apps and secure websites.\n\nFor more information, contact your administrator.</string>
- <!-- Monitoring dialog non-legacy VPN text [CHAR LIMIT=300] -->
+ <!-- Monitoring dialog non-legacy VPN text [CHAR LIMIT=400] -->
<string name="monitoring_description_vpn">You gave \"<xliff:g id="application">%1$s</xliff:g>\" permission to set up a VPN connection.\n\nThis app can monitor your device and network activity, including emails, apps and secure websites.</string>
- <!-- Monitoring dialog legacy VPN text [CHAR LIMIT=300] -->
+ <!-- Monitoring dialog legacy VPN text [CHAR LIMIT=400] -->
<string name="monitoring_description_legacy_vpn">You\'re connected to a VPN (\"<xliff:g id="application">%1$s</xliff:g>\").\n\nYour VPN service provider can monitor your device and network activity including emails, apps, and secure websites.</string>
- <!-- Monitoring dialog non-legacy VPN with device owner text [CHAR LIMIT=300] -->
+ <!-- Monitoring dialog non-legacy VPN with device owner text [CHAR LIMIT=400] -->
<string name="monitoring_description_vpn_device_owned">This device is managed by:\n<xliff:g id="organization">%1$s</xliff:g>\n\nYour administrator is capable of monitoring your network activity including emails, apps, and secure websites. For more information, contact your administrator.\n\nAlso, you gave \"<xliff:g id="application">%2$s</xliff:g>\" permission to set up a VPN connection. This app can monitor network activity too.</string>
- <!-- Monitoring dialog legacy VPN with device owner text [CHAR LIMIT=300] -->
+ <!-- Monitoring dialog legacy VPN with device owner text [CHAR LIMIT=400] -->
<string name="monitoring_description_legacy_vpn_device_owned">This device is managed by:\n<xliff:g id="organization">%1$s</xliff:g>\n\nYour administrator is capable of monitoring your network activity including emails, apps, and secure websites. For more information, contact your administrator.\n\nAlso, you\'re connected to a VPN (\"<xliff:g id="application">%2$s</xliff:g>\"). Your VPN service provider can monitor network activity too.</string>
- <!-- Monitoring dialog profile owner body text [CHAR LIMIT=300] -->
+ <!-- Monitoring dialog profile owner body text [CHAR LIMIT=400] -->
<string name="monitoring_description_profile_owned">This profile is managed by:\n<xliff:g id="organization">%1$s</xliff:g>\n\nYour administrator can monitor your device and network activity, including emails, apps and secure websites.\n\nFor more information, contact your administrator.</string>
- <!-- Monitoring dialog device and profile owner body text [CHAR LIMIT=300] -->
+ <!-- Monitoring dialog device and profile owner body text [CHAR LIMIT=400] -->
<string name="monitoring_description_device_and_profile_owned">This device is managed by:\n<xliff:g id="organization">%1$s</xliff:g>\nYour profile is managed by:\n<xliff:g id="organization">%2$s</xliff:g>\n\nYour administrator can monitor your device and network activity, including emails, apps and secure websites.\n\nFor more information, contact your administrator.</string>
- <!-- Monitoring dialog non-legacy VPN with profile owner text [CHAR LIMIT=300] -->
+ <!-- Monitoring dialog non-legacy VPN with profile owner text [CHAR LIMIT=400] -->
<string name="monitoring_description_vpn_profile_owned">This profile is managed by:\n<xliff:g id="organization">%1$s</xliff:g>\n\nYour administrator is capable of monitoring your network activity including emails, apps, and secure websites. For more information, contact your administrator.\n\nAlso, you gave \"<xliff:g id="application">%2$s</xliff:g>\" permission to set up a VPN connection. This app can monitor network activity too.</string>
- <!-- Monitoring dialog legacy VPN with profile owner text [CHAR LIMIT=300] -->
+ <!-- Monitoring dialog legacy VPN with profile owner text [CHAR LIMIT=400] -->
<string name="monitoring_description_legacy_vpn_profile_owned">This profile is managed by:\n<xliff:g id="organization">%1$s</xliff:g>\n\nYour administrator is capable of monitoring your network activity including emails, apps, and secure websites. For more information, contact your administrator.\n\nAlso, you\'re connected to a VPN (\"<xliff:g id="application">%2$s</xliff:g>\"). Your VPN service provider can monitor network activity too.</string>
- <!-- Monitoring dialog non-legacy VPN with device and profile owner text [CHAR LIMIT=300] -->
+ <!-- Monitoring dialog non-legacy VPN with device and profile owner text [CHAR LIMIT=400] -->
<string name="monitoring_description_vpn_device_and_profile_owned">This device is managed by:\n<xliff:g id="organization">%1$s</xliff:g>\nYour profile is managed by:\n<xliff:g id="organization">%2$s</xliff:g>\n\nYour administrator is capable of monitoring your network activity including emails, apps, and secure websites. For more information, contact your administrator.\n\nAlso, you gave \"<xliff:g id="application">%3$s</xliff:g>\" permission to set up a VPN connection. This app can monitor network activity too.</string>
- <!-- Monitoring dialog legacy VPN with device and profile owner text [CHAR LIMIT=300] -->
+ <!-- Monitoring dialog legacy VPN with device and profile owner text [CHAR LIMIT=400] -->
<string name="monitoring_description_legacy_vpn_device_and_profile_owned">This device is managed by:\n<xliff:g id="organization">%1$s</xliff:g>\nYour profile is managed by:\n<xliff:g id="organization">%2$s</xliff:g>\n\nYour administrator is capable of monitoring your network activity including emails, apps, and secure websites. For more information, contact your administrator.\n\nAlso, you\'re connected to a VPN (\"<xliff:g id="application">%3$s</xliff:g>\"). Your VPN service provider can monitor network activity too.</string>
<!-- Indication on the keyguard that appears when the user disables trust agents until the next time they unlock manually. [CHAR LIMIT=NONE] -->
diff --git a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
index 8416ad7..1283dcd 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
@@ -189,7 +189,7 @@
void showRelativeAffiliatedTask(boolean showNextTask) {
RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
TaskStack stack = loader.getTaskStack(mSystemServicesProxy, mContext.getResources(),
- -1, -1, false, null, null);
+ -1, -1, false, true, null, null);
// Return early if there are no tasks
if (stack.getTaskCount() == 0) return;
@@ -444,7 +444,7 @@
// Get the stack of tasks that we are animating into
RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
TaskStack stack = loader.getTaskStack(mSystemServicesProxy, mContext.getResources(),
- runningTaskId, -1, false, null, null);
+ runningTaskId, -1, false, isTopTaskHome, null, null);
if (stack.getTaskCount() == 0) {
return null;
}
@@ -485,7 +485,7 @@
// which can differ depending on the number of items in the list.
SystemServicesProxy ssp = mSystemServicesProxy;
List<ActivityManager.RecentTaskInfo> recentTasks =
- ssp.getRecentTasks(3, UserHandle.CURRENT.getIdentifier());
+ ssp.getRecentTasks(3, UserHandle.CURRENT.getIdentifier(), isTopTaskHome);
boolean useThumbnailTransition = !isTopTaskHome;
boolean hasRecentTasks = !recentTasks.isEmpty();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Constants.java b/packages/SystemUI/src/com/android/systemui/recents/Constants.java
index 103f96f..85cf077 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Constants.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Constants.java
@@ -37,6 +37,8 @@
public static final boolean EnableTaskBarTouchEvents = true;
// Enables app-info pane on long-pressing the icon
public static final boolean EnableDevAppInfoOnLongPress = true;
+ // Enables debug mode
+ public static final boolean EnableDebugMode = false;
// Enables the search bar layout
public static final boolean EnableSearchLayout = true;
// Enables the thumbnail alpha on the front-most task
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index a49bbf9..01ba5a2 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -182,14 +182,6 @@
/** Updates the set of recent tasks */
void updateRecentsTasks(Intent launchIntent) {
- // Load all the tasks
- RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
- SpaceNode root = loader.reload(this, Constants.Values.RecentsTaskLoader.PreloadFirstTasksCount);
- ArrayList<TaskStack> stacks = root.getStacks();
- if (!stacks.isEmpty()) {
- mRecentsView.setTaskStacks(root.getStacks());
- }
-
// Update the configuration based on the launch intent
boolean fromSearchHome = launchIntent.getBooleanExtra(
AlternateRecentsComponent.EXTRA_FROM_SEARCH_HOME, false);
@@ -203,6 +195,16 @@
AlternateRecentsComponent.EXTRA_FROM_TASK_ID, -1);
mConfig.launchedWithAltTab = launchIntent.getBooleanExtra(
AlternateRecentsComponent.EXTRA_TRIGGERED_FROM_ALT_TAB, false);
+
+ // Load all the tasks
+ RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
+ SpaceNode root = loader.reload(this,
+ Constants.Values.RecentsTaskLoader.PreloadFirstTasksCount,
+ mConfig.launchedFromHome);
+ ArrayList<TaskStack> stacks = root.getStacks();
+ if (!stacks.isEmpty()) {
+ mRecentsView.setTaskStacks(root.getStacks());
+ }
mConfig.launchedWithNoRecentTasks = !root.hasTasks();
// Create the home intent runnable
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
index 4696c82..2aca576 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
@@ -220,8 +220,6 @@
res.getInteger(R.integer.recents_animate_task_enter_from_home_duration);
taskViewEnterFromHomeStaggerDelay =
res.getInteger(R.integer.recents_animate_task_enter_from_home_stagger_delay);
- taskViewEnterFromHomeStaggerDuration =
- res.getInteger(R.integer.recents_animate_task_enter_from_home_stagger_duration);
taskViewExitToHomeDuration =
res.getInteger(R.integer.recents_animate_task_exit_to_home_duration);
taskViewRemoveAnimDuration =
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/DebugTrigger.java b/packages/SystemUI/src/com/android/systemui/recents/misc/DebugTrigger.java
index d000985..fbf8a86 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/DebugTrigger.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/DebugTrigger.java
@@ -19,6 +19,7 @@
import android.os.Handler;
import android.os.SystemClock;
import android.view.KeyEvent;
+import com.android.systemui.recents.Constants;
/**
* A trigger for catching a debug chord.
@@ -48,6 +49,8 @@
* then we just call the callback.
*/
public void onKeyEvent(int keyCode) {
+ if (!Constants.DebugFlags.App.EnableDebugMode) return;
+
if (mLastKeyCode == 0) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
mLastKeyCode = keyCode;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
index 9554f01..71a3ef1 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
@@ -138,7 +138,8 @@
}
/** Returns a list of the recents tasks */
- public List<ActivityManager.RecentTaskInfo> getRecentTasks(int numLatestTasks, int userId) {
+ public List<ActivityManager.RecentTaskInfo> getRecentTasks(int numLatestTasks, int userId,
+ boolean isTopTaskHome) {
if (mAm == null) return null;
// If we are mocking, then create some recent tasks
@@ -195,10 +196,11 @@
// tasks
// Check the first non-recents task, include this task even if it is marked as excluded
- // from recents. In other words, only remove excluded tasks if it is not the first task
+ // from recents if we are currently in the app. In other words, only remove excluded
+ // tasks if it is not the first active task.
boolean isExcluded = (t.baseIntent.getFlags() & Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
== Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
- if (isExcluded && !isFirstValidTask) {
+ if (isExcluded && (isTopTaskHome || !isFirstValidTask)) {
iter.remove();
continue;
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
index 9d4fe66..d40e847 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
@@ -322,11 +322,12 @@
}
/** Gets the list of recent tasks, ordered from back to front. */
- private static List<ActivityManager.RecentTaskInfo> getRecentTasks(SystemServicesProxy ssp) {
+ private static List<ActivityManager.RecentTaskInfo> getRecentTasks(SystemServicesProxy ssp,
+ boolean isTopTaskHome) {
RecentsConfiguration config = RecentsConfiguration.getInstance();
List<ActivityManager.RecentTaskInfo> tasks =
- ssp.getRecentTasks(config.maxNumTasksToLoad,
- UserHandle.CURRENT.getIdentifier());
+ ssp.getRecentTasks(config.maxNumTasksToLoad, UserHandle.CURRENT.getIdentifier(),
+ isTopTaskHome);
Collections.reverse(tasks);
return tasks;
}
@@ -408,11 +409,11 @@
}
/** Reload the set of recent tasks */
- public SpaceNode reload(Context context, int preloadCount) {
+ public SpaceNode reload(Context context, int preloadCount, boolean isTopTaskHome) {
ArrayList<Task.TaskKey> taskKeys = new ArrayList<Task.TaskKey>();
ArrayList<Task> tasksToLoad = new ArrayList<Task>();
TaskStack stack = getTaskStack(mSystemServicesProxy, context.getResources(),
- -1, preloadCount, true, taskKeys, tasksToLoad);
+ -1, preloadCount, true, isTopTaskHome, taskKeys, tasksToLoad);
SpaceNode root = new SpaceNode();
root.setStack(stack);
@@ -429,10 +430,10 @@
/** Creates a lightweight stack of the current recent tasks, without thumbnails and icons. */
public TaskStack getTaskStack(SystemServicesProxy ssp, Resources res,
int preloadTaskId, int preloadTaskCount,
- boolean loadTaskThumbnails, List<Task.TaskKey> taskKeysOut,
- List<Task> tasksToLoadOut) {
+ boolean loadTaskThumbnails, boolean isTopTaskHome,
+ List<Task.TaskKey> taskKeysOut, List<Task> tasksToLoadOut) {
RecentsConfiguration config = RecentsConfiguration.getInstance();
- List<ActivityManager.RecentTaskInfo> tasks = getRecentTasks(ssp);
+ List<ActivityManager.RecentTaskInfo> tasks = getRecentTasks(ssp, isTopTaskHome);
HashMap<Task.ComponentNameKey, ActivityInfoHandle> activityInfoCache =
new HashMap<Task.ComponentNameKey, ActivityInfoHandle>();
ArrayList<Task> tasksToAdd = new ArrayList<Task>();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
index e1e4068..40134da 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
@@ -743,6 +743,7 @@
for (int i = 0; i < childCount; i++) {
TaskView t = (TaskView) getChildAt(i);
if (t == tv) {
+ t.setClipViewInStack(false);
t.startLaunchTaskAnimation(r, true, true, lockToTask);
} else {
boolean occludesLaunchTarget = launchTargetTask.group.isTaskAboveTask(t.getTask(),
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
index 1750804..2658176 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
@@ -418,22 +418,21 @@
} else if (mConfig.launchedFromHome) {
// Animate the tasks up
int frontIndex = (ctx.currentStackViewCount - ctx.currentStackViewIndex - 1);
- float fraction = (float) frontIndex / (ctx.currentStackViewCount - 1);
- fraction = (float) Math.pow(fraction, 0.85f);
- int delay = (int) (mConfig.taskViewEnterFromHomeDelay +
- fraction * mConfig.taskViewEnterFromHomeStaggerDelay);
- long delayIncrease = (long) (fraction * mConfig.taskViewEnterFromHomeStaggerDuration);
+ int delay = mConfig.taskViewEnterFromHomeDelay +
+ frontIndex * mConfig.taskViewEnterFromHomeStaggerDelay;
+
+ setScaleX(transform.scale);
+ setScaleY(transform.scale);
if (!mConfig.fakeShadows) {
animate().translationZ(transform.translationZ);
}
animate()
- .scaleX(transform.scale)
- .scaleY(transform.scale)
.translationY(transform.translationY)
.setStartDelay(delay)
.setUpdateListener(ctx.updateListener)
.setInterpolator(mConfig.quintOutInterpolator)
- .setDuration(mConfig.taskViewEnterFromHomeDuration + delayIncrease)
+ .setDuration(mConfig.taskViewEnterFromHomeDuration +
+ frontIndex * mConfig.taskViewEnterFromHomeStaggerDelay)
.withEndAction(new Runnable() {
@Override
public void run() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 2227408..d0f73b1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -2135,6 +2135,10 @@
return onKeyguard && (isMethodInsecure || mDozing || mScreenOnComingFromTouch);
}
+ public boolean isDozing() {
+ return mDozing;
+ }
+
@Override // NotificationData.Environment
public String getCurrentMediaNotificationKey() {
return mMediaNotificationKey;
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 242f1b7..f0c599d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -23,6 +23,7 @@
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
+import android.media.session.MediaSessionLegacyHelper;
import android.os.IBinder;
import android.util.AttributeSet;
import android.view.KeyEvent;
@@ -133,11 +134,14 @@
if (!down) {
return mService.onSpacePressed();
}
+ break;
case KeyEvent.KEYCODE_VOLUME_DOWN:
case KeyEvent.KEYCODE_VOLUME_UP:
- if (down) {
- mService.wakeUpIfDozing(event.getEventTime(), false);
+ if (mService.isDozing()) {
+ MediaSessionLegacyHelper.getHelper(mContext).sendVolumeKeyEvent(event, true);
+ return true;
}
+ break;
}
if (mService.interceptMediaKey(event)) {
return true;
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index cc17422..7d4156f 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -2117,7 +2117,7 @@
// performs the current profile parent resolution.
final int resolvedUserId = mSecurityPolicy
.resolveCallingUserIdEnforcingPermissionsLocked(
- UserHandle.getCallingUserId());
+ UserHandle.USER_CURRENT);
if (resolvedUserId != mCurrentUserId) {
return null;
}
@@ -2148,7 +2148,7 @@
// performs the current profile parent resolution.
final int resolvedUserId = mSecurityPolicy
.resolveCallingUserIdEnforcingPermissionsLocked(
- UserHandle.getCallingUserId());
+ UserHandle.USER_CURRENT);
if (resolvedUserId != mCurrentUserId) {
return null;
}
@@ -2181,7 +2181,7 @@
// performs the current profile parent resolution.
final int resolvedUserId = mSecurityPolicy
.resolveCallingUserIdEnforcingPermissionsLocked(
- UserHandle.getCallingUserId());
+ UserHandle.USER_CURRENT);
if (resolvedUserId != mCurrentUserId) {
return false;
}
@@ -2233,7 +2233,7 @@
// performs the current profile parent resolution.
final int resolvedUserId = mSecurityPolicy
.resolveCallingUserIdEnforcingPermissionsLocked(
- UserHandle.getCallingUserId());
+ UserHandle.USER_CURRENT);
if (resolvedUserId != mCurrentUserId) {
return false;
}
@@ -2285,7 +2285,7 @@
// performs the current profile parent resolution.
final int resolvedUserId = mSecurityPolicy
.resolveCallingUserIdEnforcingPermissionsLocked(
- UserHandle.getCallingUserId());
+ UserHandle.USER_CURRENT);
if (resolvedUserId != mCurrentUserId) {
return false;
}
@@ -2337,7 +2337,7 @@
// performs the current profile parent resolution.
final int resolvedUserId = mSecurityPolicy
.resolveCallingUserIdEnforcingPermissionsLocked(
- UserHandle.getCallingUserId());
+ UserHandle.USER_CURRENT);
if (resolvedUserId != mCurrentUserId) {
return false;
}
@@ -2390,7 +2390,7 @@
// performs the current profile parent resolution.
final int resolvedUserId = mSecurityPolicy
.resolveCallingUserIdEnforcingPermissionsLocked(
- UserHandle.getCallingUserId());
+ UserHandle.USER_CURRENT);
if (resolvedUserId != mCurrentUserId) {
return false;
}
@@ -2441,7 +2441,7 @@
// performs the current profile parent resolution.
final int resolvedUserId = mSecurityPolicy
.resolveCallingUserIdEnforcingPermissionsLocked(
- UserHandle.getCallingUserId());
+ UserHandle.USER_CURRENT);
if (resolvedUserId != mCurrentUserId) {
return false;
}
@@ -2480,7 +2480,7 @@
// performs the current profile parent resolution.
final int resolvedUserId = mSecurityPolicy
.resolveCallingUserIdEnforcingPermissionsLocked(
- UserHandle.getCallingUserId());
+ UserHandle.USER_CURRENT);
if (resolvedUserId != mCurrentUserId) {
return false;
}
@@ -2527,7 +2527,7 @@
// performs the current profile parent resolution.
final int resolvedUserId = mSecurityPolicy
.resolveCallingUserIdEnforcingPermissionsLocked(
- UserHandle.getCallingUserId());
+ UserHandle.USER_CURRENT);
if (resolvedUserId != mCurrentUserId) {
return false;
}
@@ -3621,6 +3621,12 @@
if (callingUserId == userId) {
return resolveProfileParentLocked(userId);
}
+ final int callingUserParentId = resolveProfileParentLocked(callingUserId);
+ if (callingUserParentId == mCurrentUserId &&
+ (userId == UserHandle.USER_CURRENT
+ || userId == UserHandle.USER_CURRENT_OR_SELF)) {
+ return mCurrentUserId;
+ }
if (!hasPermission(Manifest.permission.INTERACT_ACROSS_USERS)
&& !hasPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL)) {
throw new SecurityException("Call from user " + callingUserId + " as user "
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 85ab249..a9cff22 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -137,6 +137,7 @@
import com.android.server.connectivity.NetworkAgentInfo;
import com.android.server.connectivity.NetworkMonitor;
import com.android.server.connectivity.PacManager;
+import com.android.server.connectivity.PermissionMonitor;
import com.android.server.connectivity.Tethering;
import com.android.server.connectivity.Vpn;
import com.android.server.net.BaseNetworkObserver;
@@ -225,6 +226,8 @@
private Tethering mTethering;
+ private final PermissionMonitor mPermissionMonitor;
+
private KeyStore mKeyStore;
@GuardedBy("mVpns")
@@ -702,6 +705,8 @@
mTethering = new Tethering(mContext, mNetd, statsService, mHandler.getLooper());
+ mPermissionMonitor = new PermissionMonitor(mContext, mNetd);
+
//set up the listener for user state for creating user VPNs
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_USER_STARTING);
@@ -1484,6 +1489,8 @@
}
mHandler.sendMessage(mHandler.obtainMessage(EVENT_SYSTEM_READY));
+
+ mPermissionMonitor.startMonitoring();
}
private BroadcastReceiver mUserPresentReceiver = new BroadcastReceiver() {
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index 822007a..020c951 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -16,7 +16,6 @@
package com.android.server;
-import static android.Manifest.permission.CHANGE_NETWORK_STATE;
import static android.Manifest.permission.CONNECTIVITY_INTERNAL;
import static android.Manifest.permission.DUMP;
import static android.Manifest.permission.SHUTDOWN;
@@ -2059,20 +2058,26 @@
}
@Override
- public void setPermission(boolean internal, boolean changeNetState, int[] uids) {
+ public void setPermission(String permission, int[] uids) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
- final Command cmd = new Command("network", "permission", "user", "set");
- if (internal) cmd.appendArg(CONNECTIVITY_INTERNAL);
- if (changeNetState) cmd.appendArg(CHANGE_NETWORK_STATE);
- for (int i=0; i<uids.length; i++) {
- cmd.appendArg(uids[i]);
- }
-
- try {
- mConnector.execute(cmd);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ Object[] argv = new Object[4 + MAX_UID_RANGES_PER_COMMAND];
+ argv[0] = "permission";
+ argv[1] = "user";
+ argv[2] = "set";
+ argv[3] = permission;
+ int argc = 4;
+ // Avoid overly long commands by limiting number of UIDs per command.
+ for (int i = 0; i < uids.length; ++i) {
+ argv[argc++] = uids[i];
+ if (i == uids.length - 1 || argc == argv.length) {
+ try {
+ mConnector.execute("network", Arrays.copyOf(argv, argc));
+ } catch (NativeDaemonConnectorException e) {
+ throw e.rethrowAsParcelableException();
+ }
+ argc = 4;
+ }
}
}
@@ -2080,15 +2085,22 @@
public void clearPermission(int[] uids) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
- final Command cmd = new Command("network", "permission", "user", "clear");
- for (int i=0; i<uids.length; i++) {
- cmd.appendArg(uids[i]);
- }
-
- try {
- mConnector.execute(cmd);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
+ Object[] argv = new Object[3 + MAX_UID_RANGES_PER_COMMAND];
+ argv[0] = "permission";
+ argv[1] = "user";
+ argv[2] = "clear";
+ int argc = 3;
+ // Avoid overly long commands by limiting number of UIDs per command.
+ for (int i = 0; i < uids.length; ++i) {
+ argv[argc++] = uids[i];
+ if (i == uids.length - 1 || argc == argv.length) {
+ try {
+ mConnector.execute("network", Arrays.copyOf(argv, argc));
+ } catch (NativeDaemonConnectorException e) {
+ throw e.rethrowAsParcelableException();
+ }
+ argc = 3;
+ }
}
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index e482273..4a10b73 100755
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -27,7 +27,6 @@
import static com.android.internal.util.XmlUtils.writeIntAttribute;
import static com.android.internal.util.XmlUtils.writeLongAttribute;
import static com.android.server.Watchdog.NATIVE_STACKS_OF_INTEREST;
-import static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE;
import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
import static org.xmlpull.v1.XmlPullParser.START_TAG;
import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID;
@@ -2031,7 +2030,7 @@
@Override
public void onPackageModified(String packageName) {
final int eventUserId = getChangingUserId();
- final PackageManager pm = mContext.getPackageManager();
+ final IPackageManager pm = AppGlobals.getPackageManager();
final ArrayList<Pair<Intent, Integer>> recentTaskIntents =
new ArrayList<Pair<Intent, Integer>>();
final HashSet<ComponentName> componentsKnownToExist = new HashSet<ComponentName>();
@@ -2056,13 +2055,15 @@
continue;
}
try {
- ActivityInfo info = pm.getActivityInfo(cn, eventUserId);
- if (info != null && info.isEnabled()) {
+ ActivityInfo info = pm.getActivityInfo(cn, 0, eventUserId);
+ if (info != null) {
componentsKnownToExist.add(cn);
} else {
tasksToRemove.add(p.second);
}
- } catch (Exception e) {}
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to query activity info for component: " + cn, e);
+ }
}
}
// Prune all the tasks with removed components from the list of recent tasks
@@ -4956,7 +4957,7 @@
}
}
} catch (InterruptedException e) {
- Log.wtf(TAG, e);
+ Slog.wtf(TAG, e);
}
}
@@ -4996,7 +4997,7 @@
observer.wait(200); // Wait for write-close, give up after 200msec
}
} catch (InterruptedException e) {
- Log.wtf(TAG, e);
+ Slog.wtf(TAG, e);
}
}
@@ -6331,7 +6332,7 @@
startProcessLocked(procs.get(ip), "on-hold", null);
}
}
-
+
if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
// Start looking for apps that are abusing wake locks.
Message nmsg = mHandler.obtainMessage(CHECK_EXCESSIVE_WAKE_LOCKS_MSG);
@@ -6571,7 +6572,7 @@
throw new IllegalArgumentException("File descriptors passed in options");
}
}
-
+
synchronized(this) {
int callingUid = Binder.getCallingUid();
int origUserId = userId;
@@ -6601,7 +6602,7 @@
return getIntentSenderLocked(type, packageName, callingUid, userId,
token, resultWho, requestCode, intents, resolvedTypes, flags, options);
-
+
} catch (RemoteException e) {
throw new SecurityException(e);
}
@@ -6859,7 +6860,7 @@
"setProcessForeground()");
synchronized(this) {
boolean changed = false;
-
+
synchronized (mPidsSelfLocked) {
ProcessRecord pr = mPidsSelfLocked.get(pid);
if (pr == null && isForeground) {
@@ -6895,13 +6896,13 @@
}
}
}
-
+
if (changed) {
updateOomAdjLocked();
}
}
}
-
+
// =========================================================
// PERMISSIONS
// =========================================================
@@ -6963,7 +6964,7 @@
* permission is automatically denied. (Internally a null permission
* string is used when calling {@link #checkComponentPermission} in cases
* when only uid-based security is needed.)
- *
+ *
* This can be called with or without the global lock held.
*/
@Override
@@ -7220,12 +7221,12 @@
if (DEBUG_URI_PERMISSION) Slog.v(TAG,
"Checking grant " + targetPkg + " permission to " + grantUri);
}
-
+
final IPackageManager pm = AppGlobals.getPackageManager();
// If this is not a content: uri, we can't do anything with it.
if (!ContentResolver.SCHEME_CONTENT.equals(grantUri.uri.getScheme())) {
- if (DEBUG_URI_PERMISSION) Slog.v(TAG,
+ if (DEBUG_URI_PERMISSION) Slog.v(TAG,
"Can't grant URI permission for non-content URI: " + grantUri);
return -1;
}
@@ -7353,7 +7354,7 @@
// to the uri, and the target doesn't. Let's now give this to
// the target.
- if (DEBUG_URI_PERMISSION) Slog.v(TAG,
+ if (DEBUG_URI_PERMISSION) Slog.v(TAG,
"Granting " + targetPkg + "/" + targetUid + " permission to " + grantUri);
final String authority = grantUri.uri.getAuthority();
@@ -7555,7 +7556,7 @@
final ArrayMap<GrantUri, UriPermission> perms = mGrantedUriPermissions.get(
perm.targetUid);
if (perms != null) {
- if (DEBUG_URI_PERMISSION) Slog.v(TAG,
+ if (DEBUG_URI_PERMISSION) Slog.v(TAG,
"Removing " + perm.targetUid + " permission to " + perm.uri);
perms.remove(perm.uri);
@@ -7916,9 +7917,9 @@
} catch (FileNotFoundException e) {
// Missing grants is okay
} catch (IOException e) {
- Log.wtf(TAG, "Failed reading Uri grants", e);
+ Slog.wtf(TAG, "Failed reading Uri grants", e);
} catch (XmlPullParserException e) {
- Log.wtf(TAG, "Failed reading Uri grants", e);
+ Slog.wtf(TAG, "Failed reading Uri grants", e);
} finally {
IoUtils.closeQuietly(fis);
}
@@ -8124,7 +8125,7 @@
outInfo.foregroundAppThreshold = mProcessList.getMemLevel(
ProcessList.FOREGROUND_APP_ADJ);
}
-
+
// =========================================================
// TASK MANAGEMENT
// =========================================================
@@ -8526,7 +8527,7 @@
}
}
}
-
+
/**
* TODO: Add mController hook
*/
@@ -8602,7 +8603,7 @@
/**
* Moves an activity, and all of the other activities within the same task, to the bottom
* of the history stack. The activity's order within the task is unchanged.
- *
+ *
* @param token A reference to the activity we wish to move
* @param nonRoot If false then this only works if the activity is the root
* of a task; if true it will work for any activity in a task.
@@ -9023,7 +9024,7 @@
== PackageManager.PERMISSION_GRANTED) {
return null;
}
-
+
PathPermission[] pps = cpi.pathPermissions;
if (pps != null) {
int i = pps.length;
@@ -9607,7 +9608,7 @@
}
}
}
-
+
public final void publishContentProviders(IApplicationThread caller,
List<ContentProviderHolder> providers) {
if (providers == null) {
@@ -10085,7 +10086,7 @@
return timedout;
}
-
+
public final void activitySlept(IBinder token) {
if (localLOGV) Slog.v(TAG, "Activity slept: token=" + token);
@@ -10160,7 +10161,7 @@
throw new SecurityException("Requires permission "
+ android.Manifest.permission.STOP_APP_SWITCHES);
}
-
+
synchronized(this) {
mAppSwitchesAllowedTime = SystemClock.uptimeMillis()
+ APP_SWITCH_DELAY_TIME;
@@ -10170,14 +10171,14 @@
mHandler.sendMessageDelayed(msg, APP_SWITCH_DELAY_TIME);
}
}
-
+
public void resumeAppSwitches() {
if (checkCallingPermission(android.Manifest.permission.STOP_APP_SWITCHES)
!= PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("Requires permission "
+ android.Manifest.permission.STOP_APP_SWITCHES);
}
-
+
synchronized(this) {
// Note that we don't execute any pending app switches... we will
// let those wait until either the timeout, or the next start
@@ -10185,7 +10186,7 @@
mAppSwitchesAllowedTime = 0;
}
}
-
+
boolean checkAppSwitchAllowedLocked(int sourcePid, int sourceUid,
int callingPid, int callingUid, String name) {
if (mAppSwitchesAllowedTime < SystemClock.uptimeMillis()) {
@@ -10213,7 +10214,7 @@
Slog.w(TAG, name + " request from " + sourceUid + " stopped");
return false;
}
-
+
public void setDebugApp(String packageName, boolean waitForDebugger,
boolean persistent) {
enforceCallingPermission(android.Manifest.permission.SET_DEBUG_APP,
@@ -11187,7 +11188,7 @@
}
}
}
-
+
synchronized(this) {
if (procsToKill != null) {
for (int i=procsToKill.size()-1; i>=0; i--) {
@@ -11196,20 +11197,20 @@
removeProcessLocked(proc, true, false, "system update done");
}
}
-
+
// Now that we have cleaned up any update processes, we
// are ready to start launching real processes and know that
// we won't trample on them any more.
mProcessesReady = true;
}
-
+
Slog.i(TAG, "System now ready");
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_AMS_READY,
SystemClock.uptimeMillis());
synchronized(this) {
// Make sure we have no pre-ready processes sitting around.
-
+
if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL) {
ResolveInfo ri = mContext.getPackageManager()
.resolveActivity(new Intent(Intent.ACTION_FACTORY_TEST),
@@ -11344,12 +11345,12 @@
startAppProblemLocked(app);
app.stopFreezingAllLocked();
}
-
+
/**
* Generate a process error record, suitable for attachment to a ProcessRecord.
- *
+ *
* @param app The ProcessRecord in which the error occurred.
- * @param condition Crashing, Application Not Responding, etc. Values are defined in
+ * @param condition Crashing, Application Not Responding, etc. Values are defined in
* ActivityManager.AppErrorStateInfo
* @param activity The activity associated with the crash, if known.
* @param shortMsg Short message describing the crash.
@@ -11358,7 +11359,7 @@
*
* @return Returns a fully-formed AppErrorStateInfo record.
*/
- private ActivityManager.ProcessErrorStateInfo generateProcessError(ProcessRecord app,
+ private ActivityManager.ProcessErrorStateInfo generateProcessError(ProcessRecord app,
int condition, String activity, String shortMsg, String longMsg, String stackTrace) {
ActivityManager.ProcessErrorStateInfo report = new ActivityManager.ProcessErrorStateInfo();
@@ -11711,17 +11712,10 @@
* @param crashInfo describing the context of the error
* @return true if the process should exit immediately (WTF is fatal)
*/
- public boolean handleApplicationWtf(IBinder app, final String tag, boolean system,
+ public boolean handleApplicationWtf(final IBinder app, final String tag, boolean system,
final ApplicationErrorReport.CrashInfo crashInfo) {
- final ProcessRecord r = findAppProcess(app, "WTF");
- final String processName = app == null ? "system_server"
- : (r == null ? "unknown" : r.processName);
-
- EventLog.writeEvent(EventLogTags.AM_WTF,
- UserHandle.getUserId(Binder.getCallingUid()), Binder.getCallingPid(),
- processName,
- r == null ? -1 : r.info.flags,
- tag, crashInfo.exceptionMessage);
+ final int callingUid = Binder.getCallingUid();
+ final int callingPid = Binder.getCallingPid();
if (system) {
// If this is coming from the system, we could very well have low-level
@@ -11729,14 +11723,14 @@
// never want this to become fatal, so there is that too.
mHandler.post(new Runnable() {
@Override public void run() {
- addErrorToDropBox("wtf", r, processName, null, null, tag, null, null,
- crashInfo);
+ handleApplicationWtfInner(callingUid, callingPid, app, tag, crashInfo);
}
});
return false;
}
- addErrorToDropBox("wtf", r, processName, null, null, tag, null, null, crashInfo);
+ final ProcessRecord r = handleApplicationWtfInner(callingUid, callingPid, app, tag,
+ crashInfo);
if (r != null && r.pid != Process.myPid() &&
Settings.Global.getInt(mContext.getContentResolver(),
@@ -11748,6 +11742,20 @@
}
}
+ ProcessRecord handleApplicationWtfInner(int callingUid, int callingPid, IBinder app, String tag,
+ final ApplicationErrorReport.CrashInfo crashInfo) {
+ final ProcessRecord r = findAppProcess(app, "WTF");
+ final String processName = app == null ? "system_server"
+ : (r == null ? "unknown" : r.processName);
+
+ EventLog.writeEvent(EventLogTags.AM_WTF, UserHandle.getUserId(callingUid), callingPid,
+ processName, r == null ? -1 : r.info.flags, tag, crashInfo.exceptionMessage);
+
+ addErrorToDropBox("wtf", r, processName, null, null, tag, null, null, crashInfo);
+
+ return r;
+ }
+
/**
* @param app object of some object (as stored in {@link com.android.internal.os.RuntimeInit})
* @return the corresponding {@link ProcessRecord} object, or null if none could be found
@@ -12115,14 +12123,14 @@
} else if (app.notResponding) {
report = app.notRespondingReport;
}
-
+
if (report != null) {
if (errList == null) {
errList = new ArrayList<ActivityManager.ProcessErrorStateInfo>(1);
}
errList.add(report);
} else {
- Slog.w(TAG, "Missing app error report, app = " + app.processName +
+ Slog.w(TAG, "Missing app error report, app = " + app.processName +
" crashing = " + app.crashing +
" notResponding = " + app.notResponding);
}
@@ -12181,7 +12189,7 @@
}
if ((app.thread != null) && (!app.crashing && !app.notResponding)) {
// Generate process state info for running application
- ActivityManager.RunningAppProcessInfo currApp =
+ ActivityManager.RunningAppProcessInfo currApp =
new ActivityManager.RunningAppProcessInfo(app.processName,
app.pid, app.getPackageList());
fillInProcMemInfo(app, currApp);
@@ -12263,7 +12271,7 @@
boolean dumpAll = false;
boolean dumpClient = false;
String dumpPackage = null;
-
+
int opti = 0;
while (opti < args.length) {
String opt = args[opti];
@@ -12636,12 +12644,12 @@
}
}
}
-
+
if (mForegroundProcesses.size() > 0) {
synchronized (mPidsSelfLocked) {
boolean printed = false;
for (int i=0; i<mForegroundProcesses.size(); i++) {
- ProcessRecord r = mPidsSelfLocked.get(
+ ProcessRecord r = mPidsSelfLocked.get(
mForegroundProcesses.valueAt(i).pid);
if (dumpPackage != null && (r == null
|| !r.pkgList.containsKey(dumpPackage))) {
@@ -12659,7 +12667,7 @@
}
}
}
-
+
if (mPersistentStartingProcesses.size() > 0) {
if (needSep) pw.println();
needSep = true;
@@ -12677,7 +12685,7 @@
dumpProcessList(pw, this, mRemovedProcesses, " ",
"Removed Norm", "Removed PERS", dumpPackage);
}
-
+
if (mProcessesOnHold.size() > 0) {
if (needSep) pw.println();
needSep = true;
@@ -12688,7 +12696,7 @@
}
needSep = dumpProcessesToGc(fd, pw, args, opti, needSep, dumpAll, dumpPackage);
-
+
if (mProcessCrashTimes.getMap().size() > 0) {
boolean printed = false;
long now = SystemClock.uptimeMillis();
@@ -13060,7 +13068,7 @@
ArrayList<String> strings;
ArrayList<Integer> objects;
boolean all;
-
+
ItemMatcher() {
all = true;
}
@@ -13145,7 +13153,7 @@
protected boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name, String[] args,
int opti, boolean dumpAll) {
ArrayList<ActivityRecord> activities;
-
+
synchronized (this) {
activities = mStackSupervisor.getDumpActivitiesLocked(name);
}
@@ -13268,7 +13276,7 @@
}
needSep = true;
-
+
if (!onlyHistory && mStickyBroadcasts != null && dumpPackage == null) {
for (int user=0; user<mStickyBroadcasts.size(); user++) {
if (needSep) {
@@ -13303,7 +13311,7 @@
}
}
}
-
+
if (!onlyHistory && dumpAll) {
pw.println();
for (BroadcastQueue queue : mBroadcastQueues) {
@@ -13315,7 +13323,7 @@
needSep = true;
printedAnything = true;
}
-
+
if (!printedAnything) {
pw.println(" (nothing)");
}
@@ -13651,7 +13659,7 @@
long realtime = SystemClock.elapsedRealtime();
pw.println("Applications Graphics Acceleration Info:");
pw.println("Uptime: " + uptime + " Realtime: " + realtime);
-
+
for (int i = procs.size() - 1 ; i >= 0 ; i--) {
ProcessRecord r = procs.get(i);
if (r.thread != null) {
@@ -13845,7 +13853,7 @@
boolean oomOnly = false;
boolean isCompact = false;
boolean localOnly = false;
-
+
int opti = 0;
while (opti < args.length) {
String opt = args[opti];
@@ -13879,7 +13887,7 @@
pw.println("Unknown argument: " + opt + "; use -h for help");
}
}
-
+
final boolean isCheckinRequest = scanArgs(args, "--checkin");
long uptime = SystemClock.uptimeMillis();
long realtime = SystemClock.elapsedRealtime();
@@ -14564,7 +14572,7 @@
}
return restart;
}
-
+
// =========================================================
// SERVICES
// =========================================================
@@ -14646,7 +14654,7 @@
return mServices.peekServiceLocked(service, resolvedType);
}
}
-
+
@Override
public boolean stopServiceToken(ComponentName className, IBinder token,
int startId) {
@@ -14868,11 +14876,11 @@
mServices.serviceDoneExecutingLocked((ServiceRecord)token, type, startId, res);
}
}
-
+
// =========================================================
// BACKUP AND RESTORE
// =========================================================
-
+
// Cause the target app to be launched if necessary and its backup agent
// instantiated. The backup agent will invoke backupAgentCreated() on the
// activity manager to announce its creation.
@@ -14935,7 +14943,7 @@
// mBackupAppName describe the app, so that when it binds back to the AM we
// know that it's scheduled for a backup-agent operation.
}
-
+
return true;
}
@@ -15238,7 +15246,7 @@
mReceiverResolver.removeFilter(rl.get(i));
}
}
-
+
private final void sendPackageBroadcastLocked(int cmd, String[] packages, int userId) {
for (int i = mLruProcesses.size() - 1 ; i >= 0 ; i--) {
ProcessRecord r = mLruProcesses.get(i);
@@ -15644,10 +15652,10 @@
final boolean replacePending =
(intent.getFlags()&Intent.FLAG_RECEIVER_REPLACE_PENDING) != 0;
-
+
if (DEBUG_BROADCAST) Slog.v(TAG, "Enqueing broadcast: " + intent.getAction()
+ " replacePending=" + replacePending);
-
+
int NR = registeredReceivers != null ? registeredReceivers.size() : 0;
if (!ordered && NR > 0) {
// If we are not serializing this broadcast, then send the
@@ -15755,7 +15763,7 @@
int seq = r.intent.getIntExtra("seq", -1);
Slog.i(TAG, "Enqueueing broadcast " + r.intent.getAction() + " seq=" + seq);
}
- boolean replaced = replacePending && queue.replaceOrderedBroadcastLocked(r);
+ boolean replaced = replacePending && queue.replaceOrderedBroadcastLocked(r);
if (!replaced) {
queue.enqueueOrderedBroadcastLocked(r);
queue.scheduleBroadcastsLocked();
@@ -15921,7 +15929,7 @@
Binder.restoreCallingIdentity(origId);
}
}
-
+
// =========================================================
// INSTRUMENTATION
// =========================================================
@@ -15991,17 +15999,17 @@
return true;
}
-
+
/**
- * Report errors that occur while attempting to start Instrumentation. Always writes the
+ * Report errors that occur while attempting to start Instrumentation. Always writes the
* error to the logs, but if somebody is watching, send the report there too. This enables
* the "am" command to report errors with more information.
- *
+ *
* @param watcher The IInstrumentationWatcher. Null if there isn't one.
* @param cn The component name of the instrumentation.
* @param report The error report.
*/
- private void reportStartInstrumentationFailure(IInstrumentationWatcher watcher,
+ private void reportStartInstrumentationFailure(IInstrumentationWatcher watcher,
ComponentName cn, String report) {
Slog.w(TAG, report);
try {
@@ -16071,7 +16079,7 @@
// =========================================================
// CONFIGURATION
// =========================================================
-
+
public ConfigurationInfo getDeviceConfigurationInfo() {
ConfigurationInfo config = new ConfigurationInfo();
synchronized (this) {
@@ -16161,11 +16169,11 @@
if (DEBUG_SWITCH || DEBUG_CONFIGURATION) {
Slog.i(TAG, "Updating configuration to: " + values);
}
-
+
EventLog.writeEvent(EventLogTags.CONFIGURATION_CHANGED, changes);
if (values.locale != null && !initLocale) {
- saveLocaleLocked(values.locale,
+ saveLocaleLocked(values.locale,
!values.locale.equals(mConfiguration.locale),
values.userSetLocale);
}
@@ -16181,7 +16189,7 @@
//mUsageStatsService.noteStartConfig(newConfig);
final Configuration configCopy = new Configuration(mConfiguration);
-
+
// TODO: If our config changes, should we auto dismiss any currently
// showing dialogs?
mShowDialogs = shouldShowDialogs(newConfig);
@@ -16280,7 +16288,7 @@
if(isDiff) {
SystemProperties.set("user.language", l.getLanguage());
SystemProperties.set("user.region", l.getCountry());
- }
+ }
if(isPersist) {
SystemProperties.set("persist.sys.language", l.getLanguage());
@@ -16968,7 +16976,7 @@
}
app.curRawAdj = adj;
-
+
//Slog.i(TAG, "OOM ADJ " + app + ": pid=" + app.pid +
// " adj=" + adj + " curAdj=" + app.curAdj + " maxAdj=" + app.maxAdj);
if (adj > app.maxAdj) {
@@ -17051,7 +17059,7 @@
// whatever.
}
}
-
+
/**
* Returns true if things are idle enough to perform GCs.
*/
@@ -17065,7 +17073,7 @@
return !processingBroadcasts
&& (isSleeping() || mStackSupervisor.allResumedActivitiesIdle());
}
-
+
/**
* Perform GCs on all processes that are waiting for it, but only
* if things are idle.
@@ -17094,11 +17102,11 @@
}
}
}
-
+
scheduleAppGcsLocked();
}
}
-
+
/**
* If all looks good, perform GCs on all processes waiting for them.
*/
@@ -17116,12 +17124,12 @@
*/
final void scheduleAppGcsLocked() {
mHandler.removeMessages(GC_BACKGROUND_PROCESSES_MSG);
-
+
if (mProcessesToGc.size() > 0) {
// Schedule a GC for the time to the next process.
ProcessRecord proc = mProcessesToGc.get(0);
Message msg = mHandler.obtainMessage(GC_BACKGROUND_PROCESSES_MSG);
-
+
long when = proc.lastRequestedGc + GC_MIN_INTERVAL;
long now = SystemClock.uptimeMillis();
if (when < (now+GC_TIMEOUT)) {
@@ -17130,7 +17138,7 @@
mHandler.sendMessageAtTime(msg, when);
}
}
-
+
/**
* Add a process to the array of processes waiting to be GCed. Keeps the
* list in sorted order by the last GC time. The process can't already be
@@ -17150,7 +17158,7 @@
mProcessesToGc.add(0, proc);
}
}
-
+
/**
* Set up to ask a process to GC itself. This will either do it
* immediately, or put it on the list of processes to gc the next
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index c7b9d96..e1b8278 100755
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -1105,6 +1105,11 @@
invalidateLastScreenshot();
}
next.returningOptions = null;
+
+ if (mActivityContainer.mActivityDisplay.mVisibleBehindActivity == next) {
+ // When resuming an activity, require it to call requestVisibleBehind() again.
+ mActivityContainer.mActivityDisplay.setVisibleBehindActivity(null);
+ }
}
private void setVisibile(ActivityRecord r, boolean visible) {
@@ -3296,6 +3301,11 @@
if (hasVisibleBehindActivity() &&
!mHandler.hasMessages(RELEASE_BACKGROUND_RESOURCES_TIMEOUT_MSG)) {
final ActivityRecord r = getVisibleBehindActivity();
+ if (r == topRunningActivityLocked(null)) {
+ // Don't release the top activity if it has requested to run behind the next
+ // activity.
+ return;
+ }
if (DEBUG_STATES) Slog.d(TAG, "releaseBackgroundResources activtyDisplay=" +
mActivityContainer.mActivityDisplay + " visibleBehind=" + r + " app=" + r.app +
" thread=" + r.app.thread);
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index e9f0558..bbfb62a 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -2243,9 +2243,13 @@
r.idle = true;
//Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
- if (!mService.mBooted && isFrontStack(r.task.stack)) {
- mService.mBooted = true;
- enableScreen = true;
+ if (isFrontStack(r.task.stack) || fromTimeout) {
+ booting = mService.mBooting;
+ mService.mBooting = false;
+ if (!mService.mBooted) {
+ mService.mBooted = true;
+ enableScreen = true;
+ }
}
}
@@ -2273,9 +2277,6 @@
mFinishingActivities.clear();
}
- booting = mService.mBooting;
- mService.mBooting = false;
-
if (mStartingUsers.size() > 0) {
startingUsers = new ArrayList<UserStartedState>(mStartingUsers);
mStartingUsers.clear();
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index 4e554eb..e01b983 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -901,7 +901,7 @@
Slog.w(TAG, "Exception when sending broadcast to "
+ r.curComponent, e);
} catch (RuntimeException e) {
- Log.wtf(TAG, "Failed sending broadcast to "
+ Slog.wtf(TAG, "Failed sending broadcast to "
+ r.curComponent + " with " + r.intent, e);
// If some unexpected exception happened, just skip
// this broadcast. At this point we are not in the call
diff --git a/services/core/java/com/android/server/am/UriPermission.java b/services/core/java/com/android/server/am/UriPermission.java
index 91daf77..650a837 100644
--- a/services/core/java/com/android/server/am/UriPermission.java
+++ b/services/core/java/com/android/server/am/UriPermission.java
@@ -257,7 +257,7 @@
*/
void removeReadOwner(UriPermissionOwner owner) {
if (!mReadOwners.remove(owner)) {
- Log.wtf(TAG, "Unknown read owner " + owner + " in " + this);
+ Slog.wtf(TAG, "Unknown read owner " + owner + " in " + this);
}
if (mReadOwners.size() == 0) {
mReadOwners = null;
@@ -282,7 +282,7 @@
*/
void removeWriteOwner(UriPermissionOwner owner) {
if (!mWriteOwners.remove(owner)) {
- Log.wtf(TAG, "Unknown write owner " + owner + " in " + this);
+ Slog.wtf(TAG, "Unknown write owner " + owner + " in " + this);
}
if (mWriteOwners.size() == 0) {
mWriteOwners = null;
diff --git a/services/core/java/com/android/server/connectivity/PermissionMonitor.java b/services/core/java/com/android/server/connectivity/PermissionMonitor.java
new file mode 100644
index 0000000..238402f
--- /dev/null
+++ b/services/core/java/com/android/server/connectivity/PermissionMonitor.java
@@ -0,0 +1,277 @@
+/*
+ * Copyright (C) 2014 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.connectivity;
+
+import static android.Manifest.permission.CHANGE_NETWORK_STATE;
+import static android.Manifest.permission.CONNECTIVITY_INTERNAL;
+import static android.content.pm.ApplicationInfo.FLAG_SYSTEM;
+import static android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
+import static android.content.pm.PackageManager.GET_PERMISSIONS;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.UserInfo;
+import android.net.Uri;
+import android.os.INetworkManagementService;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A utility class to inform Netd of UID permisisons.
+ * Does a mass update at boot and then monitors for app install/remove.
+ *
+ * @hide
+ */
+public class PermissionMonitor {
+ private static final String TAG = "PermissionMonitor";
+ private static final boolean DBG = true;
+ private static final boolean SYSTEM = true;
+ private static final boolean NETWORK = false;
+
+ private final Context mContext;
+ private final PackageManager mPackageManager;
+ private final UserManager mUserManager;
+ private final INetworkManagementService mNetd;
+ private final BroadcastReceiver mIntentReceiver;
+
+ // Values are User IDs.
+ private final Set<Integer> mUsers = new HashSet<Integer>();
+
+ // Keys are App IDs. Values are true for SYSTEM permission and false for NETWORK permission.
+ private final Map<Integer, Boolean> mApps = new HashMap<Integer, Boolean>();
+
+ public PermissionMonitor(Context context, INetworkManagementService netd) {
+ mContext = context;
+ mPackageManager = context.getPackageManager();
+ mUserManager = UserManager.get(context);
+ mNetd = netd;
+ mIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ int user = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);
+ int appUid = intent.getIntExtra(Intent.EXTRA_UID, -1);
+ Uri appData = intent.getData();
+ String appName = appData != null ? appData.getSchemeSpecificPart() : null;
+
+ if (Intent.ACTION_USER_ADDED.equals(action)) {
+ onUserAdded(user);
+ } else if (Intent.ACTION_USER_REMOVED.equals(action)) {
+ onUserRemoved(user);
+ } else if (Intent.ACTION_PACKAGE_ADDED.equals(action)) {
+ onAppAdded(appName, appUid);
+ } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
+ onAppRemoved(appUid);
+ }
+ }
+ };
+ }
+
+ // Intended to be called only once at startup, after the system is ready. Installs a broadcast
+ // receiver to monitor ongoing UID changes, so this shouldn't/needn't be called again.
+ public synchronized void startMonitoring() {
+ log("Monitoring");
+
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(Intent.ACTION_USER_ADDED);
+ intentFilter.addAction(Intent.ACTION_USER_REMOVED);
+ mContext.registerReceiverAsUser(mIntentReceiver, UserHandle.ALL, intentFilter, null, null);
+
+ intentFilter = new IntentFilter();
+ intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
+ intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+ intentFilter.addDataScheme("package");
+ mContext.registerReceiverAsUser(mIntentReceiver, UserHandle.ALL, intentFilter, null, null);
+
+ List<PackageInfo> apps = mPackageManager.getInstalledPackages(GET_PERMISSIONS);
+ if (apps == null) {
+ loge("No apps");
+ return;
+ }
+
+ for (PackageInfo app : apps) {
+ int uid = app.applicationInfo != null ? app.applicationInfo.uid : -1;
+ if (uid < 0) {
+ continue;
+ }
+
+ boolean isNetwork = hasNetworkPermission(app);
+ boolean isSystem = hasSystemPermission(app);
+
+ if (isNetwork || isSystem) {
+ Boolean permission = mApps.get(uid);
+ // If multiple packages share a UID (cf: android:sharedUserId) and ask for different
+ // permissions, don't downgrade (i.e., if it's already SYSTEM, leave it as is).
+ if (permission == null || permission == NETWORK) {
+ mApps.put(uid, isSystem);
+ }
+ }
+ }
+
+ List<UserInfo> users = mUserManager.getUsers(true); // exclude dying users
+ if (users != null) {
+ for (UserInfo user : users) {
+ mUsers.add(user.id);
+ }
+ }
+
+ log("Users: " + mUsers.size() + ", Apps: " + mApps.size());
+ update(mUsers, mApps, true);
+ }
+
+ private boolean hasPermission(PackageInfo app, String permission) {
+ if (app.requestedPermissions != null) {
+ for (String p : app.requestedPermissions) {
+ if (permission.equals(p)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private boolean hasNetworkPermission(PackageInfo app) {
+ return hasPermission(app, CHANGE_NETWORK_STATE);
+ }
+
+ private boolean hasSystemPermission(PackageInfo app) {
+ int flags = app.applicationInfo != null ? app.applicationInfo.flags : 0;
+ if ((flags & FLAG_SYSTEM) != 0 || (flags & FLAG_UPDATED_SYSTEM_APP) != 0) {
+ return true;
+ }
+ return hasPermission(app, CONNECTIVITY_INTERNAL);
+ }
+
+ private int[] toIntArray(List<Integer> list) {
+ int[] array = new int[list.size()];
+ for (int i = 0; i < list.size(); i++) {
+ array[i] = list.get(i);
+ }
+ return array;
+ }
+
+ private void update(Set<Integer> users, Map<Integer, Boolean> apps, boolean add) {
+ List<Integer> network = new ArrayList<Integer>();
+ List<Integer> system = new ArrayList<Integer>();
+ for (Entry<Integer, Boolean> app : apps.entrySet()) {
+ List<Integer> list = app.getValue() ? system : network;
+ for (int user : users) {
+ list.add(UserHandle.getUid(user, app.getKey()));
+ }
+ }
+ try {
+ if (add) {
+ mNetd.setPermission(CHANGE_NETWORK_STATE, toIntArray(network));
+ mNetd.setPermission(CONNECTIVITY_INTERNAL, toIntArray(system));
+ } else {
+ mNetd.clearPermission(toIntArray(network));
+ mNetd.clearPermission(toIntArray(system));
+ }
+ } catch (RemoteException e) {
+ loge("Exception when updating permissions: " + e);
+ }
+ }
+
+ private synchronized void onUserAdded(int user) {
+ if (user < 0) {
+ loge("Invalid user in onUserAdded: " + user);
+ return;
+ }
+ mUsers.add(user);
+
+ Set<Integer> users = new HashSet<Integer>();
+ users.add(user);
+ update(users, mApps, true);
+ }
+
+ private synchronized void onUserRemoved(int user) {
+ if (user < 0) {
+ loge("Invalid user in onUserRemoved: " + user);
+ return;
+ }
+ mUsers.remove(user);
+
+ Set<Integer> users = new HashSet<Integer>();
+ users.add(user);
+ update(users, mApps, false);
+ }
+
+ private synchronized void onAppAdded(String appName, int appUid) {
+ if (TextUtils.isEmpty(appName) || appUid < 0) {
+ loge("Invalid app in onAppAdded: " + appName + " | " + appUid);
+ return;
+ }
+
+ try {
+ PackageInfo app = mPackageManager.getPackageInfo(appName, GET_PERMISSIONS);
+ boolean isNetwork = hasNetworkPermission(app);
+ boolean isSystem = hasSystemPermission(app);
+ if (isNetwork || isSystem) {
+ Boolean permission = mApps.get(appUid);
+ // If multiple packages share a UID (cf: android:sharedUserId) and ask for different
+ // permissions, don't downgrade (i.e., if it's already SYSTEM, leave it as is).
+ if (permission == null || permission == NETWORK) {
+ mApps.put(appUid, isSystem);
+
+ Map<Integer, Boolean> apps = new HashMap<Integer, Boolean>();
+ apps.put(appUid, isSystem);
+ update(mUsers, apps, true);
+ }
+ }
+ } catch (NameNotFoundException e) {
+ loge("NameNotFoundException in onAppAdded: " + e);
+ }
+ }
+
+ private synchronized void onAppRemoved(int appUid) {
+ if (appUid < 0) {
+ loge("Invalid app in onAppRemoved: " + appUid);
+ return;
+ }
+ mApps.remove(appUid);
+
+ Map<Integer, Boolean> apps = new HashMap<Integer, Boolean>();
+ apps.put(appUid, NETWORK); // doesn't matter which permission we pick here
+ update(mUsers, apps, false);
+ }
+
+ private static void log(String s) {
+ if (DBG) {
+ Log.d(TAG, s);
+ }
+ }
+
+ private static void loge(String s) {
+ Log.e(TAG, s);
+ }
+}
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 43c01cd..97748e8 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -448,7 +448,7 @@
mWifiDisplayAdapter.requestStopScanLocked();
}
} else if (mWifiDisplayScanRequestCount < 0) {
- Log.wtf(TAG, "mWifiDisplayScanRequestCount became negative: "
+ Slog.wtf(TAG, "mWifiDisplayScanRequestCount became negative: "
+ mWifiDisplayScanRequestCount);
mWifiDisplayScanRequestCount = 0;
}
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index 557a44e..e6007bf 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -150,48 +150,50 @@
}
public boolean shouldIntercept(NotificationRecord record) {
- if (mZenMode != Global.ZEN_MODE_OFF) {
- if (isSystem(record)) {
- return false;
- }
- if (isAlarm(record)) {
- if (mZenMode == Global.ZEN_MODE_NO_INTERRUPTIONS) {
- ZenLog.traceIntercepted(record, "alarm");
- return true;
+ if (isSystem(record)) {
+ return false;
+ }
+ switch (mZenMode) {
+ case Global.ZEN_MODE_NO_INTERRUPTIONS:
+ // #notevenalarms
+ ZenLog.traceIntercepted(record, "none");
+ return true;
+ case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS:
+ if (isAlarm(record)) {
+ // Alarms are always priority
+ return false;
}
- return false;
- }
- // allow user-prioritized packages through in priority mode
- if (mZenMode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS) {
+ // allow user-prioritized packages through in priority mode
if (record.getPackagePriority() == Notification.PRIORITY_MAX) {
ZenLog.traceNotIntercepted(record, "priorityApp");
return false;
}
- }
- if (isCall(record)) {
- if (!mConfig.allowCalls) {
- ZenLog.traceIntercepted(record, "!allowCalls");
- return true;
+ if (isCall(record)) {
+ if (!mConfig.allowCalls) {
+ ZenLog.traceIntercepted(record, "!allowCalls");
+ return true;
+ }
+ return shouldInterceptAudience(record);
}
- return shouldInterceptAudience(record);
- }
- if (isMessage(record)) {
- if (!mConfig.allowMessages) {
- ZenLog.traceIntercepted(record, "!allowMessages");
- return true;
+ if (isMessage(record)) {
+ if (!mConfig.allowMessages) {
+ ZenLog.traceIntercepted(record, "!allowMessages");
+ return true;
+ }
+ return shouldInterceptAudience(record);
}
- return shouldInterceptAudience(record);
- }
- if (isEvent(record)) {
- if (!mConfig.allowEvents) {
- ZenLog.traceIntercepted(record, "!allowEvents");
- return true;
+ if (isEvent(record)) {
+ if (!mConfig.allowEvents) {
+ ZenLog.traceIntercepted(record, "!allowEvents");
+ return true;
+ }
+ return false;
}
- }
- ZenLog.traceIntercepted(record, "!allowed");
- return true;
+ ZenLog.traceIntercepted(record, "!priority");
+ return true;
+ default:
+ return false;
}
- return false;
}
private boolean shouldInterceptAudience(NotificationRecord record) {
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index dcc4f8d..d787919 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -254,7 +254,7 @@
try {
IPackageManager pm = AppGlobals.getPackageManager();
ActivityInfo info = pm.getActivityInfo(component, 0, user.getIdentifier());
- return info != null && info.isEnabled();
+ return info != null;
} finally {
Binder.restoreCallingIdentity(ident);
}
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index c106546..d5858a5 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -325,9 +325,9 @@
} catch (FileNotFoundException e) {
// Missing sessions are okay, probably first boot
} catch (IOException e) {
- Log.wtf(TAG, "Failed reading install sessions", e);
+ Slog.wtf(TAG, "Failed reading install sessions", e);
} catch (XmlPullParserException e) {
- Log.wtf(TAG, "Failed reading install sessions", e);
+ Slog.wtf(TAG, "Failed reading install sessions", e);
} finally {
IoUtils.closeQuietly(fis);
}
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 4e33ca8..9473495 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -1178,12 +1178,14 @@
mReadMessages.append("Error reading: " + e.toString());
PackageManagerService.reportSettingsProblem(Log.ERROR,
"Error reading stopped packages: " + e);
- Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
+ Slog.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages",
+ e);
} catch (java.io.IOException e) {
mReadMessages.append("Error reading: " + e.toString());
PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
- Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
+ Slog.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages",
+ e);
}
}
@@ -1272,7 +1274,8 @@
// might have been corrupted.
if (!backupFile.exists()) {
if (!userPackagesStateFile.renameTo(backupFile)) {
- Log.wtf(PackageManagerService.TAG, "Unable to backup user packages state file, "
+ Slog.wtf(PackageManagerService.TAG,
+ "Unable to backup user packages state file, "
+ "current changes will be lost at reboot");
return;
}
@@ -1379,7 +1382,7 @@
// Done, all is good!
return;
} catch(java.io.IOException e) {
- Log.wtf(PackageManagerService.TAG,
+ Slog.wtf(PackageManagerService.TAG,
"Unable to write package manager user packages state, "
+ " current changes will be lost at reboot", e);
}
@@ -1485,12 +1488,14 @@
mReadMessages.append("Error reading: " + e.toString());
PackageManagerService.reportSettingsProblem(Log.ERROR,
"Error reading stopped packages: " + e);
- Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
+ Slog.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages",
+ e);
} catch (java.io.IOException e) {
mReadMessages.append("Error reading: " + e.toString());
PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
- Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
+ Slog.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages",
+ e);
}
}
@@ -1507,7 +1512,8 @@
// might have been corrupted.
if (!mBackupSettingsFilename.exists()) {
if (!mSettingsFilename.renameTo(mBackupSettingsFilename)) {
- Log.wtf(PackageManagerService.TAG, "Unable to backup package manager settings, "
+ Slog.wtf(PackageManagerService.TAG,
+ "Unable to backup package manager settings, "
+ " current changes will be lost at reboot");
return;
}
@@ -1698,7 +1704,7 @@
str.close();
journal.commit();
} catch (Exception e) {
- Log.wtf(TAG, "Failed to write packages.list", e);
+ Slog.wtf(TAG, "Failed to write packages.list", e);
IoUtils.closeQuietly(str);
journal.rollback();
}
@@ -1707,16 +1713,16 @@
return;
} catch(XmlPullParserException e) {
- Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
+ Slog.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
+ "current changes will be lost at reboot", e);
} catch(java.io.IOException e) {
- Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
+ Slog.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
+ "current changes will be lost at reboot", e);
}
// Clean up partially written files
if (mSettingsFilename.exists()) {
if (!mSettingsFilename.delete()) {
- Log.wtf(PackageManagerService.TAG, "Failed to clean up mangled file: "
+ Slog.wtf(PackageManagerService.TAG, "Failed to clean up mangled file: "
+ mSettingsFilename);
}
}
@@ -1984,7 +1990,7 @@
mReadMessages.append("No start tag found in settings file\n");
PackageManagerService.reportSettingsProblem(Log.WARN,
"No start tag found in package manager settings");
- Log.wtf(PackageManagerService.TAG,
+ Slog.wtf(PackageManagerService.TAG,
"No start tag found in package manager settings");
return false;
}
@@ -2097,12 +2103,12 @@
} catch (XmlPullParserException e) {
mReadMessages.append("Error reading: " + e.toString());
PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
- Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
+ Slog.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
} catch (java.io.IOException e) {
mReadMessages.append("Error reading: " + e.toString());
PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
- Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
+ Slog.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
}
final int N = mPendingPackages.size();
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 4f41bee..52807c0 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -142,10 +142,12 @@
// Summarizes the user activity state.
private static final int USER_ACTIVITY_SCREEN_BRIGHT = 1 << 0;
private static final int USER_ACTIVITY_SCREEN_DIM = 1 << 1;
+ private static final int USER_ACTIVITY_SCREEN_DREAM = 1 << 2;
// Default timeout in milliseconds. This is only used until the settings
// provider populates the actual default value (R.integer.def_screen_off_timeout).
private static final int DEFAULT_SCREEN_OFF_TIMEOUT = 15 * 1000;
+ private static final int DEFAULT_SLEEP_TIMEOUT = -1;
// Power hints defined in hardware/libhardware/include/hardware/power.h.
private static final int POWER_HINT_INTERACTION = 2;
@@ -214,7 +216,6 @@
private long mLastInteractivePowerHintTime;
// A bitfield that summarizes the effect of the user activity timer.
- // A zero value indicates that the user activity timer has expired.
private int mUserActivitySummary;
// The desired display power state. The actual state may lag behind the
@@ -340,6 +341,9 @@
// The screen off timeout setting value in milliseconds.
private int mScreenOffTimeoutSetting;
+ // The sleep timeout setting value in milliseconds.
+ private int mSleepTimeoutSetting;
+
// The maximum allowable screen off timeout according to the device
// administration policy. Overrides other settings.
private int mMaximumScreenOffTimeoutFromDeviceAdmin = Integer.MAX_VALUE;
@@ -543,6 +547,9 @@
resolver.registerContentObserver(Settings.System.getUriFor(
Settings.System.SCREEN_OFF_TIMEOUT),
false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.SLEEP_TIMEOUT),
+ false, mSettingsObserver, UserHandle.USER_ALL);
resolver.registerContentObserver(Settings.Global.getUriFor(
Settings.Global.STAY_ON_WHILE_PLUGGED_IN),
false, mSettingsObserver, UserHandle.USER_ALL);
@@ -624,6 +631,9 @@
mScreenOffTimeoutSetting = Settings.System.getIntForUser(resolver,
Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT,
UserHandle.USER_CURRENT);
+ mSleepTimeoutSetting = Settings.Secure.getIntForUser(resolver,
+ Settings.Secure.SLEEP_TIMEOUT, DEFAULT_SLEEP_TIMEOUT,
+ UserHandle.USER_CURRENT);
mStayOnWhilePluggedInSetting = Settings.Global.getInt(resolver,
Settings.Global.STAY_ON_WHILE_PLUGGED_IN, BatteryManager.BATTERY_PLUGGED_AC);
@@ -1431,7 +1441,8 @@
if (mWakefulness == WAKEFULNESS_AWAKE
|| mWakefulness == WAKEFULNESS_DREAMING
|| mWakefulness == WAKEFULNESS_DOZING) {
- final int screenOffTimeout = getScreenOffTimeoutLocked();
+ final int sleepTimeout = getSleepTimeoutLocked();
+ final int screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout);
final int screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
mUserActivitySummary = 0;
@@ -1439,11 +1450,11 @@
nextTimeout = mLastUserActivityTime
+ screenOffTimeout - screenDimDuration;
if (now < nextTimeout) {
- mUserActivitySummary |= USER_ACTIVITY_SCREEN_BRIGHT;
+ mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;
} else {
nextTimeout = mLastUserActivityTime + screenOffTimeout;
if (now < nextTimeout) {
- mUserActivitySummary |= USER_ACTIVITY_SCREEN_DIM;
+ mUserActivitySummary = USER_ACTIVITY_SCREEN_DIM;
}
}
}
@@ -1458,7 +1469,22 @@
}
}
}
- if (mUserActivitySummary != 0) {
+ if (mUserActivitySummary == 0) {
+ if (sleepTimeout >= 0) {
+ final long anyUserActivity = Math.max(mLastUserActivityTime,
+ mLastUserActivityTimeNoChangeLights);
+ if (anyUserActivity >= mLastWakeTime) {
+ nextTimeout = anyUserActivity + sleepTimeout;
+ if (now < nextTimeout) {
+ mUserActivitySummary = USER_ACTIVITY_SCREEN_DREAM;
+ }
+ }
+ } else {
+ mUserActivitySummary = USER_ACTIVITY_SCREEN_DREAM;
+ nextTimeout = -1;
+ }
+ }
+ if (mUserActivitySummary != 0 && nextTimeout >= 0) {
Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY_TIMEOUT);
msg.setAsynchronous(true);
mHandler.sendMessageAtTime(msg, nextTimeout);
@@ -1495,7 +1521,15 @@
}
}
- private int getScreenOffTimeoutLocked() {
+ private int getSleepTimeoutLocked() {
+ int timeout = mSleepTimeoutSetting;
+ if (timeout <= 0) {
+ return -1;
+ }
+ return Math.max(timeout, mMinimumScreenOffTimeoutConfig);
+ }
+
+ private int getScreenOffTimeoutLocked(int sleepTimeout) {
int timeout = mScreenOffTimeoutSetting;
if (isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()) {
timeout = Math.min(timeout, mMaximumScreenOffTimeoutFromDeviceAdmin);
@@ -1503,6 +1537,9 @@
if (mUserActivityTimeoutOverrideFromWindowManager >= 0) {
timeout = (int)Math.min(timeout, mUserActivityTimeoutOverrideFromWindowManager);
}
+ if (sleepTimeout >= 0) {
+ timeout = Math.min(timeout, sleepTimeout);
+ }
return Math.max(timeout, mMinimumScreenOffTimeoutConfig);
}
@@ -1619,8 +1656,7 @@
mSandmanScheduled = false;
wakefulness = mWakefulness;
if (mSandmanSummoned && mDisplayReady) {
- startDreaming = ((wakefulness == WAKEFULNESS_DREAMING && canDreamLocked())
- || wakefulness == WAKEFULNESS_DOZING);
+ startDreaming = canDreamLocked() || canDozeLocked();
mSandmanSummoned = false;
} else {
startDreaming = false;
@@ -1708,13 +1744,14 @@
/**
* Returns true if the device is allowed to dream in its current state.
- * This function is not called when dozing.
*/
private boolean canDreamLocked() {
if (mWakefulness != WAKEFULNESS_DREAMING
|| !mDreamsSupportedConfig
|| !mDreamsEnabledSetting
|| !mDisplayPowerRequest.isBrightOrDim()
+ || (mUserActivitySummary & (USER_ACTIVITY_SCREEN_BRIGHT
+ | USER_ACTIVITY_SCREEN_DIM | USER_ACTIVITY_SCREEN_DREAM)) == 0
|| !mBootCompleted) {
return false;
}
@@ -1737,6 +1774,13 @@
}
/**
+ * Returns true if the device is allowed to doze in its current state.
+ */
+ private boolean canDozeLocked() {
+ return mWakefulness == WAKEFULNESS_DOZING;
+ }
+
+ /**
* Updates the display power state asynchronously.
* When the update is finished, mDisplayReady will be set to true. The display
* controller posts a message to tell us when the actual display power state
@@ -2126,7 +2170,7 @@
t.start();
t.join();
} catch (InterruptedException e) {
- Log.wtf(TAG, e);
+ Slog.wtf(TAG, e);
}
}
@@ -2343,6 +2387,7 @@
pw.println(" mMaximumScreenDimDurationConfig=" + mMaximumScreenDimDurationConfig);
pw.println(" mMaximumScreenDimRatioConfig=" + mMaximumScreenDimRatioConfig);
pw.println(" mScreenOffTimeoutSetting=" + mScreenOffTimeoutSetting);
+ pw.println(" mSleepTimeoutSetting=" + mSleepTimeoutSetting);
pw.println(" mMaximumScreenOffTimeoutFromDeviceAdmin="
+ mMaximumScreenOffTimeoutFromDeviceAdmin + " (enforced="
+ isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked() + ")");
@@ -2367,9 +2412,11 @@
pw.println(" mScreenBrightnessSettingMaximum=" + mScreenBrightnessSettingMaximum);
pw.println(" mScreenBrightnessSettingDefault=" + mScreenBrightnessSettingDefault);
- final int screenOffTimeout = getScreenOffTimeoutLocked();
+ final int sleepTimeout = getSleepTimeoutLocked();
+ final int screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout);
final int screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
pw.println();
+ pw.println("Sleep timeout: " + sleepTimeout + " ms");
pw.println("Screen off timeout: " + screenOffTimeout + " ms");
pw.println("Screen dim duration: " + screenDimDuration + " ms");
diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java
index da5cfda..69d3191 100644
--- a/services/core/java/com/android/server/wm/WindowAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowAnimator.java
@@ -632,7 +632,7 @@
mService.mWatermark.drawIfNeeded();
}
} catch (RuntimeException e) {
- Log.wtf(TAG, "Unhandled exception in Window Manager", e);
+ Slog.wtf(TAG, "Unhandled exception in Window Manager", e);
} finally {
SurfaceControl.closeTransaction();
if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 41574ca..467b9a4 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -8652,7 +8652,7 @@
}
}
} catch (RuntimeException e) {
- Log.wtf(TAG, "Unhandled exception while force removing for memory", e);
+ Slog.wtf(TAG, "Unhandled exception while force removing for memory", e);
}
try {
@@ -8677,7 +8677,7 @@
}
} catch (RuntimeException e) {
mInLayout = false;
- Log.wtf(TAG, "Unhandled exception while laying out windows", e);
+ Slog.wtf(TAG, "Unhandled exception while laying out windows", e);
}
Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
@@ -9762,7 +9762,7 @@
mDisplayManagerInternal.performTraversalInTransactionFromWindowManager();
} catch (RuntimeException e) {
- Log.wtf(TAG, "Unhandled exception in Window Manager", e);
+ Slog.wtf(TAG, "Unhandled exception in Window Manager", e);
} finally {
SurfaceControl.closeTransaction();
if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index f339dba..92ad1ad 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -272,7 +272,7 @@
private void reportWtf(String msg, Throwable e) {
Slog.w(TAG, "***********************************************");
- Log.wtf(TAG, "BOOT FAILURE " + msg, e);
+ Slog.wtf(TAG, "BOOT FAILURE " + msg, e);
}
private void performPendingShutdown() {
diff --git a/telecomm/java/android/telecom/Conference.java b/telecomm/java/android/telecom/Conference.java
index e47d9d1..b7b98bf 100644
--- a/telecomm/java/android/telecom/Conference.java
+++ b/telecomm/java/android/telecom/Conference.java
@@ -18,6 +18,7 @@
import android.annotation.SystemApi;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -37,6 +38,8 @@
public void onDisconnected(Conference conference, DisconnectCause disconnectCause) {}
public void onConnectionAdded(Conference conference, Connection connection) {}
public void onConnectionRemoved(Conference conference, Connection connection) {}
+ public void onConferenceableConnectionsChanged(
+ Conference conference, List<Connection> conferenceableConnections) {}
public void onDestroyed(Conference conference) {}
public void onCapabilitiesChanged(Conference conference, int capabilities) {}
}
@@ -45,6 +48,9 @@
private final List<Connection> mChildConnections = new CopyOnWriteArrayList<>();
private final List<Connection> mUnmodifiableChildConnections =
Collections.unmodifiableList(mChildConnections);
+ private final List<Connection> mConferenceableConnections = new ArrayList<>();
+ private final List<Connection> mUnmodifiableConferenceableConnections =
+ Collections.unmodifiableList(mConferenceableConnections);
private PhoneAccountHandle mPhoneAccount;
private AudioState mAudioState;
@@ -53,6 +59,15 @@
private int mCapabilities;
private String mDisconnectMessage;
+ private final Connection.Listener mConnectionDeathListener = new Connection.Listener() {
+ @Override
+ public void onDestroyed(Connection c) {
+ if (mConferenceableConnections.remove(c)) {
+ fireOnConferenceableConnectionsChanged();
+ }
+ }
+ };
+
/**
* Constructs a new Conference with a mandatory {@link PhoneAccountHandle}
*
@@ -120,6 +135,13 @@
public void onSeparate(Connection connection) {}
/**
+ * Invoked when the specified {@link Connection} should merged with the conference call.
+ *
+ * @param connection The {@code Connection} to merge.
+ */
+ public void onMerge(Connection connection) {}
+
+ /**
* Invoked when the conference should be put on hold.
*/
public void onHold() {}
@@ -238,6 +260,37 @@
}
/**
+ * Sets the connections with which this connection can be conferenced.
+ *
+ * @param conferenceableConnections The set of connections this connection can conference with.
+ */
+ public final void setConferenceableConnections(List<Connection> conferenceableConnections) {
+ clearConferenceableList();
+ for (Connection c : conferenceableConnections) {
+ // If statement checks for duplicates in input. It makes it N^2 but we're dealing with a
+ // small amount of items here.
+ if (!mConferenceableConnections.contains(c)) {
+ c.addConnectionListener(mConnectionDeathListener);
+ mConferenceableConnections.add(c);
+ }
+ }
+ fireOnConferenceableConnectionsChanged();
+ }
+
+ private final void fireOnConferenceableConnectionsChanged() {
+ for (Listener l : mListeners) {
+ l.onConferenceableConnectionsChanged(this, getConferenceableConnections());
+ }
+ }
+
+ /**
+ * Returns the connections with which this connection can be conferenced.
+ */
+ public final List<Connection> getConferenceableConnections() {
+ return mUnmodifiableConferenceableConnections;
+ }
+
+ /**
* Tears down the conference object and any of its current connections.
*/
public final void destroy() {
@@ -313,4 +366,11 @@
}
}
}
+
+ private final void clearConferenceableList() {
+ for (Connection c : mConferenceableConnections) {
+ c.removeConnectionListener(mConnectionDeathListener);
+ }
+ mConferenceableConnections.clear();
+ }
}
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 13acc59..b5f6692 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -870,7 +870,7 @@
}
/**
- * Obtains the connections with which this connection can be conferenced.
+ * Returns the connections with which this connection can be conferenced.
*/
public final List<Connection> getConferenceableConnections() {
return mUnmodifiableConferenceableConnections;
@@ -1100,7 +1100,7 @@
private final void fireOnConferenceableConnectionsChanged() {
for (Listener l : mListeners) {
- l.onConferenceableConnectionsChanged(this, mConferenceableConnections);
+ l.onConferenceableConnectionsChanged(this, getConferenceableConnections());
}
}
diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java
index ed9251b7..efd311e 100644
--- a/telecomm/java/android/telecom/ConnectionService.java
+++ b/telecomm/java/android/telecom/ConnectionService.java
@@ -360,6 +360,14 @@
}
@Override
+ public void onConferenceableConnectionsChanged(
+ Conference conference, List<Connection> conferenceableConnections) {
+ mAdapter.setConferenceableConnections(
+ mIdByConference.get(conference),
+ createConnectionIdList(conferenceableConnections));
+ }
+
+ @Override
public void onDestroyed(Conference conference) {
removeConference(conference);
}
@@ -638,19 +646,25 @@
private void conference(String callId1, String callId2) {
Log.d(this, "conference %s, %s", callId1, callId2);
- Connection connection1 = findConnectionForAction(callId1, "conference");
- if (connection1 == getNullConnection()) {
- Log.w(this, "Connection1 missing in conference request %s.", callId1);
- return;
- }
-
Connection connection2 = findConnectionForAction(callId2, "conference");
if (connection2 == getNullConnection()) {
Log.w(this, "Connection2 missing in conference request %s.", callId2);
return;
}
- onConference(connection1, connection2);
+ Connection connection1 = findConnectionForAction(callId1, "conference");
+ if (connection1 == getNullConnection()) {
+ Conference conference1 = findConferenceForAction(callId1, "addConnection");
+ if (conference1 == getNullConference()) {
+ Log.w(this,
+ "Connection1 or Conference1 missing in conference request %s.",
+ callId1);
+ } else {
+ conference1.onMerge(connection2);
+ }
+ } else {
+ onConference(connection1, connection2);
+ }
}
private void splitFromConference(String callId) {
diff --git a/telecomm/java/android/telecom/RemoteConference.java b/telecomm/java/android/telecom/RemoteConference.java
index b18cb96..b548274 100644
--- a/telecomm/java/android/telecom/RemoteConference.java
+++ b/telecomm/java/android/telecom/RemoteConference.java
@@ -21,6 +21,7 @@
import android.annotation.SystemApi;
import android.os.RemoteException;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -40,6 +41,9 @@
public void onConnectionAdded(RemoteConference conference, RemoteConnection connection) {}
public void onConnectionRemoved(RemoteConference conference, RemoteConnection connection) {}
public void onCapabilitiesChanged(RemoteConference conference, int capabilities) {}
+ public void onConferenceableConnectionsChanged(
+ RemoteConference conference,
+ List<RemoteConnection> conferenceableConnections) {}
public void onDestroyed(RemoteConference conference) {}
}
@@ -50,6 +54,9 @@
private final List<RemoteConnection> mChildConnections = new CopyOnWriteArrayList<>();
private final List<RemoteConnection> mUnmodifiableChildConnections =
Collections.unmodifiableList(mChildConnections);
+ private final List<RemoteConnection> mConferenceableConnections = new ArrayList<>();
+ private final List<RemoteConnection> mUnmodifiableConferenceableConnections =
+ Collections.unmodifiableList(mConferenceableConnections);
private int mState = Connection.STATE_NEW;
private DisconnectCause mDisconnectCause;
@@ -127,6 +134,15 @@
}
}
+ /** @hide */
+ void setConferenceableConnections(List<RemoteConnection> conferenceableConnections) {
+ mConferenceableConnections.clear();
+ mConferenceableConnections.addAll(conferenceableConnections);
+ for (Callback c : mCallbacks) {
+ c.onConferenceableConnectionsChanged(this, mUnmodifiableConferenceableConnections);
+ }
+ }
+
/** {@hide} */
void setDisconnected(DisconnectCause disconnectCause) {
if (mState != Connection.STATE_DISCONNECTED) {
@@ -219,6 +235,10 @@
}
}
+ public List<RemoteConnection> getConferenceableConnections() {
+ return mUnmodifiableConferenceableConnections;
+ }
+
public final void registerCallback(Callback callback) {
mCallbacks.add(callback);
}
diff --git a/telecomm/java/android/telecom/RemoteConnectionService.java b/telecomm/java/android/telecom/RemoteConnectionService.java
index d959e50..328dc86 100644
--- a/telecomm/java/android/telecom/RemoteConnectionService.java
+++ b/telecomm/java/android/telecom/RemoteConnectionService.java
@@ -278,8 +278,13 @@
}
}
- findConnectionForAction(callId, "setConferenceableConnections")
- .setConferenceableConnections(conferenceable);
+ if (hasConnection(callId)) {
+ findConnectionForAction(callId, "setConferenceableConnections")
+ .setConferenceableConnections(conferenceable);
+ } else {
+ findConferenceForAction(callId, "setConferenceableConnections")
+ .setConferenceableConnections(conferenceable);
+ }
}
};
@@ -358,6 +363,10 @@
}
}
+ private boolean hasConnection(String callId) {
+ return mConferenceById.containsKey(callId);
+ }
+
private RemoteConnection findConnectionForAction(
String callId, String action) {
if (mConnectionById.containsKey(callId)) {
diff --git a/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java b/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java
index 5794b2b..dd823ae 100644
--- a/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java
+++ b/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java
@@ -155,16 +155,12 @@
homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Intent intent;
if (isleanback) {
- Log.d(TAG, "Leanback and relax!");
+ Log.d(TAG, "Leanback and relax! " + packageName);
intent = mPackageManager.getLeanbackLaunchIntentForPackage(packageName);
} else {
intent = mPackageManager.getLaunchIntentForPackage(packageName);
}
- // Skip if the apk does not have a launch intent.
- if (intent == null) {
- Log.d(TAG, "Skipping " + packageName + "; missing launch intent");
- return null;
- }
+ assertNotNull("Skipping " + packageName + "; missing launch intent", intent);
String processName = getProcessName(packageName);
diff --git a/tests/SharedLibrary/lib/res/layout/main.xml b/tests/SharedLibrary/lib/res/layout/main.xml
deleted file mode 100644
index df0204d9..0000000
--- a/tests/SharedLibrary/lib/res/layout/main.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/sample_layout"/>
-
- <com.google.android.test.shared_library.AddressView xmlns:address="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:background="#03a9f4"
- address:name="Librarian L"
- address:streetNumber="21"
- address:streetName="Android Lane"
- address:city="AndroidVille"
- address:state="OS"
- address:zip="12345"
- address:country="Mobile"/>
-
-</LinearLayout>
diff --git a/tests/SharedLibrary/lib/res/values/strings.xml b/tests/SharedLibrary/lib/res/values/strings.xml
index 9beccd9..6827f93 100644
--- a/tests/SharedLibrary/lib/res/values/strings.xml
+++ b/tests/SharedLibrary/lib/res/values/strings.xml
@@ -28,5 +28,4 @@
</string-array>
<string name="racoon">Racoon</string>
- <string name="sample_layout">This is an example of a layout this library provides.</string>
</resources>
diff --git a/tests/SharedLibrary/lib/src/com/google/android/test/shared_library/ActivityMain.java b/tests/SharedLibrary/lib/src/com/google/android/test/shared_library/ActivityMain.java
index 4b4893c..895aced 100644
--- a/tests/SharedLibrary/lib/src/com/google/android/test/shared_library/ActivityMain.java
+++ b/tests/SharedLibrary/lib/src/com/google/android/test/shared_library/ActivityMain.java
@@ -18,11 +18,15 @@
import android.app.Activity;
import android.os.Bundle;
+import android.widget.TextView;
public class ActivityMain extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
+
+ TextView content = new TextView(this);
+ content.setText("Dummy main entry for this apk; not really needed...");
+ setContentView(content);
}
}
diff --git a/tools/aapt/CacheUpdater.h b/tools/aapt/CacheUpdater.h
index 0e65589..efb2453 100644
--- a/tools/aapt/CacheUpdater.h
+++ b/tools/aapt/CacheUpdater.h
@@ -12,6 +12,9 @@
#include <sys/stat.h>
#include <stdio.h>
#include "Images.h"
+#ifdef HAVE_MS_C_RUNTIME
+#include <direct.h>
+#endif
using namespace android;
diff --git a/tools/aidl/aidl.cpp b/tools/aidl/aidl.cpp
index 9c1867e..45dd23b 100644
--- a/tools/aidl/aidl.cpp
+++ b/tools/aidl/aidl.cpp
@@ -16,6 +16,7 @@
#ifdef HAVE_MS_C_RUNTIME
#include <io.h>
+#include <direct.h>
#include <sys/stat.h>
#endif
diff --git a/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java b/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java
index aaba545..4a6a434 100644
--- a/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java
+++ b/tools/layoutlib/bridge/src/android/content/res/BridgeTypedArray.java
@@ -23,7 +23,6 @@
import com.android.ide.common.rendering.api.StyleResourceValue;
import com.android.internal.util.XmlUtils;
import com.android.layoutlib.bridge.Bridge;
-import com.android.layoutlib.bridge.BridgeConstants;
import com.android.layoutlib.bridge.android.BridgeContext;
import com.android.layoutlib.bridge.android.BridgeXmlBlockParser;
import com.android.layoutlib.bridge.impl.ParserFactory;
@@ -142,16 +141,8 @@
*/
@Override
public CharSequence getText(int index) {
- if (index < 0 || index >= mResourceData.length) {
- return null;
- }
-
- if (mResourceData[index] != null) {
- // FIXME: handle styled strings!
- return mResourceData[index].getValue();
- }
-
- return null;
+ // FIXME: handle styled strings!
+ return getString(index);
}
/**
@@ -164,15 +155,14 @@
*/
@Override
public String getString(int index) {
- if (index < 0 || index >= mResourceData.length) {
+ if (!hasValue(index)) {
return null;
}
-
- if (mResourceData[index] != null) {
- return mResourceData[index].getValue();
- }
-
- return null;
+ // As unfortunate as it is, it's possible to use enums with all attribute formats,
+ // not just integers/enums. So, we need to search the enums always. In case,
+ // enums are used, the returned value is an integer.
+ Integer v = resolveEnumAttribute(index);
+ return v == null ? mResourceData[index].getValue() : String.valueOf((int) v);
}
/**
@@ -185,20 +175,9 @@
*/
@Override
public boolean getBoolean(int index, boolean defValue) {
- if (index < 0 || index >= mResourceData.length) {
- return defValue;
- }
+ String s = getString(index);
+ return s == null ? defValue : XmlUtils.convertValueToBoolean(s, defValue);
- if (mResourceData[index] == null) {
- return defValue;
- }
-
- String s = mResourceData[index].getValue();
- if (s != null) {
- return XmlUtils.convertValueToBoolean(s, defValue);
- }
-
- return defValue;
}
/**
@@ -211,75 +190,18 @@
*/
@Override
public int getInt(int index, int defValue) {
- if (index < 0 || index >= mResourceData.length) {
- return defValue;
- }
-
- if (mResourceData[index] == null) {
- return defValue;
- }
-
- String s = mResourceData[index].getValue();
-
- if (s == null || s.length() == 0) {
- return defValue;
- }
-
+ String s = getString(index);
try {
- return XmlUtils.convertValueToInt(s, defValue);
+ if (s != null) {
+ return XmlUtils.convertValueToInt(s, defValue);
+ }
} catch (NumberFormatException e) {
- // pass
+ Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
+ String.format("\"%s\" in attribute \"%2$s\" is not a valid integer",
+ s, mNames[index]),
+ null);
+ return defValue;
}
-
- // Field is not null and is not an integer.
- // Check for possible constants and try to find them.
- return (int) resolveEnumAttribute(index, defValue);
- }
-
- /**
- * Searches for the string in the attributes (flag or enums) and returns the integer.
- * If found, it will return an integer matching the value. However, if the value is not found,
- * it returns {@code defValue} which may be a float.
- *
- * @param index Index of attribute to retrieve.
- * @param defValue Value to return if the attribute is not found.
- *
- * @return Attribute int value, or defValue if not defined.
- */
- private float resolveEnumAttribute(int index, float defValue) {
- // Get the map of attribute-constant -> IntegerValue
- Map<String, Integer> map = null;
- if (mIsFramework[index]) {
- map = Bridge.getEnumValues(mNames[index]);
- } else {
- // get the styleable matching the resolved name
- RenderResources res = mContext.getRenderResources();
- ResourceValue attr = res.getProjectResource(ResourceType.ATTR, mNames[index]);
- if (attr instanceof AttrResourceValue) {
- map = ((AttrResourceValue) attr).getAttributeValues();
- }
- }
-
- if (map != null) {
- // accumulator to store the value of the 1+ constants.
- int result = 0;
-
- // split the value in case this is a mix of several flags.
- String[] keywords = mResourceData[index].getValue().split("\\|");
- for (String keyword : keywords) {
- Integer i = map.get(keyword.trim());
- if (i != null) {
- result |= i;
- } else {
- Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
- String.format(
- "\"%s\" in attribute \"%2$s\" is not a valid value",
- keyword, mNames[index]), null);
- }
- }
- return result;
- }
-
return defValue;
}
@@ -292,27 +214,16 @@
*/
@Override
public float getFloat(int index, float defValue) {
- if (index < 0 || index >= mResourceData.length) {
- return defValue;
- }
-
- if (mResourceData[index] == null) {
- return defValue;
- }
-
- String s = mResourceData[index].getValue();
-
- if (s != null) {
- try {
- return Float.parseFloat(s);
- } catch (NumberFormatException e) {
- Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
- String.format(
- "\"%s\" in attribute \"%2$s\" cannot be converted to float.",
- s, mNames[index]), null);
-
- // we'll return the default value below.
+ String s = getString(index);
+ try {
+ if (s != null) {
+ return Float.parseFloat(s);
}
+ } catch (NumberFormatException e) {
+ Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
+ String.format("\"%s\" in attribute \"%2$s\" cannot be converted to float.",
+ s, mNames[index]),
+ null);
}
return defValue;
}
@@ -359,11 +270,7 @@
*/
@Override
public ColorStateList getColorStateList(int index) {
- if (index < 0 || index >= mResourceData.length) {
- return null;
- }
-
- if (mResourceData[index] == null) {
+ if (!hasValue(index)) {
return null;
}
@@ -443,27 +350,25 @@
*/
@Override
public float getDimension(int index, float defValue) {
- if (index < 0 || index >= mResourceData.length) {
- return defValue;
- }
-
- if (mResourceData[index] == null) {
- return defValue;
- }
-
- String s = mResourceData[index].getValue();
-
+ String s = getString(index);
if (s == null) {
return defValue;
}
+ // Check if the value is a magic constant that doesn't require a unit.
+ try {
+ int i = Integer.parseInt(s);
+ if (i == LayoutParams.MATCH_PARENT || i == LayoutParams.WRAP_CONTENT) {
+ return i;
+ }
+ } catch (NumberFormatException ignored) {
+ // pass
+ }
if (ResourceHelper.parseFloatAttribute(mNames[index], s, mValue, true)) {
return mValue.getDimension(mBridgeResources.getDisplayMetrics());
}
- // looks like we were unable to resolve the dimension value. Check if it is an attribute
- // constant.
- return resolveEnumAttribute(index, defValue);
+ return defValue;
}
/**
@@ -511,16 +416,13 @@
try {
return getDimension(index);
} catch (RuntimeException e) {
- if (mResourceData[index] != null) {
- String s = mResourceData[index].getValue();
+ String s = getString(index);
- if (s != null) {
- // looks like we were unable to resolve the dimension value
- Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
- String.format(
- "\"%1$s\" in attribute \"%2$s\" is not a valid format.",
+ if (s != null) {
+ // looks like we were unable to resolve the dimension value
+ Bridge.getLog().warning(LayoutLog.TAG_RESOURCES_FORMAT,
+ String.format("\"%1$s\" in attribute \"%2$s\" is not a valid format.",
s, mNames[index]), null);
- }
}
return defValue;
@@ -563,21 +465,19 @@
}
private int getDimension(int index) {
- if (mResourceData[index] == null) {
- throw new RuntimeException();
- }
-
- String s = mResourceData[index].getValue();
-
+ String s = getString(index);
if (s == null) {
throw new RuntimeException();
- } else if (s.equals(BridgeConstants.MATCH_PARENT) ||
- s.equals(BridgeConstants.FILL_PARENT)) {
- return LayoutParams.MATCH_PARENT;
- } else if (s.equals(BridgeConstants.WRAP_CONTENT)) {
- return LayoutParams.WRAP_CONTENT;
}
-
+ // Check if the value is a magic constant that doesn't require a unit.
+ try {
+ int i = Integer.parseInt(s);
+ if (i == LayoutParams.MATCH_PARENT || i == LayoutParams.WRAP_CONTENT) {
+ return i;
+ }
+ } catch (NumberFormatException ignored) {
+ // pass
+ }
if (ResourceHelper.parseFloatAttribute(mNames[index], s, mValue, true)) {
float f = mValue.getDimension(mBridgeResources.getDisplayMetrics());
@@ -607,15 +507,7 @@
*/
@Override
public float getFraction(int index, int base, int pbase, float defValue) {
- if (index < 0 || index >= mResourceData.length) {
- return defValue;
- }
-
- if (mResourceData[index] == null) {
- return defValue;
- }
-
- String value = mResourceData[index].getValue();
+ String value = getString(index);
if (value == null) {
return defValue;
}
@@ -766,20 +658,11 @@
*/
@Override
public Drawable getDrawable(int index) {
- if (index < 0 || index >= mResourceData.length) {
- return null;
- }
-
- if (mResourceData[index] == null) {
+ if (!hasValue(index)) {
return null;
}
ResourceValue value = mResourceData[index];
- String stringValue = value.getValue();
- if (stringValue == null) {
- return null;
- }
-
return ResourceHelper.getDrawable(value, mContext);
}
@@ -796,15 +679,7 @@
*/
@Override
public CharSequence[] getTextArray(int index) {
- if (index < 0 || index >= mResourceData.length) {
- return null;
- }
-
- if (mResourceData[index] == null) {
- return null;
- }
-
- String value = mResourceData[index].getValue();
+ String value = getString(index);
if (value != null) {
return new CharSequence[] { value };
}
@@ -837,17 +712,8 @@
*/
@Override
public boolean getValue(int index, TypedValue outValue) {
- if (index < 0 || index >= mResourceData.length) {
- return false;
- }
-
- if (mResourceData[index] == null) {
- return false;
- }
-
- String s = mResourceData[index].getValue();
-
- return ResourceHelper.parseFloatAttribute(mNames[index], s, outValue, false);
+ String s = getString(index);
+ return s != null && ResourceHelper.parseFloatAttribute(mNames[index], s, outValue, false);
}
/**
@@ -859,12 +725,7 @@
*/
@Override
public boolean hasValue(int index) {
- //noinspection SimplifiableIfStatement
- if (index < 0 || index >= mResourceData.length) {
- return false;
- }
-
- return mResourceData[index] != null;
+ return index >= 0 && index < mResourceData.length && mResourceData[index] != null;
}
/**
@@ -912,6 +773,52 @@
return Arrays.toString(mResourceData);
}
+ /**
+ * Searches for the string in the attributes (flag or enums) and returns the integer.
+ * If found, it will return an integer matching the value.
+ *
+ * @param index Index of attribute to retrieve.
+ *
+ * @return Attribute int value, or null if not defined.
+ */
+ private Integer resolveEnumAttribute(int index) {
+ // Get the map of attribute-constant -> IntegerValue
+ Map<String, Integer> map = null;
+ if (mIsFramework[index]) {
+ map = Bridge.getEnumValues(mNames[index]);
+ } else {
+ // get the styleable matching the resolved name
+ RenderResources res = mContext.getRenderResources();
+ ResourceValue attr = res.getProjectResource(ResourceType.ATTR, mNames[index]);
+ if (attr instanceof AttrResourceValue) {
+ map = ((AttrResourceValue) attr).getAttributeValues();
+ }
+ }
+
+ if (map != null) {
+ // accumulator to store the value of the 1+ constants.
+ int result = 0;
+ boolean found = false;
+
+ // split the value in case this is a mix of several flags.
+ String[] keywords = mResourceData[index].getValue().split("\\|");
+ for (String keyword : keywords) {
+ Integer i = map.get(keyword.trim());
+ if (i != null) {
+ result |= i;
+ found = true;
+ }
+ // TODO: We should act smartly and log a warning for incorrect keywords. However,
+ // this method is currently called even if the resourceValue is not an enum.
+ }
+ if (found) {
+ return result;
+ }
+ }
+
+ return null;
+ }
+
static TypedArray obtain(Resources res, int len) {
return res instanceof BridgeResources ?
new BridgeTypedArray(((BridgeResources) res), null, len, true) : null;
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java
index 99ae7c9..22f8e1c 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/ResourceHelper.java
@@ -16,6 +16,7 @@
package com.android.layoutlib.bridge.impl;
+import com.android.annotations.NonNull;
import com.android.ide.common.rendering.api.DensityBasedResourceValue;
import com.android.ide.common.rendering.api.LayoutLog;
import com.android.ide.common.rendering.api.RenderResources;
@@ -358,7 +359,7 @@
* @param requireUnit whether the value is expected to contain a unit.
* @return true if success.
*/
- public static boolean parseFloatAttribute(String attribute, String value,
+ public static boolean parseFloatAttribute(String attribute, @NonNull String value,
TypedValue outValue, boolean requireUnit) {
assert !requireUnit || attribute != null;
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index 4f5f31a..5514798 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -1222,18 +1222,15 @@
if (allowCached && mCachedConfigKey != null) {
key = mCachedConfigKey;
} else {
- key = this.SSID;
- if (key == null)
- key = "";
- if (this.wepKeys[0] != null) {
- key = key + "-WEP";
- }
- if (this.allowedKeyManagement.get(KeyMgmt.WPA_PSK)) {
- key = key + "-" + KeyMgmt.strings[KeyMgmt.WPA_PSK];
- }
- if (this.allowedKeyManagement.get(KeyMgmt.WPA_EAP) ||
- this.allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
- key = key + "-" + KeyMgmt.strings[KeyMgmt.WPA_EAP];
+ if (allowedKeyManagement.get(KeyMgmt.WPA_PSK)) {
+ key = SSID + KeyMgmt.strings[KeyMgmt.WPA_PSK];
+ } else if (allowedKeyManagement.get(KeyMgmt.WPA_EAP) ||
+ allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
+ key = SSID + KeyMgmt.strings[KeyMgmt.WPA_EAP];
+ } else if (wepKeys[0] != null) {
+ key = SSID + "WEP";
+ } else {
+ key = SSID + KeyMgmt.strings[KeyMgmt.NONE];
}
mCachedConfigKey = key;
}