Merge "Hide CarrierPrivilege APIs in TelMgr." into lmp-dev
diff --git a/api/current.txt b/api/current.txt
index 3ab6d8a..147258c 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -14832,7 +14832,6 @@
}
public static final class MediaDrm.MediaDrmStateException extends java.lang.IllegalStateException {
- ctor public MediaDrm.MediaDrmStateException(int, java.lang.String);
method public java.lang.String getDiagnosticInfo();
}
@@ -28046,328 +28045,16 @@
package android.telecom {
- public final class AudioState implements android.os.Parcelable {
- ctor public AudioState(boolean, int, int);
- ctor public AudioState(android.telecom.AudioState);
- method public int describeContents();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
- field public static final int ROUTE_BLUETOOTH = 2; // 0x2
- field public static final int ROUTE_EARPIECE = 1; // 0x1
- field public static final int ROUTE_SPEAKER = 8; // 0x8
- field public static final int ROUTE_WIRED_HEADSET = 4; // 0x4
- field public static final int ROUTE_WIRED_OR_EARPIECE = 5; // 0x5
- field public final boolean isMuted;
- field public final int route;
- field public final int supportedRouteMask;
- }
-
- public abstract class Conference {
- ctor public Conference(android.telecom.PhoneAccountHandle);
- method public final boolean addConnection(android.telecom.Connection);
- method public final void destroy();
- method public final android.telecom.AudioState getAudioState();
- method public final int getCapabilities();
- method public final java.util.List<android.telecom.Connection> getConnections();
- method public final android.telecom.PhoneAccountHandle getPhoneAccountHandle();
- method public final int getState();
- method public void onAudioStateChanged(android.telecom.AudioState);
- method public void onDisconnect();
- method public void onHold();
- method public void onMerge();
- method public void onPlayDtmfTone(char);
- method public void onSeparate(android.telecom.Connection);
- method public void onStopDtmfTone();
- method public void onSwap();
- method public void onUnhold();
- method public final void removeConnection(android.telecom.Connection);
- method public final void setActive();
- method public final void setCapabilities(int);
- method public final void setDisconnected(android.telecom.DisconnectCause);
- method public final void setOnHold();
- }
-
- public abstract class Connection {
- ctor public Connection();
- method public static android.telecom.Connection createCanceledConnection();
- method public static android.telecom.Connection createFailedConnection(android.telecom.DisconnectCause);
- method public final void destroy();
- method public final android.net.Uri getAddress();
- method public final int getAddressPresentation();
- method public final boolean getAudioModeIsVoip();
- method public final android.telecom.AudioState getAudioState();
- method public final int getCallCapabilities();
- method public final java.lang.String getCallerDisplayName();
- method public final int getCallerDisplayNamePresentation();
- method public final android.telecom.Conference getConference();
- method public final java.util.List<android.telecom.Connection> getConferenceableConnections();
- method public final android.telecom.DisconnectCause getDisconnectCause();
- method public final int getState();
- method public final android.telecom.StatusHints getStatusHints();
- method public final boolean isRingbackRequested();
- method public void onAbort();
- method public void onAnswer();
- method public void onAudioStateChanged(android.telecom.AudioState);
- method public void onConferenceWith(android.telecom.Connection);
- method public void onDisconnect();
- method public void onHold();
- method public void onPlayDtmfTone(char);
- method public void onPostDialContinue(boolean);
- method public void onReject();
- method public void onSeparate();
- method public void onStateChanged(int);
- method public void onStopDtmfTone();
- method public void onUnhold();
- method public final void setActive();
- method public final void setAddress(android.net.Uri, int);
- method public final void setAudioModeIsVoip(boolean);
- method public final void setCallCapabilities(int);
- method public final void setCallerDisplayName(java.lang.String, int);
- method public final void setConferenceableConnections(java.util.List<android.telecom.Connection>);
- method public final void setConnectionService(android.telecom.ConnectionService);
- method public final void setDialing();
- method public final void setDisconnected(android.telecom.DisconnectCause);
- method public final void setInitialized();
- method public final void setInitializing();
- method public final void setOnHold();
- method public final void setPostDialWait(java.lang.String);
- method public final void setRingbackRequested(boolean);
- method public final void setRinging();
- method public final void setStatusHints(android.telecom.StatusHints);
- method public static java.lang.String stateToString(int);
- field public static final int STATE_ACTIVE = 4; // 0x4
- field public static final int STATE_DIALING = 3; // 0x3
- field public static final int STATE_DISCONNECTED = 6; // 0x6
- field public static final int STATE_HOLDING = 5; // 0x5
- field public static final int STATE_INITIALIZING = 0; // 0x0
- field public static final int STATE_NEW = 1; // 0x1
- field public static final int STATE_RINGING = 2; // 0x2
- }
-
- public final class ConnectionRequest implements android.os.Parcelable {
- ctor public ConnectionRequest(android.telecom.PhoneAccountHandle, android.net.Uri, android.os.Bundle);
- method public int describeContents();
- method public android.telecom.PhoneAccountHandle getAccountHandle();
- method public android.net.Uri getAddress();
- method public android.os.Bundle getExtras();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
- }
-
- public abstract class ConnectionService extends android.app.Service {
- ctor public ConnectionService();
- method public final void addConference(android.telecom.Conference);
- method public final void conferenceRemoteConnections(android.telecom.RemoteConnection, android.telecom.RemoteConnection);
- method public final android.telecom.RemoteConnection createRemoteIncomingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest);
- method public final android.telecom.RemoteConnection createRemoteOutgoingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest);
- method public final java.util.Collection<android.telecom.Connection> getAllConnections();
- method public final android.os.IBinder onBind(android.content.Intent);
- method public void onConference(android.telecom.Connection, android.telecom.Connection);
- method public android.telecom.Connection onCreateIncomingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest);
- method public android.telecom.Connection onCreateOutgoingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest);
- method public void onRemoteConferenceAdded(android.telecom.RemoteConference);
- field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.ConnectionService";
- }
-
- public final class DisconnectCause implements android.os.Parcelable {
- ctor public DisconnectCause(int);
- ctor public DisconnectCause(int, java.lang.String);
- ctor public DisconnectCause(int, java.lang.CharSequence, java.lang.CharSequence, java.lang.String);
- ctor public DisconnectCause(int, java.lang.CharSequence, java.lang.CharSequence, java.lang.String, int);
- method public int describeContents();
- method public int getCode();
- method public java.lang.CharSequence getDescription();
- method public java.lang.CharSequence getLabel();
- method public java.lang.String getReason();
- method public int getTone();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final int BUSY = 7; // 0x7
- field public static final int CANCELED = 4; // 0x4
- field public static final android.os.Parcelable.Creator CREATOR;
- field public static final int ERROR = 1; // 0x1
- field public static final int LOCAL = 2; // 0x2
- field public static final int MISSED = 5; // 0x5
- field public static final int OTHER = 9; // 0x9
- field public static final int REJECTED = 6; // 0x6
- field public static final int REMOTE = 3; // 0x3
- field public static final int RESTRICTED = 8; // 0x8
- field public static final int UNKNOWN = 0; // 0x0
- }
-
- public class GatewayInfo implements android.os.Parcelable {
- method public int describeContents();
- method public android.net.Uri getGatewayAddress();
- method public java.lang.String getGatewayProviderPackageName();
- method public android.net.Uri getOriginalAddress();
- method public boolean isEmpty();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
- }
-
- public class PhoneAccount implements android.os.Parcelable {
- method public static android.telecom.PhoneAccount.Builder builder(android.telecom.PhoneAccountHandle, java.lang.CharSequence);
- method public int describeContents();
- method public android.telecom.PhoneAccountHandle getAccountHandle();
- method public android.net.Uri getAddress();
- method public int getCapabilities();
- method public android.graphics.drawable.Drawable getIcon(android.content.Context);
- method public int getIconResId();
- method public java.lang.CharSequence getLabel();
- method public java.lang.CharSequence getShortDescription();
- method public android.net.Uri getSubscriptionAddress();
- method public java.util.List<java.lang.String> getSupportedUriSchemes();
- method public boolean hasCapabilities(int);
- method public boolean supportsUriScheme(java.lang.String);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final int CAPABILITY_CONNECTION_MANAGER = 1; // 0x1
- field public static final int CAPABILITY_PLACE_EMERGENCY_CALLS = 16; // 0x10
- field public static final int CAPABILITY_SIM_SUBSCRIPTION = 4; // 0x4
- field public static final android.os.Parcelable.Creator CREATOR;
- field public static final java.lang.String SCHEME_SIP = "sip";
- field public static final java.lang.String SCHEME_TEL = "tel";
- field public static final java.lang.String SCHEME_VOICEMAIL = "voicemail";
- }
-
- public static class PhoneAccount.Builder {
- ctor public PhoneAccount.Builder(android.telecom.PhoneAccountHandle, java.lang.CharSequence);
- ctor public PhoneAccount.Builder(android.telecom.PhoneAccount);
- method public android.telecom.PhoneAccount build();
- method public android.telecom.PhoneAccount.Builder setAddress(android.net.Uri);
- method public android.telecom.PhoneAccount.Builder setCapabilities(int);
- method public android.telecom.PhoneAccount.Builder setIconResId(int);
- method public android.telecom.PhoneAccount.Builder setShortDescription(java.lang.CharSequence);
- method public android.telecom.PhoneAccount.Builder setSubscriptionAddress(android.net.Uri);
- method public android.telecom.PhoneAccount.Builder setSupportedUriSchemes(java.util.List<java.lang.String>);
- }
-
- public class PhoneAccountHandle implements android.os.Parcelable {
- ctor public PhoneAccountHandle(android.content.ComponentName, java.lang.String);
- method public int describeContents();
- method public android.content.ComponentName getComponentName();
- method public java.lang.String getId();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
- }
-
- public final class PhoneCapabilities {
- method public static java.lang.String toString(int);
- field public static final int ADD_CALL = 16; // 0x10
- field public static final int ALL = 12543; // 0x30ff
- field public static final int DISCONNECT_FROM_CONFERENCE = 8192; // 0x2000
- field public static final int HOLD = 1; // 0x1
- field public static final int MANAGE_CONFERENCE = 128; // 0x80
- field public static final int MERGE_CONFERENCE = 4; // 0x4
- field public static final int MUTE = 64; // 0x40
- field public static final int RESPOND_VIA_TEXT = 32; // 0x20
- field public static final int SEPARATE_FROM_CONFERENCE = 4096; // 0x1000
- field public static final int SUPPORT_HOLD = 2; // 0x2
- field public static final int SWAP_CONFERENCE = 8; // 0x8
- }
-
- public final class RemoteConference {
- method public void disconnect();
- method public final int getCallCapabilities();
- method public final java.util.List<android.telecom.RemoteConnection> getConnections();
- method public android.telecom.DisconnectCause getDisconnectCause();
- method public final int getState();
- method public void hold();
- method public void playDtmfTone(char);
- method public final void registerCallback(android.telecom.RemoteConference.Callback);
- method public void separate(android.telecom.RemoteConnection);
- method public void setAudioState(android.telecom.AudioState);
- method public void stopDtmfTone();
- method public void unhold();
- method public final void unregisterCallback(android.telecom.RemoteConference.Callback);
- }
-
- public static abstract class RemoteConference.Callback {
- ctor public RemoteConference.Callback();
- method public void onCapabilitiesChanged(android.telecom.RemoteConference, int);
- method public void onConnectionAdded(android.telecom.RemoteConference, android.telecom.RemoteConnection);
- method public void onConnectionRemoved(android.telecom.RemoteConference, android.telecom.RemoteConnection);
- method public void onDestroyed(android.telecom.RemoteConference);
- method public void onDisconnected(android.telecom.RemoteConference, android.telecom.DisconnectCause);
- method public void onStateChanged(android.telecom.RemoteConference, int, int);
- }
-
- public final class RemoteConnection {
- method public void abort();
- method public void answer();
- method public void disconnect();
- method public android.net.Uri getAddress();
- method public int getAddressPresentation();
- method public int getCallCapabilities();
- method public java.lang.CharSequence getCallerDisplayName();
- method public int getCallerDisplayNamePresentation();
- method public android.telecom.RemoteConference getConference();
- method public java.util.List<android.telecom.RemoteConnection> getConferenceableConnections();
- method public android.telecom.DisconnectCause getDisconnectCause();
- method public int getState();
- method public android.telecom.StatusHints getStatusHints();
- method public void hold();
- method public boolean isRingbackRequested();
- method public boolean isVoipAudioMode();
- method public void playDtmfTone(char);
- method public void postDialContinue(boolean);
- method public void registerCallback(android.telecom.RemoteConnection.Callback);
- method public void reject();
- method public void setAudioState(android.telecom.AudioState);
- method public void stopDtmfTone();
- method public void unhold();
- method public void unregisterCallback(android.telecom.RemoteConnection.Callback);
- }
-
- public static abstract class RemoteConnection.Callback {
- ctor public RemoteConnection.Callback();
- method public void onAddressChanged(android.telecom.RemoteConnection, android.net.Uri, int);
- method public void onCallCapabilitiesChanged(android.telecom.RemoteConnection, int);
- method public void onCallerDisplayNameChanged(android.telecom.RemoteConnection, java.lang.String, int);
- method public void onConferenceChanged(android.telecom.RemoteConnection, android.telecom.RemoteConference);
- method public void onConferenceableConnectionsChanged(android.telecom.RemoteConnection, java.util.List<android.telecom.RemoteConnection>);
- method public void onDestroyed(android.telecom.RemoteConnection);
- method public void onDisconnected(android.telecom.RemoteConnection, android.telecom.DisconnectCause);
- method public void onPostDialWait(android.telecom.RemoteConnection, java.lang.String);
- method public void onRingbackRequested(android.telecom.RemoteConnection, boolean);
- method public void onStateChanged(android.telecom.RemoteConnection, int);
- method public void onStatusHintsChanged(android.telecom.RemoteConnection, android.telecom.StatusHints);
- method public void onVoipAudioChanged(android.telecom.RemoteConnection, boolean);
- }
-
- public final class StatusHints implements android.os.Parcelable {
- ctor public StatusHints(android.content.ComponentName, java.lang.CharSequence, int, android.os.Bundle);
- method public int describeContents();
- method public android.os.Bundle getExtras();
- method public android.graphics.drawable.Drawable getIcon(android.content.Context);
- method public int getIconResId();
- method public java.lang.CharSequence getLabel();
- method public android.content.ComponentName getPackageName();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator CREATOR;
- }
-
public class TelecomManager {
- method public void addNewIncomingCall(android.telecom.PhoneAccountHandle, android.os.Bundle);
method public void cancelMissedCallsNotification();
- method public void clearAccounts();
- method public android.telecom.PhoneAccountHandle getConnectionManager();
- method public android.telecom.PhoneAccount getPhoneAccount(android.telecom.PhoneAccountHandle);
- method public java.util.List<android.telecom.PhoneAccountHandle> getPhoneAccountsForPackage();
method public boolean handleMmi(java.lang.String);
- method public boolean hasMultipleCallCapableAccounts();
method public boolean isInCall();
- method public void registerPhoneAccount(android.telecom.PhoneAccount);
method public void showInCallScreen(boolean);
- method public void unregisterPhoneAccount(android.telecom.PhoneAccountHandle);
- field public static final java.lang.String ACTION_CHANGE_PHONE_ACCOUNTS = "android.telecom.action.CHANGE_PHONE_ACCOUNTS";
- field public static final java.lang.String ACTION_CONNECTION_SERVICE_CONFIGURE = "android.telecom.action.CONNECTION_SERVICE_CONFIGURE";
field public static final java.lang.String ACTION_SHOW_CALL_SETTINGS = "android.telecom.action.SHOW_CALL_SETTINGS";
field public static final char DTMF_CHARACTER_PAUSE = 44; // 0x002c ','
field public static final char DTMF_CHARACTER_WAIT = 59; // 0x003b ';'
- field public static final java.lang.String EXTRA_CALL_BACK_NUMBER = "android.telecom.extra.CALL_BACK_NUMBER";
field public static final java.lang.String EXTRA_CALL_DISCONNECT_CAUSE = "android.telecom.extra.CALL_DISCONNECT_CAUSE";
field public static final java.lang.String EXTRA_CALL_DISCONNECT_MESSAGE = "android.telecom.extra.CALL_DISCONNECT_MESSAGE";
- field public static final java.lang.String EXTRA_CONNECTION_SERVICE = "android.telecom.extra.CONNECTION_SERVICE";
- field public static final java.lang.String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telecom.extra.PHONE_ACCOUNT_HANDLE";
field public static final java.lang.String EXTRA_START_CALL_WITH_SPEAKERPHONE = "android.telecom.extra.START_CALL_WITH_SPEAKERPHONE";
field public static final java.lang.String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS";
field public static final java.lang.String GATEWAY_PROVIDER_PACKAGE = "android.telecom.extra.GATEWAY_PROVIDER_PACKAGE";
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 85d4839..005baed 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -2303,19 +2303,27 @@
* call this method.
*
* @param packageName The name of the package to be stopped.
+ * @param userId The user for which the running package is to be stopped.
*
* @hide This is not available to third party applications due to
* it allowing them to break other applications by stopping their
* services, removing their alarms, etc.
*/
- public void forceStopPackage(String packageName) {
+ public void forceStopPackageAsUser(String packageName, int userId) {
try {
- ActivityManagerNative.getDefault().forceStopPackage(packageName,
- UserHandle.myUserId());
+ ActivityManagerNative.getDefault().forceStopPackage(packageName, userId);
} catch (RemoteException e) {
}
}
-
+
+ /**
+ * @see #forceStopPackageAsUser(String, int)
+ * @hide
+ */
+ public void forceStopPackage(String packageName) {
+ forceStopPackageAsUser(packageName, UserHandle.myUserId());
+ }
+
/**
* Get the device configuration attributes.
*/
diff --git a/core/java/android/app/ActivityTransitionState.java b/core/java/android/app/ActivityTransitionState.java
index bc2e6ca..555d20b 100644
--- a/core/java/android/app/ActivityTransitionState.java
+++ b/core/java/android/app/ActivityTransitionState.java
@@ -67,6 +67,12 @@
private ExitTransitionCoordinator mCalledExitCoordinator;
/**
+ * The ExitTransitionCoordinator used to return to a previous Activity when called with
+ * {@link android.app.Activity#finishAfterTransition()}.
+ */
+ private ExitTransitionCoordinator mReturnExitCoordinator;
+
+ /**
* We must be able to cancel entering transitions to stop changing the Window to
* opaque when we exit before making the Window opaque.
*/
@@ -218,6 +224,10 @@
mEnterTransitionCoordinator.stop();
mEnterTransitionCoordinator = null;
}
+ if (mReturnExitCoordinator != null) {
+ mReturnExitCoordinator.stop();
+ mReturnExitCoordinator = null;
+ }
}
public void onResume() {
@@ -260,12 +270,12 @@
}
}
- ExitTransitionCoordinator exitCoordinator =
+ mReturnExitCoordinator =
new ExitTransitionCoordinator(activity, mEnteringNames, null, null, true);
if (enterViewsTransition != null && decor != null) {
enterViewsTransition.resume(decor);
}
- exitCoordinator.startExit(activity.mResultCode, activity.mResultData);
+ mReturnExitCoordinator.startExit(activity.mResultCode, activity.mResultData);
}
return true;
}
diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java
index 216d6ba..add67f2 100644
--- a/core/java/android/app/EnterTransitionCoordinator.java
+++ b/core/java/android/app/EnterTransitionCoordinator.java
@@ -30,6 +30,7 @@
import android.view.ViewGroup;
import android.view.ViewGroupOverlay;
import android.view.ViewTreeObserver;
+import android.view.Window;
import java.util.ArrayList;
@@ -265,10 +266,14 @@
}
protected void prepareEnter() {
+ ViewGroup decorView = getDecor();
+ if (mActivity == null || decorView == null) {
+ return;
+ }
mActivity.overridePendingTransition(0, 0);
if (!mIsReturning) {
mWasOpaque = mActivity.convertToTranslucent(null, null);
- Drawable background = getDecor().getBackground();
+ Drawable background = decorView.getBackground();
if (background != null) {
getWindow().setBackgroundDrawable(null);
background = background.mutate();
@@ -282,18 +287,26 @@
@Override
protected Transition getViewsTransition() {
+ Window window = getWindow();
+ if (window == null) {
+ return null;
+ }
if (mIsReturning) {
- return getWindow().getReenterTransition();
+ return window.getReenterTransition();
} else {
- return getWindow().getEnterTransition();
+ return window.getEnterTransition();
}
}
protected Transition getSharedElementTransition() {
+ Window window = getWindow();
+ if (window == null) {
+ return null;
+ }
if (mIsReturning) {
- return getWindow().getSharedElementReenterTransition();
+ return window.getSharedElementReenterTransition();
} else {
- return getWindow().getSharedElementEnterTransition();
+ return window.getSharedElementEnterTransition();
}
}
@@ -518,15 +531,29 @@
}
public void stop() {
- makeOpaque();
- mIsCanceled = true;
- mResultReceiver = null;
+ // Restore the background to its previous state since the
+ // Activity is stopping.
if (mBackgroundAnimator != null) {
mBackgroundAnimator.end();
mBackgroundAnimator = null;
+ } else if (mWasOpaque) {
+ ViewGroup decorView = getDecor();
+ if (decorView != null) {
+ Drawable drawable = decorView.getBackground();
+ if (drawable != null) {
+ drawable.setAlpha(1);
+ }
+ }
}
+ makeOpaque();
+ mIsCanceled = true;
+ mResultReceiver = null;
mActivity = null;
moveSharedElementsFromOverlay();
+ if (mTransitioningViews != null) {
+ showViews(mTransitioningViews, true);
+ }
+ showViews(mSharedElements, true);
clearState();
}
diff --git a/core/java/android/app/ExitTransitionCoordinator.java b/core/java/android/app/ExitTransitionCoordinator.java
index d4d3eda..dd3df47 100644
--- a/core/java/android/app/ExitTransitionCoordinator.java
+++ b/core/java/android/app/ExitTransitionCoordinator.java
@@ -255,6 +255,16 @@
}
}
+ public void stop() {
+ if (mIsReturning && mActivity != null) {
+ // Override the previous ActivityOptions. We don't want the
+ // activity to have options since we're essentially canceling the
+ // transition and finishing right now.
+ mActivity.convertToTranslucent(null, null);
+ finish();
+ }
+ }
+
private void startExitTransition() {
Transition transition = getExitTransition();
ViewGroup decorView = getDecor();
@@ -425,13 +435,14 @@
private void finish() {
stopCancel();
- mActivity.mActivityTransitionState.clear();
+ if (mActivity != null) {
+ mActivity.mActivityTransitionState.clear();
+ mActivity.finish();
+ mActivity.overridePendingTransition(0, 0);
+ mActivity = null;
+ }
// Clear the state so that we can't hold any references accidentally and leak memory.
- mHandler.removeMessages(MSG_CANCEL);
mHandler = null;
- mActivity.finish();
- mActivity.overridePendingTransition(0, 0);
- mActivity = null;
mSharedElementBundle = null;
if (mBackgroundAnimator != null) {
mBackgroundAnimator.cancel();
diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java
index 2276229..c203a8e 100644
--- a/core/java/android/bluetooth/BluetoothGatt.java
+++ b/core/java/android/bluetooth/BluetoothGatt.java
@@ -51,7 +51,6 @@
private int mConnState;
private final Object mStateLock = new Object();
private Boolean mDeviceBusy = false;
- private Boolean mIsCongested = false;
private int mTransport;
private static final int CONN_STATE_IDLE = 0;
@@ -607,21 +606,6 @@
Log.w(TAG, "Unhandled exception in callback", ex);
}
}
-
- /**
- * Callback indicating the remote device connection is congested.
- * @hide
- */
- public void onConnectionCongested(String address, boolean congested) {
- if (DBG) Log.d(TAG, "onConnectionCongested() - Device=" + address
- + " congested=" + congested);
- if (!address.equals(mDevice.getAddress())) return;
- try {
- mIsCongested = congested;
- } catch (Exception ex) {
- Log.w(TAG, "Unhandled exception in callback", ex);
- }
- }
};
/*package*/ BluetoothGatt(Context context, IBluetoothGatt iGatt, BluetoothDevice device,
diff --git a/core/java/android/bluetooth/BluetoothGattCallbackWrapper.java b/core/java/android/bluetooth/BluetoothGattCallbackWrapper.java
index da992f5..cdb24f4 100644
--- a/core/java/android/bluetooth/BluetoothGattCallbackWrapper.java
+++ b/core/java/android/bluetooth/BluetoothGattCallbackWrapper.java
@@ -120,10 +120,6 @@
}
@Override
- public void onConnectionCongested(String address, boolean congested) throws RemoteException {
- }
-
- @Override
public void onFoundOrLost(boolean onFound, ScanResult scanResult) throws RemoteException {
}
diff --git a/core/java/android/bluetooth/BluetoothGattServer.java b/core/java/android/bluetooth/BluetoothGattServer.java
index a7f117b..e94a8ce 100644
--- a/core/java/android/bluetooth/BluetoothGattServer.java
+++ b/core/java/android/bluetooth/BluetoothGattServer.java
@@ -48,7 +48,6 @@
private BluetoothAdapter mAdapter;
private IBluetoothGatt mService;
private BluetoothGattServerCallback mCallback;
- private Boolean mIsCongested = false;
private Object mServerIfLock = new Object();
private int mServerIf;
@@ -285,24 +284,6 @@
Log.w(TAG, "Unhandled exception: " + ex);
}
}
-
- /**
- * Callback indicating the remote device connection is congested.
- * @hide
- */
- public void onConnectionCongested(String address, boolean congested) {
- if (DBG) Log.d(TAG, "onConnectionCongested() - Device=" + address
- + " congested=" + congested);
-
- BluetoothDevice device = mAdapter.getRemoteDevice(address);
- if (device == null) return;
-
- try {
- mIsCongested = congested;
- } catch (Exception ex) {
- Log.w(TAG, "Unhandled exception in callback", ex);
- }
- }
};
/**
diff --git a/core/java/android/bluetooth/IBluetoothGattCallback.aidl b/core/java/android/bluetooth/IBluetoothGattCallback.aidl
index 00b6b1b..91e62ea 100644
--- a/core/java/android/bluetooth/IBluetoothGattCallback.aidl
+++ b/core/java/android/bluetooth/IBluetoothGattCallback.aidl
@@ -68,6 +68,5 @@
void onMultiAdvertiseCallback(in int status, boolean isStart,
in AdvertiseSettings advertiseSettings);
void onConfigureMTU(in String address, in int mtu, in int status);
- void onConnectionCongested(in String address, in boolean congested);
void onFoundOrLost(in boolean onFound, in ScanResult scanResult);
}
diff --git a/core/java/android/bluetooth/IBluetoothGattServerCallback.aidl b/core/java/android/bluetooth/IBluetoothGattServerCallback.aidl
index 6e31da1..5d4d6c6 100644
--- a/core/java/android/bluetooth/IBluetoothGattServerCallback.aidl
+++ b/core/java/android/bluetooth/IBluetoothGattServerCallback.aidl
@@ -59,5 +59,4 @@
in byte[] value);
void onExecuteWrite(in String address, in int transId, in boolean execWrite);
void onNotificationSent(in String address, in int status);
- void onConnectionCongested(in String address, in boolean congested);
}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index a19fbd3..77981f4 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -2723,6 +2723,9 @@
public static final String
ACTION_OPEN_DOCUMENT_TREE = "android.intent.action.OPEN_DOCUMENT_TREE";
+ /** {@hide} */
+ public static final String ACTION_MASTER_CLEAR = "android.intent.action.MASTER_CLEAR";
+
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
// Standard intent categories (see addCategory()).
@@ -3425,6 +3428,9 @@
public static final String EXTRA_TIME_PREF_24_HOUR_FORMAT =
"android.intent.extra.TIME_PREF_24_HOUR_FORMAT";
+ /** {@hide} */
+ public static final String EXTRA_REASON = "android.intent.extra.REASON";
+
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
// Intent flags (see mFlags variable).
@@ -7498,23 +7504,32 @@
final String action = getAction();
if (ACTION_CHOOSER.equals(action)) {
+ // Inspect contained intents to see if we need to migrate extras. We
+ // don't promote ClipData to the parent, since ChooserActivity will
+ // already start the picked item as the caller, and we can't combine
+ // the flags in a safe way.
+
+ boolean migrated = false;
try {
- // Inspect target intent to see if we need to migrate
- final Intent target = getParcelableExtra(EXTRA_INTENT);
- if (target != null && target.migrateExtraStreamToClipData()) {
- // Since we migrated in child, we need to promote ClipData
- // and flags to ourselves to grant.
- setClipData(target.getClipData());
- addFlags(target.getFlags() & (FLAG_GRANT_READ_URI_PERMISSION
- | FLAG_GRANT_WRITE_URI_PERMISSION
- | FLAG_GRANT_PERSISTABLE_URI_PERMISSION
- | FLAG_GRANT_PREFIX_URI_PERMISSION));
- return true;
- } else {
- return false;
+ final Intent intent = getParcelableExtra(EXTRA_INTENT);
+ if (intent != null) {
+ migrated |= intent.migrateExtraStreamToClipData();
}
} catch (ClassCastException e) {
}
+ try {
+ final Parcelable[] intents = getParcelableArrayExtra(EXTRA_INITIAL_INTENTS);
+ if (intents != null) {
+ for (int i = 0; i < intents.length; i++) {
+ final Intent intent = (Intent) intents[i];
+ if (intent != null) {
+ migrated |= intent.migrateExtraStreamToClipData();
+ }
+ }
+ }
+ } catch (ClassCastException e) {
+ }
+ return migrated;
} else if (ACTION_SEND.equals(action)) {
try {
diff --git a/core/java/android/hardware/camera2/legacy/BurstHolder.java b/core/java/android/hardware/camera2/legacy/BurstHolder.java
index c141c51..b9c89f8 100644
--- a/core/java/android/hardware/camera2/legacy/BurstHolder.java
+++ b/core/java/android/hardware/camera2/legacy/BurstHolder.java
@@ -22,6 +22,7 @@
import android.view.Surface;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
/**
@@ -38,14 +39,16 @@
*
* @param requestId id of the burst request.
* @param repeating true if this burst is repeating.
- * @param requests a {@link java.util.List} of {@link CaptureRequest}s in this burst.
+ * @param requests a {@link List} of {@link CaptureRequest}s in this burst.
+ * @param jpegSurfaceIds a {@link Collection} of IDs for the surfaces that have jpeg outputs.
*/
- public BurstHolder(int requestId, boolean repeating, List<CaptureRequest> requests) {
- mRequestBuilders = new ArrayList<RequestHolder.Builder>();
+ public BurstHolder(int requestId, boolean repeating, List<CaptureRequest> requests,
+ Collection<Long> jpegSurfaceIds) {
+ mRequestBuilders = new ArrayList<>();
int i = 0;
for (CaptureRequest r : requests) {
mRequestBuilders.add(new RequestHolder.Builder(requestId, /*subsequenceId*/i,
- /*request*/r, repeating));
+ /*request*/r, repeating, jpegSurfaceIds));
++i;
}
mRepeating = repeating;
diff --git a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java
index 4aa330d..e19f587 100644
--- a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java
+++ b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java
@@ -87,6 +87,15 @@
mSurfaceIdCounter = 0;
}
+ private static int translateErrorsFromCamera1(int errorCode) {
+ switch (errorCode) {
+ case CameraBinderDecorator.EACCES:
+ return CameraBinderDecorator.PERMISSION_DENIED;
+ default:
+ return errorCode;
+ }
+ }
+
/**
* Create a separate looper/thread for the camera to run on; open the camera.
*
@@ -130,8 +139,7 @@
// Save the looper so that we can terminate this thread
// after we are done with it.
mLooper = Looper.myLooper();
- mInitErrors = mCamera.cameraInitUnspecified(mCameraId);
-
+ mInitErrors = translateErrorsFromCamera1(mCamera.cameraInitUnspecified(mCameraId));
mStartDone.open();
Looper.loop(); // Blocks forever until #close is called.
}
diff --git a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
index a724b41..4587c6f 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
@@ -522,7 +522,7 @@
return surfaceIds;
}
- static boolean containsSurfaceId(Surface s, List<Long> ids) {
+ static boolean containsSurfaceId(Surface s, Collection<Long> ids) {
long id = getSurfaceId(s);
return ids.contains(id);
}
diff --git a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
index 907d2ae..618195a 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
@@ -34,7 +34,6 @@
import android.hardware.camera2.utils.ArrayUtils;
import android.hardware.camera2.utils.ListUtils;
import android.hardware.camera2.utils.ParamsUtils;
-import android.hardware.camera2.utils.SizeAreaComparator;
import android.util.Log;
import android.util.Range;
import android.util.Size;
@@ -88,6 +87,9 @@
static final int UNKNOWN_MODE = -1;
+ // Maximum difference between a preview size aspect ratio and a jpeg size aspect ratio
+ private static final float PREVIEW_ASPECT_RATIO_TOLERANCE = 0.01f;
+
/*
* Development hijinks: Lie about not supporting certain capabilities
*
@@ -103,6 +105,7 @@
static final boolean LIE_ABOUT_AWB_STATE = false;
static final boolean LIE_ABOUT_AWB = false;
+
/**
* Create characteristics for a legacy device by mapping the {@code parameters}
* and {@code info}
@@ -262,6 +265,64 @@
* remapping to public format constants.
*/
List<Camera.Size> previewSizes = p.getSupportedPreviewSizes();
+ List<Camera.Size> jpegSizes = p.getSupportedPictureSizes();
+ /*
+ * Work-around for b/17589233:
+ * - Some HALs's largest preview size aspect ratio does not match the largest JPEG size AR
+ * - This causes a large amount of problems with focus/metering because it's relative to
+ * preview, making the difference between the JPEG and preview viewport inaccessible
+ * - This boils down to metering or focusing areas being "arbitrarily" cropped
+ * in the capture result.
+ * - Work-around the HAL limitations by removing all of the largest preview sizes
+ * until we get one with the same aspect ratio as the jpeg size.
+ */
+ {
+ SizeAreaComparator areaComparator = new SizeAreaComparator();
+
+ // Sort preview to min->max
+ Collections.sort(previewSizes, areaComparator);
+
+ Camera.Size maxJpegSize = SizeAreaComparator.findLargestByArea(jpegSizes);
+ float jpegAspectRatio = maxJpegSize.width * 1.0f / maxJpegSize.height;
+
+ if (VERBOSE) {
+ Log.v(TAG, String.format("mapScalerStreamConfigs - largest JPEG area %dx%d, AR=%f",
+ maxJpegSize.width, maxJpegSize.height, jpegAspectRatio));
+ }
+
+ // Now remove preview sizes from the end (largest->smallest) until aspect ratio matches
+ while (!previewSizes.isEmpty()) {
+ int index = previewSizes.size() - 1; // max is always at the end
+ Camera.Size size = previewSizes.get(index);
+
+ float previewAspectRatio = size.width * 1.0f / size.height;
+
+ if (Math.abs(jpegAspectRatio - previewAspectRatio) >=
+ PREVIEW_ASPECT_RATIO_TOLERANCE) {
+ previewSizes.remove(index); // Assume removing from end is O(1)
+
+ if (VERBOSE) {
+ Log.v(TAG, String.format(
+ "mapScalerStreamConfigs - removed preview size %dx%d, AR=%f "
+ + "was not the same",
+ size.width, size.height, previewAspectRatio));
+ }
+ } else {
+ break;
+ }
+ }
+
+ if (previewSizes.isEmpty()) {
+ // Fall-back to the original faulty behavior, but at least work
+ Log.w(TAG, "mapScalerStreamConfigs - failed to find any preview size matching " +
+ "JPEG aspect ratio " + jpegAspectRatio);
+ previewSizes = p.getSupportedPreviewSizes();
+ }
+
+ // Sort again, this time in descending order max->min
+ Collections.sort(previewSizes, Collections.reverseOrder(areaComparator));
+ }
+
appendStreamConfig(availableStreamConfigs,
HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, previewSizes);
appendStreamConfig(availableStreamConfigs,
@@ -279,7 +340,6 @@
}
}
- List<Camera.Size> jpegSizes = p.getSupportedPictureSizes();
appendStreamConfig(availableStreamConfigs,
HAL_PIXEL_FORMAT_BLOB, p.getSupportedPictureSizes());
/*
@@ -620,7 +680,7 @@
if (thumbnailSizes != null) {
Size[] sizes = convertSizeListToArray(thumbnailSizes);
- Arrays.sort(sizes, new SizeAreaComparator());
+ Arrays.sort(sizes, new android.hardware.camera2.utils.SizeAreaComparator());
m.set(JPEG_AVAILABLE_THUMBNAIL_SIZES, sizes);
}
}
diff --git a/core/java/android/hardware/camera2/legacy/RequestHolder.java b/core/java/android/hardware/camera2/legacy/RequestHolder.java
index 69c140b..edd8e4e 100644
--- a/core/java/android/hardware/camera2/legacy/RequestHolder.java
+++ b/core/java/android/hardware/camera2/legacy/RequestHolder.java
@@ -43,71 +43,6 @@
private volatile boolean mFailed = false;
/**
- * Returns true if the given surface requires jpeg buffers.
- *
- * @param s a {@link android.view.Surface} to check.
- * @return true if the surface requires a jpeg buffer.
- */
- public static boolean jpegType(Surface s)
- throws LegacyExceptionUtils.BufferQueueAbandonedException {
- return LegacyCameraDevice.detectSurfaceType(s) ==
- CameraMetadataNative.NATIVE_JPEG_FORMAT;
- }
-
- /**
- * Returns true if the given surface requires non-jpeg buffer types.
- *
- * <p>
- * "Jpeg buffer" refers to the buffers returned in the jpeg
- * {@link android.hardware.Camera.PictureCallback}. Non-jpeg buffers are created using a tee
- * of the preview stream drawn to the surface
- * set via {@link android.hardware.Camera#setPreviewDisplay(android.view.SurfaceHolder)} or
- * equivalent methods.
- * </p>
- * @param s a {@link android.view.Surface} to check.
- * @return true if the surface requires a non-jpeg buffer type.
- */
- public static boolean previewType(Surface s)
- throws LegacyExceptionUtils.BufferQueueAbandonedException {
- return LegacyCameraDevice.detectSurfaceType(s) !=
- CameraMetadataNative.NATIVE_JPEG_FORMAT;
- }
-
- /**
- * Returns the number of surfaces targeted by the request that require jpeg buffers.
- */
- private static int numJpegTargets(CaptureRequest request) {
- int count = 0;
- for (Surface s : request.getTargets()) {
- try {
- if (jpegType(s)) {
- ++count;
- }
- } catch (LegacyExceptionUtils.BufferQueueAbandonedException e) {
- Log.w(TAG, "Surface abandoned, skipping...", e);
- }
- }
- return count;
- }
-
- /**
- * Returns the number of surfaces targeted by the request that require non-jpeg buffers.
- */
- private static int numPreviewTargets(CaptureRequest request) {
- int count = 0;
- for (Surface s : request.getTargets()) {
- try {
- if (previewType(s)) {
- ++count;
- }
- } catch (LegacyExceptionUtils.BufferQueueAbandonedException e) {
- Log.w(TAG, "Surface abandoned, skipping...", e);
- }
- }
- return count;
- }
-
- /**
* A builder class for {@link RequestHolder} objects.
*
* <p>
@@ -121,6 +56,7 @@
private final boolean mRepeating;
private final int mNumJpegTargets;
private final int mNumPreviewTargets;
+ private final Collection<Long> mJpegSurfaceIds;
/**
* Construct a new {@link Builder} to generate {@link RequestHolder} objects.
@@ -132,17 +68,81 @@
* @param repeating {@code true} if the request is repeating.
*/
public Builder(int requestId, int subsequenceId, CaptureRequest request,
- boolean repeating) {
+ boolean repeating, Collection<Long> jpegSurfaceIds) {
checkNotNull(request, "request must not be null");
mRequestId = requestId;
mSubsequenceId = subsequenceId;
mRequest = request;
mRepeating = repeating;
+ mJpegSurfaceIds = jpegSurfaceIds;
mNumJpegTargets = numJpegTargets(mRequest);
mNumPreviewTargets = numPreviewTargets(mRequest);
}
/**
+ * Returns true if the given surface requires jpeg buffers.
+ *
+ * @param s a {@link android.view.Surface} to check.
+ * @return true if the surface requires a jpeg buffer.
+ */
+ private boolean jpegType(Surface s)
+ throws LegacyExceptionUtils.BufferQueueAbandonedException {
+ return LegacyCameraDevice.containsSurfaceId(s, mJpegSurfaceIds);
+ }
+
+ /**
+ * Returns true if the given surface requires non-jpeg buffer types.
+ *
+ * <p>
+ * "Jpeg buffer" refers to the buffers returned in the jpeg
+ * {@link android.hardware.Camera.PictureCallback}. Non-jpeg buffers are created using a tee
+ * of the preview stream drawn to the surface
+ * set via {@link android.hardware.Camera#setPreviewDisplay(android.view.SurfaceHolder)} or
+ * equivalent methods.
+ * </p>
+ * @param s a {@link android.view.Surface} to check.
+ * @return true if the surface requires a non-jpeg buffer type.
+ */
+ private boolean previewType(Surface s)
+ throws LegacyExceptionUtils.BufferQueueAbandonedException {
+ return !jpegType(s);
+ }
+
+ /**
+ * Returns the number of surfaces targeted by the request that require jpeg buffers.
+ */
+ private int numJpegTargets(CaptureRequest request) {
+ int count = 0;
+ for (Surface s : request.getTargets()) {
+ try {
+ if (jpegType(s)) {
+ ++count;
+ }
+ } catch (LegacyExceptionUtils.BufferQueueAbandonedException e) {
+ Log.d(TAG, "Surface abandoned, skipping...", e);
+ }
+ }
+ return count;
+ }
+
+ /**
+ * Returns the number of surfaces targeted by the request that require non-jpeg buffers.
+ */
+ private int numPreviewTargets(CaptureRequest request) {
+ int count = 0;
+ for (Surface s : request.getTargets()) {
+ try {
+ if (previewType(s)) {
+ ++count;
+ }
+ } catch (LegacyExceptionUtils.BufferQueueAbandonedException e) {
+ Log.d(TAG, "Surface abandoned, skipping...", e);
+ }
+ }
+ return count;
+ }
+
+ /**
* Build a new {@link RequestHolder} using with parameters generated from this
* {@link Builder}.
*
diff --git a/core/java/android/hardware/camera2/legacy/RequestQueue.java b/core/java/android/hardware/camera2/legacy/RequestQueue.java
index 7598f99..c995029 100644
--- a/core/java/android/hardware/camera2/legacy/RequestQueue.java
+++ b/core/java/android/hardware/camera2/legacy/RequestQueue.java
@@ -39,8 +39,11 @@
private long mCurrentFrameNumber = 0;
private long mCurrentRepeatingFrameNumber = INVALID_FRAME;
private int mCurrentRequestId = 0;
+ private final List<Long> mJpegSurfaceIds;
- public RequestQueue() {}
+ public RequestQueue(List<Long> jpegSurfaceIds) {
+ mJpegSurfaceIds = jpegSurfaceIds;
+ }
/**
* Return and remove the next burst on the queue.
@@ -117,7 +120,7 @@
public synchronized int submit(List<CaptureRequest> requests, boolean repeating,
/*out*/LongParcelable frameNumber) {
int requestId = mCurrentRequestId++;
- BurstHolder burst = new BurstHolder(requestId, repeating, requests);
+ BurstHolder burst = new BurstHolder(requestId, repeating, requests, mJpegSurfaceIds);
long ret = INVALID_FRAME;
if (burst.isRepeating()) {
Log.i(TAG, "Repeating capture request set.");
diff --git a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
index 788b6d8..a9981d8 100644
--- a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
+++ b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
@@ -78,7 +78,7 @@
private static final int MAX_IN_FLIGHT_REQUESTS = 2;
- private static final int PREVIEW_FRAME_TIMEOUT = 300; // ms
+ private static final int PREVIEW_FRAME_TIMEOUT = 1000; // ms
private static final int JPEG_FRAME_TIMEOUT = 3000; // ms (same as CTS for API2)
private static final int REQUEST_COMPLETE_TIMEOUT = 3000; // ms (same as JPEG timeout)
@@ -91,9 +91,11 @@
private SurfaceTexture mPreviewTexture;
private Camera.Parameters mParams;
+ private final List<Long> mJpegSurfaceIds = new ArrayList<>();
+
private Size mIntermediateBufferSize;
- private final RequestQueue mRequestQueue = new RequestQueue();
+ private final RequestQueue mRequestQueue = new RequestQueue(mJpegSurfaceIds);
private LegacyRequest mLastRequest = null;
private SurfaceTexture mDummyTexture;
private Surface mDummySurface;
@@ -102,6 +104,10 @@
private final FpsCounter mPrevCounter = new FpsCounter("Incoming Preview");
private final FpsCounter mRequestCounter = new FpsCounter("Incoming Requests");
+ // Stuff JPEGs into HAL_PIXEL_FORMAT_RGBA_8888 gralloc buffers to get around SW write
+ // limitations for (b/17379185).
+ private static final boolean USE_BLOB_FORMAT_OVERRIDE = true;
+
/**
* Container object for Configure messages.
*/
@@ -197,10 +203,13 @@
}
for (Surface s : holder.getHolderTargets()) {
try {
- if (RequestHolder.jpegType(s)) {
+ if (LegacyCameraDevice.containsSurfaceId(s, mJpegSurfaceIds)) {
Log.i(TAG, "Producing jpeg buffer...");
- LegacyCameraDevice.setSurfaceDimens(s, data.length +
- LegacyCameraDevice.nativeGetJpegFooterSize(), /*height*/1);
+
+ int totalSize = data.length + LegacyCameraDevice.nativeGetJpegFooterSize();
+ totalSize += ((totalSize - 1) & ~0x3) + 4; // align to next octonibble
+
+ LegacyCameraDevice.setSurfaceDimens(s, totalSize, /*height*/1);
LegacyCameraDevice.setNextTimestamp(s, timestamp);
LegacyCameraDevice.produceFrame(s, data, data.length, /*height*/1,
CameraMetadataNative.NATIVE_JPEG_FORMAT);
@@ -316,6 +325,7 @@
mGLThreadManager.ignoreNewFrames();
mGLThreadManager.waitUntilIdle();
}
+ resetJpegSurfaceFormats(mCallbackOutputs);
mPreviewOutputs.clear();
mCallbackOutputs.clear();
mPreviewTexture = null;
@@ -329,6 +339,12 @@
LegacyCameraDevice.setSurfaceOrientation(s, facing, orientation);
switch (format) {
case CameraMetadataNative.NATIVE_JPEG_FORMAT:
+ if (USE_BLOB_FORMAT_OVERRIDE) {
+ // Override to RGBA_8888 format.
+ LegacyCameraDevice.setSurfaceFormat(s,
+ LegacyMetadataMapper.HAL_PIXEL_FORMAT_RGBA_8888);
+ }
+ mJpegSurfaceIds.add(LegacyCameraDevice.getSurfaceId(s));
mCallbackOutputs.add(s);
break;
default:
@@ -426,8 +442,19 @@
}
mCamera.setParameters(mParams);
- // TODO: configure the JPEG surface with some arbitrary size
- // using LegacyCameraDevice.nativeConfigureSurface
+ }
+
+ private void resetJpegSurfaceFormats(Collection<Surface> surfaces) {
+ if (!USE_BLOB_FORMAT_OVERRIDE || surfaces == null) {
+ return;
+ }
+ for(Surface s : surfaces) {
+ try {
+ LegacyCameraDevice.setSurfaceFormat(s, LegacyMetadataMapper.HAL_PIXEL_FORMAT_BLOB);
+ } catch (LegacyExceptionUtils.BufferQueueAbandonedException e) {
+ Log.w(TAG, "Surface abandoned, skipping...", e);
+ }
+ }
}
/**
@@ -459,9 +486,8 @@
List<Size> configuredJpegSizes = new ArrayList<Size>();
for (Surface callbackSurface : callbackOutputs) {
try {
- int format = LegacyCameraDevice.detectSurfaceType(callbackSurface);
- if (format != CameraMetadataNative.NATIVE_JPEG_FORMAT) {
+ if (!LegacyCameraDevice.containsSurfaceId(callbackSurface, mJpegSurfaceIds)) {
continue; // Ignore non-JPEG callback formats
}
@@ -821,6 +847,7 @@
if (mCamera != null) {
mCamera.release();
}
+ resetJpegSurfaceFormats(mCallbackOutputs);
break;
default:
throw new AssertionError("Unhandled message " + msg.what +
diff --git a/core/java/android/hardware/camera2/legacy/SizeAreaComparator.java b/core/java/android/hardware/camera2/legacy/SizeAreaComparator.java
new file mode 100644
index 0000000..75a5bab
--- /dev/null
+++ b/core/java/android/hardware/camera2/legacy/SizeAreaComparator.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.hardware.camera2.legacy;
+
+import android.hardware.Camera;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import static com.android.internal.util.Preconditions.*;
+
+/**
+ * Comparator for api1 {@link Camera.Size} objects by the area.
+ *
+ * <p>This comparator totally orders by rectangle area. Tie-breaks on width.</p>
+ */
+@SuppressWarnings("deprecation")
+public class SizeAreaComparator implements Comparator<Camera.Size> {
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int compare(Camera.Size size, Camera.Size size2) {
+ checkNotNull(size, "size must not be null");
+ checkNotNull(size2, "size2 must not be null");
+
+ if (size.equals(size2)) {
+ return 0;
+ }
+
+ long width = size.width;
+ long width2 = size2.width;
+ long area = width * size.height;
+ long area2 = width2 * size2.height;
+
+ if (area == area2) {
+ return (width > width2) ? 1 : -1;
+ }
+
+ return (area > area2) ? 1 : -1;
+ }
+
+ /**
+ * Get the largest api1 {@code Camera.Size} from the list by comparing each size's area
+ * by each other using {@link SizeAreaComparator}.
+ *
+ * @param sizes a non-{@code null} list of non-{@code null} sizes
+ * @return a non-{@code null} size
+ *
+ * @throws NullPointerException if {@code sizes} or any elements in it were {@code null}
+ */
+ public static Camera.Size findLargestByArea(List<Camera.Size> sizes) {
+ checkNotNull(sizes, "sizes must not be null");
+
+ return Collections.max(sizes, new SizeAreaComparator());
+ }
+}
diff --git a/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java b/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java
index c018c3e..c0d1d5e 100644
--- a/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java
+++ b/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java
@@ -581,6 +581,7 @@
// If pixel conversions aren't handled by egl, use a pbuffer
try {
if (LegacyCameraDevice.needsConversion(s)) {
+ // Always override to YV12 output for YUV surface formats.
LegacyCameraDevice.setSurfaceFormat(s, ImageFormat.YV12);
EGLSurfaceHolder holder = new EGLSurfaceHolder();
holder.surface = s;
diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java
index b83198d..74d4ac2 100644
--- a/core/java/android/net/NetworkAgent.java
+++ b/core/java/android/net/NetworkAgent.java
@@ -107,27 +107,13 @@
public static final int EVENT_UID_RANGES_REMOVED = BASE + 6;
/**
- * Sent by the NetworkAgent to ConnectivityService to block all routes for a certain address
- * family (AF_INET or AF_INET6) on this Network. For VPNs only.
- * obj = Integer representing the family (AF_INET or AF_INET6)
- */
- public static final int EVENT_BLOCK_ADDRESS_FAMILY = BASE + 7;
-
- /**
- * Sent by the NetworkAgent to ConnectivityService to unblock routes for a certain address
- * family (AF_INET or AF_INET6) on this Network. For VPNs only.
- * obj = Integer representing the family (AF_INET or AF_INET6)
- */
- public static final int EVENT_UNBLOCK_ADDRESS_FAMILY = BASE + 8;
-
- /**
* Sent by ConnectivitySerice to the NetworkAgent to inform the agent of the
* networks status - whether we could use the network or could not, due to
* either a bad network configuration (no internet link) or captive portal.
*
* arg1 = either {@code VALID_NETWORK} or {@code INVALID_NETWORK}
*/
- public static final int CMD_REPORT_NETWORK_STATUS = BASE + 9;
+ public static final int CMD_REPORT_NETWORK_STATUS = BASE + 7;
public static final int VALID_NETWORK = 1;
public static final int INVALID_NETWORK = 2;
@@ -137,7 +123,7 @@
* explicitly selected. This should be sent before the NetworkInfo is marked
* CONNECTED so it can be given special treatment at that time.
*/
- public static final int EVENT_SET_EXPLICITLY_SELECTED = BASE + 10;
+ public static final int EVENT_SET_EXPLICITLY_SELECTED = BASE + 8;
public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
NetworkCapabilities nc, LinkProperties lp, int score) {
@@ -273,21 +259,6 @@
}
/**
- * Called by the VPN code when it wants to block an address family from being routed, typically
- * because the VPN network doesn't support that family.
- */
- public void blockAddressFamily(int family) {
- queueOrSendMessage(EVENT_BLOCK_ADDRESS_FAMILY, family);
- }
-
- /**
- * Called by the VPN code when it wants to unblock an address family from being routed.
- */
- public void unblockAddressFamily(int family) {
- queueOrSendMessage(EVENT_UNBLOCK_ADDRESS_FAMILY, family);
- }
-
- /**
* Called by the bearer to indicate this network was manually selected by the user.
* This should be called before the NetworkInfo is marked CONNECTED so that this
* Network can be given special treatment at that time.
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl
index b3e28ea..fca15ac 100644
--- a/core/java/android/os/INetworkManagementService.aidl
+++ b/core/java/android/os/INetworkManagementService.aidl
@@ -410,7 +410,4 @@
void addInterfaceToLocalNetwork(String iface, in List<RouteInfo> routes);
void removeInterfaceFromLocalNetwork(String iface);
-
- void blockAddressFamily(int family, int netId, String iface);
- void unblockAddressFamily(int family, int netId, String iface);
}
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
index 7a46e40..b879c83 100644
--- a/core/java/android/os/RecoverySystem.java
+++ b/core/java/android/os/RecoverySystem.java
@@ -20,6 +20,7 @@
import android.content.Context;
import android.content.Intent;
import android.os.UserManager;
+import android.text.TextUtils;
import android.util.Log;
import java.io.ByteArrayInputStream;
@@ -333,9 +334,10 @@
throws IOException {
String filename = packageFile.getCanonicalPath();
Log.w(TAG, "!!! REBOOTING TO INSTALL " + filename + " !!!");
- String arg = "--update_package=" + filename +
- "\n--locale=" + Locale.getDefault().toString();
- bootCommand(context, arg);
+
+ final String filenameArg = "--update_package=" + filename;
+ final String localeArg = "--locale=" + Locale.getDefault().toString();
+ bootCommand(context, filenameArg, localeArg);
}
/**
@@ -352,7 +354,18 @@
* @throws SecurityException if the current user is not allowed to wipe data.
*/
public static void rebootWipeUserData(Context context) throws IOException {
- rebootWipeUserData(context, false);
+ rebootWipeUserData(context, false, context.getPackageName());
+ }
+
+ /** {@hide} */
+ public static void rebootWipeUserData(Context context, String reason) throws IOException {
+ rebootWipeUserData(context, false, reason);
+ }
+
+ /** {@hide} */
+ public static void rebootWipeUserData(Context context, boolean shutdown)
+ throws IOException {
+ rebootWipeUserData(context, shutdown, context.getPackageName());
}
/**
@@ -373,8 +386,8 @@
*
* @hide
*/
- public static void rebootWipeUserData(Context context, boolean shutdown)
- throws IOException {
+ public static void rebootWipeUserData(Context context, boolean shutdown, String reason)
+ throws IOException {
UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
if (um.hasUserRestriction(UserManager.DISALLOW_FACTORY_RESET)) {
throw new SecurityException("Wiping data is not allowed for this user.");
@@ -395,13 +408,18 @@
// Block until the ordered broadcast has completed.
condition.block();
- String shutdownArg = "";
+ String shutdownArg = null;
if (shutdown) {
- shutdownArg = "--shutdown_after\n";
+ shutdownArg = "--shutdown_after";
}
- bootCommand(context, shutdownArg + "--wipe_data\n--locale=" +
- Locale.getDefault().toString());
+ String reasonArg = null;
+ if (!TextUtils.isEmpty(reason)) {
+ reasonArg = "--reason=" + sanitizeArg(reason);
+ }
+
+ final String localeArg = "--locale=" + Locale.getDefault().toString();
+ bootCommand(context, shutdownArg, "--wipe_data", reasonArg, localeArg);
}
/**
@@ -409,23 +427,38 @@
* @throws IOException if something goes wrong.
*/
public static void rebootWipeCache(Context context) throws IOException {
- bootCommand(context, "--wipe_cache\n--locale=" + Locale.getDefault().toString());
+ rebootWipeCache(context, context.getPackageName());
+ }
+
+ /** {@hide} */
+ public static void rebootWipeCache(Context context, String reason) throws IOException {
+ String reasonArg = null;
+ if (!TextUtils.isEmpty(reason)) {
+ reasonArg = "--reason=" + sanitizeArg(reason);
+ }
+
+ final String localeArg = "--locale=" + Locale.getDefault().toString();
+ bootCommand(context, "--wipe_cache", reasonArg, localeArg);
}
/**
* Reboot into the recovery system with the supplied argument.
- * @param arg to pass to the recovery utility.
+ * @param args to pass to the recovery utility.
* @throws IOException if something goes wrong.
*/
- private static void bootCommand(Context context, String arg) throws IOException {
+ private static void bootCommand(Context context, String... args) throws IOException {
RECOVERY_DIR.mkdirs(); // In case we need it
COMMAND_FILE.delete(); // In case it's not writable
LOG_FILE.delete();
FileWriter command = new FileWriter(COMMAND_FILE);
try {
- command.write(arg);
- command.write("\n");
+ for (String arg : args) {
+ if (!TextUtils.isEmpty(arg)) {
+ command.write(arg);
+ command.write("\n");
+ }
+ }
} finally {
command.close();
}
@@ -470,5 +503,15 @@
return log;
}
+ /**
+ * Internally, recovery treats each line of the command file as a separate
+ * argv, so we only need to protect against newlines and nulls.
+ */
+ private static String sanitizeArg(String arg) {
+ arg = arg.replace('\0', '?');
+ arg = arg.replace('\n', '?');
+ return arg;
+ }
+
private void RecoverySystem() { } // Do not instantiate
}
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index b22fd9c..35fff74 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -478,7 +478,7 @@
public final int getCurrentInterruptionFilter() {
if (!isBound()) return 0;
try {
- return getNotificationInterface().getHintsFromListener(mWrapper);
+ return getNotificationInterface().getInterruptionFilterFromListener(mWrapper);
} catch (android.os.RemoteException ex) {
Log.v(TAG, "Unable to contact notification manager", ex);
return 0;
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 4e1db90..6d3b419 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -836,6 +836,11 @@
break;
}
+ // Ignore invisible views as they are not interactive.
+ if (sibling.getVisibility() != View.VISIBLE) {
+ continue;
+ }
+
// If sibling is not interactive we do not care.
if (!sibling.isClickable() && !sibling.isLongClickable()) {
continue;
diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java
index 08160c8..dffcca4 100644
--- a/core/java/android/view/WindowManagerGlobal.java
+++ b/core/java/android/view/WindowManagerGlobal.java
@@ -434,11 +434,12 @@
boolean hasVisibleWindows = false;
synchronized (mLock) {
for (int i = mRoots.size() - 1; i >= 0; --i) {
- if (mRoots.get(i).getHostVisibility() == View.VISIBLE
- && mRoots.get(i).mAttachInfo.mHardwareRenderer != null) {
+ final ViewRootImpl root = mRoots.get(i);
+ if (root.mView != null && root.getHostVisibility() == View.VISIBLE
+ && root.mAttachInfo.mHardwareRenderer != null) {
hasVisibleWindows = true;
} else {
- mRoots.get(i).destroyHardwareResources();
+ root.destroyHardwareResources();
}
}
}
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index d458ee4..673f075 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -955,14 +955,19 @@
*/
public void screenTurningOn(ScreenOnListener screenOnListener);
+ /**
+ * Called when the device has turned the screen off.
+ */
+ public void screenTurnedOff();
+
public interface ScreenOnListener {
void onScreenOn();
}
/**
- * Return whether the system is awake.
+ * Return whether the default display is on and not blocked by a black surface.
*/
- public boolean isAwake();
+ public boolean isScreenOn();
/**
* Tell the policy that the lid switch has changed state.
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index af53ec8..2b8b4dc 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -611,6 +611,12 @@
private final int[] mScrollOffset = new int[2];
private final int[] mScrollConsumed = new int[2];
+ // Used for offsetting MotionEvents that we feed to the VelocityTracker.
+ // In the future it would be nice to be able to give this to the VelocityTracker
+ // directly, or alternatively put a VT into absolute-positioning mode that only
+ // reads the raw screen-coordinate x/y values.
+ private int mNestedYOffset = 0;
+
// True when the popup should be hidden because of a call to
// dispatchDisplayHint()
private boolean mPopupHidden;
@@ -3330,6 +3336,7 @@
scrollConsumedCorrection = mScrollConsumed[1];
if (vtev != null) {
vtev.offsetLocation(0, mScrollOffset[1]);
+ mNestedYOffset += mScrollOffset[1];
}
}
final int deltaY = rawDeltaY;
@@ -3399,6 +3406,7 @@
lastYCorrection -= mScrollOffset[1];
if (vtev != null) {
vtev.offsetLocation(0, mScrollOffset[1]);
+ mNestedYOffset += mScrollOffset[1];
}
} else {
final boolean atOverscrollEdge = overScrollBy(0, overscroll,
@@ -3582,6 +3590,10 @@
final MotionEvent vtev = MotionEvent.obtain(ev);
final int actionMasked = ev.getActionMasked();
+ if (actionMasked == MotionEvent.ACTION_DOWN) {
+ mNestedYOffset = 0;
+ }
+ vtev.offsetLocation(0, mNestedYOffset);
switch (actionMasked) {
case MotionEvent.ACTION_DOWN: {
onTouchDown(ev);
@@ -4144,7 +4156,7 @@
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
- int action = ev.getAction();
+ final int actionMasked = ev.getActionMasked();
View v;
if (mPositionScroller != null) {
@@ -4163,7 +4175,7 @@
return true;
}
- switch (action & MotionEvent.ACTION_MASK) {
+ switch (actionMasked) {
case MotionEvent.ACTION_DOWN: {
int touchMode = mTouchMode;
if (touchMode == TOUCH_MODE_OVERFLING || touchMode == TOUCH_MODE_OVERSCROLL) {
@@ -4190,6 +4202,7 @@
mLastY = Integer.MIN_VALUE;
initOrResetVelocityTracker();
mVelocityTracker.addMovement(ev);
+ mNestedYOffset = 0;
startNestedScroll(SCROLL_AXIS_VERTICAL);
if (touchMode == TOUCH_MODE_FLING) {
return true;
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java
index dd312a6..a90b392 100644
--- a/core/java/android/widget/ScrollView.java
+++ b/core/java/android/widget/ScrollView.java
@@ -142,6 +142,7 @@
*/
private final int[] mScrollOffset = new int[2];
private final int[] mScrollConsumed = new int[2];
+ private int mNestedYOffset;
/**
* The StrictMode "critical time span" objects to catch animation
@@ -516,6 +517,7 @@
mLastMotionY = y;
initVelocityTrackerIfNotExists();
mVelocityTracker.addMovement(ev);
+ mNestedYOffset = 0;
if (mScrollStrictSpan == null) {
mScrollStrictSpan = StrictMode.enterCriticalSpan("ScrollView-scroll");
}
@@ -586,9 +588,14 @@
MotionEvent vtev = MotionEvent.obtain(ev);
- final int action = ev.getAction();
+ final int actionMasked = ev.getActionMasked();
- switch (action & MotionEvent.ACTION_MASK) {
+ if (actionMasked == MotionEvent.ACTION_DOWN) {
+ mNestedYOffset = 0;
+ }
+ vtev.offsetLocation(0, mNestedYOffset);
+
+ switch (actionMasked) {
case MotionEvent.ACTION_DOWN: {
if (getChildCount() == 0) {
return false;
@@ -630,6 +637,7 @@
if (dispatchNestedPreScroll(0, deltaY, mScrollConsumed, mScrollOffset)) {
deltaY -= mScrollConsumed[1];
vtev.offsetLocation(0, mScrollOffset[1]);
+ mNestedYOffset += mScrollOffset[1];
}
if (!mIsBeingDragged && Math.abs(deltaY) > mTouchSlop) {
final ViewParent parent = getParent();
@@ -666,6 +674,7 @@
if (dispatchNestedScroll(0, scrolledDeltaY, 0, unconsumedY, mScrollOffset)) {
mLastMotionY -= mScrollOffset[1];
vtev.offsetLocation(0, mScrollOffset[1]);
+ mNestedYOffset += mScrollOffset[1];
} else if (canOverscroll) {
final int pulledToY = oldY + deltaY;
if (pulledToY < 0) {
diff --git a/core/java/com/android/internal/app/ProcessStats.java b/core/java/com/android/internal/app/ProcessStats.java
index 4995ea1d1..a92cb74 100644
--- a/core/java/com/android/internal/app/ProcessStats.java
+++ b/core/java/com/android/internal/app/ProcessStats.java
@@ -3570,6 +3570,10 @@
return mOwner != null || mRestarting;
}
+ public boolean isRestarting() {
+ return mRestarting;
+ }
+
void add(ServiceState other) {
addDurations(other);
mRunCount += other.mRunCount;
diff --git a/core/java/com/android/internal/os/storage/ExternalStorageFormatter.java b/core/java/com/android/internal/os/storage/ExternalStorageFormatter.java
index fb7f215..a529923 100644
--- a/core/java/com/android/internal/os/storage/ExternalStorageFormatter.java
+++ b/core/java/com/android/internal/os/storage/ExternalStorageFormatter.java
@@ -50,6 +50,7 @@
private boolean mFactoryReset = false;
private boolean mAlwaysReset = false;
+ private String mReason = null;
StorageEventListener mStorageListener = new StorageEventListener() {
@Override
@@ -84,6 +85,7 @@
mAlwaysReset = true;
}
+ mReason = intent.getStringExtra(Intent.EXTRA_REASON);
mStorageVolume = intent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME);
if (mProgressDialog == null) {
@@ -135,7 +137,10 @@
void fail(int msg) {
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
if (mAlwaysReset) {
- sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR"));
+ Intent intent = new Intent(Intent.ACTION_MASTER_CLEAR);
+ intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ intent.putExtra(Intent.EXTRA_REASON, mReason);
+ sendBroadcast(intent);
}
stopSelf();
}
@@ -179,7 +184,10 @@
}
if (success) {
if (mFactoryReset) {
- sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR"));
+ Intent intent = new Intent(Intent.ACTION_MASTER_CLEAR);
+ intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ intent.putExtra(Intent.EXTRA_REASON, mReason);
+ sendBroadcast(intent);
// Intent handling is asynchronous -- assume it will happen soon.
stopSelf();
return;
@@ -188,7 +196,10 @@
// If we didn't succeed, or aren't doing a full factory
// reset, then it is time to remount the storage.
if (!success && mAlwaysReset) {
- sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR"));
+ Intent intent = new Intent(Intent.ACTION_MASTER_CLEAR);
+ intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ intent.putExtra(Intent.EXTRA_REASON, mReason);
+ sendBroadcast(intent);
} else {
try {
mountService.mountVolume(extStoragePath);
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 8ea28ec..6796134 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -478,7 +478,7 @@
NPE_CHECK_RETURN_ZERO(env, fileDescriptor);
- jint descriptor = jniGetFDFromFileDescriptor(env, fileDescriptor);
+ int descriptor = jniGetFDFromFileDescriptor(env, fileDescriptor);
struct stat fdStat;
if (fstat(descriptor, &fdStat) == -1) {
@@ -486,16 +486,22 @@
return nullObjectReturn("fstat return -1");
}
- // Restore the descriptor's offset on exiting this function.
- AutoFDSeek autoRestore(descriptor);
+ // Duplicate the descriptor here to prevent leaking memory. A leak occurs
+ // if we only close the file descriptor and not the file object it is used to
+ // create. If we don't explicitly clean up the file (which in turn closes the
+ // descriptor) the buffers allocated internally by fseek will be leaked.
+ int dupDescriptor = dup(descriptor);
- FILE* file = fdopen(descriptor, "r");
+ FILE* file = fdopen(dupDescriptor, "r");
if (file == NULL) {
+ // cleanup the duplicated descriptor since it will not be closed when the
+ // file is cleaned up (fclose).
+ close(dupDescriptor);
return nullObjectReturn("Could not open file");
}
SkAutoTUnref<SkFILEStream> fileStream(new SkFILEStream(file,
- SkFILEStream::kCallerRetains_Ownership));
+ SkFILEStream::kCallerPasses_Ownership));
// Use a buffered stream. Although an SkFILEStream can be rewound, this
// ensures that SkImageDecoder::Factory never rewinds beyond the
diff --git a/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp b/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
index 980ead0..ee00161 100644
--- a/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
+++ b/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
@@ -200,7 +200,7 @@
switch(pixelFmt) {
case HAL_PIXEL_FORMAT_YCrCb_420_SP: {
if (bufSize < width * height * 4) {
- ALOGE("%s: PixelBuffer size %" PRId32 " to small for given dimensions",
+ ALOGE("%s: PixelBuffer size %" PRId32 " too small for given dimensions",
__FUNCTION__, bufSize);
return BAD_VALUE;
}
@@ -222,7 +222,7 @@
}
case HAL_PIXEL_FORMAT_YV12: {
if (bufSize < width * height * 4) {
- ALOGE("%s: PixelBuffer size %" PRId32 " to small for given dimensions",
+ ALOGE("%s: PixelBuffer size %" PRId32 " too small for given dimensions",
__FUNCTION__, bufSize);
return BAD_VALUE;
}
@@ -259,7 +259,7 @@
// Software writes with YCbCr_420_888 format are unsupported
// by the gralloc module for now
if (bufSize < width * height * 4) {
- ALOGE("%s: PixelBuffer size %" PRId32 " to small for given dimensions",
+ ALOGE("%s: PixelBuffer size %" PRId32 " too small for given dimensions",
__FUNCTION__, bufSize);
return BAD_VALUE;
}
@@ -281,6 +281,18 @@
return BAD_VALUE;
}
int8_t* img = NULL;
+ struct camera3_jpeg_blob footer = {
+ jpeg_blob_id: CAMERA3_JPEG_BLOB_ID,
+ jpeg_size: (uint32_t)width
+ };
+
+ size_t totalSize = static_cast<size_t>(width) + sizeof(footer);
+ size_t padding = ((totalSize - 1) & ~0x3) + 4; // align to next octonibble
+ totalSize += padding;
+ if (anb->width != totalSize) {
+ ALOGE("%s: gralloc buffer wrong size to hold jpeg, failed to produce buffer.");
+ return BAD_VALUE;
+ }
ALOGV("%s: Lock buffer from %p for write", __FUNCTION__, anw.get());
err = buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img));
@@ -289,12 +301,9 @@
err);
return err;
}
- struct camera3_jpeg_blob footer = {
- jpeg_blob_id: CAMERA3_JPEG_BLOB_ID,
- jpeg_size: (uint32_t)width
- };
memcpy(img, pixelBuffer, width);
- memcpy(img + anb->width - sizeof(footer), &footer, sizeof(footer));
+ memset(img + width, 0, padding);
+ memcpy(img + totalSize - sizeof(footer), &footer, sizeof(footer));
break;
}
default: {
diff --git a/core/jni/android_media_AudioRecord.cpp b/core/jni/android_media_AudioRecord.cpp
index 09c5f3a..e38f3d4 100644
--- a/core/jni/android_media_AudioRecord.cpp
+++ b/core/jni/android_media_AudioRecord.cpp
@@ -45,6 +45,7 @@
};
struct audio_attributes_fields_t {
jfieldID fieldRecSource; // AudioAttributes.mSource
+ jfieldID fieldFlags; // AudioAttributes.mFlags
jfieldID fieldFormattedTags;// AudioAttributes.mFormattedTags
};
static audio_attributes_fields_t javaAudioAttrFields;
@@ -212,9 +213,13 @@
strncpy(paa->tags, tags, AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - 1);
env->ReleaseStringUTFChars(jtags, tags);
paa->source = (audio_source_t) env->GetIntField(jaa, javaAudioAttrFields.fieldRecSource);
+ paa->flags = (audio_flags_mask_t)env->GetIntField(jaa, javaAudioAttrFields.fieldFlags);
+ ALOGV("AudioRecord_setup for source=%d tags=%s flags=%08x", paa->source, paa->tags, paa->flags);
- ALOGV("AudioRecord_setup for source=%d tags=%s", paa->source, paa->tags);
-
+ audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE;
+ if (paa->flags & AUDIO_FLAG_HW_HOTWORD) {
+ flags = AUDIO_INPUT_FLAG_HW_HOTWORD;
+ }
// create the callback information:
// this data will be passed with every AudioRecord callback
audiorecord_callback_cookie *lpCallbackData = new audiorecord_callback_cookie;
@@ -232,7 +237,9 @@
lpCallbackData,// void* user
0, // notificationFrames,
true, // threadCanCallJava
- sessionId);
+ sessionId,
+ AudioRecord::TRANSFER_DEFAULT,
+ flags);
if (status != NO_ERROR) {
ALOGE("Error creating AudioRecord instance: initialization check failed with status %d.",
@@ -638,10 +645,12 @@
}
jclass audioAttributesClassRef = (jclass)env->NewGlobalRef(audioAttrClass);
javaAudioAttrFields.fieldRecSource = env->GetFieldID(audioAttributesClassRef, "mSource", "I");
+ javaAudioAttrFields.fieldFlags = env->GetFieldID(audioAttributesClassRef, "mFlags", "I");
javaAudioAttrFields.fieldFormattedTags =
env->GetFieldID(audioAttributesClassRef, "mFormattedTags", "Ljava/lang/String;");
env->DeleteGlobalRef(audioAttributesClassRef);
if (javaAudioAttrFields.fieldRecSource == NULL
+ || javaAudioAttrFields.fieldFlags == NULL
|| javaAudioAttrFields.fieldFormattedTags == NULL) {
ALOGE("Can't initialize AudioAttributes fields");
return -1;
diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp
index 87ee618..7b3528b 100644
--- a/core/jni/android_os_Debug.cpp
+++ b/core/jni/android_os_Debug.cpp
@@ -271,27 +271,19 @@
whichHeap = HEAP_DALVIK_OTHER;
if (strstr(name, "/dev/ashmem/dalvik-LinearAlloc") == name) {
subHeap = HEAP_DALVIK_LINEARALLOC;
- } else if ((strstr(name, "/dev/ashmem/dalvik-mark") == name) ||
- (strstr(name, "/dev/ashmem/dalvik-allocspace alloc space live-bitmap") == name) ||
- (strstr(name, "/dev/ashmem/dalvik-allocspace alloc space mark-bitmap") == name) ||
- (strstr(name, "/dev/ashmem/dalvik-card table") == name) ||
- (strstr(name, "/dev/ashmem/dalvik-allocation stack") == name) ||
- (strstr(name, "/dev/ashmem/dalvik-live stack") == name) ||
- (strstr(name, "/dev/ashmem/dalvik-imagespace") == name) ||
- (strstr(name, "/dev/ashmem/dalvik-bitmap") == name) ||
- (strstr(name, "/dev/ashmem/dalvik-card-table") == name) ||
- (strstr(name, "/dev/ashmem/dalvik-mark-stack") == name) ||
- (strstr(name, "/dev/ashmem/dalvik-aux-structure") == name)) {
- subHeap = HEAP_DALVIK_ACCOUNTING;
- } else if (strstr(name, "/dev/ashmem/dalvik-large") == name) {
+ } else if ((strstr(name, "/dev/ashmem/dalvik-alloc space") == name) ||
+ (strstr(name, "/dev/ashmem/dalvik-main space") == name) ||
+ (strstr(name, "/dev/ashmem/dalvik-non moving space") == name)) {
+ // This is the regular Dalvik heap.
+ whichHeap = HEAP_DALVIK;
+ subHeap = HEAP_DALVIK_NORMAL;
+ } else if (strstr(name, "/dev/ashmem/dalvik-large object space") == name) {
whichHeap = HEAP_DALVIK;
subHeap = HEAP_DALVIK_LARGE;
} else if (strstr(name, "/dev/ashmem/dalvik-jit-code-cache") == name) {
subHeap = HEAP_DALVIK_CODE_CACHE;
} else {
- // This is the regular Dalvik heap.
- whichHeap = HEAP_DALVIK;
- subHeap = HEAP_DALVIK_NORMAL;
+ subHeap = HEAP_DALVIK_ACCOUNTING; // Default to accounting.
}
} else if (strncmp(name, "/dev/ashmem/CursorWindow", 24) == 0) {
whichHeap = HEAP_CURSOR;
diff --git a/core/res/res/drawable-hdpi/ic_menu_refresh.png b/core/res/res/drawable-hdpi/ic_menu_refresh.png
deleted file mode 100644
index e13315f..0000000
--- a/core/res/res/drawable-hdpi/ic_menu_refresh.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_notification_cast_on.png b/core/res/res/drawable-hdpi/ic_notification_cast_on.png
deleted file mode 100644
index 3eaf13a..0000000
--- a/core/res/res/drawable-hdpi/ic_notification_cast_on.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-ldpi/ic_menu_refresh.png b/core/res/res/drawable-ldpi/ic_menu_refresh.png
deleted file mode 100644
index b25dc06..0000000
--- a/core/res/res/drawable-ldpi/ic_menu_refresh.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_menu_refresh.png b/core/res/res/drawable-mdpi/ic_menu_refresh.png
deleted file mode 100644
index 30b660f..0000000
--- a/core/res/res/drawable-mdpi/ic_menu_refresh.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_notification_cast_on.png b/core/res/res/drawable-mdpi/ic_notification_cast_on.png
deleted file mode 100644
index 42de8c4..0000000
--- a/core/res/res/drawable-mdpi/ic_notification_cast_on.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_menu_refresh.png b/core/res/res/drawable-xhdpi/ic_menu_refresh.png
deleted file mode 100644
index 9e9f10e..0000000
--- a/core/res/res/drawable-xhdpi/ic_menu_refresh.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_notification_cast_on.png b/core/res/res/drawable-xhdpi/ic_notification_cast_on.png
deleted file mode 100644
index 142065b..0000000
--- a/core/res/res/drawable-xhdpi/ic_notification_cast_on.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_menu_refresh.png b/core/res/res/drawable-xxhdpi/ic_menu_refresh.png
deleted file mode 100644
index 580f4cf..0000000
--- a/core/res/res/drawable-xxhdpi/ic_menu_refresh.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_notification_cast_on.png b/core/res/res/drawable-xxhdpi/ic_notification_cast_on.png
deleted file mode 100644
index d562602..0000000
--- a/core/res/res/drawable-xxhdpi/ic_notification_cast_on.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/ic_menu_refresh.xml b/core/res/res/drawable/ic_menu_refresh.xml
new file mode 100644
index 0000000..e0fbccb
--- /dev/null
+++ b/core/res/res/drawable/ic_menu_refresh.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="?attr/colorControlNormal">
+ <path
+ android:pathData="M17.6,6.4C16.2,4.9 14.2,4 12,4c-4.4,0 -8,3.6 -8,8s3.6,8 8,8c3.7,0 6.8,-2.6 7.7,-6l-2.1,0c-0.8,2.3 -3,4 -5.6,4c-3.3,0 -6,-2.7 -6,-6s2.7,-6 6,-6c1.7,0 3.1,0.7 4.2,1.8L13,11l7,0L20,4L17.6,6.4z"
+ android:fillColor="@color/white"/>
+</vector>
diff --git a/core/res/res/drawable/ic_notification_cast_connecting.xml b/core/res/res/drawable/ic_notification_cast_connecting.xml
deleted file mode 100644
index a390bce..0000000
--- a/core/res/res/drawable/ic_notification_cast_connecting.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 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.
- */
--->
-<animation-list
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="false">
- <item android:drawable="@drawable/ic_notification_cast_0" android:duration="500" />
- <item android:drawable="@drawable/ic_notification_cast_1" android:duration="500" />
- <item android:drawable="@drawable/ic_notification_cast_2" android:duration="500" />
- <item android:drawable="@drawable/ic_notification_cast_1" android:duration="500" />
-</animation-list>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 2e3dd46..a01a154 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -108,7 +108,7 @@
<string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
<string name="roamingText0" msgid="7170335472198694945">"रोमिंग संकेतक चालू"</string>
<string name="roamingText1" msgid="5314861519752538922">"रोमिंग संकेतक बंद"</string>
- <string name="roamingText2" msgid="8969929049081268115">"रोमिंग संकेतक चमक रहा है"</string>
+ <string name="roamingText2" msgid="8969929049081268115">"रोमिंग संकेतक स्क्रीन की रोशनी रहा है"</string>
<string name="roamingText3" msgid="5148255027043943317">"मोहल्ले से बाहर"</string>
<string name="roamingText4" msgid="8808456682550796530">"भवन से बाहर"</string>
<string name="roamingText5" msgid="7604063252850354350">"रोमिंग - पसंदीदा सिस्टम"</string>
@@ -588,7 +588,7 @@
<string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"सीधे CDMA टेबलेट सेटअप प्रारंभ करें"</string>
<string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"सीधे CDMA फ़ोन सेटअप प्रारंभ करें"</string>
<string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"ऐप्स को CDMA प्रावधान प्रारंभ करने देता है. दुर्भावनापूर्ण ऐप्स अनावश्यक रूप से CDMA प्रावधान प्रारंभ कर सकते हैं."</string>
- <string name="permlab_locationUpdates" msgid="7785408253364335740">"स्थान के बारे में नई जानकारी की सूचनाओं को नियंत्रित करें"</string>
+ <string name="permlab_locationUpdates" msgid="7785408253364335740">"स्थान के बारे में नई जानकारी की नोटिफिकेशन को नियंत्रित करें"</string>
<string name="permdesc_locationUpdates" msgid="1120741557891438876">"एप को रेडियो से स्थान के बारे में नई जानकारी की सूचनाएं सक्षम/अक्षम करने देता है. सामान्य ऐप्स द्वारा उपयोग करने के लिए नहीं."</string>
<string name="permlab_checkinProperties" msgid="7855259461268734914">"चेकइन गुणों में पहुंचें"</string>
<string name="permdesc_checkinProperties" msgid="4024526968630194128">"ऐप्स को चेकइन सेवा द्वारा अपलोड किए गए गुणों पर पढ़ें/लिखें पहुंच देता है. सामान्य ऐप्स द्वारा उपयोग करने के लिए नहीं."</string>
@@ -726,8 +726,8 @@
<string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"ऐप्स को नेटवर्क नीतियां प्रबंधित करने और ऐप्स-विशिष्ट नियमों को परिभाषित करने देता है."</string>
<string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"नेटवर्क उपयोग हिसाब बदलें"</string>
<string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"ऐप्स को यह संशोधित करने देता है कि ऐप्स की तुलना में नेटवर्क उपयोग का मूल्यांकन कैसे किया जाता है. सामान्य ऐप्स द्वारा उपयोग करने के लिए नहीं."</string>
- <string name="permlab_accessNotifications" msgid="7673416487873432268">"सूचनाओं तक पहुंचें"</string>
- <string name="permdesc_accessNotifications" msgid="458457742683431387">"ऐप्स को सूचनाओं को प्राप्त करने, जांच करने, और साफ़ करने देता है, जिनमें अन्य ऐप्स के द्वारा पोस्ट की गई सूचनाएं भी शामिल हैं."</string>
+ <string name="permlab_accessNotifications" msgid="7673416487873432268">"नोटिफिकेशन तक पहुंचें"</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"ऐप्स को नोटिफिकेशन को प्राप्त करने, जांच करने, और साफ़ करने देता है, जिनमें अन्य ऐप्स के द्वारा पोस्ट की गई सूचनाएं भी शामिल हैं."</string>
<string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"नोटिफिकेशन श्रवणकर्ता सेवा से जुड़ें"</string>
<string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"धारक को नोटिफिकेशन श्रवणकर्ता सेवा के शीर्ष स्तरीय इंटरफ़ेस से जुड़ने देती है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होनी चाहिए."</string>
<string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"किसी स्थिति प्रदाता सेवा से आबद्ध हों"</string>
diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml
index a40c056..e8cb675 100644
--- a/core/res/res/values-lo-rLA/strings.xml
+++ b/core/res/res/values-lo-rLA/strings.xml
@@ -1229,7 +1229,7 @@
<string name="smv_application" msgid="3307209192155442829">"ແອັບຯ <xliff:g id="APPLICATION">%1$s</xliff:g> (ໂປຣເຊສ <xliff:g id="PROCESS">%2$s</xliff:g>) ໄດ້ລະເມີດນະໂຍບາຍ StrictMode ທີ່ບັງຄັບໃຊ້ດ້ວຍໂຕເອງ."</string>
<string name="smv_process" msgid="5120397012047462446">"ໂປຣເຊສ <xliff:g id="PROCESS">%1$s</xliff:g> ລະເມີດນະໂຍບາຍບັງຄັບໃຊ້ເອງ StrictMode."</string>
<string name="android_upgrading_title" msgid="1584192285441405746">"ກຳລັງອັບເກຣດ Android..."</string>
- <string name="android_upgrading_apk" msgid="7904042682111526169">"ກຳລັງປັບປຸງປະສິດຕິພາບແອັບຯທີ <xliff:g id="NUMBER_0">%1$d</xliff:g> ຈາກທັງໝົດ <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
+ <string name="android_upgrading_apk" msgid="7904042682111526169">"ກຳລັງປັບປຸງປະສິດທິພາບແອັບຯທີ <xliff:g id="NUMBER_0">%1$d</xliff:g> ຈາກທັງໝົດ <xliff:g id="NUMBER_1">%2$d</xliff:g> ແອັບຯ."</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ກຳລັງເປີດແອັບຯ."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"ກຳລັງສຳເລັດການເປີດລະບົບ."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ກຳລັງເຮັດວຽກ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 746eb4f..ae2f866 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1640,7 +1640,7 @@
<string name="accessibility_enabled" msgid="1381972048564547685">"Włączono ułatwienia dostępu."</string>
<string name="enable_accessibility_canceled" msgid="3833923257966635673">"Ułatwienia dostępu zostały anulowane."</string>
<string name="user_switched" msgid="3768006783166984410">"Bieżący użytkownik: <xliff:g id="NAME">%1$s</xliff:g>."</string>
- <string name="user_switching_message" msgid="2871009331809089783">"Przełączam na <xliff:g id="NAME">%1$s</xliff:g>…"</string>
+ <string name="user_switching_message" msgid="2871009331809089783">"Przełączam na użytkownika <xliff:g id="NAME">%1$s</xliff:g>…"</string>
<string name="owner_name" msgid="2716755460376028154">"Właściciel"</string>
<string name="error_message_title" msgid="4510373083082500195">"Błąd"</string>
<string name="error_message_change_not_allowed" msgid="1347282344200417578">"Ta zmiana nie jest dozwolona przez administratora"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 08beb14..1ef185f 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1131,7 +1131,7 @@
<item quantity="other" msgid="2973062968038355991">"<xliff:g id="COUNT">%d</xliff:g> gün içinde"</item>
</plurals>
<string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g> tarihinde"</string>
- <string name="preposition_for_time" msgid="5506831244263083793">"<xliff:g id="TIME">%s</xliff:g> saatinde"</string>
+ <string name="preposition_for_time" msgid="5506831244263083793">"<xliff:g id="TIME">%s</xliff:g>"</string>
<string name="preposition_for_year" msgid="5040395640711867177">"<xliff:g id="YEAR">%s</xliff:g> yılında"</string>
<string name="day" msgid="8144195776058119424">"gün"</string>
<string name="days" msgid="4774547661021344602">"gün"</string>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index e9c5152..bd9e2f6 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -365,6 +365,8 @@
<integer translatable="false" name="config_wifi_framework_wifi_score_bad_link_speed_5">12</integer>
<integer translatable="false" name="config_wifi_framework_wifi_score_good_link_speed_24">24</integer>
<integer translatable="false" name="config_wifi_framework_wifi_score_good_link_speed_5">36</integer>
+ <string translatable="false" name="config_wifi_random_mac_oui">DA-A1-19</string>
+
<bool translatable="false" name="config_wifi_framework_cellular_handover_enable_user_triggered_adjustment">true</bool>
<!-- Integer packet threshold used to allow scan while associated -->
@@ -405,6 +407,15 @@
<!-- Integer indicating associated full scan max num passive channels -->
<integer translatable="false" name="config_wifi_framework_associated_partial_scan_max_num_passive_channels">3</integer>
+ <!-- Integer indicating number of association errors leading to blacklisting of the network -->
+ <integer translatable="false" name="config_wifi_framework_max_connection_errors_to_blacklist">4</integer>
+
+ <!-- Integer indicating number of authentication errors leading to blacklisting of the network -->
+ <integer translatable="false" name="config_wifi_framework_max_auth_errors_to_blacklist">4</integer>
+
+ <!-- Integer indicating minimum blacklisting delay of a wofo configuration due to connectin or auth errors -->
+ <integer translatable="false" name="config_wifi_framework_network_black_list_min_time_milli">120000</integer>
+
<!-- Boolean indicating associated scan are allowed -->
<bool translatable="false" name="config_wifi_framework_enable_associated_autojoin_scan">true</bool>
@@ -992,9 +1003,11 @@
<!-- 2 means give warning -->
<integer name="config_datause_notification_type">2</integer>
- <!-- If Voice Radio Technology is RIL_RADIO_TECHNOLOGY_LTE:14 this is the value
- that should be used instead. A value of RIL_RADIO_TECHNOLOGY_UNKNOWN:0 means
- there is no replacement value and VoLTE is assumed to be supported -->
+ <!-- If Voice Radio Technology is RIL_RADIO_TECHNOLOGY_LTE:14 or
+ RIL_RADIO_TECHNOLOGY_UNKNOWN:0 this is the value that should be used instead.
+ A configuration value of RIL_RADIO_TECHNOLOGY_UNKNOWN:0 means
+ there is no replacement value and that the default assumption
+ for phone type (GSM) should be used. -->
<integer name="config_volte_replacement_rat">0</integer>
<!-- Flag indicating whether the current device is "voice capable".
@@ -1791,7 +1804,7 @@
<item>SUPL_PORT=7275</item>
<item>NTP_SERVER=north-america.pool.ntp.org</item>
<item>SUPL_VER=0x20000</item>
- <item>SUPL_MODE=0x01</item>
+ <item>SUPL_MODE=1</item>
</string-array>
<!-- If there is no preload VM number in the sim card, carriers such as
@@ -1833,4 +1846,9 @@
<item>71610</item>
<item>732101</item>
</string-array>
+
+ <!-- Config determines whether to update phone object when voice registration
+ state changes. Voice radio tech change will always trigger an update of
+ phone object irrespective of this config -->
+ <bool name="config_switch_phone_on_voice_reg_state_change">true</bool>
</resources>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index a794b62..8ebcd6d 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2583,4 +2583,13 @@
<public type="raw" name="loaderror" id="0x01100000" />
<!-- WebView error page for when domain lookup fails. @hide @SystemApi -->
<public type="raw" name="nodomain" id="0x01100001" />
+
+ <!-- ===============================================================
+ Insert space from public API 21 attributes to private attributes
+ =============================================================== -->
+ <eat-comment />
+
+ <!-- @hide -->
+ <public-padding type="attr" name="private_resource_pad" end="0x01010500" />
+
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 50da1fa..fd4b40f 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -4409,17 +4409,6 @@
<!-- Title text to append when the display is secure. [CHAR LIMIT=30] -->
<string name="display_manager_overlay_display_secure_suffix">, secure</string>
- <!-- Title of the notification to indicate the process of connecting to a wifi display. [CHAR LIMIT=50] -->
- <string name="wifi_display_notification_connecting_title">Casting screen</string>
- <!-- Message of the notification to indicate the process of connecting to a wifi display. [CHAR LIMIT=80] -->
- <string name="wifi_display_notification_connecting_message">Connecting to <xliff:g id="name">%1$s</xliff:g></string>
- <!-- Title of the notification to indicate an active wifi display connection. [CHAR LIMIT=50] -->
- <string name="wifi_display_notification_connected_title">Casting screen</string>
- <!-- Message of the notification to indicate an active wifi display connection. [CHAR LIMIT=80] -->
- <string name="wifi_display_notification_connected_message">Connected to <xliff:g id="name">%1$s</xliff:g></string>
- <!-- Label of a button to disconnect an active wifi display connection. [CHAR LIMIT=25] -->
- <string name="wifi_display_notification_disconnect">Disconnect</string>
-
<!-- Keyguard strings -->
<!-- Label shown on emergency call button in keyguard -->
<string name="kg_emergency_call_label">Emergency call</string>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index c580d26..2620c27 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -322,6 +322,8 @@
<java-symbol type="integer" name="config_wifi_framework_wifi_score_bad_link_speed_5" />
<java-symbol type="integer" name="config_wifi_framework_wifi_score_good_link_speed_24" />
<java-symbol type="integer" name="config_wifi_framework_wifi_score_good_link_speed_5" />
+ <java-symbol type="string" name="config_wifi_random_mac_oui" />
+
<java-symbol type="bool" name="editable_voicemailnumber" />
<java-symbol type="bool" name="config_wifi_framework_cellular_handover_enable_user_triggered_adjustment" />
@@ -330,7 +332,10 @@
<java-symbol type="integer" name="config_wifi_framework_associated_partial_scan_tx_packet_threshold" />
<java-symbol type="integer" name="config_wifi_framework_associated_partial_scan_rx_packet_threshold" />
<java-symbol type="integer" name="config_wifi_framework_network_switch_tx_packet_threshold" />
- <java-symbol type="integer" name="config_wifi_framework_network_switch_tx_packet_threshold" />
+ <java-symbol type="integer" name="config_wifi_framework_network_switch_rx_packet_threshold" />
+ <java-symbol type="integer" name="config_wifi_framework_max_connection_errors_to_blacklist" />
+ <java-symbol type="integer" name="config_wifi_framework_max_auth_errors_to_blacklist" />
+ <java-symbol type="integer" name="config_wifi_framework_network_black_list_min_time_milli" />
<java-symbol type="integer" name="config_bluetooth_max_advertisers" />
<java-symbol type="integer" name="config_bluetooth_max_scan_filters" />
<java-symbol type="integer" name="config_cursorWindowSize" />
@@ -1185,8 +1190,6 @@
<java-symbol type="drawable" name="ic_media_route_off_holo_dark" />
<java-symbol type="drawable" name="ic_media_route_connecting_holo_dark" />
<java-symbol type="drawable" name="ic_media_route_disabled_holo_dark" />
- <java-symbol type="drawable" name="ic_notification_cast_connecting" />
- <java-symbol type="drawable" name="ic_notification_cast_on" />
<java-symbol type="drawable" name="cling_button" />
<java-symbol type="drawable" name="cling_arrow_up" />
<java-symbol type="drawable" name="cling_bg" />
@@ -1723,11 +1726,6 @@
<java-symbol type="string" name="vpn_lockdown_error" />
<java-symbol type="string" name="vpn_lockdown_config" />
<java-symbol type="string" name="wallpaper_binding_label" />
- <java-symbol type="string" name="wifi_display_notification_connecting_title" />
- <java-symbol type="string" name="wifi_display_notification_connecting_message" />
- <java-symbol type="string" name="wifi_display_notification_connected_title" />
- <java-symbol type="string" name="wifi_display_notification_connected_message" />
- <java-symbol type="string" name="wifi_display_notification_disconnect" />
<java-symbol type="style" name="Theme.Dialog.AppError" />
<java-symbol type="style" name="Theme.Micro.Dialog.Alert" />
<java-symbol type="style" name="Theme.Leanback.Dialog.Alert" />
@@ -2068,4 +2066,5 @@
<java-symbol type="array" name="dial_string_replace" />
<java-symbol type="bool" name="config_restart_radio_on_pdp_fail_regular_deactivation" />
<java-symbol type="array" name="networks_not_clear_data" />
+ <java-symbol type="bool" name="config_switch_phone_on_voice_reg_state_change" />
</resources>
diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml
index 7b0efd9..3c2e302 100644
--- a/core/res/res/values/themes_material.xml
+++ b/core/res/res/values/themes_material.xml
@@ -771,8 +771,6 @@
<item name="textCheckMark">@drawable/indicator_check_mark_light</item>
<item name="textCheckMarkInverse">@drawable/indicator_check_mark_dark</item>
- <item name="windowBackground">@color/background_material_light</item>
-
<item name="fastScrollPreviewBackgroundLeft">@drawable/fastscroll_label_left_holo_light</item>
<item name="fastScrollPreviewBackgroundRight">@drawable/fastscroll_label_right_holo_light</item>
@@ -809,8 +807,6 @@
<item name="textCheckMark">@drawable/indicator_check_mark_dark</item>
<item name="textCheckMarkInverse">@drawable/indicator_check_mark_light</item>
- <item name="windowBackground">@color/background_material_dark</item>
-
<item name="fastScrollPreviewBackgroundLeft">@drawable/fastscroll_label_left_holo_dark</item>
<item name="fastScrollPreviewBackgroundRight">@drawable/fastscroll_label_right_holo_dark</item>
@@ -1227,6 +1223,7 @@
<!-- Default theme for Settings and activities launched from Settings. -->
<style name="Theme.Material.Settings" parent="Theme.Material.Light.DarkActionBar">
+ <item name="colorBackground">@color/white</item>
<item name="colorPrimary">@color/material_blue_grey_900</item>
<item name="colorPrimaryDark">@color/material_blue_grey_950</item>
<item name="colorAccent">@color/material_deep_teal_500</item>
@@ -1239,6 +1236,7 @@
</style>
<style name="Theme.Material.Settings.BaseDialog" parent="Theme.Material.Light.BaseDialog">
+ <item name="colorBackground">@color/white</item>
<item name="colorPrimary">@color/material_blue_grey_900</item>
<item name="colorPrimaryDark">@color/material_blue_grey_950</item>
<item name="colorAccent">@color/material_deep_teal_500</item>
@@ -1247,6 +1245,7 @@
<style name="Theme.Material.Settings.Dialog" parent="Theme.Material.Settings.BaseDialog" />
<style name="Theme.Material.Settings.Dialog.BaseAlert" parent="Theme.Material.Light.Dialog.BaseAlert">
+ <item name="colorBackground">@color/white</item>
<item name="colorPrimary">@color/material_blue_grey_900</item>
<item name="colorPrimaryDark">@color/material_blue_grey_950</item>
<item name="colorAccent">@color/material_deep_teal_500</item>
@@ -1255,18 +1254,21 @@
<style name="Theme.Material.Settings.Dialog.Alert" parent="Theme.Material.Settings.Dialog.BaseAlert" />
<style name="Theme.Material.Settings.Dialog.Presentation" parent="Theme.Material.Light.Dialog.Presentation">
+ <item name="colorBackground">@color/white</item>
<item name="colorPrimary">@color/material_blue_grey_900</item>
<item name="colorPrimaryDark">@color/material_blue_grey_950</item>
<item name="colorAccent">@color/material_deep_teal_500</item>
</style>
<style name="Theme.Material.Settings.SearchBar" parent="Theme.Material.Light.SearchBar">
+ <item name="colorBackground">@color/white</item>
<item name="colorPrimary">@color/material_blue_grey_900</item>
<item name="colorPrimaryDark">@color/material_blue_grey_950</item>
<item name="colorAccent">@color/material_deep_teal_500</item>
</style>
<style name="Theme.Material.Settings.CompactMenu" parent="Theme.Material.Light.CompactMenu">
+ <item name="colorBackground">@color/white</item>
<item name="colorPrimary">@color/material_blue_grey_900</item>
<item name="colorPrimaryDark">@color/material_blue_grey_950</item>
<item name="colorAccent">@color/material_deep_teal_500</item>
diff --git a/data/keyboards/Vendor_0b05_Product_4500.kl b/data/keyboards/Vendor_0b05_Product_4500.kl
new file mode 100644
index 0000000..a7d519e
--- /dev/null
+++ b/data/keyboards/Vendor_0b05_Product_4500.kl
@@ -0,0 +1,42 @@
+# Copyright (C) 2014 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Asus Gamepad
+
+key 304 BUTTON_A
+key 305 BUTTON_B
+key 307 BUTTON_X
+key 308 BUTTON_Y
+key 310 BUTTON_L1
+key 311 BUTTON_R1
+key 316 BUTTON_MODE
+key 317 BUTTON_THUMBL
+key 318 BUTTON_THUMBR
+
+key 158 BACK
+key 172 HOME
+
+axis 0x00 X
+axis 0x01 Y
+axis 0x02 Z
+axis 0x05 RZ
+axis 0x09 RTRIGGER
+axis 0x0a LTRIGGER
+axis 0x10 HAT_X
+axis 0x11 HAT_Y
+
+led 0x00 CONTROLLER_1
+led 0x01 CONTROLLER_2
+led 0x02 CONTROLLER_3
+led 0x03 CONTROLLER_4
diff --git a/docs/html/app.yaml b/docs/html/app.yaml
index 9ffb775..520ee99 100644
--- a/docs/html/app.yaml
+++ b/docs/html/app.yaml
@@ -1,38 +1,25 @@
application: androidappdocs-staging
version: 1
-runtime: python
+runtime: python27
+threadsafe: true
api_version: 1
+# compatibility: gae-1.9.4+
-# This file defines two mutually exclusive
-# hander blocks:
-# - a handler for use on a local dev_appserver
-# during development or non-production doc build
-# - a handler for use on a production gae
-# instance. This handler requires that the
-# docs files in the app have been compressed
-# with divide_and_compress.py and that main.py
-# and gae_shell/ are present.
-#
-# Only one of the handler blocks should be
-# uncommented at any given time. By default,
-# the development handler is exposed.
+# handler for local staging servers
+# WARNING: NOT FOR USE IN PRODUCTION
+
+# Use this handler definition with
+# Google App Engine 1.9.4 or higher.
+# NOT compatible with prior GAE versions
handlers:
# DEVELOPMENT HANDLER
-# (this handler block *must* be commented
-# out before pushing to a production server)
-- url: /
- static_dir: /
+- url: /(.+)
+ static_files: \1
+ upload: (.+)
-# PRODUCTION GAE HANDLER
-#- url: /gae_shell/static
-# static_dir: gae_shell/static
-# expiration: 1d
-#
-#- url: /gae_shell/.*
-# script: /gae_shell/shell.py
-# login: admin
-#
-#- url: .*
-# script: main.py
+# Direct default, blank requests
+- url: /
+ static_files: index.html
+ upload: index.html
\ No newline at end of file
diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
index 49e8b9d..df1b126 100644
--- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
@@ -137,8 +137,7 @@
private boolean mMutated;
public AnimatedVectorDrawable() {
- mAnimatedVectorState = new AnimatedVectorDrawableState(
- new AnimatedVectorDrawableState(null));
+ mAnimatedVectorState = new AnimatedVectorDrawableState(null);
}
private AnimatedVectorDrawable(AnimatedVectorDrawableState state, Resources res,
@@ -160,10 +159,16 @@
@Override
public ConstantState getConstantState() {
+ mAnimatedVectorState.mChangingConfigurations = getChangingConfigurations();
return mAnimatedVectorState;
}
@Override
+ public int getChangingConfigurations() {
+ return super.getChangingConfigurations() | mAnimatedVectorState.mChangingConfigurations;
+ }
+
+ @Override
public void draw(Canvas canvas) {
mAnimatedVectorState.mVectorDrawable.draw(canvas);
if (isStarted()) {
@@ -347,6 +352,8 @@
mTargetNameMap.put(animClone, targetName);
}
}
+ } else {
+ mVectorDrawable = new VectorDrawable();
}
}
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index ace5eab..bbb0b50 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -1456,12 +1456,12 @@
/* Setters and Getters, used by animator from AnimatedVectorDrawable. */
@SuppressWarnings("unused")
- int getStroke() {
+ int getStrokeColor() {
return mStrokeColor;
}
@SuppressWarnings("unused")
- void setStroke(int strokeColor) {
+ void setStrokeColor(int strokeColor) {
mStrokeColor = strokeColor;
}
@@ -1476,32 +1476,32 @@
}
@SuppressWarnings("unused")
- float getstrokeAlpha() {
+ float getStrokeAlpha() {
return mStrokeAlpha;
}
@SuppressWarnings("unused")
- void setstrokeAlpha(float strokeAlpha) {
+ void setStrokeAlpha(float strokeAlpha) {
mStrokeAlpha = strokeAlpha;
}
@SuppressWarnings("unused")
- int getFill() {
+ int getFillColor() {
return mFillColor;
}
@SuppressWarnings("unused")
- void setFill(int fillColor) {
+ void setFillColor(int fillColor) {
mFillColor = fillColor;
}
@SuppressWarnings("unused")
- float getfillAlpha() {
+ float getFillAlpha() {
return mFillAlpha;
}
@SuppressWarnings("unused")
- void setfillAlpha(float fillAlpha) {
+ void setFillAlpha(float fillAlpha) {
mFillAlpha = fillAlpha;
}
diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java
index 56fa546..25dfee6 100644
--- a/media/java/android/media/AudioAttributes.java
+++ b/media/java/android/media/AudioAttributes.java
@@ -194,8 +194,17 @@
*/
public final static int FLAG_HW_AV_SYNC = 0x1 << 4;
+ /**
+ * @hide
+ * Flag requesting capture from the source used for hardware hotword detection.
+ * To be used with capture preset MediaRecorder.AudioSource.HOTWORD or
+ * MediaRecorder.AudioSource.VOICE_RECOGNITION.
+ */
+ @SystemApi
+ public final static int FLAG_HW_HOTWORD = 0x1 << 5;
+
private final static int FLAG_ALL = FLAG_AUDIBILITY_ENFORCED | FLAG_SECURE | FLAG_SCO |
- FLAG_BEACON | FLAG_HW_AV_SYNC;
+ FLAG_BEACON | FLAG_HW_AV_SYNC | FLAG_HW_HOTWORD;
private final static int FLAG_ALL_PUBLIC = FLAG_AUDIBILITY_ENFORCED | FLAG_HW_AV_SYNC;
private int mUsage = USAGE_UNKNOWN;
diff --git a/media/java/android/media/CamcorderProfile.java b/media/java/android/media/CamcorderProfile.java
index 5651fc9..9609c35 100644
--- a/media/java/android/media/CamcorderProfile.java
+++ b/media/java/android/media/CamcorderProfile.java
@@ -337,6 +337,24 @@
/**
* Returns true if camcorder profile exists for the first back-facing
* camera at the given quality level.
+ *
+ * <p>
+ * When using the Camera 2 API in {@code LEGACY} mode (i.e. when
+ * {@link android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL} is set
+ * to
+ * {@link android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY}),
+ * {@link #hasProfile} may return {@code true} for unsupported resolutions. To ensure a
+ * a given resolution is supported in LEGACY mode, the configuration given in
+ * {@link android.hardware.camera2.CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP}
+ * must contain the the resolution in the supported output sizes. The recommended way to check
+ * this is with
+ * {@link android.hardware.camera2.params.StreamConfigurationMap#getOutputSizes(Class)} with the
+ * class of the desired recording endpoint, and check that the desired resolution is contained
+ * in the list returned.
+ * </p>
+ * @see android.hardware.camera2.CameraManager
+ * @see android.hardware.camera2.CameraCharacteristics
+ *
* @param quality the target quality level for the camcorder profile
*/
public static boolean hasProfile(int quality) {
@@ -354,6 +372,24 @@
/**
* Returns true if camcorder profile exists for the given camera at
* the given quality level.
+ *
+ * <p>
+ * When using the Camera 2 API in LEGACY mode (i.e. when
+ * {@link android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL} is set
+ * to
+ * {@link android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY}),
+ * {@link #hasProfile} may return {@code true} for unsupported resolutions. To ensure a
+ * a given resolution is supported in LEGACY mode, the configuration given in
+ * {@link android.hardware.camera2.CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP}
+ * must contain the the resolution in the supported output sizes. The recommended way to check
+ * this is with
+ * {@link android.hardware.camera2.params.StreamConfigurationMap#getOutputSizes(Class)} with the
+ * class of the desired recording endpoint, and check that the desired resolution is contained
+ * in the list returned.
+ * </p>
+ * @see android.hardware.camera2.CameraManager
+ * @see android.hardware.camera2.CameraCharacteristics
+ *
* @param cameraId the id for the camera
* @param quality the target quality level for the camcorder profile
*/
diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java
index b786f94..b541454 100644
--- a/media/java/android/media/ImageReader.java
+++ b/media/java/android/media/ImageReader.java
@@ -642,7 +642,7 @@
private void createSurfacePlanes() {
mPlanes = new SurfacePlane[ImageReader.this.mNumPlanes];
for (int i = 0; i < ImageReader.this.mNumPlanes; i++) {
- mPlanes[i] = nativeCreatePlane(i);
+ mPlanes[i] = nativeCreatePlane(i, ImageReader.this.mFormat);
}
}
private class SurfacePlane extends android.media.Image.Plane {
@@ -661,7 +661,8 @@
if (mBuffer != null) {
return mBuffer;
} else {
- mBuffer = SurfaceImage.this.nativeImageGetBuffer(mIndex);
+ mBuffer = SurfaceImage.this.nativeImageGetBuffer(mIndex,
+ ImageReader.this.mFormat);
// Set the byteBuffer order according to host endianness (native order),
// otherwise, the byteBuffer order defaults to ByteOrder.BIG_ENDIAN.
return mBuffer.order(ByteOrder.nativeOrder());
@@ -711,8 +712,8 @@
private SurfacePlane[] mPlanes;
private boolean mIsImageValid;
- private synchronized native ByteBuffer nativeImageGetBuffer(int idx);
- private synchronized native SurfacePlane nativeCreatePlane(int idx);
+ private synchronized native ByteBuffer nativeImageGetBuffer(int idx, int readerFormat);
+ private synchronized native SurfacePlane nativeCreatePlane(int idx, int readerFormat);
}
private synchronized native void nativeInit(Object weakSelf, int w, int h,
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index 2ef9289..420510a 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -709,10 +709,10 @@
}
/**
- * Retrieve a human readable diagnostic information string
- * associated with the exception. DO NOT SHOW THIS TO END-USERS!
- * This string will not be localized or generally comprehensible
- * to end-users.
+ * Retrieve a developer-readable diagnostic information string
+ * associated with the exception. Do not show this to end-users,
+ * since this string will not be localized or generally
+ * comprehensible to end-users.
*/
public String getDiagnosticInfo() {
return mDiagnosticInfo;
@@ -827,8 +827,13 @@
invalidateByteBuffer(mCachedInputBuffers, index);
mDequeuedInputBuffers.remove(index);
}
- native_queueInputBuffer(
- index, offset, size, presentationTimeUs, flags);
+ try {
+ native_queueInputBuffer(
+ index, offset, size, presentationTimeUs, flags);
+ } catch (CryptoException | IllegalStateException e) {
+ revalidateByteBuffer(mCachedInputBuffers, index);
+ throw e;
+ }
}
private native final void native_queueInputBuffer(
@@ -947,8 +952,13 @@
invalidateByteBuffer(mCachedInputBuffers, index);
mDequeuedInputBuffers.remove(index);
}
- native_queueSecureInputBuffer(
- index, offset, info, presentationTimeUs, flags);
+ try {
+ native_queueSecureInputBuffer(
+ index, offset, info, presentationTimeUs, flags);
+ } catch (CryptoException | IllegalStateException e) {
+ revalidateByteBuffer(mCachedInputBuffers, index);
+ throw e;
+ }
}
private native final void native_queueSecureInputBuffer(
@@ -1270,6 +1280,18 @@
}
}
+ private final void revalidateByteBuffer(
+ ByteBuffer[] buffers, int index) {
+ synchronized(mBufferLock) {
+ if (buffers != null && index >= 0 && index < buffers.length) {
+ ByteBuffer buffer = buffers[index];
+ if (buffer != null) {
+ buffer.setAccessible(true);
+ }
+ }
+ }
+ }
+
private final void validateOutputByteBuffer(
ByteBuffer[] buffers, int index, BufferInfo info) {
if (buffers != null && index >= 0 && index < buffers.length) {
@@ -1307,7 +1329,7 @@
}
private final void freeAllTrackedBuffers() {
- synchronized (mBufferLock) {
+ synchronized(mBufferLock) {
freeByteBuffers(mCachedInputBuffers);
freeByteBuffers(mCachedOutputBuffers);
mCachedInputBuffers = null;
diff --git a/media/java/android/media/MediaCodecList.java b/media/java/android/media/MediaCodecList.java
index 0dcbd65..bb848d9 100644
--- a/media/java/android/media/MediaCodecList.java
+++ b/media/java/android/media/MediaCodecList.java
@@ -204,7 +204,7 @@
* requests, or {@code null} if no such codec has been found.
*/
public final String findEncoderForFormat(MediaFormat format) {
- return findCodecForFormat(false /* encoder */, format);
+ return findCodecForFormat(true /* encoder */, format);
}
private String findCodecForFormat(boolean encoder, MediaFormat format) {
diff --git a/media/java/android/media/MediaDrm.java b/media/java/android/media/MediaDrm.java
index 1490732..3b8cb19 100644
--- a/media/java/android/media/MediaDrm.java
+++ b/media/java/android/media/MediaDrm.java
@@ -190,6 +190,9 @@
private final int mErrorCode;
private final String mDiagnosticInfo;
+ /**
+ * @hide
+ */
public MediaDrmStateException(int errorCode, String detailMessage) {
super(detailMessage);
mErrorCode = errorCode;
@@ -211,9 +214,9 @@
}
/**
- * Retrieve a human readable diagnostic information string
- * associated with the exception. DO NOT SHOW THIS TO END-USERS!
- * This string will not be localized or generally comprehensible
+ * Retrieve a developer-readable diagnostic information string
+ * associated with the exception. Do not show this to end-users,
+ * since this string will not be localized or generally comprehensible
* to end-users.
*/
public String getDiagnosticInfo() {
diff --git a/media/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java
index be86741..cfbf3af 100644
--- a/media/java/android/media/session/MediaController.java
+++ b/media/java/android/media/session/MediaController.java
@@ -434,6 +434,14 @@
return mSessionBinder;
}
+ /**
+ * @hide
+ */
+ public boolean controlsSameSession(MediaController other) {
+ if (other == null) return false;
+ return mSessionBinder.asBinder() == other.getSessionBinder().asBinder();
+ }
+
private void addCallbackLocked(Callback cb, Handler handler) {
if (getHandlerForCallbackLocked(cb) != null) {
Log.w(TAG, "Callback is already added, ignoring");
diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp
index fa4439d..a7347745 100644
--- a/media/jni/android_media_ImageReader.cpp
+++ b/media/jni/android_media_ImageReader.cpp
@@ -317,8 +317,18 @@
return size;
}
+static int32_t applyFormatOverrides(int32_t bufferFormat, int32_t readerCtxFormat)
+{
+ // Using HAL_PIXEL_FORMAT_RGBA_8888 gralloc buffers containing JPEGs to get around SW
+ // write limitations for some platforms (b/17379185).
+ if (readerCtxFormat == HAL_PIXEL_FORMAT_BLOB && bufferFormat == HAL_PIXEL_FORMAT_RGBA_8888) {
+ return HAL_PIXEL_FORMAT_BLOB;
+ }
+ return bufferFormat;
+}
+
static void Image_getLockedBufferInfo(JNIEnv* env, CpuConsumer::LockedBuffer* buffer, int idx,
- uint8_t **base, uint32_t *size)
+ uint8_t **base, uint32_t *size, int32_t readerFormat)
{
ALOG_ASSERT(buffer != NULL, "Input buffer is NULL!!!");
ALOG_ASSERT(base != NULL, "base is NULL!!!");
@@ -334,6 +344,8 @@
dataSize = ySize = cSize = cStride = 0;
int32_t fmt = buffer->format;
+
+ fmt = applyFormatOverrides(fmt, readerFormat);
switch (fmt) {
case HAL_PIXEL_FORMAT_YCbCr_420_888:
pData =
@@ -458,7 +470,8 @@
*size = dataSize;
}
-static jint Image_imageGetPixelStride(JNIEnv* env, CpuConsumer::LockedBuffer* buffer, int idx)
+static jint Image_imageGetPixelStride(JNIEnv* env, CpuConsumer::LockedBuffer* buffer, int idx,
+ int32_t readerFormat)
{
ALOGV("%s: buffer index: %d", __FUNCTION__, idx);
ALOG_ASSERT((idx < IMAGE_READER_MAX_NUM_PLANES) && (idx >= 0), "Index is out of range:%d", idx);
@@ -467,6 +480,9 @@
ALOG_ASSERT(buffer != NULL, "buffer is NULL");
int32_t fmt = buffer->format;
+
+ fmt = applyFormatOverrides(fmt, readerFormat);
+
switch (fmt) {
case HAL_PIXEL_FORMAT_YCbCr_420_888:
pixelStride = (idx == 0) ? 1 : buffer->chromaStep;
@@ -515,7 +531,8 @@
return pixelStride;
}
-static jint Image_imageGetRowStride(JNIEnv* env, CpuConsumer::LockedBuffer* buffer, int idx)
+static jint Image_imageGetRowStride(JNIEnv* env, CpuConsumer::LockedBuffer* buffer, int idx,
+ int32_t readerFormat)
{
ALOGV("%s: buffer index: %d", __FUNCTION__, idx);
ALOG_ASSERT((idx < IMAGE_READER_MAX_NUM_PLANES) && (idx >= 0));
@@ -525,6 +542,8 @@
int32_t fmt = buffer->format;
+ fmt = applyFormatOverrides(fmt, readerFormat);
+
switch (fmt) {
case HAL_PIXEL_FORMAT_YCbCr_420_888:
rowStride = (idx == 0) ? buffer->stride : buffer->chromaStride;
@@ -777,9 +796,10 @@
outputHeight = buffer->crop.getHeight();
}
+ int imgReaderFmt = ctx->getBufferFormat();
int imageReaderWidth = ctx->getBufferWidth();
int imageReaderHeight = ctx->getBufferHeight();
- if ((buffer->format != HAL_PIXEL_FORMAT_BLOB) &&
+ if ((buffer->format != HAL_PIXEL_FORMAT_BLOB) && (imgReaderFmt != HAL_PIXEL_FORMAT_BLOB) &&
(imageReaderWidth != outputWidth || imageReaderHeight > outputHeight)) {
/**
* For video decoder, the buffer height is actually the vertical stride,
@@ -795,15 +815,19 @@
return -1;
}
- int imgReaderFmt = ctx->getBufferFormat();
int bufFmt = buffer->format;
if (imgReaderFmt != bufFmt) {
- // Special casing for when producer switches to a format compatible with flexible YUV
- // (HAL_PIXEL_FORMAT_YCbCr_420_888).
+
if (imgReaderFmt == HAL_PIXEL_FORMAT_YCbCr_420_888 && (bufFmt ==
HAL_PIXEL_FORMAT_YCrCb_420_SP || bufFmt == HAL_PIXEL_FORMAT_YV12)) {
+ // Special casing for when producer switches to a format compatible with flexible YUV
+ // (HAL_PIXEL_FORMAT_YCbCr_420_888).
ctx->setBufferFormat(bufFmt);
- ALOGV("%s: Overriding buffer format YUV_420_888 to %x.", __FUNCTION__, bufFmt);
+ ALOGD("%s: Overriding buffer format YUV_420_888 to %x.", __FUNCTION__, bufFmt);
+ } else if (imgReaderFmt == HAL_PIXEL_FORMAT_BLOB && bufFmt == HAL_PIXEL_FORMAT_RGBA_8888) {
+ // Using HAL_PIXEL_FORMAT_RGBA_8888 gralloc buffers containing JPEGs to get around SW
+ // write limitations for (b/17379185).
+ ALOGD("%s: Receiving JPEG in HAL_PIXEL_FORMAT_RGBA_8888 buffer.", __FUNCTION__);
} else {
// Return the buffer to the queue.
consumer->unlockBuffer(*buffer);
@@ -843,7 +867,7 @@
return android_view_Surface_createFromIGraphicBufferProducer(env, gbp);
}
-static jobject Image_createSurfacePlane(JNIEnv* env, jobject thiz, int idx)
+static jobject Image_createSurfacePlane(JNIEnv* env, jobject thiz, int idx, int readerFormat)
{
int rowStride, pixelStride;
ALOGV("%s: buffer index: %d", __FUNCTION__, idx);
@@ -854,8 +878,11 @@
if (buffer == NULL) {
jniThrowException(env, "java/lang/IllegalStateException", "Image was released");
}
- rowStride = Image_imageGetRowStride(env, buffer, idx);
- pixelStride = Image_imageGetPixelStride(env, buffer, idx);
+
+ readerFormat = Image_getPixelFormat(env, readerFormat);
+
+ rowStride = Image_imageGetRowStride(env, buffer, idx, readerFormat);
+ pixelStride = Image_imageGetPixelStride(env, buffer, idx, readerFormat);
jobject surfPlaneObj = env->NewObject(gSurfacePlaneClassInfo.clazz,
gSurfacePlaneClassInfo.ctor, thiz, idx, rowStride, pixelStride);
@@ -863,7 +890,7 @@
return surfPlaneObj;
}
-static jobject Image_getByteBuffer(JNIEnv* env, jobject thiz, int idx)
+static jobject Image_getByteBuffer(JNIEnv* env, jobject thiz, int idx, int readerFormat)
{
uint8_t *base = NULL;
uint32_t size = 0;
@@ -877,8 +904,10 @@
jniThrowException(env, "java/lang/IllegalStateException", "Image was released");
}
+ readerFormat = Image_getPixelFormat(env, readerFormat);
+
// Create byteBuffer from native buffer
- Image_getLockedBufferInfo(env, buffer, idx, &base, &size);
+ Image_getLockedBufferInfo(env, buffer, idx, &base, &size, readerFormat);
if (size > static_cast<uint32_t>(INT32_MAX)) {
// Byte buffer have 'int capacity', so check the range
@@ -910,8 +939,8 @@
};
static JNINativeMethod gImageMethods[] = {
- {"nativeImageGetBuffer", "(I)Ljava/nio/ByteBuffer;", (void*)Image_getByteBuffer },
- {"nativeCreatePlane", "(I)Landroid/media/ImageReader$SurfaceImage$SurfacePlane;",
+ {"nativeImageGetBuffer", "(II)Ljava/nio/ByteBuffer;", (void*)Image_getByteBuffer },
+ {"nativeCreatePlane", "(II)Landroid/media/ImageReader$SurfaceImage$SurfacePlane;",
(void*)Image_createSurfacePlane },
};
diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java b/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java
index f779f87..85b2490 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java
@@ -125,7 +125,7 @@
if (mLastRenderSpec == null) {
mScheduledPreloadFirstShownPage = firstShownPage;
mScheduledPreloadLastShownPage = lastShownPage;
- } else {
+ } else if (mState == STATE_OPENED) {
mRenderer.startPreload(firstShownPage, lastShownPage, mLastRenderSpec);
}
}
@@ -412,8 +412,6 @@
}
private static final class AsyncRenderer implements ServiceConnection {
- private static final int MALFORMED_PDF_FILE_ERROR = -2;
-
private final Object mLock = new Object();
private final Context mContext;
@@ -486,7 +484,7 @@
return mRenderer.openDocument(source);
} catch (RemoteException re) {
Log.e(LOG_TAG, "Cannot open PDF document");
- return MALFORMED_PDF_FILE_ERROR;
+ return PdfManipulationService.MALFORMED_PDF_FILE_ERROR;
} finally {
// Close the fd as we passed it to another process
// which took ownership.
@@ -497,7 +495,7 @@
@Override
public void onPostExecute(Integer pageCount) {
- if (pageCount == MALFORMED_PDF_FILE_ERROR) {
+ if (pageCount == PdfManipulationService.MALFORMED_PDF_FILE_ERROR) {
mOnMalformedPdfFileListener.onMalformedPdfFile();
mPageCount = PrintDocumentInfo.PAGE_COUNT_UNKNOWN;
} else {
diff --git a/packages/PrintSpooler/src/com/android/printspooler/renderer/PdfManipulationService.java b/packages/PrintSpooler/src/com/android/printspooler/renderer/PdfManipulationService.java
index 62716b2..00e5051 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/renderer/PdfManipulationService.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/renderer/PdfManipulationService.java
@@ -47,6 +47,8 @@
public static final String ACTION_GET_EDITOR =
"com.android.printspooler.renderer.ACTION_GET_EDITOR";
+ public static final int MALFORMED_PDF_FILE_ERROR = -2;
+
private static final String LOG_TAG = "PdfManipulationService";
private static final boolean DEBUG = false;
@@ -88,7 +90,7 @@
} catch (IOException|IllegalStateException e) {
IoUtils.closeQuietly(source);
Log.e(LOG_TAG, "Cannot open file", e);
- throw new RemoteException(e.toString());
+ return MALFORMED_PDF_FILE_ERROR;
}
}
}
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java
index 20e774f..fbf7204 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java
@@ -312,10 +312,6 @@
+ ", pageIndexInFile: " + pageIndexInFile);
}
- if (provider != null && provider.getPageIndex() != pageIndexInFile) {
- mPageContentRepository.releasePageContentProvider(provider);
- }
-
provider = mPageContentRepository.acquirePageContentProvider(
pageIndexInFile, content);
mBoundPagesInAdapter.put(position, null);
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
index 56497d7..aa42c75 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
@@ -471,10 +471,6 @@
requestCreatePdfFileOrFinish();
} break;
- case STATE_PRINT_CANCELED: {
- doFinish();
- } break;
-
default: {
updatePrintPreviewController(document.changed);
@@ -2393,6 +2389,7 @@
if (tempFile != null) {
tempFile.delete();
}
+ mFileProvider.releaseFile();
}
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 30ccd2c..ba5d11d 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -56,6 +56,7 @@
import android.os.UserManager;
import android.provider.MediaStore;
import android.provider.Settings;
+import android.provider.Settings.Secure;
import android.text.TextUtils;
import android.util.Log;
import android.util.LruCache;
@@ -689,19 +690,30 @@
// Get methods
if (Settings.CALL_METHOD_GET_SYSTEM.equals(method)) {
if (LOCAL_LOGV) Slog.v(TAG, "call(system:" + request + ") for " + callingUser);
- if (isManagedProfile(callingUser) && sSystemCloneToManagedKeys.contains(request)) {
- callingUser = UserHandle.USER_OWNER;
+ // Check if this request should be (re)directed to the primary user's db
+ if (callingUser == UserHandle.USER_OWNER
+ || shouldShadowParentProfile(callingUser, sSystemCloneToManagedKeys, request)) {
+ dbHelper = getOrEstablishDatabase(UserHandle.USER_OWNER);
+ } else {
+ dbHelper = getOrEstablishDatabase(callingUser);
}
- dbHelper = getOrEstablishDatabase(callingUser);
cache = sSystemCaches.get(callingUser);
return lookupValue(dbHelper, TABLE_SYSTEM, cache, request);
}
if (Settings.CALL_METHOD_GET_SECURE.equals(method)) {
if (LOCAL_LOGV) Slog.v(TAG, "call(secure:" + request + ") for " + callingUser);
- if (isManagedProfile(callingUser) && sSecureCloneToManagedKeys.contains(request)) {
- callingUser = UserHandle.USER_OWNER;
+ // Check if this is a setting to be copied from the primary user
+ if (shouldShadowParentProfile(callingUser, sSecureCloneToManagedKeys, request)) {
+ // If the request if for location providers and there's a restriction, return none
+ if (Secure.LOCATION_PROVIDERS_ALLOWED.equals(request)
+ && mUserManager.hasUserRestriction(
+ UserManager.DISALLOW_SHARE_LOCATION, new UserHandle(callingUser))) {
+ return sSecureCaches.get(callingUser).putIfAbsent(request, "");
+ }
+ dbHelper = getOrEstablishDatabase(UserHandle.USER_OWNER);
+ } else {
+ dbHelper = getOrEstablishDatabase(callingUser);
}
- dbHelper = getOrEstablishDatabase(callingUser);
cache = sSecureCaches.get(callingUser);
return lookupValue(dbHelper, TABLE_SECURE, cache, request);
}
@@ -742,11 +754,10 @@
+ callingUser);
}
// Extra check for USER_OWNER to optimize for the 99%
- if (callingUser != UserHandle.USER_OWNER && isManagedProfile(callingUser)) {
- if (sSystemCloneToManagedKeys.contains(request)) {
- // Don't write these settings
- return null;
- }
+ if (callingUser != UserHandle.USER_OWNER && shouldShadowParentProfile(callingUser,
+ sSystemCloneToManagedKeys, request)) {
+ // Don't write these settings, as they are cloned from the parent profile
+ return null;
}
insertForUser(Settings.System.CONTENT_URI, values, callingUser);
// Clone the settings to the managed profiles so that notifications can be sent out
@@ -772,11 +783,10 @@
+ callingUser);
}
// Extra check for USER_OWNER to optimize for the 99%
- if (callingUser != UserHandle.USER_OWNER && isManagedProfile(callingUser)) {
- if (sSecureCloneToManagedKeys.contains(request)) {
- // Don't write these settings
- return null;
- }
+ if (callingUser != UserHandle.USER_OWNER && shouldShadowParentProfile(callingUser,
+ sSecureCloneToManagedKeys, request)) {
+ // Don't write these settings, as they are cloned from the parent profile
+ return null;
}
insertForUser(Settings.Secure.CONTENT_URI, values, callingUser);
// Clone the settings to the managed profiles so that notifications can be sent out
@@ -816,6 +826,14 @@
return null;
}
+ /**
+ * Check if the user is a managed profile and name is one of the settings to be cloned
+ * from the parent profile.
+ */
+ private boolean shouldShadowParentProfile(int userId, HashSet<String> keys, String name) {
+ return isManagedProfile(userId) && keys.contains(name);
+ }
+
// Looks up value 'key' in 'table' and returns either a single-pair Bundle,
// possibly with a null value, or null on failure.
private Bundle lookupValue(DatabaseHelper dbHelper, String table,
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index bddd691..1d629fd 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -48,6 +48,7 @@
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+ <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
diff --git a/packages/SystemUI/res/values-af/config.xml b/packages/SystemUI/res/values-af/config.xml
deleted file mode 100644
index 38497cf..0000000
--- a/packages/SystemUI/res/values-af/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s,10 s,30 s,60 s,120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index aadc2c4..7750ec8 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Programinligting"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"sluit na program"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"soek"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Kon nie <xliff:g id="APP">%s</xliff:g> begin nie."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Gelaai"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Laai tans"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> tot vol"</string>
diff --git a/packages/SystemUI/res/values-am/config.xml b/packages/SystemUI/res/values-am/config.xml
deleted file mode 100644
index 97e30c9..0000000
--- a/packages/SystemUI/res/values-am/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s፣10s፣30s፣60s፣120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 6a5aa47..13389a3 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"የመተግበሪያ መረጃ"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"መተግበሪያ-ጋር-ቆልፍ"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"ፈልግ"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>ን መጀመር አልተቻለም።"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ባትሪ ሞልቷል"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ኃይል በመሙላት ላይ"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> እስኪሞላ ድረስ"</string>
diff --git a/packages/SystemUI/res/values-ar/config.xml b/packages/SystemUI/res/values-ar/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-ar/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 2f37ce5..8501a69 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"معلومات التطبيق"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"تقييد بالتطبيق"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"بحث"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"تعذر بدء <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"تم الشحن"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"جارٍ الشحن"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> حتى الاكتمال"</string>
diff --git a/packages/SystemUI/res/values-bg/config.xml b/packages/SystemUI/res/values-bg/config.xml
deleted file mode 100644
index 3a6872f..0000000
--- a/packages/SystemUI/res/values-bg/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 с, 10 с, 30 с, 60 с, 120 с"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 2cfe2b5..4dc8b50 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Информация за приложението"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"заключване в приложението"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"търсене"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> не можа да стартира."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Заредена"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Зарежда се"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> до пълно зареждане"</string>
diff --git a/packages/SystemUI/res/values-bn-rBD/config.xml b/packages/SystemUI/res/values-bn-rBD/config.xml
deleted file mode 100644
index be49df5..0000000
--- a/packages/SystemUI/res/values-bn-rBD/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"১সে.,১০সে.,৩০সে.,৬০সে.,১২০সে."</string>
-</resources>
diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml
index b0a19e4..6bde921 100644
--- a/packages/SystemUI/res/values-bn-rBD/strings.xml
+++ b/packages/SystemUI/res/values-bn-rBD/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"অ্যাপ্লিকেশানের তথ্য"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"অ্যাপ্লিকেশানে লক করুন"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"অনুসন্ধান"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> শুরু করা যায়নি৷"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"চার্জ হয়েছে"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"চার্জ হচ্ছে"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"পূর্ণ হতে <xliff:g id="CHARGING_TIME">%s</xliff:g> সময় লাগবে"</string>
diff --git a/packages/SystemUI/res/values-ca/config.xml b/packages/SystemUI/res/values-ca/config.xml
deleted file mode 100644
index f87a0a3..0000000
--- a/packages/SystemUI/res/values-ca/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index ba2081c..eac6655 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -281,8 +281,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informació de l\'aplicació"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"bloqueig d\'aplicació"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"cerca"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"No s\'ha pogut iniciar <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carregada"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"S\'està carregant"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> per completar la càrrega"</string>
diff --git a/packages/SystemUI/res/values-cs/config.xml b/packages/SystemUI/res/values-cs/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-cs/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-da/config.xml b/packages/SystemUI/res/values-da/config.xml
deleted file mode 100644
index f87a0a3..0000000
--- a/packages/SystemUI/res/values-da/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 5f2e7e9..00583b1 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Oplysninger om applikationen"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"Bliv i app"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"søg"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> kunne ikke startes."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Opladet"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Oplader"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> indtil fuld opladet"</string>
diff --git a/packages/SystemUI/res/values-de/config.xml b/packages/SystemUI/res/values-de/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-de/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index db5c5c6e..a878004 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -281,8 +281,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"App-Info"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"App-Verriegelung"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"Suche"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> konnte nicht gestartet werden."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Aufgeladen"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Wird aufgeladen"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Voll in <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-el/config.xml b/packages/SystemUI/res/values-el/config.xml
deleted file mode 100644
index f3cccde..0000000
--- a/packages/SystemUI/res/values-el/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 δ, 10 δ, 30 δ, 60 δ, 120 δ"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 8b14fdd..d05bf29 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -281,8 +281,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Πληροφορίες εφαρμογής"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"lock to app"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"αναζήτηση"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Δεν ήταν δυνατή η εκκίνηση της εφαρμογής <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Φορτίστηκε"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Φόρτιση"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> για πλήρη φόρτιση"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/config.xml b/packages/SystemUI/res/values-en-rGB/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-en-rGB/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-en-rIN/config.xml b/packages/SystemUI/res/values-en-rIN/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-en-rIN/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/config.xml b/packages/SystemUI/res/values-es-rUS/config.xml
deleted file mode 100644
index 0b667d0..0000000
--- a/packages/SystemUI/res/values-es-rUS/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-es/config.xml b/packages/SystemUI/res/values-es/config.xml
deleted file mode 100644
index f87a0a3..0000000
--- a/packages/SystemUI/res/values-es/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 4f6dd03a..3fe5507 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Información de la aplicación"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"bloqueo de aplicación"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"buscar"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"No se ha podido iniciar <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Cargada"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Cargando"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> para completarse"</string>
diff --git a/packages/SystemUI/res/values-et-rEE/config.xml b/packages/SystemUI/res/values-et-rEE/config.xml
deleted file mode 100644
index f87a0a3..0000000
--- a/packages/SystemUI/res/values-et-rEE/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml
index 2025aa86..009f255 100644
--- a/packages/SystemUI/res/values-et-rEE/strings.xml
+++ b/packages/SystemUI/res/values-et-rEE/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Rakenduste teave"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"lukusta rakendusele"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"otsing"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Rakendust <xliff:g id="APP">%s</xliff:g> ei saanud käivitada."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Laetud"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Laadimine"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Täislaadimiseks kulub <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-eu-rES/config.xml b/packages/SystemUI/res/values-eu-rES/config.xml
deleted file mode 100644
index f87a0a3..0000000
--- a/packages/SystemUI/res/values-eu-rES/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml
index 4cc0a0f..b59e3e6 100644
--- a/packages/SystemUI/res/values-eu-rES/strings.xml
+++ b/packages/SystemUI/res/values-eu-rES/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Aplikazioaren informazioa"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"aplikazio bakarreko modua"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"bilatu"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Ezin izan da hasi <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Kargatuta"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Kargatzen"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> falta zaizkio guztiz kargatzeko"</string>
diff --git a/packages/SystemUI/res/values-fa/config.xml b/packages/SystemUI/res/values-fa/config.xml
deleted file mode 100644
index e938c9a..0000000
--- a/packages/SystemUI/res/values-fa/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"۱ ثانیه، ۱۰ ثانیه، ۳۰ ثانیه، ۶۰ ثانیه، ۱۲۰ ثانیه"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index ee25680..9ddf822 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"اطلاعات برنامه"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"قفل به برنامه"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"جستجو"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> شروع نشد."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"شارژ کامل شد"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"در حال شارژ شدن"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> مانده تا شارژ کامل شود"</string>
diff --git a/packages/SystemUI/res/values-fi/config.xml b/packages/SystemUI/res/values-fi/config.xml
deleted file mode 100644
index af68cdb..0000000
--- a/packages/SystemUI/res/values-fi/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s,10 s, 30 s, 60 s, 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/config.xml b/packages/SystemUI/res/values-fr-rCA/config.xml
deleted file mode 100644
index f87a0a3..0000000
--- a/packages/SystemUI/res/values-fr-rCA/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-fr/config.xml b/packages/SystemUI/res/values-fr/config.xml
deleted file mode 100644
index 0b667d0..0000000
--- a/packages/SystemUI/res/values-fr/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index de32089..64fe17d 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -281,8 +281,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informations sur l\'application"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"verrouiller sur l\'application"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"rechercher"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Impossible de lancer <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Chargé"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"En charge"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Chargé dans <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-gl-rES/config.xml b/packages/SystemUI/res/values-gl-rES/config.xml
deleted file mode 100644
index f134bdc..0000000
--- a/packages/SystemUI/res/values-gl-rES/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s e 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml
index 1cb1056..5ffb7ac 100644
--- a/packages/SystemUI/res/values-gl-rES/strings.xml
+++ b/packages/SystemUI/res/values-gl-rES/strings.xml
@@ -281,8 +281,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Información da aplicación"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"bloqueo de aplicación"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"buscar"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Non foi posible iniciar <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Cargada"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Cargando"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> para completar a carga"</string>
diff --git a/packages/SystemUI/res/values-hi/config.xml b/packages/SystemUI/res/values-hi/config.xml
deleted file mode 100644
index 000d96f..0000000
--- a/packages/SystemUI/res/values-hi/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 से,10 से, 30 से, 60 से, 120 से"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 6805d50..e5080e2 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -199,7 +199,7 @@
<string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"मोबाइल हॉटस्पॉट को बंद किया गया."</string>
<string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"मोबाइल हॉटस्पॉट को चालू किया गया."</string>
<string name="accessibility_casting_turned_off" msgid="1430668982271976172">"स्क्रीन कास्ट करना रुक गया."</string>
- <string name="accessibility_brightness" msgid="8003681285547803095">"स्क्रीन की चमक"</string>
+ <string name="accessibility_brightness" msgid="8003681285547803095">"स्क्रीन की स्क्रीन की रोशनी"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="2626865386971800302">"2G-3G डेटा बंद है"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4629078114195977196">"4G डेटा बंद है"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="5793456071535876132">"सेल्युलर डेटा बंद है"</string>
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"एप्लिकेशन जानकारी"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"ऐप्स पर लॉक करें"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"खोज"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> प्रारंभ नहीं किया जा सका."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"चार्ज हो गई है"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"चार्ज हो रही है"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"पूर्ण होने में <xliff:g id="CHARGING_TIME">%s</xliff:g> शेष"</string>
diff --git a/packages/SystemUI/res/values-hr/config.xml b/packages/SystemUI/res/values-hr/config.xml
deleted file mode 100644
index f87a0a3..0000000
--- a/packages/SystemUI/res/values-hr/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 46ac883..2d291c2 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informacije o aplikaciji"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"zaključaj na aplikaciju"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"pretraži"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Aplikacija <xliff:g id="APP">%s</xliff:g> nije pokrenuta."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Napunjeno"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Punjenje"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> do napunjenosti"</string>
diff --git a/packages/SystemUI/res/values-hu/config.xml b/packages/SystemUI/res/values-hu/config.xml
deleted file mode 100644
index f5ccf75..0000000
--- a/packages/SystemUI/res/values-hu/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1, 10, 30, 60, 120"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 9885ee6..0304623 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Az alkalmazás adatai"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"alkalmazászárolás"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"keresés"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Nem lehet elindítani a következőt: <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Feltöltve"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Töltés"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> a teljes töltöttségig"</string>
diff --git a/packages/SystemUI/res/values-hy-rAM/config.xml b/packages/SystemUI/res/values-hy-rAM/config.xml
deleted file mode 100644
index cc0d74a..0000000
--- a/packages/SystemUI/res/values-hy-rAM/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1վ,10վ,30վ,60վ,120վ"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-in/config.xml b/packages/SystemUI/res/values-in/config.xml
deleted file mode 100644
index 2aa4b09..0000000
--- a/packages/SystemUI/res/values-in/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1dtk,10dtk,30dtk,60dtk,120dtk"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 07d6784..8220a83 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Info Aplikasi"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"kunci ke aplikasi"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"telusuri"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Tidak dapat memulai <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Terisi"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Mengisi daya"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> sampai penuh"</string>
diff --git a/packages/SystemUI/res/values-is-rIS/config.xml b/packages/SystemUI/res/values-is-rIS/config.xml
deleted file mode 100644
index 46f7456..0000000
--- a/packages/SystemUI/res/values-is-rIS/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 sek.,10 sek., 30 sek., 60 sek.,120 sek."</string>
-</resources>
diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml
index f996376..735cb88 100644
--- a/packages/SystemUI/res/values-is-rIS/strings.xml
+++ b/packages/SystemUI/res/values-is-rIS/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Forritsupplýsingar"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"forritslæsing"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"leita"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Ekki var hægt að ræsa <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Fullhlaðin"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Í hleðslu"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> þar til fullri hleðslu er náð"</string>
diff --git a/packages/SystemUI/res/values-it/config.xml b/packages/SystemUI/res/values-it/config.xml
deleted file mode 100644
index f87a0a3..0000000
--- a/packages/SystemUI/res/values-it/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 68f4913..239e2aa 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -281,8 +281,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informazioni sull\'applicazione"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"blocca su app"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"cerca"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Impossibile avviare <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carica"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"In carica"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> al termine della carica"</string>
diff --git a/packages/SystemUI/res/values-iw/config.xml b/packages/SystemUI/res/values-iw/config.xml
deleted file mode 100644
index 42e8d6f..0000000
--- a/packages/SystemUI/res/values-iw/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"שנייה אחת, 10 שניות, 30 שניות, 60 שניות, 120 שניות"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 961fbb4..eed8e1c 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"מידע על האפליקציה"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"נעל לאפליקציה"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"חפש"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"לא ניתן היה להפעיל את <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"טעון"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"טוען"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> עד למילוי"</string>
diff --git a/packages/SystemUI/res/values-ja/config.xml b/packages/SystemUI/res/values-ja/config.xml
deleted file mode 100644
index d0aaa22..0000000
--- a/packages/SystemUI/res/values-ja/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s、10s、30s、60s、120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 383985a..b81ea5d 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -281,8 +281,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"アプリ情報"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"アプリロック"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"検索"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>を開始できません。"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"充電が完了しました"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"充電しています"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"充電完了まで<xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ka-rGE/config.xml b/packages/SystemUI/res/values-ka-rGE/config.xml
deleted file mode 100644
index 57f58de..0000000
--- a/packages/SystemUI/res/values-ka-rGE/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1წმ,10წმ,30წმ,60წმ,120წმ"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-kk-rKZ/config.xml b/packages/SystemUI/res/values-kk-rKZ/config.xml
deleted file mode 100644
index 2b93a22..0000000
--- a/packages/SystemUI/res/values-kk-rKZ/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1с,10с,30с,60с,120с"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml
index 12b83f5..4424595 100644
--- a/packages/SystemUI/res/values-kk-rKZ/strings.xml
+++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Қолданба туралы ақпарат"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"қолданбаға бекіту"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"іздеу"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> іске қосу мүмкін болмады."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Зарядталды"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Зарядталуда"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Толғанға дейін <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-km-rKH/config.xml b/packages/SystemUI/res/values-km-rKH/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-km-rKH/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml
index 67e42ad..e229dc6 100644
--- a/packages/SystemUI/res/values-km-rKH/strings.xml
+++ b/packages/SystemUI/res/values-km-rKH/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"ព័ត៌មានកម្មវិធី"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"ចាក់សោទៅកម្មវិធី"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"ស្វែងរក"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"មិនអាចចាប់ផ្ដើម <xliff:g id="APP">%s</xliff:g> ទេ។"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"បានបញ្ចូលថ្ម"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"កំពុងបញ្ចូលថ្ម"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> រហូតដល់ពេញ"</string>
diff --git a/packages/SystemUI/res/values-kn-rIN/config.xml b/packages/SystemUI/res/values-kn-rIN/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-kn-rIN/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml
index 395d346..bf55707e 100644
--- a/packages/SystemUI/res/values-kn-rIN/strings.xml
+++ b/packages/SystemUI/res/values-kn-rIN/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"ಅಪ್ಲಿಕೇಶನ್ಗೆ ಲಾಕ್"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"ಹುಡುಕಾಟ"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> ಪ್ರಾರಂಭಿಸಲು ಸಾದ್ಯವಿಲ್ಲ."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ಚಾರ್ಜ್ ಆಗಿದೆ"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ಪೂರ್ಣಗೊಳ್ಳುವವರೆಗೆ"</string>
diff --git a/packages/SystemUI/res/values-ko/config.xml b/packages/SystemUI/res/values-ko/config.xml
deleted file mode 100644
index aa99bd5..0000000
--- a/packages/SystemUI/res/values-ko/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1초,10초,30초,60초,120초"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-ky-rKG/config.xml b/packages/SystemUI/res/values-ky-rKG/config.xml
deleted file mode 100644
index 70f9c98..0000000
--- a/packages/SystemUI/res/values-ky-rKG/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1сек.,10сек.,30сек.,60сек.,120сек."</string>
-</resources>
diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml
index dbc4354..799241f 100644
--- a/packages/SystemUI/res/values-ky-rKG/strings.xml
+++ b/packages/SystemUI/res/values-ky-rKG/strings.xml
@@ -305,8 +305,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Колдонмо жөнүндө маалымат"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"колдонмого кулпулоо"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"издөө"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> баштай алган жок."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Кубатталды"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Кубатталууда"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> толгонго чейин"</string>
diff --git a/packages/SystemUI/res/values-lo-rLA/config.xml b/packages/SystemUI/res/values-lo-rLA/config.xml
deleted file mode 100644
index 3b10d52..0000000
--- a/packages/SystemUI/res/values-lo-rLA/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 ວິ,10 ວິ, 30 ວິ, 60 ວິ, 120 ວິ"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml
index b862d98..0feefc4 100644
--- a/packages/SystemUI/res/values-lo-rLA/strings.xml
+++ b/packages/SystemUI/res/values-lo-rLA/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"ຂໍ້ມູນແອັບພລິເຄຊັນ"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"lock to app"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"ຊອກຫາ"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"ບໍ່ສາມາດເລີ່ມ <xliff:g id="APP">%s</xliff:g> ໄດ້."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ສາກເຕັມແລ້ວ."</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ກຳລັງສາກໄຟ"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ຈຶ່ງຈະເຕັມ"</string>
diff --git a/packages/SystemUI/res/values-lt/config.xml b/packages/SystemUI/res/values-lt/config.xml
deleted file mode 100644
index edfec94..0000000
--- a/packages/SystemUI/res/values-lt/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 sek., 10 sek., 30 sek., 60 sek., 120 sek."</string>
-</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 7af8b7d..aa1fdb7 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Programos informacija"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"Programos užrakinimo funkcija"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"paieška"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Nepavyko paleisti <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Įkrautas"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Kraunamas"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> iki visiško įkrovimo"</string>
diff --git a/packages/SystemUI/res/values-lv/config.xml b/packages/SystemUI/res/values-lv/config.xml
deleted file mode 100644
index 0b667d0..0000000
--- a/packages/SystemUI/res/values-lv/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 4aac8d8..c013a56 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informācija par lietojumprogrammu"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"fiksēt lietotni"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"Meklēt"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Nevarēja palaist lietotni <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Akumulators uzlādēts"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Notiek uzlāde"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> līdz pilnam akumulatoram"</string>
diff --git a/packages/SystemUI/res/values-mk-rMK/config.xml b/packages/SystemUI/res/values-mk-rMK/config.xml
deleted file mode 100644
index 024f528..0000000
--- a/packages/SystemUI/res/values-mk-rMK/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1сек., 10 сек., 30 сек., 60 сек., 120 сек."</string>
-</resources>
diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml
index b639916..9c2b2a6 100644
--- a/packages/SystemUI/res/values-mk-rMK/strings.xml
+++ b/packages/SystemUI/res/values-mk-rMK/strings.xml
@@ -281,8 +281,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Информации за апликацијата"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"заклучи на апликација"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"пребарај"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> не може да се вклучи."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Наполнета"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Се полни"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> додека не се наполни"</string>
diff --git a/packages/SystemUI/res/values-ml-rIN/config.xml b/packages/SystemUI/res/values-ml-rIN/config.xml
deleted file mode 100644
index d2d29f9..0000000
--- a/packages/SystemUI/res/values-ml-rIN/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1സെ,10സെ,30സെ,60സെ,120സെ"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml
index 3940e45..63fcec2 100644
--- a/packages/SystemUI/res/values-ml-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ml-rIN/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"അപ്ലിക്കേഷൻ വിവരം"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"അപ്ലിക്കേഷനിലേക്ക് ലോക്കുചെയ്യൽ"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"തിരയുക"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> ആരംഭിക്കാനായില്ല."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ചാർജ്ജുചെയ്തു"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ചാർജ്ജുചെയ്യുന്നു"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"പൂർണ്ണമായും ചാർജ്ജാകുന്നതിന്, <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-mn-rMN/config.xml b/packages/SystemUI/res/values-mn-rMN/config.xml
deleted file mode 100644
index 2b93a22..0000000
--- a/packages/SystemUI/res/values-mn-rMN/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1с,10с,30с,60с,120с"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-mr-rIN/config.xml b/packages/SystemUI/res/values-mr-rIN/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-mr-rIN/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml
index 9e3baed..cf59142 100644
--- a/packages/SystemUI/res/values-mr-rIN/strings.xml
+++ b/packages/SystemUI/res/values-mr-rIN/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"अनुप्रयोग माहिती"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"अॅप-लॉक-करणे"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"शोधा"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> प्रारंभ करणे शक्य झाले नाही."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"चार्ज झाली"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"चार्ज होत आहे"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> पूर्ण होईपर्यंत"</string>
diff --git a/packages/SystemUI/res/values-ms-rMY/config.xml b/packages/SystemUI/res/values-ms-rMY/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-ms-rMY/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-my-rMM/config.xml b/packages/SystemUI/res/values-my-rMM/config.xml
deleted file mode 100644
index 805d893..0000000
--- a/packages/SystemUI/res/values-my-rMM/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"၁စက္ကန့်၊ ၁၀စက္ကန့်၊ ၃၀စက္ကန့်၊ 60စက္ကန့်၊ ၁၂၀စက္ကန့်"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml
index 0e248c3..479876a 100644
--- a/packages/SystemUI/res/values-my-rMM/strings.xml
+++ b/packages/SystemUI/res/values-my-rMM/strings.xml
@@ -277,8 +277,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"အပလီကေးရှင်း အင်ဖို"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"appသို့ သော့ခတ်ထားရန်"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"ရှာဖွေရန်"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> ကို မစနိုင်ပါ။"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"အားသွင်းပြီး"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"အားသွင်းနေ"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ပြည်သည့် အထိ"</string>
diff --git a/packages/SystemUI/res/values-nb/config.xml b/packages/SystemUI/res/values-nb/config.xml
deleted file mode 100644
index f87a0a3..0000000
--- a/packages/SystemUI/res/values-nb/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-ne-rNP/config.xml b/packages/SystemUI/res/values-ne-rNP/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-ne-rNP/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml
index 9db7486..d103474 100644
--- a/packages/SystemUI/res/values-ne-rNP/strings.xml
+++ b/packages/SystemUI/res/values-ne-rNP/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"अनुप्रयोग जानकारी"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"अनुप्रयोग बन्द गर्न"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"खोजी गर्नुहोस्"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"सुरु गर्न सकिएन <xliff:g id="APP">%s</xliff:g>।"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"चार्ज भयो"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"चार्ज हुँदै"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> पूर्ण नभएसम्म"</string>
diff --git a/packages/SystemUI/res/values-nl/config.xml b/packages/SystemUI/res/values-nl/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-nl/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index f9d4291..0f80d63 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"App-informatie"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"app-slot"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"zoeken"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Kan <xliff:g id="APP">%s</xliff:g> niet starten."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Opgeladen"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Opladen"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> tot volledig opgeladen"</string>
diff --git a/packages/SystemUI/res/values-pl/config.xml b/packages/SystemUI/res/values-pl/config.xml
deleted file mode 100644
index f87a0a3..0000000
--- a/packages/SystemUI/res/values-pl/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 85c8784..9dde319 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informacje o aplikacji"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"zablokuj na aplikacji"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"szukaj"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Nie udało się uruchomić aplikacji <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Naładowana"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Ładuje się"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> do pełnego naładowania"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/config.xml b/packages/SystemUI/res/values-pt-rPT/config.xml
deleted file mode 100644
index f87a0a3..0000000
--- a/packages/SystemUI/res/values-pt-rPT/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index ec25313..73c8e17 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informações da aplicação"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"bloquear numa aplicação"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"pesquisar"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Não foi possível iniciar o <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carregada"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"A carregar"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> até ficar completa"</string>
diff --git a/packages/SystemUI/res/values-pt/config.xml b/packages/SystemUI/res/values-pt/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-pt/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-ro/config.xml b/packages/SystemUI/res/values-ro/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-ro/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-ru/config.xml b/packages/SystemUI/res/values-ru/config.xml
deleted file mode 100644
index 09db84b..0000000
--- a/packages/SystemUI/res/values-ru/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 сек.,10 сек.,30 сек.,60 сек.,120 сек."</string>
-</resources>
diff --git a/packages/SystemUI/res/values-si-rLK/config.xml b/packages/SystemUI/res/values-si-rLK/config.xml
deleted file mode 100644
index e693c10..0000000
--- a/packages/SystemUI/res/values-si-rLK/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"ත1,ත10,ත30,ත60,ත120"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-sk/config.xml b/packages/SystemUI/res/values-sk/config.xml
deleted file mode 100644
index f87a0a3..0000000
--- a/packages/SystemUI/res/values-sk/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-sl/config.xml b/packages/SystemUI/res/values-sl/config.xml
deleted file mode 100644
index f87a0a3..0000000
--- a/packages/SystemUI/res/values-sl/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-sr/config.xml b/packages/SystemUI/res/values-sr/config.xml
deleted file mode 100644
index f82a740..0000000
--- a/packages/SystemUI/res/values-sr/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 сек, 10 сек, 30 сек, 60 сек, 120 сек"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 9cfeb71..5ce9ba0 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Информације о апликацији"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"закључај апликацију"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"претражи"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Покретање апликације <xliff:g id="APP">%s</xliff:g> није успело."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Напуњена је"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Пуњење"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> док се не напуни"</string>
diff --git a/packages/SystemUI/res/values-sv/config.xml b/packages/SystemUI/res/values-sv/config.xml
deleted file mode 100644
index 3b683a8..0000000
--- a/packages/SystemUI/res/values-sv/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 sek,10 sek, 30 sek, 60 sek,120 sek"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 1195aff..c972780 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Appinformation"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"lås till app"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"sök"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Det gick inte att starta appen <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Laddat"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Laddar"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> tills batteriet är fulladdat"</string>
diff --git a/packages/SystemUI/res/values-sw/config.xml b/packages/SystemUI/res/values-sw/config.xml
deleted file mode 100644
index cfde159..0000000
--- a/packages/SystemUI/res/values-sw/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"sek 1,sek 10,sek 30,sek 60,sek 120"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-ta-rIN/config.xml b/packages/SystemUI/res/values-ta-rIN/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-ta-rIN/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml
index 79be0a3..12cf154 100644
--- a/packages/SystemUI/res/values-ta-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ta-rIN/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"பயன்பாட்டு தகவல்"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"லாக்-டு-ஆப்"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"தேடு"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>ஐத் தொடங்க முடியவில்லை."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"சார்ஜ் செய்யப்பட்டது"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"சார்ஜாகிறது"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"முழுவதும் சார்ஜாக <xliff:g id="CHARGING_TIME">%s</xliff:g> ஆகும்"</string>
diff --git a/packages/SystemUI/res/values-te-rIN/config.xml b/packages/SystemUI/res/values-te-rIN/config.xml
deleted file mode 100644
index 7a4c0cb..0000000
--- a/packages/SystemUI/res/values-te-rIN/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1సె,10సె,30సె,60సె,120సె"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml
index 2afb65f..ace8287 100644
--- a/packages/SystemUI/res/values-te-rIN/strings.xml
+++ b/packages/SystemUI/res/values-te-rIN/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"అనువర్తన సమాచారం"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"లాక్ టు యాప్"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"శోధించు"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>ని ప్రారంభించడం సాధ్యపడలేదు."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ఛార్జ్ చేయబడింది"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ఛార్జ్ అవుతోంది"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"పూర్తిగా నిండటానికి <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-th/config.xml b/packages/SystemUI/res/values-th/config.xml
deleted file mode 100644
index f08a880..0000000
--- a/packages/SystemUI/res/values-th/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1, 10, 30, 60, 120 วินาที"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 0e3754d..510f75a 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"ข้อมูลแอปพลิเคชัน"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"การล็อกแอป"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"ค้นหา"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"ไม่สามารถเริ่มใช้ <xliff:g id="APP">%s</xliff:g>"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ชาร์จแล้ว"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"กำลังชาร์จ"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"อีก <xliff:g id="CHARGING_TIME">%s</xliff:g> จึงจะเต็ม"</string>
diff --git a/packages/SystemUI/res/values-tl/config.xml b/packages/SystemUI/res/values-tl/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-tl/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index ba36643..cd4fda0 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Impormasyon ng Application"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"lock to app"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"maghanap"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Hindi masimulan <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Nasingil na"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Nagcha-charge"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> hanggang mapuno"</string>
diff --git a/packages/SystemUI/res/values-tr/config.xml b/packages/SystemUI/res/values-tr/config.xml
deleted file mode 100644
index 22b5873..0000000
--- a/packages/SystemUI/res/values-tr/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 sn., 10 sn., 30 sn., 60 sn., 120 sn."</string>
-</resources>
diff --git a/packages/SystemUI/res/values-uk/config.xml b/packages/SystemUI/res/values-uk/config.xml
deleted file mode 100644
index 3a6872f..0000000
--- a/packages/SystemUI/res/values-uk/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 с, 10 с, 30 с, 60 с, 120 с"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 78f7986d..3a6d195 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Інформація про додаток"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"блокування в додатку"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"пошук"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Не вдалося запустити <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Заряджено"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Заряджається"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"До повного зарядження <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ur-rPK/config.xml b/packages/SystemUI/res/values-ur-rPK/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-ur-rPK/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-uz-rUZ/config.xml b/packages/SystemUI/res/values-uz-rUZ/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-uz-rUZ/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml
index 6eaaee6..7371330 100644
--- a/packages/SystemUI/res/values-uz-rUZ/strings.xml
+++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Ilova haqida ma’lumot"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"ilovaga qulflash"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"qidirish"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"“<xliff:g id="APP">%s</xliff:g>” ilovasini ishga tushirib bo‘lmadi."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Batareya quvvati to‘ldi"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Quvvat olmoqda"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g>da to‘ladi"</string>
diff --git a/packages/SystemUI/res/values-vi/config.xml b/packages/SystemUI/res/values-vi/config.xml
deleted file mode 100644
index 17306ca..0000000
--- a/packages/SystemUI/res/values-vi/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 giây,10 giây,30 giây,60 giây,120 giây"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 8546f8c..5665f9c 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Thông tin ứng dụng"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"khóa trong ứng dụng"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"tìm kiếm"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Không thể khởi động <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Đã sạc"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Đang sạc"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> cho đến khi đầy"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/config.xml b/packages/SystemUI/res/values-zh-rCN/config.xml
deleted file mode 100644
index 73c3807..0000000
--- a/packages/SystemUI/res/values-zh-rCN/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1秒、10秒、30秒、60秒、120秒"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/config.xml b/packages/SystemUI/res/values-zh-rHK/config.xml
deleted file mode 100644
index 1f7d76c..0000000
--- a/packages/SystemUI/res/values-zh-rHK/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 秒、10 秒、30 秒、60 秒、120 秒"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index becba62..4552d6b 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -281,8 +281,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"應用程式資料"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"應用程式鎖定"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"搜尋"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"無法啟動「<xliff:g id="APP">%s</xliff:g>」。"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"已完成充電"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"充電中"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g>後完成充電"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/config.xml b/packages/SystemUI/res/values-zh-rTW/config.xml
deleted file mode 100644
index 51eb00d..0000000
--- a/packages/SystemUI/res/values-zh-rTW/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 秒,10 秒,30 秒,60 秒,120 秒"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 705cea9..354f221 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -281,8 +281,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"應用程式資訊"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"應用程式鎖定"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"搜尋"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"無法啟動「<xliff:g id="APP">%s</xliff:g>」。"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"已充飽"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"充電中"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g>後充飽"</string>
diff --git a/packages/SystemUI/res/values-zu/config.xml b/packages/SystemUI/res/values-zu/config.xml
deleted file mode 100644
index 4bbdea2..0000000
--- a/packages/SystemUI/res/values-zu/config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
-** Copyright 2009, 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.
-*/
- -->
-
-<!-- These resources are around just to allow their values to be customized
- for different hardware and product builds. -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
-</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 1441bd3..10414c6 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -279,8 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Ulwazi lohlelo lokusebenza"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"ukukhiya kuhlelo lokusebenza"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"sesha"</string>
- <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
- <skip />
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Ayikwazanga ukuqala i-<xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Kushajiwe"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Iyashaja"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ize igcwale"</string>
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
index b07e993..6cc890b 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
@@ -199,8 +199,8 @@
if (mPulsing && mDreaming) {
mPulsing = false;
turnDisplayOff();
- mWakeLock.release();
}
+ mWakeLock.release(); // needs to be unconditional to balance acquire
}
});
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index 2fafb2c..fdebdd3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -30,6 +30,7 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityEvent;
import android.widget.ImageView;
import android.widget.TextView;
@@ -360,6 +361,7 @@
listener = mTeardownDetailWhenDone;
fireScanStateChanged(false);
}
+ sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
fireShowingDetail(show ? detailAdapter : null);
mClipper.animateCircularClip(x, y, show, listener);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
index cb685fe..6ef6e9e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
@@ -123,7 +123,7 @@
}
public void userSwitch(int newUserId) {
- mHandler.obtainMessage(H.USER_SWITCH, newUserId).sendToTarget();
+ mHandler.obtainMessage(H.USER_SWITCH, newUserId, 0).sendToTarget();
}
public void fireToggleStateChanged(boolean state) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/SecureSetting.java b/packages/SystemUI/src/com/android/systemui/qs/SecureSetting.java
index 3ed3d30..0ab6626 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/SecureSetting.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/SecureSetting.java
@@ -16,6 +16,7 @@
package com.android.systemui.qs;
+import android.app.ActivityManager;
import android.content.Context;
import android.database.ContentObserver;
import android.os.Handler;
@@ -28,32 +29,33 @@
private final Context mContext;
private final String mSettingName;
+ private boolean mListening;
+ private int mUserId;
+
protected abstract void handleValueChanged(int value);
public SecureSetting(Context context, Handler handler, String settingName) {
super(handler);
mContext = context;
mSettingName = settingName;
- rebindForCurrentUser();
- }
-
- public void rebindForCurrentUser() {
+ mUserId = ActivityManager.getCurrentUser();
setListening(true);
}
public int getValue() {
- return Secure.getInt(mContext.getContentResolver(), mSettingName, 0);
+ return Secure.getIntForUser(mContext.getContentResolver(), mSettingName, 0, mUserId);
}
public void setValue(int value) {
- Secure.putInt(mContext.getContentResolver(), mSettingName, value);
+ Secure.putIntForUser(mContext.getContentResolver(), mSettingName, value, mUserId);
}
@Override
public void setListening(boolean listening) {
+ mListening = listening;
if (listening) {
mContext.getContentResolver().registerContentObserver(
- Secure.getUriFor(mSettingName), false, this);
+ Secure.getUriFor(mSettingName), false, this, mUserId);
} else {
mContext.getContentResolver().unregisterContentObserver(this);
}
@@ -63,4 +65,12 @@
public void onChange(boolean selfChange) {
handleValueChanged(getValue());
}
+
+ public void setUserId(int userId) {
+ mUserId = userId;
+ if (mListening) {
+ setListening(false);
+ setListening(true);
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
index a62bbff..01849c1 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
@@ -71,7 +71,8 @@
@Override
protected void handleUserSwitch(int newUserId) {
- mSetting.rebindForCurrentUser();
+ mSetting.setUserId(newUserId);
+ handleRefreshState(mSetting.getValue());
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java
index a4161f9..e2464c2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java
@@ -497,4 +497,13 @@
public void setIsLeft(boolean left) {
mIsLeft = left;
}
+
+ @Override
+ public boolean performClick() {
+ if (isClickable()) {
+ return super.performClick();
+ } else {
+ return false;
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index 754fade..fceed2f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -284,10 +284,13 @@
if (mAccessibilityController == null) {
return;
}
- mLockIcon.setClickable(mUnlockMethodCache.isTrustManaged()
- || mAccessibilityController.isTouchExplorationEnabled());
- mLockIcon.setLongClickable(mAccessibilityController.isTouchExplorationEnabled()
- && mUnlockMethodCache.isTrustManaged());
+ boolean clickToUnlock = mAccessibilityController.isTouchExplorationEnabled();
+ boolean clickToForceLock = mUnlockMethodCache.isTrustManaged()
+ && !mAccessibilityController.isAccessibilityEnabled();
+ boolean longClickToForceLock = mUnlockMethodCache.isTrustManaged()
+ && !clickToForceLock;
+ mLockIcon.setClickable(clickToForceLock || clickToUnlock);
+ mLockIcon.setLongClickable(longClickToForceLock);
mLockIcon.setFocusable(mAccessibilityController.isAccessibilityEnabled());
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index 67c7723..95c5020 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -317,7 +317,7 @@
}
mJustPeeked = false;
}
- if (-h >= mUnlockFalsingThreshold) {
+ if (-h >= getFalsingThreshold()) {
mTouchAboveFalsingThreshold = true;
}
if (!mJustPeeked && (!waitForTouchSlop || mTracking) && !isTrackingBlocked()) {
@@ -370,6 +370,11 @@
return !waitForTouchSlop || mTracking;
}
+ private int getFalsingThreshold() {
+ float factor = mStatusBar.isScreenOnComingFromTouch() ? 1.5f : 1.0f;
+ return (int) (mUnlockFalsingThreshold * factor);
+ }
+
protected abstract boolean hasConflictingGestures();
protected void onTrackingStopped(boolean expand) {
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 90f9cdd..71fef65 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -262,6 +262,7 @@
private StatusBarWindowManager mStatusBarWindowManager;
private UnlockMethodCache mUnlockMethodCache;
private DozeServiceHost mDozeServiceHost;
+ private boolean mScreenOnComingFromTouch;
int mPixelFormat;
Object mQueueLock = new Object();
@@ -1758,7 +1759,7 @@
}
}
- if (controller != mMediaController) {
+ if (!sameSessions(mMediaController, controller)) {
// We have a new media session
if (mMediaController != null) {
@@ -1807,6 +1808,12 @@
updateMediaMetaData(metaDataChanged);
}
+ private boolean sameSessions(MediaController a, MediaController b) {
+ if (a == b) return true;
+ if (a == null) return false;
+ return a.controlsSameSession(b);
+ }
+
/**
* Hide the album artwork that is fading out and release its bitmap.
*/
@@ -2112,10 +2119,14 @@
return mNotificationPanel.isQsExpanded();
}
+ public boolean isScreenOnComingFromTouch() {
+ return mScreenOnComingFromTouch;
+ }
+
public boolean isFalsingThresholdNeeded() {
boolean onKeyguard = getBarState() == StatusBarState.KEYGUARD;
boolean isMethodInsecure = mUnlockMethodCache.isMethodInsecure();
- return onKeyguard && (isMethodInsecure || mDozing);
+ return onKeyguard && (isMethodInsecure || mDozing || mScreenOnComingFromTouch);
}
@Override // NotificationData.Environment
@@ -3903,6 +3914,7 @@
public void onScreenTurnedOff() {
mScreenOnFromKeyguard = false;
+ mScreenOnComingFromTouch = false;
mStackScroller.setAnimationsEnabled(false);
}
@@ -4005,10 +4017,13 @@
return !mNotificationData.getActiveNotifications().isEmpty();
}
- public void wakeUpIfDozing(long time) {
+ public void wakeUpIfDozing(long time, boolean fromTouch) {
if (mDozing && mScrimController.isPulsing()) {
PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
pm.wakeUp(time);
+ if (fromTouch) {
+ mScreenOnComingFromTouch = true;
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
index 072fb29..b0f3ea1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
@@ -623,7 +623,10 @@
mSettingsButton.setTranslationX(values.settingsTranslation);
mSettingsButton.setRotation(values.settingsRotation);
applyAlpha(mEmergencyCallsOnly, values.emergencyCallsOnlyAlpha);
- applyAlpha(mAlarmStatus, values.alarmStatusAlpha);
+ if (!mShowingDetail) {
+ // Otherwise it needs to stay invisible
+ applyAlpha(mAlarmStatus, values.alarmStatusAlpha);
+ }
applyAlpha(mDateCollapsed, values.dateCollapsedAlpha);
applyAlpha(mDateExpanded, values.dateExpandedAlpha);
applyAlpha(mBatteryLevel, values.batteryLevelAlpha);
@@ -748,9 +751,7 @@
transition(mQsDetailHeader, showingDetail);
mShowingDetail = showingDetail;
if (showingDetail) {
- String title = mContext.getString(detail.getTitle());
- mQsDetailHeaderTitle.setText(title);
- announceForAccessibility(title);
+ mQsDetailHeaderTitle.setText(detail.getTitle());
final Boolean toggleState = detail.getToggleState();
if (toggleState == null) {
mQsDetailHeaderSwitch.setVisibility(INVISIBLE);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
index 89ce257..4c86990 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -132,7 +132,7 @@
case KeyEvent.KEYCODE_VOLUME_DOWN:
case KeyEvent.KEYCODE_VOLUME_UP:
if (down) {
- mService.wakeUpIfDozing(event.getEventTime());
+ mService.wakeUpIfDozing(event.getEventTime(), false);
}
}
if (mService.interceptMediaKey(event)) {
@@ -164,7 +164,7 @@
intercept = mDragDownHelper.onInterceptTouchEvent(ev);
// wake up on a touch down event, if dozing
if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
- mService.wakeUpIfDozing(ev.getEventTime());
+ mService.wakeUpIfDozing(ev.getEventTime(), true);
}
}
if (!intercept) {
diff --git a/policy/src/com/android/internal/policy/impl/GlobalActions.java b/policy/src/com/android/internal/policy/impl/GlobalActions.java
index 7b41391..dfcdaa0 100644
--- a/policy/src/com/android/internal/policy/impl/GlobalActions.java
+++ b/policy/src/com/android/internal/policy/impl/GlobalActions.java
@@ -68,6 +68,7 @@
import android.view.WindowManagerGlobal;
import android.view.WindowManagerInternal;
import android.view.WindowManagerPolicy.WindowManagerFuncs;
+import android.view.accessibility.AccessibilityEvent;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
@@ -625,6 +626,12 @@
* What each item in the global actions dialog must be able to support.
*/
private interface Action {
+ /**
+ * @return Text that will be announced when dialog is created. null
+ * for none.
+ */
+ CharSequence getLabelForAccessibility(Context context);
+
View create(Context context, View convertView, ViewGroup parent, LayoutInflater inflater);
void onPress();
@@ -692,6 +699,14 @@
abstract public void onPress();
+ public CharSequence getLabelForAccessibility(Context context) {
+ if (mMessage != null) {
+ return mMessage;
+ } else {
+ return context.getString(mMessageResId);
+ }
+ }
+
public View create(
Context context, View convertView, ViewGroup parent, LayoutInflater inflater) {
View v = inflater.inflate(R.layout.global_actions_item, parent, false);
@@ -781,6 +796,11 @@
}
+ @Override
+ public CharSequence getLabelForAccessibility(Context context) {
+ return context.getString(mMessageResId);
+ }
+
public View create(Context context, View convertView, ViewGroup parent,
LayoutInflater inflater) {
willCreate();
@@ -897,6 +917,11 @@
return index;
}
+ @Override
+ public CharSequence getLabelForAccessibility(Context context) {
+ return null;
+ }
+
public View create(Context context, View convertView, ViewGroup parent,
LayoutInflater inflater) {
View v = inflater.inflate(R.layout.global_actions_silent_mode, parent, false);
@@ -1045,6 +1070,7 @@
private final Context mContext;
private final int mWindowTouchSlop;
private final AlertController mAlert;
+ private final MyAdapter mAdapter;
private EnableAccessibilityController mEnableAccessibilityController;
@@ -1055,6 +1081,7 @@
super(context, getDialogTheme(context));
mContext = context;
mAlert = new AlertController(mContext, this, getWindow());
+ mAdapter = (MyAdapter) params.mAdapter;
mWindowTouchSlop = ViewConfiguration.get(context).getScaledWindowTouchSlop();
params.apply(mAlert);
}
@@ -1149,6 +1176,20 @@
}
@Override
+ public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
+ for (int i = 0; i < mAdapter.getCount(); ++i) {
+ CharSequence label =
+ mAdapter.getItem(i).getLabelForAccessibility(getContext());
+ if (label != null) {
+ event.getText().add(label);
+ }
+ }
+ }
+ return super.dispatchPopulateAccessibilityEvent(event);
+ }
+
+ @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (mAlert.onKeyDown(keyCode, event)) {
return true;
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index aa49d37..006f5db 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -199,7 +199,7 @@
*/
private WindowState mKeyguardScrim;
private boolean mKeyguardHidden;
- private boolean mKeyguardDrawn;
+ private boolean mKeyguardDrawnOnce;
/* Table of Application Launch keys. Maps from key codes to intent categories.
*
@@ -284,10 +284,6 @@
boolean mBootMessageNeedsHiding;
KeyguardServiceDelegate mKeyguardDelegate;
- // The following are only accessed on the mHandler thread.
- boolean mKeyguardDrawComplete;
- boolean mWindowManagerDrawComplete;
- ScreenOnListener mScreenOnListener;
final Runnable mWindowManagerDrawCallback = new Runnable() {
@Override
public void run() {
@@ -351,8 +347,12 @@
boolean mLidControlsSleep;
int mShortPressOnPowerBehavior = -1;
int mLongPressOnPowerBehavior = -1;
- boolean mAwakeEarly = false;
- boolean mAwakeFully = false;
+ boolean mAwake;
+ boolean mScreenOnEarly;
+ boolean mScreenOnFully;
+ ScreenOnListener mScreenOnListener;
+ boolean mKeyguardDrawComplete;
+ boolean mWindowManagerDrawComplete;
boolean mOrientationSensorEnabled = false;
int mCurrentAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
boolean mHasSoftInput = false;
@@ -543,12 +543,10 @@
private static final int MSG_KEYGUARD_DRAWN_COMPLETE = 5;
private static final int MSG_KEYGUARD_DRAWN_TIMEOUT = 6;
private static final int MSG_WINDOW_MANAGER_DRAWN_COMPLETE = 7;
- private static final int MSG_WAKING_UP = 8;
private static final int MSG_DISPATCH_SHOW_RECENTS = 9;
private static final int MSG_DISPATCH_SHOW_GLOBAL_ACTIONS = 10;
private static final int MSG_HIDE_BOOT_MESSAGE = 11;
private static final int MSG_LAUNCH_VOICE_ASSIST_WITH_WAKE_LOCK = 12;
- private static final int MSG_SCREEN_TURNING_ON = 13;
private class PolicyHandler extends Handler {
@Override
@@ -584,18 +582,12 @@
if (DEBUG_WAKEUP) Slog.w(TAG, "Setting mWindowManagerDrawComplete");
finishWindowsDrawn();
break;
- case MSG_WAKING_UP:
- handleWakingUp();
- break;
case MSG_HIDE_BOOT_MESSAGE:
handleHideBootMessage();
break;
case MSG_LAUNCH_VOICE_ASSIST_WITH_WAKE_LOCK:
launchVoiceAssistWithWakeLock(msg.arg1 != 0);
break;
- case MSG_SCREEN_TURNING_ON:
- handleScreenTurningOn((ScreenOnListener)msg.obj);
- break;
}
}
}
@@ -766,11 +758,11 @@
}
//Could have been invoked due to screen turning on or off or
//change of the currently visible window's orientation
- if (localLOGV) Slog.v(TAG, "Screen status="+mAwakeEarly+
- ", current orientation="+mCurrentAppOrientation+
- ", SensorEnabled="+mOrientationSensorEnabled);
+ if (localLOGV) Slog.v(TAG, "mScreenOnEarly=" + mScreenOnEarly
+ + ", mAwake=" + mAwake + ", mCurrentAppOrientation=" + mCurrentAppOrientation
+ + ", mOrientationSensorEnabled=" + mOrientationSensorEnabled);
boolean disable = true;
- if (mAwakeEarly) {
+ if (mScreenOnEarly && mAwake) {
if (needSensorRunningLp()) {
disable = false;
//enable listener if not already enabled
@@ -1332,7 +1324,7 @@
}
private boolean shouldEnableWakeGestureLp() {
- return mWakeGestureEnabledSetting && !mAwakeEarly
+ return mWakeGestureEnabledSetting && !mAwake
&& (!mLidControlsSleep || mLidState != LID_CLOSED)
&& mWakeGestureListener.isSupported();
}
@@ -4728,45 +4720,51 @@
}
}
+ // Called on the PowerManager's Notifier thread.
@Override
public void goingToSleep(int why) {
EventLog.writeEvent(70000, 0);
if (DEBUG_WAKEUP) Slog.i(TAG, "Going to sleep...");
+
+ // We must get this work done here because the power manager will drop
+ // the wake lock and let the system suspend once this function returns.
synchronized (mLock) {
- mAwakeEarly = false;
- mAwakeFully = false;
- }
- if (mKeyguardDelegate != null) {
- mKeyguardDelegate.onScreenTurnedOff(why);
- }
- synchronized (mLock) {
+ mAwake = false;
+ mKeyguardDrawComplete = false;
updateWakeGestureListenerLp();
updateOrientationListenerLp();
updateLockScreenTimeout();
}
+
+ if (mKeyguardDelegate != null) {
+ mKeyguardDelegate.onScreenTurnedOff(why);
+ }
}
+ // Called on the PowerManager's Notifier thread.
@Override
public void wakingUp() {
EventLog.writeEvent(70000, 1);
if (DEBUG_WAKEUP) Slog.i(TAG, "Waking up...");
- mHandler.obtainMessage(MSG_WAKING_UP).sendToTarget();
- }
- // Called on the mHandler thread.
- private void handleWakingUp() {
+ // Since goToSleep performs these functions synchronously, we must
+ // do the same here. We cannot post this work to a handler because
+ // that might cause it to become reordered with respect to what
+ // may happen in a future call to goToSleep.
synchronized (mLock) {
- mAwakeEarly = true;
+ mAwake = true;
+ mKeyguardDrawComplete = false;
+ if (mKeyguardDelegate != null) {
+ mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);
+ mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT, 1000);
+ }
+
updateWakeGestureListenerLp();
updateOrientationListenerLp();
updateLockScreenTimeout();
}
- mKeyguardDrawComplete = false;
- mWindowManagerDrawComplete = false; // wait for later call to screenTurningOn
if (mKeyguardDelegate != null) {
- mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);
- mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT, 1000);
mKeyguardDelegate.onScreenTurnedOn(mKeyguardDelegateCallback);
// ... eventually calls finishKeyguardDrawn
} else {
@@ -4775,94 +4773,130 @@
}
}
- // Called on the mHandler thread.
private void finishKeyguardDrawn() {
- if (!mKeyguardDrawComplete) {
+ synchronized (mLock) {
+ if (!mAwake || mKeyguardDrawComplete) {
+ return; // spurious
+ }
+
mKeyguardDrawComplete = true;
- mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);
- finishScreenTurningOn();
+ if (mKeyguardDelegate != null) {
+ mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);
+ }
+ }
+
+ finishScreenTurningOn();
+ }
+
+ // Called on the DisplayManager's DisplayPowerController thread.
+ @Override
+ public void screenTurnedOff() {
+ if (DEBUG_WAKEUP) Slog.i(TAG, "Screen turned off...");
+
+ synchronized (mLock) {
+ mScreenOnEarly = false;
+ mScreenOnFully = false;
+ mWindowManagerDrawComplete = false;
+ mScreenOnListener = null;
+ updateOrientationListenerLp();
}
}
+ // Called on the DisplayManager's DisplayPowerController thread.
@Override
public void screenTurningOn(final ScreenOnListener screenOnListener) {
- EventLog.writeEvent(70000, 1);
if (DEBUG_WAKEUP) Slog.i(TAG, "Screen turning on...");
- mHandler.obtainMessage(MSG_SCREEN_TURNING_ON, screenOnListener).sendToTarget();
- }
- // Called on the mHandler thread.
- private void handleScreenTurningOn(ScreenOnListener screenOnListener) {
- mScreenOnListener = screenOnListener;
+ synchronized (mLock) {
+ mScreenOnEarly = true;
+ mScreenOnFully = false;
+ mWindowManagerDrawComplete = false;
+ mScreenOnListener = screenOnListener;
+ updateOrientationListenerLp();
+ }
- mWindowManagerDrawComplete = false;
mWindowManagerInternal.waitForAllWindowsDrawn(mWindowManagerDrawCallback,
WAITING_FOR_DRAWN_TIMEOUT);
// ... eventually calls finishWindowsDrawn
}
- // Called on the mHandler thread.
private void finishWindowsDrawn() {
- if (!mWindowManagerDrawComplete) {
+ synchronized (mLock) {
+ if (!mScreenOnEarly || mWindowManagerDrawComplete) {
+ return; // spurious
+ }
+
mWindowManagerDrawComplete = true;
- finishScreenTurningOn();
}
+
+ finishScreenTurningOn();
}
- // Called on the mHandler thread.
private void finishScreenTurningOn() {
- if (DEBUG_WAKEUP) Slog.d(TAG,
- "finishScreenTurningOn: mAwakeEarly=" + mAwakeEarly
- + " mKeyguardDrawComplete=" + mKeyguardDrawComplete
- + " mWindowManagerDrawComplete=" + mWindowManagerDrawComplete);
- boolean awake;
+ final ScreenOnListener listener;
+ final boolean enableScreen;
synchronized (mLock) {
- if ((mAwakeEarly && !mKeyguardDrawComplete)
- || !mWindowManagerDrawComplete) {
- return;
+ if (DEBUG_WAKEUP) Slog.d(TAG,
+ "finishScreenTurningOn: mAwake=" + mAwake
+ + ", mScreenOnEarly=" + mScreenOnEarly
+ + ", mScreenOnFully=" + mScreenOnFully
+ + ", mKeyguardDrawComplete=" + mKeyguardDrawComplete
+ + ", mWindowManagerDrawComplete=" + mWindowManagerDrawComplete);
+
+ if (mScreenOnFully || !mScreenOnEarly || !mWindowManagerDrawComplete
+ || (mAwake && !mKeyguardDrawComplete)) {
+ return; // spurious or not ready yet
}
- if (mAwakeEarly) {
- mAwakeFully = true;
- }
- awake = mAwakeFully;
- }
-
- if (DEBUG_WAKEUP) Slog.i(TAG, "Finished screen turning on...");
-
- if (mScreenOnListener != null) {
- mScreenOnListener.onScreenOn();
+ if (DEBUG_WAKEUP) Slog.i(TAG, "Finished screen turning on...");
+ listener = mScreenOnListener;
mScreenOnListener = null;
+ mScreenOnFully = true;
+
+ // Remember the first time we draw the keyguard so we know when we're done with
+ // the main part of booting and can enable the screen and hide boot messages.
+ if (!mKeyguardDrawnOnce && mAwake) {
+ mKeyguardDrawnOnce = true;
+ enableScreen = true;
+ if (mBootMessageNeedsHiding) {
+ mBootMessageNeedsHiding = false;
+ hideBootMessages();
+ }
+ } else {
+ enableScreen = false;
+ }
}
- if (awake) {
- setKeyguardDrawnFirstTime();
+ if (listener != null) {
+ listener.onScreenOn();
+ }
- if (mBootMessageNeedsHiding) {
- handleHideBootMessage();
- mBootMessageNeedsHiding = false;
+ if (enableScreen) {
+ try {
+ mWindowManager.enableScreenIfNeeded();
+ } catch (RemoteException unhandled) {
}
}
}
private void handleHideBootMessage() {
- if (mBootMsgDialog == null) {
- if (DEBUG_WAKEUP) Slog.d(TAG, "handleHideBootMessage: boot message not up");
- return;
+ synchronized (mLock) {
+ if (!mKeyguardDrawnOnce) {
+ mBootMessageNeedsHiding = true;
+ return; // keyguard hasn't drawn the first time yet, not done booting
+ }
}
- if (!mKeyguardDrawComplete || !mWindowManagerDrawComplete) {
- if (DEBUG_WAKEUP) Slog.d(TAG, "handleHideBootMessage: deferring until keyguard ready");
- mBootMessageNeedsHiding = true;
- return;
+
+ if (mBootMsgDialog != null) {
+ if (DEBUG_WAKEUP) Slog.d(TAG, "handleHideBootMessage: dismissing");
+ mBootMsgDialog.dismiss();
+ mBootMsgDialog = null;
}
- if (DEBUG_WAKEUP) Slog.d(TAG, "handleHideBootMessage: dismissing");
- mBootMsgDialog.dismiss();
- mBootMsgDialog = null;
}
@Override
- public boolean isAwake() {
- return mAwakeFully;
+ public boolean isScreenOn() {
+ return mScreenOnFully;
}
/** {@inheritDoc} */
@@ -4936,20 +4970,10 @@
}
}
- private void setKeyguardDrawnFirstTime() {
- synchronized (mLock) {
- mKeyguardDrawn = true;
- }
- try {
- mWindowManager.enableScreenIfNeeded();
- } catch (RemoteException unhandled) {
- }
- }
-
@Override
public boolean isKeyguardDrawnLw() {
synchronized (mLock) {
- return mKeyguardDrawn;
+ return mKeyguardDrawnOnce;
}
}
@@ -5380,7 +5404,7 @@
private void updateLockScreenTimeout() {
synchronized (mScreenLockTimeout) {
- boolean enable = (mAllowLockscreenWhenOn && mAwakeEarly &&
+ boolean enable = (mAllowLockscreenWhenOn && mAwake &&
mKeyguardDelegate != null && mKeyguardDelegate.isSecure());
if (mLockScreenTimerActive != enable) {
if (enable) {
@@ -5918,9 +5942,13 @@
pw.print("mShortPressOnPowerBehavior="); pw.print(mShortPressOnPowerBehavior);
pw.print(" mLongPressOnPowerBehavior="); pw.println(mLongPressOnPowerBehavior);
pw.print(prefix); pw.print("mHasSoftInput="); pw.println(mHasSoftInput);
- pw.print(prefix); pw.print("mAwakeEarly="); pw.print(mAwakeEarly);
- pw.print(" mAwakeFully="); pw.print(mAwakeFully);
- pw.print(" mOrientationSensorEnabled="); pw.println(mOrientationSensorEnabled);
+ pw.print(prefix); pw.print("mAwake="); pw.println(mAwake);
+ pw.print(prefix); pw.print("mScreenOnEarly="); pw.print(mScreenOnEarly);
+ pw.print(" mScreenOnFully="); pw.println(mScreenOnFully);
+ pw.print(prefix); pw.print("mKeyguardDrawComplete="); pw.print(mKeyguardDrawComplete);
+ pw.print(" mWindowManagerDrawComplete="); pw.println(mWindowManagerDrawComplete);
+ pw.print(prefix); pw.print("mOrientationSensorEnabled=");
+ pw.println(mOrientationSensorEnabled);
pw.print(prefix); pw.print("mOverscanScreen=("); pw.print(mOverscanScreenLeft);
pw.print(","); pw.print(mOverscanScreenTop);
pw.print(") "); pw.print(mOverscanScreenWidth);
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 967681b..a3c64d0 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -979,12 +979,10 @@
enforceAccessPermission();
final int uid = Binder.getCallingUid();
final ArrayList<NetworkInfo> result = Lists.newArrayList();
- synchronized (mRulesLock) {
- for (int networkType = 0; networkType <= ConnectivityManager.MAX_NETWORK_TYPE;
- networkType++) {
- if (getNetworkInfoForType(networkType) != null) {
- result.add(getFilteredNetworkInfo(networkType, uid));
- }
+ for (int networkType = 0; networkType <= ConnectivityManager.MAX_NETWORK_TYPE;
+ networkType++) {
+ if (getNetworkInfoForType(networkType) != null) {
+ result.add(getFilteredNetworkInfo(networkType, uid));
}
}
return result.toArray(new NetworkInfo[result.size()]);
@@ -1078,15 +1076,13 @@
enforceAccessPermission();
final int uid = Binder.getCallingUid();
final ArrayList<NetworkState> result = Lists.newArrayList();
- synchronized (mRulesLock) {
- for (int networkType = 0; networkType <= ConnectivityManager.MAX_NETWORK_TYPE;
- networkType++) {
- if (getNetworkInfoForType(networkType) != null) {
- final NetworkInfo info = getFilteredNetworkInfo(networkType, uid);
- final LinkProperties lp = getLinkPropertiesForTypeInternal(networkType);
- final NetworkCapabilities netcap = getNetworkCapabilitiesForType(networkType);
- result.add(new NetworkState(info, lp, netcap));
- }
+ for (int networkType = 0; networkType <= ConnectivityManager.MAX_NETWORK_TYPE;
+ networkType++) {
+ if (getNetworkInfoForType(networkType) != null) {
+ final NetworkInfo info = getFilteredNetworkInfo(networkType, uid);
+ final LinkProperties lp = getLinkPropertiesForTypeInternal(networkType);
+ final NetworkCapabilities netcap = getNetworkCapabilitiesForType(networkType);
+ result.add(new NetworkState(info, lp, netcap));
}
}
return result.toArray(new NetworkState[result.size()]);
@@ -1888,36 +1884,6 @@
}
break;
}
- case NetworkAgent.EVENT_BLOCK_ADDRESS_FAMILY: {
- NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);
- if (nai == null) {
- loge("EVENT_BLOCK_ADDRESS_FAMILY from unknown NetworkAgent");
- break;
- }
- try {
- mNetd.blockAddressFamily((Integer) msg.obj, nai.network.netId,
- nai.linkProperties.getInterfaceName());
- } catch (Exception e) {
- // Never crash!
- loge("Exception in blockAddressFamily: " + e);
- }
- break;
- }
- case NetworkAgent.EVENT_UNBLOCK_ADDRESS_FAMILY: {
- NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);
- if (nai == null) {
- loge("EVENT_UNBLOCK_ADDRESS_FAMILY from unknown NetworkAgent");
- break;
- }
- try {
- mNetd.unblockAddressFamily((Integer) msg.obj, nai.network.netId,
- nai.linkProperties.getInterfaceName());
- } catch (Exception e) {
- // Never crash!
- loge("Exception in blockAddressFamily: " + e);
- }
- break;
- }
case NetworkAgent.EVENT_SET_EXPLICITLY_SELECTED: {
NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);
if (nai == null) {
@@ -4132,8 +4098,9 @@
if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
== false) {
final int uidRules;
+ final int uid = Binder.getCallingUid();
synchronized(mRulesLock) {
- uidRules = mUidRules.get(Binder.getCallingUid(), RULE_ALLOW_ALL);
+ uidRules = mUidRules.get(uid, RULE_ALLOW_ALL);
}
if ((uidRules & RULE_REJECT_METERED) != 0) {
// we could silently fail or we can filter the available nets to only give
@@ -4273,13 +4240,17 @@
LinkProperties newLp = networkAgent.linkProperties;
int netId = networkAgent.network.netId;
+ // The NetworkAgentInfo does not know whether clatd is running on its network or not. Before
+ // we do anything else, make sure its LinkProperties are accurate.
+ mClat.fixupLinkProperties(networkAgent, oldLp);
+
updateInterfaces(newLp, oldLp, netId);
updateMtu(newLp, oldLp);
- updateTcpBufferSizes(networkAgent);
// TODO - figure out what to do for clat
// for (LinkProperties lp : newLp.getStackedLinks()) {
// updateMtu(lp, null);
// }
+ updateTcpBufferSizes(networkAgent);
final boolean flushDns = updateRoutes(newLp, oldLp, netId);
updateDnses(newLp, oldLp, netId, flushDns);
updateClat(newLp, oldLp, networkAgent);
@@ -4287,23 +4258,14 @@
}
private void updateClat(LinkProperties newLp, LinkProperties oldLp, NetworkAgentInfo na) {
- // Update 464xlat state.
- if (mClat.requiresClat(na)) {
+ final boolean wasRunningClat = mClat.isRunningClat(na);
+ final boolean shouldRunClat = Nat464Xlat.requiresClat(na);
- // If the connection was previously using clat, but is not using it now, stop the clat
- // daemon. Normally, this happens automatically when the connection disconnects, but if
- // the disconnect is not reported, or if the connection's LinkProperties changed for
- // some other reason (e.g., handoff changes the IP addresses on the link), it would
- // still be running. If it's not running, then stopping it is a no-op.
- if (Nat464Xlat.isRunningClat(oldLp) && !Nat464Xlat.isRunningClat(newLp)) {
- mClat.stopClat();
- }
- // If the link requires clat to be running, then start the daemon now.
- if (na.networkInfo.isConnected()) {
- mClat.startClat(na);
- } else {
- mClat.stopClat();
- }
+ if (!wasRunningClat && shouldRunClat) {
+ // Start clatd. If it's already been started but is not running yet, this is a no-op.
+ mClat.startClat(na);
+ } else if (wasRunningClat && !shouldRunClat) {
+ mClat.stopClat();
}
}
diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java
index adfbb16..b708c3f 100644
--- a/services/core/java/com/android/server/LockSettingsService.java
+++ b/services/core/java/com/android/server/LockSettingsService.java
@@ -115,16 +115,20 @@
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- // Update keystore settings for profiles which use the same password as their parent
if (Intent.ACTION_USER_ADDED.equals(intent.getAction())) {
final int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
+ final int userSysUid = UserHandle.getUid(userHandle, Process.SYSTEM_UID);
+ final KeyStore ks = KeyStore.getInstance();
+
+ // Clear up keystore in case anything was left behind by previous users
+ ks.resetUid(userSysUid);
+
+ // If this user has a parent, sync with its keystore password
final UserManager um = (UserManager) mContext.getSystemService(USER_SERVICE);
final UserInfo parentInfo = um.getProfileParent(userHandle);
if (parentInfo != null) {
- final KeyStore ks = KeyStore.getInstance();
- final int profileUid = UserHandle.getUid(userHandle, Process.SYSTEM_UID);
- final int parentUid = UserHandle.getUid(parentInfo.id, Process.SYSTEM_UID);
- ks.syncUid(parentUid, profileUid);
+ final int parentSysUid = UserHandle.getUid(parentInfo.id, Process.SYSTEM_UID);
+ ks.syncUid(parentSysUid, userSysUid);
}
}
}
@@ -530,6 +534,10 @@
} finally {
db.endTransaction();
}
+
+ final KeyStore ks = KeyStore.getInstance();
+ final int userUid = UserHandle.getUid(userId, Process.SYSTEM_UID);
+ ks.resetUid(userUid);
}
private void writeFile(String name, byte[] hash) {
diff --git a/services/core/java/com/android/server/MasterClearReceiver.java b/services/core/java/com/android/server/MasterClearReceiver.java
index e88bdf8..f1d5aa3 100644
--- a/services/core/java/com/android/server/MasterClearReceiver.java
+++ b/services/core/java/com/android/server/MasterClearReceiver.java
@@ -38,6 +38,7 @@
}
final boolean shutdown = intent.getBooleanExtra("shutdown", false);
+ final String reason = intent.getStringExtra(Intent.EXTRA_REASON);
Slog.w(TAG, "!!! FACTORY RESET !!!");
// The reboot call is blocking, so we need to do it on another thread.
@@ -45,7 +46,7 @@
@Override
public void run() {
try {
- RecoverySystem.rebootWipeUserData(context, shutdown);
+ RecoverySystem.rebootWipeUserData(context, shutdown, reason);
Log.wtf(TAG, "Still running after master clear?!");
} catch (IOException e) {
Slog.e(TAG, "Can't perform master clear/factory reset", e);
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index 6144078..822007a 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -28,8 +28,6 @@
import static android.net.RouteInfo.RTN_THROW;
import static android.net.RouteInfo.RTN_UNICAST;
import static android.net.RouteInfo.RTN_UNREACHABLE;
-import static android.system.OsConstants.AF_INET;
-import static android.system.OsConstants.AF_INET6;
import static com.android.server.NetworkManagementService.NetdResponseCode.ClatdStatusResult;
import static com.android.server.NetworkManagementService.NetdResponseCode.InterfaceGetCfgResult;
import static com.android.server.NetworkManagementService.NetdResponseCode.InterfaceListResult;
@@ -2131,37 +2129,4 @@
public void removeInterfaceFromLocalNetwork(String iface) {
modifyInterfaceInNetwork("remove", "local", iface);
}
-
- @Override
- public void blockAddressFamily(int family, int netId, String iface) {
- modifyAddressFamily("add", family, netId, iface);
- }
-
- @Override
- public void unblockAddressFamily(int family, int netId, String iface) {
- modifyAddressFamily("remove", family, netId, iface);
- }
-
- // TODO: get rid of this and add RTN_UNREACHABLE routes instead.
- private void modifyAddressFamily(String action, int family, int netId, String iface) {
- mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
-
- final Command cmd = new Command("network", "route", action, netId, iface);
-
- if (family == AF_INET) {
- cmd.appendArg(Inet4Address.ANY.getHostAddress() + "/0");
- } else if (family == AF_INET6) {
- cmd.appendArg(Inet6Address.ANY.getHostAddress() + "/0");
- } else {
- throw new IllegalStateException(family + " is neither " + AF_INET + " nor " + AF_INET6);
- }
-
- cmd.appendArg("unreachable");
-
- try {
- mConnector.execute(cmd);
- } catch (NativeDaemonConnectorException e) {
- throw e.rethrowAsParcelableException();
- }
- }
}
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 34d7cb3..8e8e4a6 100755
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -895,6 +895,11 @@
while (clist.size() > 0) {
ConnectionRecord r = clist.get(0);
removeConnectionLocked(r, null, null);
+ if (clist.size() > 0 && clist.get(0) == r) {
+ // In case it didn't get removed above, do it now.
+ Slog.wtf(TAG, "Connection " + r + " not removed for binder " + binder);
+ clist.remove(0);
+ }
if (r.binding.service.app != null) {
// This could have made the service less important.
@@ -1904,7 +1909,8 @@
}
}
- boolean attachApplicationLocked(ProcessRecord proc, String processName) throws Exception {
+ boolean attachApplicationLocked(ProcessRecord proc, String processName)
+ throws RemoteException {
boolean didSomething = false;
// Collect any services that are waiting for this process to come up.
if (mPendingServices.size() > 0) {
@@ -1924,7 +1930,7 @@
realStartServiceLocked(sr, proc, sr.createdFromFg);
didSomething = true;
}
- } catch (Exception e) {
+ } catch (RemoteException e) {
Slog.w(TAG, "Exception in new application when starting service "
+ sr.shortName, e);
throw e;
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 993b995..d2e3d25 100755
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -1986,9 +1986,12 @@
@Override
public void onPackageRemoved(String packageName, int uid) {
// Remove all tasks with activities in the specified package from the list of recent tasks
+ final int eventUserId = getChangingUserId();
synchronized (ActivityManagerService.this) {
for (int i = mRecentTasks.size() - 1; i >= 0; i--) {
TaskRecord tr = mRecentTasks.get(i);
+ if (tr.userId != eventUserId) continue;
+
ComponentName cn = tr.intent.getComponent();
if (cn != null && cn.getPackageName().equals(packageName)) {
// If the package name matches, remove the task and kill the process
@@ -2006,28 +2009,36 @@
@Override
public void onPackageModified(String packageName) {
+ final int eventUserId = getChangingUserId();
final PackageManager pm = mContext.getPackageManager();
final ArrayList<Pair<Intent, Integer>> recentTaskIntents =
new ArrayList<Pair<Intent, Integer>>();
+ final HashSet<ComponentName> componentsKnownToExist = new HashSet<ComponentName>();
final ArrayList<Integer> tasksToRemove = new ArrayList<Integer>();
// Copy the list of recent tasks so that we don't hold onto the lock on
// ActivityManagerService for long periods while checking if components exist.
synchronized (ActivityManagerService.this) {
for (int i = mRecentTasks.size() - 1; i >= 0; i--) {
TaskRecord tr = mRecentTasks.get(i);
+ if (tr.userId != eventUserId) continue;
+
recentTaskIntents.add(new Pair<Intent, Integer>(tr.intent, tr.taskId));
}
}
// Check the recent tasks and filter out all tasks with components that no longer exist.
- Intent tmpI = new Intent();
for (int i = recentTaskIntents.size() - 1; i >= 0; i--) {
Pair<Intent, Integer> p = recentTaskIntents.get(i);
ComponentName cn = p.first.getComponent();
if (cn != null && cn.getPackageName().equals(packageName)) {
+ if (componentsKnownToExist.contains(cn)) {
+ // If we know that the component still exists in the package, then skip
+ continue;
+ }
try {
- // Add the task to the list to remove if the component no longer exists
- tmpI.setComponent(cn);
- if (pm.queryIntentActivities(tmpI, PackageManager.MATCH_DEFAULT_ONLY).isEmpty()) {
+ ActivityInfo info = pm.getActivityInfo(cn, eventUserId);
+ if (info != null && info.isEnabled()) {
+ componentsKnownToExist.add(cn);
+ } else {
tasksToRemove.add(p.second);
}
} catch (Exception e) {}
@@ -2046,11 +2057,12 @@
@Override
public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit) {
// Force stop the specified packages
+ int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
if (packages != null) {
for (String pkg : packages) {
synchronized (ActivityManagerService.this) {
- if (forceStopPackageLocked(pkg, -1, false, false, false, false, false, 0,
- "finished booting")) {
+ if (forceStopPackageLocked(pkg, -1, false, false, false, false, false,
+ userId, "finished booting")) {
return true;
}
}
@@ -2617,7 +2629,7 @@
int lrui = mLruProcesses.lastIndexOf(app);
if (lrui >= 0) {
if (!app.killed) {
- Slog.wtf(TAG, "Removing process that hasn't been killed: " + app);
+ Slog.wtfStack(TAG, "Removing process that hasn't been killed: " + app);
Process.killProcessQuiet(app.pid);
Process.killProcessGroup(app.info.uid, app.pid);
}
@@ -6114,7 +6126,7 @@
// todo: Yikes! What should we do? For now we will try to
// start another process, but that could easily get us in
// an infinite loop of restarting processes...
- Slog.w(TAG, "Exception thrown during bind!", e);
+ Slog.wtf(TAG, "Exception thrown during bind of " + app, e);
app.resetPackageList(mProcessStats);
app.unlinkDeathRecipient();
@@ -6138,6 +6150,7 @@
didSomething = true;
}
} catch (Exception e) {
+ Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
badApp = true;
}
}
@@ -6147,6 +6160,7 @@
try {
didSomething |= mServices.attachApplicationLocked(app, processName);
} catch (Exception e) {
+ Slog.wtf(TAG, "Exception thrown starting services in " + app, e);
badApp = true;
}
}
@@ -6157,6 +6171,7 @@
didSomething |= sendPendingBroadcastsLocked(app);
} catch (Exception e) {
// If the app died trying to launch the receiver we declare it 'bad'
+ Slog.wtf(TAG, "Exception thrown dispatching broadcasts in " + app, e);
badApp = true;
}
}
@@ -6170,14 +6185,13 @@
compatibilityInfoForPackageLocked(mBackupTarget.appInfo),
mBackupTarget.backupMode);
} catch (Exception e) {
- Slog.w(TAG, "Exception scheduling backup agent creation: ");
- e.printStackTrace();
+ Slog.wtf(TAG, "Exception thrown creating backup agent in " + app, e);
+ badApp = true;
}
}
if (badApp) {
- // todo: Also need to kill application to deal with all
- // kinds of exceptions.
+ app.kill("error during init", true);
handleAppDiedLocked(app, false, true);
return false;
}
@@ -6269,7 +6283,7 @@
}
// Register receivers to handle package update events
- mPackageMonitor.register(mContext, Looper.getMainLooper(), false);
+ mPackageMonitor.register(mContext, Looper.getMainLooper(), UserHandle.ALL, false);
// Let system services know.
mSystemServiceManager.startBootPhase(SystemService.PHASE_BOOT_COMPLETED);
@@ -8386,6 +8400,10 @@
@Override
public Bitmap getTaskDescriptionIcon(String filename) {
+ if (!FileUtils.isValidExtFilename(filename)
+ || !filename.contains(ActivityRecord.ACTIVITY_ICON_SUFFIX)) {
+ throw new IllegalArgumentException("Bad filename: " + filename);
+ }
return mTaskPersister.getTaskDescriptionIcon(filename);
}
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 2db7cec..198273e 100755
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -79,7 +79,7 @@
private static final String ATTR_LAUNCHEDFROMPACKAGE = "launched_from_package";
private static final String ATTR_RESOLVEDTYPE = "resolved_type";
private static final String ATTR_COMPONENTSPECIFIED = "component_specified";
- private static final String ACTIVITY_ICON_SUFFIX = "_activity_icon_";
+ static final String ACTIVITY_ICON_SUFFIX = "_activity_icon_";
final ActivityManagerService service; // owner
final IApplicationToken.Stub appToken; // window manager token
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 482a582..83a8d45 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -503,7 +503,7 @@
return resumedActivity;
}
- boolean attachApplicationLocked(ProcessRecord app) throws Exception {
+ boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {
final String processName = app.processName;
boolean didSomething = false;
for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
@@ -521,7 +521,7 @@
if (realStartActivityLocked(hr, app, true, true)) {
didSomething = true;
}
- } catch (Exception e) {
+ } catch (RemoteException e) {
Slog.w(TAG, "Exception in new application when starting activity "
+ hr.intent.getComponent().flattenToShortString(), e);
throw e;
diff --git a/services/core/java/com/android/server/am/ProcessStatsService.java b/services/core/java/com/android/server/am/ProcessStatsService.java
index 7ec14c29..28e46a4 100644
--- a/services/core/java/com/android/server/am/ProcessStatsService.java
+++ b/services/core/java/com/android/server/am/ProcessStatsService.java
@@ -146,7 +146,9 @@
final ArrayMap<String, ProcessStats.ServiceState> services = pkg.mServices;
for (int isvc=services.size()-1; isvc>=0; isvc--) {
final ProcessStats.ServiceState service = services.valueAt(isvc);
- if (service.isInUse()) {
+ if (service.isRestarting()) {
+ service.setRestarting(true, memFactor, now);
+ } else if (service.isInUse()) {
if (service.mStartedState != ProcessStats.STATE_NOTHING) {
service.setStarted(true, memFactor, now);
}
@@ -157,7 +159,6 @@
service.setExecuting(true, memFactor, now);
}
}
-
}
}
}
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index 73c9783..4dfd23b 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -783,7 +783,7 @@
int findEffectiveRootIndex() {
int effectiveNdx = 0;
final int topActivityNdx = mActivities.size() - 1;
- for (int activityNdx = 0; activityNdx < topActivityNdx; ++activityNdx) {
+ for (int activityNdx = 0; activityNdx <= topActivityNdx; ++activityNdx) {
final ActivityRecord r = mActivities.get(activityNdx);
if (r.finishing) {
continue;
diff --git a/services/core/java/com/android/server/connectivity/Nat464Xlat.java b/services/core/java/com/android/server/connectivity/Nat464Xlat.java
index 096ab66..c382be0 100644
--- a/services/core/java/com/android/server/connectivity/Nat464Xlat.java
+++ b/services/core/java/com/android/server/connectivity/Nat464Xlat.java
@@ -89,17 +89,20 @@
* @param network the NetworkAgentInfo corresponding to the network.
* @return true if the network requires clat, false otherwise.
*/
- public boolean requiresClat(NetworkAgentInfo network) {
- int netType = network.networkInfo.getType();
- LinkProperties lp = network.linkProperties;
+ public static boolean requiresClat(NetworkAgentInfo nai) {
+ final int netType = nai.networkInfo.getType();
+ final boolean connected = nai.networkInfo.isConnected();
+ final boolean hasIPv4Address =
+ (nai.linkProperties != null) ? nai.linkProperties.hasIPv4Address() : false;
+ Slog.d(TAG, "requiresClat: netType=" + netType +
+ ", connected=" + connected +
+ ", hasIPv4Address=" + hasIPv4Address);
// Only support clat on mobile for now.
- Slog.d(TAG, "requiresClat: netType=" + netType + ", hasIPv4Address=" +
- lp.hasIPv4Address());
- return netType == TYPE_MOBILE && !lp.hasIPv4Address();
+ return netType == TYPE_MOBILE && connected && !hasIPv4Address;
}
- public static boolean isRunningClat(LinkProperties lp) {
- return lp != null && lp.getAllInterfaceNames().contains(CLAT_INTERFACE_NAME);
+ public boolean isRunningClat(NetworkAgentInfo network) {
+ return mNetworkMessenger == network.messenger;
}
/**
@@ -149,14 +152,6 @@
}
}
- public boolean isStarted() {
- return mIsStarted;
- }
-
- public boolean isRunning() {
- return mIsRunning;
- }
-
private void updateConnectivityService() {
Message msg = mHandler.obtainMessage(
NetworkAgent.EVENT_NETWORK_PROPERTIES_CHANGED, mBaseLP);
@@ -165,6 +160,21 @@
msg.sendToTarget();
}
+ // Copies the stacked clat link in oldLp, if any, to the LinkProperties in nai.
+ public void fixupLinkProperties(NetworkAgentInfo nai, LinkProperties oldLp) {
+ if (isRunningClat(nai) &&
+ nai.linkProperties != null &&
+ !nai.linkProperties.getAllInterfaceNames().contains(CLAT_INTERFACE_NAME)) {
+ Slog.d(TAG, "clatd running, updating NAI for " + nai.linkProperties.getInterfaceName());
+ for (LinkProperties stacked: oldLp.getStackedLinks()) {
+ if (CLAT_INTERFACE_NAME.equals(stacked.getInterfaceName())) {
+ nai.linkProperties.addStackedLink(stacked);
+ break;
+ }
+ }
+ }
+ }
+
@Override
public void interfaceAdded(String iface) {
if (iface.equals(CLAT_INTERFACE_NAME)) {
@@ -175,17 +185,18 @@
// Create the LinkProperties for the clat interface by fetching the
// IPv4 address for the interface and adding an IPv4 default route,
// then stack the LinkProperties on top of the link it's running on.
- // Although the clat interface is a point-to-point tunnel, we don't
- // point the route directly at the interface because some apps don't
- // understand routes without gateways (see, e.g., http://b/9597256
- // http://b/9597516). Instead, set the next hop of the route to the
- // clat IPv4 address itself (for those apps, it doesn't matter what
- // the IP of the gateway is, only that there is one).
try {
InterfaceConfiguration config = mNMService.getInterfaceConfig(iface);
LinkAddress clatAddress = config.getLinkAddress();
mLP.clear();
mLP.setInterfaceName(iface);
+
+ // Although the clat interface is a point-to-point tunnel, we don't
+ // point the route directly at the interface because some apps don't
+ // understand routes without gateways (see, e.g., http://b/9597256
+ // http://b/9597516). Instead, set the next hop of the route to the
+ // clat IPv4 address itself (for those apps, it doesn't matter what
+ // the IP of the gateway is, only that there is one).
RouteInfo ipv4Default = new RouteInfo(new LinkAddress(Inet4Address.ANY, 0),
clatAddress.getAddress(), iface);
mLP.addRoute(ipv4Default);
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index 4100ae9..3f6b71a 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -19,6 +19,7 @@
import static android.Manifest.permission.BIND_VPN_SERVICE;
import static android.os.UserHandle.PER_USER_RANGE;
import static android.net.RouteInfo.RTN_THROW;
+import static android.net.RouteInfo.RTN_UNREACHABLE;
import static android.system.OsConstants.AF_INET;
import static android.system.OsConstants.AF_INET6;
@@ -107,8 +108,6 @@
private String mPackage;
private int mOwnerUID;
private String mInterface;
- private boolean mAllowIPv4;
- private boolean mAllowIPv6;
private Connection mConnection;
private LegacyVpnRunner mLegacyVpnRunner;
private PendingIntent mStatusIntent;
@@ -344,33 +343,47 @@
return mNetworkInfo;
}
- private void agentConnect() {
+ private LinkProperties makeLinkProperties() {
+ boolean allowIPv4 = mConfig.allowIPv4;
+ boolean allowIPv6 = mConfig.allowIPv6;
+
LinkProperties lp = new LinkProperties();
+
lp.setInterfaceName(mInterface);
- boolean hasDefaultRoute = false;
- for (RouteInfo route : mConfig.routes) {
- lp.addRoute(route);
- if (route.isDefaultRoute()) hasDefaultRoute = true;
+ if (mConfig.addresses != null) {
+ for (LinkAddress address : mConfig.addresses) {
+ lp.addLinkAddress(address);
+ allowIPv4 |= address.getAddress() instanceof Inet4Address;
+ allowIPv6 |= address.getAddress() instanceof Inet6Address;
+ }
}
- if (hasDefaultRoute) {
- mNetworkCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
- } else {
- mNetworkCapabilities.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+
+ if (mConfig.routes != null) {
+ for (RouteInfo route : mConfig.routes) {
+ lp.addRoute(route);
+ InetAddress address = route.getDestination().getAddress();
+ allowIPv4 |= address instanceof Inet4Address;
+ allowIPv6 |= address instanceof Inet6Address;
+ }
}
if (mConfig.dnsServers != null) {
for (String dnsServer : mConfig.dnsServers) {
InetAddress address = InetAddress.parseNumericAddress(dnsServer);
lp.addDnsServer(address);
- if (address instanceof Inet4Address) {
- mAllowIPv4 = true;
- } else {
- mAllowIPv6 = true;
- }
+ allowIPv4 |= address instanceof Inet4Address;
+ allowIPv6 |= address instanceof Inet6Address;
}
}
+ if (!allowIPv4) {
+ lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE));
+ }
+ if (!allowIPv6) {
+ lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE));
+ }
+
// Concatenate search domains into a string.
StringBuilder buffer = new StringBuilder();
if (mConfig.searchDomains != null) {
@@ -380,6 +393,20 @@
}
lp.setDomains(buffer.toString().trim());
+ // TODO: Stop setting the MTU in jniCreate and set it here.
+
+ return lp;
+ }
+
+ private void agentConnect() {
+ LinkProperties lp = makeLinkProperties();
+
+ if (lp.hasIPv4DefaultRoute() || lp.hasIPv6DefaultRoute()) {
+ mNetworkCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+ } else {
+ mNetworkCapabilities.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+ }
+
mNetworkInfo.setIsAvailable(true);
mNetworkInfo.setDetailedState(DetailedState.CONNECTED, null, null);
@@ -399,13 +426,6 @@
Binder.restoreCallingIdentity(token);
}
- if (!mAllowIPv4) {
- mNetworkAgent.blockAddressFamily(AF_INET);
- }
- if (!mAllowIPv6) {
- mNetworkAgent.blockAddressFamily(AF_INET6);
- }
-
addVpnUserLocked(mUserHandle);
// If we are owner assign all Restricted Users to this VPN
if (mUserHandle == UserHandle.USER_OWNER) {
@@ -491,8 +511,6 @@
NetworkAgent oldNetworkAgent = mNetworkAgent;
mNetworkAgent = null;
List<UidRange> oldUsers = mVpnUsers;
- boolean oldAllowIPv4 = mAllowIPv4;
- boolean oldAllowIPv6 = mAllowIPv6;
// Configure the interface. Abort if any of these steps fails.
ParcelFileDescriptor tun = ParcelFileDescriptor.adoptFd(jniCreate(config.mtu));
@@ -525,8 +543,6 @@
// Set up forwarding and DNS rules.
mVpnUsers = new ArrayList<UidRange>();
- mAllowIPv4 = mConfig.allowIPv4;
- mAllowIPv6 = mConfig.allowIPv6;
agentConnect();
@@ -556,8 +572,6 @@
mVpnUsers = oldUsers;
mNetworkAgent = oldNetworkAgent;
mInterface = oldInterface;
- mAllowIPv4 = oldAllowIPv4;
- mAllowIPv6 = oldAllowIPv6;
throw e;
}
Log.i(TAG, "Established by " + config.user + " on " + mInterface);
@@ -780,25 +794,9 @@
return false;
}
boolean success = jniAddAddress(mInterface, address, prefixLength);
- if (success && (!mAllowIPv4 || !mAllowIPv6)) {
- try {
- InetAddress inetAddress = InetAddress.parseNumericAddress(address);
- if ((inetAddress instanceof Inet4Address) && !mAllowIPv4) {
- mAllowIPv4 = true;
- mNetworkAgent.unblockAddressFamily(AF_INET);
- } else if ((inetAddress instanceof Inet6Address) && !mAllowIPv6) {
- mAllowIPv6 = true;
- mNetworkAgent.unblockAddressFamily(AF_INET6);
- }
- } catch (IllegalArgumentException e) {
- // ignore
- }
+ if (mNetworkAgent != null) {
+ mNetworkAgent.sendLinkProperties(makeLinkProperties());
}
- // Ideally, we'd call mNetworkAgent.sendLinkProperties() here to notify ConnectivityService
- // that the LinkAddress has changed. But we don't do so for two reasons: (1) We don't set
- // LinkAddresses on the LinkProperties we establish in the first place (see agentConnect())
- // and (2) CS doesn't do anything with LinkAddresses anyway (see updateLinkProperties()).
- // TODO: Maybe fix this.
return success;
}
@@ -807,11 +805,9 @@
return false;
}
boolean success = jniDelAddress(mInterface, address, prefixLength);
- // Ideally, we'd call mNetworkAgent.sendLinkProperties() here to notify ConnectivityService
- // that the LinkAddress has changed. But we don't do so for two reasons: (1) We don't set
- // LinkAddresses on the LinkProperties we establish in the first place (see agentConnect())
- // and (2) CS doesn't do anything with LinkAddresses anyway (see updateLinkProperties()).
- // TODO: Maybe fix this.
+ if (mNetworkAgent != null) {
+ mNetworkAgent.sendLinkProperties(makeLinkProperties());
+ }
return success;
}
@@ -1284,8 +1280,6 @@
// Now INetworkManagementEventObserver is watching our back.
mInterface = mConfig.interfaze;
mVpnUsers = new ArrayList<UidRange>();
- mAllowIPv4 = mConfig.allowIPv4;
- mAllowIPv6 = mConfig.allowIPv6;
agentConnect();
diff --git a/services/core/java/com/android/server/display/DisplayDevice.java b/services/core/java/com/android/server/display/DisplayDevice.java
index 16554d3..683212a 100644
--- a/services/core/java/com/android/server/display/DisplayDevice.java
+++ b/services/core/java/com/android/server/display/DisplayDevice.java
@@ -108,8 +108,12 @@
/**
* Sets the display state, if supported.
+ *
+ * @return A runnable containing work to be deferred until after we have
+ * exited the critical section, or null if none.
*/
- public void requestDisplayStateLocked(int state) {
+ public Runnable requestDisplayStateLocked(int state) {
+ return null;
}
/**
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index e609701..43c01cd 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -63,6 +63,7 @@
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
/**
@@ -214,6 +215,11 @@
private final DisplayViewport mTempDefaultViewport = new DisplayViewport();
private final DisplayViewport mTempExternalTouchViewport = new DisplayViewport();
+ // Temporary list of deferred work to perform when setting the display state.
+ // Only used by requestDisplayState. The field is self-synchronized and only
+ // intended for use inside of the requestGlobalDisplayStateInternal function.
+ private final ArrayList<Runnable> mTempDisplayStateWorkQueue = new ArrayList<Runnable>();
+
public DisplayManagerService(Context context) {
super(context);
mContext = context;
@@ -318,11 +324,26 @@
}
private void requestGlobalDisplayStateInternal(int state) {
- synchronized (mSyncRoot) {
- if (mGlobalDisplayState != state) {
- mGlobalDisplayState = state;
- updateGlobalDisplayStateLocked();
- scheduleTraversalLocked(false);
+ synchronized (mTempDisplayStateWorkQueue) {
+ try {
+ // Update the display state within the lock.
+ synchronized (mSyncRoot) {
+ if (mGlobalDisplayState != state) {
+ mGlobalDisplayState = state;
+ updateGlobalDisplayStateLocked(mTempDisplayStateWorkQueue);
+ scheduleTraversalLocked(false);
+ }
+ }
+
+ // Setting the display power state can take hundreds of milliseconds
+ // to complete so we defer the most expensive part of the work until
+ // after we have exited the critical section to avoid blocking other
+ // threads for a long time.
+ for (int i = 0; i < mTempDisplayStateWorkQueue.size(); i++) {
+ mTempDisplayStateWorkQueue.get(i).run();
+ }
+ } finally {
+ mTempDisplayStateWorkQueue.clear();
}
}
}
@@ -669,21 +690,25 @@
scheduleTraversalLocked(false);
}
- private void updateGlobalDisplayStateLocked() {
+ private void updateGlobalDisplayStateLocked(List<Runnable> workQueue) {
final int count = mDisplayDevices.size();
for (int i = 0; i < count; i++) {
DisplayDevice device = mDisplayDevices.get(i);
- updateDisplayStateLocked(device);
+ Runnable runnable = updateDisplayStateLocked(device);
+ if (runnable != null) {
+ workQueue.add(runnable);
+ }
}
}
- private void updateDisplayStateLocked(DisplayDevice device) {
+ private Runnable updateDisplayStateLocked(DisplayDevice device) {
// Blank or unblank the display immediately to match the state requested
// by the display power controller (if known).
DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
if ((info.flags & DisplayDeviceInfo.FLAG_NEVER_BLANK) == 0) {
- device.requestDisplayStateLocked(mGlobalDisplayState);
+ return device.requestDisplayStateLocked(mGlobalDisplayState);
}
+ return null;
}
// Adds a new logical display based on the given display device.
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 67d9776..e2a548a 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -43,6 +43,7 @@
import android.util.Spline;
import android.util.TimeUtils;
import android.view.Display;
+import android.view.WindowManagerPolicy;
import java.io.PrintWriter;
@@ -65,7 +66,7 @@
* does not need to worry about holding a suspend blocker unless it happens
* independently of the display ready signal.
*
- * For debugging, you can make the electron beam and brightness animations run
+ * For debugging, you can make the color fade and brightness animations run
* slower by changing the "animator duration scale" option in Development Settings.
*/
final class DisplayPowerController implements AutomaticBrightnessController.Callbacks {
@@ -76,13 +77,12 @@
private static final String SCREEN_ON_BLOCKED_TRACE_NAME = "Screen on blocked";
- // If true, uses the electron beam on animation.
+ // If true, uses the color fade on animation.
// We might want to turn this off if we cannot get a guarantee that the screen
// actually turns on and starts showing new content after the call to set the
// screen state returns. Playing the animation can also be somewhat slow.
private static final boolean USE_COLOR_FADE_ON_ANIMATION = false;
-
// The minimum reduction in brightness when dimmed.
private static final int SCREEN_DIM_MINIMUM_REDUCTION = 10;
@@ -91,6 +91,7 @@
private static final int MSG_UPDATE_POWER_STATE = 1;
private static final int MSG_PROXIMITY_SENSOR_DEBOUNCED = 2;
+ private static final int MSG_SCREEN_ON_UNBLOCKED = 3;
private static final int PROXIMITY_UNKNOWN = -1;
private static final int PROXIMITY_NEGATIVE = 0;
@@ -127,6 +128,9 @@
// The sensor manager.
private final SensorManager mSensorManager;
+ // The window manager policy.
+ private final WindowManagerPolicy mWindowManagerPolicy;
+
// The display blanker.
private final DisplayBlanker mBlanker;
@@ -152,7 +156,7 @@
private boolean mUseSoftwareAutoBrightnessConfig;
// True if we should fade the screen while turning it off, false if we should play
- // a stylish electron beam animation instead.
+ // a stylish color fade animation instead.
private boolean mColorFadeFadesConfig;
// The pending power request.
@@ -214,8 +218,14 @@
// When the screen turns on again, we report user activity to the power manager.
private boolean mScreenOffBecauseOfProximity;
- // True if the screen on is being blocked.
- private boolean mScreenOnWasBlocked;
+ // The currently active screen on unblocker. This field is non-null whenever
+ // we are waiting for a callback to release it and unblock the screen.
+ private ScreenOnUnblocker mPendingScreenOnUnblocker;
+
+ // True if we were in the process of turning off the screen.
+ // This allows us to recover more gracefully from situations where we abort
+ // turning off the screen.
+ private boolean mPendingScreenOff;
// The elapsed real time when the screen on was blocked.
private long mScreenOnBlockStartRealTime;
@@ -246,6 +256,7 @@
mBatteryStats = BatteryStatsService.getService();
mLights = LocalServices.getService(LightsManager.class);
mSensorManager = sensorManager;
+ mWindowManagerPolicy = LocalServices.getService(WindowManagerPolicy.class);
mBlanker = blanker;
mContext = context;
@@ -633,7 +644,7 @@
// Report whether the display is ready for use and all changes have been applied.
if (mustNotify
- && !mScreenOnWasBlocked
+ && mPendingScreenOnUnblocker == null
&& !mColorFadeOnAnimator.isStarted()
&& !mColorFadeOffAnimator.isStarted()
&& !mScreenBrightnessRampAnimator.isAnimating()
@@ -657,32 +668,53 @@
}
private void blockScreenOn() {
- if (!mScreenOnWasBlocked) {
+ if (mPendingScreenOnUnblocker == null) {
Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, SCREEN_ON_BLOCKED_TRACE_NAME, 0);
- mScreenOnWasBlocked = true;
+ mPendingScreenOnUnblocker = new ScreenOnUnblocker();
mScreenOnBlockStartRealTime = SystemClock.elapsedRealtime();
Slog.i(TAG, "Blocking screen on until initial contents have been drawn.");
}
}
private void unblockScreenOn() {
- if (mScreenOnWasBlocked) {
- mScreenOnWasBlocked = false;
+ if (mPendingScreenOnUnblocker != null) {
+ mPendingScreenOnUnblocker = null;
long delay = SystemClock.elapsedRealtime() - mScreenOnBlockStartRealTime;
Slog.i(TAG, "Unblocked screen on after " + delay + " ms");
Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, SCREEN_ON_BLOCKED_TRACE_NAME, 0);
}
}
- private void setScreenState(int state) {
+ private boolean setScreenState(int state) {
if (mPowerState.getScreenState() != state) {
+ final boolean wasOn = (mPowerState.getScreenState() != Display.STATE_OFF);
mPowerState.setScreenState(state);
+
+ // Tell battery stats about the transition.
try {
mBatteryStats.noteScreenState(state);
} catch (RemoteException ex) {
// same process
}
+
+ // Tell the window manager what's happening.
+ // Temporarily block turning the screen on until the window manager is ready
+ // by leaving a black surface covering the screen. This surface is essentially
+ // the final state of the color fade animation.
+ boolean isOn = (state != Display.STATE_OFF);
+ if (wasOn && !isOn) {
+ unblockScreenOn();
+ mWindowManagerPolicy.screenTurnedOff();
+ } else if (!wasOn && isOn) {
+ if (mPowerState.getColorFadeLevel() == 0.0f) {
+ blockScreenOn();
+ } else {
+ unblockScreenOn();
+ }
+ mWindowManagerPolicy.screenTurningOn(mPendingScreenOnUnblocker);
+ }
}
+ return mPendingScreenOnUnblocker == null;
}
private int clampScreenBrightness(int value) {
@@ -707,21 +739,21 @@
return;
}
- // Temporarily block turning the screen on if requested and there is already a
- // black surface covering the screen.
- if (mPowerRequest.blockScreenOn
- && mPowerState.getColorFadeLevel() == 0.0f
- && target != Display.STATE_OFF) {
- blockScreenOn();
- return;
+ // If we were in the process of turning off the screen but didn't quite
+ // finish. Then finish up now to prevent a jarring transition back
+ // to screen on if we skipped blocking screen on as usual.
+ if (mPendingScreenOff && target != Display.STATE_OFF) {
+ setScreenState(Display.STATE_OFF);
+ mPendingScreenOff = false;
}
if (target == Display.STATE_ON) {
// Want screen on. The contents of the screen may not yet
- // be visible if the electron beam has not been dismissed because
+ // be visible if the color fade has not been dismissed because
// its last frame of animation is solid black.
- unblockScreenOn();
- setScreenState(Display.STATE_ON);
+ if (!setScreenState(Display.STATE_ON)) {
+ return; // screen on blocked
+ }
if (USE_COLOR_FADE_ON_ANIMATION && mPowerRequest.isBrightOrDim()) {
// Perform screen on animation.
if (mPowerState.getColorFadeLevel() == 1.0f) {
@@ -749,9 +781,12 @@
return;
}
- // Set screen state and dismiss the black surface without fanfare.
- unblockScreenOn();
- setScreenState(Display.STATE_DOZE);
+ // Set screen state.
+ if (!setScreenState(Display.STATE_DOZE)) {
+ return; // screen on blocked
+ }
+
+ // Dismiss the black surface without fanfare.
mPowerState.setColorFadeLevel(1.0f);
mPowerState.dismissColorFade();
} else if (target == Display.STATE_DOZE_SUSPEND) {
@@ -763,18 +798,26 @@
return;
}
- // Set screen state and dismiss the black surface without fanfare.
- unblockScreenOn();
- setScreenState(Display.STATE_DOZE_SUSPEND);
+ // If not already suspending, temporarily set the state to doze until the
+ // screen on is unblocked, then suspend.
+ if (mPowerState.getScreenState() != Display.STATE_DOZE_SUSPEND) {
+ if (!setScreenState(Display.STATE_DOZE)) {
+ return; // screen on blocked
+ }
+ setScreenState(Display.STATE_DOZE_SUSPEND); // already on so can't block
+ }
+
+ // Dismiss the black surface without fanfare.
mPowerState.setColorFadeLevel(1.0f);
mPowerState.dismissColorFade();
} else {
// Want screen off.
- unblockScreenOn();
+ mPendingScreenOff = true;
if (mPowerState.getColorFadeLevel() == 0.0f) {
// Turn the screen off.
// A black surface is already hiding the contents of the screen.
setScreenState(Display.STATE_OFF);
+ mPendingScreenOff = false;
} else if (performScreenOffTransition
&& mPowerState.prepareColorFade(mContext,
mColorFadeFadesConfig ?
@@ -968,6 +1011,8 @@
pw.println(" mAppliedAutoBrightness=" + mAppliedAutoBrightness);
pw.println(" mAppliedDimming=" + mAppliedDimming);
pw.println(" mAppliedLowPower=" + mAppliedLowPower);
+ pw.println(" mPendingScreenOnUnblocker=" + mPendingScreenOnUnblocker);
+ pw.println(" mPendingScreenOff=" + mPendingScreenOff);
pw.println(" mScreenBrightnessRampAnimator.isAnimating()=" +
mScreenBrightnessRampAnimator.isAnimating());
@@ -1052,6 +1097,13 @@
case MSG_PROXIMITY_SENSOR_DEBOUNCED:
debounceProximitySensor();
break;
+
+ case MSG_SCREEN_ON_UNBLOCKED:
+ if (mPendingScreenOnUnblocker == msg.obj) {
+ unblockScreenOn();
+ updatePowerState();
+ }
+ break;
}
}
}
@@ -1072,4 +1124,13 @@
// Not used.
}
};
+
+ private final class ScreenOnUnblocker implements WindowManagerPolicy.ScreenOnListener {
+ @Override
+ public void onScreenOn() {
+ Message msg = mHandler.obtainMessage(MSG_SCREEN_ON_UNBLOCKED, this);
+ msg.setAsynchronous(true);
+ mHandler.sendMessage(msg);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 9c91ab5..24cf423 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -222,19 +222,31 @@
}
@Override
- public void requestDisplayStateLocked(int state) {
+ public Runnable requestDisplayStateLocked(final int state) {
if (mState != state) {
+ final int displayId = mBuiltInDisplayId;
+ final IBinder token = getDisplayTokenLocked();
final int mode = getPowerModeForState(state);
- Trace.traceBegin(Trace.TRACE_TAG_POWER, "requestDisplayState("
- + Display.stateToString(state) + ", id=" + mBuiltInDisplayId + ")");
- try {
- SurfaceControl.setDisplayPowerMode(getDisplayTokenLocked(), mode);
- } finally {
- Trace.traceEnd(Trace.TRACE_TAG_POWER);
- }
mState = state;
updateDeviceInfoLocked();
+
+ // Defer actually setting the display power mode until we have exited
+ // the critical section since it can take hundreds of milliseconds
+ // to complete.
+ return new Runnable() {
+ @Override
+ public void run() {
+ Trace.traceBegin(Trace.TRACE_TAG_POWER, "requestDisplayState("
+ + Display.stateToString(state) + ", id=" + displayId + ")");
+ try {
+ SurfaceControl.setDisplayPowerMode(token, mode);
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_POWER);
+ }
+ }
+ };
}
+ return null;
}
@Override
diff --git a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
index a6a9a89..c2b4478 100644
--- a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java
@@ -188,7 +188,7 @@
}
@Override
- public void requestDisplayStateLocked(int state) {
+ public Runnable requestDisplayStateLocked(int state) {
if (state != mDisplayState) {
mDisplayState = state;
if (state == Display.STATE_OFF) {
@@ -197,6 +197,7 @@
mCallback.dispatchDisplayResumed();
}
}
+ return null;
}
@Override
diff --git a/services/core/java/com/android/server/display/WifiDisplayAdapter.java b/services/core/java/com/android/server/display/WifiDisplayAdapter.java
index 9d008b9..a17d731 100644
--- a/services/core/java/com/android/server/display/WifiDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/WifiDisplayAdapter.java
@@ -16,18 +16,13 @@
package com.android.server.display;
-import com.android.internal.R;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.IndentingPrintWriter;
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.res.Resources;
import android.hardware.display.DisplayManager;
import android.hardware.display.WifiDisplay;
import android.hardware.display.WifiDisplaySessionInfo;
@@ -38,7 +33,6 @@
import android.os.Looper;
import android.os.Message;
import android.os.UserHandle;
-import android.provider.Settings;
import android.util.Slog;
import android.view.Display;
import android.view.Surface;
@@ -71,17 +65,12 @@
private static final boolean DEBUG = false;
private static final int MSG_SEND_STATUS_CHANGE_BROADCAST = 1;
- private static final int MSG_UPDATE_NOTIFICATION = 2;
private static final String ACTION_DISCONNECT = "android.server.display.wfd.DISCONNECT";
private final WifiDisplayHandler mHandler;
private final PersistentDataStore mPersistentDataStore;
private final boolean mSupportsProtectedBuffers;
- private final NotificationManager mNotificationManager;
-
- private PendingIntent mSettingsPendingIntent;
- private PendingIntent mDisconnectPendingIntent;
private WifiDisplayController mDisplayController;
private WifiDisplayDevice mDisplayDevice;
@@ -97,7 +86,6 @@
private WifiDisplaySessionInfo mSessionInfo;
private boolean mPendingStatusChangeBroadcast;
- private boolean mPendingNotificationUpdate;
// Called with SyncRoot lock held.
public WifiDisplayAdapter(DisplayManagerService.SyncRoot syncRoot,
@@ -108,8 +96,6 @@
mPersistentDataStore = persistentDataStore;
mSupportsProtectedBuffers = context.getResources().getBoolean(
com.android.internal.R.bool.config_wifiDisplaySupportsProtectedBuffers);
- mNotificationManager = (NotificationManager)context.getSystemService(
- Context.NOTIFICATION_SERVICE);
}
@Override
@@ -125,7 +111,6 @@
pw.println("mAvailableDisplays=" + Arrays.toString(mAvailableDisplays));
pw.println("mRememberedDisplays=" + Arrays.toString(mRememberedDisplays));
pw.println("mPendingStatusChangeBroadcast=" + mPendingStatusChangeBroadcast);
- pw.println("mPendingNotificationUpdate=" + mPendingNotificationUpdate);
pw.println("mSupportsProtectedBuffers=" + mSupportsProtectedBuffers);
// Try to dump the controller state.
@@ -421,13 +406,6 @@
}
}
- private void scheduleUpdateNotificationLocked() {
- if (!mPendingNotificationUpdate) {
- mPendingNotificationUpdate = true;
- mHandler.sendEmptyMessage(MSG_UPDATE_NOTIFICATION);
- }
- }
-
// Runs on the handler.
private void handleSendStatusChangeBroadcast() {
final Intent intent;
@@ -447,87 +425,6 @@
getContext().sendBroadcastAsUser(intent, UserHandle.ALL);
}
- // Runs on the handler.
- private void handleUpdateNotification() {
- final int state;
- final WifiDisplay display;
- synchronized (getSyncRoot()) {
- if (!mPendingNotificationUpdate) {
- return;
- }
-
- mPendingNotificationUpdate = false;
- state = mActiveDisplayState;
- display = mActiveDisplay;
- }
-
- // Cancel the old notification if there is one.
- mNotificationManager.cancelAsUser(null,
- R.string.wifi_display_notification_disconnect, UserHandle.ALL);
-
- if (state == WifiDisplayStatus.DISPLAY_STATE_CONNECTING
- || state == WifiDisplayStatus.DISPLAY_STATE_CONNECTED) {
- Context context = getContext();
-
- // Initialize pending intents for the notification outside of the lock because
- // creating a pending intent requires a call into the activity manager.
- if (mSettingsPendingIntent == null) {
- Intent settingsIntent = new Intent(Settings.ACTION_WIFI_DISPLAY_SETTINGS);
- settingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
- | Intent.FLAG_ACTIVITY_CLEAR_TOP);
- mSettingsPendingIntent = PendingIntent.getActivityAsUser(
- context, 0, settingsIntent, 0, null, UserHandle.CURRENT);
- }
-
- if (mDisconnectPendingIntent == null) {
- Intent disconnectIntent = new Intent(ACTION_DISCONNECT);
- mDisconnectPendingIntent = PendingIntent.getBroadcastAsUser(
- context, 0, disconnectIntent, 0, UserHandle.CURRENT);
- }
-
- // Post the notification.
- Resources r = context.getResources();
- Notification notification;
- if (state == WifiDisplayStatus.DISPLAY_STATE_CONNECTING) {
- notification = new Notification.Builder(context)
- .setContentTitle(r.getString(
- R.string.wifi_display_notification_connecting_title))
- .setContentText(r.getString(
- R.string.wifi_display_notification_connecting_message,
- display.getFriendlyDisplayName()))
- .setContentIntent(mSettingsPendingIntent)
- .setSmallIcon(R.drawable.ic_notification_cast_connecting)
- .setOngoing(true)
- .addAction(android.R.drawable.ic_menu_close_clear_cancel,
- r.getString(R.string.wifi_display_notification_disconnect),
- mDisconnectPendingIntent)
- .setColor(r.getColor(
- com.android.internal.R.color.system_notification_accent_color))
- .build();
- } else {
- notification = new Notification.Builder(context)
- .setContentTitle(r.getString(
- R.string.wifi_display_notification_connected_title))
- .setContentText(r.getString(
- R.string.wifi_display_notification_connected_message,
- display.getFriendlyDisplayName()))
- .setContentIntent(mSettingsPendingIntent)
- .setSmallIcon(R.drawable.ic_notification_cast_on)
- .setOngoing(true)
- .addAction(android.R.drawable.ic_menu_close_clear_cancel,
- r.getString(R.string.wifi_display_notification_disconnect),
- mDisconnectPendingIntent)
- .setColor(r.getColor(
- com.android.internal.R.color.system_notification_accent_color))
- .build();
- }
- mNotificationManager.notifyAsUser(null,
- R.string.wifi_display_notification_disconnect,
- notification, UserHandle.ALL);
- }
- }
-
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -605,7 +502,6 @@
mActiveDisplayState = WifiDisplayStatus.DISPLAY_STATE_CONNECTING;
mActiveDisplay = display;
scheduleStatusChangedBroadcastLocked();
- scheduleUpdateNotificationLocked();
}
}
}
@@ -618,7 +514,6 @@
mActiveDisplayState = WifiDisplayStatus.DISPLAY_STATE_NOT_CONNECTED;
mActiveDisplay = null;
scheduleStatusChangedBroadcastLocked();
- scheduleUpdateNotificationLocked();
}
}
}
@@ -636,7 +531,6 @@
mActiveDisplayState = WifiDisplayStatus.DISPLAY_STATE_CONNECTED;
mActiveDisplay = display;
scheduleStatusChangedBroadcastLocked();
- scheduleUpdateNotificationLocked();
}
}
}
@@ -659,7 +553,6 @@
mActiveDisplay = display;
renameDisplayDeviceLocked(display.getFriendlyDisplayName());
scheduleStatusChangedBroadcastLocked();
- scheduleUpdateNotificationLocked();
}
}
}
@@ -675,7 +568,6 @@
mActiveDisplayState = WifiDisplayStatus.DISPLAY_STATE_NOT_CONNECTED;
mActiveDisplay = null;
scheduleStatusChangedBroadcastLocked();
- scheduleUpdateNotificationLocked();
}
}
}
@@ -755,10 +647,6 @@
case MSG_SEND_STATUS_CHANGE_BROADCAST:
handleSendStatusChangeBroadcast();
break;
-
- case MSG_UPDATE_NOTIFICATION:
- handleUpdateNotification();
- break;
}
}
}
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index 30154d7..f456bcd 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -195,12 +195,13 @@
}
private void cancelJobsForUser(int userHandle) {
+ List<JobStatus> jobsForUser;
synchronized (mJobs) {
- List<JobStatus> jobsForUser = mJobs.getJobsByUser(userHandle);
- for (int i=0; i<jobsForUser.size(); i++) {
- JobStatus toRemove = jobsForUser.get(i);
- cancelJobLocked(toRemove);
- }
+ jobsForUser = mJobs.getJobsByUser(userHandle);
+ }
+ for (int i=0; i<jobsForUser.size(); i++) {
+ JobStatus toRemove = jobsForUser.get(i);
+ cancelJobImpl(toRemove);
}
}
@@ -208,16 +209,16 @@
* Entry point from client to cancel all jobs originating from their uid.
* This will remove the job from the master list, and cancel the job if it was staged for
* execution or being executed.
- * @param uid To check against for removal of a job.
+ * @param uid Uid to check against for removal of a job.
*/
public void cancelJobsForUid(int uid) {
- // Remove from master list.
+ List<JobStatus> jobsForUid;
synchronized (mJobs) {
- List<JobStatus> jobsForUid = mJobs.getJobsByUid(uid);
- for (int i=0; i<jobsForUid.size(); i++) {
- JobStatus toRemove = jobsForUid.get(i);
- cancelJobLocked(toRemove);
- }
+ jobsForUid = mJobs.getJobsByUid(uid);
+ }
+ for (int i=0; i<jobsForUid.size(); i++) {
+ JobStatus toRemove = jobsForUid.get(i);
+ cancelJobImpl(toRemove);
}
}
@@ -232,22 +233,23 @@
JobStatus toCancel;
synchronized (mJobs) {
toCancel = mJobs.getJobByUidAndJobId(uid, jobId);
- if (toCancel != null) {
- cancelJobLocked(toCancel);
- }
+ }
+ if (toCancel != null) {
+ cancelJobImpl(toCancel);
}
}
- private void cancelJobLocked(JobStatus cancelled) {
+ private void cancelJobImpl(JobStatus cancelled) {
if (DEBUG) {
Slog.d(TAG, "Cancelling: " + cancelled);
}
- // Remove from store.
stopTrackingJob(cancelled);
- // Remove from pending queue.
- mPendingJobs.remove(cancelled);
- // Cancel if running.
- stopJobOnServiceContextLocked(cancelled);
+ synchronized (mJobs) {
+ // Remove from pending queue.
+ mPendingJobs.remove(cancelled);
+ // Cancel if running.
+ stopJobOnServiceContextLocked(cancelled);
+ }
}
/**
@@ -482,21 +484,13 @@
// StateChangedListener implementations.
/**
- * Off-board work to our handler thread as quickly as possible, b/c this call is probably being
- * made on the main thread.
- * For now this takes the job and if it's ready to run it will run it. In future we might not
- * provide the job, so that the StateChangedListener has to run through its list of jobs to
- * see which are ready. This will further decouple the controllers from the execution logic.
+ * Posts a message to the {@link com.android.server.job.JobSchedulerService.JobHandler} that
+ * some controller's state has changed, so as to run through the list of jobs and start/stop
+ * any that are eligible.
*/
@Override
public void onControllerStateChanged() {
- synchronized (mJobs) {
- if (mReadyToRock) {
- // Post a message to to run through the list of jobs and start/stop any that
- // are eligible.
- mHandler.obtainMessage(MSG_CHECK_JOB).sendToTarget();
- }
- }
+ mHandler.obtainMessage(MSG_CHECK_JOB).sendToTarget();
}
@Override
@@ -512,21 +506,29 @@
@Override
public void handleMessage(Message message) {
+ synchronized (mJobs) {
+ if (!mReadyToRock) {
+ return;
+ }
+ }
switch (message.what) {
case MSG_JOB_EXPIRED:
synchronized (mJobs) {
JobStatus runNow = (JobStatus) message.obj;
// runNow can be null, which is a controller's way of indicating that its
// state is such that all ready jobs should be run immediately.
- if (runNow != null && !mPendingJobs.contains(runNow)) {
+ if (runNow != null && !mPendingJobs.contains(runNow)
+ && mJobs.containsJob(runNow)) {
mPendingJobs.add(runNow);
}
+ queueReadyJobsForExecutionLockedH();
}
- queueReadyJobsForExecutionH();
break;
case MSG_CHECK_JOB:
- // Check the list of jobs and run some of them if we feel inclined.
- maybeQueueReadyJobsForExecutionH();
+ synchronized (mJobs) {
+ // Check the list of jobs and run some of them if we feel inclined.
+ maybeQueueReadyJobsForExecutionLockedH();
+ }
break;
}
maybeRunPendingJobsH();
@@ -538,30 +540,28 @@
* Run through list of jobs and execute all possible - at least one is expired so we do
* as many as we can.
*/
- private void queueReadyJobsForExecutionH() {
- synchronized (mJobs) {
- ArraySet<JobStatus> jobs = mJobs.getJobs();
- if (DEBUG) {
- Slog.d(TAG, "queuing all ready jobs for execution:");
- }
- for (int i=0; i<jobs.size(); i++) {
- JobStatus job = jobs.valueAt(i);
- if (isReadyToBeExecutedLocked(job)) {
- if (DEBUG) {
- Slog.d(TAG, " queued " + job.toShortString());
- }
- mPendingJobs.add(job);
- } else if (isReadyToBeCancelledLocked(job)) {
- stopJobOnServiceContextLocked(job);
+ private void queueReadyJobsForExecutionLockedH() {
+ ArraySet<JobStatus> jobs = mJobs.getJobs();
+ if (DEBUG) {
+ Slog.d(TAG, "queuing all ready jobs for execution:");
+ }
+ for (int i=0; i<jobs.size(); i++) {
+ JobStatus job = jobs.valueAt(i);
+ if (isReadyToBeExecutedLocked(job)) {
+ if (DEBUG) {
+ Slog.d(TAG, " queued " + job.toShortString());
}
+ mPendingJobs.add(job);
+ } else if (isReadyToBeCancelledLocked(job)) {
+ stopJobOnServiceContextLocked(job);
}
- if (DEBUG) {
- final int queuedJobs = mPendingJobs.size();
- if (queuedJobs == 0) {
- Slog.d(TAG, "No jobs pending.");
- } else {
- Slog.d(TAG, queuedJobs + " jobs queued.");
- }
+ }
+ if (DEBUG) {
+ final int queuedJobs = mPendingJobs.size();
+ if (queuedJobs == 0) {
+ Slog.d(TAG, "No jobs pending.");
+ } else {
+ Slog.d(TAG, queuedJobs + " jobs queued.");
}
}
}
@@ -575,55 +575,53 @@
* If more than 4 jobs total are ready we send them all off.
* TODO: It would be nice to consolidate these sort of high-level policies somewhere.
*/
- private void maybeQueueReadyJobsForExecutionH() {
- synchronized (mJobs) {
- int chargingCount = 0;
- int idleCount = 0;
- int backoffCount = 0;
- int connectivityCount = 0;
- List<JobStatus> runnableJobs = new ArrayList<JobStatus>();
- ArraySet<JobStatus> jobs = mJobs.getJobs();
- for (int i=0; i<jobs.size(); i++) {
- JobStatus job = jobs.valueAt(i);
- if (isReadyToBeExecutedLocked(job)) {
- if (job.getNumFailures() > 0) {
- backoffCount++;
- }
- if (job.hasIdleConstraint()) {
- idleCount++;
- }
- if (job.hasConnectivityConstraint() || job.hasUnmeteredConstraint()) {
- connectivityCount++;
- }
- if (job.hasChargingConstraint()) {
- chargingCount++;
- }
- runnableJobs.add(job);
- } else if (isReadyToBeCancelledLocked(job)) {
- stopJobOnServiceContextLocked(job);
+ private void maybeQueueReadyJobsForExecutionLockedH() {
+ int chargingCount = 0;
+ int idleCount = 0;
+ int backoffCount = 0;
+ int connectivityCount = 0;
+ List<JobStatus> runnableJobs = new ArrayList<JobStatus>();
+ ArraySet<JobStatus> jobs = mJobs.getJobs();
+ for (int i=0; i<jobs.size(); i++) {
+ JobStatus job = jobs.valueAt(i);
+ if (isReadyToBeExecutedLocked(job)) {
+ if (job.getNumFailures() > 0) {
+ backoffCount++;
}
+ if (job.hasIdleConstraint()) {
+ idleCount++;
+ }
+ if (job.hasConnectivityConstraint() || job.hasUnmeteredConstraint()) {
+ connectivityCount++;
+ }
+ if (job.hasChargingConstraint()) {
+ chargingCount++;
+ }
+ runnableJobs.add(job);
+ } else if (isReadyToBeCancelledLocked(job)) {
+ stopJobOnServiceContextLocked(job);
}
- if (backoffCount > 0 ||
- idleCount >= MIN_IDLE_COUNT ||
- connectivityCount >= MIN_CONNECTIVITY_COUNT ||
- chargingCount >= MIN_CHARGING_COUNT ||
- runnableJobs.size() >= MIN_READY_JOBS_COUNT) {
- if (DEBUG) {
- Slog.d(TAG, "maybeQueueReadyJobsForExecutionH: Running jobs.");
- }
- for (int i=0; i<runnableJobs.size(); i++) {
- mPendingJobs.add(runnableJobs.get(i));
- }
- } else {
- if (DEBUG) {
- Slog.d(TAG, "maybeQueueReadyJobsForExecutionH: Not running anything.");
- }
- }
+ }
+ if (backoffCount > 0 ||
+ idleCount >= MIN_IDLE_COUNT ||
+ connectivityCount >= MIN_CONNECTIVITY_COUNT ||
+ chargingCount >= MIN_CHARGING_COUNT ||
+ runnableJobs.size() >= MIN_READY_JOBS_COUNT) {
if (DEBUG) {
- Slog.d(TAG, "idle=" + idleCount + " connectivity=" +
- connectivityCount + " charging=" + chargingCount + " tot=" +
- runnableJobs.size());
+ Slog.d(TAG, "maybeQueueReadyJobsForExecutionLockedH: Running jobs.");
}
+ for (int i=0; i<runnableJobs.size(); i++) {
+ mPendingJobs.add(runnableJobs.get(i));
+ }
+ } else {
+ if (DEBUG) {
+ Slog.d(TAG, "maybeQueueReadyJobsForExecutionLockedH: Not running anything.");
+ }
+ }
+ if (DEBUG) {
+ Slog.d(TAG, "idle=" + idleCount + " connectivity=" +
+ connectivityCount + " charging=" + chargingCount + " tot=" +
+ runnableJobs.size());
}
}
diff --git a/services/core/java/com/android/server/job/JobStore.java b/services/core/java/com/android/server/job/JobStore.java
index df12e1a..b64c677 100644
--- a/services/core/java/com/android/server/job/JobStore.java
+++ b/services/core/java/com/android/server/job/JobStore.java
@@ -50,15 +50,9 @@
import org.xmlpull.v1.XmlSerializer;
/**
- * Maintain a list of classes, and accessor methods/logic for these jobs.
- * This class offers the following functionality:
- * - When a job is added, it will determine if the job requirements have changed (update) and
- * whether the controllers need to be updated.
- * - Persists JobInfos, figures out when to to rewrite the JobInfo to disk.
- * - Handles rescheduling of jobs.
- * - When a periodic job is executed and must be re-added.
- * - When a job fails and the client requests that it be retried with backoff.
- * - This class <strong>is not</strong> thread-safe.
+ * Maintains the master list of jobs that the job scheduler is tracking. These jobs are compared by
+ * reference, so none of the functions in this class should make a copy.
+ * Also handles read/write of persisted jobs.
*
* Note on locking:
* All callers to this class must <strong>lock on the class object they are calling</strong>.
@@ -152,6 +146,10 @@
return false;
}
+ boolean containsJob(JobStatus jobStatus) {
+ return mJobSet.contains(jobStatus);
+ }
+
public int size() {
return mJobSet.size();
}
@@ -180,6 +178,10 @@
maybeWriteStatusToDiskAsync();
}
+ /**
+ * @param userHandle User for whom we are querying the list of jobs.
+ * @return A list of all the jobs scheduled by the provided user. Never null.
+ */
public List<JobStatus> getJobsByUser(int userHandle) {
List<JobStatus> matchingJobs = new ArrayList<JobStatus>();
Iterator<JobStatus> it = mJobSet.iterator();
@@ -194,7 +196,7 @@
/**
* @param uid Uid of the requesting app.
- * @return All JobStatus objects for a given uid from the master list.
+ * @return All JobStatus objects for a given uid from the master list. Never null.
*/
public List<JobStatus> getJobsByUid(int uid) {
List<JobStatus> matchingJobs = new ArrayList<JobStatus>();
diff --git a/services/core/java/com/android/server/location/GpsLocationProvider.java b/services/core/java/com/android/server/location/GpsLocationProvider.java
index f1c5a6c..0198e46 100644
--- a/services/core/java/com/android/server/location/GpsLocationProvider.java
+++ b/services/core/java/com/android/server/location/GpsLocationProvider.java
@@ -25,6 +25,7 @@
import com.android.internal.R;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.TelephonyIntents;
import android.app.AlarmManager;
import android.app.AppOpsManager;
@@ -227,6 +228,11 @@
private static final int GPS_GEOFENCE_ERROR_INVALID_TRANSITION = -103;
private static final int GPS_GEOFENCE_ERROR_GENERIC = -149;
+ // TCP/IP constants.
+ // Valid TCP/UDP port range is (0, 65535].
+ private static final int TCP_MIN_PORT = 0;
+ private static final int TCP_MAX_PORT = 0xffff;
+
// Value of batterySaverGpsMode such that GPS isn't affected by battery saver mode.
private static final int BATTERY_SAVER_MODE_NO_CHANGE = 0;
// Value of batterySaverGpsMode such that GPS is disabled when battery saver mode
@@ -332,7 +338,7 @@
// properties loaded from PROPERTIES_FILE
private Properties mProperties;
private String mSuplServerHost;
- private int mSuplServerPort;
+ private int mSuplServerPort = TCP_MIN_PORT;
private String mC2KServerHost;
private int mC2KServerPort;
private boolean mSuplEsEnabled = false;
@@ -487,7 +493,10 @@
|| Intent.ACTION_SCREEN_OFF.equals(action)
|| Intent.ACTION_SCREEN_ON.equals(action)) {
updateLowPowerMode();
- } else if (action.equals(SIM_STATE_CHANGED)) {
+ } else if (action.equals(SIM_STATE_CHANGED)
+ || action.equals(TelephonyIntents.ACTION_SUBINFO_CONTENT_CHANGE)
+ || action.equals(TelephonyIntents.ACTION_SUBINFO_RECORD_UPDATED)) {
+ Log.d(TAG, "received SIM realted action: " + action);
TelephonyManager phone = (TelephonyManager)
mContext.getSystemService(Context.TELEPHONY_SERVICE);
String mccMnc = phone.getSimOperator();
@@ -497,6 +506,8 @@
reloadGpsProperties(context, mProperties);
mNIHandler.setSuplEsEnabled(mSuplEsEnabled);
}
+ } else {
+ Log.d(TAG, "SIM MCC/MNC is still not available");
}
}
}
@@ -709,6 +720,10 @@
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
intentFilter.addAction(SIM_STATE_CHANGED);
+ // TODO: remove the use TelephonyIntents. We are using it because SIM_STATE_CHANGED
+ // is not reliable at the moment.
+ intentFilter.addAction(TelephonyIntents.ACTION_SUBINFO_CONTENT_CHANGE);
+ intentFilter.addAction(TelephonyIntents.ACTION_SUBINFO_RECORD_UPDATED);
mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, mHandler);
}
@@ -921,6 +936,11 @@
Log.e(TAG, "unable to parse SUPL_PORT: " + portString);
}
}
+ if (mSuplServerHost != null
+ && mSuplServerPort > TCP_MIN_PORT
+ && mSuplServerPort <= TCP_MAX_PORT) {
+ native_set_agps_server(AGPS_TYPE_SUPL, mSuplServerHost, mSuplServerPort);
+ }
}
/**
@@ -963,6 +983,8 @@
if (enabled) {
mSupportsXtra = native_supports_xtra();
+
+ // TODO: remove the following native calls if we can make sure they are redundant.
if (mSuplServerHost != null) {
native_set_agps_server(AGPS_TYPE_SUPL, mSuplServerHost, mSuplServerPort);
}
diff --git a/services/core/java/com/android/server/media/MediaSessionStack.java b/services/core/java/com/android/server/media/MediaSessionStack.java
index a9bc818..e464be7 100644
--- a/services/core/java/com/android/server/media/MediaSessionStack.java
+++ b/services/core/java/com/android/server/media/MediaSessionStack.java
@@ -94,8 +94,8 @@
mSessions.add(0, record);
clearCache();
return true;
- } else if (newState == PlaybackState.STATE_PAUSED) {
- // Just clear the volume cache in this case
+ } else if (!MediaSession.isActiveState(newState)) {
+ // Just clear the volume cache when a state goes inactive
mCachedVolumeDefault = null;
}
return false;
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 2829e2b..d8e5a98 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -154,6 +154,16 @@
static final boolean ENABLE_BLOCKED_NOTIFICATIONS = true;
static final boolean ENABLE_BLOCKED_TOASTS = true;
+ // When #matchesCallFilter is called from the ringer, wait at most
+ // 3s to resolve the contacts. This timeout is required since
+ // ContactsProvider might take a long time to start up.
+ //
+ // Return STARRED_CONTACT when the timeout is hit in order to avoid
+ // missed calls in ZEN mode "Important".
+ static final int MATCHES_CALL_FILTER_CONTACTS_TIMEOUT_MS = 3000;
+ static final float MATCHES_CALL_FILTER_TIMEOUT_AFFINITY =
+ ValidateNotificationPeople.STARRED_CONTACT;
+
private IActivityManager mAm;
AudioManager mAudioManager;
StatusBarManagerInternal mStatusBar;
@@ -1474,8 +1484,12 @@
@Override
public boolean matchesCallFilter(Bundle extras) {
enforceSystemOrSystemUI("INotificationManager.matchesCallFilter");
- return mZenModeHelper.matchesCallFilter(UserHandle.getCallingUserHandle(), extras,
- mRankingHelper.findExtractor(ValidateNotificationPeople.class));
+ return mZenModeHelper.matchesCallFilter(
+ UserHandle.getCallingUserHandle(),
+ extras,
+ mRankingHelper.findExtractor(ValidateNotificationPeople.class),
+ MATCHES_CALL_FILTER_CONTACTS_TIMEOUT_MS,
+ MATCHES_CALL_FILTER_TIMEOUT_AFFINITY);
}
};
diff --git a/services/core/java/com/android/server/notification/ValidateNotificationPeople.java b/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
index 1c1a034..6e2a8ad 100644
--- a/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
+++ b/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
@@ -22,6 +22,7 @@
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.UserHandle;
@@ -37,6 +38,8 @@
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Map;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
/**
* This {@link NotificationSignalExtractor} attempts to validate
@@ -45,9 +48,10 @@
* {@hide}
*/
public class ValidateNotificationPeople implements NotificationSignalExtractor {
- private static final String TAG = "ValidateNotificationPeople";
+ // Using a shorter log tag since setprop has a limit of 32chars on variable name.
+ private static final String TAG = "ValidateNoPeople";
private static final boolean INFO = true;
- private static final boolean DEBUG = false;
+ private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private static final boolean ENABLE_PEOPLE_VALIDATOR = true;
private static final String SETTING_ENABLE_PEOPLE_VALIDATOR =
@@ -132,7 +136,14 @@
// ignore: config has no relevant information yet.
}
- public float getContactAffinity(UserHandle userHandle, Bundle extras) {
+ /**
+ * @param extras extras of the notification with EXTRA_PEOPLE populated
+ * @param timeoutMs timeout in milliseconds to wait for contacts response
+ * @param timeoutAffinity affinity to return when the timeout specified via
+ * <code>timeoutMs</code> is hit
+ */
+ public float getContactAffinity(UserHandle userHandle, Bundle extras, int timeoutMs,
+ float timeoutAffinity) {
if (DEBUG) Slog.d(TAG, "checking affinity for " + userHandle);
if (extras == null) return NONE;
final String key = Long.toString(System.nanoTime());
@@ -143,8 +154,31 @@
}
final PeopleRankingReconsideration prr = validatePeople(context, key, extras, affinityOut);
float affinity = affinityOut[0];
+
if (prr != null) {
- prr.work();
+ // Perform the heavy work on a background thread so we can abort when we hit the
+ // timeout.
+ final Semaphore s = new Semaphore(0);
+ AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() {
+ @Override
+ public void run() {
+ prr.work();
+ s.release();
+ }
+ });
+
+ try {
+ if (!s.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
+ Slog.w(TAG, "Timeout while waiting for affinity: " + key + ". "
+ + "Returning timeoutAffinity=" + timeoutAffinity);
+ return timeoutAffinity;
+ }
+ } catch (InterruptedException e) {
+ Slog.w(TAG, "InterruptedException while waiting for affinity: " + key + ". "
+ + "Returning affinity=" + affinity, e);
+ return affinity;
+ }
+
affinity = Math.max(prr.getContactAffinity(), affinity);
}
return affinity;
@@ -391,6 +425,7 @@
@Override
public void work() {
if (INFO) Slog.i(TAG, "Executing: validation for: " + mKey);
+ long timeStartMs = System.currentTimeMillis();
for (final String handle: mPendingLookups) {
LookupResult lookupResult = null;
final Uri uri = Uri.parse(handle);
@@ -415,6 +450,10 @@
mContactAffinity = Math.max(mContactAffinity, lookupResult.getAffinity());
}
}
+ if (DEBUG) {
+ Slog.d(TAG, "Validation finished in " + (System.currentTimeMillis() - timeStartMs) +
+ "ms");
+ }
}
@Override
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index 5038d03..557a44e 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -376,14 +376,21 @@
return record.isCategory(Notification.CATEGORY_MESSAGE) || isDefaultMessagingApp(record);
}
+ /**
+ * @param extras extras of the notification with EXTRA_PEOPLE populated
+ * @param contactsTimeoutMs timeout in milliseconds to wait for contacts response
+ * @param timeoutAffinity affinity to return when the timeout specified via
+ * <code>contactsTimeoutMs</code> is hit
+ */
public boolean matchesCallFilter(UserHandle userHandle, Bundle extras,
- ValidateNotificationPeople validator) {
+ ValidateNotificationPeople validator, int contactsTimeoutMs, float timeoutAffinity) {
final int zen = mZenMode;
if (zen == Global.ZEN_MODE_NO_INTERRUPTIONS) return false; // nothing gets through
if (zen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS) {
if (!mConfig.allowCalls) return false; // no calls get through
if (validator != null) {
- final float contactAffinity = validator.getContactAffinity(userHandle, extras);
+ final float contactAffinity = validator.getContactAffinity(userHandle, extras,
+ contactsTimeoutMs, timeoutAffinity);
return audienceMatches(contactAffinity);
}
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 5a94f23..a61d621 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -5589,9 +5589,11 @@
// update the package settings accordingly.
pkg.cpuAbiOverride = cpuAbiOverride;
- Slog.d(TAG, "Resolved nativeLibraryRoot for " + pkg.applicationInfo.packageName
- + " to root=" + pkg.applicationInfo.nativeLibraryRootDir + ", isa="
- + pkg.applicationInfo.nativeLibraryRootRequiresIsa);
+ if (DEBUG_ABI_SELECTION) {
+ Slog.d(TAG, "Resolved nativeLibraryRoot for " + pkg.applicationInfo.packageName
+ + " to root=" + pkg.applicationInfo.nativeLibraryRootDir + ", isa="
+ + pkg.applicationInfo.nativeLibraryRootRequiresIsa);
+ }
// Push the derived path down into PackageSettings so we know what to
// clean up at uninstall time.
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 0dadee7..4e33ca8 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -2285,7 +2285,7 @@
Intent finalIntent = new Intent(intent);
finalIntent.setData(builder.build());
applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
- scheme, ssp, null, null, null, userId);
+ scheme, ssp, null, null, userId);
doScheme = false;
}
for (int iauth=0; iauth<tmpPa.countDataAuthorities(); iauth++) {
@@ -2302,7 +2302,7 @@
Intent finalIntent = new Intent(intent);
finalIntent.setData(builder.build());
applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
- scheme, null, auth, path, null, userId);
+ scheme, null, auth, path, userId);
doAuth = doScheme = false;
}
if (doAuth) {
@@ -2314,7 +2314,7 @@
Intent finalIntent = new Intent(intent);
finalIntent.setData(builder.build());
applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
- scheme, null, auth, null, null, userId);
+ scheme, null, auth, null, userId);
doScheme = false;
}
}
@@ -2324,7 +2324,7 @@
Intent finalIntent = new Intent(intent);
finalIntent.setData(builder.build());
applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
- scheme, null, null, null, null, userId);
+ scheme, null, null, null, userId);
}
doNonData = false;
}
@@ -2340,28 +2340,27 @@
builder.scheme(scheme);
finalIntent.setDataAndType(builder.build(), mimeType);
applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
- scheme, null, null, null, mimeType, userId);
+ scheme, null, null, null, userId);
}
}
} else {
Intent finalIntent = new Intent(intent);
finalIntent.setType(mimeType);
applyDefaultPreferredActivityLPw(service, finalIntent, flags, cn,
- null, null, null, null, mimeType, userId);
+ null, null, null, null, userId);
}
doNonData = false;
}
if (doNonData) {
applyDefaultPreferredActivityLPw(service, intent, flags, cn,
- null, null, null, null, null, userId);
+ null, null, null, null, userId);
}
}
private void applyDefaultPreferredActivityLPw(PackageManagerService service,
Intent intent, int flags, ComponentName cn, String scheme, PatternMatcher ssp,
- IntentFilter.AuthorityEntry auth, PatternMatcher path, String mimeType,
- int userId) {
+ IntentFilter.AuthorityEntry auth, PatternMatcher path, int userId) {
List<ResolveInfo> ri = service.mActivities.queryIntent(intent,
intent.getType(), flags, 0);
if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Queried " + intent
@@ -2369,19 +2368,24 @@
int match = 0;
if (ri != null && ri.size() > 1) {
boolean haveAct = false;
- boolean haveNonSys = false;
+ ComponentName haveNonSys = null;
ComponentName[] set = new ComponentName[ri.size()];
for (int i=0; i<ri.size(); i++) {
ActivityInfo ai = ri.get(i).activityInfo;
set[i] = new ComponentName(ai.packageName, ai.name);
if ((ai.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
- // If any of the matches are not system apps, then
- // there is a third party app that is now an option...
- // so don't set a default since we don't want to hide it.
- if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Result "
- + ai.packageName + "/" + ai.name + ": non-system!");
- haveNonSys = true;
- break;
+ if (ri.get(i).match >= match) {
+ // If any of the matches are not system apps, then
+ // there is a third party app that is now an option...
+ // so don't set a default since we don't want to hide it.
+ // Only do this if the match of this one is at least as good
+ // as what we have found as the built-in app; if it isn't
+ // as good, the user won't want it anyway, right?
+ if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Result "
+ + ai.packageName + "/" + ai.name + ": non-system!");
+ haveNonSys = set[i];
+ break;
+ }
} else if (cn.getPackageName().equals(ai.packageName)
&& cn.getClassName().equals(ai.name)) {
if (PackageManagerService.DEBUG_PREFERRED) Log.d(TAG, "Result "
@@ -2393,7 +2397,7 @@
+ ai.packageName + "/" + ai.name + ": skipped");
}
}
- if (haveAct && !haveNonSys) {
+ if (haveAct && haveNonSys == null) {
IntentFilter filter = new IntentFilter();
if (intent.getAction() != null) {
filter.addAction(intent.getAction());
@@ -2427,9 +2431,25 @@
}
PreferredActivity pa = new PreferredActivity(filter, match, set, cn, true);
editPreferredActivitiesLPw(userId).addFilter(pa);
- } else if (!haveNonSys) {
- Slog.w(TAG, "No component found for default preferred activity " + cn);
+ } else if (haveNonSys == null) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("No component ");
+ sb.append(cn.flattenToShortString());
+ sb.append(" found setting preferred ");
+ sb.append(intent);
+ sb.append("; possible matches are ");
+ for (int i=0; i<set.length; i++) {
+ if (i > 0) sb.append(", ");
+ sb.append(set[i].flattenToShortString());
+ }
+ Slog.w(TAG, sb.toString());
+ } else {
+ Slog.i(TAG, "Not setting preferred " + intent + "; found third party match "
+ + haveNonSys.flattenToShortString());
}
+ } else {
+ Slog.w(TAG, "No potential matches found for " + intent + " while setting preferred "
+ + cn.flattenToShortString());
}
}
diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java
index c720668..94a628d 100644
--- a/services/core/java/com/android/server/power/Notifier.java
+++ b/services/core/java/com/android/server/power/Notifier.java
@@ -84,7 +84,6 @@
private final IBatteryStats mBatteryStats;
private final IAppOpsService mAppOps;
private final SuspendBlocker mSuspendBlocker;
- private final ScreenOnBlocker mScreenOnBlocker;
private final WindowManagerPolicy mPolicy;
private final ActivityManagerInternal mActivityManagerInternal;
private final InputManagerInternal mInputManagerInternal;
@@ -110,18 +109,13 @@
// True if a user activity message should be sent.
private boolean mUserActivityPending;
- // The currently active screen on listener. This field is non-null whenever the
- // ScreenOnBlocker has been acquired and we are awaiting a callback to release it.
- private ScreenOnUnblocker mPendingScreenOnUnblocker;
-
public Notifier(Looper looper, Context context, IBatteryStats batteryStats,
- IAppOpsService appOps, SuspendBlocker suspendBlocker, ScreenOnBlocker screenOnBlocker,
+ IAppOpsService appOps, SuspendBlocker suspendBlocker,
WindowManagerPolicy policy) {
mContext = context;
mBatteryStats = batteryStats;
mAppOps = appOps;
mSuspendBlocker = suspendBlocker;
- mScreenOnBlocker = screenOnBlocker;
mPolicy = policy;
mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
@@ -333,21 +327,6 @@
}
/**
- * Notifies that screen is about to be turned on (any state other than off).
- */
- public void onScreenTurningOn() {
- synchronized (mLock) {
- final ScreenOnUnblocker unblocker = blockScreenOnLocked();
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mPolicy.screenTurningOn(unblocker);
- }
- });
- }
- }
-
- /**
* Called when there has been user activity.
*/
public void onUserActivity(int event, int uid) {
@@ -470,26 +449,6 @@
}
}
- private ScreenOnUnblocker blockScreenOnLocked() {
- if (mPendingScreenOnUnblocker == null) {
- mScreenOnBlocker.acquire();
- }
- mPendingScreenOnUnblocker = new ScreenOnUnblocker();
- return mPendingScreenOnUnblocker;
- }
-
- private final class ScreenOnUnblocker implements WindowManagerPolicy.ScreenOnListener {
- @Override
- public void onScreenOn() {
- synchronized (mLock) {
- if (mPendingScreenOnUnblocker == this) {
- mPendingScreenOnUnblocker = null;
- mScreenOnBlocker.release();
- }
- }
- }
- }
-
private final BroadcastReceiver mWakeUpBroadcastDone = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 71e059a..4f41bee 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -88,8 +88,6 @@
private static final int MSG_USER_ACTIVITY_TIMEOUT = 1;
// Message: Sent when the device enters or exits a dreaming or dozing state.
private static final int MSG_SANDMAN = 2;
- // Message: Sent when the screen on blocker is released.
- private static final int MSG_SCREEN_ON_BLOCKER_RELEASED = 3;
// Dirty bit: mWakeLocks changed
private static final int DIRTY_WAKE_LOCKS = 1 << 0;
@@ -111,10 +109,8 @@
private static final int DIRTY_BATTERY_STATE = 1 << 8;
// Dirty bit: proximity state changed
private static final int DIRTY_PROXIMITY_POSITIVE = 1 << 9;
- // Dirty bit: screen on blocker state became held or unheld
- private static final int DIRTY_SCREEN_ON_BLOCKER_RELEASED = 1 << 10;
// Dirty bit: dock state changed
- private static final int DIRTY_DOCK_STATE = 1 << 11;
+ private static final int DIRTY_DOCK_STATE = 1 << 10;
// Wakefulness: The device is asleep and can only be awoken by a call to wakeUp().
// The screen should be off or in the process of being turned off by the display controller.
@@ -244,10 +240,6 @@
// True if the display suspend blocker has been acquired.
private boolean mHoldingDisplaySuspendBlocker;
- // The screen on blocker used to keep the screen from turning on while the lock
- // screen is coming up.
- private final ScreenOnBlockerImpl mScreenOnBlocker;
-
// True if systemReady() has been called.
private boolean mSystemReady;
@@ -451,7 +443,6 @@
mHalAutoSuspendModeEnabled = false;
mHalInteractiveModeEnabled = true;
- mScreenOnBlocker = new ScreenOnBlockerImpl();
mWakefulness = WAKEFULNESS_AWAKE;
mInteractive = true;
@@ -505,7 +496,7 @@
mBatteryStats = BatteryStatsService.getService();
mNotifier = new Notifier(Looper.getMainLooper(), mContext, mBatteryStats,
mAppOps, createSuspendBlockerLocked("PowerManagerService.Broadcasts"),
- mScreenOnBlocker, mPolicy);
+ mPolicy);
mWirelessChargerDetector = new WirelessChargerDetector(sensorManager,
createSuspendBlockerLocked("PowerManagerService.WirelessChargerDetector"),
@@ -1745,13 +1736,6 @@
return true;
}
- private void handleScreenOnBlockerReleased() {
- synchronized (mLock) {
- mDirty |= DIRTY_SCREEN_ON_BLOCKER_RELEASED;
- updatePowerStateLocked();
- }
- }
-
/**
* Updates the display power state asynchronously.
* When the update is finished, mDisplayReady will be set to true. The display
@@ -1766,8 +1750,7 @@
final boolean oldDisplayReady = mDisplayReady;
if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_WAKEFULNESS
| DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED | DIRTY_BOOT_COMPLETED
- | DIRTY_SETTINGS | DIRTY_SCREEN_ON_BLOCKER_RELEASED)) != 0) {
- boolean wasBlockerNeeded = isScreenOnBlockerNeededLocked(mDisplayPowerRequest);
+ | DIRTY_SETTINGS)) != 0) {
mDisplayPowerRequest.policy = getDesiredScreenPolicyLocked();
int screenBrightness = mScreenBrightnessSettingDefault;
@@ -1815,12 +1798,6 @@
mDisplayPowerRequest.dozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT;
}
- if (!wasBlockerNeeded && isScreenOnBlockerNeededLocked(mDisplayPowerRequest)
- && !mScreenOnBlocker.isHeld()) {
- mNotifier.onScreenTurningOn();
- }
- mDisplayPowerRequest.blockScreenOn = mScreenOnBlocker.isHeld();
-
mDisplayReady = mDisplayManagerInternal.requestPowerState(mDisplayPowerRequest,
mRequestWaitForNegativeProximity);
mRequestWaitForNegativeProximity = false;
@@ -1837,17 +1814,6 @@
return mDisplayReady && !oldDisplayReady;
}
- private static boolean isScreenOnBlockerNeededLocked(DisplayPowerRequest req) {
- switch (req.policy) {
- case DisplayPowerRequest.POLICY_OFF:
- return false;
- case DisplayPowerRequest.POLICY_DOZE:
- return req.dozeScreenState != Display.STATE_OFF;
- default:
- return true;
- }
- }
-
private static boolean isValidBrightness(int value) {
return value >= 0 && value <= 255;
}
@@ -2420,9 +2386,6 @@
}
pw.println();
- pw.println("Screen On Blocker: " + mScreenOnBlocker);
-
- pw.println();
pw.println("Display Power: " + mDisplayPowerCallbacks);
wcd = mWirelessChargerDetector;
@@ -2530,9 +2493,6 @@
case MSG_SANDMAN:
handleSandman();
break;
- case MSG_SCREEN_ON_BLOCKER_RELEASED:
- handleScreenOnBlockerReleased();
- break;
}
}
}
@@ -2709,56 +2669,6 @@
}
}
- private final class ScreenOnBlockerImpl implements ScreenOnBlocker {
- private static final String TRACE_NAME = "ScreenOnBlocker";
-
- private int mNestCount;
-
- public boolean isHeld() {
- synchronized (this) {
- return mNestCount != 0;
- }
- }
-
- @Override
- public void acquire() {
- synchronized (this) {
- mNestCount += 1;
- if (DEBUG || true) {
- Slog.d(TAG, "Screen on blocked: mNestCount=" + mNestCount);
- }
- if (mNestCount == 1) {
- Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, TRACE_NAME, 0);
- }
- }
- }
-
- @Override
- public void release() {
- synchronized (this) {
- mNestCount -= 1;
- if (mNestCount == 0) {
- if (DEBUG || true) {
- Slog.d(TAG, "Screen on unblocked: mNestCount=" + mNestCount);
- }
- mHandler.sendEmptyMessage(MSG_SCREEN_ON_BLOCKER_RELEASED);
- Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, TRACE_NAME, 0);
- } else if (mNestCount < 0) {
- Slog.wtf(TAG, "Screen on blocker was released without being acquired!",
- new Throwable());
- mNestCount = 0;
- }
- }
- }
-
- @Override
- public String toString() {
- synchronized (this) {
- return "held=" + (mNestCount != 0) + ", mNestCount=" + mNestCount;
- }
- }
- }
-
private final class BinderService extends IPowerManager.Stub {
@Override // Binder call
public void acquireWakeLockWithUid(IBinder lock, int flags, String tag,
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index a4edc86..999649b 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -3474,7 +3474,7 @@
}
boolean okToDisplay() {
- return !mDisplayFrozen && mDisplayEnabled && mPolicy.isAwake();
+ return !mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOn();
}
AppWindowToken findAppWindowToken(IBinder token) {
@@ -10397,7 +10397,7 @@
return;
}
- if (!mDisplayReady || !mPolicy.isAwake()) {
+ if (!mDisplayReady || !mPolicy.isScreenOn()) {
// No need to freeze the screen before the system is ready or if
// the screen is off.
return;
@@ -11423,6 +11423,7 @@
createDisplayContentLocked(display);
displayReady(displayId);
}
+ requestTraversalLocked();
}
}
@@ -11445,6 +11446,7 @@
}
}
mAnimator.removeDisplayLocked(displayId);
+ requestTraversalLocked();
}
public void onDisplayChanged(int displayId) {
@@ -11456,6 +11458,7 @@
if (displayContent != null) {
displayContent.updateDisplayInfo();
}
+ requestTraversalLocked();
}
@Override
@@ -11576,7 +11579,7 @@
final WindowList windows = getDefaultWindowListLocked();
for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) {
final WindowState win = windows.get(winNdx);
- if (win.mHasSurface
+ if (win.isVisibleLw()
&& (win.mAppToken != null || mPolicy.isForceHiding(win.mAttrs))) {
win.mWinAnimator.mDrawState = WindowStateAnimator.DRAW_PENDING;
// Force add to mResizingWindows.
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 0baa2be..b4a7f04 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -1373,7 +1373,8 @@
final Rect stableInsets = mLastStableInsets;
final boolean reportDraw = mWinAnimator.mDrawState == WindowStateAnimator.DRAW_PENDING;
final Configuration newConfig = configChanged ? mConfiguration : null;
- if (mClient instanceof IWindow.Stub) {
+ if (mAttrs.type != WindowManager.LayoutParams.TYPE_APPLICATION_STARTING
+ && mClient instanceof IWindow.Stub) {
// To prevent deadlock simulate one-way call if win.mClient is a local object.
mService.mH.post(new Runnable() {
@Override
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DeviceOwner.java b/services/devicepolicy/java/com/android/server/devicepolicy/DeviceOwner.java
index 5938819..9fd0e09 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DeviceOwner.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DeviceOwner.java
@@ -229,11 +229,20 @@
String profileOwnerComponentStr =
parser.getAttributeValue(null, ATTR_COMPONENT_NAME);
int userId = Integer.parseInt(parser.getAttributeValue(null, ATTR_USERID));
- OwnerInfo profileOwnerInfo;
+ OwnerInfo profileOwnerInfo = null;
if (profileOwnerComponentStr != null) {
- profileOwnerInfo = new OwnerInfo(profileOwnerName,
- ComponentName.unflattenFromString(profileOwnerComponentStr));
- } else {
+ ComponentName admin = ComponentName.unflattenFromString(
+ profileOwnerComponentStr);
+ if (admin != null) {
+ profileOwnerInfo = new OwnerInfo(profileOwnerName, admin);
+ } else {
+ // This shouldn't happen but switch from package name -> component name
+ // might have written bad device owner files. b/17652534
+ Slog.e(TAG, "Error parsing device-owner file. Bad component name " +
+ profileOwnerComponentStr);
+ }
+ }
+ if (profileOwnerInfo == null) {
profileOwnerInfo = new OwnerInfo(profileOwnerName, profileOwnerPackageName);
}
mProfileOwners.put(userId, profileOwnerInfo);
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 59d3dc8..d1aba3c 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -2862,7 +2862,7 @@
return false;
}
- void wipeDataLocked(int flags) {
+ void wipeDataLocked(int flags, String reason) {
// If the SD card is encrypted and non-removable, we have to force a wipe.
boolean forceExtWipe = !Environment.isExternalStorageRemovable() && isExtStorageEncrypted();
boolean wipeExtRequested = (flags&DevicePolicyManager.WIPE_EXTERNAL_STORAGE) != 0;
@@ -2871,12 +2871,13 @@
if ((forceExtWipe || wipeExtRequested) && !Environment.isExternalStorageEmulated()) {
Intent intent = new Intent(ExternalStorageFormatter.FORMAT_AND_FACTORY_RESET);
intent.putExtra(ExternalStorageFormatter.EXTRA_ALWAYS_RESET, true);
+ intent.putExtra(Intent.EXTRA_REASON, reason);
intent.setComponent(ExternalStorageFormatter.COMPONENT_NAME);
mWakeLock.acquire(10000);
mContext.startService(intent);
} else {
try {
- RecoverySystem.rebootWipeUserData(mContext);
+ RecoverySystem.rebootWipeUserData(mContext, reason);
} catch (IOException e) {
Slog.w(LOG_TAG, "Failed requesting data wipe", e);
} catch (SecurityException e) {
@@ -2885,6 +2886,7 @@
}
}
+ @Override
public void wipeData(int flags, final int userHandle) {
if (!mHasFeature) {
return;
@@ -2896,20 +2898,34 @@
synchronized (this) {
// This API can only be called by an active device admin,
// so try to retrieve it to check that the caller is one.
- getActiveAdminForCallerLocked(null,
+ final ActiveAdmin admin = getActiveAdminForCallerLocked(null,
DeviceAdminInfo.USES_POLICY_WIPE_DATA);
+
+ final String source;
+ if (admin != null && admin.info != null) {
+ final ComponentName cname = admin.info.getComponent();
+ if (cname != null) {
+ source = cname.flattenToShortString();
+ } else {
+ source = admin.info.getPackageName();
+ }
+ } else {
+ source = "?";
+ }
+
long ident = Binder.clearCallingIdentity();
try {
- wipeDeviceOrUserLocked(flags, userHandle);
+ wipeDeviceOrUserLocked(flags, userHandle,
+ "DevicePolicyManager.wipeData() from " + source);
} finally {
Binder.restoreCallingIdentity(ident);
}
}
}
- private void wipeDeviceOrUserLocked(int flags, final int userHandle) {
+ private void wipeDeviceOrUserLocked(int flags, final int userHandle, String reason) {
if (userHandle == UserHandle.USER_OWNER) {
- wipeDataLocked(flags);
+ wipeDataLocked(flags, reason);
} else {
mHandler.post(new Runnable() {
public void run() {
@@ -3061,7 +3077,7 @@
}
if (wipeData) {
// Call without holding lock.
- wipeDeviceOrUserLocked(0, identifier);
+ wipeDeviceOrUserLocked(0, identifier, "reportFailedPasswordAttempt()");
}
} finally {
Binder.restoreCallingIdentity(ident);
diff --git a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
index 402f0dd..bd64392 100644
--- a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
+++ b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
@@ -67,6 +67,7 @@
assertEquals("Didn't get expected number of persisted tasks.", 1, jobStatusSet.size());
final JobStatus loadedTaskStatus = jobStatusSet.iterator().next();
assertTasksEqual(task, loadedTaskStatus.getJob());
+ assertTrue("JobStore#contains invalid.", mTaskStoreUnderTest.containsJob(ts));
assertEquals("Different uids.", SOME_UID, loadedTaskStatus.getUid());
compareTimestampsSubjectToIoLatency("Early run-times not the same after read.",
ts.getEarliestRunTime(), loadedTaskStatus.getEarliestRunTime());
@@ -103,7 +104,8 @@
JobStatus loaded2 = it.next();
assertTasksEqual(task1, loaded1.getJob());
assertTasksEqual(task2, loaded2.getJob());
-
+ assertTrue("JobStore#contains invalid.", mTaskStoreUnderTest.containsJob(taskStatus1));
+ assertTrue("JobStore#contains invalid.", mTaskStoreUnderTest.containsJob(taskStatus2));
// Check that the loaded task has the correct runtimes.
compareTimestampsSubjectToIoLatency("Early run-times not the same after read.",
taskStatus1.getEarliestRunTime(), loaded1.getEarliestRunTime());
diff --git a/telecomm/java/android/telecom/AudioState.java b/telecomm/java/android/telecom/AudioState.java
index d0e2860..fc2fff4 100644
--- a/telecomm/java/android/telecom/AudioState.java
+++ b/telecomm/java/android/telecom/AudioState.java
@@ -16,6 +16,7 @@
package android.telecom;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -23,7 +24,9 @@
/**
* Encapsulates all audio states during a call.
+ * @hide
*/
+@SystemApi
public final class AudioState implements Parcelable {
/** Direct the audio stream through the device's earpiece. */
public static final int ROUTE_EARPIECE = 0x00000001;
diff --git a/telecomm/java/android/telecom/Conference.java b/telecomm/java/android/telecom/Conference.java
index 9b350c1..e47d9d1 100644
--- a/telecomm/java/android/telecom/Conference.java
+++ b/telecomm/java/android/telecom/Conference.java
@@ -16,6 +16,8 @@
package android.telecom;
+import android.annotation.SystemApi;
+
import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -24,7 +26,9 @@
/**
* Represents a conference call which can contain any number of {@link Connection} objects.
+ * @hide
*/
+@SystemApi
public abstract class Conference {
/** @hide */
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 7979e44..13acc59 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -19,6 +19,7 @@
import com.android.internal.telecom.IVideoCallback;
import com.android.internal.telecom.IVideoProvider;
+import android.annotation.SystemApi;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
@@ -43,7 +44,9 @@
* Implementations are then responsible for updating the state of the {@code Connection}, and
* must call {@link #destroy()} to signal to the framework that the {@code Connection} is no
* longer used and associated resources may be recovered.
+ * @hide
*/
+@SystemApi
public abstract class Connection {
public static final int STATE_INITIALIZING = 0;
@@ -873,7 +876,7 @@
return mUnmodifiableConferenceableConnections;
}
- /*
+ /**
* @hide
*/
public final void setConnectionService(ConnectionService connectionService) {
diff --git a/telecomm/java/android/telecom/ConnectionRequest.java b/telecomm/java/android/telecom/ConnectionRequest.java
index 71b481b..f691c17 100644
--- a/telecomm/java/android/telecom/ConnectionRequest.java
+++ b/telecomm/java/android/telecom/ConnectionRequest.java
@@ -16,6 +16,7 @@
package android.telecom;
+import android.annotation.SystemApi;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcel;
@@ -24,7 +25,9 @@
/**
* Simple data container encapsulating a request to some entity to
* create a new {@link Connection}.
+ * @hide
*/
+@SystemApi
public final class ConnectionRequest implements Parcelable {
// TODO: Token to limit recursive invocations
diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java
index 3e18bac..ed9251b7 100644
--- a/telecomm/java/android/telecom/ConnectionService.java
+++ b/telecomm/java/android/telecom/ConnectionService.java
@@ -16,6 +16,7 @@
package android.telecom;
+import android.annotation.SystemApi;
import android.annotation.SdkConstant;
import android.app.Service;
import android.content.ComponentName;
@@ -34,15 +35,17 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
/**
* A {@link android.app.Service} that provides telephone connections to processes running on an
* Android device.
+ * @hide
*/
+@SystemApi
public abstract class ConnectionService extends Service {
/**
* The {@link Intent} that must be declared as handled by the service.
@@ -74,10 +77,10 @@
private static Connection sNullConnection;
- private final Map<String, Connection> mConnectionById = new HashMap<>();
- private final Map<Connection, String> mIdByConnection = new HashMap<>();
- private final Map<String, Conference> mConferenceById = new HashMap<>();
- private final Map<Conference, String> mIdByConference = new HashMap<>();
+ private final Map<String, Connection> mConnectionById = new ConcurrentHashMap<>();
+ private final Map<Connection, String> mIdByConnection = new ConcurrentHashMap<>();
+ private final Map<String, Conference> mConferenceById = new ConcurrentHashMap<>();
+ private final Map<Conference, String> mIdByConference = new ConcurrentHashMap<>();
private final RemoteConnectionManager mRemoteConnectionManager =
new RemoteConnectionManager(this);
private final List<Runnable> mPreInitializationConnectionRequests = new ArrayList<>();
diff --git a/telecomm/java/android/telecom/DisconnectCause.java b/telecomm/java/android/telecom/DisconnectCause.java
index 9be0138..52c1284 100644
--- a/telecomm/java/android/telecom/DisconnectCause.java
+++ b/telecomm/java/android/telecom/DisconnectCause.java
@@ -16,6 +16,7 @@
package android.telecom;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.media.ToneGenerator;
@@ -28,7 +29,9 @@
* cause of the disconnect. Optionally, it may include a localized label and/or localized description
* to display to the user which is provided by the {@link ConnectionService}. It also may contain a
* reason for the the disconnect, which is intended for logging and not for display to the user.
+ * @hide
*/
+@SystemApi
public final class DisconnectCause implements Parcelable {
/** Disconnected because of an unknown or unspecified reason. */
diff --git a/telecomm/java/android/telecom/GatewayInfo.java b/telecomm/java/android/telecom/GatewayInfo.java
index 583c3e2..3efab0f 100644
--- a/telecomm/java/android/telecom/GatewayInfo.java
+++ b/telecomm/java/android/telecom/GatewayInfo.java
@@ -30,7 +30,9 @@
* <li> Call the appropriate routing number
* <li> Display information about how the call is being routed to the user
* </ol>
+ * @hide
*/
+@SystemApi
public class GatewayInfo implements Parcelable {
private final String mGatewayProviderPackageName;
diff --git a/telecomm/java/android/telecom/InCallService.java b/telecomm/java/android/telecom/InCallService.java
index fa12756..11da0f2 100644
--- a/telecomm/java/android/telecom/InCallService.java
+++ b/telecomm/java/android/telecom/InCallService.java
@@ -59,6 +59,10 @@
private final Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
+ if (mPhone == null && msg.what != MSG_SET_IN_CALL_ADAPTER) {
+ return;
+ }
+
switch (msg.what) {
case MSG_SET_IN_CALL_ADAPTER:
mPhone = new Phone(new InCallAdapter((IInCallAdapter) msg.obj));
diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java
index 9ab7ffa..1d6d8bc 100644
--- a/telecomm/java/android/telecom/PhoneAccount.java
+++ b/telecomm/java/android/telecom/PhoneAccount.java
@@ -16,6 +16,7 @@
package android.telecom;
+import android.annotation.SystemApi;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Resources.NotFoundException;
@@ -34,7 +35,9 @@
/**
* Describes a distinct account, line of service or call placement method that the system
* can use to place phone calls.
+ * @hide
*/
+@SystemApi
public class PhoneAccount implements Parcelable {
/**
diff --git a/telecomm/java/android/telecom/PhoneAccountHandle.java b/telecomm/java/android/telecom/PhoneAccountHandle.java
index e13df76..652befe5 100644
--- a/telecomm/java/android/telecom/PhoneAccountHandle.java
+++ b/telecomm/java/android/telecom/PhoneAccountHandle.java
@@ -16,6 +16,7 @@
package android.telecom;
+import android.annotation.SystemApi;
import android.content.ComponentName;
import android.os.Parcel;
import android.os.Parcelable;
@@ -24,7 +25,9 @@
/**
* The unique identifier for a {@link PhoneAccount}.
+ * @hide
*/
+@SystemApi
public class PhoneAccountHandle implements Parcelable {
private ComponentName mComponentName;
private String mId;
diff --git a/telecomm/java/android/telecom/PhoneCapabilities.java b/telecomm/java/android/telecom/PhoneCapabilities.java
index e73dfe2..de2abcb 100644
--- a/telecomm/java/android/telecom/PhoneCapabilities.java
+++ b/telecomm/java/android/telecom/PhoneCapabilities.java
@@ -16,10 +16,14 @@
package android.telecom;
+import android.annotation.SystemApi;
+
/**
* Defines capabilities a phone call can support, such as conference calling and video telephony.
* Also defines properties of a phone call, such as whether it is using VoLTE technology.
+ * @hide
*/
+@SystemApi
public final class PhoneCapabilities {
/** Call can currently be put on hold or unheld. */
public static final int HOLD = 0x00000001;
diff --git a/telecomm/java/android/telecom/RemoteConference.java b/telecomm/java/android/telecom/RemoteConference.java
index f931bc5..796725b 100644
--- a/telecomm/java/android/telecom/RemoteConference.java
+++ b/telecomm/java/android/telecom/RemoteConference.java
@@ -18,6 +18,7 @@
import com.android.internal.telecom.IConnectionService;
+import android.annotation.SystemApi;
import android.os.RemoteException;
import java.util.Collections;
@@ -28,7 +29,9 @@
/**
* Represents a conference call which can contain any number of {@link Connection} objects.
+ * @hide
*/
+@SystemApi
public final class RemoteConference {
public abstract static class Callback {
diff --git a/telecomm/java/android/telecom/RemoteConnection.java b/telecomm/java/android/telecom/RemoteConnection.java
index 9a094df..4a89692 100644
--- a/telecomm/java/android/telecom/RemoteConnection.java
+++ b/telecomm/java/android/telecom/RemoteConnection.java
@@ -20,6 +20,7 @@
import com.android.internal.telecom.IVideoCallback;
import com.android.internal.telecom.IVideoProvider;
+import android.annotation.SystemApi;
import android.net.Uri;
import android.os.IBinder;
import android.os.RemoteException;
@@ -37,7 +38,9 @@
*
* @see ConnectionService#createRemoteOutgoingConnection(PhoneAccountHandle, ConnectionRequest)
* @see ConnectionService#createRemoteIncomingConnection(PhoneAccountHandle, ConnectionRequest)
+ * @hide
*/
+@SystemApi
public final class RemoteConnection {
public static abstract class Callback {
diff --git a/telecomm/java/android/telecom/StatusHints.java b/telecomm/java/android/telecom/StatusHints.java
index a32eae7..dd3a639 100644
--- a/telecomm/java/android/telecom/StatusHints.java
+++ b/telecomm/java/android/telecom/StatusHints.java
@@ -16,6 +16,7 @@
package android.telecom;
+import android.annotation.SystemApi;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -29,7 +30,9 @@
/**
* Contains status label and icon displayed in the in-call UI.
+ * @hide
*/
+@SystemApi
public final class StatusHints implements Parcelable {
private final ComponentName mPackageName;
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index 481e483..89d2dc0 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -53,6 +53,7 @@
/**
* The {@link android.content.Intent} action used to configure a
* {@link android.telecom.ConnectionService}.
+ * @hide
*/
public static final String ACTION_CONNECTION_SERVICE_CONFIGURE =
"android.telecom.action.CONNECTION_SERVICE_CONFIGURE";
@@ -66,6 +67,7 @@
/**
* The {@link android.content.Intent} action used to show the settings page used to configure
* {@link PhoneAccount} preferences.
+ * @hide
*/
public static final String ACTION_CHANGE_PHONE_ACCOUNTS =
"android.telecom.action.CHANGE_PHONE_ACCOUNTS";
@@ -96,6 +98,7 @@
* {@link PhoneAccountHandle} to use when making the call.
* <p class="note">
* Retrieve with {@link android.content.Intent#getParcelableExtra(String)}.
+ * @hide
*/
public static final String EXTRA_PHONE_ACCOUNT_HANDLE =
"android.telecom.extra.PHONE_ACCOUNT_HANDLE";
@@ -138,6 +141,7 @@
/**
* Optional extra for {@link android.telephony.TelephonyManager#ACTION_PHONE_STATE_CHANGED}
* containing the component name of the associated connection service.
+ * @hide
*/
public static final String EXTRA_CONNECTION_SERVICE =
"android.telecom.extra.CONNECTION_SERVICE";
@@ -173,6 +177,7 @@
* {@link ConnectionService}s which interact with {@link RemoteConnection}s should only populate
* this if the {@link android.telephony.TelephonyManager#getLine1Number()} value, as that is the
* user's expected caller ID.
+ * @hide
*/
public static final String EXTRA_CALL_BACK_NUMBER = "android.telecom.extra.CALL_BACK_NUMBER";
@@ -419,6 +424,7 @@
* {@code PhoneAccount}.
*
* @return The phone account handle of the current connection manager.
+ * @hide
*/
public PhoneAccountHandle getConnectionManager() {
return getSimCallManager();
@@ -476,6 +482,7 @@
*
* @return {@code true} if the device has more than one account registered and {@code false}
* otherwise.
+ * @hide
*/
public boolean hasMultipleCallCapableAccounts() {
return getCallCapablePhoneAccounts().size() > 1;
@@ -485,6 +492,7 @@
* Returns a list of all {@link PhoneAccount}s registered for the calling package.
*
* @return A list of {@code PhoneAccountHandle} objects.
+ * @hide
*/
public List<PhoneAccountHandle> getPhoneAccountsForPackage() {
try {
@@ -503,6 +511,7 @@
*
* @param account The {@link PhoneAccountHandle}.
* @return The {@link PhoneAccount} object.
+ * @hide
*/
public PhoneAccount getPhoneAccount(PhoneAccountHandle account) {
try {
@@ -573,6 +582,7 @@
* Register a {@link PhoneAccount} for use by the system.
*
* @param account The complete {@link PhoneAccount}.
+ * @hide
*/
public void registerPhoneAccount(PhoneAccount account) {
try {
@@ -588,6 +598,7 @@
* Remove a {@link PhoneAccount} registration from the system.
*
* @param accountHandle A {@link PhoneAccountHandle} for the {@link PhoneAccount} to unregister.
+ * @hide
*/
public void unregisterPhoneAccount(PhoneAccountHandle accountHandle) {
try {
@@ -601,6 +612,7 @@
/**
* Remove all Accounts that belong to the calling package from the system.
+ * @hide
*/
@SystemApi
public void clearAccounts() {
@@ -786,6 +798,7 @@
* {@link #registerPhoneAccount}.
* @param extras A bundle that will be passed through to
* {@link ConnectionService#onCreateIncomingConnection}.
+ * @hide
*/
public void addNewIncomingCall(PhoneAccountHandle phoneAccount, Bundle extras) {
try {
diff --git a/tests/ActivityTests/AndroidManifest.xml b/tests/ActivityTests/AndroidManifest.xml
index 3fb547d..f31f4f2 100644
--- a/tests/ActivityTests/AndroidManifest.xml
+++ b/tests/ActivityTests/AndroidManifest.xml
@@ -30,6 +30,20 @@
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <data android:scheme="http" android:host="www.angryredplanet.com"
+ android:pathPrefix="" />
+ </intent-filter>
+ <preferred>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <data android:scheme="http" android:host="www.angryredplanet.com"
+ android:pathPrefix="" />
+ </preferred>
</activity>
<activity android:name="SpamActivity" android:label="Spam!"
android:documentLaunchMode="always">
diff --git a/tests/VectorDrawableTest/AndroidManifest.xml b/tests/VectorDrawableTest/AndroidManifest.xml
index 4c835ec..7796953 100644
--- a/tests/VectorDrawableTest/AndroidManifest.xml
+++ b/tests/VectorDrawableTest/AndroidManifest.xml
@@ -99,6 +99,15 @@
</intent-filter>
</activity>
<activity
+ android:name="AnimatedVectorDrawableDupPerf"
+ android:label="Animated Vector Performance of clones" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+
+ <category android:name="com.android.test.dynamic.TEST" />
+ </intent-filter>
+ </activity>
+ <activity
android:name="VectorDrawableStaticPerf"
android:label="System icons" >
<intent-filter>
diff --git a/tests/VectorDrawableTest/res/anim/animation_favorite.xml b/tests/VectorDrawableTest/res/anim/animation_favorite.xml
index c81ba40..2e2d9bb 100644
--- a/tests/VectorDrawableTest/res/anim/animation_favorite.xml
+++ b/tests/VectorDrawableTest/res/anim/animation_favorite.xml
@@ -25,5 +25,35 @@
android:valueFrom="@string/round_box"
android:valueTo="@string/heart"
android:valueType="pathType" />
+ <objectAnimator
+ android:duration="8000"
+ android:propertyName="fillAlpha"
+ android:repeatCount="-1"
+ android:valueFrom="1.0"
+ android:valueTo="0.0" />
+ <objectAnimator
+ android:duration="8000"
+ android:propertyName="strokeAlpha"
+ android:repeatCount="-1"
+ android:valueFrom="1.0"
+ android:valueTo="0.0" />
+ <objectAnimator
+ android:duration="8000"
+ android:propertyName="strokeColor"
+ android:repeatCount="-1"
+ android:valueFrom="#FF0000FF"
+ android:valueTo="#FF00FF00" />
+ <objectAnimator
+ android:duration="8000"
+ android:propertyName="strokeWidth"
+ android:repeatCount="-1"
+ android:valueFrom="5"
+ android:valueTo="20" />
+ <objectAnimator
+ android:duration="8000"
+ android:propertyName="fillColor"
+ android:repeatCount="-1"
+ android:valueFrom="#FFFF0000"
+ android:valueTo="#FF00FF00" />
</set>
\ No newline at end of file
diff --git a/tests/VectorDrawableTest/res/anim/trim_path_animation02.xml b/tests/VectorDrawableTest/res/anim/trim_path_animation02.xml
index 3bf2865..5d688cf 100644
--- a/tests/VectorDrawableTest/res/anim/trim_path_animation02.xml
+++ b/tests/VectorDrawableTest/res/anim/trim_path_animation02.xml
@@ -19,7 +19,7 @@
<objectAnimator
android:duration="5000"
- android:propertyName="fill"
+ android:propertyName="fillColor"
android:valueFrom="#FF000000"
android:valueTo="#FFFF0000"/>
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable24.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable24.xml
index 5c1ccaa..f0b4699 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable24.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable24.xml
@@ -19,8 +19,7 @@
android:viewportHeight="400"
android:viewportWidth="400" >
- <group android:name="backgroundGroup"
- android:alpha = "0.5" >
+ <group android:name="backgroundGroup">
<path
android:name="background1"
android:fillColor="#FF000000"
@@ -33,8 +32,7 @@
<group
android:name="translateToCenterGroup"
android:translateX="50.0"
- android:translateY="90.0"
- android:alpha = "0.5" >
+ android:translateY="90.0" >
<path
android:name="twoLines"
android:pathData="@string/twoLinePathData"
@@ -45,8 +43,7 @@
android:name="rotationGroup"
android:pivotX="0.0"
android:pivotY="0.0"
- android:rotation="-45.0"
- android:alpha = "0.5" >
+ android:rotation="-45.0">
<path
android:name="twoLines1"
android:pathData="@string/twoLinePathData"
@@ -56,8 +53,7 @@
<group
android:name="translateGroup"
android:translateX="130.0"
- android:translateY="160.0"
- android:alpha = "0.5">
+ android:translateY="160.0">
<group android:name="scaleGroup" >
<path
android:name="twoLines3"
@@ -70,8 +66,7 @@
<group
android:name="translateGroupHalf"
android:translateX="65.0"
- android:translateY="80.0"
- android:alpha = "0.5">
+ android:translateY="80.0">
<group android:name="scaleGroup" >
<path
android:name="twoLines2"
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable25.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable25.xml
index 069a531..f46d14e 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable25.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable25.xml
@@ -21,12 +21,10 @@
<group
android:name="FirstLevelGroup"
- android:alpha="0.9"
android:translateX="100.0"
android:translateY="0.0" >
<group
android:name="SecondLevelGroup1"
- android:alpha="0.9"
android:translateX="-100.0"
android:translateY="50.0" >
<path
@@ -35,7 +33,6 @@
<group
android:name="ThridLevelGroup1"
- android:alpha="0.9"
android:translateX="-100.0"
android:translateY="50.0" >
<path
@@ -44,7 +41,6 @@
</group>
<group
android:name="ThridLevelGroup2"
- android:alpha="0.8"
android:translateX="100.0"
android:translateY="50.0" >
<path
@@ -54,7 +50,6 @@
</group>
<group
android:name="SecondLevelGroup2"
- android:alpha="0.8"
android:translateX="100.0"
android:translateY="50.0" >
<path
@@ -63,7 +58,6 @@
<group
android:name="ThridLevelGroup3"
- android:alpha="0.9"
android:translateX="-100.0"
android:translateY="50.0" >
<path
@@ -72,7 +66,6 @@
</group>
<group
android:name="ThridLevelGroup4"
- android:alpha="0.8"
android:translateX="100.0"
android:translateY="50.0" >
<path
diff --git a/tests/VectorDrawableTest/src/com/android/test/dynamic/AnimatedVectorDrawableDupPerf.java b/tests/VectorDrawableTest/src/com/android/test/dynamic/AnimatedVectorDrawableDupPerf.java
new file mode 100644
index 0000000..047e494
--- /dev/null
+++ b/tests/VectorDrawableTest/src/com/android/test/dynamic/AnimatedVectorDrawableDupPerf.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.android.test.dynamic;
+
+import android.app.Activity;
+import android.content.res.Resources;
+import android.graphics.drawable.AnimatedVectorDrawable;
+import android.graphics.drawable.VectorDrawable;
+import android.os.Bundle;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.Xml;
+import android.widget.Button;
+import android.widget.GridLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.text.DecimalFormat;
+
+
+@SuppressWarnings({"UnusedDeclaration"})
+public class AnimatedVectorDrawableDupPerf extends Activity {
+
+ private static final String LOGTAG = "AnimatedVectorDrawableDupPerf";
+ protected int[] icon = {
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ R.drawable.animation_vector_linear_progress_bar,
+ };
+
+ /** @hide */
+ public static AnimatedVectorDrawable create(Resources resources, int rid) {
+ try {
+ final XmlPullParser parser = resources.getXml(rid);
+ final AttributeSet attrs = Xml.asAttributeSet(parser);
+ int type;
+ while ((type=parser.next()) != XmlPullParser.START_TAG &&
+ type != XmlPullParser.END_DOCUMENT) {
+ // Empty loop
+ }
+ if (type != XmlPullParser.START_TAG) {
+ throw new XmlPullParserException("No start tag found");
+ }
+
+ final AnimatedVectorDrawable drawable = new AnimatedVectorDrawable();
+ drawable.inflate(resources, parser, attrs);
+
+ return drawable;
+ } catch (XmlPullParserException e) {
+ Log.e(LOGTAG, "parser error", e);
+ } catch (IOException e) {
+ Log.e(LOGTAG, "parser error", e);
+ }
+ return null;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ScrollView scrollView = new ScrollView(this);
+ GridLayout container = new GridLayout(this);
+ scrollView.addView(container);
+ container.setColumnCount(5);
+ Resources res = this.getResources();
+ container.setBackgroundColor(0xFF888888);
+ AnimatedVectorDrawable []d = new AnimatedVectorDrawable[icon.length];
+ long time = android.os.SystemClock.elapsedRealtimeNanos();
+ for (int i = 0; i < icon.length; i++) {
+ d[i] = create(res,icon[i]);
+ }
+ time = android.os.SystemClock.elapsedRealtimeNanos()-time;
+ TextView t = new TextView(this);
+ DecimalFormat df = new DecimalFormat("#.##");
+ t.setText("avgL=" + df.format(time / (icon.length * 1000000.)) + " ms");
+ container.addView(t);
+ time = android.os.SystemClock.elapsedRealtimeNanos();
+ for (int i = 0; i < icon.length; i++) {
+ Button button = new Button(this);
+ button.setWidth(200);
+ button.setBackgroundResource(icon[i]);
+ container.addView(button);
+ }
+ setContentView(scrollView);
+ time = android.os.SystemClock.elapsedRealtimeNanos()-time;
+ t = new TextView(this);
+ t.setText("avgS=" + df.format(time / (icon.length * 1000000.)) + " ms");
+ container.addView(t);
+ }
+
+}
diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java
index 27c2541..29656c9 100644
--- a/wifi/java/android/net/wifi/ScanResult.java
+++ b/wifi/java/android/net/wifi/ScanResult.java
@@ -107,6 +107,12 @@
public int autoJoinStatus;
/**
+ * num IP configuration failures
+ * @hide
+ */
+ public int numIpConfigFailures;
+
+ /**
* @hide
* Last time we blacklisted the ScanResult
*/
@@ -256,6 +262,7 @@
untrusted = source.untrusted;
numConnection = source.numConnection;
numUsage = source.numUsage;
+ numIpConfigFailures = source.numIpConfigFailures;
}
}
@@ -320,6 +327,7 @@
dest.writeInt(untrusted ? 1 : 0);
dest.writeInt(numConnection);
dest.writeInt(numUsage);
+ dest.writeInt(numIpConfigFailures);
if (informationElements != null) {
dest.writeInt(informationElements.length);
for (int i = 0; i < informationElements.length; i++) {
@@ -355,6 +363,7 @@
sr.untrusted = in.readInt() != 0;
sr.numConnection = in.readInt();
sr.numUsage = in.readInt();
+ sr.numIpConfigFailures = in.readInt();
int n = in.readInt();
if (n != 0) {
sr.informationElements = new InformationElement[n];
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index d27c2f7..4f5f31a 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -203,6 +203,12 @@
public int status;
/**
+ * The configuration needs to be written to networkHistory.txt
+ * @hide
+ */
+ public boolean dirty;
+
+ /**
* The code referring to a reason for disabling the network
* Valid when {@link #status} == Status.DISABLED
* @hide
@@ -621,6 +627,18 @@
/**
* @hide
+ * Number of IP config failures
+ */
+ public int numIpConfigFailures;
+
+ /**
+ * @hide
+ * Number of Auth failures
+ */
+ public int numAuthFailures;
+
+ /**
+ * @hide
* Last time we blacklisted the configuration
*/
public long blackListTimestamp;
@@ -884,7 +902,10 @@
} else if (status > autoJoinStatus) {
blackListTimestamp = System.currentTimeMillis();
}
- autoJoinStatus = status;
+ if (status != autoJoinStatus) {
+ autoJoinStatus = status;
+ dirty = true;
+ }
}
@Override
@@ -893,7 +914,7 @@
if (this.status == WifiConfiguration.Status.CURRENT) {
sbuf.append("* ");
} else if (this.status == WifiConfiguration.Status.DISABLED) {
- sbuf.append("- DSBLE: ").append(this.disableReason).append(" ");
+ sbuf.append("- DSBLE");
}
sbuf.append("ID: ").append(this.networkId).append(" SSID: ").append(this.SSID).
append(" BSSID: ").append(this.BSSID).append(" FQDN: ").append(this.FQDN).
@@ -902,8 +923,20 @@
if (this.numConnectionFailures > 0) {
sbuf.append(" numConnectFailures ").append(this.numConnectionFailures).append("\n");
}
+ if (this.numIpConfigFailures > 0) {
+ sbuf.append(" numIpConfigFailures ").append(this.numIpConfigFailures).append("\n");
+ }
+ if (this.numAuthFailures > 0) {
+ sbuf.append(" numAuthFailures ").append(this.numAuthFailures).append("\n");
+ }
if (this.autoJoinStatus > 0) {
- sbuf.append(" autoJoinStatus ").append(this.numConnectionFailures).append("\n");
+ sbuf.append(" autoJoinStatus ").append(this.autoJoinStatus).append("\n");
+ }
+ if (this.disableReason > 0) {
+ sbuf.append(" disableReason ").append(this.disableReason).append("\n");
+ }
+ if (this.numAssociation > 0) {
+ sbuf.append(" numAssociation ").append(this.numAssociation).append("\n");
}
if (this.didSelfAdd) sbuf.append(" didSelfAdd");
if (this.selfAdded) sbuf.append(" selfAdded");
@@ -1028,10 +1061,17 @@
}
}
if (this.scanResultCache != null) {
- sbuf.append("scan cache: ");
+ sbuf.append("Scan Cache: ");
for(ScanResult result : this.scanResultCache.values()) {
sbuf.append("{").append(result.BSSID).append(",").append(result.frequency);
- sbuf.append(",").append(result.level).append(",st=");
+ sbuf.append(",").append(result.level);
+ if (result.autoJoinStatus > 0) {
+ sbuf.append(",st=").append(result.autoJoinStatus);
+ }
+ if (result.numIpConfigFailures > 0) {
+ sbuf.append(",ipfail=");
+ sbuf.append(result.numIpConfigFailures);
+ }
sbuf.append(result.autoJoinStatus).append("} ");
}
sbuf.append('\n');
@@ -1356,6 +1396,8 @@
lastDisconnected = source.lastDisconnected;
lastConnectionFailure = source.lastConnectionFailure;
numConnectionFailures = source.numConnectionFailures;
+ numIpConfigFailures = source.numIpConfigFailures;
+ numAuthFailures = source.numAuthFailures;
numScorerOverride = source.numScorerOverride;
numScorerOverrideAndSwitchedNetwork = source.numScorerOverrideAndSwitchedNetwork;
numAssociation = source.numAssociation;
@@ -1370,6 +1412,7 @@
autoJoinUseAggressiveJoinAttemptThreshold
= source.autoJoinUseAggressiveJoinAttemptThreshold;
autoJoinBailedDueToLowRssi = source.autoJoinBailedDueToLowRssi;
+ dirty = source.dirty;
}
}
@@ -1420,6 +1463,8 @@
dest.writeLong(blackListTimestamp);
dest.writeLong(lastConnectionFailure);
dest.writeInt(numConnectionFailures);
+ dest.writeInt(numIpConfigFailures);
+ dest.writeInt(numAuthFailures);
dest.writeInt(numScorerOverride);
dest.writeInt(numScorerOverrideAndSwitchedNetwork);
dest.writeInt(numAssociation);
@@ -1478,6 +1523,8 @@
config.blackListTimestamp = in.readLong();
config.lastConnectionFailure = in.readLong();
config.numConnectionFailures = in.readInt();
+ config.numIpConfigFailures = in.readInt();
+ config.numAuthFailures = in.readInt();
config.numScorerOverride = in.readInt();
config.numScorerOverrideAndSwitchedNetwork = in.readInt();
config.numAssociation = in.readInt();