Merge "Lazily allocate seldom-used data structures"
diff --git a/api/current.txt b/api/current.txt
index d4144a8..7484e70 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -35844,7 +35844,7 @@
method public java.nio.CharBuffer put(java.lang.String, int, int);
method public int read(java.nio.CharBuffer) throws java.io.IOException;
method public abstract java.nio.CharBuffer slice();
- method public abstract java.lang.CharSequence subSequence(int, int);
+ method public abstract java.nio.CharBuffer subSequence(int, int);
method public static java.nio.CharBuffer wrap(char[]);
method public static java.nio.CharBuffer wrap(char[], int, int);
method public static java.nio.CharBuffer wrap(java.lang.CharSequence);
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index f523b55..62ed697 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -16,6 +16,7 @@
package android.app;
+import android.os.BatteryStats;
import android.os.IBinder;
import com.android.internal.app.IUsageStats;
import com.android.internal.os.PkgUsageStats;
@@ -2210,7 +2211,7 @@
pw.println();
dumpService(pw, fd, "package", new String[] { packageName});
pw.println();
- dumpService(pw, fd, "batteryinfo", new String[] { packageName});
+ dumpService(pw, fd, BatteryStats.SERVICE_NAME, new String[] { packageName});
pw.flush();
}
diff --git a/core/java/android/hardware/display/WifiDisplay.java b/core/java/android/hardware/display/WifiDisplay.java
index 339fd6b..af5a84e 100644
--- a/core/java/android/hardware/display/WifiDisplay.java
+++ b/core/java/android/hardware/display/WifiDisplay.java
@@ -33,7 +33,9 @@
private final String mDeviceAddress;
private final String mDeviceName;
private final String mDeviceAlias;
+ private final boolean mIsAvailable;
private final boolean mCanConnect;
+ private final boolean mIsRemembered;
public static final WifiDisplay[] EMPTY_ARRAY = new WifiDisplay[0];
@@ -42,9 +44,11 @@
String deviceAddress = in.readString();
String deviceName = in.readString();
String deviceAlias = in.readString();
+ boolean isAvailable = (in.readInt() != 0);
boolean canConnect = (in.readInt() != 0);
- return new WifiDisplay(deviceAddress, deviceName,
- deviceAlias, canConnect);
+ boolean isRemembered = (in.readInt() != 0);
+ return new WifiDisplay(deviceAddress, deviceName, deviceAlias,
+ isAvailable, canConnect, isRemembered);
}
public WifiDisplay[] newArray(int size) {
@@ -52,12 +56,8 @@
}
};
- public WifiDisplay(String deviceAddress, String deviceName, String deviceAlias) {
- this(deviceAddress, deviceName, deviceAlias, false);
- }
-
- public WifiDisplay(String deviceAddress, String deviceName,
- String deviceAlias, boolean canConnect) {
+ public WifiDisplay(String deviceAddress, String deviceName, String deviceAlias,
+ boolean available, boolean canConnect, boolean remembered) {
if (deviceAddress == null) {
throw new IllegalArgumentException("deviceAddress must not be null");
}
@@ -68,7 +68,9 @@
mDeviceAddress = deviceAddress;
mDeviceName = deviceName;
mDeviceAlias = deviceAlias;
+ mIsAvailable = available;
mCanConnect = canConnect;
+ mIsRemembered = remembered;
}
/**
@@ -97,13 +99,27 @@
}
/**
- * Gets the availability of the Wifi display device.
+ * Returns true if device is available, false otherwise.
+ */
+ public boolean isAvailable() {
+ return mIsAvailable;
+ }
+
+ /**
+ * Returns true if device can be connected to (not in use), false otherwise.
*/
public boolean canConnect() {
return mCanConnect;
}
/**
+ * Returns true if device has been remembered, false otherwise.
+ */
+ public boolean isRemembered() {
+ return mIsRemembered;
+ }
+
+ /**
* Gets the name to show in the UI.
* Uses the device alias if available, otherwise uses the device name.
*/
@@ -116,12 +132,15 @@
return o instanceof WifiDisplay && equals((WifiDisplay)o);
}
+ /**
+ * Returns true if the two displays have the same identity (address, name and alias).
+ * This method does not compare the current status of the displays.
+ */
public boolean equals(WifiDisplay other) {
return other != null
&& mDeviceAddress.equals(other.mDeviceAddress)
&& mDeviceName.equals(other.mDeviceName)
- && Objects.equal(mDeviceAlias, other.mDeviceAlias)
- && (mCanConnect == other.mCanConnect);
+ && Objects.equal(mDeviceAlias, other.mDeviceAlias);
}
/**
@@ -144,7 +163,9 @@
dest.writeString(mDeviceAddress);
dest.writeString(mDeviceName);
dest.writeString(mDeviceAlias);
+ dest.writeInt(mIsAvailable ? 1 : 0);
dest.writeInt(mCanConnect ? 1 : 0);
+ dest.writeInt(mIsRemembered ? 1 : 0);
}
@Override
@@ -159,7 +180,8 @@
if (mDeviceAlias != null) {
result += ", alias " + mDeviceAlias;
}
- result += ", canConnect " + mCanConnect;
+ result += ", isAvailable " + mIsAvailable + ", canConnect " + mCanConnect
+ + ", isRemembered " + mIsRemembered;
return result;
}
}
diff --git a/core/java/android/hardware/display/WifiDisplayStatus.java b/core/java/android/hardware/display/WifiDisplayStatus.java
index f7e72c4..77acdc0 100644
--- a/core/java/android/hardware/display/WifiDisplayStatus.java
+++ b/core/java/android/hardware/display/WifiDisplayStatus.java
@@ -20,6 +20,8 @@
import android.os.Parcelable;
import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
/**
* Describes the current global state of Wifi display connectivity, including the
@@ -35,8 +37,7 @@
private final int mScanState;
private final int mActiveDisplayState;
private final WifiDisplay mActiveDisplay;
- private final WifiDisplay[] mAvailableDisplays;
- private final WifiDisplay[] mRememberedDisplays;
+ private final WifiDisplay[] mDisplays;
/** Feature state: Wifi display is not available on this device. */
public static final int FEATURE_STATE_UNAVAILABLE = 0;
@@ -70,18 +71,13 @@
activeDisplay = WifiDisplay.CREATOR.createFromParcel(in);
}
- WifiDisplay[] availableDisplays = WifiDisplay.CREATOR.newArray(in.readInt());
- for (int i = 0; i < availableDisplays.length; i++) {
- availableDisplays[i] = WifiDisplay.CREATOR.createFromParcel(in);
- }
-
- WifiDisplay[] rememberedDisplays = WifiDisplay.CREATOR.newArray(in.readInt());
- for (int i = 0; i < rememberedDisplays.length; i++) {
- rememberedDisplays[i] = WifiDisplay.CREATOR.createFromParcel(in);
+ WifiDisplay[] displays = WifiDisplay.CREATOR.newArray(in.readInt());
+ for (int i = 0; i < displays.length; i++) {
+ displays[i] = WifiDisplay.CREATOR.createFromParcel(in);
}
return new WifiDisplayStatus(featureState, scanState, activeDisplayState,
- activeDisplay, availableDisplays, rememberedDisplays);
+ activeDisplay, displays);
}
public WifiDisplayStatus[] newArray(int size) {
@@ -91,25 +87,20 @@
public WifiDisplayStatus() {
this(FEATURE_STATE_UNAVAILABLE, SCAN_STATE_NOT_SCANNING, DISPLAY_STATE_NOT_CONNECTED,
- null, WifiDisplay.EMPTY_ARRAY, WifiDisplay.EMPTY_ARRAY);
+ null, WifiDisplay.EMPTY_ARRAY);
}
public WifiDisplayStatus(int featureState, int scanState,
- int activeDisplayState, WifiDisplay activeDisplay,
- WifiDisplay[] availableDisplays, WifiDisplay[] rememberedDisplays) {
- if (availableDisplays == null) {
- throw new IllegalArgumentException("availableDisplays must not be null");
- }
- if (rememberedDisplays == null) {
- throw new IllegalArgumentException("rememberedDisplays must not be null");
+ int activeDisplayState, WifiDisplay activeDisplay, WifiDisplay[] displays) {
+ if (displays == null) {
+ throw new IllegalArgumentException("displays must not be null");
}
mFeatureState = featureState;
mScanState = scanState;
mActiveDisplayState = activeDisplayState;
mActiveDisplay = activeDisplay;
- mAvailableDisplays = availableDisplays;
- mRememberedDisplays = rememberedDisplays;
+ mDisplays = displays;
}
/**
@@ -152,24 +143,12 @@
}
/**
- * Gets the list of all available Wifi displays as reported by the most recent
- * scan, never null.
- * <p>
- * Some of these displays may already be remembered, others may be unknown.
- * </p>
+ * Gets the list of Wifi displays, returns a combined list of all available
+ * Wifi displays as reported by the most recent scan, and all remembered
+ * Wifi displays (not necessarily available at the time).
*/
- public WifiDisplay[] getAvailableDisplays() {
- return mAvailableDisplays;
- }
-
- /**
- * Gets the list of all remembered Wifi displays, never null.
- * <p>
- * Not all remembered displays will necessarily be available.
- * </p>
- */
- public WifiDisplay[] getRememberedDisplays() {
- return mRememberedDisplays;
+ public WifiDisplay[] getDisplays() {
+ return mDisplays;
}
@Override
@@ -185,13 +164,8 @@
dest.writeInt(0);
}
- dest.writeInt(mAvailableDisplays.length);
- for (WifiDisplay display : mAvailableDisplays) {
- display.writeToParcel(dest, flags);
- }
-
- dest.writeInt(mRememberedDisplays.length);
- for (WifiDisplay display : mRememberedDisplays) {
+ dest.writeInt(mDisplays.length);
+ for (WifiDisplay display : mDisplays) {
display.writeToParcel(dest, flags);
}
}
@@ -208,8 +182,7 @@
+ ", scanState=" + mScanState
+ ", activeDisplayState=" + mActiveDisplayState
+ ", activeDisplay=" + mActiveDisplay
- + ", availableDisplays=" + Arrays.toString(mAvailableDisplays)
- + ", rememberedDisplays=" + Arrays.toString(mRememberedDisplays)
+ + ", displays=" + Arrays.toString(mDisplays)
+ "}";
}
}
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index fef1818..7c09e89 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -41,7 +41,10 @@
public abstract class BatteryStats implements Parcelable {
private static final boolean LOCAL_LOGV = false;
-
+
+ /** @hide */
+ public static final String SERVICE_NAME = "batterystats";
+
/**
* A constant indicating a partial wake lock timer.
*/
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index 31da091..a9abdc5 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -783,13 +783,15 @@
BlockGuard.setThreadPolicy(BlockGuard.LAX_POLICY);
return;
}
- BlockGuard.Policy policy = BlockGuard.getThreadPolicy();
- if (!(policy instanceof AndroidBlockGuardPolicy)) {
- BlockGuard.setThreadPolicy(new AndroidBlockGuardPolicy(policyMask));
+ final BlockGuard.Policy policy = BlockGuard.getThreadPolicy();
+ final AndroidBlockGuardPolicy androidPolicy;
+ if (policy instanceof AndroidBlockGuardPolicy) {
+ androidPolicy = (AndroidBlockGuardPolicy) policy;
} else {
- AndroidBlockGuardPolicy androidPolicy = (AndroidBlockGuardPolicy) policy;
- androidPolicy.setPolicyMask(policyMask);
+ androidPolicy = threadAndroidPolicy.get();
+ BlockGuard.setThreadPolicy(androidPolicy);
}
+ androidPolicy.setPolicyMask(policyMask);
}
// Sets up CloseGuard in Dalvik/libcore
@@ -1060,6 +1062,14 @@
}
};
+ private static final ThreadLocal<AndroidBlockGuardPolicy>
+ threadAndroidPolicy = new ThreadLocal<AndroidBlockGuardPolicy>() {
+ @Override
+ protected AndroidBlockGuardPolicy initialValue() {
+ return new AndroidBlockGuardPolicy(0);
+ }
+ };
+
private static boolean tooManyViolationsThisLoop() {
return violationsBeingTimed.get().size() >= MAX_OFFENSES_PER_LOOP;
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 1b7fd1e..109b8e0 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -124,7 +124,7 @@
static final ArrayList<Runnable> sFirstDrawHandlers = new ArrayList<Runnable>();
static boolean sFirstDrawComplete = false;
-
+
static final ArrayList<ComponentCallbacks> sConfigCallbacks
= new ArrayList<ComponentCallbacks>();
@@ -161,14 +161,14 @@
// Set to true if the owner of this window is in the stopped state,
// so the window should no longer be active.
boolean mStopped = false;
-
+
boolean mLastInCompatMode = false;
SurfaceHolder.Callback2 mSurfaceHolderCallback;
BaseSurfaceHolder mSurfaceHolder;
boolean mIsCreating;
boolean mDrawingAllowed;
-
+
final Region mTransparentRegion;
final Region mPreviousTransparentRegion;
@@ -313,6 +313,9 @@
private int mViewLayoutDirectionInitial;
+ /** Set to true once doDie() has been called. */
+ private boolean mRemoved;
+
/**
* Consistency verifier for debugging purposes.
*/
@@ -420,8 +423,6 @@
synchronized (this) {
if (mView == null) {
mView = view;
- Slog.d(TAG, "setView: b9406261 setting mView to " + view + " mAdded=" + mAdded
- + " Callers=" + Debug.getCallers(4));
mViewLayoutDirectionInitial = mView.getRawLayoutDirection();
mFallbackEventHandler.setView(view);
mWindowAttributes.copyFrom(attrs);
@@ -477,8 +478,6 @@
= panelParentView.getApplicationWindowToken();
}
mAdded = true;
- Slog.d(TAG, "setView: b9406261 setting mAdded=true mView=" + mView
- + " Callers=" + Debug.getCallers(4));
int res; /* = WindowManagerImpl.ADD_OKAY; */
// Schedule the first layout -before- adding to the window
@@ -504,8 +503,6 @@
mFallbackEventHandler.setView(null);
unscheduleTraversals();
setAccessibilityFocus(null, null);
- Slog.d(TAG, "setView: b9406261 threw exception e=" + e
- + " Callers=" + Debug.getCallers(4));
throw new RuntimeException("Adding window failed", e);
} finally {
if (restore) {
@@ -845,6 +842,7 @@
invalidateChildInParent(null, dirty);
}
+ @Override
public ViewParent invalidateChildInParent(int[] location, Rect dirty) {
checkThread();
if (DEBUG_DRAW) Log.v(TAG, "Invalidate child: " + dirty);
@@ -902,10 +900,12 @@
}
}
+ @Override
public ViewParent getParent() {
return null;
}
+ @Override
public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) {
if (child != mView) {
throw new RuntimeException("child is not mine, honest!");
@@ -2805,9 +2805,7 @@
setAccessibilityFocus(null, null);
- if (mView != null) {
- mView.assignParent(null);
- }
+ mView.assignParent(null);
mView = null;
mAttachInfo.mRootView = null;
mAttachInfo.mSurface = null;
@@ -5126,29 +5124,37 @@
}
}
- public void die(boolean immediate) {
+ /**
+ * @param immediate True, do now if not in traversal. False, put on queue and do later.
+ * @return True, request has been queued. False, request has been completed.
+ */
+ boolean die(boolean immediate) {
// Make sure we do execute immediately if we are in the middle of a traversal or the damage
// done by dispatchDetachedFromWindow will cause havoc on return.
if (immediate && !mIsInTraversal) {
doDie();
- } else {
- if (!mIsDrawing) {
- destroyHardwareRenderer();
- } else {
- Log.e(TAG, "Attempting to destroy the window while drawing!\n" +
- " window=" + this + ", title=" + mWindowAttributes.getTitle());
- }
- mHandler.sendEmptyMessage(MSG_DIE);
+ return false;
}
+
+ if (!mIsDrawing) {
+ destroyHardwareRenderer();
+ } else {
+ Log.e(TAG, "Attempting to destroy the window while drawing!\n" +
+ " window=" + this + ", title=" + mWindowAttributes.getTitle());
+ }
+ mHandler.sendEmptyMessage(MSG_DIE);
+ return true;
}
void doDie() {
checkThread();
if (LOCAL_LOGV) Log.v(TAG, "DIE in " + this + " of " + mSurface);
synchronized (this) {
+ if (mRemoved) {
+ return;
+ }
+ mRemoved = true;
if (mAdded) {
- Slog.d(TAG, "doDie: b9406261 mAdded==true mView=" + mView
- + " Callers=" + Debug.getCallers(4));
dispatchDetachedFromWindow();
}
@@ -5171,13 +5177,11 @@
} catch (RemoteException e) {
}
}
-
+
mSurface.release();
}
}
- Slog.d(TAG, "doDie: b9406261 setting mAdded=false mView=" + mView
- + " Callers=" + Debug.getCallers(4));
mAdded = false;
}
WindowManagerGlobal.getInstance().doRemoveView(this);
diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java
index f7b85cc..7cda01c 100644
--- a/core/java/android/view/WindowManagerGlobal.java
+++ b/core/java/android/view/WindowManagerGlobal.java
@@ -26,6 +26,7 @@
import android.os.ServiceManager;
import android.os.SystemProperties;
import android.util.AndroidRuntimeException;
+import android.util.ArraySet;
import android.util.Log;
import android.view.inputmethod.InputMethodManager;
@@ -111,6 +112,7 @@
private final ArrayList<ViewRootImpl> mRoots = new ArrayList<ViewRootImpl>();
private final ArrayList<WindowManager.LayoutParams> mParams =
new ArrayList<WindowManager.LayoutParams>();
+ private final ArraySet<View> mDyingViews = new ArraySet<View>();
private boolean mNeedsEglTerminate;
private Runnable mSystemPropertyUpdater;
@@ -220,8 +222,14 @@
int index = findViewLocked(view, false);
if (index >= 0) {
- throw new IllegalStateException("View " + view
- + " has already been added to the window manager.");
+ if (mDyingViews.contains(view)) {
+ // Don't wait for MSG_DIE to make it's way through root's queue.
+ mRoots.get(index).doDie();
+ } else {
+ throw new IllegalStateException("View " + view
+ + " has already been added to the window manager.");
+ }
+ // The previous removeView() had not completed executing. Now it has.
}
// If this is a panel window, then find the window it is being
@@ -334,9 +342,12 @@
imm.windowDismissed(mViews.get(index).getWindowToken());
}
}
- root.die(immediate);
+ boolean deferred = root.die(immediate);
if (view != null) {
view.assignParent(null);
+ if (deferred) {
+ mDyingViews.add(view);
+ }
}
}
@@ -345,8 +356,9 @@
final int index = mRoots.indexOf(root);
if (index >= 0) {
mRoots.remove(index);
- mViews.remove(index);
mParams.remove(index);
+ final View view = mViews.remove(index);
+ mDyingViews.remove(view);
}
}
}
diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java
index 7197c96..ea5187a 100644
--- a/core/java/android/webkit/WebViewFactory.java
+++ b/core/java/android/webkit/WebViewFactory.java
@@ -29,8 +29,11 @@
* @hide
*/
public final class WebViewFactory {
+ public static final boolean DEFAULT_TO_EXPERIMENTAL_WEBVIEW = false;
public static final String WEBVIEW_EXPERIMENTAL_PROPERTY = "persist.sys.webview.exp";
- private static final String DEPRECATED_CHROMIUM_PROPERTY = "webview.use_chromium";
+ private static final String FORCE_PROVIDER_PROPERTY = "webview.force_provider";
+ private static final String FORCE_PROVIDER_PROPERTY_VALUE_CHROMIUM = "chromium";
+ private static final String FORCE_PROVIDER_PROPERTY_VALUE_CLASSIC = "classic";
// Default Provider factory class name.
// TODO: When the Chromium powered WebView is ready, it should be the default factory class.
@@ -91,14 +94,18 @@
// experimtanl Chromium powered WebView. This enables us to switch between
// implementations at runtime. For user (release) builds, don't allow this.
private static boolean isExperimentalWebViewEnabled() {
- if (!isExperimentalWebViewAvailable())
- return false;
- if (SystemProperties.getBoolean(DEPRECATED_CHROMIUM_PROPERTY, false)) {
- Log.w(LOGTAG, String.format("The property %s has been deprecated. Please use %s.",
- DEPRECATED_CHROMIUM_PROPERTY, WEBVIEW_EXPERIMENTAL_PROPERTY));
- return true;
- }
- return SystemProperties.getBoolean(WEBVIEW_EXPERIMENTAL_PROPERTY, false);
+ if (!isExperimentalWebViewAvailable()) return false;
+ boolean use_experimental_webview = SystemProperties.getBoolean(
+ WEBVIEW_EXPERIMENTAL_PROPERTY, DEFAULT_TO_EXPERIMENTAL_WEBVIEW);
+ String forceProviderName = SystemProperties.get(FORCE_PROVIDER_PROPERTY);
+ if (forceProviderName.isEmpty()) return use_experimental_webview;
+
+ Log.i(LOGTAG, String.format("Provider overridden by property: %s=%s",
+ FORCE_PROVIDER_PROPERTY, forceProviderName));
+ if (forceProviderName.equals(FORCE_PROVIDER_PROPERTY_VALUE_CHROMIUM)) return true;
+ if (forceProviderName.equals(FORCE_PROVIDER_PROPERTY_VALUE_CLASSIC)) return false;
+ Log.e(LOGTAG, String.format("Unrecognized provider: %s", forceProviderName));
+ return use_experimental_webview;
}
private static WebViewFactoryProvider getFactoryByName(String providerName) {
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 28b63a7..7961c47 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Koppel tans..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Beskikbaar"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Nie beskikbaar nie"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Ingeboude skerm"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI-skerm"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Oorlegger #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 8a2fc36..b098764 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"በማገናኘት ላይ..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"የሚገኙ"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"አይገኝም"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"ውስጥ የተሰራ ማያ ገጽ"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI ማያ ገጽ"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ተደራቢ #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 19f2d6a..c6e1a49 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"جارٍ الاتصال..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"متاح"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"غير متاح"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"شاشة مدمجة"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"شاشة HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"المركب #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index ab0db23..9ef8bba 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Падключэнне..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Даступна"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Недаступны"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Убудаваны экран"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Экран HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Оверлей # <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index d4803a9..9223b81 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Установява се връзка..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Налице"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Не е налице"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Вграден екран"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Екран „HDMI“"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Наслагване №<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 9b86c35..b87296b 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1446,6 +1446,7 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"S\'està connectant..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Disponible"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"No disponible"</string>
+ <string name="media_route_status_in_use" msgid="4533786031090198063">"En ús"</string>
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Pantalla integrada"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Pantalla HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposa #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 6f2ffa6..b43deec 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1446,6 +1446,7 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Připojování…"</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Dostupná"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Není k dispozici"</string>
+ <string name="media_route_status_in_use" msgid="4533786031090198063">"Používá se"</string>
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Integrovaná obrazovka"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Obrazovka HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Překryvná vrstva č. <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 876c475..65a94a7 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Opretter forbindelse..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Tilgængelig"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Ikke tilgængelig"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Indbygget skærm"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI-skærm"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlejring nr. <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index bd40c64..d892b3c 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Verbindung wird hergestellt..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Verfügbar"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Nicht verfügbar"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Integrierter Bildschirm"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI-Bildschirm"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay-Nr. <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index c388643..c867d65 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Σύνδεση…"</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Διαθέσιμη"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Μη διαθέσιμο"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Ενσωματωμένη οθόνη"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Οθόνη HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Επικάλυψη #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index b8c0d50..ecad00a 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Connecting..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Available"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Not available"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Built-in Screen"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI Screen"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 1175115..5fb1580 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Conectando..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Disponible"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"No disponible"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Pantalla integrada"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Pantalla HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposición #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 8724464..c283ab5 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Conectando..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Disponible"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"No disponible"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Pantalla integrada"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Pantalla HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposición #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 0ae1829..1336790 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Ühendan..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Saadaval"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Ei ole saadaval"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Sisseehitatud ekraan"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI-ekraan"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Ülekate nr .<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 170e9ae..22ca8b3 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"درحال اتصال…"</string>
<string name="media_route_status_available" msgid="6983258067194649391">"در دسترس"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"در دسترس نیست"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"صفحه نمایش از خود"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"صفحه HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"همپوشانی #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index bd0b22c..97c1820 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Yhdistetään..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Käytettävissä"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Ei käytettävissä"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Yhdysrakenteinen näyttö"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI-ruutu"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Peittokuva # <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 26d1831..173ee18 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Connexion en cours..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Disponible"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Indisponible"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Écran intégré"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Écran HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposition n° <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index a7cae1d..e3434e1 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"कनेक्ट हो रहा है..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"उपलब्ध"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"उपलब्ध नहीं"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"अंतर्निहित स्क्रीन"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI स्क्रीन"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"ओवरले #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index cda7076..9d97504 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Povezivanje..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Dostupno"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Nije dostupno"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Ugrađeni zaslon"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI zaslon"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Preklapanje br. <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 0d5336e..7e90a2d 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Kapcsolódás..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Elérhető"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Nem érhető el"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Beépített képernyő"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI-képernyő"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"<xliff:g id="ID">%1$d</xliff:g>. fedvény"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index bd2fbf4..a597bc88 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Menyambung..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Tersedia"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Tidak tersedia"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Layar Bawaan"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Layar HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Hamparan #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 4ad6f74..12a675c 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Connessione..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Disponibile"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Non disponibili"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Schermo incorporato"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Schermo HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay n. <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index b5f18e1..410982f 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"מתחבר..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"זמין"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"לא זמין"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"מסך מובנה"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"מסך HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"שכבת על #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 2e4ce40..0cb3984 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"接続中..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"利用できます"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"利用できません"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"内蔵スクリーン"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI画面"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"オーバーレイ第<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 94fa0d9..a41bb81 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"연결 중..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"사용 가능"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"사용할 수 없음"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"기본으로 제공되는 화면"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI 화면"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"<xliff:g id="ID">%1$d</xliff:g>번째 오버레이"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index e938945..18fc746 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Jungiama..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Pasiekiama"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Nepasiekiama"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Integruotas ekranas"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI ekranas"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Perdanga nr. <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index b81df3a..728fed0 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Notiek savienojuma izveide..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Pieejams"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Nav pieejams"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Iebūvēts ekrāns"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI ekrāns"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Pārklājums Nr. <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index f9de1b1..6486d8a 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Menyambung..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Tersedia"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Tidak tersedia"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Skrin Terbina Dalam"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Skrin HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Tindih #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index cd222a0..0e5446a 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Kobler til ..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Tilgjengelig"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Ikke tilgjengelig"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Innebygd skjerm"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI-skjerm"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlegg #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 4492fef..2104df4 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Verbinden..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Beschikbaar"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Niet beschikbaar"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Ingebouwd scherm"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI-scherm"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 3c27ab4..3a5ace4 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Łączę..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Dostępne"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Niedostępne"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Wbudowany ekran"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Ekran HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Nakładka nr <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 29b63a9..123786a 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"A ligar..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Disponível"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Não disponível"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Ecrã Integrado"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Ecrã HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Sobreposição #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index f5ba0fb..c5fe686 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1446,6 +1446,7 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Conectando..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Disponível"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Não disponível"</string>
+ <string name="media_route_status_in_use" msgid="4533786031090198063">"Em uso"</string>
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Tela integrada"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Tela HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Sobreposição nº <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml
index b2a0bca..787c92b 100644
--- a/core/res/res/values-rm/strings.xml
+++ b/core/res/res/values-rm/strings.xml
@@ -2330,6 +2330,8 @@
<skip />
<!-- no translation found for media_route_status_not_available (6739899962681886401) -->
<skip />
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<!-- no translation found for display_manager_built_in_display_name (2583134294292563941) -->
<skip />
<!-- no translation found for display_manager_hdmi_display_name (1555264559227470109) -->
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index f09fcc2..c491e08 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Se conectează..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Disponibilă"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Indisponibilă"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Ecran încorporat"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Ecran HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Suprapunerea <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 211a52c..4707e3b 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Подключение..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Доступен"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Недоступные"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Встроенный экран"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Экран HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Наложение № <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 2d62a47..4181016 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Prebieha pripájanie…"</string>
<string name="media_route_status_available" msgid="6983258067194649391">"K dispozícii"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Nie je k dispozícii"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Vstavaná obrazovka"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Obrazovka HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Prekrytie č. <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index f412b6b..05ea4c0 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Vzpostavljanje povezave ..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Na voljo"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Ni na voljo"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Vgrajen zaslon"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Zaslon HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Prekrivanje #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index d5b6554..412c142 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Повезивање..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Доступна"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Нису доступне"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Уграђени екран"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI екран"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Постављени елемент бр. <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 5f87ba9..3a04e7b 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Ansluter ..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Tillgängliga"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Ej tillgängligt"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Inbyggd skärm"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI-skärm"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Överlagring #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index fd094b4..0265cc0 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Inaunganisha..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Inapatikana"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Haipatikani"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Skrini Iliyojengwa ndani"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Skrini ya HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Uwekeleaji #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 521cb00..06de4df 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"กำลังเชื่อมต่อ..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"พร้อมใช้งาน"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"ไม่พร้อมใช้งาน"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"หน้าจอในตัว"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"หน้าจอ HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"การวางซ้อน #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 9e58994..07c6650 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Kumukonekta..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Available"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Hindi available"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Built-in na Screen"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI Screen"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Overlay #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index d4a46ef..bb6a93f 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Bağlanılıyor..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Kullanılabilir"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Yok"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Yerleşik Ekran"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI Ekran"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Yer Paylaşımı No. <xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 73e3c12..9ab3666 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"З’єднання..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Доступно"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Недоступно"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Вбудований екран"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Екран HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Накладання №<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index d72b1a7..7c9d8b8 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Đang kết nối..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Khả dụng"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Không khả dụng"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Màn hình tích hợp"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Màn hình HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Lớp phủ #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 7ea742a..9e1a534 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"正在连接..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"可连接"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"无法连接"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"内置屏幕"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI 屏幕"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"叠加视图 #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 499b3ac..ac65ccb 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"連線中…"</string>
<string name="media_route_status_available" msgid="6983258067194649391">"可以使用"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"無法使用"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"內建畫面"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"HDMI 螢幕"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"第 <xliff:g id="ID">%1$d</xliff:g> 個重疊效果"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index eed5e04..394b384 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1446,6 +1446,8 @@
<string name="media_route_status_connecting" msgid="6422571716007825440">"Iyaxhuma..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Kuyatholakala"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"Ayitholakali"</string>
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
<string name="display_manager_built_in_display_name" msgid="2583134294292563941">"Okwakhelwe ngaphakathi kwesikrini"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"Isikrini se-HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Isendlalelo #<xliff:g id="ID">%1$d</xliff:g>"</string>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index d40eb64..3e2d8d3 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -3970,6 +3970,9 @@
<!-- Status message for remote routes that are not available for connection right now -->
<string name="media_route_status_not_available">Not available</string>
+ <!-- Status message for a remote route that is in use (and thus unavailabe) right now -->
+ <string name="media_route_status_in_use">In use</string>
+
<!-- Display manager service -->
<!-- Name of the built-in display. [CHAR LIMIT=50] -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index d33a6fa..5680ce4 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -850,6 +850,7 @@
<java-symbol type="string" name="media_route_status_connecting" />
<java-symbol type="string" name="media_route_status_available" />
<java-symbol type="string" name="media_route_status_not_available" />
+ <java-symbol type="string" name="media_route_status_in_use" />
<java-symbol type="string" name="owner_name" />
<java-symbol type="string" name="config_chooseAccountActivity" />
<java-symbol type="string" name="config_chooseTypeAndAccountActivity" />
diff --git a/core/tests/benchmarks/src/android/os/StrictModeBenchmark.java b/core/tests/benchmarks/src/android/os/StrictModeBenchmark.java
new file mode 100644
index 0000000..41af3820
--- /dev/null
+++ b/core/tests/benchmarks/src/android/os/StrictModeBenchmark.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+import android.os.StrictMode.ThreadPolicy;
+
+import com.google.caliper.SimpleBenchmark;
+
+public class StrictModeBenchmark extends SimpleBenchmark {
+
+ private ThreadPolicy mOff = new ThreadPolicy.Builder().build();
+ private ThreadPolicy mOn = new ThreadPolicy.Builder().detectAll().build();
+
+ public void timeToggleThreadPolicy(int reps) {
+ for (int i = 0; i < reps; i++) {
+ StrictMode.setThreadPolicy(mOn);
+ StrictMode.setThreadPolicy(mOff);
+ }
+ }
+}
diff --git a/libs/hwui/DeferredDisplayList.cpp b/libs/hwui/DeferredDisplayList.cpp
index f19d610..c21ee1e 100644
--- a/libs/hwui/DeferredDisplayList.cpp
+++ b/libs/hwui/DeferredDisplayList.cpp
@@ -153,14 +153,32 @@
class MergingDrawBatch : public DrawBatch {
public:
MergingDrawBatch(DeferInfo& deferInfo, Rect viewport) :
- DrawBatch(deferInfo), mClipRect(viewport), mClipSideFlags(kClipSide_Unclipped) {}
+ DrawBatch(deferInfo), mClipRect(viewport), mClipSideFlags(kClipSide_None) {}
+
+ /*
+ * Helper for determining if a new op can merge with a MergingDrawBatch based on their bounds
+ * and clip side flags. Positive bounds delta means new bounds fit in old.
+ */
+ static inline bool checkSide(const int currentFlags, const int newFlags, const int side,
+ float boundsDelta) {
+ bool currentClipExists = currentFlags & side;
+ bool newClipExists = newFlags & side;
+
+ // if current is clipped, we must be able to fit new bounds in current
+ if (boundsDelta > 0 && currentClipExists) return false;
+
+ // if new is clipped, we must be able to fit current bounds in new
+ if (boundsDelta < 0 && newClipExists) return false;
+
+ return true;
+ }
/*
* Checks if a (mergeable) op can be merged into this batch
*
* If true, the op's multiDraw must be guaranteed to handle both ops simultaneously, so it is
* important to consider all paint attributes used in the draw calls in deciding both a) if an
- * op tries to merge at all, and b) if the op
+ * op tries to merge at all, and b) if the op can merge with another set of ops
*
* False positives can lead to information from the paints of subsequent merged operations being
* dropped, so we make simplifying qualifications on the ops that can merge, per op type.
@@ -179,23 +197,26 @@
if (NEQ_FALPHA(lhs.mAlpha, rhs.mAlpha)) return false;
- // If colliding flags, ensure bounds are equal
- // NOTE: only needed if op to be added is clipped *and* within old valid clip (per dimension)
- int collidingClipSideFlags = mClipSideFlags & op->state.mClipSideFlags;
- if (CC_UNLIKELY(collidingClipSideFlags)) {
- // if multiple ops are clipped on the same side, they must be clipped at the same
- // coordinate to be merged
- if ((collidingClipSideFlags & kClipSide_Left) &&
- mClipRect.left != op->state.mClip.left) return false;
- if ((collidingClipSideFlags & kClipSide_Top) &&
- mClipRect.top != op->state.mClip.top) return false;
- if ((collidingClipSideFlags & kClipSide_Right) &&
- mClipRect.right != op->state.mClip.right) return false;
- if ((collidingClipSideFlags & kClipSide_Bottom) &&
- mClipRect.bottom != op->state.mClip.bottom) return false;
+ /* Clipping compatibility check
+ *
+ * Exploits the fact that if a op or batch is clipped on a side, its bounds will equal its
+ * clip for that side.
+ */
+ const int currentFlags = mClipSideFlags;
+ const int newFlags = op->state.mClipSideFlags;
+ if (currentFlags != kClipSide_None || newFlags != kClipSide_None) {
+ const Rect& opBounds = op->state.mBounds;
+ float boundsDelta = mBounds.left - opBounds.left;
+ if (!checkSide(currentFlags, newFlags, kClipSide_Left, boundsDelta)) return false;
+ boundsDelta = mBounds.top - opBounds.top;
+ if (!checkSide(currentFlags, newFlags, kClipSide_Top, boundsDelta)) return false;
+
+ // right and bottom delta calculation reversed to account for direction
+ boundsDelta = opBounds.right - mBounds.right;
+ if (!checkSide(currentFlags, newFlags, kClipSide_Right, boundsDelta)) return false;
+ boundsDelta = opBounds.bottom - mBounds.bottom;
+ if (!checkSide(currentFlags, newFlags, kClipSide_Bottom, boundsDelta)) return false;
}
- // if op is outside of batch clip rect, it can't share its clip
- if (!mClipRect.contains(op->state.mBounds)) return false;
// if paints are equal, then modifiers + paint attribs don't need to be compared
if (op->mPaint == mOps[0]->mPaint) return true;
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 05f43a9..91cc4e0 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -1384,7 +1384,7 @@
return true;
}
- state.mClipSideFlags = kClipSide_Unclipped;
+ state.mClipSideFlags = kClipSide_None;
if (!currentClip.contains(state.mBounds)) {
int& flags = state.mClipSideFlags;
// op partially clipped, so record which sides are clipped for clip-aware merging
diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h
index 5b7f90d..9cd2047 100644
--- a/libs/hwui/OpenGLRenderer.h
+++ b/libs/hwui/OpenGLRenderer.h
@@ -81,7 +81,7 @@
};
enum ClipSideFlags {
- kClipSide_Unclipped = 0x0,
+ kClipSide_None = 0x0,
kClipSide_Left = 0x1,
kClipSide_Top = 0x2,
kClipSide_Right = 0x4,
diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java
index df87db3..aeed7d4 100644
--- a/media/java/android/media/MediaCodecInfo.java
+++ b/media/java/android/media/MediaCodecInfo.java
@@ -16,6 +16,31 @@
package android.media;
+/**
+ * Provides information about a given media codec available on the device. You can
+ * iterate through all codecs available by querying {@link MediaCodecList}. For example,
+ * here's how to find an encoder that supports a given MIME type:
+ * <pre>
+ * private static MediaCodecInfo selectCodec(String mimeType) {
+ * int numCodecs = MediaCodecList.getCodecCount();
+ * for (int i = 0; i < numCodecs; i++) {
+ * MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i);
+ *
+ * if (!codecInfo.isEncoder()) {
+ * continue;
+ * }
+ *
+ * String[] types = codecInfo.getSupportedTypes();
+ * for (int j = 0; j < types.length; j++) {
+ * if (types[j].equalsIgnoreCase(mimeType)) {
+ * return codecInfo;
+ * }
+ * }
+ * }
+ * return null;
+ * }</pre>
+ *
+ */
public final class MediaCodecInfo {
private int mIndex;
@@ -45,9 +70,11 @@
}
/**
- * Encapsulates the capabilities of a given codec component,
- * i.e. what profile/level combinations it supports and what colorspaces
+ * Encapsulates the capabilities of a given codec component.
+ * For example, what profile/level combinations it supports and what colorspaces
* it is capable of providing the decoded data in.
+ * <p>You can get an instance for a given {@link MediaCodecInfo} object with
+ * {@link MediaCodecInfo#getCapabilitiesForType getCapabilitiesForType()}, passing a MIME type.
*/
public static final class CodecCapabilities {
// Enumerates supported profile/level combinations as defined
@@ -114,6 +141,12 @@
public int[] colorFormats;
};
+ /**
+ * Encapsulates the profiles available for a codec component.
+ * <p>You can get a set of {@link MediaCodecInfo.CodecProfileLevel} objects for a given
+ * {@link MediaCodecInfo} object from the
+ * {@link MediaCodecInfo.CodecCapabilities#profileLevels} field.
+ */
public static final class CodecProfileLevel {
// from OMX_VIDEO_AVCPROFILETYPE
public static final int AVCProfileBaseline = 0x01;
@@ -232,6 +265,7 @@
* Enumerates the capabilities of the codec component. Since a single
* component can support data of a variety of types, the type has to be
* specified to yield a meaningful result.
+ * @param type The MIME type to query
*/
public final CodecCapabilities getCapabilitiesForType(
String type) {
diff --git a/media/java/android/media/MediaCodecList.java b/media/java/android/media/MediaCodecList.java
index 2a60113..817ca31 100644
--- a/media/java/android/media/MediaCodecList.java
+++ b/media/java/android/media/MediaCodecList.java
@@ -19,9 +19,10 @@
import android.media.MediaCodecInfo;
/**
- * MediaCodecList class can be used to enumerate available codecs,
+ * Allows you to enumerate available codecs, each specified as a {@link MediaCodecInfo} object,
* find a codec supporting a given format and query the capabilities
* of a given codec.
+ * <p>See {@link MediaCodecInfo} for sample usage.
*/
final public class MediaCodecList {
/**
diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java
index d653d94..420a195 100644
--- a/media/java/android/media/MediaRouter.java
+++ b/media/java/android/media/MediaRouter.java
@@ -876,44 +876,45 @@
boolean wantScan = false;
boolean blockScan = false;
WifiDisplay[] oldDisplays = oldStatus != null ?
- oldStatus.getRememberedDisplays() : WifiDisplay.EMPTY_ARRAY;
+ oldStatus.getDisplays() : WifiDisplay.EMPTY_ARRAY;
WifiDisplay[] newDisplays;
- WifiDisplay[] availableDisplays;
WifiDisplay activeDisplay;
if (newStatus.getFeatureState() == WifiDisplayStatus.FEATURE_STATE_ON) {
- newDisplays = newStatus.getRememberedDisplays();
- availableDisplays = newStatus.getAvailableDisplays();
+ newDisplays = newStatus.getDisplays();
activeDisplay = newStatus.getActiveDisplay();
} else {
- newDisplays = availableDisplays = WifiDisplay.EMPTY_ARRAY;
+ newDisplays = WifiDisplay.EMPTY_ARRAY;
activeDisplay = null;
}
for (int i = 0; i < newDisplays.length; i++) {
final WifiDisplay d = newDisplays[i];
- final boolean available = findMatchingDisplay(d, availableDisplays) != null;
- RouteInfo route = findWifiDisplayRoute(d);
- if (route == null) {
- route = makeWifiDisplayRoute(d, available);
- addRouteStatic(route);
- wantScan = true;
- } else {
- updateWifiDisplayRoute(route, d, available, newStatus);
- }
- if (d.equals(activeDisplay)) {
- selectRouteStatic(route.getSupportedTypes(), route);
+ if (d.isRemembered()) {
+ RouteInfo route = findWifiDisplayRoute(d);
+ if (route == null) {
+ route = makeWifiDisplayRoute(d, newStatus);
+ addRouteStatic(route);
+ wantScan = true;
+ } else {
+ updateWifiDisplayRoute(route, d, newStatus);
+ }
+ if (d.equals(activeDisplay)) {
+ selectRouteStatic(route.getSupportedTypes(), route);
- // Don't scan if we're already connected to a wifi display,
- // the scanning process can cause a hiccup with some configurations.
- blockScan = true;
+ // Don't scan if we're already connected to a wifi display,
+ // the scanning process can cause a hiccup with some configurations.
+ blockScan = true;
+ }
}
}
for (int i = 0; i < oldDisplays.length; i++) {
final WifiDisplay d = oldDisplays[i];
- final WifiDisplay newDisplay = findMatchingDisplay(d, newDisplays);
- if (newDisplay == null) {
- removeRoute(findWifiDisplayRoute(d));
+ if (d.isRemembered()) {
+ final WifiDisplay newDisplay = findMatchingDisplay(d, newDisplays);
+ if (newDisplay == null || !newDisplay.isRemembered()) {
+ removeRoute(findWifiDisplayRoute(d));
+ }
}
}
@@ -924,42 +925,20 @@
sStatic.mLastKnownWifiDisplayStatus = newStatus;
}
- static RouteInfo makeWifiDisplayRoute(WifiDisplay display, boolean available) {
- final RouteInfo newRoute = new RouteInfo(sStatic.mSystemCategory);
- newRoute.mDeviceAddress = display.getDeviceAddress();
- newRoute.mSupportedTypes = ROUTE_TYPE_LIVE_AUDIO | ROUTE_TYPE_LIVE_VIDEO;
- newRoute.mVolumeHandling = RouteInfo.PLAYBACK_VOLUME_FIXED;
- newRoute.mPlaybackType = RouteInfo.PLAYBACK_TYPE_REMOTE;
-
- newRoute.setStatusCode(available ?
- RouteInfo.STATUS_AVAILABLE : RouteInfo.STATUS_CONNECTING);
- newRoute.mEnabled = available;
-
- newRoute.mName = display.getFriendlyDisplayName();
- newRoute.mDescription = sStatic.mResources.getText(
- com.android.internal.R.string.wireless_display_route_description);
-
- newRoute.mPresentationDisplay = choosePresentationDisplayForRoute(newRoute,
- sStatic.getAllPresentationDisplays());
- return newRoute;
- }
-
- private static void updateWifiDisplayRoute(RouteInfo route, WifiDisplay display,
- boolean available, WifiDisplayStatus wifiDisplayStatus) {
- final boolean isScanning =
- wifiDisplayStatus.getScanState() == WifiDisplayStatus.SCAN_STATE_SCANNING;
-
- boolean changed = false;
+ static int getWifiDisplayStatusCode(WifiDisplay d, WifiDisplayStatus wfdStatus) {
int newStatus = RouteInfo.STATUS_NONE;
- if (available) {
- newStatus = isScanning ? RouteInfo.STATUS_SCANNING : RouteInfo.STATUS_AVAILABLE;
+ if (wfdStatus.getScanState() == WifiDisplayStatus.SCAN_STATE_SCANNING) {
+ newStatus = RouteInfo.STATUS_SCANNING;
+ } else if (d.isAvailable()) {
+ newStatus = d.canConnect() ?
+ RouteInfo.STATUS_AVAILABLE: RouteInfo.STATUS_IN_USE;
} else {
newStatus = RouteInfo.STATUS_NOT_AVAILABLE;
}
- if (display.equals(wifiDisplayStatus.getActiveDisplay())) {
- final int activeState = wifiDisplayStatus.getActiveDisplayState();
+ if (d.equals(wfdStatus.getActiveDisplay())) {
+ final int activeState = wfdStatus.getActiveDisplayState();
switch (activeState) {
case WifiDisplayStatus.DISPLAY_STATE_CONNECTED:
newStatus = RouteInfo.STATUS_NONE;
@@ -973,22 +952,51 @@
}
}
+ return newStatus;
+ }
+
+ static boolean isWifiDisplayEnabled(WifiDisplay d, WifiDisplayStatus wfdStatus) {
+ return d.isAvailable() && (d.canConnect() || d.equals(wfdStatus.getActiveDisplay()));
+ }
+
+ static RouteInfo makeWifiDisplayRoute(WifiDisplay display, WifiDisplayStatus wfdStatus) {
+ final RouteInfo newRoute = new RouteInfo(sStatic.mSystemCategory);
+ newRoute.mDeviceAddress = display.getDeviceAddress();
+ newRoute.mSupportedTypes = ROUTE_TYPE_LIVE_AUDIO | ROUTE_TYPE_LIVE_VIDEO;
+ newRoute.mVolumeHandling = RouteInfo.PLAYBACK_VOLUME_FIXED;
+ newRoute.mPlaybackType = RouteInfo.PLAYBACK_TYPE_REMOTE;
+
+ newRoute.setStatusCode(getWifiDisplayStatusCode(display, wfdStatus));
+ newRoute.mEnabled = isWifiDisplayEnabled(display, wfdStatus);
+ newRoute.mName = display.getFriendlyDisplayName();
+ newRoute.mDescription = sStatic.mResources.getText(
+ com.android.internal.R.string.wireless_display_route_description);
+
+ newRoute.mPresentationDisplay = choosePresentationDisplayForRoute(newRoute,
+ sStatic.getAllPresentationDisplays());
+ return newRoute;
+ }
+
+ private static void updateWifiDisplayRoute(
+ RouteInfo route, WifiDisplay display, WifiDisplayStatus wfdStatus) {
+ boolean changed = false;
final String newName = display.getFriendlyDisplayName();
if (!route.getName().equals(newName)) {
route.mName = newName;
changed = true;
}
- changed |= route.mEnabled != available;
- route.mEnabled = available;
+ boolean enabled = isWifiDisplayEnabled(display, wfdStatus);
+ changed |= route.mEnabled != enabled;
+ route.mEnabled = enabled;
- changed |= route.setStatusCode(newStatus);
+ changed |= route.setStatusCode(getWifiDisplayStatusCode(display, wfdStatus));
if (changed) {
dispatchRouteChanged(route);
}
- if (!available && route == sStatic.mSelectedRoute) {
+ if (!enabled && route == sStatic.mSelectedRoute) {
// Oops, no longer available. Reselect the default.
final RouteInfo defaultRoute = sStatic.mDefaultAudioVideo;
selectRouteStatic(defaultRoute.getSupportedTypes(), defaultRoute);
@@ -1069,6 +1077,7 @@
/** @hide */ public static final int STATUS_CONNECTING = 2;
/** @hide */ public static final int STATUS_AVAILABLE = 3;
/** @hide */ public static final int STATUS_NOT_AVAILABLE = 4;
+ /** @hide */ public static final int STATUS_IN_USE = 5;
private Object mTag;
@@ -1180,6 +1189,9 @@
case STATUS_NOT_AVAILABLE:
resId = com.android.internal.R.string.media_route_status_not_available;
break;
+ case STATUS_IN_USE:
+ resId = com.android.internal.R.string.media_route_status_in_use;
+ break;
}
mStatus = resId != 0 ? sStatic.mResources.getText(resId) : null;
return true;
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 444610c..1c68530 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Роўмінг"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 2d44579..7e27716 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Роуминг"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 2affdd1..8621932 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3,5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Roaming"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 4c2a504..e9977e4 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3,5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Roaming"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 0992ebe..e4bd8c3 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5 G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Itinerancia"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Tipo Edge"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index ac25cc0..64b27ad 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3,5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Rändlus"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Serv"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 1b9b469..610e3f8 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"رومینگ"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 02a096a..77a1195 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3,5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Roaming"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 5d3408e..fab9104 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3G+"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Itinérance"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"EDGE"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 07e8ff0..ffc2586 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"रोमिंग"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"किनारा"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 78c2a36..49da7d0 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Roaming"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index c866ff0..fcc5252 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Roaming"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 0c386cc..8a99e77 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"ローミング中"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"EDGE"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 16e953e..687b5d4 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"로밍"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values-land/refs.xml b/packages/SystemUI/res/values-land/refs.xml
new file mode 100644
index 0000000..f5e79b9
--- /dev/null
+++ b/packages/SystemUI/res/values-land/refs.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (c) 2013, 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.
+*/
+-->
+<resources>
+ <item type="string" name="hideybar_confirmation_message">@string/hideybar_confirmation_message_long</item>
+</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 71355df..0af4e5b 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Viesabonēšana"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"EDGE"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 4696dfa..0363bc1 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Roaming"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 955ef4a..741b0e9 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Roaming"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"EDGE"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 0fd30c7..1128675 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3,5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Роуминг"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 801f230..334cabf 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Roaming"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index ee5ad2a..10bfe8d 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Роминг"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index e3d8178..db66858 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Roaming"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 7bd85a4..7d1f825 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -125,8 +125,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Inatumia data nje mtandao wako"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Ukingo"</string>
diff --git a/packages/SystemUI/res/values-sw600dp-port/refs.xml b/packages/SystemUI/res/values-sw600dp-port/refs.xml
new file mode 100644
index 0000000..f5e79b9
--- /dev/null
+++ b/packages/SystemUI/res/values-sw600dp-port/refs.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (c) 2013, 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.
+*/
+-->
+<resources>
+ <item type="string" name="hideybar_confirmation_message">@string/hideybar_confirmation_message_long</item>
+</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 455dc27..dc4491d 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"โรมมิ่ง"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"EDGE"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 9504774..a0c2afbdc 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Roaming"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index f6c86da..d7ec1c7 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Dolaşımda"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 809ba92..b04d337 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Роумінг"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 791e1a4..20ec4cf 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3,5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"Chuyển vùng"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Cạnh"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 6b075f7f..af4d77d 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"漫游中"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"EDGE"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 602b7bf..032d4c9 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -127,8 +127,7 @@
<string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
<string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
<string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
- <!-- no translation found for accessibility_data_connection_lte (5413468808637540658) -->
- <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"漫遊中"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 9498fe4..129e0e8 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -24,17 +24,6 @@
all of the currently visible notifications. [CHAR LIMIT=10]-->
<string name="status_bar_clear_all_button">Clear</string>
- <!-- The text for the button in the notification window-shade that turns
- on do not disturb mode, where notifications no longer show their ticker,
- no sound plays, and no icons are visible. The windowshade continues to show
- the notifications. [CHAR LIMIT=25]-->
- <string name="status_bar_do_not_disturb_button">Do not disturb</string>
-
- <!-- The text for the button in the notification window-shade that turns
- off do not disturb mode. After clicking this, notifications will be
- shown again. [CHAR LIMIT=25] -->
- <string name="status_bar_please_disturb_button">Show notifications</string>
-
<!-- Title shown in recents popup for removing an application from the list -->
<string name="status_bar_recent_remove_item_title">Remove from list</string>
@@ -436,13 +425,6 @@
application -->
<string name="status_bar_notification_inspect_item_title">App info</string>
- <!-- Title for the pseudo-notification shown when notifications are disabled (do-not-disturb
- mode) -->
- <string name="notifications_off_title">Notifications off</string>
-
- <!-- Content text for do-not-disturb mode notification -->
- <string name="notifications_off_text">Tap here to turn notifications back on.</string>
-
<!-- Description of the button in the phone-style notification panel that controls auto-rotation, when auto-rotation is on. [CHAR LIMIT=NONE] -->
<string name="accessibility_rotation_lock_off">Screen will rotate automatically.</string>
@@ -517,12 +499,9 @@
<!-- Body of help text shown when the notification panel is pulled down for the very first time. [CHAR LIMIT=NONE] -->
<string name="status_bar_help_text">Access them anytime by swiping down.\nSwipe down again for system controls.</string>
- <!-- Toast bar message when hiding the navigation bar on bottom -->
- <string name="hideybar_confirmation_message_bottom">Swipe up from bottom of screen to reveal system bar</string>
+ <!-- Toast bar message when hiding the navigation bar -->
+ <string name="hideybar_confirmation_message">Swipe edge of screen to reveal bar</string>
- <!-- Shorter version of toast bar message when hiding the navigation bar on bottom -->
- <string name="hideybar_confirmation_message_bottom_short">Swipe bottom of screen to reveal bar</string>
-
- <!-- Toast bar message when hiding the navigation bar on right -->
- <string name="hideybar_confirmation_message_right">Swipe from right of screen to reveal system bar</string>
+ <!-- Longer version of toast bar message when hiding the navigation bar (if room) -->
+ <string name="hideybar_confirmation_message_long">Swipe from edge of screen to reveal system bar</string>
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DoNotDisturb.java b/packages/SystemUI/src/com/android/systemui/statusbar/DoNotDisturb.java
deleted file mode 100644
index 7520434..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/DoNotDisturb.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.statusbar;
-
-import android.app.StatusBarManager;
-import android.content.Context;
-import android.content.SharedPreferences;
-
-import com.android.systemui.statusbar.policy.Prefs;
-
-public class DoNotDisturb implements SharedPreferences.OnSharedPreferenceChangeListener {
- private Context mContext;
- private StatusBarManager mStatusBar;
- SharedPreferences mPrefs;
- private boolean mDoNotDisturb;
-
- public DoNotDisturb(Context context) {
- mContext = context;
- mStatusBar = (StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE);
- mPrefs = Prefs.read(context);
- mPrefs.registerOnSharedPreferenceChangeListener(this);
- mDoNotDisturb = mPrefs.getBoolean(Prefs.DO_NOT_DISTURB_PREF, Prefs.DO_NOT_DISTURB_DEFAULT);
- updateDisableRecord();
- }
-
- public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
- final boolean val = prefs.getBoolean(Prefs.DO_NOT_DISTURB_PREF,
- Prefs.DO_NOT_DISTURB_DEFAULT);
- if (val != mDoNotDisturb) {
- mDoNotDisturb = val;
- updateDisableRecord();
- }
- }
-
- private void updateDisableRecord() {
- final int disabled = StatusBarManager.DISABLE_NOTIFICATION_ICONS
- | StatusBarManager.DISABLE_NOTIFICATION_ALERTS
- | StatusBarManager.DISABLE_NOTIFICATION_TICKER;
- mStatusBar.disable(mDoNotDisturb ? disabled : 0);
- }
-}
-
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CarrierLabel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CarrierLabel.java
deleted file mode 100644
index 5ea17e7..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CarrierLabel.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.statusbar.phone;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.widget.TextView;
-
-import com.android.internal.telephony.TelephonyIntents;
-
-/**
- * This widget display an analogic clock with two hands for hours and
- * minutes.
- */
-public class CarrierLabel extends TextView {
- private boolean mAttached;
-
- public CarrierLabel(Context context) {
- this(context, null);
- }
-
- public CarrierLabel(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public CarrierLabel(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- updateNetworkName(false, null, false, null);
- }
-
- @Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
-
- if (!mAttached) {
- mAttached = true;
- IntentFilter filter = new IntentFilter();
- filter.addAction(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION);
- getContext().registerReceiver(mIntentReceiver, filter, null, getHandler());
- }
- }
-
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- if (mAttached) {
- getContext().unregisterReceiver(mIntentReceiver);
- mAttached = false;
- }
- }
-
- private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (TelephonyIntents.SPN_STRINGS_UPDATED_ACTION.equals(action)) {
- updateNetworkName(intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_SPN, false),
- intent.getStringExtra(TelephonyIntents.EXTRA_SPN),
- intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_PLMN, false),
- intent.getStringExtra(TelephonyIntents.EXTRA_PLMN));
- }
- }
- };
-
- void updateNetworkName(boolean showSpn, String spn, boolean showPlmn, String plmn) {
- if (false) {
- Log.d("CarrierLabel", "updateNetworkName showSpn=" + showSpn + " spn=" + spn
- + " showPlmn=" + showPlmn + " plmn=" + plmn);
- }
- final String str;
- // match logic in KeyguardStatusViewManager
- final boolean plmnValid = showPlmn && !TextUtils.isEmpty(plmn);
- final boolean spnValid = showSpn && !TextUtils.isEmpty(spn);
- if (plmnValid && spnValid) {
- str = plmn + "|" + spn;
- } else if (plmnValid) {
- str = plmn;
- } else if (spnValid) {
- str = spn;
- } else {
- str = "";
- }
- setText(str);
- }
-
-
-}
-
-
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CloseDragHandle.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CloseDragHandle.java
deleted file mode 100644
index ee01489..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CloseDragHandle.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.statusbar.phone;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.widget.LinearLayout;
-
-
-public class CloseDragHandle extends LinearLayout {
- PhoneStatusBar mService;
-
- public CloseDragHandle(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- /**
- * Ensure that, if there is no target under us to receive the touch,
- * that we process it ourself. This makes sure that onInterceptTouchEvent()
- * is always called for the entire gesture.
- */
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- if (event.getAction() == MotionEvent.ACTION_DOWN) {
- setPressed(true);
- } else {
- mService.interceptTouchEvent(event);
- }
- return true;
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent event) {
- return mService.interceptTouchEvent(event)
- ? true : super.onInterceptTouchEvent(event);
- }
-}
-
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 a54c435..d86760f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -1959,16 +1959,12 @@
private void setHideybarConfirmationVisible(boolean visible) {
if (DEBUG) Log.d(TAG, "setHideybarConfirmationVisible " + visible);
if (visible && mHideybarConfirmation == null && !mHideybarConfirmationDismissed) {
- // create the confirmation toast bar with the correct message for this config
- float widthDp = mCurrentDisplaySize.x /
- (mDisplayMetrics.densityDpi / (float) DisplayMetrics.DENSITY_DEFAULT);
- int msg = mNavigationBarView.isVertical() ?
- R.string.hideybar_confirmation_message_right :
- widthDp < 600 ? R.string.hideybar_confirmation_message_bottom_short :
- R.string.hideybar_confirmation_message_bottom;
+ // create the confirmation toast bar
+ int msg = R.string.hideybar_confirmation_message;
mHideybarConfirmation = Toast.makeBar(mContext, msg, Toast.LENGTH_INFINITE)
.setAction(com.android.internal.R.string.ok, mHideybarConfirmationAction);
View v = mHideybarConfirmation.getView();
+ v.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
boolean isGloballyConfirmed = Prefs.read(mContext)
.getBoolean(Prefs.HIDEYBAR_CONFIRMED, false);
if (isGloballyConfirmed) {
@@ -1980,8 +1976,8 @@
v.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
int offsetY = mContext.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.toast_y_offset);
- mHideybarConfirmation.setGravity(Gravity.TOP, 0,
- mCurrentDisplaySize.y - v.getMeasuredHeight() / 2 - offsetY);
+ mHideybarConfirmation.setGravity(Gravity.TOP,
+ 0, mCurrentDisplaySize.y - v.getMeasuredHeight() / 2 - offsetY);
// show the confirmation
mHideybarConfirmation.show();
} else if (!visible) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrackingPatternView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrackingPatternView.java
deleted file mode 100644
index 68807a0..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrackingPatternView.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.statusbar.phone;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.util.AttributeSet;
-import android.view.View;
-
-public class TrackingPatternView extends View {
- private Bitmap mTexture;
- private Paint mPaint;
- private int mTextureWidth;
- private int mTextureHeight;
-
- public TrackingPatternView(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- mTexture = BitmapFactory.decodeResource(getResources(),
- com.android.internal.R.drawable.status_bar_background);
- mTextureWidth = mTexture.getWidth();
- mTextureHeight = mTexture.getHeight();
-
- mPaint = new Paint();
- mPaint.setDither(false);
- }
-
- @Override
- public void onDraw(Canvas canvas) {
- final Bitmap texture = mTexture;
- final Paint paint = mPaint;
-
- final int width = getWidth();
- final int height = getHeight();
-
- final int textureWidth = mTextureWidth;
- final int textureHeight = mTextureHeight;
-
- int x = 0;
- int y;
-
- while (x < width) {
- y = 0;
- while (y < height) {
- canvas.drawBitmap(texture, x, y, paint);
- y += textureHeight;
- }
- x += textureWidth;
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AirplaneModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AirplaneModeController.java
deleted file mode 100644
index 8bbe957..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AirplaneModeController.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.statusbar.policy;
-
-import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.AsyncTask;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.widget.CompoundButton;
-
-public class AirplaneModeController extends BroadcastReceiver
- implements CompoundButton.OnCheckedChangeListener {
- private static final String TAG = "StatusBar.AirplaneModeController";
-
- private Context mContext;
- private CompoundButton mCheckBox;
-
- private boolean mAirplaneMode;
-
- public AirplaneModeController(Context context, CompoundButton checkbox) {
- mContext = context;
- mAirplaneMode = getAirplaneMode();
- mCheckBox = checkbox;
- checkbox.setChecked(mAirplaneMode);
- checkbox.setOnCheckedChangeListener(this);
-
- IntentFilter filter = new IntentFilter();
- filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
- context.registerReceiver(this, filter);
-
- }
-
- public void release() {
- mContext.unregisterReceiver(this);
- }
-
- public void onCheckedChanged(CompoundButton view, boolean checked) {
- if (checked != mAirplaneMode) {
- mAirplaneMode = checked;
- unsafe(checked);
- }
- }
-
- public void onReceive(Context context, Intent intent) {
- if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(intent.getAction())) {
- final boolean enabled = intent.getBooleanExtra("state", false);
- if (enabled != mAirplaneMode) {
- mAirplaneMode = enabled;
- mCheckBox.setChecked(enabled);
- }
- }
- }
-
- private boolean getAirplaneMode() {
- ContentResolver cr = mContext.getContentResolver();
- return 0 != Settings.Global.getInt(cr, Settings.Global.AIRPLANE_MODE_ON, 0);
- }
-
- // TODO: Fix this racy API by adding something better to TelephonyManager or
- // ConnectivityService.
- private void unsafe(final boolean enabled) {
- AsyncTask.execute(new Runnable() {
- public void run() {
- Settings.Global.putInt(
- mContext.getContentResolver(),
- Settings.Global.AIRPLANE_MODE_ON,
- enabled ? 1 : 0);
- Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
- intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
- intent.putExtra("state", enabled);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
- }
- });
- }
-}
-
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CompatModeButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CompatModeButton.java
deleted file mode 100644
index 7939752..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CompatModeButton.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.statusbar.policy;
-
-import android.app.ActivityManager;
-import android.content.Context;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.View;
-import android.widget.ImageView;
-
-public class CompatModeButton extends ImageView {
- private static final boolean DEBUG = false;
- private static final String TAG = "StatusBar.CompatModeButton";
-
- private ActivityManager mAM;
-
- public CompatModeButton(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public CompatModeButton(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs);
-
- setClickable(true);
-
- mAM = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
-
- refresh();
- }
-
- public void refresh() {
- int mode = mAM.getFrontActivityScreenCompatMode();
- if (mode == ActivityManager.COMPAT_MODE_UNKNOWN) {
- // If in an unknown state, don't change.
- return;
- }
- final boolean vis = (mode != ActivityManager.COMPAT_MODE_NEVER
- && mode != ActivityManager.COMPAT_MODE_ALWAYS);
- if (DEBUG) Log.d(TAG, "compat mode is " + mode + "; icon will " + (vis ? "show" : "hide"));
- setVisibility(vis ? View.VISIBLE : View.GONE);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CurrentUserTracker.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CurrentUserTracker.java
deleted file mode 100644
index 225ebc1..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CurrentUserTracker.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.statusbar.policy;
-
-import android.app.ActivityManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-
-public class CurrentUserTracker extends BroadcastReceiver {
-
- private int mCurrentUserId;
-
- public CurrentUserTracker(Context context) {
- IntentFilter filter = new IntentFilter(Intent.ACTION_USER_SWITCHED);
- context.registerReceiver(this, filter);
- mCurrentUserId = ActivityManager.getCurrentUser();
- }
-
- public int getCurrentUserId() {
- return mCurrentUserId;
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) {
- mCurrentUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DoNotDisturbController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DoNotDisturbController.java
deleted file mode 100644
index 8612c8f..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DoNotDisturbController.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.statusbar.policy;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.widget.CompoundButton;
-
-public class DoNotDisturbController implements CompoundButton.OnCheckedChangeListener,
- SharedPreferences.OnSharedPreferenceChangeListener {
- private static final String TAG = "StatusBar.DoNotDisturbController";
-
- SharedPreferences mPrefs;
- private Context mContext;
- private CompoundButton mCheckBox;
-
- private boolean mDoNotDisturb;
-
- public DoNotDisturbController(Context context, CompoundButton checkbox) {
- mContext = context;
-
- mPrefs = Prefs.read(context);
- mPrefs.registerOnSharedPreferenceChangeListener(this);
- mDoNotDisturb = mPrefs.getBoolean(Prefs.DO_NOT_DISTURB_PREF, Prefs.DO_NOT_DISTURB_DEFAULT);
-
- mCheckBox = checkbox;
- checkbox.setOnCheckedChangeListener(this);
-
- checkbox.setChecked(!mDoNotDisturb);
- }
-
- // The checkbox is ON for notifications coming in and OFF for Do not disturb, so we
- // don't have a double negative.
- public void onCheckedChanged(CompoundButton view, boolean checked) {
- //Log.d(TAG, "onCheckedChanged checked=" + checked + " mDoNotDisturb=" + mDoNotDisturb);
- final boolean value = !checked;
- if (value != mDoNotDisturb) {
- SharedPreferences.Editor editor = Prefs.edit(mContext);
- editor.putBoolean(Prefs.DO_NOT_DISTURB_PREF, value);
- editor.apply();
- }
- }
-
- public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
- final boolean val = prefs.getBoolean(Prefs.DO_NOT_DISTURB_PREF,
- Prefs.DO_NOT_DISTURB_DEFAULT);
- if (val != mDoNotDisturb) {
- mDoNotDisturb = val;
- mCheckBox.setChecked(!val);
- }
- }
-
- public void release() {
- mPrefs.unregisterOnSharedPreferenceChangeListener(this);
- }
-}
-
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/EventHole.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/EventHole.java
deleted file mode 100644
index aca88fe..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/EventHole.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.statusbar.policy;
-
-import android.content.Context;
-import android.graphics.Region;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewTreeObserver;
-
-public class EventHole extends View implements ViewTreeObserver.OnComputeInternalInsetsListener {
- private static final String TAG = "StatusBar.EventHole";
-
- private boolean mWindowVis;
- private int[] mLoc = new int[2];
-
- public EventHole(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public EventHole(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs);
- }
-
- @Override
- protected void onWindowVisibilityChanged(int visibility) {
- super.onWindowVisibilityChanged(visibility);
- mWindowVis = visibility == View.VISIBLE;
- }
-
- @Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
- getViewTreeObserver().addOnComputeInternalInsetsListener(this);
- }
-
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- getViewTreeObserver().removeOnComputeInternalInsetsListener(this);
- }
-
- public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) {
- final boolean visible = isShown() && mWindowVis && getWidth() > 0 && getHeight() > 0;
- final int[] loc = mLoc;
- getLocationInWindow(loc);
- final int l = loc[0];
- final int r = l + getWidth();
- final int t = loc[1];
- final int b = t + getHeight();
-
- View top = this;
- while (top.getParent() instanceof View) {
- top = (View)top.getParent();
- }
-
- if (visible) {
- info.setTouchableInsets(
- ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION);
- info.touchableRegion.set(0, 0, top.getWidth(), top.getHeight());
- info.touchableRegion.op(l, t, r, b, Region.Op.DIFFERENCE);
- } else {
- info.setTouchableInsets(
- ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME);
- }
- }
-}
-
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FixedSizeDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FixedSizeDrawable.java
deleted file mode 100644
index af20411..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FixedSizeDrawable.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.statusbar.policy;
-
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-
-public class FixedSizeDrawable extends Drawable {
- Drawable mDrawable;
- int mLeft;
- int mTop;
- int mRight;
- int mBottom;
-
- public FixedSizeDrawable(Drawable that) {
- mDrawable = that;
- }
-
- public void setFixedBounds(int l, int t, int r, int b) {
- mLeft = l;
- mTop = t;
- mRight = r;
- mBottom = b;
- }
-
- public void setBounds(Rect bounds) {
- mDrawable.setBounds(mLeft, mTop, mRight, mBottom);
- }
-
- public void setBounds(int l, int t, int r, int b) {
- mDrawable.setBounds(mLeft, mTop, mRight, mBottom);
- }
-
- public void draw(Canvas canvas) {
- mDrawable.draw(canvas);
- }
-
- public int getOpacity() {
- return mDrawable.getOpacity();
- }
-
- public void setAlpha(int alpha) {
- mDrawable.setAlpha(alpha);
- }
-
- public int getAlpha() {
- return mDrawable.getAlpha();
- }
-
- public void setColorFilter(ColorFilter cf) {
- mDrawable.setColorFilter(cf);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java
index a759bba..d03f6ce 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java
@@ -22,10 +22,6 @@
public class Prefs {
private static final String SHARED_PREFS_NAME = "status_bar";
- // a boolean
- public static final String DO_NOT_DISTURB_PREF = "do_not_disturb";
- public static final boolean DO_NOT_DISTURB_DEFAULT = false;
-
public static final String SHOWN_COMPAT_MODE_HELP = "shown_compat_mode_help";
public static final String SHOWN_QUICK_SETTINGS_HELP = "shown_quick_settings_help";
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/VolumeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/VolumeController.java
deleted file mode 100644
index d3707f2..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/VolumeController.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.statusbar.policy;
-
-import android.content.Context;
-import android.media.AudioManager;
-import android.os.Vibrator;
-
-import com.android.systemui.settings.ToggleSlider;
-
-public class VolumeController implements ToggleSlider.Listener {
- private static final String TAG = "StatusBar.VolumeController";
- private static final int STREAM = AudioManager.STREAM_NOTIFICATION;
-
- private Context mContext;
- private ToggleSlider mControl;
- private AudioManager mAudioManager;
-
- private boolean mMute;
- private int mVolume;
- // Is there a vibrator
- private final boolean mHasVibrator;
-
- public VolumeController(Context context, ToggleSlider control) {
- mContext = context;
- mControl = control;
-
- Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
- mHasVibrator = vibrator == null ? false : vibrator.hasVibrator();
-
- mAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
-
- mMute = mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL;
- mVolume = mAudioManager.getStreamVolume(STREAM);
-
- control.setOnChangedListener(this);
- }
-
- @Override
- public void onInit(ToggleSlider control) {
- control.setMax(mAudioManager.getStreamMaxVolume(STREAM));
- control.setValue(mVolume);
- control.setChecked(mMute);
- }
-
- public void onChanged(ToggleSlider view, boolean tracking, boolean mute, int level) {
- if (!tracking) {
- if (mute) {
- mAudioManager.setRingerMode(
- mHasVibrator ? AudioManager.RINGER_MODE_VIBRATE
- : AudioManager.RINGER_MODE_SILENT);
- } else {
- mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
- mAudioManager.setStreamVolume(STREAM, level, AudioManager.FLAG_PLAY_SOUND);
- }
- }
- }
-}
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java
index ce952d1..6f740cd 100644
--- a/services/java/com/android/server/NetworkManagementService.java
+++ b/services/java/com/android/server/NetworkManagementService.java
@@ -43,6 +43,7 @@
import android.net.RouteInfo;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiConfiguration.KeyMgmt;
+import android.os.BatteryStats;
import android.os.Binder;
import android.os.Handler;
import android.os.INetworkManagementService;
@@ -347,7 +348,7 @@
if (mBandwidthControlEnabled) {
try {
- IBatteryStats.Stub.asInterface(ServiceManager.getService("batteryinfo"))
+ IBatteryStats.Stub.asInterface(ServiceManager.getService(BatteryStats.SERVICE_NAME))
.noteNetworkStatsEnabled();
} catch (RemoteException e) {
}
diff --git a/services/java/com/android/server/VibratorService.java b/services/java/com/android/server/VibratorService.java
index 21d3111..9b5f8f6 100644
--- a/services/java/com/android/server/VibratorService.java
+++ b/services/java/com/android/server/VibratorService.java
@@ -24,6 +24,7 @@
import android.content.pm.PackageManager;
import android.database.ContentObserver;
import android.hardware.input.InputManager;
+import android.os.BatteryStats;
import android.os.Handler;
import android.os.IVibratorService;
import android.os.PowerManager;
@@ -143,7 +144,8 @@
mWakeLock.setReferenceCounted(true);
mAppOpsService = IAppOpsService.Stub.asInterface(ServiceManager.getService(Context.APP_OPS_SERVICE));
- mBatteryStatsService = IBatteryStats.Stub.asInterface(ServiceManager.getService("batteryinfo"));
+ mBatteryStatsService = IBatteryStats.Stub.asInterface(ServiceManager.getService(
+ BatteryStats.SERVICE_NAME));
mVibrations = new LinkedList<Vibration>();
diff --git a/services/java/com/android/server/am/ActiveServices.java b/services/java/com/android/server/am/ActiveServices.java
index 912c465..c558fbd 100644
--- a/services/java/com/android/server/am/ActiveServices.java
+++ b/services/java/com/android/server/am/ActiveServices.java
@@ -241,11 +241,14 @@
if (unscheduleServiceRestartLocked(r)) {
if (DEBUG_SERVICE) Slog.v(TAG, "START SERVICE WHILE RESTART PENDING: " + r);
}
+ r.lastActivity = SystemClock.uptimeMillis();
r.startRequested = true;
+ if (r.tracker != null) {
+ r.tracker.setStarted(true, mAm.mProcessTracker.getMemFactor(), r.lastActivity);
+ }
r.callStart = false;
r.pendingStarts.add(new ServiceRecord.StartItem(r, false, r.makeNextStartId(),
service, neededGrants));
- r.lastActivity = SystemClock.uptimeMillis();
synchronized (r.stats.getBatteryStats()) {
r.stats.startRunningLocked();
}
@@ -261,8 +264,12 @@
service.stats.stopRunningLocked();
}
service.startRequested = false;
+ if (service.tracker != null) {
+ service.tracker.setStarted(false, mAm.mProcessTracker.getMemFactor(),
+ SystemClock.uptimeMillis());
+ }
service.callStart = false;
- bringDownServiceLocked(service, false);
+ bringDownServiceIfNeededLocked(service, false, false);
}
int stopServiceLocked(IApplicationThread caller, Intent service,
@@ -355,11 +362,15 @@
synchronized (r.stats.getBatteryStats()) {
r.stats.stopRunningLocked();
- r.startRequested = false;
- r.callStart = false;
}
+ r.startRequested = false;
+ if (r.tracker != null) {
+ r.tracker.setStarted(false, mAm.mProcessTracker.getMemFactor(),
+ SystemClock.uptimeMillis());
+ }
+ r.callStart = false;
final long origId = Binder.clearCallingIdentity();
- bringDownServiceLocked(r, false);
+ bringDownServiceIfNeededLocked(r, false, false);
Binder.restoreCallingIdentity(origId);
return true;
}
@@ -489,6 +500,17 @@
+ s);
}
+ if ((flags&Context.BIND_AUTO_CREATE) != 0) {
+ s.lastActivity = SystemClock.uptimeMillis();
+ if (!s.hasAutoCreateConnections()) {
+ // This is the first binding, let the tracker know.
+ if (s.tracker != null) {
+ s.tracker.setBound(true, mAm.mProcessTracker.getMemFactor(),
+ s.lastActivity);
+ }
+ }
+ }
+
AppBindRecord b = s.retrieveAppBindingLocked(service, callerApp);
ConnectionRecord c = new ConnectionRecord(b, activity,
connection, flags, clientLabel, clientIntent);
@@ -748,7 +770,12 @@
sInfo.applicationInfo.uid, sInfo.packageName,
sInfo.name);
}
- r = new ServiceRecord(mAm, ss, name, filter, sInfo, res);
+ ProcessTracker.ServiceState tracker = null;
+ if ((sInfo.applicationInfo.flags&ApplicationInfo.FLAG_PERSISTENT) == 0) {
+ tracker = mAm.mProcessTracker.getServiceStateLocked(sInfo.packageName,
+ sInfo.applicationInfo.uid, sInfo.name);
+ }
+ r = new ServiceRecord(mAm, ss, name, filter, sInfo, res, tracker);
res.setService(r);
mServiceMap.putServiceByName(name, UserHandle.getUserId(r.appInfo.uid), r);
mServiceMap.putServiceByIntent(filter, UserHandle.getUserId(r.appInfo.uid), r);
@@ -798,14 +825,19 @@
else if (DEBUG_SERVICE_EXECUTING) Log.v(TAG, ">>> EXECUTING "
+ why + " of " + r.shortName);
long now = SystemClock.uptimeMillis();
- if (r.executeNesting == 0 && r.app != null) {
- if (r.app.executingServices.size() == 0) {
- Message msg = mAm.mHandler.obtainMessage(
- ActivityManagerService.SERVICE_TIMEOUT_MSG);
- msg.obj = r.app;
- mAm.mHandler.sendMessageAtTime(msg, now+SERVICE_TIMEOUT);
+ if (r.executeNesting == 0) {
+ if (r.tracker != null) {
+ r.tracker.setExecuting(true, mAm.mProcessTracker.getMemFactor(), now);
}
- r.app.executingServices.add(r);
+ if (r.app != null) {
+ if (r.app.executingServices.size() == 0) {
+ Message msg = mAm.mHandler.obtainMessage(
+ ActivityManagerService.SERVICE_TIMEOUT_MSG);
+ msg.obj = r.app;
+ mAm.mHandler.sendMessageAtTime(msg, now+SERVICE_TIMEOUT);
+ }
+ r.app.executingServices.add(r);
+ }
}
r.executeNesting++;
r.executingStart = now;
@@ -991,7 +1023,7 @@
+ r.appInfo.uid + " for service "
+ r.intent.getIntent() + ": user " + r.userId + " is stopped";
Slog.w(TAG, msg);
- bringDownServiceLocked(r, true);
+ bringDownServiceLocked(r);
return msg;
}
@@ -1045,7 +1077,7 @@
+ r.appInfo.uid + " for service "
+ r.intent.getIntent() + ": process is bad";
Slog.w(TAG, msg);
- bringDownServiceLocked(r, true);
+ bringDownServiceLocked(r);
return msg;
}
if (isolated) {
@@ -1167,26 +1199,29 @@
}
}
- private final void bringDownServiceLocked(ServiceRecord r, boolean force) {
+ private final void bringDownServiceIfNeededLocked(ServiceRecord r, boolean knowConn,
+ boolean hasConn) {
//Slog.i(TAG, "Bring down service:");
//r.dump(" ");
// Does it still need to run?
- if (!force && r.startRequested) {
+ if (r.startRequested) {
return;
}
- if (!force) {
- // XXX should probably keep a count of the number of auto-create
- // connections directly in the service.
- for (int conni=r.connections.size()-1; conni>=0; conni--) {
- ArrayList<ConnectionRecord> cr = r.connections.valueAt(conni);
- for (int i=0; i<cr.size(); i++) {
- if ((cr.get(i).flags&Context.BIND_AUTO_CREATE) != 0) {
- return;
- }
- }
- }
+
+ if (!knowConn) {
+ hasConn = r.hasAutoCreateConnections();
}
+ if (hasConn) {
+ return;
+ }
+
+ bringDownServiceLocked(r);
+ }
+
+ private final void bringDownServiceLocked(ServiceRecord r) {
+ //Slog.i(TAG, "Bring down service:");
+ //r.dump(" ");
// Report to all of the connections that the service is no longer
// available.
@@ -1291,6 +1326,13 @@
if (r.restarter instanceof ServiceRestarter) {
((ServiceRestarter)r.restarter).setService(null);
}
+
+ int memFactor = mAm.mProcessTracker.getMemFactor();
+ long now = SystemClock.uptimeMillis();
+ if (r.tracker != null) {
+ r.tracker.setStarted(false, memFactor, now);
+ r.tracker.setBound(false, memFactor, now);
+ }
}
void removeConnectionLocked(
@@ -1349,7 +1391,14 @@
}
if ((c.flags&Context.BIND_AUTO_CREATE) != 0) {
- bringDownServiceLocked(s, false);
+ boolean hasAutoCreate = s.hasAutoCreateConnections();
+ if (!hasAutoCreate) {
+ if (s.tracker != null) {
+ s.tracker.setBound(false, mAm.mProcessTracker.getMemFactor(),
+ SystemClock.uptimeMillis());
+ }
+ }
+ bringDownServiceIfNeededLocked(s, true, hasAutoCreate);
}
}
}
@@ -1422,22 +1471,28 @@
+ ", inStopping=" + inStopping + ", app=" + r.app);
else if (DEBUG_SERVICE_EXECUTING) Slog.v(TAG, "<<< DONE EXECUTING " + r.shortName);
r.executeNesting--;
- if (r.executeNesting <= 0 && r.app != null) {
- if (DEBUG_SERVICE) Slog.v(TAG,
- "Nesting at 0 of " + r.shortName);
- r.app.executingServices.remove(r);
- if (r.app.executingServices.size() == 0) {
- if (DEBUG_SERVICE || DEBUG_SERVICE_EXECUTING) Slog.v(TAG,
- "No more executingServices of " + r.shortName);
- mAm.mHandler.removeMessages(ActivityManagerService.SERVICE_TIMEOUT_MSG, r.app);
- }
- if (inStopping) {
+ if (r.executeNesting <= 0) {
+ if (r.app != null) {
if (DEBUG_SERVICE) Slog.v(TAG,
- "doneExecuting remove stopping " + r);
- mStoppingServices.remove(r);
- r.bindings.clear();
+ "Nesting at 0 of " + r.shortName);
+ r.app.executingServices.remove(r);
+ if (r.app.executingServices.size() == 0) {
+ if (DEBUG_SERVICE || DEBUG_SERVICE_EXECUTING) Slog.v(TAG,
+ "No more executingServices of " + r.shortName);
+ mAm.mHandler.removeMessages(ActivityManagerService.SERVICE_TIMEOUT_MSG, r.app);
+ }
+ if (inStopping) {
+ if (DEBUG_SERVICE) Slog.v(TAG,
+ "doneExecuting remove stopping " + r);
+ mStoppingServices.remove(r);
+ r.bindings.clear();
+ }
+ mAm.updateOomAdjLocked(r.app);
}
- mAm.updateOomAdjLocked(r.app);
+ if (r.tracker != null) {
+ r.tracker.setExecuting(false, mAm.mProcessTracker.getMemFactor(),
+ SystemClock.uptimeMillis());
+ }
}
}
@@ -1494,7 +1549,7 @@
sr.isolatedProc = null;
mPendingServices.remove(i);
i--;
- bringDownServiceLocked(sr, true);
+ bringDownServiceLocked(sr);
}
}
}
@@ -1545,7 +1600,7 @@
int N = services.size();
for (int i=0; i<N; i++) {
- bringDownServiceLocked(services.get(i), true);
+ bringDownServiceLocked(services.get(i));
}
return didSomething;
}
@@ -1628,6 +1683,10 @@
sr.app = null;
sr.isolatedProc = null;
sr.executeNesting = 0;
+ if (sr.tracker != null) {
+ sr.tracker.setExecuting(false, mAm.mProcessTracker.getMemFactor(),
+ SystemClock.uptimeMillis());
+ }
if (mStoppingServices.remove(sr)) {
if (DEBUG_SERVICE) Slog.v(TAG, "killServices remove stopping " + sr);
}
@@ -1647,9 +1706,9 @@
+ " times, stopping: " + sr);
EventLog.writeEvent(EventLogTags.AM_SERVICE_CRASHED_TOO_MUCH,
sr.userId, sr.crashCount, sr.shortName, app.pid);
- bringDownServiceLocked(sr, true);
+ bringDownServiceLocked(sr);
} else if (!allowRestart) {
- bringDownServiceLocked(sr, true);
+ bringDownServiceLocked(sr);
} else {
boolean canceled = scheduleServiceRestartLocked(sr, true);
@@ -1659,9 +1718,13 @@
if (sr.startRequested && (sr.stopIfKilled || canceled)) {
if (sr.pendingStarts.size() == 0) {
sr.startRequested = false;
- if (numClients > 0) {
+ if (sr.tracker != null) {
+ sr.tracker.setStarted(false, mAm.mProcessTracker.getMemFactor(),
+ SystemClock.uptimeMillis());
+ }
+ if (!sr.hasAutoCreateConnections()) {
// Whoops, no reason to restart!
- bringDownServiceLocked(sr, true);
+ bringDownServiceLocked(sr);
}
}
}
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 2124095..21c752b 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -7292,7 +7292,6 @@
if (isolated) {
int userId = UserHandle.getUserId(uid);
int stepsLeft = Process.LAST_ISOLATED_UID - Process.FIRST_ISOLATED_UID + 1;
- uid = 0;
while (true) {
if (mNextIsolatedProcessUid < Process.FIRST_ISOLATED_UID
|| mNextIsolatedProcessUid > Process.LAST_ISOLATED_UID) {
@@ -7314,7 +7313,7 @@
ps = stats.getProcessStatsLocked(info.uid, proc);
}
return new ProcessRecord(ps, thread, info, proc, uid,
- mProcessTracker.getProcessStateLocked(info.packageName, uid, proc));
+ mProcessTracker.getProcessStateLocked(info.packageName, info.uid, proc));
}
final ProcessRecord addAppLocked(ApplicationInfo info, boolean isolated) {
@@ -14193,7 +14192,7 @@
// are managing to keep around is less than half the maximum we desire;
// if we are keeping a good number around, we'll let them use whatever
// memory they want.
- int memFactor = ProcessTracker.STATE_MEM_FACTOR_NORMAL_ADJ;
+ int memFactor = ProcessTracker.ADJ_MEM_FACTOR_NORMAL;
if (numCached <= ProcessList.TRIM_CACHED_APPS
&& numEmpty <= ProcessList.TRIM_EMPTY_APPS) {
final int numCachedAndEmpty = numCached + numEmpty;
@@ -14207,13 +14206,13 @@
int fgTrimLevel;
if (numCachedAndEmpty <= ProcessList.TRIM_CRITICAL_THRESHOLD) {
fgTrimLevel = ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL;
- memFactor = ProcessTracker.STATE_MEM_FACTOR_CRITIAL_ADJ;
+ memFactor = ProcessTracker.ADJ_MEM_FACTOR_CRITICAL;
} else if (numCachedAndEmpty <= ProcessList.TRIM_LOW_THRESHOLD) {
fgTrimLevel = ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW;
- memFactor = ProcessTracker.STATE_MEM_FACTOR_LOW_ADJ;
+ memFactor = ProcessTracker.ADJ_MEM_FACTOR_LOW;
} else {
fgTrimLevel = ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE;
- memFactor = ProcessTracker.STATE_MEM_FACTOR_MODERATE_ADJ;
+ memFactor = ProcessTracker.ADJ_MEM_FACTOR_MODERATE;
}
int curLevel = ComponentCallbacks2.TRIM_MEMORY_COMPLETE;
for (i=0; i<N; i++) {
diff --git a/services/java/com/android/server/am/BatteryStatsService.java b/services/java/com/android/server/am/BatteryStatsService.java
index f143feb..12cad7b 100644
--- a/services/java/com/android/server/am/BatteryStatsService.java
+++ b/services/java/com/android/server/am/BatteryStatsService.java
@@ -22,6 +22,7 @@
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import android.os.BatteryStats;
import android.os.Binder;
import android.os.IBinder;
import android.os.Parcel;
@@ -59,7 +60,7 @@
public void publish(Context context) {
mContext = context;
- ServiceManager.addService("batteryinfo", asBinder());
+ ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
mStats.setNumSpeedSteps(new PowerProfile(mContext).getNumSpeedSteps());
mStats.setRadioScanningTimeout(mContext.getResources().getInteger(
com.android.internal.R.integer.config_radioScanningTimeout)
@@ -77,7 +78,7 @@
if (sService != null) {
return sService;
}
- IBinder b = ServiceManager.getService("batteryinfo");
+ IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME);
sService = asInterface(b);
return sService;
}
@@ -479,7 +480,7 @@
}
private void dumpHelp(PrintWriter pw) {
- pw.println("Battery stats (batteryinfo) dump options:");
+ pw.println("Battery stats (batterystats) dump options:");
pw.println(" [--checkin] [--unplugged] [--reset] [--write] [-h] [<package.name>]");
pw.println(" --checkin: format output for a checkin report.");
pw.println(" --unplugged: only output data since last unplugged.");
diff --git a/services/java/com/android/server/am/ProcessTracker.java b/services/java/com/android/server/am/ProcessTracker.java
index fb8d09c..ec8a0b2 100644
--- a/services/java/com/android/server/am/ProcessTracker.java
+++ b/services/java/com/android/server/am/ProcessTracker.java
@@ -17,6 +17,7 @@
package com.android.server.am;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.SparseArray;
import android.util.TimeUtils;
@@ -24,6 +25,9 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
public final class ProcessTracker {
public static final int STATE_NOTHING = -1;
@@ -36,16 +40,18 @@
public static final int STATE_HOME = 6;
public static final int STATE_PREVIOUS = 7;
public static final int STATE_CACHED = 8;
- public static final int STATE_MEM_FACTOR_MOD = STATE_CACHED+1;
- public static final int STATE_MEM_FACTOR_NORMAL_ADJ = 0;
- public static final int STATE_MEM_FACTOR_MODERATE_ADJ = STATE_MEM_FACTOR_MOD;
- public static final int STATE_MEM_FACTOR_LOW_ADJ = STATE_MEM_FACTOR_MOD*2;
- public static final int STATE_MEM_FACTOR_CRITIAL_ADJ = STATE_MEM_FACTOR_MOD*3;
- public static final int STATE_MEM_FACTOR_COUNT = STATE_MEM_FACTOR_MOD*4;
- public static final int STATE_SCREEN_ON_MOD = STATE_MEM_FACTOR_COUNT;
- public static final int STATE_SCREEN_OFF_ADJ = 0;
- public static final int STATE_SCREEN_ON_ADJ = STATE_SCREEN_ON_MOD;
- public static final int STATE_COUNT = STATE_SCREEN_ON_MOD*2;
+ public static final int STATE_COUNT = STATE_CACHED+1;
+
+ public static final int ADJ_NOTHING = -1;
+ public static final int ADJ_MEM_FACTOR_NORMAL = 0;
+ public static final int ADJ_MEM_FACTOR_MODERATE = 1;
+ public static final int ADJ_MEM_FACTOR_LOW = 2;
+ public static final int ADJ_MEM_FACTOR_CRITICAL = 3;
+ public static final int ADJ_MEM_FACTOR_COUNT = ADJ_MEM_FACTOR_CRITICAL+1;
+ public static final int ADJ_SCREEN_MOD = ADJ_MEM_FACTOR_COUNT;
+ public static final int ADJ_SCREEN_OFF = 0;
+ public static final int ADJ_SCREEN_ON = ADJ_SCREEN_MOD;
+ public static final int ADJ_COUNT = ADJ_SCREEN_ON*2;
static String[] STATE_NAMES = new String[] {
"Top ", "Foreground ", "Visible ", "Perceptible", "Backup ",
@@ -53,13 +59,25 @@
};
public static final class ProcessState {
- final long[] mDurations = new long[STATE_COUNT];
+ final String mPackage;
+ final int mUid;
+ final String mName;
+
+ final long[] mDurations = new long[STATE_COUNT*ADJ_COUNT];
int mCurState = STATE_NOTHING;
long mStartTime;
+ long mTmpTotalTime;
+
+ public ProcessState(String pkg, int uid, String name) {
+ mPackage = pkg;
+ mUid = uid;
+ mName = name;
+ }
+
public void setState(int state, int memFactor, long now) {
if (state != STATE_NOTHING) {
- state += memFactor;
+ state += memFactor*STATE_COUNT;
}
if (mCurState != state) {
if (mCurState != STATE_NOTHING) {
@@ -72,8 +90,59 @@
}
public static final class ServiceState {
- long mStartedDuration;
- long mStartedTime;
+ final long[] mStartedDurations = new long[ADJ_COUNT];
+ int mStartedCount;
+ int mStartedState = STATE_NOTHING;
+ long mStartedStartTime;
+
+ final long[] mBoundDurations = new long[ADJ_COUNT];
+ int mBoundCount;
+ int mBoundState = STATE_NOTHING;
+ long mBoundStartTime;
+
+ final long[] mExecDurations = new long[ADJ_COUNT];
+ int mExecCount;
+ int mExecState = STATE_NOTHING;
+ long mExecStartTime;
+
+ public void setStarted(boolean started, int memFactor, long now) {
+ int state = started ? memFactor : STATE_NOTHING;
+ if (mStartedState != state) {
+ if (mStartedState != STATE_NOTHING) {
+ mStartedDurations[mStartedState] += now - mStartedStartTime;
+ } else if (started) {
+ mStartedCount++;
+ }
+ mStartedState = state;
+ mStartedStartTime = now;
+ }
+ }
+
+ public void setBound(boolean bound, int memFactor, long now) {
+ int state = bound ? memFactor : STATE_NOTHING;
+ if (mBoundState != state) {
+ if (mBoundState != STATE_NOTHING) {
+ mBoundDurations[mBoundState] += now - mBoundStartTime;
+ } else if (bound) {
+ mBoundCount++;
+ }
+ mBoundState = state;
+ mBoundStartTime = now;
+ }
+ }
+
+ public void setExecuting(boolean executing, int memFactor, long now) {
+ int state = executing ? memFactor : STATE_NOTHING;
+ if (mExecState != state) {
+ if (mExecState != STATE_NOTHING) {
+ mExecDurations[mExecState] += now - mExecStartTime;
+ } else if (executing) {
+ mExecCount++;
+ }
+ mExecState = state;
+ mExecStartTime = now;
+ }
+ }
}
public static final class PackageState {
@@ -88,7 +157,7 @@
static final class State {
final ProcessMap<PackageState> mPackages = new ProcessMap<PackageState>();
- final long[] mMemFactorDurations = new long[STATE_COUNT/STATE_MEM_FACTOR_MOD];
+ final long[] mMemFactorDurations = new long[ADJ_COUNT];
int mMemFactor = STATE_NOTHING;
long mStartTime;
}
@@ -114,7 +183,7 @@
if (ps != null) {
return ps;
}
- ps = new ProcessState();
+ ps = new ProcessState(packageName, uid, processName);
as.mProcesses.put(processName, ps);
return ps;
}
@@ -132,15 +201,31 @@
public boolean setMemFactor(int memFactor, boolean screenOn, long now) {
if (screenOn) {
- memFactor += STATE_SCREEN_ON_MOD;
+ memFactor += ADJ_SCREEN_ON;
}
if (memFactor != mState.mMemFactor) {
if (mState.mMemFactor != STATE_NOTHING) {
- mState.mMemFactorDurations[mState.mMemFactor/STATE_MEM_FACTOR_MOD]
- += now - mState.mStartTime;
+ mState.mMemFactorDurations[mState.mMemFactor] += now - mState.mStartTime;
}
mState.mMemFactor = memFactor;
mState.mStartTime = now;
+ ArrayMap<String, SparseArray<PackageState>> pmap = mState.mPackages.getMap();
+ for (int i=0; i<pmap.size(); i++) {
+ SparseArray<PackageState> uids = pmap.valueAt(i);
+ for (int j=0; j<uids.size(); j++) {
+ PackageState pkg = uids.valueAt(j);
+ ArrayMap<String, ServiceState> services = pkg.mServices;
+ for (int k=0; k<services.size(); k++) {
+ ServiceState service = services.valueAt(k);
+ if (service.mStartedState != STATE_NOTHING) {
+ service.setStarted(true, memFactor, now);
+ }
+ if (service.mBoundState != STATE_NOTHING) {
+ service.setBound(true, memFactor, now);
+ }
+ }
+ }
+ }
return true;
}
return false;
@@ -150,15 +235,15 @@
return mState.mMemFactor != STATE_NOTHING ? mState.mMemFactor : 0;
}
- private void printScreenLabel(PrintWriter pw, int offset) {
+ static private void printScreenLabel(PrintWriter pw, int offset) {
switch (offset) {
- case STATE_NOTHING:
+ case ADJ_NOTHING:
pw.print(" ");
break;
- case STATE_SCREEN_OFF_ADJ:
+ case ADJ_SCREEN_OFF:
pw.print("Screen Off / ");
break;
- case STATE_SCREEN_ON_ADJ:
+ case ADJ_SCREEN_ON:
pw.print("Screen On / ");
break;
default:
@@ -167,21 +252,21 @@
}
}
- private void printMemLabel(PrintWriter pw, int offset) {
+ static private void printMemLabel(PrintWriter pw, int offset) {
switch (offset) {
- case STATE_NOTHING:
+ case ADJ_NOTHING:
pw.print(" ");
break;
- case STATE_MEM_FACTOR_NORMAL_ADJ:
+ case ADJ_MEM_FACTOR_NORMAL:
pw.print("Norm / ");
break;
- case STATE_MEM_FACTOR_MODERATE_ADJ:
+ case ADJ_MEM_FACTOR_MODERATE:
pw.print("Mod / ");
break;
- case STATE_MEM_FACTOR_LOW_ADJ:
+ case ADJ_MEM_FACTOR_LOW:
pw.print("Low / ");
break;
- case STATE_MEM_FACTOR_CRITIAL_ADJ:
+ case ADJ_MEM_FACTOR_CRITICAL:
pw.print("Crit / ");
break;
default:
@@ -190,29 +275,191 @@
}
}
+ static void dumpSingleTime(PrintWriter pw, String prefix, long[] durations,
+ int curState, long curStartTime, long now) {
+ long totalTime = 0;
+ int printedScreen = -1;
+ for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) {
+ int printedMem = -1;
+ for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) {
+ int state = imem+iscreen;
+ long time = durations[state];
+ String running = "";
+ if (curState == state) {
+ time += now - curStartTime;
+ running = " (running)";
+ }
+ if (time != 0) {
+ pw.print(prefix);
+ printScreenLabel(pw, printedScreen != iscreen
+ ? iscreen : STATE_NOTHING);
+ printedScreen = iscreen;
+ printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING);
+ printedMem = imem;
+ TimeUtils.formatDuration(time, pw); pw.println(running);
+ totalTime += time;
+ }
+ }
+ }
+ if (totalTime != 0) {
+ pw.print(prefix);
+ printScreenLabel(pw, STATE_NOTHING);
+ pw.print("TOTAL: ");
+ TimeUtils.formatDuration(totalTime, pw);
+ pw.println();
+ }
+ }
+
+ long computeProcessTimeLocked(ProcessState proc, int[] screenStates, int[] memStates,
+ int[] procStates, long now) {
+ long totalTime = 0;
+ for (int is=0; is<screenStates.length; is++) {
+ for (int im=0; im<memStates.length; im++) {
+ for (int ip=0; ip<procStates.length; ip++) {
+ int bucket = ((screenStates[is]+ memStates[im]) * STATE_COUNT)
+ + procStates[ip];
+ totalTime += proc.mDurations[bucket];
+ if (proc.mCurState == bucket) {
+ totalTime += now - proc.mStartTime;
+ }
+ }
+ }
+ }
+ proc.mTmpTotalTime = totalTime;
+ return totalTime;
+ }
+
+ ArrayList<ProcessState> collectProcessesLocked(int[] screenStates, int[] memStates,
+ int[] procStates, long now) {
+ ArrayList<ProcessState> outProcs = new ArrayList<ProcessState>();
+ ArrayMap<String, SparseArray<PackageState>> pmap = mState.mPackages.getMap();
+ for (int ip=0; ip<pmap.size(); ip++) {
+ SparseArray<PackageState> procs = pmap.valueAt(ip);
+ for (int iu=0; iu<procs.size(); iu++) {
+ PackageState state = procs.valueAt(iu);
+ for (int iproc=0; iproc<state.mProcesses.size(); iproc++) {
+ if (computeProcessTimeLocked(state.mProcesses.valueAt(iproc),
+ screenStates, memStates, procStates, now) > 0) {
+ outProcs.add(state.mProcesses.valueAt(iproc));
+ }
+ }
+ }
+ }
+ Collections.sort(outProcs, new Comparator<ProcessState>() {
+ @Override
+ public int compare(ProcessState lhs, ProcessState rhs) {
+ if (lhs.mTmpTotalTime < rhs.mTmpTotalTime) {
+ return -1;
+ } else if (lhs.mTmpTotalTime > rhs.mTmpTotalTime) {
+ return 1;
+ }
+ return 0;
+ }
+ });
+ return outProcs;
+ }
+
+ void dumpProcessState(PrintWriter pw, String prefix, ProcessState proc, int[] screenStates,
+ int[] memStates, int[] procStates, long now) {
+ long totalTime = 0;
+ int printedScreen = -1;
+ for (int is=0; is<screenStates.length; is++) {
+ int printedMem = -1;
+ for (int im=0; im<memStates.length; im++) {
+ for (int ip=0; ip<procStates.length; ip++) {
+ final int iscreen = screenStates[is];
+ final int imem = memStates[im];
+ final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip];
+ long time = proc.mDurations[bucket];
+ String running = "";
+ if (proc.mCurState == bucket) {
+ time += now - proc.mStartTime;
+ running = " (running)";
+ }
+ totalTime += time;
+ if (time != 0) {
+ pw.print(prefix);
+ if (screenStates.length > 1) {
+ printScreenLabel(pw, printedScreen != iscreen
+ ? iscreen : STATE_NOTHING);
+ printedScreen = iscreen;
+ }
+ if (memStates.length > 1) {
+ printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING);
+ printedMem = imem;
+ }
+ pw.print(STATE_NAMES[procStates[ip]]); pw.print(": ");
+ TimeUtils.formatDuration(time, pw); pw.println(running);
+ totalTime += time;
+ }
+ }
+ }
+ }
+ if (totalTime != 0) {
+ pw.print(prefix);
+ if (screenStates.length > 1) {
+ printScreenLabel(pw, STATE_NOTHING);
+ }
+ if (memStates.length > 1) {
+ printMemLabel(pw, STATE_NOTHING);
+ }
+ pw.print("TOTAL : ");
+ TimeUtils.formatDuration(totalTime, pw);
+ pw.println();
+ }
+ }
+
+ void dumpProcessList(PrintWriter pw, String prefix, ArrayList<ProcessState> procs,
+ int[] screenStates, int[] memStates, int[] procStates, long now) {
+ String innerPrefix = prefix + " ";
+ for (int i=procs.size()-1; i>=0; i--) {
+ ProcessState proc = procs.get(i);
+ pw.print(prefix);
+ pw.print(proc.mPackage);
+ pw.print(" / ");
+ UserHandle.formatUid(pw, proc.mUid);
+ pw.print(" / ");
+ pw.print(proc.mName);
+ pw.println(":");
+ dumpProcessState(pw, innerPrefix, proc, screenStates, memStates, procStates, now);
+ }
+ }
+
+ void dumpFilteredProcesses(PrintWriter pw, String header, String prefix,
+ int[] screenStates, int[] memStates, int[] procStates, long now) {
+ ArrayList<ProcessState> procs = collectProcessesLocked(screenStates, memStates,
+ procStates, now);
+ if (procs.size() > 0) {
+ pw.println();
+ pw.println(header);
+ dumpProcessList(pw, prefix, procs, screenStates, memStates, procStates, now);
+ }
+ }
+
public void dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args) {
final long now = SystemClock.uptimeMillis();
ArrayMap<String, SparseArray<PackageState>> pmap = mState.mPackages.getMap();
- pw.println("Process Stats:");
+ pw.println("Per-Package Process Stats:");
for (int ip=0; ip<pmap.size(); ip++) {
String procName = pmap.keyAt(ip);
SparseArray<PackageState> procs = pmap.valueAt(ip);
for (int iu=0; iu<procs.size(); iu++) {
int uid = procs.keyAt(iu);
PackageState state = procs.valueAt(iu);
- pw.print(" "); pw.print(procName); pw.print(" / "); pw.print(uid); pw.println(":");
+ pw.print(" * "); pw.print(procName); pw.print(" / ");
+ UserHandle.formatUid(pw, uid); pw.println(":");
for (int iproc=0; iproc<state.mProcesses.size(); iproc++) {
- pw.print(" Process ");
+ pw.print(" Process ");
pw.print(state.mProcesses.keyAt(iproc));
pw.println(":");
long totalTime = 0;
ProcessState proc = state.mProcesses.valueAt(iproc);
int printedScreen = -1;
- for (int iscreen=0; iscreen<STATE_COUNT; iscreen+=STATE_SCREEN_ON_MOD) {
+ for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) {
int printedMem = -1;
- for (int imem=0; imem<STATE_MEM_FACTOR_COUNT; imem+=STATE_MEM_FACTOR_MOD) {
+ for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) {
for (int is=0; is<STATE_NAMES.length; is++) {
- int bucket = is+imem+iscreen;
+ int bucket = is+(STATE_COUNT*(imem+iscreen));
long time = proc.mDurations[bucket];
String running = "";
if (proc.mCurState == bucket) {
@@ -220,7 +467,7 @@
running = " (running)";
}
if (time != 0) {
- pw.print(" ");
+ pw.print(" ");
printScreenLabel(pw, printedScreen != iscreen
? iscreen : STATE_NOTHING);
printedScreen = iscreen;
@@ -234,7 +481,7 @@
}
}
if (totalTime != 0) {
- pw.print(" ");
+ pw.print(" ");
printScreenLabel(pw, STATE_NOTHING);
printMemLabel(pw, STATE_NOTHING);
pw.print("TOTAL : ");
@@ -243,53 +490,46 @@
}
}
for (int isvc=0; isvc<state.mServices.size(); isvc++) {
- pw.print(" Service ");
+ pw.print(" Service ");
pw.print(state.mServices.keyAt(isvc));
pw.println(":");
ServiceState svc = state.mServices.valueAt(isvc);
- long time = svc.mStartedDuration;
- if (svc.mStartedTime >= 0) {
- time += now - svc.mStartedTime;
+ if (svc.mStartedCount != 0) {
+ pw.print(" Started op count "); pw.print(svc.mStartedCount);
+ pw.println(":");
+ dumpSingleTime(pw, " ", svc.mStartedDurations, svc.mStartedState,
+ svc.mStartedStartTime, now);
}
- if (time != 0) {
- pw.print(" Started: ");
- TimeUtils.formatDuration(time, pw); pw.println();
+ if (svc.mBoundCount != 0) {
+ pw.print(" Bound op count "); pw.print(svc.mBoundCount);
+ pw.println(":");
+ dumpSingleTime(pw, " ", svc.mBoundDurations, svc.mBoundState,
+ svc.mBoundStartTime, now);
+ }
+ if (svc.mExecCount != 0) {
+ pw.print(" Executing op count "); pw.print(svc.mExecCount);
+ pw.println(":");
+ dumpSingleTime(pw, " ", svc.mExecDurations, svc.mExecState,
+ svc.mExecStartTime, now);
}
}
}
}
+ dumpFilteredProcesses(pw, "Processes running while critical mem:", " ",
+ new int[] {ADJ_SCREEN_OFF, ADJ_SCREEN_ON},
+ new int[] {ADJ_MEM_FACTOR_CRITICAL},
+ new int[] {STATE_TOP, STATE_FOREGROUND, STATE_VISIBLE, STATE_PERCEPTIBLE,
+ STATE_BACKUP, STATE_SERVICE, STATE_HOME, STATE_PREVIOUS},
+ now);
+ dumpFilteredProcesses(pw, "Processes running while low mem:", " ",
+ new int[] {ADJ_SCREEN_OFF, ADJ_SCREEN_ON},
+ new int[] {ADJ_MEM_FACTOR_LOW},
+ new int[] {STATE_TOP, STATE_FOREGROUND, STATE_VISIBLE, STATE_PERCEPTIBLE,
+ STATE_BACKUP, STATE_SERVICE, STATE_HOME, STATE_PREVIOUS},
+ now);
pw.println();
pw.println("Run time Stats:");
- long totalTime = 0;
- int printedScreen = -1;
- for (int iscreen=0; iscreen<STATE_COUNT; iscreen+=STATE_SCREEN_ON_MOD) {
- int printedMem = -1;
- for (int imem=0; imem<STATE_MEM_FACTOR_COUNT; imem+=STATE_MEM_FACTOR_MOD) {
- int bucket = imem+iscreen;
- long time = mState.mMemFactorDurations[bucket/STATE_MEM_FACTOR_MOD];
- String running = "";
- if (mState.mMemFactor == bucket) {
- time += now - mState.mStartTime;
- running = " (running)";
- }
- if (time != 0) {
- pw.print(" ");
- printScreenLabel(pw, printedScreen != iscreen
- ? iscreen : STATE_NOTHING);
- printedScreen = iscreen;
- printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING);
- printedMem = imem;
- TimeUtils.formatDuration(time, pw); pw.println(running);
- totalTime += time;
- }
- }
- }
- if (totalTime != 0) {
- pw.print(" ");
- printScreenLabel(pw, STATE_NOTHING);
- pw.print("TOTAL: ");
- TimeUtils.formatDuration(totalTime, pw);
- pw.println();
- }
+ dumpSingleTime(pw, " ", mState.mMemFactorDurations, mState.mMemFactor,
+ mState.mStartTime, now);
}
}
diff --git a/services/java/com/android/server/am/ServiceRecord.java b/services/java/com/android/server/am/ServiceRecord.java
index 45e248b..5000940 100644
--- a/services/java/com/android/server/am/ServiceRecord.java
+++ b/services/java/com/android/server/am/ServiceRecord.java
@@ -73,6 +73,7 @@
final String dataDir; // where activity data should go
final boolean exported; // from ServiceInfo.exported
final Runnable restarter; // used to schedule retries of starting the service
+ final ProcessTracker.ServiceState tracker; // tracking service execution, may be null
final long createTime; // when this service was created
final ArrayMap<Intent.FilterComparison, IntentBindRecord> bindings
= new ArrayMap<Intent.FilterComparison, IntentBindRecord>();
@@ -281,7 +282,8 @@
ServiceRecord(ActivityManagerService ams,
BatteryStatsImpl.Uid.Pkg.Serv servStats, ComponentName name,
- Intent.FilterComparison intent, ServiceInfo sInfo, Runnable restarter) {
+ Intent.FilterComparison intent, ServiceInfo sInfo, Runnable restarter,
+ ProcessTracker.ServiceState tracker) {
this.ams = ams;
this.stats = servStats;
this.name = name;
@@ -297,6 +299,7 @@
dataDir = sInfo.applicationInfo.dataDir;
exported = sInfo.exported;
this.restarter = restarter;
+ this.tracker = tracker;
createTime = SystemClock.elapsedRealtime();
lastActivity = SystemClock.uptimeMillis();
userId = UserHandle.getUserId(appInfo.uid);
@@ -319,6 +322,20 @@
return a;
}
+ public boolean hasAutoCreateConnections() {
+ // XXX should probably keep a count of the number of auto-create
+ // connections directly in the service.
+ for (int conni=connections.size()-1; conni>=0; conni--) {
+ ArrayList<ConnectionRecord> cr = connections.valueAt(conni);
+ for (int i=0; i<cr.size(); i++) {
+ if ((cr.get(i).flags&Context.BIND_AUTO_CREATE) != 0) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
public void resetRestartCounter() {
restartCount = 0;
restartDelay = 0;
diff --git a/services/java/com/android/server/display/PersistentDataStore.java b/services/java/com/android/server/display/PersistentDataStore.java
index d5d7132..67b3695 100644
--- a/services/java/com/android/server/display/PersistentDataStore.java
+++ b/services/java/com/android/server/display/PersistentDataStore.java
@@ -106,7 +106,7 @@
}
if (!Objects.equal(display.getDeviceAlias(), alias)) {
return new WifiDisplay(display.getDeviceAddress(), display.getDeviceName(),
- alias, display.canConnect());
+ alias, display.isAvailable(), display.canConnect(), display.isRemembered());
}
}
return display;
@@ -260,7 +260,8 @@
}
mRememberedWifiDisplays.add(
- new WifiDisplay(deviceAddress, deviceName, deviceAlias));
+ new WifiDisplay(deviceAddress, deviceName, deviceAlias,
+ false, false, false));
}
}
}
diff --git a/services/java/com/android/server/display/WifiDisplayAdapter.java b/services/java/com/android/server/display/WifiDisplayAdapter.java
index b655b3a..4c80cf5 100644
--- a/services/java/com/android/server/display/WifiDisplayAdapter.java
+++ b/services/java/com/android/server/display/WifiDisplayAdapter.java
@@ -45,6 +45,8 @@
import java.io.PrintWriter;
import java.util.Arrays;
+import java.util.List;
+import java.util.ArrayList;
import libcore.util.Objects;
@@ -88,6 +90,7 @@
private int mScanState;
private int mActiveDisplayState;
private WifiDisplay mActiveDisplay;
+ private WifiDisplay[] mDisplays = WifiDisplay.EMPTY_ARRAY;
private WifiDisplay[] mAvailableDisplays = WifiDisplay.EMPTY_ARRAY;
private WifiDisplay[] mRememberedDisplays = WifiDisplay.EMPTY_ARRAY;
@@ -116,6 +119,7 @@
pw.println("mScanState=" + mScanState);
pw.println("mActiveDisplayState=" + mActiveDisplayState);
pw.println("mActiveDisplay=" + mActiveDisplay);
+ pw.println("mDisplays=" + Arrays.toString(mDisplays));
pw.println("mAvailableDisplays=" + Arrays.toString(mAvailableDisplays));
pw.println("mRememberedDisplays=" + Arrays.toString(mRememberedDisplays));
pw.println("mPendingStatusChangeBroadcast=" + mPendingStatusChangeBroadcast);
@@ -229,7 +233,8 @@
WifiDisplay display = mPersistentDataStore.getRememberedWifiDisplay(address);
if (display != null && !Objects.equal(display.getDeviceAlias(), alias)) {
- display = new WifiDisplay(address, display.getDeviceName(), alias);
+ display = new WifiDisplay(address, display.getDeviceName(), alias,
+ false, false, false);
if (mPersistentDataStore.rememberWifiDisplay(display)) {
mPersistentDataStore.saveIfNeeded();
updateRememberedDisplaysLocked();
@@ -262,7 +267,7 @@
if (mCurrentStatus == null) {
mCurrentStatus = new WifiDisplayStatus(
mFeatureState, mScanState, mActiveDisplayState,
- mActiveDisplay, mAvailableDisplays, mRememberedDisplays);
+ mActiveDisplay, mDisplays);
}
if (DEBUG) {
@@ -271,10 +276,36 @@
return mCurrentStatus;
}
+ private void updateDisplaysLocked() {
+ List<WifiDisplay> displays = new ArrayList<WifiDisplay>(
+ mAvailableDisplays.length + mRememberedDisplays.length);
+ boolean[] remembered = new boolean[mAvailableDisplays.length];
+ for (WifiDisplay d : mRememberedDisplays) {
+ boolean available = false;
+ for (int i = 0; i < mAvailableDisplays.length; i++) {
+ if (d.equals(mAvailableDisplays[i])) {
+ remembered[i] = available = true;
+ break;
+ }
+ }
+ if (!available) {
+ displays.add(new WifiDisplay(d.getDeviceAddress(), d.getDeviceName(),
+ d.getDeviceAlias(), false, false, true));
+ }
+ }
+ for (int i = 0; i < mAvailableDisplays.length; i++) {
+ WifiDisplay d = mAvailableDisplays[i];
+ displays.add(new WifiDisplay(d.getDeviceAddress(), d.getDeviceName(),
+ d.getDeviceAlias(), true, d.canConnect(), remembered[i]));
+ }
+ mDisplays = displays.toArray(WifiDisplay.EMPTY_ARRAY);
+ }
+
private void updateRememberedDisplaysLocked() {
mRememberedDisplays = mPersistentDataStore.getRememberedWifiDisplays();
mActiveDisplay = mPersistentDataStore.applyWifiDisplayAlias(mActiveDisplay);
mAvailableDisplays = mPersistentDataStore.applyWifiDisplayAliases(mAvailableDisplays);
+ updateDisplaysLocked();
}
private void fixRememberedDisplayNamesFromAvailableDisplaysLocked() {
@@ -487,11 +518,18 @@
availableDisplays = mPersistentDataStore.applyWifiDisplayAliases(
availableDisplays);
- if (mScanState != WifiDisplayStatus.SCAN_STATE_NOT_SCANNING
- || !Arrays.equals(mAvailableDisplays, availableDisplays)) {
+ // check if any of the available displays changed canConnect status
+ boolean changed = !Arrays.equals(mAvailableDisplays, availableDisplays);
+ for (int i = 0; !changed && i<availableDisplays.length; i++) {
+ changed = availableDisplays[i].canConnect()
+ != mAvailableDisplays[i].canConnect();
+ }
+
+ if (mScanState != WifiDisplayStatus.SCAN_STATE_NOT_SCANNING || changed) {
mScanState = WifiDisplayStatus.SCAN_STATE_NOT_SCANNING;
mAvailableDisplays = availableDisplays;
fixRememberedDisplayNamesFromAvailableDisplaysLocked();
+ updateDisplaysLocked();
scheduleStatusChangedBroadcastLocked();
}
}
diff --git a/services/java/com/android/server/display/WifiDisplayController.java b/services/java/com/android/server/display/WifiDisplayController.java
index e595df4..f89917c 100644
--- a/services/java/com/android/server/display/WifiDisplayController.java
+++ b/services/java/com/android/server/display/WifiDisplayController.java
@@ -898,7 +898,7 @@
private static WifiDisplay createWifiDisplay(WifiP2pDevice device) {
return new WifiDisplay(device.deviceAddress, device.deviceName, null,
- device.wfdInfo.isSessionAvailable());
+ true, device.wfdInfo.isSessionAvailable(), false);
}
private final BroadcastReceiver mWifiP2pReceiver = new BroadcastReceiver() {
diff --git a/services/java/com/android/server/location/GpsLocationProvider.java b/services/java/com/android/server/location/GpsLocationProvider.java
index 8c88cab..4791ec0 100644
--- a/services/java/com/android/server/location/GpsLocationProvider.java
+++ b/services/java/com/android/server/location/GpsLocationProvider.java
@@ -41,6 +41,7 @@
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.AsyncTask;
+import android.os.BatteryStats;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
@@ -456,7 +457,8 @@
Context.APP_OPS_SERVICE));
// Battery statistics service to be notified when GPS turns on or off
- mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService("batteryinfo"));
+ mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService(
+ BatteryStats.SERVICE_NAME));
mProperties = new Properties();
try {
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 9f3a0d3..1040ab1 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -54,6 +54,7 @@
import android.net.wifi.WpsResult.Status;
import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pService;
+import android.os.BatteryStats;
import android.os.Binder;
import android.os.IBinder;
import android.os.INetworkManagementService;
@@ -542,7 +543,8 @@
mInterfaceName = wlanInterface;
mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0, NETWORKTYPE, "");
- mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService("batteryinfo"));
+ mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService(
+ BatteryStats.SERVICE_NAME));
IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
mNwService = INetworkManagementService.Stub.asInterface(b);