diff options
551 files changed, 4129 insertions, 1246 deletions
diff --git a/api/current.txt b/api/current.txt index 1443beefc929..78abd5337fe8 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5623,6 +5623,7 @@ package android.content { method public void attachInfo(android.content.Context, android.content.pm.ProviderInfo); method public int bulkInsert(android.net.Uri, android.content.ContentValues[]); method public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle); + method public android.net.Uri canonicalize(android.net.Uri); method public abstract int delete(android.net.Uri, java.lang.String, java.lang.String[]); method public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); method public final java.lang.String getCallingPackage(); @@ -5652,6 +5653,7 @@ package android.content { method protected final void setReadPermission(java.lang.String); method protected final void setWritePermission(java.lang.String); method public void shutdown(); + method public android.net.Uri uncanonicalize(android.net.Uri); method public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]); } @@ -5663,6 +5665,7 @@ package android.content { method public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException, android.os.RemoteException; method public int bulkInsert(android.net.Uri, android.content.ContentValues[]) throws android.os.RemoteException; method public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle) throws android.os.RemoteException; + method public final android.net.Uri canonicalize(android.net.Uri) throws android.os.RemoteException; method public int delete(android.net.Uri, java.lang.String, java.lang.String[]) throws android.os.RemoteException; method public android.content.ContentProvider getLocalContentProvider(); method public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String) throws android.os.RemoteException; @@ -5677,6 +5680,7 @@ package android.content { method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String) throws android.os.RemoteException; method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal) throws android.os.RemoteException; method public boolean release(); + method public final android.net.Uri uncanonicalize(android.net.Uri) throws android.os.RemoteException; method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]) throws android.os.RemoteException; } @@ -5742,6 +5746,7 @@ package android.content { method public final android.os.Bundle call(android.net.Uri, java.lang.String, java.lang.String, android.os.Bundle); method public deprecated void cancelSync(android.net.Uri); method public static void cancelSync(android.accounts.Account, java.lang.String); + method public final android.net.Uri canonicalize(android.net.Uri); method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]); method public static deprecated android.content.SyncInfo getCurrentSync(); method public static java.util.List<android.content.SyncInfo> getCurrentSyncs(); @@ -5779,6 +5784,7 @@ package android.content { method public static void setMasterSyncAutomatically(boolean); method public static void setSyncAutomatically(android.accounts.Account, java.lang.String, boolean); method public deprecated void startSync(android.net.Uri, android.os.Bundle); + method public final android.net.Uri uncanonicalize(android.net.Uri); method public final void unregisterContentObserver(android.database.ContentObserver); method public final int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]); method public static void validateSyncExtrasBundle(android.os.Bundle); @@ -10623,6 +10629,10 @@ package android.hardware { field public int width; } + public abstract interface FlushCompleteListener { + method public abstract void onFlushCompleted(android.hardware.Sensor); + } + public class GeomagneticField { ctor public GeomagneticField(float, float, float, long); method public float getDeclination(); @@ -10635,6 +10645,8 @@ package android.hardware { } public final class Sensor { + method public int getFifoMaxEventCount(); + method public int getFifoReservedEventCount(); method public float getMaximumRange(); method public int getMinDelay(); method public java.lang.String getName(); @@ -10685,6 +10697,7 @@ package android.hardware { public abstract class SensorManager { method public boolean cancelTriggerSensor(android.hardware.TriggerEventListener, android.hardware.Sensor); + method public boolean flush(android.hardware.Sensor); method public static float getAltitude(float, float); method public static void getAngleChange(float[], float[], float[]); method public android.hardware.Sensor getDefaultSensor(int); @@ -10698,7 +10711,9 @@ package android.hardware { method public deprecated boolean registerListener(android.hardware.SensorListener, int); method public deprecated boolean registerListener(android.hardware.SensorListener, int, int); method public boolean registerListener(android.hardware.SensorEventListener, android.hardware.Sensor, int); + method public boolean registerListener(android.hardware.SensorEventListener, android.hardware.Sensor, int, int, int, android.hardware.FlushCompleteListener); method public boolean registerListener(android.hardware.SensorEventListener, android.hardware.Sensor, int, android.os.Handler); + method public boolean registerListener(android.hardware.SensorEventListener, android.hardware.Sensor, int, int, int, android.os.Handler, android.hardware.FlushCompleteListener); method public static boolean remapCoordinateSystem(float[], int, int, float[]); method public boolean requestTriggerSensor(android.hardware.TriggerEventListener, android.hardware.Sensor); method public deprecated void unregisterListener(android.hardware.SensorListener); @@ -12130,6 +12145,12 @@ package android.media { method public abstract void onPeriodicNotification(android.media.AudioRecord); } + public final class AudioTimestamp { + ctor public AudioTimestamp(); + field public long framePosition; + field public long nanoTime; + } + public class AudioTrack { ctor public AudioTrack(int, int, int, int, int, int) throws java.lang.IllegalArgumentException; ctor public AudioTrack(int, int, int, int, int, int, int) throws java.lang.IllegalArgumentException; @@ -12152,6 +12173,7 @@ package android.media { method public int getSampleRate(); method public int getState(); method public int getStreamType(); + method public android.media.AudioTimestamp getTimestamp(android.media.AudioTimestamp); method public void pause() throws java.lang.IllegalStateException; method public void play() throws java.lang.IllegalStateException; method public void release(); @@ -20774,6 +20796,7 @@ package android.provider { field public static final java.lang.String COLUMN_SIZE = "_size"; field public static final java.lang.String COLUMN_SUMMARY = "summary"; field public static final int FLAG_DIR_PREFERS_GRID = 32; // 0x20 + field public static final int FLAG_DIR_PREFERS_LAST_MODIFIED = 64; // 0x40 field public static final int FLAG_DIR_SUPPORTS_CREATE = 8; // 0x8 field public static final int FLAG_DIR_SUPPORTS_SEARCH = 16; // 0x10 field public static final int FLAG_SUPPORTS_DELETE = 4; // 0x4 @@ -22789,6 +22812,26 @@ package android.speech { } +package android.speech.hotword { + + public abstract class HotwordRecognitionService extends android.app.Service { + ctor public HotwordRecognitionService(); + method public android.os.IBinder onBind(android.content.Intent); + method public abstract void onStartHotwordRecognition(android.speech.hotword.HotwordRecognitionService.Callback); + method public abstract void onStopHotwordRecognition(); + field public static final java.lang.String SERVICE_INTERFACE = "android.speech.hotword.HotwordRecognitionService"; + } + + public static class HotwordRecognitionService.Callback { + method public void onError(int) throws android.os.RemoteException; + method public void onHotwordEvent(int, android.os.Bundle) throws android.os.RemoteException; + method public void onHotwordRecognitionStarted() throws android.os.RemoteException; + method public void onHotwordRecognitionStopped() throws android.os.RemoteException; + method public void onHotwordRecognized(android.content.Intent) throws android.os.RemoteException; + } + +} + package android.speech.tts { public abstract interface SynthesisCallback { @@ -29010,12 +29053,12 @@ package android.view.accessibility { } public class CaptioningManager { - method public void addCaptioningStateChangeListener(android.view.accessibility.CaptioningManager.CaptioningChangeListener); + method public void addCaptioningChangeListener(android.view.accessibility.CaptioningManager.CaptioningChangeListener); method public final float getFontScale(); method public final java.util.Locale getLocale(); method public android.view.accessibility.CaptioningManager.CaptionStyle getUserStyle(); method public final boolean isEnabled(); - method public void removeCaptioningStateChangeListener(android.view.accessibility.CaptioningManager.CaptioningChangeListener); + method public void removeCaptioningChangeListener(android.view.accessibility.CaptioningManager.CaptioningChangeListener); } public static final class CaptioningManager.CaptionStyle { @@ -29029,7 +29072,7 @@ package android.view.accessibility { field public final int foregroundColor; } - public abstract class CaptioningManager.CaptioningChangeListener { + public static abstract class CaptioningManager.CaptioningChangeListener { ctor public CaptioningManager.CaptioningChangeListener(); method public void onEnabledChanged(boolean); method public void onFontScaleChanged(float); diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 7c40bb15ac18..2d28280fe71b 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -2106,7 +2106,12 @@ public class ActivityManager { } // If the target is not exported, then nobody else can get to it. if (!exported) { - Slog.w(TAG, "Permission denied: checkComponentPermission() owningUid=" + owningUid); + /* + RuntimeException here = new RuntimeException("here"); + here.fillInStackTrace(); + Slog.w(TAG, "Permission denied: checkComponentPermission() owningUid=" + owningUid, + here); + */ return PackageManager.PERMISSION_DENIED; } if (permission == null) { diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index e776a98a029b..7ff75625a114 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -1827,6 +1827,11 @@ class ContextImpl extends Context { message); } + /** + * Logs a warning if the system process directly called a method such as + * {@link #startService(Intent)} instead of {@link #startServiceAsUser(Intent, UserHandle)}. + * The "AsUser" variants allow us to properly enforce the user's restrictions. + */ private void warnIfCallingFromSystemProcess() { if (Process.myUid() == Process.SYSTEM_UID) { Slog.w(TAG, "Calling a method in the system process without a qualified user: " diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index e062fa8b4eb9..676fd1f32915 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -924,6 +924,42 @@ public final class BluetoothAdapter { } /** + * Create a listening, L2CAP Bluetooth socket. + * <p>A remote device connecting to this socket will optionally be + * authenticated and communication on this socket will optionally be + * encrypted. + * <p>Use {@link BluetoothServerSocket#accept} to retrieve incoming + * connections from a listening {@link BluetoothServerSocket}. + * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} + * @param secure whether security and authentication are required + * @param fixedChannel whether we're looking for a PSM-based connection or a fixed channel + * @param channel L2CAP PSM or channel to use + * @return a listening L2CAP BluetoothServerSocket + * @throws IOException on error, for example Bluetooth not available, or + * insufficient permissions, or channel in use. + * @hide + */ + public BluetoothServerSocket listenUsingL2CapOn(boolean secure, boolean fixedChannel, + int channel) throws IOException { + BluetoothServerSocket socket; + + if (fixedChannel) { + channel |= BluetoothSocket.PORT_MASK_FIXED_CHAN; + } + + socket = new BluetoothServerSocket( + BluetoothSocket.TYPE_L2CAP, secure, secure, channel); + int errno = socket.mSocket.bindListen(); + if (errno != 0) { + //TODO(BT): Throw the same exception error code + // that the previous code was using. + //socket.mSocket.throwErrnoNative(errno); + throw new IOException("Error: " + errno); + } + return socket; + } + + /** * Create a listening, secure RFCOMM Bluetooth socket. * <p>A remote device connecting to this socket will be authenticated and * communication on this socket will be encrypted. diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java index 3acd9b00c056..2c85382fe13c 100644 --- a/core/java/android/bluetooth/BluetoothDevice.java +++ b/core/java/android/bluetooth/BluetoothDevice.java @@ -1144,6 +1144,33 @@ public final class BluetoothDevice implements Parcelable { return new BluetoothSocket(BluetoothSocket.TYPE_SCO, -1, true, true, this, -1, null); } + + /** + * Construct a L2CAP socket ready to start an outgoing connection. + * Call #connect on the returned #BluetoothSocket to begin the connection. + * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} + * + * @param secure select whether security will be required + * @param fixedChannel select if this will be a "fixed channel" L2CAP connection + * or a PSM-based connection + * @param channel fixed channel or PSM to connect to + * @return a L2CAP BluetoothSocket + * @throws IOException on error, for example Bluetooth not available, or + * insufficient permissions. + * @hide + */ + public BluetoothSocket createL2CapSocket(boolean secure, boolean fixedChannel, int channel) + throws IOException { + + if (fixedChannel) { + channel |= BluetoothSocket.PORT_MASK_FIXED_CHAN; + } + + return new BluetoothSocket(BluetoothSocket.TYPE_L2CAP, -1, secure, secure, this, + channel, null); + } + + /** * Check that a pin is valid and convert to byte array. * diff --git a/core/java/android/bluetooth/BluetoothSocket.java b/core/java/android/bluetooth/BluetoothSocket.java index d10eaea2fba1..191bf67af340 100644 --- a/core/java/android/bluetooth/BluetoothSocket.java +++ b/core/java/android/bluetooth/BluetoothSocket.java @@ -103,6 +103,8 @@ public final class BluetoothSocket implements Closeable { /*package*/ static final int SEC_FLAG_ENCRYPT = 1; /*package*/ static final int SEC_FLAG_AUTH = 1 << 1; + /*package*/ static final int PORT_MASK_FIXED_CHAN = 1 << 16; + private final int mType; /* one of TYPE_RFCOMM etc */ private BluetoothDevice mDevice; /* remote device */ private String mAddress; /* remote address */ @@ -115,7 +117,7 @@ public final class BluetoothSocket implements Closeable { private LocalSocket mSocket; private InputStream mSocketIS; private OutputStream mSocketOS; - private int mPort; /* RFCOMM channel or L2CAP psm */ + private int mPort; /* RFCOMM channel or L2CAP psm/channel */ private int mFd; private String mServiceName; private static int PROXY_CONNECTION_TIMEOUT = 5000; diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java index 24c396a903ed..65a3a07bea98 100644 --- a/core/java/android/content/ContentProvider.java +++ b/core/java/android/content/ContentProvider.java @@ -348,10 +348,36 @@ public abstract class ContentProvider implements ComponentCallbacks2 { } @Override - public ICancellationSignal createCancellationSignal() throws RemoteException { + public ICancellationSignal createCancellationSignal() { return CancellationSignal.createTransport(); } + @Override + public Uri canonicalize(String callingPkg, Uri uri) { + if (enforceReadPermission(callingPkg, uri) != AppOpsManager.MODE_ALLOWED) { + return null; + } + mCallingPackage.set(callingPkg); + try { + return ContentProvider.this.canonicalize(uri); + } finally { + mCallingPackage.set(null); + } + } + + @Override + public Uri uncanonicalize(String callingPkg, Uri uri) { + if (enforceReadPermission(callingPkg, uri) != AppOpsManager.MODE_ALLOWED) { + return null; + } + mCallingPackage.set(callingPkg); + try { + return ContentProvider.this.uncanonicalize(uri); + } finally { + mCallingPackage.set(null); + } + } + private void enforceFilePermission(String callingPkg, Uri uri, String mode) throws FileNotFoundException, SecurityException { if (mode != null && mode.indexOf('w') != -1) { @@ -841,6 +867,56 @@ public abstract class ContentProvider implements ComponentCallbacks2 { public abstract String getType(Uri uri); /** + * Implement this to support canonicalization of URIs that refer to your + * content provider. A canonical URI is one that can be transported across + * devices, backup/restore, and other contexts, and still be able to refer + * to the same data item. Typically this is implemented by adding query + * params to the URI allowing the content provider to verify that an incoming + * canonical URI references the same data as it was originally intended for and, + * if it doesn't, to find that data (if it exists) in the current environment. + * + * <p>For example, if the content provider holds people and a normal URI in it + * is created with a row index into that people database, the cananical representation + * may have an additional query param at the end which specifies the name of the + * person it is intended for. Later calls into the provider with that URI will look + * up the row of that URI's base index and, if it doesn't match or its entry's + * name doesn't match the name in the query param, perform a query on its database + * to find the correct row to operate on.</p> + * + * <p>If you implement support for canonical URIs, <b>all</b> incoming calls with + * URIs (including this one) must perform this verification and recovery of any + * canonical URIs they receive. In addition, you must also implement + * {@link #uncanonicalize} to strip the canonicalization of any of these URIs.</p> + * + * <p>The default implementation of this method returns null, indicating that + * canonical URIs are not supported.</p> + * + * @param url The Uri to canonicalize. + * + * @return Return the canonical representation of <var>url</var>, or null if + * canonicalization of that Uri is not supported. + */ + public Uri canonicalize(Uri url) { + return null; + } + + /** + * Remove canonicalization from canonical URIs previously returned by + * {@link #canonicalize}. For example, if your implementation is to add + * a query param to canonicalize a URI, this method can simply trip any + * query params on the URI. The default implementation always returns the + * same <var>url</var> that was passed in. + * + * @param url The Uri to remove any canonicalization from. + * + * @return Return the non-canonical representation of <var>url</var>, or return + * the <var>url</var> as-is if there is nothing to do. Never return null. + */ + public Uri uncanonicalize(Uri url) { + return url; + } + + /** * @hide * Implementation when a caller has performed an insert on the content * provider, but that call has been rejected for the operation given diff --git a/core/java/android/content/ContentProviderClient.java b/core/java/android/content/ContentProviderClient.java index 4e8dd829a348..e6d9b2483951 100644 --- a/core/java/android/content/ContentProviderClient.java +++ b/core/java/android/content/ContentProviderClient.java @@ -110,6 +110,30 @@ public class ContentProviderClient { } } + /** See {@link ContentProvider#canonicalize} */ + public final Uri canonicalize(Uri url) throws RemoteException { + try { + return mContentProvider.canonicalize(mPackageName, url); + } catch (DeadObjectException e) { + if (!mStable) { + mContentResolver.unstableProviderDied(mContentProvider); + } + throw e; + } + } + + /** See {@link ContentProvider#uncanonicalize} */ + public final Uri uncanonicalize(Uri url) throws RemoteException { + try { + return mContentProvider.uncanonicalize(mPackageName, url); + } catch (DeadObjectException e) { + if (!mStable) { + mContentResolver.unstableProviderDied(mContentProvider); + } + throw e; + } + } + /** See {@link ContentProvider#insert ContentProvider.insert} */ public Uri insert(Uri url, ContentValues initialValues) throws RemoteException { diff --git a/core/java/android/content/ContentProviderNative.java b/core/java/android/content/ContentProviderNative.java index 744e68c6e27e..bcf0b637a213 100644 --- a/core/java/android/content/ContentProviderNative.java +++ b/core/java/android/content/ContentProviderNative.java @@ -323,6 +323,30 @@ abstract public class ContentProviderNative extends Binder implements IContentPr reply.writeStrongBinder(cancellationSignal.asBinder()); return true; } + + case CANONICALIZE_TRANSACTION: + { + data.enforceInterface(IContentProvider.descriptor); + String callingPkg = data.readString(); + Uri url = Uri.CREATOR.createFromParcel(data); + + Uri out = canonicalize(callingPkg, url); + reply.writeNoException(); + Uri.writeToParcel(reply, out); + return true; + } + + case UNCANONICALIZE_TRANSACTION: + { + data.enforceInterface(IContentProvider.descriptor); + String callingPkg = data.readString(); + Uri url = Uri.CREATOR.createFromParcel(data); + + Uri out = uncanonicalize(callingPkg, url); + reply.writeNoException(); + Uri.writeToParcel(reply, out); + return true; + } } } catch (Exception e) { DatabaseUtils.writeExceptionToParcel(reply, e); @@ -685,5 +709,46 @@ final class ContentProviderProxy implements IContentProvider } } + public Uri canonicalize(String callingPkg, Uri url) throws RemoteException + { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + try { + data.writeInterfaceToken(IContentProvider.descriptor); + + data.writeString(callingPkg); + url.writeToParcel(data, 0); + + mRemote.transact(IContentProvider.CANONICALIZE_TRANSACTION, data, reply, 0); + + DatabaseUtils.readExceptionFromParcel(reply); + Uri out = Uri.CREATOR.createFromParcel(reply); + return out; + } finally { + data.recycle(); + reply.recycle(); + } + } + + public Uri uncanonicalize(String callingPkg, Uri url) throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + try { + data.writeInterfaceToken(IContentProvider.descriptor); + + data.writeString(callingPkg); + url.writeToParcel(data, 0); + + mRemote.transact(IContentProvider.UNCANONICALIZE_TRANSACTION, data, reply, 0); + + DatabaseUtils.readExceptionFromParcel(reply); + Uri out = Uri.CREATOR.createFromParcel(reply); + return out; + } finally { + data.recycle(); + reply.recycle(); + } + } + private IBinder mRemote; } diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index 8a5a56cd2628..9f462aab54f9 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -497,6 +497,86 @@ public abstract class ContentResolver { } /** + * Transform the given <var>url</var> to a canonical representation of + * its referenced resource, which can be used across devices, persisted, + * backed up and restored, etc. The returned Uri is still a fully capable + * Uri for use with its content provider, allowing you to do all of the + * same content provider operations as with the original Uri -- + * {@link #query}, {@link #openInputStream(android.net.Uri)}, etc. The + * only difference in behavior between the original and new Uris is that + * the content provider may need to do some additional work at each call + * using it to resolve it to the correct resource, especially if the + * canonical Uri has been moved to a different environment. + * + * <p>If you are moving a canonical Uri between environments, you should + * perform another call to {@link #canonicalize} with that original Uri to + * re-canonicalize it for the current environment. Alternatively, you may + * want to use {@link #uncanonicalize} to transform it to a non-canonical + * Uri that works only in the current environment but potentially more + * efficiently than the canonical representation.</p> + * + * @param url The {@link Uri} that is to be transformed to a canonical + * representation. Like all resolver calls, the input can be either + * a non-canonical or canonical Uri. + * + * @return Returns the official canonical representation of <var>url</var>, + * or null if the content provider does not support a canonical representation + * of the given Uri. Many providers may not support canonicalization of some + * or all of their Uris. + * + * @see #uncanonicalize + */ + public final Uri canonicalize(Uri url) { + IContentProvider provider = acquireProvider(url); + if (provider == null) { + return null; + } + + try { + return provider.canonicalize(mPackageName, url); + } catch (RemoteException e) { + // Arbitrary and not worth documenting, as Activity + // Manager will kill this process shortly anyway. + return null; + } finally { + releaseProvider(provider); + } + } + + /** + * Given a canonical Uri previously generated by {@link #canonicalize}, convert + * it to its local non-canonical form. This can be useful in some cases where + * you know that you will only be using the Uri in the current environment and + * want to avoid any possible overhead when using it with the content + * provider. + * + * @param url The canonical {@link Uri} that is to be convered back to its + * non-canonical form. + * + * @return Returns the non-canonical representation of <var>url</var>. This + * function never returns null; if there is no conversion to be done, it returns + * the same Uri that was provided. + * + * @see #canonicalize + */ + public final Uri uncanonicalize(Uri url) { + IContentProvider provider = acquireProvider(url); + if (provider == null) { + return null; + } + + try { + return provider.uncanonicalize(mPackageName, url); + } catch (RemoteException e) { + // Arbitrary and not worth documenting, as Activity + // Manager will kill this process shortly anyway. + return null; + } finally { + releaseProvider(provider); + } + } + + /** * Open a stream on to the content associated with a content URI. If there * is no data associated with the URI, FileNotFoundException is thrown. * diff --git a/core/java/android/content/IContentProvider.java b/core/java/android/content/IContentProvider.java index 6ea88768e9a1..f92a40440904 100644 --- a/core/java/android/content/IContentProvider.java +++ b/core/java/android/content/IContentProvider.java @@ -59,6 +59,9 @@ public interface IContentProvider extends IInterface { throws RemoteException; public ICancellationSignal createCancellationSignal() throws RemoteException; + public Uri canonicalize(String callingPkg, Uri uri) throws RemoteException; + public Uri uncanonicalize(String callingPkg, Uri uri) throws RemoteException; + // Data interchange. public String[] getStreamTypes(Uri url, String mimeTypeFilter) throws RemoteException; public AssetFileDescriptor openTypedAssetFile(String callingPkg, Uri url, String mimeType, @@ -80,4 +83,6 @@ public interface IContentProvider extends IInterface { static final int GET_STREAM_TYPES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 21; static final int OPEN_TYPED_ASSET_FILE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 22; static final int CREATE_CANCELATION_SIGNAL_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 23; + static final int CANONICALIZE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 24; + static final int UNCANONICALIZE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 25; } diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java index 8154bca2cb89..b8ac3bf9a8e0 100644 --- a/core/java/android/content/pm/ActivityInfo.java +++ b/core/java/android/content/pm/ActivityInfo.java @@ -16,6 +16,7 @@ package android.content.pm; +import android.content.res.Configuration; import android.os.Parcel; import android.os.Parcelable; import android.util.Printer; @@ -437,20 +438,20 @@ public class ActivityInfo extends ComponentInfo * native side given the bit we have assigned in ActivityInfo. */ public static int[] CONFIG_NATIVE_BITS = new int[] { - 0x0001, // MNC - 0x0002, // MCC - 0x0004, // LOCALE - 0x0008, // TOUCH SCREEN - 0x0010, // KEYBOARD - 0x0020, // KEYBOARD HIDDEN - 0x0040, // NAVIGATION - 0x0080, // ORIENTATION - 0x0800, // SCREEN LAYOUT - 0x1000, // UI MODE - 0x0200, // SCREEN SIZE - 0x2000, // SMALLEST SCREEN SIZE - 0x0100, // DENSITY - 0x4000, // LAYOUT DIRECTION + Configuration.NATIVE_CONFIG_MNC, // MNC + Configuration.NATIVE_CONFIG_MCC, // MCC + Configuration.NATIVE_CONFIG_LOCALE, // LOCALE + Configuration.NATIVE_CONFIG_TOUCHSCREEN, // TOUCH SCREEN + Configuration.NATIVE_CONFIG_KEYBOARD, // KEYBOARD + Configuration.NATIVE_CONFIG_KEYBOARD_HIDDEN, // KEYBOARD HIDDEN + Configuration.NATIVE_CONFIG_NAVIGATION, // NAVIGATION + Configuration.NATIVE_CONFIG_ORIENTATION, // ORIENTATION + Configuration.NATIVE_CONFIG_SCREEN_LAYOUT, // SCREEN LAYOUT + Configuration.NATIVE_CONFIG_UI_MODE, // UI MODE + Configuration.NATIVE_CONFIG_SCREEN_SIZE, // SCREEN SIZE + Configuration.NATIVE_CONFIG_SMALLEST_SCREEN_SIZE, // SMALLEST SCREEN SIZE + Configuration.NATIVE_CONFIG_DENSITY, // DENSITY + Configuration.NATIVE_CONFIG_LAYOUTDIR, // LAYOUT DIRECTION }; /** @hide * Convert Java change bits to native. diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 541dcb93d956..6760f4917496 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -1864,7 +1864,8 @@ public class PackageParser { } String manageSpaceActivity = sa.getNonConfigurationString( - com.android.internal.R.styleable.AndroidManifestApplication_manageSpaceActivity, 0); + com.android.internal.R.styleable.AndroidManifestApplication_manageSpaceActivity, + Configuration.NATIVE_CONFIG_VERSION); if (manageSpaceActivity != null) { ai.manageSpaceActivityName = buildClassName(pkgName, manageSpaceActivity, outError); @@ -1878,7 +1879,8 @@ public class PackageParser { // backupAgent, killAfterRestore, and restoreAnyVersion are only relevant // if backup is possible for the given application. String backupAgent = sa.getNonConfigurationString( - com.android.internal.R.styleable.AndroidManifestApplication_backupAgent, 0); + com.android.internal.R.styleable.AndroidManifestApplication_backupAgent, + Configuration.NATIVE_CONFIG_VERSION); if (backupAgent != null) { ai.backupAgentName = buildClassName(pkgName, backupAgent, outError); if (DEBUG_BACKUP) { @@ -1999,7 +2001,8 @@ public class PackageParser { if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) { str = sa.getNonConfigurationString( - com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity, 0); + com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity, + Configuration.NATIVE_CONFIG_VERSION); } else { // Some older apps have been seen to use a resource reference // here that on older builds was ignored (with a warning). We @@ -2014,7 +2017,8 @@ public class PackageParser { CharSequence pname; if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) { pname = sa.getNonConfigurationString( - com.android.internal.R.styleable.AndroidManifestApplication_process, 0); + com.android.internal.R.styleable.AndroidManifestApplication_process, + Configuration.NATIVE_CONFIG_VERSION); } else { // Some older apps have been seen to use a resource reference // here that on older builds was ignored (with a warning). We @@ -2278,7 +2282,8 @@ public class PackageParser { a.info.applicationInfo.uiOptions); String parentName = sa.getNonConfigurationString( - com.android.internal.R.styleable.AndroidManifestActivity_parentActivityName, 0); + com.android.internal.R.styleable.AndroidManifestActivity_parentActivityName, + Configuration.NATIVE_CONFIG_VERSION); if (parentName != null) { String parentClassName = buildClassName(a.info.packageName, parentName, outError); if (outError[0] == null) { @@ -2300,7 +2305,8 @@ public class PackageParser { } str = sa.getNonConfigurationString( - com.android.internal.R.styleable.AndroidManifestActivity_taskAffinity, 0); + com.android.internal.R.styleable.AndroidManifestActivity_taskAffinity, + Configuration.NATIVE_CONFIG_VERSION); a.info.taskAffinity = buildTaskAffinityName(owner.applicationInfo.packageName, owner.applicationInfo.taskAffinity, str, outError); @@ -2509,7 +2515,8 @@ public class PackageParser { com.android.internal.R.styleable.AndroidManifestActivityAlias); String targetActivity = sa.getNonConfigurationString( - com.android.internal.R.styleable.AndroidManifestActivityAlias_targetActivity, 0); + com.android.internal.R.styleable.AndroidManifestActivityAlias_targetActivity, + Configuration.NATIVE_CONFIG_VERSION); if (targetActivity == null) { outError[0] = "<activity-alias> does not specify android:targetActivity"; sa.recycle(); @@ -2599,7 +2606,7 @@ public class PackageParser { String parentName = sa.getNonConfigurationString( com.android.internal.R.styleable.AndroidManifestActivityAlias_parentActivityName, - 0); + Configuration.NATIVE_CONFIG_VERSION); if (parentName != null) { String parentClassName = buildClassName(a.info.packageName, parentName, outError); if (outError[0] == null) { @@ -3656,7 +3663,8 @@ public class PackageParser { if (args.processRes != 0) { CharSequence pname; if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) { - pname = args.sa.getNonConfigurationString(args.processRes, 0); + pname = args.sa.getNonConfigurationString(args.processRes, + Configuration.NATIVE_CONFIG_VERSION); } else { // Some older apps have been seen to use a resource reference // here that on older builds was ignored (with a warning). We diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index 0402eeb94764..48b6fca7b2d3 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -544,7 +544,40 @@ public final class Configuration implements Parcelable, Comparable<Configuration * @hide Internal book-keeping. */ public int seq; - + + /** @hide Native-specific bit mask for MCC config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_MCC = 0x0001; + /** @hide Native-specific bit mask for MNC config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_MNC = 0x0002; + /** @hide Native-specific bit mask for LOCALE config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_LOCALE = 0x0004; + /** @hide Native-specific bit mask for TOUCHSCREEN config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_TOUCHSCREEN = 0x0008; + /** @hide Native-specific bit mask for KEYBOARD config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_KEYBOARD = 0x0010; + /** @hide Native-specific bit mask for KEYBOARD_HIDDEN config; DO NOT USE UNLESS YOU + * ARE SURE. */ + public static final int NATIVE_CONFIG_KEYBOARD_HIDDEN = 0x0020; + /** @hide Native-specific bit mask for NAVIGATION config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_NAVIGATION = 0x0040; + /** @hide Native-specific bit mask for ORIENTATION config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_ORIENTATION = 0x0080; + /** @hide Native-specific bit mask for DENSITY config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_DENSITY = 0x0100; + /** @hide Native-specific bit mask for SCREEN_SIZE config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_SCREEN_SIZE = 0x0200; + /** @hide Native-specific bit mask for VERSION config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_VERSION = 0x0400; + /** @hide Native-specific bit mask for SCREEN_LAYOUT config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_SCREEN_LAYOUT = 0x0800; + /** @hide Native-specific bit mask for UI_MODE config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_UI_MODE = 0x1000; + /** @hide Native-specific bit mask for SMALLEST_SCREEN_SIZE config; DO NOT USE UNLESS YOU + * ARE SURE. */ + public static final int NATIVE_CONFIG_SMALLEST_SCREEN_SIZE = 0x2000; + /** @hide Native-specific bit mask for LAYOUTDIR config ; DO NOT USE UNLESS YOU ARE SURE.*/ + public static final int NATIVE_CONFIG_LAYOUTDIR = 0x4000; + /** * Construct an invalid Configuration. You must call {@link #setToDefaults} * for this object to be valid. {@more} diff --git a/core/java/android/content/res/TypedArray.java b/core/java/android/content/res/TypedArray.java index 27dddd47aa32..83d48aa46542 100644 --- a/core/java/android/content/res/TypedArray.java +++ b/core/java/android/content/res/TypedArray.java @@ -16,6 +16,7 @@ package android.content.res; +import android.content.pm.ActivityInfo; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.DisplayMetrics; @@ -170,8 +171,8 @@ public class TypedArray { * * @param index Index of attribute to retrieve. * @param allowedChangingConfigs Bit mask of configurations from - * ActivityInfo that are allowed to change. - * + * {@link Configuration}.NATIVE_CONFIG_* that are allowed to change. + * * @return String holding string data. Any styling information is * removed. Returns null if the attribute is not defined. */ diff --git a/core/java/android/hardware/FlushCompleteListener.java b/core/java/android/hardware/FlushCompleteListener.java index cb5b9e331e85..fbdf4c811e72 100644 --- a/core/java/android/hardware/FlushCompleteListener.java +++ b/core/java/android/hardware/FlushCompleteListener.java @@ -18,7 +18,6 @@ package android.hardware; /** * Used for receiving a notification when a flush() has been successfully completed. - * @hide */ public interface FlushCompleteListener { /** diff --git a/core/java/android/hardware/Sensor.java b/core/java/android/hardware/Sensor.java index bbede57f55c3..89a581966265 100644 --- a/core/java/android/hardware/Sensor.java +++ b/core/java/android/hardware/Sensor.java @@ -385,8 +385,7 @@ public final class Sensor { /** * @return Number of events reserved for this sensor in the batch mode FIFO. This gives a - * guarantee on the minimum number of events that can be batched - * @hide + * guarantee on the minimum number of events that can be batched. */ public int getFifoReservedEventCount() { return mFifoReservedEventCount; @@ -397,7 +396,6 @@ public final class Sensor { * it indicates that batch mode is not supported for this sensor. If other applications * registered to batched sensors, the actual number of events that can be batched might be * smaller because the hardware FiFo will be partially used to batch the other sensors. - * @hide */ public int getFifoMaxEventCount() { return mFifoMaxEventCount; diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java index b6ca62ab9fbd..8a4aa1df1df8 100644 --- a/core/java/android/hardware/SensorManager.java +++ b/core/java/android/hardware/SensorManager.java @@ -582,7 +582,7 @@ public abstract class SensorManager { * @param sensor * The {@link android.hardware.Sensor Sensor} to register to. * - * @param rate + * @param rateUs * The rate {@link android.hardware.SensorEvent sensor events} are * delivered at. This is only a hint to the system. Events may be * received faster or slower than the specified rate. Usually events @@ -603,14 +603,14 @@ public abstract class SensorManager { * * @throws IllegalArgumentException when sensor is null or a trigger sensor */ - public boolean registerListener(SensorEventListener listener, Sensor sensor, int rate) { - return registerListener(listener, sensor, rate, null); + public boolean registerListener(SensorEventListener listener, Sensor sensor, int rateUs) { + return registerListener(listener, sensor, rateUs, null); } /** * Enables batch mode for a sensor with the given rate and maxBatchReportLatency. If the * underlying hardware does not support batch mode, this defaults to - * {@link #registerListener(SensorEventListener, Sensor, int)} and other parameters are are + * {@link #registerListener(SensorEventListener, Sensor, int)} and other parameters are * ignored. In non-batch mode, all sensor events must be reported as soon as they are detected. * While in batch mode, sensor events do not need to be reported as soon as they are detected. * They can be temporarily stored in batches and reported in batches, as long as no event is @@ -640,13 +640,13 @@ public abstract class SensorManager { * @param listener A {@link android.hardware.SensorEventListener SensorEventListener} object * that will receive the sensor events. * @param sensor The {@link android.hardware.Sensor Sensor} to register to. - * @param rate The desired delay between two consecutive events in microseconds. This is only a - * hint to the system. Events may be received faster or slower than the specified + * @param rateUs The desired delay between two consecutive events in microseconds. This is only + * a hint to the system. Events may be received faster or slower than the specified * rate. Usually events are received faster. Can be one of * {@link #SENSOR_DELAY_NORMAL}, {@link #SENSOR_DELAY_UI}, * {@link #SENSOR_DELAY_GAME}, {@link #SENSOR_DELAY_FASTEST} or the delay in * microseconds. - * @param maxBatchReportLatency An event in the batch can be delayed by at most + * @param maxBatchReportLatencyUs An event in the batch can be delayed by at most * maxBatchReportLatency microseconds. More events can be batched if this value is * large. If this is set to zero, batch mode is disabled and events are delivered in * continuous mode as soon as they are available which is equivalent to calling @@ -661,7 +661,6 @@ public abstract class SensorManager { * @see #unregisterListener(SensorEventListener) * @see #flush(Sensor) * @throws IllegalArgumentException when sensor or listener is null or a trigger sensor. - * @hide */ public boolean registerListener(SensorEventListener listener, Sensor sensor, int rateUs, int maxBatchReportLatencyUs, int reservedFlags, @@ -673,7 +672,9 @@ public abstract class SensorManager { /** * Registers a {@link android.hardware.SensorEventListener SensorEventListener} for the given - * sensor. Events are delivered in continuous mode as soon as they are available. + * sensor. Events are delivered in continuous mode as soon as they are available. To reduce the + * battery usage, use {@link #registerListener(SensorEventListener, Sensor, int, int, int, + * FlushCompleteListener)} which enables batch mode for the sensor. * * <p class="note"></p> * Note: Don't use this method with a one shot trigger sensor such as @@ -688,7 +689,7 @@ public abstract class SensorManager { * @param sensor * The {@link android.hardware.Sensor Sensor} to register to. * - * @param rate + * @param rateUs * The rate {@link android.hardware.SensorEvent sensor events} are * delivered at. This is only a hint to the system. Events may be * received faster or slower than the specified rate. Usually events @@ -713,13 +714,13 @@ public abstract class SensorManager { * * @throws IllegalArgumentException when sensor is null or a trigger sensor */ - public boolean registerListener(SensorEventListener listener, Sensor sensor, int rate, + public boolean registerListener(SensorEventListener listener, Sensor sensor, int rateUs, Handler handler) { if (listener == null || sensor == null) { return false; } - int delay = getDelay(rate); + int delay = getDelay(rateUs); return registerListenerImpl(listener, sensor, delay, handler, 0, 0, null); } @@ -731,7 +732,6 @@ public abstract class SensorManager { * delivered to. * * @see #registerListener(SensorEventListener, Sensor, int, int, int, FlushCompleteListener) - * @hide */ public boolean registerListener(SensorEventListener listener, Sensor sensor, int rateUs, int maxBatchReportLatencyUs, int reservedFlags, Handler handler, @@ -760,7 +760,6 @@ public abstract class SensorManager { * i.e no application is registered for updates from this sensor. * @see #registerListener(SensorEventListener, Sensor, int, int, int, FlushCompleteListener) * @throws IllegalArgumentException when sensor is null or a trigger sensor. - * @hide */ public boolean flush(Sensor sensor) { return flushImpl(sensor); diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java index 3f9b9e91caa6..7735146ab925 100644 --- a/core/java/android/hardware/camera2/CaptureRequest.java +++ b/core/java/android/hardware/camera2/CaptureRequest.java @@ -182,7 +182,7 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { /** * <p> - * When android.sensor.awbMode is not OFF, TRANSFORM_MATRIX + * When android.control.awbMode is not OFF, TRANSFORM_MATRIX * should be ignored. * </p> * @see #COLOR_CORRECTION_MODE_TRANSFORM_MATRIX diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java index 43d6b71598ce..b4d07a1ec23c 100644 --- a/core/java/android/net/LinkProperties.java +++ b/core/java/android/net/LinkProperties.java @@ -66,6 +66,7 @@ public class LinkProperties implements Parcelable { private String mDomains; private Collection<RouteInfo> mRoutes = new ArrayList<RouteInfo>(); private ProxyProperties mHttpProxy; + private int mMtu; // Stores the properties of links that are "stacked" above this link. // Indexed by interface name to allow modification and to prevent duplicates being added. @@ -104,6 +105,7 @@ public class LinkProperties implements Parcelable { for (LinkProperties l: source.mStackedLinks.values()) { addStackedLink(l); } + setMtu(source.getMtu()); } } @@ -223,6 +225,14 @@ public class LinkProperties implements Parcelable { mDomains = domains; } + public void setMtu(int mtu) { + mMtu = mtu; + } + + public int getMtu() { + return mMtu; + } + private RouteInfo routeWithInterface(RouteInfo route) { return new RouteInfo( route.getDestination(), @@ -322,6 +332,7 @@ public class LinkProperties implements Parcelable { mRoutes.clear(); mHttpProxy = null; mStackedLinks.clear(); + mMtu = 0; } /** @@ -346,6 +357,8 @@ public class LinkProperties implements Parcelable { String domainName = "Domains: " + mDomains; + String mtu = "MTU: " + mMtu; + String routes = " Routes: ["; for (RouteInfo route : mRoutes) routes += route.toString() + ","; routes += "] "; @@ -359,7 +372,8 @@ public class LinkProperties implements Parcelable { } stacked += "] "; } - return "{" + ifaceName + linkAddresses + routes + dns + domainName + proxy + stacked + "}"; + return "{" + ifaceName + linkAddresses + routes + dns + domainName + mtu + + proxy + stacked + "}"; } /** @@ -474,6 +488,16 @@ public class LinkProperties implements Parcelable { return true; } + /** + * Compares this {@code LinkProperties} MTU against the target + * + * @param target LinkProperties to compare. + * @return {@code true} if both are identical, {@code false} otherwise. + */ + public boolean isIdenticalMtu(LinkProperties target) { + return getMtu() == target.getMtu(); + } + @Override /** * Compares this {@code LinkProperties} instance against the target @@ -505,7 +529,8 @@ public class LinkProperties implements Parcelable { isIdenticalDnses(target) && isIdenticalRoutes(target) && isIdenticalHttpProxy(target) && - isIdenticalStackedLinks(target); + isIdenticalStackedLinks(target) && + isIdenticalMtu(target); } /** @@ -607,7 +632,8 @@ public class LinkProperties implements Parcelable { + ((null == mDomains) ? 0 : mDomains.hashCode()) + mRoutes.size() * 41 + ((null == mHttpProxy) ? 0 : mHttpProxy.hashCode()) - + mStackedLinks.hashCode() * 47); + + mStackedLinks.hashCode() * 47) + + mMtu * 51; } /** @@ -625,7 +651,7 @@ public class LinkProperties implements Parcelable { dest.writeByteArray(d.getAddress()); } dest.writeString(mDomains); - + dest.writeInt(mMtu); dest.writeInt(mRoutes.size()); for(RouteInfo route : mRoutes) { dest.writeParcelable(route, flags); @@ -664,6 +690,7 @@ public class LinkProperties implements Parcelable { } catch (UnknownHostException e) { } } netProp.setDomains(in.readString()); + netProp.setMtu(in.readInt()); addressCount = in.readInt(); for (int i=0; i<addressCount; i++) { netProp.addRoute((RouteInfo)in.readParcelable(null)); diff --git a/core/java/android/net/MobileDataStateTracker.java b/core/java/android/net/MobileDataStateTracker.java index fe596ae2414a..b914940ddd40 100644 --- a/core/java/android/net/MobileDataStateTracker.java +++ b/core/java/android/net/MobileDataStateTracker.java @@ -198,6 +198,8 @@ public class MobileDataStateTracker extends BaseNetworkStateTracker { loge("CONNECTED event did not supply link properties."); mLinkProperties = new LinkProperties(); } + mLinkProperties.setMtu(mContext.getResources().getInteger( + com.android.internal.R.integer.config_mobile_mtu)); mLinkCapabilities = intent.getParcelableExtra( PhoneConstants.DATA_LINK_CAPABILITIES_KEY); if (mLinkCapabilities == null) { diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index 60ce1327913b..8f68fc1a3cbc 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -158,7 +158,7 @@ public final class Debug public int otherSharedClean; /** @hide */ - public static final int NUM_OTHER_STATS = 13; + public static final int NUM_OTHER_STATS = 14; /** @hide */ public static final int NUM_DVK_STATS = 5; @@ -285,11 +285,12 @@ public final class Debug case 10: return "code mmap"; case 11: return "image mmap"; case 12: return "Other mmap"; - case 13: return ".Heap"; - case 14: return ".LOS"; - case 15: return ".LinearAlloc"; - case 16: return ".GC"; - case 17: return ".JITCache"; + case 13: return "GPU"; + case 14: return ".Heap"; + case 15: return ".LOS"; + case 16: return ".LinearAlloc"; + case 17: return ".GC"; + case 18: return ".JITCache"; default: return "????"; } } diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index ed9620fbd9b1..61e5a4ba5a54 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl @@ -118,6 +118,11 @@ interface INetworkManagementService void removeSecondaryRoute(String iface, in RouteInfo route); /** + * Set the specified MTU size + */ + void setMtu(String iface, int mtu); + + /** * Shuts down the service */ void shutdown(); diff --git a/core/java/android/os/MessageQueue.java b/core/java/android/os/MessageQueue.java index 1e8983ee3fe8..d1b8213d95fc 100644 --- a/core/java/android/os/MessageQueue.java +++ b/core/java/android/os/MessageQueue.java @@ -39,7 +39,7 @@ public final class MessageQueue { Message mMessages; private final ArrayList<IdleHandler> mIdleHandlers = new ArrayList<IdleHandler>(); private IdleHandler[] mPendingIdleHandlers; - private boolean mQuiting; + private boolean mQuitting; // Indicates whether next() is blocked waiting in pollOnce() with a non-zero timeout. private boolean mBlocked; @@ -115,6 +115,8 @@ public final class MessageQueue { } } + // Disposes of the underlying message queue. + // Must only be called on the looper thread or the finalizer. private void dispose() { if (mPtr != 0) { nativeDestroy(mPtr); @@ -125,11 +127,13 @@ public final class MessageQueue { Message next() { int pendingIdleHandlerCount = -1; // -1 only during first iteration int nextPollTimeoutMillis = 0; - for (;;) { if (nextPollTimeoutMillis != 0) { Binder.flushPendingCommands(); } + + // We can assume mPtr != 0 because the loop is obviously still running. + // The looper will not call this method after the loop quits. nativePollOnce(mPtr, nextPollTimeoutMillis); synchronized (this) { @@ -167,7 +171,7 @@ public final class MessageQueue { } // Process the quit message now that all pending messages have been handled. - if (mQuiting) { + if (mQuitting) { dispose(); return null; } @@ -226,18 +230,20 @@ public final class MessageQueue { } synchronized (this) { - if (mQuiting) { + if (mQuitting) { return; } - mQuiting = true; + mQuitting = true; if (safe) { removeAllFutureMessagesLocked(); } else { removeAllMessagesLocked(); } + + // We can assume mPtr != 0 because mQuitting was previously false. + nativeWake(mPtr); } - nativeWake(mPtr); } int enqueueSyncBarrier(long when) { @@ -270,7 +276,6 @@ public final class MessageQueue { void removeSyncBarrier(int token) { // Remove a sync barrier token from the queue. // If the queue is no longer stalled by a barrier then wake it. - final boolean needWake; synchronized (this) { Message prev = null; Message p = mMessages; @@ -282,6 +287,7 @@ public final class MessageQueue { throw new IllegalStateException("The specified message queue synchronization " + " barrier token has not been posted or has already been removed."); } + final boolean needWake; if (prev != null) { prev.next = p.next; needWake = false; @@ -290,9 +296,12 @@ public final class MessageQueue { needWake = mMessages == null || mMessages.target != null; } p.recycle(); - } - if (needWake) { - nativeWake(mPtr); + + // If the loop is quitting then it is already awake. + // We can assume mPtr != 0 when mQuitting is false. + if (needWake && !mQuitting) { + nativeWake(mPtr); + } } } @@ -304,9 +313,8 @@ public final class MessageQueue { throw new AndroidRuntimeException("Message must have a target."); } - boolean needWake; synchronized (this) { - if (mQuiting) { + if (mQuitting) { RuntimeException e = new RuntimeException( msg.target + " sending message to a Handler on a dead thread"); Log.w("MessageQueue", e.getMessage(), e); @@ -315,6 +323,7 @@ public final class MessageQueue { msg.when = when; Message p = mMessages; + boolean needWake; if (p == null || when == 0 || when < p.when) { // New head, wake up the event queue if blocked. msg.next = p; @@ -339,9 +348,11 @@ public final class MessageQueue { msg.next = p; // invariant: p == prev.next prev.next = msg; } - } - if (needWake) { - nativeWake(mPtr); + + // We can assume mPtr != 0 because mQuitting is false. + if (needWake) { + nativeWake(mPtr); + } } return true; } @@ -381,7 +392,11 @@ public final class MessageQueue { } boolean isIdling() { - return nativeIsIdling(mPtr); + synchronized (this) { + // If the loop is quitting then it must not be idling. + // We can assume mPtr != 0 when mQuitting is false. + return !mQuitting && nativeIsIdling(mPtr); + } } void removeMessages(Handler h, int what, Object object) { diff --git a/core/java/android/preference/PreferenceActivity.java b/core/java/android/preference/PreferenceActivity.java index 5d886a3374af..a99705bd12ae 100644 --- a/core/java/android/preference/PreferenceActivity.java +++ b/core/java/android/preference/PreferenceActivity.java @@ -894,14 +894,11 @@ public abstract class PreferenceActivity extends ListActivity implements */ protected boolean isValidFragment(String fragmentName) { if (getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.KITKAT) { - Log.w(TAG, "Subclasses of PreferenceActivity must override isValidFragment(String)" + throw new RuntimeException( + "Subclasses of PreferenceActivity must override isValidFragment(String)" + " to verify that the Fragment class is valid! " + this.getClass().getName() + " has not checked if fragment " + fragmentName + " is valid."); - // Return true for now, but will eventually return false when all bundled apps - // have been modified. TODO: change to return false - return true; } else { - Log.i(TAG, "PreferenceActivity built on pre-KLP launching fragment: " + fragmentName); return true; } } diff --git a/core/java/android/print/IPrinterDiscoveryObserver.aidl b/core/java/android/print/IPrinterDiscoveryObserver.aidl index 71198f7f4926..b558011cf699 100644 --- a/core/java/android/print/IPrinterDiscoveryObserver.aidl +++ b/core/java/android/print/IPrinterDiscoveryObserver.aidl @@ -16,7 +16,6 @@ package android.print; -import android.print.IPrintClient; import android.print.PrinterId; import android.print.PrinterInfo; diff --git a/core/java/android/printservice/PrintService.java b/core/java/android/printservice/PrintService.java index 96552af92e64..0ffc40ab60d5 100644 --- a/core/java/android/printservice/PrintService.java +++ b/core/java/android/printservice/PrintService.java @@ -20,6 +20,7 @@ import android.app.Service; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.os.Build; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -155,6 +156,8 @@ public abstract class PrintService extends Service { private static final String LOG_TAG = "PrintService"; + private static final boolean DEBUG = false; + /** * The {@link Intent} action that must be declared as handled by a service * in its manifest for the system to recognize it as a print service. @@ -433,6 +436,9 @@ public abstract class PrintService extends Service { case MSG_ON_PRINTJOB_QUEUED: { PrintJobInfo printJobInfo = (PrintJobInfo) message.obj; + if (DEBUG) { + Log.i(LOG_TAG, "Queued: " + printJobInfo); + } onPrintJobQueued(new PrintJob(printJobInfo, mClient)); } break; diff --git a/core/java/android/printservice/PrintServiceInfo.java b/core/java/android/printservice/PrintServiceInfo.java index 128628d53072..8e9636c2b733 100644 --- a/core/java/android/printservice/PrintServiceInfo.java +++ b/core/java/android/printservice/PrintServiceInfo.java @@ -239,10 +239,10 @@ public final class PrintServiceInfo implements Parcelable { public String toString() { StringBuilder builder = new StringBuilder(); builder.append("PrintServiceInfo{"); - builder.append("id:").append(mId).append(", "); - builder.append("resolveInfo:").append(mResolveInfo).append(", "); - builder.append("settingsActivityName:").append(mSettingsActivityName); - builder.append("addPrintersActivityName:").append(mAddPrintersActivityName); + builder.append("id=").append(mId); + builder.append(", resolveInfo=").append(mResolveInfo); + builder.append(", settingsActivityName=").append(mSettingsActivityName); + builder.append(", addPrintersActivityName=").append(mAddPrintersActivityName); builder.append("}"); return builder.toString(); } diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java index 5333a250ccdd..eaa4f78a1005 100644 --- a/core/java/android/provider/DocumentsContract.java +++ b/core/java/android/provider/DocumentsContract.java @@ -251,6 +251,15 @@ public final class DocumentsContract { * @see #COLUMN_FLAGS */ public static final int FLAG_DIR_PREFERS_GRID = 1 << 5; + + /** + * Flag indicating that a directory prefers its contents be sorted by + * {@link #COLUMN_LAST_MODIFIED}. Only valid when + * {@link #COLUMN_MIME_TYPE} is {@link #MIME_TYPE_DIR}. + * + * @see #COLUMN_FLAGS + */ + public static final int FLAG_DIR_PREFERS_LAST_MODIFIED = 1 << 6; } /** @@ -292,9 +301,6 @@ public final class DocumentsContract { * @see #FLAG_LOCAL_ONLY * @see #FLAG_SUPPORTS_CREATE * @see #FLAG_ADVANCED - * @see #FLAG_PROVIDES_AUDIO - * @see #FLAG_PROVIDES_IMAGES - * @see #FLAG_PROVIDES_VIDEO */ public static final String COLUMN_FLAGS = "flags"; diff --git a/core/java/android/speech/hotword/HotwordRecognitionListener.java b/core/java/android/speech/hotword/HotwordRecognitionListener.java index 8e62373d65ca..8a32654c5bac 100644 --- a/core/java/android/speech/hotword/HotwordRecognitionListener.java +++ b/core/java/android/speech/hotword/HotwordRecognitionListener.java @@ -16,7 +16,6 @@ package android.speech.hotword; -import android.app.PendingIntent; import android.content.Intent; import android.os.Bundle; @@ -47,9 +46,10 @@ public interface HotwordRecognitionListener { /** * Called back when hotword is detected. - * The action tells the client what action to take, post hotword-detection. + * + * @param intent for the activity to launch, post hotword detection. */ - void onHotwordRecognized(PendingIntent intent); + void onHotwordRecognized(Intent intent); /** * Called when the HotwordRecognitionService encounters an error. diff --git a/core/java/android/speech/hotword/HotwordRecognitionService.java b/core/java/android/speech/hotword/HotwordRecognitionService.java index 521d06d8abb4..7a26e0ce87ee 100644 --- a/core/java/android/speech/hotword/HotwordRecognitionService.java +++ b/core/java/android/speech/hotword/HotwordRecognitionService.java @@ -21,6 +21,7 @@ import android.annotation.SdkConstant.SdkConstantType; import android.app.PendingIntent; import android.app.Service; import android.content.Intent; +import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -31,7 +32,6 @@ import android.util.Log; /** * This class provides a base class for hotword detection service implementations. * This class should be extended only if you wish to implement a new hotword recognizer. - * {@hide} */ public abstract class HotwordRecognitionService extends Service { /** @@ -45,8 +45,7 @@ public abstract class HotwordRecognitionService extends Service { private static final String TAG = "HotwordRecognitionService"; /** Debugging flag */ - // TODO: Turn off. - private static final boolean DBG = true; + private static final boolean DBG = false; private static final int MSG_START_RECOGNITION = 1; private static final int MSG_STOP_RECOGNITION = 2; @@ -160,7 +159,7 @@ public abstract class HotwordRecognitionService extends Service { public void startHotwordRecognition(IHotwordRecognitionListener listener) { if (DBG) Log.d(TAG, "startRecognition called by: " + listener.asBinder()); - if (mInternalService != null) { + if (mInternalService != null && mInternalService.checkPermissions(listener)) { mInternalService.mHandler.sendMessage( Message.obtain(mInternalService.mHandler, MSG_START_RECOGNITION, listener)); } @@ -168,7 +167,7 @@ public abstract class HotwordRecognitionService extends Service { public void stopHotwordRecognition(IHotwordRecognitionListener listener) { if (DBG) Log.d(TAG, "stopRecognition called by: " + listener.asBinder()); - if (mInternalService != null) { + if (mInternalService != null && mInternalService.checkPermissions(listener)) { mInternalService.mHandler.sendMessage( Message.obtain(mInternalService.mHandler, MSG_STOP_RECOGNITION, listener)); } @@ -180,6 +179,27 @@ public abstract class HotwordRecognitionService extends Service { } /** + * Checks whether the caller has sufficient permissions + * + * @param listener to send the error message to in case of error. + * @return {@code true} if the caller has enough permissions, {@code false} otherwise. + */ + private boolean checkPermissions(IHotwordRecognitionListener listener) { + if (DBG) Log.d(TAG, "checkPermissions"); + if (checkCallingOrSelfPermission(android.Manifest.permission.HOTWORD_RECOGNITION) == + PackageManager.PERMISSION_GRANTED) { + return true; + } + try { + Log.e(TAG, "Recognition service called without HOTWORD_RECOGNITION permissions"); + listener.onHotwordError(HotwordRecognizer.ERROR_FAILED); + } catch (RemoteException e) { + Log.e(TAG, "onHotwordError(ERROR_FAILED) message failed", e); + } + return false; + } + + /** * This class acts passes on the callbacks received from the Hotword service * to the listener. */ @@ -207,7 +227,7 @@ public abstract class HotwordRecognitionService extends Service { /** * Called on an event of interest to the client. * - * @param eventType the event type. Event types are defined in {@link HotwordRecognizer}. + * @param eventType the event type. * @param eventBundle a Bundle containing the hotword event(s). */ public void onHotwordEvent(int eventType, Bundle eventBundle) throws RemoteException { @@ -216,17 +236,17 @@ public abstract class HotwordRecognitionService extends Service { /** * Called back when hotword is detected. - * The action tells the client what action to take, post hotword-detection. + * + * @param activityIntent for the activity to launch, post hotword detection. */ - public void onHotwordRecognized(PendingIntent intent) throws RemoteException { - mListener.onHotwordRecognized(intent); + public void onHotwordRecognized(Intent activityIntent) throws RemoteException { + mListener.onHotwordRecognized(activityIntent); } /** * Called when the HotwordRecognitionService encounters an error. * * @param errorCode the error code describing the error that was encountered. - * Error codes are defined in {@link HotwordRecognizer}. */ public void onError(int errorCode) throws RemoteException { mListener.onHotwordError(errorCode); diff --git a/core/java/android/speech/hotword/HotwordRecognizer.java b/core/java/android/speech/hotword/HotwordRecognizer.java index 82cec1017833..939c11d7792f 100644 --- a/core/java/android/speech/hotword/HotwordRecognizer.java +++ b/core/java/android/speech/hotword/HotwordRecognizer.java @@ -45,8 +45,7 @@ import java.util.Queue; */ public class HotwordRecognizer { /** DEBUG value to enable verbose debug prints */ - // TODO: Turn off. - private final static boolean DBG = true; + private final static boolean DBG = false; /** Log messages identifier */ private static final String TAG = "HotwordRecognizer"; @@ -81,6 +80,9 @@ public class HotwordRecognizer { /** The service received concurrent start calls */ public static final int ERROR_SERVICE_ALREADY_STARTED = 6; + /** Hotword recognition is unavailable on the device */ + public static final int ERROR_UNAVAILABLE = 7; + /** action codes */ private static final int MSG_START = 1; private static final int MSG_STOP = 2; @@ -354,7 +356,7 @@ public class HotwordRecognizer { mInternalListener.onHotwordEvent(msg.arg1, (Bundle) msg.obj); break; case MSG_ON_RECOGNIZED: - mInternalListener.onHotwordRecognized((PendingIntent) msg.obj); + mInternalListener.onHotwordRecognized((Intent) msg.obj); break; case MSG_ON_ERROR: mInternalListener.onHotwordError((Integer) msg.obj); @@ -380,8 +382,8 @@ public class HotwordRecognizer { } @Override - public void onHotwordRecognized(PendingIntent intent) throws RemoteException { - Message.obtain(mInternalHandler, MSG_ON_RECOGNIZED, intent) + public void onHotwordRecognized(Intent activityIntent) throws RemoteException { + Message.obtain(mInternalHandler, MSG_ON_RECOGNIZED, activityIntent) .sendToTarget(); } diff --git a/core/java/android/speech/hotword/IHotwordRecognitionListener.aidl b/core/java/android/speech/hotword/IHotwordRecognitionListener.aidl index 49c523328296..4ea2e8e0ecfa 100644 --- a/core/java/android/speech/hotword/IHotwordRecognitionListener.aidl +++ b/core/java/android/speech/hotword/IHotwordRecognitionListener.aidl @@ -16,7 +16,7 @@ package android.speech.hotword; -import android.app.PendingIntent; +import android.content.Intent; import android.os.Bundle; /** @@ -47,9 +47,10 @@ oneway interface IHotwordRecognitionListener { /** * Called back when hotword is detected. - * The action tells the client what action to take, post hotword-detection. + * + * @param intent for the activity to launch, post hotword detection. */ - void onHotwordRecognized(in PendingIntent intent); + void onHotwordRecognized(in Intent intent); /** * Called when the HotwordRecognitionService encounters an error. diff --git a/core/java/android/transition/TextChange.java b/core/java/android/transition/TextChange.java index 1b26942fe152..4f14d462675d 100644 --- a/core/java/android/transition/TextChange.java +++ b/core/java/android/transition/TextChange.java @@ -143,8 +143,8 @@ public class TextChange extends Transition { final TextView view = (TextView) endValues.view; Map<String, Object> startVals = startValues.values; Map<String, Object> endVals = endValues.values; - final String startText = (String) startVals.get(PROPNAME_TEXT); - final String endText = (String) endVals.get(PROPNAME_TEXT); + final CharSequence startText = (CharSequence) startVals.get(PROPNAME_TEXT); + final CharSequence endText = (CharSequence) endVals.get(PROPNAME_TEXT); if (!startText.equals(endText)) { view.setText(startText); Animator anim; diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 8616aba39f71..650d6989bb49 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -9546,9 +9546,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ public void setPivotX(float pivotX) { ensureTransformationInfo(); - mPrivateFlags |= PFLAG_PIVOT_EXPLICITLY_SET; final TransformationInfo info = mTransformationInfo; - if (info.mPivotX != pivotX) { + boolean pivotSet = (mPrivateFlags & PFLAG_PIVOT_EXPLICITLY_SET) == + PFLAG_PIVOT_EXPLICITLY_SET; + if (info.mPivotX != pivotX || !pivotSet) { + mPrivateFlags |= PFLAG_PIVOT_EXPLICITLY_SET; invalidateViewProperty(true, false); info.mPivotX = pivotX; info.mMatrixDirty = true; @@ -9596,9 +9598,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ public void setPivotY(float pivotY) { ensureTransformationInfo(); - mPrivateFlags |= PFLAG_PIVOT_EXPLICITLY_SET; final TransformationInfo info = mTransformationInfo; - if (info.mPivotY != pivotY) { + boolean pivotSet = (mPrivateFlags & PFLAG_PIVOT_EXPLICITLY_SET) == + PFLAG_PIVOT_EXPLICITLY_SET; + if (info.mPivotY != pivotY || !pivotSet) { + mPrivateFlags |= PFLAG_PIVOT_EXPLICITLY_SET; invalidateViewProperty(true, false); info.mPivotY = pivotY; info.mMatrixDirty = true; diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 0f9a2ac98a38..c7d61eb0f683 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -81,6 +81,7 @@ import java.io.OutputStream; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashSet; +import java.util.Locale; /** * The top of a view hierarchy, implementing the needed protocol between View @@ -228,7 +229,8 @@ public final class ViewRootImpl implements ViewParent, InputStage mFirstInputStage; InputStage mFirstPostImeInputStage; - SyntheticInputStage mSyntheticInputStage; + + boolean mFlipControllerFallbackKeys; boolean mWindowAttributesChanged = false; int mWindowAttributesChangesFlag = 0; @@ -366,6 +368,8 @@ public final class ViewRootImpl implements ViewParent, mNoncompatDensity = context.getResources().getDisplayMetrics().noncompatDensityDpi; mFallbackEventHandler = PolicyManager.makeNewFallbackEventHandler(context); mChoreographer = Choreographer.getInstance(); + mFlipControllerFallbackKeys = + context.getResources().getBoolean(R.bool.flip_controller_fallback_keys); PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); mAttachInfo.mScreenOn = powerManager.isScreenOn(); @@ -590,8 +594,8 @@ public final class ViewRootImpl implements ViewParent, // Set up the input pipeline. CharSequence counterSuffix = attrs.getTitle(); - mSyntheticInputStage = new SyntheticInputStage(); - InputStage viewPostImeStage = new ViewPostImeInputStage(mSyntheticInputStage); + InputStage syntheticInputStage = new SyntheticInputStage(); + InputStage viewPostImeStage = new ViewPostImeInputStage(syntheticInputStage); InputStage nativePostImeStage = new NativePostImeInputStage(viewPostImeStage, "aq:native-post-ime:" + counterSuffix); InputStage earlyPostImeStage = new EarlyPostImeInputStage(nativePostImeStage); @@ -2873,8 +2877,11 @@ public final class ViewRootImpl implements ViewParent, mView.dispatchConfigurationChanged(config); } } + + mFlipControllerFallbackKeys = + mContext.getResources().getBoolean(R.bool.flip_controller_fallback_keys); } - + /** * Return true if child is an ancestor of parent, (or equal to the parent). */ @@ -3774,9 +3781,6 @@ public final class ViewRootImpl implements ViewParent, private int processKeyEvent(QueuedInputEvent q) { final KeyEvent event = (KeyEvent)q.mEvent; - // The synthetic stage occasionally needs to know about keys in order to debounce taps - mSyntheticInputStage.notifyKeyEvent(event); - // Deliver the key to the view hierarchy. if (mView.dispatchKeyEvent(event)) { return FINISH_HANDLED; @@ -3904,6 +3908,7 @@ public final class ViewRootImpl implements ViewParent, private final SyntheticJoystickHandler mJoystick = new SyntheticJoystickHandler(); private final SyntheticTouchNavigationHandler mTouchNavigation = new SyntheticTouchNavigationHandler(); + private final SyntheticKeyHandler mKeys = new SyntheticKeyHandler(); public SyntheticInputStage() { super(null); @@ -3926,7 +3931,12 @@ public final class ViewRootImpl implements ViewParent, mTouchNavigation.process(event); return FINISH_HANDLED; } + } else if (q.mEvent instanceof KeyEvent) { + if (mKeys.process((KeyEvent) q.mEvent)) { + return FINISH_HANDLED; + } } + return FORWARD; } @@ -3949,10 +3959,6 @@ public final class ViewRootImpl implements ViewParent, } super.onDeliverToNext(q); } - - public void notifyKeyEvent(KeyEvent e) { - mTouchNavigation.notifyKeyEvent(e); - } } /** @@ -4380,15 +4386,6 @@ public final class ViewRootImpl implements ViewParent, /* TODO: These constants should eventually be moved to ViewConfiguration. */ - // Tap timeout in milliseconds. - private static final int TAP_TIMEOUT = 250; - - // Debounce timeout for touch nav devices with a button under their pad, in milliseconds - private static final int DEBOUNCE_TIME = 250; - - // The maximum distance traveled for a gesture to be considered a tap in millimeters. - private static final int TAP_SLOP_MILLIMETERS = 5; - // The nominal distance traveled to move by one unit. private static final int TICK_DISTANCE_MILLIMETERS = 12; @@ -4416,13 +4413,6 @@ public final class ViewRootImpl implements ViewParent, /* Configuration for the current input device. */ - // The tap timeout and scaled slop. - private int mConfigTapTimeout; - private float mConfigTapSlop; - - // Amount of time to wait between button presses and tap generation for debouncing - private int mConfigDebounceTime; - // The scaled tick distance. A movement of this amount should generally translate // into a single dpad event in a given direction. private float mConfigTickDistance; @@ -4471,8 +4461,6 @@ public final class ViewRootImpl implements ViewParent, // The last time a confirm key was pressed on the touch nav device private long mLastConfirmKeyTime = Long.MAX_VALUE; - private boolean mHasButtonUnderPad; - public SyntheticTouchNavigationHandler() { super(true); } @@ -4509,21 +4497,15 @@ public final class ViewRootImpl implements ViewParent, float nominalRes = (xRes + yRes) * 0.5f; // Precompute all of the configuration thresholds we will need. - mConfigTapTimeout = TAP_TIMEOUT; - mConfigTapSlop = TAP_SLOP_MILLIMETERS * nominalRes; mConfigTickDistance = TICK_DISTANCE_MILLIMETERS * nominalRes; mConfigMinFlingVelocity = MIN_FLING_VELOCITY_TICKS_PER_SECOND * mConfigTickDistance; mConfigMaxFlingVelocity = MAX_FLING_VELOCITY_TICKS_PER_SECOND * mConfigTickDistance; - mConfigDebounceTime = DEBOUNCE_TIME; - mHasButtonUnderPad = device.hasButtonUnderPad(); if (LOCAL_DEBUG) { Log.d(LOCAL_TAG, "Configured device " + mCurrentDeviceId + " (" + Integer.toHexString(mCurrentSource) + "): " - + "mConfigTapTimeout=" + mConfigTapTimeout - + ", mConfigTapSlop=" + mConfigTapSlop + ", mConfigTickDistance=" + mConfigTickDistance + ", mConfigMinFlingVelocity=" + mConfigMinFlingVelocity + ", mConfigMaxFlingVelocity=" + mConfigMaxFlingVelocity); @@ -4585,18 +4567,7 @@ public final class ViewRootImpl implements ViewParent, // Detect taps and flings. if (action == MotionEvent.ACTION_UP) { - if (!mConsumedMovement - && Math.hypot(mLastX - mStartX, mLastY - mStartY) < mConfigTapSlop - && time <= mStartTime + mConfigTapTimeout) { - if (!mHasButtonUnderPad || - time >= mLastConfirmKeyTime + mConfigDebounceTime) { - // It's a tap! - finishKeys(time); - sendKeyDownOrRepeat(time, KeyEvent.KEYCODE_DPAD_CENTER, metaState); - sendKeyUp(time); - } - } else if (mConsumedMovement - && mPendingKeyCode != KeyEvent.KEYCODE_UNKNOWN) { + if (mConsumedMovement && mPendingKeyCode != KeyEvent.KEYCODE_UNKNOWN) { // It might be a fling. mVelocityTracker.computeCurrentVelocity(1000, mConfigMaxFlingVelocity); final float vx = mVelocityTracker.getXVelocity(mActivePointerId); @@ -4627,13 +4598,6 @@ public final class ViewRootImpl implements ViewParent, } } - public void notifyKeyEvent(KeyEvent e) { - final int keyCode = e.getKeyCode(); - if (KeyEvent.isConfirmKey(e.getKeyCode())) { - mLastConfirmKeyTime = e.getDownTime(); - } - } - private void finishKeys(long time) { cancelFling(); sendKeyUp(time); @@ -4802,6 +4766,63 @@ public final class ViewRootImpl implements ViewParent, }; } + final class SyntheticKeyHandler { + + public boolean process(KeyEvent event) { + // In some locales (like Japan) controllers use B for confirm and A for back, rather + // than vice versa, so we need to special case this here since the input system itself + // is not locale-aware. + int keyCode; + switch(event.getKeyCode()) { + case KeyEvent.KEYCODE_BUTTON_A: + case KeyEvent.KEYCODE_BUTTON_C: + case KeyEvent.KEYCODE_BUTTON_X: + case KeyEvent.KEYCODE_BUTTON_Z: + keyCode = mFlipControllerFallbackKeys ? + KeyEvent.KEYCODE_BACK : KeyEvent.KEYCODE_DPAD_CENTER; + break; + case KeyEvent.KEYCODE_BUTTON_B: + case KeyEvent.KEYCODE_BUTTON_Y: + keyCode = mFlipControllerFallbackKeys ? + KeyEvent.KEYCODE_DPAD_CENTER : KeyEvent.KEYCODE_BACK; + break; + case KeyEvent.KEYCODE_BUTTON_THUMBL: + case KeyEvent.KEYCODE_BUTTON_THUMBR: + case KeyEvent.KEYCODE_BUTTON_START: + case KeyEvent.KEYCODE_BUTTON_1: + case KeyEvent.KEYCODE_BUTTON_2: + case KeyEvent.KEYCODE_BUTTON_3: + case KeyEvent.KEYCODE_BUTTON_4: + case KeyEvent.KEYCODE_BUTTON_5: + case KeyEvent.KEYCODE_BUTTON_6: + case KeyEvent.KEYCODE_BUTTON_7: + case KeyEvent.KEYCODE_BUTTON_8: + case KeyEvent.KEYCODE_BUTTON_9: + case KeyEvent.KEYCODE_BUTTON_10: + case KeyEvent.KEYCODE_BUTTON_11: + case KeyEvent.KEYCODE_BUTTON_12: + case KeyEvent.KEYCODE_BUTTON_13: + case KeyEvent.KEYCODE_BUTTON_14: + case KeyEvent.KEYCODE_BUTTON_15: + case KeyEvent.KEYCODE_BUTTON_16: + keyCode = KeyEvent.KEYCODE_DPAD_CENTER; + break; + case KeyEvent.KEYCODE_BUTTON_SELECT: + case KeyEvent.KEYCODE_BUTTON_MODE: + keyCode = KeyEvent.KEYCODE_MENU; + default: + return false; + } + + enqueueInputEvent(new KeyEvent(event.getDownTime(), event.getEventTime(), + event.getAction(), keyCode, event.getRepeatCount(), event.getMetaState(), + event.getScanCode(), event.getFlags() | KeyEvent.FLAG_FALLBACK, + event.getSource())); + return true; + } + + } + /** * Returns true if the key is used for keyboard navigation. * @param keyEvent The key event. diff --git a/core/java/android/view/accessibility/CaptioningManager.java b/core/java/android/view/accessibility/CaptioningManager.java index d4c6abe69abf..557239f6096d 100644 --- a/core/java/android/view/accessibility/CaptioningManager.java +++ b/core/java/android/view/accessibility/CaptioningManager.java @@ -140,7 +140,7 @@ public class CaptioningManager { * * @param listener the listener to add */ - public void addCaptioningStateChangeListener(CaptioningChangeListener listener) { + public void addCaptioningChangeListener(CaptioningChangeListener listener) { synchronized (mListeners) { if (mListeners.isEmpty()) { registerObserver(Secure.ACCESSIBILITY_CAPTIONING_ENABLED); @@ -163,11 +163,11 @@ public class CaptioningManager { /** * Removes a listener previously added using - * {@link #addCaptioningStateChangeListener}. + * {@link #addCaptioningChangeListener}. * * @param listener the listener to remove */ - public void removeCaptioningStateChangeListener(CaptioningChangeListener listener) { + public void removeCaptioningChangeListener(CaptioningChangeListener listener) { synchronized (mListeners) { mListeners.remove(listener); @@ -366,7 +366,7 @@ public class CaptioningManager { * Listener for changes in captioning properties, including enabled state * and user style preferences. */ - public abstract class CaptioningChangeListener { + public static abstract class CaptioningChangeListener { /** * Called when the captioning enabled state changes. * diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 29b7cf2095db..7378d7479873 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -1250,7 +1250,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te mFastScroller.setEnabled(true); } - recomputePadding(); + resolvePadding(); if (mFastScroller != null) { mFastScroller.updateLayout(); @@ -1312,7 +1312,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te * @see #setFastScrollAlwaysVisible(boolean) */ public boolean isFastScrollAlwaysVisible() { - return mFastScrollEnabled && mFastScrollAlwaysVisible; + if (mFastScroller == null) { + return mFastScrollEnabled && mFastScrollAlwaysVisible; + } else { + return mFastScroller.isEnabled() && mFastScroller.isAlwaysShowEnabled(); + } } @Override @@ -1331,7 +1335,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te */ @ViewDebug.ExportedProperty public boolean isFastScrollEnabled() { - return mFastScrollEnabled; + if (mFastScroller == null) { + return mFastScrollEnabled; + } else { + return mFastScroller.isEnabled(); + } } @Override @@ -1356,7 +1364,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te */ @Override protected boolean isVerticalScrollBarHidden() { - return mFastScrollEnabled; + return isFastScrollEnabled(); } /** diff --git a/core/java/android/widget/FastScroller.java b/core/java/android/widget/FastScroller.java index c48955f625b0..006b96e7834d 100644 --- a/core/java/android/widget/FastScroller.java +++ b/core/java/android/widget/FastScroller.java @@ -152,9 +152,6 @@ class FastScroller { /** The number of headers at the top of the view. */ private int mHeaderCount; - /** The number of items in the list. */ - private int mItemCount = -1; - /** The index of the current section. */ private int mCurrentSection = -1; @@ -324,6 +321,7 @@ class FastScroller { getSectionsFromIndexer(); refreshDrawablePressedState(); + updateLongList(listView.getChildCount(), listView.getCount()); setScrollbarPosition(mList.getVerticalScrollbarPosition()); postAutoHide(); } @@ -343,14 +341,10 @@ class FastScroller { * @param enabled Whether the fast scroll thumb is enabled. */ public void setEnabled(boolean enabled) { - mEnabled = enabled; + if (mEnabled != enabled) { + mEnabled = enabled; - if (enabled) { - if (mAlwaysShow) { - setState(STATE_VISIBLE); - } - } else { - stop(); + onStateDependencyChanged(); } } @@ -358,19 +352,17 @@ class FastScroller { * @return Whether the fast scroll thumb is enabled. */ public boolean isEnabled() { - return mEnabled; + return mEnabled && (mLongList || mAlwaysShow); } /** * @param alwaysShow Whether the fast scroll thumb should always be shown */ public void setAlwaysShow(boolean alwaysShow) { - mAlwaysShow = alwaysShow; + if (mAlwaysShow != alwaysShow) { + mAlwaysShow = alwaysShow; - if (alwaysShow) { - setState(STATE_VISIBLE); - } else if (mState == STATE_VISIBLE) { - postAutoHide(); + onStateDependencyChanged(); } } @@ -382,6 +374,23 @@ class FastScroller { return mAlwaysShow; } + /** + * Called when one of the variables affecting enabled state changes. + */ + private void onStateDependencyChanged() { + if (isEnabled()) { + if (isAlwaysShowEnabled()) { + setState(STATE_VISIBLE); + } else if (mState == STATE_VISIBLE) { + postAutoHide(); + } + } else { + stop(); + } + + mList.resolvePadding(); + } + public void setScrollBarStyle(int style) { if (mScrollBarStyle != style) { mScrollBarStyle = style; @@ -439,6 +448,18 @@ class FastScroller { final int firstVisibleItem = mList.getFirstVisiblePosition(); setThumbPos(getPosFromItemCount(firstVisibleItem, visibleItemCount, totalItemCount)); } + + updateLongList(visibleItemCount, totalItemCount); + } + + private void updateLongList(int visibleItemCount, int totalItemCount) { + final boolean longList = visibleItemCount > 0 + && totalItemCount / visibleItemCount >= MIN_PAGES; + if (mLongList != longList) { + mLongList = longList; + + onStateDependencyChanged(); + } } /** @@ -795,19 +816,8 @@ class FastScroller { mList.postDelayed(mDeferHide, FADE_TIMEOUT); } - private boolean isLongList(int visibleItemCount, int totalItemCount) { - // Are there enough pages to require fast scroll? Recompute only if - // total count changes. - if (mItemCount != totalItemCount && visibleItemCount > 0) { - mItemCount = totalItemCount; - mLongList = mItemCount / visibleItemCount >= MIN_PAGES; - } - - return mLongList; - } - public void onScroll(int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if (!mEnabled || !mAlwaysShow && !isLongList(visibleItemCount, totalItemCount)) { + if (!isEnabled()) { setState(STATE_NONE); return; } @@ -1221,7 +1231,7 @@ class FastScroller { } public boolean onInterceptTouchEvent(MotionEvent ev) { - if (!mEnabled) { + if (!isEnabled()) { return false; } @@ -1233,14 +1243,18 @@ class FastScroller { // need to allow the parent time to decide whether it wants // to intercept events. If it does, we will receive a CANCEL // event. - if (mList.isInScrollingContainer()) { - mInitialTouchY = ev.getY(); - startPendingDrag(); - return false; + if (!mList.isInScrollingContainer()) { + beginDrag(); + return true; } - beginDrag(); - return true; + mInitialTouchY = ev.getY(); + startPendingDrag(); + } + break; + case MotionEvent.ACTION_MOVE: + if (!isPointInside(ev.getX(), ev.getY())) { + cancelPendingDrag(); } break; case MotionEvent.ACTION_UP: @@ -1253,7 +1267,7 @@ class FastScroller { } public boolean onInterceptHoverEvent(MotionEvent ev) { - if (!mEnabled) { + if (!isEnabled()) { return false; } @@ -1269,18 +1283,11 @@ class FastScroller { } public boolean onTouchEvent(MotionEvent me) { - if (!mEnabled) { + if (!isEnabled()) { return false; } switch (me.getActionMasked()) { - case MotionEvent.ACTION_DOWN: { - if (isPointInside(me.getX(), me.getY())) { - beginDrag(); - return true; - } - } break; - case MotionEvent.ACTION_UP: { if (mHasPendingDrag) { // Allow a tap to scroll. diff --git a/core/java/android/widget/VideoView.java b/core/java/android/widget/VideoView.java index f449797d8053..009b729ffc75 100644 --- a/core/java/android/widget/VideoView.java +++ b/core/java/android/widget/VideoView.java @@ -30,6 +30,7 @@ import android.media.MediaPlayer.OnErrorListener; import android.media.MediaPlayer.OnInfoListener; import android.media.Metadata; import android.media.SubtitleController; +import android.media.SubtitleTrack.RenderingWidget; import android.media.WebVttRenderer; import android.net.Uri; import android.util.AttributeSet; @@ -46,7 +47,6 @@ import android.widget.MediaController.MediaPlayerControl; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; import java.util.Map; import java.util.Vector; @@ -100,14 +100,11 @@ public class VideoView extends SurfaceView private boolean mCanSeekBack; private boolean mCanSeekForward; - /** List of views overlaid on top of the video. */ - private ArrayList<View> mOverlays; + /** Subtitle rendering widget overlaid on top of the video. */ + private RenderingWidget mSubtitleWidget; - /** - * Listener for overlay layout changes. Invalidates the video view to ensure - * that captions are redrawn whenever their layout changes. - */ - private OnLayoutChangeListener mOverlayLayoutListener; + /** Listener for changes to subtitle data, used to redraw when needed. */ + private RenderingWidget.OnChangedListener mSubtitlesChangedListener; public VideoView(Context context) { super(context); @@ -302,11 +299,10 @@ public class VideoView extends SurfaceView mMediaPlayer = new MediaPlayer(); // TODO: create SubtitleController in MediaPlayer, but we need // a context for the subtitle renderers - SubtitleController controller = new SubtitleController( - getContext(), - mMediaPlayer.getMediaTimeProvider(), - mMediaPlayer); - controller.registerRenderer(new WebVttRenderer(getContext(), null)); + final Context context = getContext(); + final SubtitleController controller = new SubtitleController( + context, mMediaPlayer.getMediaTimeProvider(), mMediaPlayer); + controller.registerRenderer(new WebVttRenderer(context)); mMediaPlayer.setSubtitleAnchor(controller, this); if (mAudioSession != 0) { @@ -792,117 +788,95 @@ public class VideoView extends SurfaceView } @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - super.onLayout(changed, left, top, right, bottom); + protected void onAttachedToWindow() { + super.onAttachedToWindow(); - // Layout overlay views, if necessary. - if (changed && mOverlays != null && !mOverlays.isEmpty()) { - measureAndLayoutOverlays(); + if (mSubtitleWidget != null) { + mSubtitleWidget.onAttachedToWindow(); } } @Override - public void draw(Canvas canvas) { - super.draw(canvas); + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); - final int count = mOverlays.size(); - for (int i = 0; i < count; i++) { - final View overlay = mOverlays.get(i); - overlay.draw(canvas); + if (mSubtitleWidget != null) { + mSubtitleWidget.onDetachedFromWindow(); } } - /** - * Adds a view to be overlaid on top of this video view. During layout, the - * view will be forced to match the bounds, less padding, of the video view. - * <p> - * Overlays are drawn in the order they are added. The last added overlay - * will be drawn on top. - * - * @param overlay the view to overlay - * @see #removeOverlay(View) - */ - private void addOverlay(View overlay) { - if (mOverlays == null) { - mOverlays = new ArrayList<View>(1); - } - - if (mOverlayLayoutListener == null) { - mOverlayLayoutListener = new OnLayoutChangeListener() { - @Override - public void onLayoutChange(View v, int left, int top, int right, int bottom, - int oldLeft, int oldTop, int oldRight, int oldBottom) { - invalidate(); - } - }; - } + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); - if (mOverlays.isEmpty()) { - setWillNotDraw(false); + if (mSubtitleWidget != null) { + measureAndLayoutSubtitleWidget(); } - - mOverlays.add(overlay); - overlay.addOnLayoutChangeListener(mOverlayLayoutListener); - measureAndLayoutOverlays(); } - /** - * Removes a view previously added using {@link #addOverlay}. - * - * @param overlay the view to remove - * @see #addOverlay(View) - */ - private void removeOverlay(View overlay) { - if (mOverlays == null) { - return; - } - - overlay.removeOnLayoutChangeListener(mOverlayLayoutListener); - mOverlays.remove(overlay); + @Override + public void draw(Canvas canvas) { + super.draw(canvas); - if (mOverlays.isEmpty()) { - setWillNotDraw(true); + if (mSubtitleWidget != null) { + final int saveCount = canvas.save(); + canvas.translate(getPaddingLeft(), getPaddingTop()); + mSubtitleWidget.draw(canvas); + canvas.restoreToCount(saveCount); } - - invalidate(); } /** * Forces a measurement and layout pass for all overlaid views. * - * @see #addOverlay(View) + * @see #setSubtitleWidget(RenderingWidget) */ - private void measureAndLayoutOverlays() { - final int left = getPaddingLeft(); - final int top = getPaddingTop(); - final int right = getWidth() - left - getPaddingRight(); - final int bottom = getHeight() - top - getPaddingBottom(); - final int widthSpec = MeasureSpec.makeMeasureSpec(right - left, MeasureSpec.EXACTLY); - final int heightSpec = MeasureSpec.makeMeasureSpec(bottom - top, MeasureSpec.EXACTLY); + private void measureAndLayoutSubtitleWidget() { + final int width = getWidth() - getPaddingLeft() - getPaddingRight(); + final int height = getHeight() - getPaddingTop() - getPaddingBottom(); - final int count = mOverlays.size(); - for (int i = 0; i < count; i++) { - final View overlay = mOverlays.get(i); - overlay.measure(widthSpec, heightSpec); - overlay.layout(left, top, right, bottom); - } + mSubtitleWidget.setSize(width, height); } /** @hide */ @Override - public void setSubtitleView(View view) { - if (mSubtitleView == view) { + public void setSubtitleWidget(RenderingWidget subtitleWidget) { + if (mSubtitleWidget == subtitleWidget) { return; } - if (mSubtitleView != null) { - removeOverlay(mSubtitleView); + final boolean attachedToWindow = isAttachedToWindow(); + if (mSubtitleWidget != null) { + if (attachedToWindow) { + mSubtitleWidget.onDetachedFromWindow(); + } + + mSubtitleWidget.setOnChangedListener(null); } - mSubtitleView = view; - if (mSubtitleView != null) { - addOverlay(mSubtitleView); + + mSubtitleWidget = subtitleWidget; + + if (subtitleWidget != null) { + if (mSubtitlesChangedListener == null) { + mSubtitlesChangedListener = new RenderingWidget.OnChangedListener() { + @Override + public void onChanged(RenderingWidget renderingWidget) { + invalidate(); + } + }; + } + + setWillNotDraw(false); + subtitleWidget.setOnChangedListener(mSubtitlesChangedListener); + + if (attachedToWindow) { + subtitleWidget.onAttachedToWindow(); + requestLayout(); + } + } else { + setWillNotDraw(true); } - } - private View mSubtitleView; + invalidate(); + } } diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl index 90566415b89d..16c41f3efdf4 100644 --- a/core/java/com/android/internal/app/IAppOpsService.aidl +++ b/core/java/com/android/internal/app/IAppOpsService.aidl @@ -23,7 +23,6 @@ interface IAppOpsService { // These first methods are also called by native code, so must // be kept in sync with frameworks/native/include/binder/IAppOpsService.h int checkOperation(int code, int uid, String packageName); - int checkPackage(int uid, String packageName); int noteOperation(int code, int uid, String packageName); int startOperation(IBinder token, int code, int uid, String packageName); void finishOperation(IBinder token, int code, int uid, String packageName); @@ -32,6 +31,7 @@ interface IAppOpsService { IBinder getToken(IBinder clientToken); // Remaining methods are only used in Java. + int checkPackage(int uid, String packageName); List<AppOpsManager.PackageOps> getPackagesForOps(in int[] ops); List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, in int[] ops); void setMode(int code, int uid, String packageName, int mode); diff --git a/core/java/com/android/internal/app/ProcessStats.java b/core/java/com/android/internal/app/ProcessStats.java index 16b119a68cb9..1f55a4cebeeb 100644 --- a/core/java/com/android/internal/app/ProcessStats.java +++ b/core/java/com/android/internal/app/ProcessStats.java @@ -165,7 +165,7 @@ public final class ProcessStats implements Parcelable { static final String CSV_SEP = "\t"; // Current version of the parcel format. - private static final int PARCEL_VERSION = 9; + private static final int PARCEL_VERSION = 11; // In-memory Parcel magic number, used to detect attempts to unmarshall bad data private static final int MAGIC = 0x50535453; @@ -204,6 +204,12 @@ public final class ProcessStats implements Parcelable { int[] mAddLongTable; int mAddLongTableSize; + // For writing parcels. + ArrayMap<String, Integer> mCommonStringToIndex; + + // For reading parcels. + ArrayList<String> mIndexToCommonString; + public ProcessStats(boolean running) { mRunning = running; reset(); @@ -247,7 +253,7 @@ public final class ProcessStats implements Parcelable { if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid + " service " + otherSvc.mName); ServiceState thisSvc = getServiceStateLocked(pkgName, uid, - null, otherSvc.mName); + otherSvc.mProcessName, otherSvc.mName); thisSvc.add(otherSvc); } } @@ -959,7 +965,15 @@ public final class ProcessStats implements Parcelable { for (int ip=procMap.size()-1; ip>=0; ip--) { SparseArray<ProcessState> uids = procMap.valueAt(ip); for (int iu=uids.size()-1; iu>=0; iu--) { - uids.valueAt(iu).resetSafely(now); + ProcessState ps = uids.valueAt(iu); + if (ps.isInUse()) { + uids.valueAt(iu).resetSafely(now); + } else { + uids.removeAt(iu); + } + } + if (uids.size() <= 0) { + procMap.removeAt(ip); } } ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap(); @@ -968,16 +982,27 @@ public final class ProcessStats implements Parcelable { for (int iu=uids.size()-1; iu>=0; iu--) { PackageState pkgState = uids.valueAt(iu); for (int iproc=pkgState.mProcesses.size()-1; iproc>=0; iproc--) { - pkgState.mProcesses.valueAt(iproc).resetSafely(now); + ProcessState ps = pkgState.mProcesses.valueAt(iproc); + if (ps.isInUse()) { + pkgState.mProcesses.valueAt(iproc).resetSafely(now); + } else { + pkgState.mProcesses.removeAt(iproc); + } } for (int isvc=pkgState.mServices.size()-1; isvc>=0; isvc--) { ServiceState ss = pkgState.mServices.valueAt(isvc); - if (ss.isActive()) { + if (ss.isInUse()) { pkgState.mServices.valueAt(isvc).resetSafely(now); } else { pkgState.mServices.removeAt(isvc); } } + if (pkgState.mProcesses.size() <= 0 && pkgState.mServices.size() <= 0) { + uids.removeAt(iu); + } + } + if (uids.size() <= 0) { + pkgMap.removeAt(ip); } } mStartTime = SystemClock.uptimeMillis(); @@ -1048,6 +1073,75 @@ public final class ProcessStats implements Parcelable { return table; } + private void writeCompactedLongArray(Parcel out, long[] array) { + final int N = array.length; + out.writeInt(N); + for (int i=0; i<N; i++) { + long val = array[i]; + if (val < 0) { + Slog.w(TAG, "Time val negative: " + val); + val = 0; + } + if (val <= Integer.MAX_VALUE) { + out.writeInt((int)val); + } else { + int top = ~((int)((val>>32)&0x7fffffff)); + int bottom = (int)(val&0xfffffff); + out.writeInt(top); + out.writeInt(bottom); + } + } + } + + private void readCompactedLongArray(Parcel in, int version, long[] array) { + if (version <= 10) { + in.readLongArray(array); + return; + } + final int N = in.readInt(); + if (N != array.length) { + throw new RuntimeException("bad array lengths"); + } + for (int i=0; i<N; i++) { + int val = in.readInt(); + if (val >= 0) { + array[i] = val; + } else { + int bottom = in.readInt(); + array[i] = (((long)~val)<<32) | bottom; + } + } + } + + private void writeCommonString(Parcel out, String name) { + Integer index = mCommonStringToIndex.get(name); + if (index != null) { + out.writeInt(index); + return; + } + index = mCommonStringToIndex.size(); + mCommonStringToIndex.put(name, index); + out.writeInt(~index); + out.writeString(name); + } + + private String readCommonString(Parcel in, int version) { + if (version <= 9) { + return in.readString(); + } + int index = in.readInt(); + if (index >= 0) { + return mIndexToCommonString.get(index); + } + index = ~index; + String name = in.readString(); + while (mIndexToCommonString.size() <= index) { + mIndexToCommonString.add(null); + } + mIndexToCommonString.set(index, name); + return name; + } + @Override public int describeContents() { return 0; @@ -1063,6 +1157,8 @@ public final class ProcessStats implements Parcelable { out.writeInt(PSS_COUNT); out.writeInt(LONGS_SIZE); + mCommonStringToIndex = new ArrayMap<String, Integer>(mProcesses.mMap.size()); + // First commit all running times. ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); final int NPROC = procMap.size(); @@ -1104,7 +1200,7 @@ public final class ProcessStats implements Parcelable { out.writeInt(mLongs.size()); out.writeInt(mNextLong); for (int i=0; i<(mLongs.size()-1); i++) { - out.writeLongArray(mLongs.get(i)); + writeCompactedLongArray(out, mLongs.get(i)); } long[] lastLongs = mLongs.get(mLongs.size() - 1); for (int i=0; i<mNextLong; i++) { @@ -1116,24 +1212,24 @@ public final class ProcessStats implements Parcelable { mMemFactorDurations[mMemFactor] += now - mStartTime; mStartTime = now; } - out.writeLongArray(mMemFactorDurations); + writeCompactedLongArray(out, mMemFactorDurations); out.writeInt(NPROC); for (int ip=0; ip<NPROC; ip++) { - out.writeString(procMap.keyAt(ip)); + writeCommonString(out, procMap.keyAt(ip)); SparseArray<ProcessState> uids = procMap.valueAt(ip); final int NUID = uids.size(); out.writeInt(NUID); for (int iu=0; iu<NUID; iu++) { out.writeInt(uids.keyAt(iu)); ProcessState proc = uids.valueAt(iu); - out.writeString(proc.mPackage); + writeCommonString(out, proc.mPackage); proc.writeToParcel(out, now); } } out.writeInt(NPKG); for (int ip=0; ip<NPKG; ip++) { - out.writeString(pkgMap.keyAt(ip)); + writeCommonString(out, pkgMap.keyAt(ip)); SparseArray<PackageState> uids = pkgMap.valueAt(ip); final int NUID = uids.size(); out.writeInt(NUID); @@ -1143,7 +1239,7 @@ public final class ProcessStats implements Parcelable { final int NPROCS = pkgState.mProcesses.size(); out.writeInt(NPROCS); for (int iproc=0; iproc<NPROCS; iproc++) { - out.writeString(pkgState.mProcesses.keyAt(iproc)); + writeCommonString(out, pkgState.mProcesses.keyAt(iproc)); ProcessState proc = pkgState.mProcesses.valueAt(iproc); if (proc.mCommonProcess == proc) { // This is the same as the common process we wrote above. @@ -1159,10 +1255,13 @@ public final class ProcessStats implements Parcelable { for (int isvc=0; isvc<NSRVS; isvc++) { out.writeString(pkgState.mServices.keyAt(isvc)); ServiceState svc = pkgState.mServices.valueAt(isvc); + writeCommonString(out, svc.mProcessName); svc.writeToParcel(out, now); } } } + + mCommonStringToIndex = null; } private boolean readCheckedInt(Parcel in, int val, String what) { @@ -1222,7 +1321,7 @@ public final class ProcessStats implements Parcelable { return; } int version = in.readInt(); - if (version != PARCEL_VERSION && version != 6) { + if (version != PARCEL_VERSION) { mReadError = "bad version: " + version; return; } @@ -1239,14 +1338,14 @@ public final class ProcessStats implements Parcelable { return; } + mIndexToCommonString = new ArrayList<String>(); + mTimePeriodStartClock = in.readLong(); buildTimePeriodStartClockStr(); mTimePeriodStartRealtime = in.readLong(); mTimePeriodEndRealtime = in.readLong(); - if (version == PARCEL_VERSION) { - mRuntime = in.readString(); - mWebView = in.readString(); - } + mRuntime = in.readString(); + mWebView = in.readString(); mFlags = in.readInt(); final int NLONGS = in.readInt(); @@ -1256,7 +1355,7 @@ public final class ProcessStats implements Parcelable { while (i >= mLongs.size()) { mLongs.add(new long[LONGS_SIZE]); } - in.readLongArray(mLongs.get(i)); + readCompactedLongArray(in, version, mLongs.get(i)); } long[] longs = new long[LONGS_SIZE]; mNextLong = NEXTLONG; @@ -1266,7 +1365,7 @@ public final class ProcessStats implements Parcelable { } mLongs.add(longs); - in.readLongArray(mMemFactorDurations); + readCompactedLongArray(in, version, mMemFactorDurations); int NPROC = in.readInt(); if (NPROC < 0) { @@ -1275,7 +1374,7 @@ public final class ProcessStats implements Parcelable { } while (NPROC > 0) { NPROC--; - String procName = in.readString(); + String procName = readCommonString(in, version); if (procName == null) { mReadError = "bad process name"; return; @@ -1292,7 +1391,7 @@ public final class ProcessStats implements Parcelable { mReadError = "bad uid: " + uid; return; } - String pkgName = in.readString(); + String pkgName = readCommonString(in, version); if (pkgName == null) { mReadError = "bad process package name"; return; @@ -1322,7 +1421,7 @@ public final class ProcessStats implements Parcelable { } while (NPKG > 0) { NPKG--; - String pkgName = in.readString(); + String pkgName = readCommonString(in, version); if (pkgName == null) { mReadError = "bad package name"; return; @@ -1348,7 +1447,7 @@ public final class ProcessStats implements Parcelable { } while (NPROCS > 0) { NPROCS--; - String procName = in.readString(); + String procName = readCommonString(in, version); if (procName == null) { mReadError = "bad package process name"; return; @@ -1400,9 +1499,10 @@ public final class ProcessStats implements Parcelable { mReadError = "bad package service name"; return; } + String processName = version > 9 ? readCommonString(in, version) : null; ServiceState serv = hadData ? pkgState.mServices.get(serviceName) : null; if (serv == null) { - serv = new ServiceState(this, pkgName, serviceName, null); + serv = new ServiceState(this, pkgName, serviceName, processName, null); } if (!serv.readFromParcel(in)) { return; @@ -1414,6 +1514,8 @@ public final class ProcessStats implements Parcelable { } } + mIndexToCommonString = null; + if (DEBUG) Slog.d(TAG, "Successfully read procstats!"); } @@ -1555,12 +1657,11 @@ public final class ProcessStats implements Parcelable { final ProcessStats.PackageState as = getPackageStateLocked(packageName, uid); ProcessStats.ServiceState ss = as.mServices.get(className); if (ss != null) { - ss.makeActive(); return ss; } final ProcessStats.ProcessState ps = processName != null ? getProcessStateLocked(packageName, uid, processName) : null; - ss = new ProcessStats.ServiceState(this, packageName, className, ps); + ss = new ProcessStats.ServiceState(this, packageName, className, processName, ps); as.mServices.put(className, ss); return ss; } @@ -1602,10 +1703,10 @@ public final class ProcessStats implements Parcelable { ALL_PROC_STATES, now); dumpProcessPss(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, ALL_PROC_STATES); - if (dumpAll) { - pw.print(" mNumStartedServices="); - pw.println(proc.mNumStartedServices); - } + pw.print(" mActive="); pw.println(proc.mActive); + pw.print(" mNumActiveServices="); pw.print(proc.mNumActiveServices); + pw.print(" mNumStartedServices="); + pw.println(proc.mNumStartedServices); } } else { ArrayList<ProcessState> procs = new ArrayList<ProcessState>(); @@ -1624,6 +1725,9 @@ public final class ProcessStats implements Parcelable { pw.print(pkgState.mServices.keyAt(isvc)); pw.println(":"); ServiceState svc = pkgState.mServices.valueAt(isvc); + dumpServiceStats(pw, " ", " ", " ", "Running", svc, + svc.mRunCount, ServiceState.SERVICE_RUN, svc.mRunState, + svc.mRunStartTime, now, totalTime, dumpAll); dumpServiceStats(pw, " ", " ", " ", "Started", svc, svc.mStartedCount, ServiceState.SERVICE_STARTED, svc.mStartedState, svc.mStartedStartTime, now, totalTime, dumpAll); @@ -1633,6 +1737,9 @@ public final class ProcessStats implements Parcelable { dumpServiceStats(pw, " ", " ", " ", "Executing", svc, svc.mExecCount, ServiceState.SERVICE_EXEC, svc.mExecState, svc.mExecStartTime, now, totalTime, dumpAll); + if (dumpAll) { + pw.print(" mActive="); pw.println(svc.mActive); + } } } } @@ -1663,6 +1770,12 @@ public final class ProcessStats implements Parcelable { ALL_PROC_STATES, now); dumpProcessPss(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, ALL_PROC_STATES); + if (dumpAll) { + pw.print(" mActive="); pw.println(proc.mActive); + pw.print(" mNumActiveServices="); pw.print(proc.mNumActiveServices); + pw.print(" mNumStartedServices="); + pw.println(proc.mNumStartedServices); + } } } @@ -1929,6 +2042,9 @@ public final class ProcessStats implements Parcelable { String serviceName = collapseString(pkgName, pkgState.mServices.keyAt(isvc)); ServiceState svc = pkgState.mServices.valueAt(isvc); + dumpServiceTimeCheckin(pw, "pkgsvc-run", pkgName, uid, serviceName, + svc, ServiceState.SERVICE_RUN, svc.mRunCount, + svc.mRunState, svc.mRunStartTime, now); dumpServiceTimeCheckin(pw, "pkgsvc-start", pkgName, uid, serviceName, svc, ServiceState.SERVICE_STARTED, svc.mStartedCount, svc.mStartedState, svc.mStartedStartTime, now); @@ -2003,6 +2119,8 @@ public final class ProcessStats implements Parcelable { int[] mPssTable; int mPssTableSize; + boolean mActive; + int mNumActiveServices; int mNumStartedServices; int mNumExcessiveWake; @@ -2072,6 +2190,7 @@ public final class ProcessStats implements Parcelable { } pnew.mNumExcessiveWake = mNumExcessiveWake; pnew.mNumExcessiveCpu = mNumExcessiveCpu; + pnew.mActive = mActive; pnew.mNumStartedServices = mNumStartedServices; return pnew; } @@ -2151,6 +2270,18 @@ public final class ProcessStats implements Parcelable { return true; } + public void makeActive() { + mActive = true; + } + + public void makeInactive() { + mActive = false; + } + + public boolean isInUse() { + return mActive || mNumActiveServices > 0 || mNumStartedServices > 0; + } + /** * Update the current state of the given list of processes. * @@ -2219,6 +2350,24 @@ public final class ProcessStats implements Parcelable { longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK] += dur; } + void incActiveServices() { + if (mCommonProcess != this) { + mCommonProcess.incActiveServices(); + } + mNumActiveServices++; + } + + void decActiveServices() { + if (mCommonProcess != this) { + mCommonProcess.decActiveServices(); + } + mNumActiveServices--; + if (mNumActiveServices < 0) { + throw new IllegalStateException("Proc active services underrun: pkg=" + + mPackage + " uid=" + mUid + " name=" + mName); + } + } + void incStartedServices(int memFactor, long now) { if (mCommonProcess != this) { mCommonProcess.incStartedServices(memFactor, now); @@ -2406,18 +2555,24 @@ public final class ProcessStats implements Parcelable { final ProcessStats mStats; public final String mPackage; public final String mName; + public final String mProcessName; ProcessState mProc; - int mActive = 1; + int mActive = 0; - public static final int SERVICE_STARTED = 0; - public static final int SERVICE_BOUND = 1; - public static final int SERVICE_EXEC = 2; - static final int SERVICE_COUNT = 3; + public static final int SERVICE_RUN = 0; + public static final int SERVICE_STARTED = 1; + public static final int SERVICE_BOUND = 2; + public static final int SERVICE_EXEC = 3; + static final int SERVICE_COUNT = 4; int[] mDurationsTable; int mDurationsTableSize; + int mRunCount; + public int mRunState = STATE_NOTHING; + long mRunStartTime; + int mStartedCount; public int mStartedState = STATE_NOTHING; long mStartedStartTime; @@ -2430,14 +2585,19 @@ public final class ProcessStats implements Parcelable { public int mExecState = STATE_NOTHING; long mExecStartTime; - public ServiceState(ProcessStats processStats, String pkg, String name, ProcessState proc) { + public ServiceState(ProcessStats processStats, String pkg, String name, + String processName, ProcessState proc) { mStats = processStats; mPackage = pkg; mName = name; + mProcessName = processName; mProc = proc; } public void makeActive() { + if (mActive == 0) { + mProc.incActiveServices(); + } mActive++; } @@ -2448,9 +2608,12 @@ public final class ProcessStats implements Parcelable { Slog.i(TAG, "Making " + this + " inactive", here); */ mActive--; + if (mActive == 0) { + mProc.decActiveServices(); + } } - public boolean isActive() { + public boolean isInUse() { return mActive > 0; } @@ -2460,6 +2623,7 @@ public final class ProcessStats implements Parcelable { int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; addStateTime(state, other.mStats.getLong(ent, 0)); } + mRunCount += other.mRunCount; mStartedCount += other.mStartedCount; mBoundCount += other.mBoundCount; mExecCount += other.mExecCount; @@ -2468,6 +2632,7 @@ public final class ProcessStats implements Parcelable { void resetSafely(long now) { mDurationsTable = null; mDurationsTableSize = 0; + mRunCount = mRunState != STATE_NOTHING ? 1 : 0; mStartedCount = mStartedState != STATE_NOTHING ? 1 : 0; mBoundCount = mBoundState != STATE_NOTHING ? 1 : 0; mExecCount = mExecState != STATE_NOTHING ? 1 : 0; @@ -2481,6 +2646,7 @@ public final class ProcessStats implements Parcelable { + printLongOffset(mDurationsTable[i])); out.writeInt(mDurationsTable[i]); } + out.writeInt(mRunCount); out.writeInt(mStartedCount); out.writeInt(mBoundCount); out.writeInt(mExecCount); @@ -2493,6 +2659,7 @@ public final class ProcessStats implements Parcelable { return false; } mDurationsTableSize = mDurationsTable != null ? mDurationsTable.length : 0; + mRunCount = in.readInt(); mStartedCount = in.readInt(); mBoundCount = in.readInt(); mExecCount = in.readInt(); @@ -2518,6 +2685,10 @@ public final class ProcessStats implements Parcelable { } void commitStateTime(long now) { + if (mRunState != STATE_NOTHING) { + addStateTime(SERVICE_RUN + (mRunState*SERVICE_COUNT), now - mRunStartTime); + mRunStartTime = now; + } if (mStartedState != STATE_NOTHING) { addStateTime(SERVICE_STARTED + (mStartedState*SERVICE_COUNT), now - mStartedStartTime); @@ -2533,6 +2704,21 @@ public final class ProcessStats implements Parcelable { } } + private void updateRunning(int memFactor, long now) { + final int state = (mStartedState != STATE_NOTHING || mBoundState != STATE_NOTHING + || mExecState != STATE_NOTHING) ? memFactor : STATE_NOTHING; + if (mRunState != state) { + if (mRunState != STATE_NOTHING) { + addStateTime(SERVICE_RUN + (mRunState*SERVICE_COUNT), + now - mRunStartTime); + } else if (state != STATE_NOTHING) { + mRunCount++; + } + mRunState = state; + mRunStartTime = now; + } + } + public void setStarted(boolean started, int memFactor, long now) { if (mActive <= 0) { throw new IllegalStateException("Service " + this + " has mActive=" + mActive); @@ -2556,6 +2742,7 @@ public final class ProcessStats implements Parcelable { mProc.decStartedServices(memFactor, now); } } + updateRunning(memFactor, now); } } @@ -2573,6 +2760,7 @@ public final class ProcessStats implements Parcelable { } mBoundState = state; mBoundStartTime = now; + updateRunning(memFactor, now); } } @@ -2589,6 +2777,7 @@ public final class ProcessStats implements Parcelable { } mExecState = state; mExecStartTime = now; + updateRunning(memFactor, now); } } diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java index a85d5fef2a21..5538dca2a4fa 100644 --- a/core/java/com/android/internal/os/RuntimeInit.java +++ b/core/java/com/android/internal/os/RuntimeInit.java @@ -17,6 +17,7 @@ package com.android.internal.os; import android.app.ActivityManagerNative; +import android.app.ActivityThread; import android.app.ApplicationErrorReport; import android.os.Build; import android.os.Debug; @@ -69,7 +70,14 @@ public class RuntimeInit { if (mApplicationObject == null) { Slog.e(TAG, "*** FATAL EXCEPTION IN SYSTEM PROCESS: " + t.getName(), e); } else { - Slog.e(TAG, "FATAL EXCEPTION: " + t.getName(), e); + StringBuilder message = new StringBuilder(); + message.append("FATAL EXCEPTION: ").append(t.getName()).append("\n"); + final String processName = ActivityThread.currentProcessName(); + if (processName != null) { + message.append("Process: ").append(processName).append(", "); + } + message.append("PID: ").append(Process.myPid()); + Slog.e(TAG, message.toString(), e); } // Bring up crash dialog, wait for it to be dismissed diff --git a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java index f060efd98451..c1ae9c24ea4e 100644 --- a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java +++ b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java @@ -156,7 +156,7 @@ public class ActionMenuPresenter extends BaseMenuPresenter } @Override - public View getItemView(MenuItemImpl item, View convertView, ViewGroup parent) { + public View getItemView(final MenuItemImpl item, View convertView, ViewGroup parent) { View actionView = item.getActionView(); if (actionView == null || item.hasCollapsibleActionView()) { if (!(convertView instanceof ActionMenuItemView)) { @@ -166,6 +166,27 @@ public class ActionMenuPresenter extends BaseMenuPresenter } actionView.setVisibility(item.isActionViewExpanded() ? View.GONE : View.VISIBLE); + if (item.hasSubMenu()) { + actionView.setOnTouchListener(new ForwardingListener(actionView) { + @Override + public ListPopupWindow getPopup() { + return mActionButtonPopup != null ? mActionButtonPopup.getPopup() : null; + } + + @Override + protected boolean onForwardingStarted() { + return onSubMenuSelected((SubMenuBuilder) item.getSubMenu()); + } + + @Override + protected boolean onForwardingStopped() { + return dismissPopupMenus(); + } + }); + } else { + actionView.setOnTouchListener(null); + } + final ActionMenuView menuParent = (ActionMenuView) parent; final ViewGroup.LayoutParams lp = actionView.getLayoutParams(); if (!menuParent.checkLayoutParams(lp)) { diff --git a/core/java/com/android/internal/widget/AutoScrollHelper.java b/core/java/com/android/internal/widget/AutoScrollHelper.java index afa410338cda..7a294aa52401 100644 --- a/core/java/com/android/internal/widget/AutoScrollHelper.java +++ b/core/java/com/android/internal/widget/AutoScrollHelper.java @@ -66,7 +66,7 @@ import android.widget.AbsListView; * The following scrolling properties may be configured: * <ul> * <li>Acceleration ramp-up duration, see {@link #setRampUpDuration}. Default - * value is 2500 milliseconds. + * value is 500 milliseconds. * <li>Acceleration ramp-down duration, see {@link #setRampDownDuration}. * Default value is 500 milliseconds. * <li>Target velocity relative to view size, see {@link #setRelativeVelocity}. @@ -191,7 +191,7 @@ public abstract class AutoScrollHelper implements View.OnTouchListener { private static final float DEFAULT_RELATIVE_EDGE = 0.2f; private static final float DEFAULT_RELATIVE_VELOCITY = 1f; private static final int DEFAULT_ACTIVATION_DELAY = ViewConfiguration.getTapTimeout(); - private static final int DEFAULT_RAMP_UP_DURATION = 2500; + private static final int DEFAULT_RAMP_UP_DURATION = 500; private static final int DEFAULT_RAMP_DOWN_DURATION = 500; /** diff --git a/core/java/com/android/internal/widget/SubtitleView.java b/core/java/com/android/internal/widget/SubtitleView.java index 131015124d87..356401c2a322 100644 --- a/core/java/com/android/internal/widget/SubtitleView.java +++ b/core/java/com/android/internal/widget/SubtitleView.java @@ -74,6 +74,10 @@ public class SubtitleView extends View { private float mSpacingAdd = 0; private int mInnerPaddingX = 0; + public SubtitleView(Context context) { + this(context, null); + } + public SubtitleView(Context context, AttributeSet attrs) { this(context, attrs, 0); } diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index f5eb38988ef2..dd07c4f52144 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -56,6 +56,7 @@ enum { HEAP_OAT, HEAP_ART, HEAP_UNKNOWN_MAP, + HEAP_GPU, HEAP_DALVIK_NORMAL, HEAP_DALVIK_LARGE, @@ -64,7 +65,7 @@ enum { HEAP_DALVIK_CODE_CACHE, _NUM_HEAP, - _NUM_EXCLUSIVE_HEAP = HEAP_UNKNOWN_MAP+1, + _NUM_EXCLUSIVE_HEAP = HEAP_GPU+1, _NUM_CORE_HEAP = HEAP_NATIVE+1 }; @@ -137,6 +138,72 @@ static jlong android_os_Debug_getNativeHeapFreeSize(JNIEnv *env, jobject clazz) #endif } +// XXX Qualcom-specific! +static jlong read_gpu_mem(int pid) +{ + char line[1024]; + jlong uss = 0; + unsigned temp; + + char tmp[128]; + FILE *fp; + + sprintf(tmp, "/d/kgsl/proc/%d/mem", pid); + fp = fopen(tmp, "r"); + if (fp == 0) { + //ALOGI("Unable to open: %s", tmp); + return 0; + } + + while (true) { + if (fgets(line, 1024, fp) == NULL) { + break; + } + + //ALOGI("Read: %s", line); + + // Format is: + // gpuaddr useraddr size id flags type usage sglen + // 54676000 54676000 4096 1 ----p gpumem arraybuffer 1 + // + // If useraddr is 0, this is gpu mem not otherwise accounted + // against the process. + + // Make sure line is long enough. + int i = 0; + while (i < 9) { + if (line[i] == 0) { + break; + } + i++; + } + if (i < 9) { + //ALOGI("Early line term!"); + continue; + } + + // Look to see if useraddr is 00000000. + while (i < 17) { + if (line[i] != '0') { + break; + } + i++; + } + if (i < 17) { + //ALOGI("useraddr not 0!"); + continue; + } + + uss += atoi(line + i); + //ALOGI("Uss now: %ld", uss); + } + + fclose(fp); + + // Convert from bytes to KB. + return uss / 1024; +} + static void read_mapinfo(FILE *fp, stats_t* stats) { char line[1024]; @@ -340,6 +407,10 @@ static void android_os_Debug_getDirtyPagesPid(JNIEnv *env, jobject clazz, load_maps(pid, stats); + jlong gpu = read_gpu_mem(pid); + stats[HEAP_GPU].pss += gpu; + stats[HEAP_GPU].privateDirty += gpu; + for (int i=_NUM_CORE_HEAP; i<_NUM_EXCLUSIVE_HEAP; i++) { stats[HEAP_UNKNOWN].pss += stats[i].pss; stats[HEAP_UNKNOWN].swappablePss += stats[i].swappablePss; @@ -394,34 +465,37 @@ static jlong android_os_Debug_getPssPid(JNIEnv *env, jobject clazz, jint pid, jl char tmp[128]; FILE *fp; + pss = uss = read_gpu_mem(pid); + sprintf(tmp, "/proc/%d/smaps", pid); fp = fopen(tmp, "r"); - if (fp == 0) return 0; - while (true) { - if (fgets(line, 1024, fp) == NULL) { - break; - } + if (fp != 0) { + while (true) { + if (fgets(line, 1024, fp) == NULL) { + break; + } - if (line[0] == 'P') { - if (strncmp(line, "Pss:", 4) == 0) { - char* c = line + 4; - while (*c != 0 && (*c < '0' || *c > '9')) { - c++; - } - pss += atoi(c); - } else if (strncmp(line, "Private_Clean:", 14) - || strncmp(line, "Private_Dirty:", 14)) { - char* c = line + 14; - while (*c != 0 && (*c < '0' || *c > '9')) { - c++; + if (line[0] == 'P') { + if (strncmp(line, "Pss:", 4) == 0) { + char* c = line + 4; + while (*c != 0 && (*c < '0' || *c > '9')) { + c++; + } + pss += atoi(c); + } else if (strncmp(line, "Private_Clean:", 14) + || strncmp(line, "Private_Dirty:", 14)) { + char* c = line + 14; + while (*c != 0 && (*c < '0' || *c > '9')) { + c++; + } + uss += atoi(c); } - uss += atoi(c); } } - } - fclose(fp); + fclose(fp); + } if (outUss != NULL) { if (env->GetArrayLength(outUss) >= 1) { diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 83a0c5646068..2e479283f147 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2444,6 +2444,13 @@ android:description="@string/permdesc_accessNetworkConditions" android:protectionLevel="signature|system" /> + <!-- Allows an application to request HotwordRecognition. + @hide This is not a third-party API (intended for system apps). --> + <permission android:name="android.permission.HOTWORD_RECOGNITION" + android:label="@string/permlab_hotwordRecognition" + android:description="@string/permdesc_hotwordRecognition" + android:protectionLevel="signature|system" /> + <!-- The system process is explicitly the only one allowed to launch the confirmation UI for full backup/restore --> <uses-permission android:name="android.permission.CONFIRM_FULL_BACKUP"/> diff --git a/core/res/res/drawable-nodpi/view_accessibility_focused.9.png b/core/res/res/drawable-nodpi/view_accessibility_focused.9.png Binary files differdeleted file mode 100644 index f03f57503466..000000000000 --- a/core/res/res/drawable-nodpi/view_accessibility_focused.9.png +++ /dev/null diff --git a/packages/ExternalStorageProvider/res/xml/document_provider.xml b/core/res/res/drawable/view_accessibility_focused.xml index 929a2734a0f2..0da9a81bd8fb 100644 --- a/packages/ExternalStorageProvider/res/xml/document_provider.xml +++ b/core/res/res/drawable/view_accessibility_focused.xml @@ -14,9 +14,12 @@ limitations under the License. --> -<documents-provider xmlns:android="http://schemas.android.com/apk/res/android" - android:customRoots="true"> +<shape xmlns:android="http://schemas.android.com/apk/res/android" > - <icon android:mimeType="application/pdf" android:icon="@drawable/ic_pdf" /> - <icon android:mimeType="text/*" android:icon="@drawable/ic_pdf" /> -</documents-provider> + <stroke + android:width="2dp" + android:color="@color/accessibility_focus_highlight" /> + + <corners android:radius="2dp"/> + +</shape> diff --git a/packages/DocumentsUI/res/xml/document_provider.xml b/core/res/res/values-ja/bools.xml index 77891cbccaa1..59cf744532eb 100644 --- a/packages/DocumentsUI/res/xml/document_provider.xml +++ b/core/res/res/values-ja/bools.xml @@ -14,6 +14,7 @@ limitations under the License. --> -<documents-provider xmlns:android="http://schemas.android.com/apk/res/android" - android:customRoots="true"> -</documents-provider> +<resources> + <bool name="flip_controller_fallback_keys">true</bool> +</resources> + diff --git a/core/res/res/values-mcc204-mnc04/config.xml b/core/res/res/values-mcc204-mnc04/config.xml new file mode 100644 index 000000000000..7a483421a975 --- /dev/null +++ b/core/res/res/values-mcc204-mnc04/config.xml @@ -0,0 +1,28 @@ +<?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 my 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:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1358</integer> + +</resources> diff --git a/core/res/res/values-mcc302-mnc370/config.xml b/core/res/res/values-mcc302-mnc370/config.xml index 3d2ea757ae4a..4fb223292661 100644 --- a/core/res/res/values-mcc302-mnc370/config.xml +++ b/core/res/res/values-mcc302-mnc370/config.xml @@ -36,4 +36,8 @@ note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" --> <string translatable="false" name="config_tether_apndata">Fido LTE Tethering,ltedata.apn,,,,,,,,,302,370,,DUN</string> + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1410</integer> + </resources> diff --git a/core/res/res/values-mcc302-mnc610/config.xml b/core/res/res/values-mcc302-mnc610/config.xml index 706570c0bd6b..638aa927fab7 100644 --- a/core/res/res/values-mcc302-mnc610/config.xml +++ b/core/res/res/values-mcc302-mnc610/config.xml @@ -22,4 +22,9 @@ <string-array translatable="false" name="config_operatorConsideredNonRoaming"> <item>302</item> </string-array> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1358</integer> + </resources> diff --git a/core/res/res/values-mcc302-mnc660/config.xml b/core/res/res/values-mcc302-mnc660/config.xml index 37853cf88f92..76f7968a620e 100644 --- a/core/res/res/values-mcc302-mnc660/config.xml +++ b/core/res/res/values-mcc302-mnc660/config.xml @@ -35,4 +35,9 @@ "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type" note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" --> <string translatable="false" name="config_tether_apndata">MTS -Tethering,internet.mts,,,,,,,,,302,660,,DUN</string> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1430</integer> + </resources> diff --git a/core/res/res/values-mcc302-mnc720/config.xml b/core/res/res/values-mcc302-mnc720/config.xml index 680f1a38f5d1..4eceffcb5870 100644 --- a/core/res/res/values-mcc302-mnc720/config.xml +++ b/core/res/res/values-mcc302-mnc720/config.xml @@ -36,4 +36,8 @@ note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" --> <string translatable="false" name="config_tether_apndata">Rogers LTE Tethering,ltedata.apn,,,,,,,,,302,720,,DUN</string> + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1430</integer> + </resources> diff --git a/core/res/res/values-mcc302-mnc780/config.xml b/core/res/res/values-mcc302-mnc780/config.xml index b03d14e6b1b6..cd401912745d 100644 --- a/core/res/res/values-mcc302-mnc780/config.xml +++ b/core/res/res/values-mcc302-mnc780/config.xml @@ -41,4 +41,9 @@ <string-array translatable="false" name="config_operatorConsideredNonRoaming"> <item>302</item> </string-array> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1358</integer> + </resources> diff --git a/core/res/res/values-mcc310-mnc120/config.xml b/core/res/res/values-mcc310-mnc120/config.xml new file mode 100644 index 000000000000..62001d904482 --- /dev/null +++ b/core/res/res/values-mcc310-mnc120/config.xml @@ -0,0 +1,28 @@ +<?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 my 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:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1422</integer> + +</resources> diff --git a/core/res/res/values-mcc310-mnc260/config.xml b/core/res/res/values-mcc310-mnc260/config.xml index 56a5d4effd8d..886ecbe5389c 100644 --- a/core/res/res/values-mcc310-mnc260/config.xml +++ b/core/res/res/values-mcc310-mnc260/config.xml @@ -37,4 +37,8 @@ note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" --> <string translatable="false" name="config_tether_apndata">T-Mobile Tethering,pcweb.tmobile.com,,,,,,,,,310,260,,DUN</string> + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1440</integer> + </resources> diff --git a/core/res/res/values-mcc310-mnc410/config.xml b/core/res/res/values-mcc310-mnc410/config.xml new file mode 100644 index 000000000000..73aa1cef1a07 --- /dev/null +++ b/core/res/res/values-mcc310-mnc410/config.xml @@ -0,0 +1,28 @@ +<?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 my 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:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1410</integer> + +</resources> diff --git a/core/res/res/values-mcc440-mnc20/config.xml b/core/res/res/values-mcc440-mnc20/config.xml new file mode 100644 index 000000000000..ba709fa434dd --- /dev/null +++ b/core/res/res/values-mcc440-mnc20/config.xml @@ -0,0 +1,28 @@ +<?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 my 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:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1340</integer> + +</resources> diff --git a/core/res/res/values-mcc440-mnc50/config.xml b/core/res/res/values-mcc440-mnc50/config.xml new file mode 100644 index 000000000000..fa5cba43c3dc --- /dev/null +++ b/core/res/res/values-mcc440-mnc50/config.xml @@ -0,0 +1,28 @@ +<?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 my 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:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1420</integer> + +</resources> diff --git a/core/res/res/values-mcc440-mnc54/config.xml b/core/res/res/values-mcc440-mnc54/config.xml new file mode 100644 index 000000000000..fa5cba43c3dc --- /dev/null +++ b/core/res/res/values-mcc440-mnc54/config.xml @@ -0,0 +1,28 @@ +<?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 my 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:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1420</integer> + +</resources> diff --git a/core/res/res/values-mcc450-mnc05/config.xml b/core/res/res/values-mcc450-mnc05/config.xml new file mode 100644 index 000000000000..d602c9fa634c --- /dev/null +++ b/core/res/res/values-mcc450-mnc05/config.xml @@ -0,0 +1,28 @@ +<?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 my 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:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1440</integer> + +</resources> diff --git a/core/res/res/values-mcc450-mnc06/config.xml b/core/res/res/values-mcc450-mnc06/config.xml new file mode 100644 index 000000000000..63f9823914ed --- /dev/null +++ b/core/res/res/values-mcc450-mnc06/config.xml @@ -0,0 +1,28 @@ +<?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 my 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:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1428</integer> + +</resources> diff --git a/core/res/res/values-mcc450-mnc08/config.xml b/core/res/res/values-mcc450-mnc08/config.xml new file mode 100644 index 000000000000..950c62bd1798 --- /dev/null +++ b/core/res/res/values-mcc450-mnc08/config.xml @@ -0,0 +1,28 @@ +<?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 my 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:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1450</integer> + +</resources> diff --git a/core/res/res/values-mcc505-mnc01/config.xml b/core/res/res/values-mcc505-mnc01/config.xml index f9d9ac7bf050..7331c5009b17 100644 --- a/core/res/res/values-mcc505-mnc01/config.xml +++ b/core/res/res/values-mcc505-mnc01/config.xml @@ -37,4 +37,8 @@ note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" --> <string translatable="false" name="config_tether_apndata">Telstra Tethering,telstra.internet,,,,,,,,,505,01,,DUN</string> + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1400</integer> + </resources> diff --git a/core/res/res/values/bools.xml b/core/res/res/values/bools.xml index 18e4f2f9b3a8..10a5d851fac3 100644 --- a/core/res/res/values/bools.xml +++ b/core/res/res/values/bools.xml @@ -26,4 +26,5 @@ <bool name="show_ongoing_ime_switcher">true</bool> <bool name="action_bar_expanded_action_views_exclusive">true</bool> <bool name="target_honeycomb_needs_options_menu">true</bool> + <bool name="flip_controller_fallback_keys">false</bool> </resources> diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml index 604bf4b6f3c7..284f61383d9f 100644 --- a/core/res/res/values/colors.xml +++ b/core/res/res/values/colors.xml @@ -195,5 +195,7 @@ <color name="keyguard_avatar_frame_shadow_color">#80000000</color> <color name="keyguard_avatar_nick_color">#ffffffff</color> <color name="keyguard_avatar_frame_pressed_color">#ff35b5e5</color> + + <color name="accessibility_focus_highlight">#80ffff00</color> </resources> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index dd233c546234..ab95d4006bc0 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1097,6 +1097,10 @@ players. --> <integer name="config_safe_media_volume_index">10</integer> + <!-- Configure mobile network MTU. The standard default is set here but each carrier + may have a specific value set in an overlay config.xml file. --> + <integer name="config_mobile_mtu">1500</integer> + <!-- Whether WiFi display is supported by this device. There are many prerequisites for this feature to work correctly. Here are a few of them: diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index aa04bf6e9bb8..68acd8c2dcd4 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1911,6 +1911,11 @@ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permdesc_accessNetworkConditions">Allows an application to listen for observations on network conditions. Should never be needed for normal apps.</string> + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permlab_hotwordRecognition">request hotword recognition</string> + <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permdesc_hotwordRecognition">Allows an application to request for hotword recognition. Should never be needed for normal apps.</string> + <!-- Policy administration --> <!-- Title of policy access to limiting the user's password choices --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index fcd56eb2ca32..39e712744f0b 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -285,6 +285,7 @@ <java-symbol type="bool" name="config_useFixedVolume" /> <java-symbol type="bool" name="config_forceDefaultOrientation" /> <java-symbol type="bool" name="config_wifi_batched_scan_supported" /> + <java-symbol type="bool" name="flip_controller_fallback_keys" /> <java-symbol type="integer" name="config_cursorWindowSize" /> <java-symbol type="integer" name="config_extraFreeKbytesAdjust" /> @@ -311,6 +312,8 @@ <java-symbol type="integer" name="config_lockSoundVolumeDb" /> <java-symbol type="integer" name="config_multiuserMaximumUsers" /> <java-symbol type="integer" name="config_safe_media_volume_index" /> + <java-symbol type="integer" name="config_mobile_mtu" /> + <java-symbol type="color" name="tab_indicator_text_v4" /> <java-symbol type="dimen" name="accessibility_touch_slop" /> diff --git a/core/tests/coretests/src/android/net/LinkPropertiesTest.java b/core/tests/coretests/src/android/net/LinkPropertiesTest.java index 7e70c6b04653..e63f6b08f6e3 100644 --- a/core/tests/coretests/src/android/net/LinkPropertiesTest.java +++ b/core/tests/coretests/src/android/net/LinkPropertiesTest.java @@ -33,6 +33,7 @@ public class LinkPropertiesTest extends TestCase { private static InetAddress GATEWAY1 = NetworkUtils.numericToInetAddress("75.208.8.1"); private static InetAddress GATEWAY2 = NetworkUtils.numericToInetAddress("69.78.8.1"); private static String NAME = "qmi0"; + private static int MTU = 1500; private static LinkAddress LINKADDRV4 = new LinkAddress(ADDRV4, 32); private static LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128); @@ -57,6 +58,9 @@ public class LinkPropertiesTest extends TestCase { assertTrue(source.isIdenticalStackedLinks(target)); assertTrue(target.isIdenticalStackedLinks(source)); + assertTrue(source.isIdenticalMtu(target)); + assertTrue(target.isIdenticalMtu(source)); + // Check result of equals(). assertTrue(source.equals(target)); assertTrue(target.equals(source)); @@ -88,6 +92,7 @@ public class LinkPropertiesTest extends TestCase { // set 2 gateways source.addRoute(new RouteInfo(GATEWAY1)); source.addRoute(new RouteInfo(GATEWAY2)); + source.setMtu(MTU); LinkProperties target = new LinkProperties(); @@ -99,6 +104,7 @@ public class LinkPropertiesTest extends TestCase { target.addDns(DNS2); target.addRoute(new RouteInfo(GATEWAY1)); target.addRoute(new RouteInfo(GATEWAY2)); + target.setMtu(MTU); assertLinkPropertiesEqual(source, target); @@ -111,6 +117,7 @@ public class LinkPropertiesTest extends TestCase { target.addDns(DNS2); target.addRoute(new RouteInfo(GATEWAY1)); target.addRoute(new RouteInfo(GATEWAY2)); + target.setMtu(MTU); assertFalse(source.equals(target)); target.clear(); @@ -123,6 +130,7 @@ public class LinkPropertiesTest extends TestCase { target.addDns(DNS2); target.addRoute(new RouteInfo(GATEWAY1)); target.addRoute(new RouteInfo(GATEWAY2)); + target.setMtu(MTU); assertFalse(source.equals(target)); target.clear(); @@ -134,6 +142,7 @@ public class LinkPropertiesTest extends TestCase { target.addDns(DNS2); target.addRoute(new RouteInfo(GATEWAY1)); target.addRoute(new RouteInfo(GATEWAY2)); + target.setMtu(MTU); assertFalse(source.equals(target)); target.clear(); @@ -145,6 +154,19 @@ public class LinkPropertiesTest extends TestCase { // change gateway target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress("75.208.8.2"))); target.addRoute(new RouteInfo(GATEWAY2)); + target.setMtu(MTU); + assertFalse(source.equals(target)); + + target.clear(); + target.setInterfaceName(NAME); + target.addLinkAddress(LINKADDRV4); + target.addLinkAddress(LINKADDRV6); + target.addDns(DNS1); + target.addDns(DNS2); + target.addRoute(new RouteInfo(GATEWAY1)); + target.addRoute(new RouteInfo(GATEWAY2)); + // change mtu + target.setMtu(1440); assertFalse(source.equals(target)); } catch (Exception e) { @@ -167,6 +189,7 @@ public class LinkPropertiesTest extends TestCase { // set 2 gateways source.addRoute(new RouteInfo(GATEWAY1)); source.addRoute(new RouteInfo(GATEWAY2)); + source.setMtu(MTU); LinkProperties target = new LinkProperties(); // Exchange order @@ -177,6 +200,7 @@ public class LinkPropertiesTest extends TestCase { target.addDns(DNS1); target.addRoute(new RouteInfo(GATEWAY2)); target.addRoute(new RouteInfo(GATEWAY1)); + target.setMtu(MTU); assertLinkPropertiesEqual(source, target); } catch (Exception e) { diff --git a/data/keyboards/Generic.kcm b/data/keyboards/Generic.kcm index 01d22ee69178..695a74f83810 100644 --- a/data/keyboards/Generic.kcm +++ b/data/keyboards/Generic.kcm @@ -477,128 +477,4 @@ key ESCAPE { ctrl: fallback MENU } -### Gamepad buttons ### - -key BUTTON_A { - base: fallback DPAD_CENTER -} - -key BUTTON_B { - base: fallback BACK -} - -key BUTTON_C { - base: fallback DPAD_CENTER -} - -key BUTTON_X { - base: fallback DPAD_CENTER -} - -key BUTTON_Y { - base: fallback BACK -} - -key BUTTON_Z { - base: fallback DPAD_CENTER -} - -key BUTTON_L1 { - base: none -} - -key BUTTON_R1 { - base: none -} - -key BUTTON_L2 { - base: none -} - -key BUTTON_R2 { - base: none -} - -key BUTTON_THUMBL { - base: fallback DPAD_CENTER -} - -key BUTTON_THUMBR { - base: fallback DPAD_CENTER -} - -key BUTTON_START { - base: fallback DPAD_CENTER -} - -key BUTTON_SELECT { - base: fallback MENU -} - -key BUTTON_MODE { - base: fallback MENU -} - -key BUTTON_1 { - base: fallback DPAD_CENTER -} - -key BUTTON_2 { - base: fallback DPAD_CENTER -} - -key BUTTON_3 { - base: fallback DPAD_CENTER -} - -key BUTTON_4 { - base: fallback DPAD_CENTER -} - -key BUTTON_5 { - base: fallback DPAD_CENTER -} - -key BUTTON_6 { - base: fallback DPAD_CENTER -} - -key BUTTON_7 { - base: fallback DPAD_CENTER -} - -key BUTTON_8 { - base: fallback DPAD_CENTER -} - -key BUTTON_9 { - base: fallback DPAD_CENTER -} - -key BUTTON_10 { - base: fallback DPAD_CENTER -} - -key BUTTON_11 { - base: fallback DPAD_CENTER -} - -key BUTTON_12 { - base: fallback DPAD_CENTER -} - -key BUTTON_13 { - base: fallback DPAD_CENTER -} - -key BUTTON_14 { - base: fallback DPAD_CENTER -} - -key BUTTON_15 { - base: fallback DPAD_CENTER -} - -key BUTTON_16 { - base: fallback DPAD_CENTER -} +### Gamepad buttons are handled by the view root ### diff --git a/docs/html/training/id-auth/authenticate.jd b/docs/html/training/id-auth/authenticate.jd index 3084beac35a9..65dbc3987bd3 100644 --- a/docs/html/training/id-auth/authenticate.jd +++ b/docs/html/training/id-auth/authenticate.jd @@ -79,7 +79,7 @@ a valid auth token from the Android Account Manager"/> <p>To get an auth token you first need to request the {@link android.Manifest.permission#ACCOUNT_MANAGER} -to yourmanifest file. To actually do anything useful with the +to your manifest file. To actually do anything useful with the token, you'll also need to add the {@link android.Manifest.permission#INTERNET} permission.</p> diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java index 4193dbb32449..e3adc59244b3 100644 --- a/graphics/java/android/graphics/BitmapFactory.java +++ b/graphics/java/android/graphics/BitmapFactory.java @@ -56,15 +56,26 @@ public class BitmapFactory { * mutable even when decoding a resource which would normally result in * an immutable bitmap.</p> * + * <p>You should still always use the returned Bitmap of the decode + * method and not assume that reusing the bitmap worked, due to the + * constraints outlined above and failure situations that can occur. + * Checking whether the return value matches the value of the inBitmap + * set in the Options structure will indicate if the bitmap was reused, + * but in all cases you should use the Bitmap returned by the decoding + * function to ensure that you are using the bitmap that was used as the + * decode destination.</p> + * + * <h3>Usage with BitmapFactory</h3> + * * <p>As of {@link android.os.Build.VERSION_CODES#KITKAT}, any - * mutable bitmap can be reused to decode any other bitmaps as long as - * the resulting {@link Bitmap#getByteCount() byte count} of the decoded - * bitmap is less than or equal to the {@link + * mutable bitmap can be reused by {@link BitmapFactory} to decode any + * other bitmaps as long as the resulting {@link Bitmap#getByteCount() + * byte count} of the decoded bitmap is less than or equal to the {@link * Bitmap#getAllocationByteCount() allocated byte count} of the reused * bitmap. This can be because the intrinsic size is smaller, or its * size post scaling (for density / sample size) is smaller.</p> * - * <p>Prior to {@link android.os.Build.VERSION_CODES#KITKAT} + * <p class="note">Prior to {@link android.os.Build.VERSION_CODES#KITKAT} * additional constraints apply: The image being decoded (whether as a * resource or as a stream) must be in jpeg or png format. Only equal * sized bitmaps are supported, with {@link #inSampleSize} set to 1. @@ -72,14 +83,17 @@ public class BitmapFactory { * configuration} of the reused bitmap will override the setting of * {@link #inPreferredConfig}, if set.</p> * - * <p>You should still always use the returned Bitmap of the decode - * method and not assume that reusing the bitmap worked, due to the - * constraints outlined above and failure situations that can occur. - * Checking whether the return value matches the value of the inBitmap - * set in the Options structure will indicate if the bitmap was reused, - * but in all cases you should use the Bitmap returned by the decoding - * function to ensure that you are using the bitmap that was used as the - * decode destination.</p> + * <h3>Usage with BitmapRegionDecoder</h3> + * + * <p>BitmapRegionDecoder will draw its requested content into the Bitmap + * provided, clipping if the output content size (post scaling) is larger + * than the provided Bitmap. The provided Bitmap's width, height, and + * {@link Bitmap.Config} will not be changed. + * + * <p class="note">BitmapRegionDecoder support for {@link #inBitmap} was + * introduced in {@link android.os.Build.VERSION_CODES#JELLY_BEAN}. All + * formats supported by BitmapRegionDecoder support Bitmap reuse via + * {@link #inBitmap}.</p> * * @see Bitmap#reconfigure(int,int, android.graphics.Bitmap.Config) */ @@ -229,6 +243,9 @@ public class BitmapFactory { * rather than relying on the graphics system scaling it each time it * is drawn to a Canvas. * + * <p>BitmapRegionDecoder ignores this flag, and will not scale output + * based on density. (though {@link #inSampleSize} is supported)</p> + * * <p>This flag is turned on by default and should be turned off if you need * a non-scaled version of the bitmap. Nine-patch bitmaps ignore this * flag and are always scaled. diff --git a/media/java/android/media/AudioTimestamp.java b/media/java/android/media/AudioTimestamp.java index 437a0c6337be..965ba859dcbd 100644 --- a/media/java/android/media/AudioTimestamp.java +++ b/media/java/android/media/AudioTimestamp.java @@ -26,9 +26,6 @@ package android.media; * is available to the system, but cannot account for any delay unknown to the implementation. * * @see AudioTrack#getTimestamp - * @see AudioTrack.TimestampListener - * - * @hide */ public final class AudioTimestamp { diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index 88539f28a506..788257d5ba51 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -735,8 +735,7 @@ public class AudioTrack /** * Poll for a timestamp on demand. * - * Use if {@link TimestampListener} is not delivered often enough for your needs, - * or if you need to get the most recent timestamp outside of the event callback handler. + * Use if you need to get the most recent timestamp outside of the event callback handler. * Calling this method too often may be inefficient; * if you need a high-resolution mapping between frame position and presentation time, * consider implementing that at application level, based on low-resolution timestamps. @@ -756,8 +755,6 @@ public class AudioTrack * with the estimated time when that frame was presented or is committed to * be presented. * In the case that no timestamp is available, any supplied instance is left unaltered. - * - * @hide */ public AudioTimestamp getTimestamp(AudioTimestamp timestamp) { diff --git a/media/java/android/media/SubtitleController.java b/media/java/android/media/SubtitleController.java index 2cf1b2db71b5..e83c5bae99f3 100644 --- a/media/java/android/media/SubtitleController.java +++ b/media/java/android/media/SubtitleController.java @@ -20,8 +20,7 @@ import java.util.Locale; import java.util.Vector; import android.content.Context; -import android.media.MediaPlayer.OnSubtitleDataListener; -import android.view.View; +import android.media.SubtitleTrack.RenderingWidget; import android.view.accessibility.CaptioningManager; /** @@ -32,7 +31,6 @@ import android.view.accessibility.CaptioningManager; * @hide */ public class SubtitleController { - private Context mContext; private MediaTimeProvider mTimeProvider; private Vector<Renderer> mRenderers; private Vector<SubtitleTrack> mTracks; @@ -50,7 +48,6 @@ public class SubtitleController { Context context, MediaTimeProvider timeProvider, Listener listener) { - mContext = context; mTimeProvider = timeProvider; mListener = listener; @@ -79,11 +76,11 @@ public class SubtitleController { return mSelectedTrack; } - private View getSubtitleView() { + private RenderingWidget getRenderingWidget() { if (mSelectedTrack == null) { return null; } - return mSelectedTrack.getView(); + return mSelectedTrack.getRenderingWidget(); } /** @@ -110,7 +107,7 @@ public class SubtitleController { } mSelectedTrack = track; - mAnchor.setSubtitleView(getSubtitleView()); + mAnchor.setSubtitleWidget(getRenderingWidget()); if (mSelectedTrack != null) { mSelectedTrack.setTimeProvider(mTimeProvider); @@ -268,17 +265,16 @@ public class SubtitleController { } /** - * Subtitle anchor, an object that is able to display a subtitle view, + * Subtitle anchor, an object that is able to display a subtitle renderer, * e.g. a VideoView. */ public interface Anchor { /** - * Anchor should set the subtitle view to the supplied view, - * or none, if the supplied view is null. - * - * @param view subtitle view, or null + * Anchor should use the supplied subtitle rendering widget, or + * none if it is null. + * @hide */ - public void setSubtitleView(View view); + public void setSubtitleWidget(RenderingWidget subtitleWidget); } private Anchor mAnchor; @@ -290,11 +286,11 @@ public class SubtitleController { } if (mAnchor != null) { - mAnchor.setSubtitleView(null); + mAnchor.setSubtitleWidget(null); } mAnchor = anchor; if (mAnchor != null) { - mAnchor.setSubtitleView(getSubtitleView()); + mAnchor.setSubtitleWidget(getRenderingWidget()); } } diff --git a/media/java/android/media/SubtitleTrack.java b/media/java/android/media/SubtitleTrack.java index 09fb3f21ace3..cb689af7a43e 100644 --- a/media/java/android/media/SubtitleTrack.java +++ b/media/java/android/media/SubtitleTrack.java @@ -16,11 +16,11 @@ package android.media; +import android.graphics.Canvas; import android.os.Handler; import android.util.Log; import android.util.LongSparseArray; import android.util.Pair; -import android.view.View; import java.util.Iterator; import java.util.NoSuchElementException; @@ -98,16 +98,16 @@ public abstract class SubtitleTrack implements MediaTimeProvider.OnMediaTimeList public abstract void onData(String data, boolean eos, long runID); /** - * Called when adding the subtitle rendering view to the view hierarchy, as - * well as when showing or hiding the subtitle track, or when the video + * Called when adding the subtitle rendering widget to the view hierarchy, + * as well as when showing or hiding the subtitle track, or when the video * surface position has changed. * - * @return the view object that displays this subtitle track. For most - * renderers there should be a single shared view instance that is used - * for all tracks supported by that renderer, as at most one subtitle - * track is visible at one time. + * @return the widget that renders this subtitle track. For most renderers + * there should be a single shared instance that is used for all + * tracks supported by that renderer, as at most one subtitle track + * is visible at one time. */ - public abstract View getView(); + public abstract RenderingWidget getRenderingWidget(); /** * Called when the active cues have changed, and the contents of the subtitle @@ -268,7 +268,7 @@ public abstract class SubtitleTrack implements MediaTimeProvider.OnMediaTimeList } mVisible = true; - getView().setVisibility(View.VISIBLE); + getRenderingWidget().setVisible(true); if (mTimeProvider != null) { mTimeProvider.scheduleUpdate(this); } @@ -283,7 +283,7 @@ public abstract class SubtitleTrack implements MediaTimeProvider.OnMediaTimeList if (mTimeProvider != null) { mTimeProvider.cancelNotifications(this); } - getView().setVisibility(View.INVISIBLE); + getRenderingWidget().setVisible(false); mVisible = false; } @@ -645,4 +645,61 @@ public abstract class SubtitleTrack implements MediaTimeProvider.OnMediaTimeList } } } + + /** + * Interface for rendering subtitles onto a Canvas. + */ + public interface RenderingWidget { + /** + * Sets the widget's callback, which is used to send updates when the + * rendered data has changed. + * + * @param callback update callback + */ + public void setOnChangedListener(OnChangedListener callback); + + /** + * Sets the widget's size. + * + * @param width width in pixels + * @param height height in pixels + */ + public void setSize(int width, int height); + + /** + * Sets whether the widget should draw subtitles. + * + * @param visible true if subtitles should be drawn, false otherwise + */ + public void setVisible(boolean visible); + + /** + * Renders subtitles onto a {@link Canvas}. + * + * @param c canvas on which to render subtitles + */ + public void draw(Canvas c); + + /** + * Called when the widget is attached to a window. + */ + public void onAttachedToWindow(); + + /** + * Called when the widget is detached from a window. + */ + public void onDetachedFromWindow(); + + /** + * Callback used to send updates about changes to rendering data. + */ + public interface OnChangedListener { + /** + * Called when the rendering data has changed. + * + * @param renderingWidget the widget whose data has changed + */ + public void onChanged(RenderingWidget renderingWidget); + } + } } diff --git a/media/java/android/media/WebVttRenderer.java b/media/java/android/media/WebVttRenderer.java index 527c57f6401c..74773a8be437 100644 --- a/media/java/android/media/WebVttRenderer.java +++ b/media/java/android/media/WebVttRenderer.java @@ -1,12 +1,37 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package android.media; import android.content.Context; +import android.text.SpannableStringBuilder; +import android.util.ArrayMap; import android.util.AttributeSet; import android.util.Log; +import android.view.Gravity; import android.view.View; -import android.view.ViewGroup.LayoutParams; -import android.widget.TextView; +import android.view.ViewGroup; +import android.view.accessibility.CaptioningManager; +import android.view.accessibility.CaptioningManager.CaptionStyle; +import android.view.accessibility.CaptioningManager.CaptioningChangeListener; +import android.widget.LinearLayout; + +import com.android.internal.widget.SubtitleView; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -14,10 +39,12 @@ import java.util.Vector; /** @hide */ public class WebVttRenderer extends SubtitleController.Renderer { - private TextView mMyTextView; + private final Context mContext; - public WebVttRenderer(Context context, AttributeSet attrs) { - mMyTextView = new WebVttView(context, attrs); + private WebVttRenderingWidget mRenderingWidget; + + public WebVttRenderer(Context context) { + mContext = context; } @Override @@ -30,19 +57,11 @@ public class WebVttRenderer extends SubtitleController.Renderer { @Override public SubtitleTrack createTrack(MediaFormat format) { - return new WebVttTrack(format, mMyTextView); - } -} + if (mRenderingWidget == null) { + mRenderingWidget = new WebVttRenderingWidget(mContext); + } -/** @hide */ -class WebVttView extends TextView { - public WebVttView(Context context, AttributeSet attrs) { - super(context, attrs); - setTextColor(0xffffff00); - setTextSize(46); - setTextAlignment(TextView.TEXT_ALIGNMENT_CENTER); - setLayoutParams(new LayoutParams( - LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); + return new WebVttTrack(mRenderingWidget, format); } } @@ -954,26 +973,26 @@ interface WebVttCueListener { class WebVttTrack extends SubtitleTrack implements WebVttCueListener { private static final String TAG = "WebVttTrack"; - private final TextView mTextView; - private final WebVttParser mParser = new WebVttParser(this); private final UnstyledTextExtractor mExtractor = new UnstyledTextExtractor(); private final Tokenizer mTokenizer = new Tokenizer(mExtractor); private final Vector<Long> mTimestamps = new Vector<Long>(); + private final WebVttRenderingWidget mRenderingWidget; private final Map<String, TextTrackRegion> mRegions = new HashMap<String, TextTrackRegion>(); private Long mCurrentRunID; - WebVttTrack(MediaFormat format, TextView textView) { + WebVttTrack(WebVttRenderingWidget renderingWidget, MediaFormat format) { super(format); - mTextView = textView; + + mRenderingWidget = renderingWidget; } @Override - public View getView() { - return mTextView; + public WebVttRenderingWidget getRenderingWidget() { + return mRenderingWidget; } @Override @@ -1051,6 +1070,7 @@ class WebVttTrack extends SubtitleTrack implements WebVttCueListener { } } + @Override public void updateView(Vector<SubtitleTrack.Cue> activeCues) { if (!mVisible) { // don't keep the state if we are not visible @@ -1066,29 +1086,737 @@ class WebVttTrack extends SubtitleTrack implements WebVttCueListener { Log.d(TAG, "at (illegal state) the active cues are:"); } } - StringBuilder text = new StringBuilder(); - StringBuilder lineBuilder = new StringBuilder(); - for (Cue o: activeCues) { - TextTrackCue cue = (TextTrackCue)o; - if (DEBUG) Log.d(TAG, cue.toString()); - for (TextTrackCueSpan[] line: cue.mLines) { - for (TextTrackCueSpan span: line) { - if (!span.mEnabled) { - continue; - } - lineBuilder.append(span.mText); + + mRenderingWidget.setActiveCues(activeCues); + } +} + +/** + * Widget capable of rendering WebVTT captions. + * + * @hide + */ +class WebVttRenderingWidget extends ViewGroup implements SubtitleTrack.RenderingWidget { + private static final boolean DEBUG = false; + private static final int DEBUG_REGION_BACKGROUND = 0x800000FF; + private static final int DEBUG_CUE_BACKGROUND = 0x80FF0000; + + /** WebVtt specifies line height as 5.3% of the viewport height. */ + private static final float LINE_HEIGHT_RATIO = 0.0533f; + + /** Map of active regions, used to determine enter/exit. */ + private final ArrayMap<TextTrackRegion, RegionLayout> mRegionBoxes = + new ArrayMap<TextTrackRegion, RegionLayout>(); + + /** Map of active cues, used to determine enter/exit. */ + private final ArrayMap<TextTrackCue, CueLayout> mCueBoxes = + new ArrayMap<TextTrackCue, CueLayout>(); + + /** Captioning manager, used to obtain and track caption properties. */ + private final CaptioningManager mManager; + + /** Callback for rendering changes. */ + private OnChangedListener mListener; + + /** Current caption style. */ + private CaptionStyle mCaptionStyle; + + /** Current font size, computed from font scaling factor and height. */ + private float mFontSize; + + /** Whether a caption style change listener is registered. */ + private boolean mHasChangeListener; + + public WebVttRenderingWidget(Context context) { + this(context, null); + } + + public WebVttRenderingWidget(Context context, AttributeSet attrs) { + this(context, null, 0); + } + + public WebVttRenderingWidget(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + // Cannot render text over video when layer type is hardware. + setLayerType(View.LAYER_TYPE_SOFTWARE, null); + + mManager = (CaptioningManager) context.getSystemService(Context.CAPTIONING_SERVICE); + mCaptionStyle = mManager.getUserStyle(); + mFontSize = mManager.getFontScale() * getHeight() * LINE_HEIGHT_RATIO; + } + + @Override + public void setSize(int width, int height) { + final int widthSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY); + final int heightSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); + + measure(widthSpec, heightSpec); + layout(0, 0, width, height); + } + + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + + manageChangeListener(); + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + + manageChangeListener(); + } + + @Override + public void setOnChangedListener(OnChangedListener listener) { + mListener = listener; + } + + @Override + public void setVisible(boolean visible) { + if (visible) { + setVisibility(View.VISIBLE); + } else { + setVisibility(View.GONE); + } + + manageChangeListener(); + } + + /** + * Manages whether this renderer is listening for caption style changes. + */ + private void manageChangeListener() { + final boolean needsListener = isAttachedToWindow() && getVisibility() == View.VISIBLE; + if (mHasChangeListener != needsListener) { + mHasChangeListener = needsListener; + + if (needsListener) { + mManager.addCaptioningChangeListener(mCaptioningListener); + + final CaptionStyle captionStyle = mManager.getUserStyle(); + final float fontSize = mManager.getFontScale() * getHeight() * LINE_HEIGHT_RATIO; + setCaptionStyle(captionStyle, fontSize); + } else { + mManager.removeCaptioningChangeListener(mCaptioningListener); + } + } + } + + public void setActiveCues(Vector<SubtitleTrack.Cue> activeCues) { + final Context context = getContext(); + final CaptionStyle captionStyle = mCaptionStyle; + final float fontSize = mFontSize; + + prepForPrune(); + + // Ensure we have all necessary cue and region boxes. + final int count = activeCues.size(); + for (int i = 0; i < count; i++) { + final TextTrackCue cue = (TextTrackCue) activeCues.get(i); + final TextTrackRegion region = cue.mRegion; + if (region != null) { + RegionLayout regionBox = mRegionBoxes.get(region); + if (regionBox == null) { + regionBox = new RegionLayout(context, region, captionStyle, fontSize); + mRegionBoxes.put(region, regionBox); + addView(regionBox, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); } - if (lineBuilder.length() > 0) { - text.append(lineBuilder.toString()).append("\n"); - lineBuilder.delete(0, lineBuilder.length()); + regionBox.put(cue); + } else { + CueLayout cueBox = mCueBoxes.get(cue); + if (cueBox == null) { + cueBox = new CueLayout(context, cue, captionStyle, fontSize); + mCueBoxes.put(cue, cueBox); + addView(cueBox, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); } + cueBox.update(); + cueBox.setOrder(i); + } + } + + prune(); + + // Force measurement and layout. + final int width = getWidth(); + final int height = getHeight(); + setSize(width, height); + + if (mListener != null) { + mListener.onChanged(this); + } + } + + private void setCaptionStyle(CaptionStyle captionStyle, float fontSize) { + mCaptionStyle = captionStyle; + mFontSize = fontSize; + + final int cueCount = mCueBoxes.size(); + for (int i = 0; i < cueCount; i++) { + final CueLayout cueBox = mCueBoxes.valueAt(i); + cueBox.setCaptionStyle(captionStyle, fontSize); + } + + final int regionCount = mRegionBoxes.size(); + for (int i = 0; i < regionCount; i++) { + final RegionLayout regionBox = mRegionBoxes.valueAt(i); + regionBox.setCaptionStyle(captionStyle, fontSize); + } + } + + /** + * Remove inactive cues and regions. + */ + private void prune() { + int regionCount = mRegionBoxes.size(); + for (int i = 0; i < regionCount; i++) { + final RegionLayout regionBox = mRegionBoxes.valueAt(i); + if (regionBox.prune()) { + removeView(regionBox); + mRegionBoxes.removeAt(i); + regionCount--; + i--; } } - if (mTextView != null) { - if (DEBUG) Log.d(TAG, "updating to " + text.toString()); - mTextView.setText(text.toString()); - mTextView.postInvalidate(); + int cueCount = mCueBoxes.size(); + for (int i = 0; i < cueCount; i++) { + final CueLayout cueBox = mCueBoxes.valueAt(i); + if (!cueBox.isActive()) { + removeView(cueBox); + mCueBoxes.removeAt(i); + cueCount--; + i--; + } + } + } + + /** + * Reset active cues and regions. + */ + private void prepForPrune() { + final int regionCount = mRegionBoxes.size(); + for (int i = 0; i < regionCount; i++) { + final RegionLayout regionBox = mRegionBoxes.valueAt(i); + regionBox.prepForPrune(); + } + + final int cueCount = mCueBoxes.size(); + for (int i = 0; i < cueCount; i++) { + final CueLayout cueBox = mCueBoxes.valueAt(i); + cueBox.prepForPrune(); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + final int regionCount = mRegionBoxes.size(); + for (int i = 0; i < regionCount; i++) { + final RegionLayout regionBox = mRegionBoxes.valueAt(i); + regionBox.measureForParent(widthMeasureSpec, heightMeasureSpec); + } + + final int cueCount = mCueBoxes.size(); + for (int i = 0; i < cueCount; i++) { + final CueLayout cueBox = mCueBoxes.valueAt(i); + cueBox.measureForParent(widthMeasureSpec, heightMeasureSpec); + } + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + final int viewportWidth = r - l; + final int viewportHeight = b - t; + + setCaptionStyle(mCaptionStyle, + mManager.getFontScale() * LINE_HEIGHT_RATIO * viewportHeight); + + final int regionCount = mRegionBoxes.size(); + for (int i = 0; i < regionCount; i++) { + final RegionLayout regionBox = mRegionBoxes.valueAt(i); + layoutRegion(viewportWidth, viewportHeight, regionBox); + } + + final int cueCount = mCueBoxes.size(); + for (int i = 0; i < cueCount; i++) { + final CueLayout cueBox = mCueBoxes.valueAt(i); + layoutCue(viewportWidth, viewportHeight, cueBox); + } + } + + /** + * Lays out a region within the viewport. The region handles layout for + * contained cues. + */ + private void layoutRegion( + int viewportWidth, int viewportHeight, + RegionLayout regionBox) { + final TextTrackRegion region = regionBox.getRegion(); + final int regionHeight = regionBox.getMeasuredHeight(); + final int regionWidth = regionBox.getMeasuredWidth(); + + // TODO: Account for region anchor point. + final float x = region.mViewportAnchorPointX; + final float y = region.mViewportAnchorPointY; + final int left = (int) (x * (viewportWidth - regionWidth) / 100); + final int top = (int) (y * (viewportHeight - regionHeight) / 100); + + regionBox.layout(left, top, left + regionWidth, top + regionHeight); + } + + /** + * Lays out a cue within the viewport. + */ + private void layoutCue( + int viewportWidth, int viewportHeight, CueLayout cueBox) { + final TextTrackCue cue = cueBox.getCue(); + final int direction = getLayoutDirection(); + final int absAlignment = resolveCueAlignment(direction, cue.mAlignment); + final boolean cueSnapToLines = cue.mSnapToLines; + + int size = 100 * cueBox.getMeasuredWidth() / viewportWidth; + + // Determine raw x-position. + int xPosition; + switch (absAlignment) { + case TextTrackCue.ALIGNMENT_LEFT: + xPosition = cue.mTextPosition; + break; + case TextTrackCue.ALIGNMENT_RIGHT: + xPosition = cue.mTextPosition - size; + break; + case TextTrackCue.ALIGNMENT_MIDDLE: + default: + xPosition = cue.mTextPosition - size / 2; + break; + } + + // Adjust x-position for layout. + if (direction == LAYOUT_DIRECTION_RTL) { + xPosition = 100 - xPosition; + } + + // If the text track cue snap-to-lines flag is set, adjust + // x-position and size for padding. This is equivalent to placing the + // cue within the title-safe area. + if (cueSnapToLines) { + final int paddingLeft = 100 * getPaddingLeft() / viewportWidth; + final int paddingRight = 100 * getPaddingRight() / viewportWidth; + if (xPosition < paddingLeft && xPosition + size > paddingLeft) { + xPosition += paddingLeft; + size -= paddingLeft; + } + final float rightEdge = 100 - paddingRight; + if (xPosition < rightEdge && xPosition + size > rightEdge) { + size -= paddingRight; + } + } + + // Compute absolute left position and width. + final int left = xPosition * viewportWidth / 100; + final int width = size * viewportWidth / 100; + + // Determine initial y-position. + final int yPosition = calculateLinePosition(cueBox); + + // Compute absolute final top position and height. + final int height = cueBox.getMeasuredHeight(); + final int top; + if (yPosition < 0) { + // TODO: This needs to use the actual height of prior boxes. + top = viewportHeight + yPosition * height; + } else { + top = yPosition * (viewportHeight - height) / 100; + } + + // Layout cue in final position. + cueBox.layout(left, top, left + width, top + height); + } + + /** + * Calculates the line position for a cue. + * <p> + * If the resulting position is negative, it represents a bottom-aligned + * position relative to the number of active cues. Otherwise, it represents + * a percentage [0-100] of the viewport height. + */ + private int calculateLinePosition(CueLayout cueBox) { + final TextTrackCue cue = cueBox.getCue(); + final Integer linePosition = cue.mLinePosition; + final boolean snapToLines = cue.mSnapToLines; + final boolean autoPosition = (linePosition == null); + + if (!snapToLines && !autoPosition && (linePosition < 0 || linePosition > 100)) { + // Invalid line position defaults to 100. + return 100; + } else if (!autoPosition) { + // Use the valid, supplied line position. + return linePosition; + } else if (!snapToLines) { + // Automatic, non-snapped line position defaults to 100. + return 100; + } else { + // Automatic snapped line position uses active cue order. + return -(cueBox.mOrder + 1); + } + } + + /** + * Resolves cue alignment according to the specified layout direction. + */ + private static int resolveCueAlignment(int layoutDirection, int alignment) { + switch (alignment) { + case TextTrackCue.ALIGNMENT_START: + return layoutDirection == View.LAYOUT_DIRECTION_LTR ? + TextTrackCue.ALIGNMENT_LEFT : TextTrackCue.ALIGNMENT_RIGHT; + case TextTrackCue.ALIGNMENT_END: + return layoutDirection == View.LAYOUT_DIRECTION_LTR ? + TextTrackCue.ALIGNMENT_RIGHT : TextTrackCue.ALIGNMENT_LEFT; + } + return alignment; + } + + private final CaptioningChangeListener mCaptioningListener = new CaptioningChangeListener() { + @Override + public void onFontScaleChanged(float fontScale) { + final float fontSize = fontScale * getHeight() * LINE_HEIGHT_RATIO; + setCaptionStyle(mCaptionStyle, fontSize); + } + + @Override + public void onUserStyleChanged(CaptionStyle userStyle) { + setCaptionStyle(userStyle, mFontSize); + } + }; + + /** + * A text track region represents a portion of the video viewport and + * provides a rendering area for text track cues. + */ + private static class RegionLayout extends LinearLayout { + private final ArrayList<CueLayout> mRegionCueBoxes = new ArrayList<CueLayout>(); + private final TextTrackRegion mRegion; + + private CaptionStyle mCaptionStyle; + private float mFontSize; + + public RegionLayout(Context context, TextTrackRegion region, CaptionStyle captionStyle, + float fontSize) { + super(context); + + mRegion = region; + mCaptionStyle = captionStyle; + mFontSize = fontSize; + + // TODO: Add support for vertical text + setOrientation(VERTICAL); + + if (DEBUG) { + setBackgroundColor(DEBUG_REGION_BACKGROUND); + } + } + + public void setCaptionStyle(CaptionStyle captionStyle, float fontSize) { + mCaptionStyle = captionStyle; + mFontSize = fontSize; + + final int cueCount = mRegionCueBoxes.size(); + for (int i = 0; i < cueCount; i++) { + final CueLayout cueBox = mRegionCueBoxes.get(i); + cueBox.setCaptionStyle(captionStyle, fontSize); + } + } + + /** + * Performs the parent's measurement responsibilities, then + * automatically performs its own measurement. + */ + public void measureForParent(int widthMeasureSpec, int heightMeasureSpec) { + final TextTrackRegion region = mRegion; + final int specWidth = MeasureSpec.getSize(widthMeasureSpec); + final int specHeight = MeasureSpec.getSize(heightMeasureSpec); + final int width = (int) region.mWidth; + + // Determine the absolute maximum region size as the requested size. + final int size = width * specWidth / 100; + + widthMeasureSpec = MeasureSpec.makeMeasureSpec(size, MeasureSpec.AT_MOST); + heightMeasureSpec = MeasureSpec.makeMeasureSpec(specHeight, MeasureSpec.AT_MOST); + measure(widthMeasureSpec, heightMeasureSpec); + } + + /** + * Prepares this region for pruning by setting all tracks as inactive. + * <p> + * Tracks that are added or updated using {@link #put(TextTrackCue)} + * after this calling this method will be marked as active. + */ + public void prepForPrune() { + final int cueCount = mRegionCueBoxes.size(); + for (int i = 0; i < cueCount; i++) { + final CueLayout cueBox = mRegionCueBoxes.get(i); + cueBox.prepForPrune(); + } + } + + /** + * Adds a {@link TextTrackCue} to this region. If the track had already + * been added, updates its active state. + * + * @param cue + */ + public void put(TextTrackCue cue) { + final int cueCount = mRegionCueBoxes.size(); + for (int i = 0; i < cueCount; i++) { + final CueLayout cueBox = mRegionCueBoxes.get(i); + if (cueBox.getCue() == cue) { + cueBox.update(); + return; + } + } + + final CueLayout cueBox = new CueLayout(getContext(), cue, mCaptionStyle, mFontSize); + addView(cueBox, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + + if (getChildCount() > mRegion.mLines) { + removeViewAt(0); + } + } + + /** + * Remove all inactive tracks from this region. + * + * @return true if this region is empty and should be pruned + */ + public boolean prune() { + int cueCount = mRegionCueBoxes.size(); + for (int i = 0; i < cueCount; i++) { + final CueLayout cueBox = mRegionCueBoxes.get(i); + if (!cueBox.isActive()) { + mRegionCueBoxes.remove(i); + removeView(cueBox); + cueCount--; + i--; + } + } + + return mRegionCueBoxes.isEmpty(); + } + + /** + * @return the region data backing this layout + */ + public TextTrackRegion getRegion() { + return mRegion; + } + } + + /** + * A text track cue is the unit of time-sensitive data in a text track, + * corresponding for instance for subtitles and captions to the text that + * appears at a particular time and disappears at another time. + * <p> + * A single cue may contain multiple {@link SpanLayout}s, each representing a + * single line of text. + */ + private static class CueLayout extends LinearLayout { + public final TextTrackCue mCue; + + private CaptionStyle mCaptionStyle; + private float mFontSize; + + private boolean mActive; + private int mOrder; + + public CueLayout( + Context context, TextTrackCue cue, CaptionStyle captionStyle, float fontSize) { + super(context); + + mCue = cue; + mCaptionStyle = captionStyle; + mFontSize = fontSize; + + // TODO: Add support for vertical text. + final boolean horizontal = cue.mWritingDirection + == TextTrackCue.WRITING_DIRECTION_HORIZONTAL; + setOrientation(horizontal ? VERTICAL : HORIZONTAL); + + switch (cue.mAlignment) { + case TextTrackCue.ALIGNMENT_END: + setGravity(Gravity.END); + break; + case TextTrackCue.ALIGNMENT_LEFT: + setGravity(Gravity.LEFT); + break; + case TextTrackCue.ALIGNMENT_MIDDLE: + setGravity(horizontal + ? Gravity.CENTER_HORIZONTAL : Gravity.CENTER_VERTICAL); + break; + case TextTrackCue.ALIGNMENT_RIGHT: + setGravity(Gravity.RIGHT); + break; + case TextTrackCue.ALIGNMENT_START: + setGravity(Gravity.START); + break; + } + + if (DEBUG) { + setBackgroundColor(DEBUG_CUE_BACKGROUND); + } + + update(); + } + + public void setCaptionStyle(CaptionStyle style, float fontSize) { + mCaptionStyle = style; + mFontSize = fontSize; + + final int n = getChildCount(); + for (int i = 0; i < n; i++) { + final View child = getChildAt(i); + if (child instanceof SpanLayout) { + ((SpanLayout) child).setCaptionStyle(style, fontSize); + } + } + } + + public void prepForPrune() { + mActive = false; + } + + public void update() { + mActive = true; + + removeAllViews(); + + final CaptionStyle captionStyle = mCaptionStyle; + final float fontSize = mFontSize; + final TextTrackCueSpan[][] lines = mCue.mLines; + final int lineCount = lines.length; + for (int i = 0; i < lineCount; i++) { + final SpanLayout lineBox = new SpanLayout(getContext(), lines[i]); + lineBox.setCaptionStyle(captionStyle, fontSize); + + addView(lineBox, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + /** + * Performs the parent's measurement responsibilities, then + * automatically performs its own measurement. + */ + public void measureForParent(int widthMeasureSpec, int heightMeasureSpec) { + final TextTrackCue cue = mCue; + final int specWidth = MeasureSpec.getSize(widthMeasureSpec); + final int specHeight = MeasureSpec.getSize(heightMeasureSpec); + final int direction = getLayoutDirection(); + final int absAlignment = resolveCueAlignment(direction, cue.mAlignment); + + // Determine the maximum size of cue based on its starting position + // and the direction in which it grows. + final int maximumSize; + switch (absAlignment) { + case TextTrackCue.ALIGNMENT_LEFT: + maximumSize = 100 - cue.mTextPosition; + break; + case TextTrackCue.ALIGNMENT_RIGHT: + maximumSize = cue.mTextPosition; + break; + case TextTrackCue.ALIGNMENT_MIDDLE: + if (cue.mTextPosition <= 50) { + maximumSize = cue.mTextPosition * 2; + } else { + maximumSize = (100 - cue.mTextPosition) * 2; + } + break; + default: + maximumSize = 0; + } + + // Determine absolute maximum cue size as the smaller of the + // requested size and the maximum theoretical size. + final int size = Math.min(cue.mSize, maximumSize) * specWidth / 100; + widthMeasureSpec = MeasureSpec.makeMeasureSpec(size, MeasureSpec.AT_MOST); + heightMeasureSpec = MeasureSpec.makeMeasureSpec(specHeight, MeasureSpec.AT_MOST); + measure(widthMeasureSpec, heightMeasureSpec); + } + + /** + * Sets the order of this cue in the list of active cues. + * + * @param order the order of this cue in the list of active cues + */ + public void setOrder(int order) { + mOrder = order; + } + + /** + * @return whether this cue is marked as active + */ + public boolean isActive() { + return mActive; + } + + /** + * @return the cue data backing this layout + */ + public TextTrackCue getCue() { + return mCue; + } + } + + /** + * A text track line represents a single line of text within a cue. + * <p> + * A single line may contain multiple spans, each representing a section of + * text that may be enabled or disabled at a particular time. + */ + private static class SpanLayout extends SubtitleView { + private final SpannableStringBuilder mBuilder = new SpannableStringBuilder(); + private final TextTrackCueSpan[] mSpans; + + public SpanLayout(Context context, TextTrackCueSpan[] spans) { + super(context); + + mSpans = spans; + + update(); + } + + public void update() { + final SpannableStringBuilder builder = mBuilder; + final TextTrackCueSpan[] spans = mSpans; + + builder.clear(); + builder.clearSpans(); + + final int spanCount = spans.length; + for (int i = 0; i < spanCount; i++) { + final TextTrackCueSpan span = spans[i]; + if (span.mEnabled) { + builder.append(spans[i].mText); + } + } + + setText(builder); + } + + public void setCaptionStyle(CaptionStyle captionStyle, float fontSize) { + setBackgroundColor(captionStyle.backgroundColor); + setForegroundColor(captionStyle.foregroundColor); + setEdgeColor(captionStyle.edgeColor); + setEdgeType(captionStyle.edgeType); + setTypeface(captionStyle.getTypeface()); + setTextSize(fontSize); } } } diff --git a/packages/DocumentsUI/Android.mk b/packages/DocumentsUI/Android.mk index 79009532f315..2f97809c1818 100644 --- a/packages/DocumentsUI/Android.mk +++ b/packages/DocumentsUI/Android.mk @@ -3,7 +3,7 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional -LOCAL_SRC_FILES := $(call all-subdir-java-files) +LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 guava diff --git a/packages/DocumentsUI/res/drawable-hdpi/drawer_shadow.9.png b/packages/DocumentsUI/res/drawable-hdpi/drawer_shadow.9.png Binary files differdeleted file mode 100644 index 224cc4ff43a2..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/drawer_shadow.9.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_breadcrumb_arrow.png b/packages/DocumentsUI/res/drawable-hdpi/ic_breadcrumb_arrow.png Binary files differnew file mode 100644 index 000000000000..8a170b04b8e7 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_breadcrumb_arrow.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_accept.png b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_accept.png Binary files differindex 234ca8a41f22..a7726e7da762 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_accept.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_accept.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_cancel.png b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_cancel.png Binary files differnew file mode 100644 index 000000000000..658a6ddce4f3 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_cancel.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_remove_field_holo_light.png b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_remove_field_holo_light.png Binary files differdeleted file mode 100644 index c9fa5c61d0a5..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_remove_field_holo_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_select_item.png b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_select_item.png Binary files differindex e9bd0105f1b5..57b3069b24b5 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_select_item.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_select_item.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert.png b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert.png Binary files differnew file mode 100644 index 000000000000..40b4326e915a --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_dir.png b/packages/DocumentsUI/res/drawable-hdpi/ic_dir.png Binary files differdeleted file mode 100644 index aabeda688c61..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_dir.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_apk.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_apk.png Binary files differindex 5bda872ab124..36fccad99c7a 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_apk.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_apk.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio.png Binary files differindex 38e315a66f47..3aba859ed8d2 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_certificate.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_certificate.png Binary files differindex c6e95827cf0a..778f9ba2d39e 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_certificate.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_certificate.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_codes.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_codes.png Binary files differindex c5a748b10201..65b03d183bde 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_codes.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_codes.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_compressed.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_compressed.png Binary files differindex a59bd235d5de..e9719b86ddc1 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_compressed.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_compressed.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_contact.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_contact.png Binary files differindex 87799c69daed..4b2107c4ad70 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_contact.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_contact.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_event.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_event.png Binary files differindex a3bbc0ffeb40..9ca3b359c7f4 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_event.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_event.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_font.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_font.png Binary files differindex 56133d4677e9..dc3bebcece5e 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_font.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_font.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_image.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_image.png Binary files differindex e655d0480c2f..69afe0664ee8 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_image.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_image.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_pdf.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_pdf.png Binary files differindex 9ce032f8b1b3..c86b92d0708b 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_pdf.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_pdf.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_presentation.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_presentation.png Binary files differindex 53bfc52d491c..9b9729b95007 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_presentation.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_presentation.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_spreadsheet.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_spreadsheet.png Binary files differindex 5a49de8493e5..ab917cefa2a5 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_spreadsheet.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_spreadsheet.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_text.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_text.png Binary files differindex af79de900d7d..9b96b2f79295 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_text.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_text.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_video.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_video.png Binary files differindex a0676d70c943..89a0d37e61b2 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_video.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_video.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow.9.png b/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow.9.png Binary files differnew file mode 100644 index 000000000000..594ce697884d --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow.9.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow_tablet.9.png b/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow_tablet.9.png Binary files differnew file mode 100644 index 000000000000..6ee47a9cd9e7 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow_tablet.9.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_grid_card_background.9.png b/packages/DocumentsUI/res/drawable-hdpi/ic_grid_card_background.9.png Binary files differnew file mode 100644 index 000000000000..8797e942c73a --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_grid_card_background.9.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_grid_gradient_bg.9.png b/packages/DocumentsUI/res/drawable-hdpi/ic_grid_gradient_bg.9.png Binary files differnew file mode 100644 index 000000000000..4b9eeb0eacaa --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_grid_gradient_bg.9.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_copy.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_copy.png Binary files differnew file mode 100644 index 000000000000..85b60acdc495 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_copy.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_delete.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_delete.png Binary files differnew file mode 100644 index 000000000000..3a039e097590 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_delete.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_disconnect.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_disconnect.png Binary files differindex 4736da16d75d..164d2de4b94b 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_disconnect.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_disconnect.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_edit_holo.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_edit_holo.png Binary files differdeleted file mode 100644 index 50ac93550a88..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_edit_holo.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder.png Binary files differindex 00faf9ddf462..06adf31a46ab 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_rename.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_rename.png Binary files differnew file mode 100644 index 000000000000..e8b000ceefe7 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_rename.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search.png Binary files differnew file mode 100644 index 000000000000..a5ed309adb25 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search_holo_light.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search_holo_light.png Binary files differdeleted file mode 100644 index cc661e3ae1f9..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search_holo_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_settings.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_settings.png Binary files differnew file mode 100644 index 000000000000..240636600964 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_settings.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_share.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_share.png Binary files differnew file mode 100644 index 000000000000..61b709972544 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_share.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_share_holo_light_icononly.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_share_holo_light_icononly.png Binary files differdeleted file mode 100644 index 527e43c8e772..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_share_holo_light_icononly.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby.png Binary files differnew file mode 100644 index 000000000000..05df3d7baaee --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby_holo_light.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby_holo_light.png Binary files differdeleted file mode 100644 index 9421792d9e76..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby_holo_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_trash_holo_light.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_trash_holo_light.png Binary files differdeleted file mode 100644 index f662f94aa8d1..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_trash_holo_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_revert_holo_light.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_undo.png Binary files differindex e9c0b01d7a14..6ac9dc184581 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_revert_holo_light.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_undo.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid.png Binary files differindex 2c59d609597d..0779f5c5537c 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list.png Binary files differindex 0dbb0750d7be..ab7e5cb0afc8 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_open.png b/packages/DocumentsUI/res/drawable-hdpi/ic_open.png Binary files differnew file mode 100644 index 000000000000..17f4a4143d61 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_open.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_perm_group_system_tools.png b/packages/DocumentsUI/res/drawable-hdpi/ic_perm_group_system_tools.png Binary files differdeleted file mode 100644 index 3905d0e93d69..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_perm_group_system_tools.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_download.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_download.png Binary files differindex e927efa78184..baf581064eb2 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_root_download.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_download.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder.png Binary files differnew file mode 100644 index 000000000000..4ee96b967f99 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent.png Binary files differindex d23e617b2cc7..5374e277608e 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard.png Binary files differnew file mode 100644 index 000000000000..caf580300dea --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_usb.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_usb.png Binary files differindex d8c51d73e706..cfa69f1cdcdf 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_root_usb.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_usb.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_subdirectory_arrow.png b/packages/DocumentsUI/res/drawable-hdpi/ic_subdirectory_arrow.png Binary files differnew file mode 100644 index 000000000000..f5c5f1843d3b --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_subdirectory_arrow.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/stat_notify_sdcard_light.png b/packages/DocumentsUI/res/drawable-hdpi/stat_notify_sdcard_light.png Binary files differdeleted file mode 100644 index 9c9a7de5001c..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/stat_notify_sdcard_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_breadcrumb_arrow.png b/packages/DocumentsUI/res/drawable-mdpi/ic_breadcrumb_arrow.png Binary files differnew file mode 100644 index 000000000000..623d9db50e60 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_breadcrumb_arrow.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_accept.png b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_accept.png Binary files differindex ad761e13c543..11779bbc1da5 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_accept.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_accept.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_cancel.png b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_cancel.png Binary files differnew file mode 100644 index 000000000000..bebd8030b6da --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_cancel.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_remove_field_holo_light.png b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_remove_field_holo_light.png Binary files differdeleted file mode 100644 index 7c29b715bb4e..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_remove_field_holo_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_select_item.png b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_select_item.png Binary files differindex dff246a677be..af2412f7a1ae 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_select_item.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_select_item.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert.png b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert.png Binary files differnew file mode 100644 index 000000000000..b092ea09558f --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_apk.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_apk.png Binary files differindex 26212e9a8103..1c6f8d154c9b 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_apk.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_apk.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio.png Binary files differindex db9fa8bd977a..40cdc7672413 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_certificate.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_certificate.png Binary files differindex 87877fe618af..94339f4d6941 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_certificate.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_certificate.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_codes.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_codes.png Binary files differindex d552234cfddb..a84490c9500f 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_codes.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_codes.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_compressed.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_compressed.png Binary files differindex 75c304a51f54..f827d6d93c39 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_compressed.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_compressed.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_contact.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_contact.png Binary files differindex 849d8e745e7f..33f1367f7385 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_contact.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_contact.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_event.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_event.png Binary files differindex 43044896cc67..65977857318b 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_event.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_event.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_font.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_font.png Binary files differindex e1ad89f7fb10..8b1cded3b9f2 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_font.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_font.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_image.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_image.png Binary files differindex 914ed4b75104..021743058d60 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_image.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_image.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_pdf.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_pdf.png Binary files differindex dfdeb264b373..ff510968cff1 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_pdf.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_pdf.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_presentation.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_presentation.png Binary files differindex 0bcbca4259bf..08605521606f 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_presentation.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_presentation.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_spreadsheet.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_spreadsheet.png Binary files differindex 9e00ea103ff4..7431e83d3d9e 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_spreadsheet.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_spreadsheet.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_text.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_text.png Binary files differindex e2caba79d291..c540a80ce111 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_text.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_text.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_video.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_video.png Binary files differindex 6393df6762fe..ab0222a5d4f9 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_video.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_video.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow.9.png b/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow.9.png Binary files differnew file mode 100644 index 000000000000..99a302695fa7 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow.9.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow_tablet.9.png b/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow_tablet.9.png Binary files differnew file mode 100644 index 000000000000..b85d70be757f --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow_tablet.9.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_grid_card_background.9.png b/packages/DocumentsUI/res/drawable-mdpi/ic_grid_card_background.9.png Binary files differnew file mode 100644 index 000000000000..d632b585ed90 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_grid_card_background.9.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_grid_gradient_bg.9.png b/packages/DocumentsUI/res/drawable-mdpi/ic_grid_gradient_bg.9.png Binary files differnew file mode 100644 index 000000000000..792b269c7c47 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_grid_gradient_bg.9.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_copy.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_copy.png Binary files differnew file mode 100644 index 000000000000..ea1ea522d76f --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_copy.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_delete.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_delete.png Binary files differnew file mode 100644 index 000000000000..999232133151 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_delete.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_disconnect.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_disconnect.png Binary files differindex 64e8592fe255..cb0978234010 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_disconnect.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_disconnect.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_edit_holo.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_edit_holo.png Binary files differdeleted file mode 100644 index 8a2af67f84eb..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_edit_holo.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder.png Binary files differindex 2b7e5caecfdd..65dfaa6c3b75 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_rename.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_rename.png Binary files differnew file mode 100644 index 000000000000..a56b7763995f --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_rename.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search.png Binary files differnew file mode 100644 index 000000000000..4e442403965b --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search_holo_light.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search_holo_light.png Binary files differdeleted file mode 100644 index 0350a43b82e7..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search_holo_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_settings.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_settings.png Binary files differnew file mode 100644 index 000000000000..67f8e4d467dc --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_settings.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_share.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_share.png Binary files differnew file mode 100644 index 000000000000..ecd5a172863d --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_share.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_share_holo_light_icononly.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_share_holo_light_icononly.png Binary files differdeleted file mode 100644 index a15ef6abc98a..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_share_holo_light_icononly.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby.png Binary files differnew file mode 100644 index 000000000000..549a381c5e80 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby_holo_light.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby_holo_light.png Binary files differdeleted file mode 100644 index 9d724f4de37e..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby_holo_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_trash_holo_light.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_trash_holo_light.png Binary files differdeleted file mode 100644 index 3cc00bbfa23e..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_trash_holo_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_revert_holo_light.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_undo.png Binary files differindex 5d7e1a5fb903..43b722013262 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_revert_holo_light.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_undo.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid.png Binary files differindex b6d1a9a1f6eb..0e40d89f7c81 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list.png Binary files differindex 714d5e83e3f9..d0c171747c72 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_open.png b/packages/DocumentsUI/res/drawable-mdpi/ic_open.png Binary files differnew file mode 100644 index 000000000000..56cfa49d1d88 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_open.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_perm_group_system_tools.png b/packages/DocumentsUI/res/drawable-mdpi/ic_perm_group_system_tools.png Binary files differdeleted file mode 100644 index 5d9d978dbdf5..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_perm_group_system_tools.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_download.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_download.png Binary files differindex 110d78d1126b..60ebeef6e886 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_root_download.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_download.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder.png Binary files differnew file mode 100644 index 000000000000..944de5b8f24e --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent.png Binary files differindex 47c4f29fd21f..45f7e0b5553d 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard.png Binary files differnew file mode 100644 index 000000000000..3b065f3acb99 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_usb.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_usb.png Binary files differindex be47b989ef5b..fb83d5d744e8 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_root_usb.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_usb.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_subdirectory_arrow.png b/packages/DocumentsUI/res/drawable-mdpi/ic_subdirectory_arrow.png Binary files differnew file mode 100644 index 000000000000..276f00da8cd6 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_subdirectory_arrow.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/stat_notify_sdcard_light.png b/packages/DocumentsUI/res/drawable-mdpi/stat_notify_sdcard_light.png Binary files differdeleted file mode 100644 index 39dd0fa197a0..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/stat_notify_sdcard_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_breadcrumb_arrow.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_breadcrumb_arrow.png Binary files differnew file mode 100644 index 000000000000..9109320fad15 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_breadcrumb_arrow.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_accept.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_accept.png Binary files differindex 47398d336219..89e580b4c811 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_accept.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_accept.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_cancel.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_cancel.png Binary files differnew file mode 100644 index 000000000000..d35b8021ab59 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_cancel.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_remove_field_holo_light.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_remove_field_holo_light.png Binary files differdeleted file mode 100644 index 2959e5ea2606..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_remove_field_holo_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_select_item.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_select_item.png Binary files differindex 2b4891c8453b..254cb18806ea 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_select_item.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_select_item.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert.png Binary files differnew file mode 100644 index 000000000000..d824bb0a1a42 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_apk.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_apk.png Binary files differindex 5abdd4c01ada..baded5e44060 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_apk.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_apk.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio.png Binary files differindex 7975acd6a012..908aafb0b505 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_certificate.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_certificate.png Binary files differindex 59a7305916ae..1c3dee4b1cb2 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_certificate.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_certificate.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_codes.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_codes.png Binary files differindex 468431e09c99..a06820956795 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_codes.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_codes.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_compressed.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_compressed.png Binary files differindex 4db47a6eec19..af0e36da2ffb 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_compressed.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_compressed.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_contact.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_contact.png Binary files differindex ded1a00399b6..e6833dc1dce9 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_contact.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_contact.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_event.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_event.png Binary files differindex 46094633651e..ff67036ef6da 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_event.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_event.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_font.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_font.png Binary files differindex dda7f069b80b..aaca230b951d 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_font.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_font.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_image.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_image.png Binary files differindex 44b40f70197a..5221393cb6b7 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_image.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_image.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_pdf.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_pdf.png Binary files differindex a59b10296f8d..518e5916027f 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_pdf.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_pdf.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_presentation.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_presentation.png Binary files differindex 062fe0396656..5c4edf6ef033 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_presentation.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_presentation.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_spreadsheet.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_spreadsheet.png Binary files differindex 82bda589d4e1..d10dcf7a7e89 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_spreadsheet.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_spreadsheet.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_text.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_text.png Binary files differindex 6f15709110fb..f15cdfbaedb5 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_text.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_text.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_video.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_video.png Binary files differindex cdd80520e00d..f751be7c9bff 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_video.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_video.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow.9.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow.9.png Binary files differnew file mode 100644 index 000000000000..96acf3560925 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow.9.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow_tablet.9.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow_tablet.9.png Binary files differnew file mode 100644 index 000000000000..d21193accd76 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow_tablet.9.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_card_background.9.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_card_background.9.png Binary files differnew file mode 100644 index 000000000000..2655912c2ee0 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_card_background.9.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_gradient_bg.9.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_gradient_bg.9.png Binary files differnew file mode 100644 index 000000000000..450a486616d3 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_gradient_bg.9.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_copy.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_copy.png Binary files differnew file mode 100644 index 000000000000..946e450eeb0c --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_copy.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_delete.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_delete.png Binary files differnew file mode 100644 index 000000000000..7ab538f60aad --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_delete.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_disconnect.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_disconnect.png Binary files differindex a96a0f877ce0..904672a06dce 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_disconnect.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_disconnect.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_edit_holo.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_edit_holo.png Binary files differdeleted file mode 100644 index 4652da60cac3..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_edit_holo.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder.png Binary files differindex 449ae53d13a4..4af42d43f101 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_rename.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_rename.png Binary files differnew file mode 100644 index 000000000000..b63b70cf7160 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_rename.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search.png Binary files differnew file mode 100644 index 000000000000..9dd1938fbf59 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search_holo_light.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search_holo_light.png Binary files differdeleted file mode 100644 index 681178271441..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search_holo_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_settings.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_settings.png Binary files differnew file mode 100644 index 000000000000..bba370e97154 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_settings.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_share.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_share.png Binary files differnew file mode 100644 index 000000000000..bdd8e20e9669 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_share.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_share_holo_light_icononly.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_share_holo_light_icononly.png Binary files differdeleted file mode 100644 index 939ea21224c3..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_share_holo_light_icononly.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby.png Binary files differnew file mode 100644 index 000000000000..a23bee493bce --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby_holo_light.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby_holo_light.png Binary files differdeleted file mode 100644 index 5241a30bddb3..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby_holo_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_trash_holo_light.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_trash_holo_light.png Binary files differdeleted file mode 100644 index c985a278f9d6..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_trash_holo_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_revert_holo_light.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_undo.png Binary files differindex ca67f6240e95..34a0e33330fd 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_revert_holo_light.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_undo.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid.png Binary files differindex b219d060671a..c955fc3682ec 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list.png Binary files differindex 897740eb60d5..a23c73aaecce 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_open.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_open.png Binary files differnew file mode 100644 index 000000000000..b64d8f1fdceb --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_open.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_perm_group_system_tools.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_perm_group_system_tools.png Binary files differdeleted file mode 100644 index 5dc35da66bb1..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_perm_group_system_tools.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download.png Binary files differindex 2c30b7f73bc8..f66739d73d58 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder.png Binary files differnew file mode 100644 index 000000000000..4d5564cf9ed8 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent.png Binary files differindex a87ccb8f6f44..7e24377b362b 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard.png Binary files differnew file mode 100644 index 000000000000..0ce9f9ff6a74 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_usb.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_usb.png Binary files differindex 116da46288f8..dde7586a945e 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_usb.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_usb.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_subdirectory_arrow.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_subdirectory_arrow.png Binary files differnew file mode 100644 index 000000000000..7f3364d65d1a --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_subdirectory_arrow.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/stat_notify_sdcard_light.png b/packages/DocumentsUI/res/drawable-xhdpi/stat_notify_sdcard_light.png Binary files differdeleted file mode 100644 index 671a204f771c..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/stat_notify_sdcard_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_breadcrumb_arrow.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_breadcrumb_arrow.png Binary files differnew file mode 100644 index 000000000000..06681e3c1c35 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_breadcrumb_arrow.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_accept.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_accept.png Binary files differindex ca5b1acd57ba..ac88818c154b 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_accept.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_accept.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_cancel.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_cancel.png Binary files differnew file mode 100644 index 000000000000..88356c7c03b6 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_cancel.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_remove_field_holo_light.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_remove_field_holo_light.png Binary files differdeleted file mode 100644 index 953438d583bf..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_remove_field_holo_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_select_item.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_select_item.png Binary files differindex 8679156a714e..75658db58dc0 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_select_item.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_select_item.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert.png Binary files differnew file mode 100644 index 000000000000..887b1b5a3a23 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_apk.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_apk.png Binary files differindex 45bce0860b6e..4eaf6ce690cc 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_apk.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_apk.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio.png Binary files differindex e23269741f12..3659f4a2984f 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_certificate.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_certificate.png Binary files differindex efcaa87bee43..68e619e6c45d 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_certificate.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_certificate.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_codes.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_codes.png Binary files differindex edaf35e55dff..0ec4e8677ab4 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_codes.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_codes.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_compressed.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_compressed.png Binary files differindex 73f6a1b0e24f..bf49d787fcc2 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_compressed.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_compressed.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_contact.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_contact.png Binary files differindex 7f93d7644baf..bdd99d698f63 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_contact.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_contact.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_event.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_event.png Binary files differindex 55cb3ecc1e73..77a0faec5c50 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_event.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_event.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_font.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_font.png Binary files differindex 62b612ab7a1f..30d2c4c383c5 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_font.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_font.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_image.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_image.png Binary files differindex 1a5c481ab85d..599196897251 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_image.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_image.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_pdf.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_pdf.png Binary files differindex 29d0b33dab1f..dd94ddadbffe 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_pdf.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_pdf.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_presentation.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_presentation.png Binary files differindex cec53f220642..c09d6ab855c3 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_presentation.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_presentation.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_spreadsheet.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_spreadsheet.png Binary files differindex 220bddb465e1..2170e666d1fa 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_spreadsheet.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_spreadsheet.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_text.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_text.png Binary files differindex 76a1bb523b1a..84960b9a901a 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_text.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_text.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_video.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_video.png Binary files differindex 20e23c9d36f5..42d8ec174bef 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_video.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_video.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow.9.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow.9.png Binary files differnew file mode 100644 index 000000000000..97fd9d6c81d2 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow.9.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow_tablet.9.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow_tablet.9.png Binary files differnew file mode 100644 index 000000000000..3c9579097fdf --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow_tablet.9.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_card_background.9.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_card_background.9.png Binary files differnew file mode 100644 index 000000000000..7bbaf9dc4f7c --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_card_background.9.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_gradient_bg.9.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_gradient_bg.9.png Binary files differnew file mode 100644 index 000000000000..988c85630ded --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_gradient_bg.9.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_copy.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_copy.png Binary files differnew file mode 100644 index 000000000000..2a0cfc29f2b2 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_copy.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_delete.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_delete.png Binary files differnew file mode 100644 index 000000000000..f4dca7f0bea8 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_delete.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_disconnect.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_disconnect.png Binary files differindex aeace0505803..676d0f76972b 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_disconnect.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_disconnect.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_edit_holo.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_edit_holo.png Binary files differdeleted file mode 100644 index 71bcdbff6d04..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_edit_holo.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder.png Binary files differindex 073744229b66..fb407077bdc4 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_rename.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_rename.png Binary files differnew file mode 100644 index 000000000000..140abba0f8c6 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_rename.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_revert_holo_light.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_revert_holo_light.png Binary files differdeleted file mode 100644 index ced603248479..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_revert_holo_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search.png Binary files differnew file mode 100644 index 000000000000..6079806c2df0 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search_holo_light.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search_holo_light.png Binary files differdeleted file mode 100644 index c69d52630e9c..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search_holo_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_settings.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_settings.png Binary files differnew file mode 100644 index 000000000000..ecd7de143c6f --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_settings.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_share.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_share.png Binary files differnew file mode 100644 index 000000000000..0a3ac2e3fe19 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_share.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_share_holo_light_icononly.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_share_holo_light_icononly.png Binary files differdeleted file mode 100644 index a3f9a5c8d0a7..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_share_holo_light_icononly.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby.png Binary files differnew file mode 100644 index 000000000000..358f97a24e88 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby_holo_light.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby_holo_light.png Binary files differdeleted file mode 100644 index 9810a1e79a94..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby_holo_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_trash_holo_light.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_trash_holo_light.png Binary files differdeleted file mode 100644 index 1811be8d4589..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_trash_holo_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_undo.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_undo.png Binary files differnew file mode 100644 index 000000000000..fd0a194685c4 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_undo.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid.png Binary files differindex 2c58b5e48ec4..11ec8da25bbb 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list.png Binary files differindex cf320cdf5661..ed3b0c52518f 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_open.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_open.png Binary files differnew file mode 100644 index 000000000000..b467962459bf --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_open.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_perm_group_system_tools.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_perm_group_system_tools.png Binary files differdeleted file mode 100644 index cee2b058eca9..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_perm_group_system_tools.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download.png Binary files differindex f9fe2bef6691..f22a94a2531a 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder.png Binary files differnew file mode 100644 index 000000000000..077c851cee28 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent.png Binary files differindex d95ebb5416d7..09cac0e9cfe7 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard.png Binary files differnew file mode 100644 index 000000000000..53492525ff11 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_usb.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_usb.png Binary files differindex 6fbc3c870dac..6deafc70c1da 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_usb.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_usb.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_subdirectory_arrow.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_subdirectory_arrow.png Binary files differnew file mode 100644 index 000000000000..8710c683666b --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_subdirectory_arrow.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/stat_notify_sdcard_light.png b/packages/DocumentsUI/res/drawable-xxhdpi/stat_notify_sdcard_light.png Binary files differdeleted file mode 100644 index 8b8b22732051..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/stat_notify_sdcard_light.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable/item_doc_grid.xml b/packages/DocumentsUI/res/drawable/item_doc_grid.xml new file mode 100644 index 000000000000..3f036f7a21bd --- /dev/null +++ b/packages/DocumentsUI/res/drawable/item_doc_grid.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:drawable="@drawable/ic_grid_card_background" /> +</selector> diff --git a/packages/DocumentsUI/res/drawable/item_root.xml b/packages/DocumentsUI/res/drawable/item_root.xml new file mode 100644 index 000000000000..183d273ca749 --- /dev/null +++ b/packages/DocumentsUI/res/drawable/item_root.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true" android:drawable="@color/item_root_activated" /> + <item android:state_activated="true" android:drawable="@color/item_root_activated" /> + <item android:state_focused="true" android:drawable="@color/item_root_activated" /> + <item android:drawable="@android:color/white" /> +</selector> diff --git a/packages/DocumentsUI/res/layout/fragment_directory.xml b/packages/DocumentsUI/res/layout/fragment_directory.xml index 67c5954fd89d..881349bf9eea 100644 --- a/packages/DocumentsUI/res/layout/fragment_directory.xml +++ b/packages/DocumentsUI/res/layout/fragment_directory.xml @@ -38,8 +38,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:listSelector="@android:color/transparent" - android:paddingTop="?android:attr/listPreferredItemPaddingStart" - android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:visibility="gone" /> <Button diff --git a/packages/DocumentsUI/res/layout/item_doc_grid.xml b/packages/DocumentsUI/res/layout/item_doc_grid.xml index 244214ba5bb5..8d1fc9aa34fd 100644 --- a/packages/DocumentsUI/res/layout/item_doc_grid.xml +++ b/packages/DocumentsUI/res/layout/item_doc_grid.xml @@ -16,110 +16,111 @@ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="180dip" - android:paddingBottom="?android:attr/listPreferredItemPaddingEnd" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> + android:layout_height="@dimen/grid_height" + android:background="@drawable/item_doc_grid" + android:foreground="@drawable/item_background"> - <FrameLayout + <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/chip" - android:foreground="@drawable/item_background" - android:duplicateParentState="true"> + android:paddingBottom="6dp" + android:orientation="vertical"> - <LinearLayout + <FrameLayout android:layout_width="match_parent" - android:layout_height="match_parent" - android:paddingBottom="6dp" - android:orientation="vertical"> + android:layout_height="0dip" + android:layout_weight="1" + android:background="#fff"> <ImageView android:id="@android:id/icon" android:layout_width="match_parent" - android:layout_height="0dip" - android:layout_weight="1" - android:background="#bbb" + android:layout_height="match_parent" android:scaleType="centerInside" android:contentDescription="@null" /> + <ImageView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:scaleType="fitXY" + android:src="@drawable/ic_grid_gradient_bg" + android:contentDescription="@null" /> + + </FrameLayout> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:paddingTop="6dp" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> + <TextView android:id="@android:id/title" - android:layout_width="match_parent" + android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_weight="1" android:singleLine="true" android:ellipsize="marquee" - android:paddingTop="6dp" - android:paddingStart="?android:attr/listPreferredItemPaddingStart" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" - android:textAppearance="?android:attr/textAppearanceSmall" + android:textAppearance="?android:attr/textAppearanceMedium" android:textAlignment="viewStart" /> - <LinearLayout - android:id="@+id/summary_grid" - android:layout_width="match_parent" + <ImageView + android:id="@android:id/icon1" + android:layout_width="@dimen/root_icon_size" + android:layout_height="@dimen/root_icon_size" + android:layout_marginStart="8dip" + android:scaleType="centerInside" + android:contentDescription="@null" /> + + </LinearLayout> + + <LinearLayout + android:id="@+id/line2" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> + + <TextView + android:id="@+id/date" + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:orientation="horizontal" - android:paddingStart="?android:attr/listPreferredItemPaddingStart" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> - - <ImageView - android:id="@android:id/icon1" - android:layout_width="24dip" - android:layout_height="24dip" - android:layout_marginEnd="6dip" - android:scaleType="centerInside" - android:contentDescription="@null" /> - - <TextView - android:id="@android:id/summary" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:layout_gravity="center_vertical" - android:singleLine="true" - android:ellipsize="marquee" - android:textAlignment="viewStart" - android:textAppearance="?android:attr/textAppearanceSmall" /> - - </LinearLayout> - - <LinearLayout - android:layout_width="match_parent" + android:layout_gravity="center_vertical" + android:minWidth="80dp" + android:singleLine="true" + android:ellipsize="marquee" + android:textAlignment="viewStart" + android:textAppearance="?android:attr/textAppearanceSmall" /> + + <TextView + android:id="@+id/size" + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:orientation="horizontal" - android:paddingStart="?android:attr/listPreferredItemPaddingStart" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> - - <View - android:layout_width="0dip" - android:layout_height="0dip" - android:layout_weight="1" /> - - <TextView - android:id="@+id/size" - android:layout_width="70dp" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout_marginEnd="8dp" - android:singleLine="true" - android:ellipsize="marquee" - android:textAlignment="viewEnd" - android:textAppearance="?android:attr/textAppearanceSmall" /> - - <TextView - android:id="@+id/date" - android:layout_width="70dp" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:singleLine="true" - android:ellipsize="marquee" - android:textAlignment="viewEnd" - android:textAppearance="?android:attr/textAppearanceSmall" /> - - </LinearLayout> + android:layout_gravity="center_vertical" + android:layout_marginStart="8dp" + android:minWidth="80dp" + android:singleLine="true" + android:ellipsize="marquee" + android:textAlignment="viewStart" + android:textAppearance="?android:attr/textAppearanceSmall" /> + + <TextView + android:id="@android:id/summary" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:layout_gravity="center_vertical" + android:layout_marginStart="8dp" + android:singleLine="true" + android:ellipsize="marquee" + android:textAlignment="viewStart" + android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout> - </FrameLayout> + </LinearLayout> </FrameLayout> diff --git a/packages/DocumentsUI/res/layout/item_doc_list.xml b/packages/DocumentsUI/res/layout/item_doc_list.xml index 37c588129ec7..8372eedb56d7 100644 --- a/packages/DocumentsUI/res/layout/item_doc_list.xml +++ b/packages/DocumentsUI/res/layout/item_doc_list.xml @@ -27,9 +27,10 @@ <ImageView android:id="@android:id/icon" - android:layout_width="@android:dimen/app_icon_size" - android:layout_height="@android:dimen/app_icon_size" - android:layout_marginEnd="8dip" + android:layout_width="@dimen/icon_size" + android:layout_height="@dimen/icon_size" + android:layout_marginStart="12dp" + android:layout_marginEnd="20dp" android:layout_gravity="center_vertical" android:scaleType="centerInside" android:contentDescription="@null" /> @@ -41,36 +42,43 @@ android:layout_gravity="center_vertical" android:orientation="vertical"> - <TextView - android:id="@android:id/title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:singleLine="true" - android:ellipsize="marquee" - android:textAppearance="?android:attr/textAppearanceMedium" - android:textAlignment="viewStart" /> - <LinearLayout - android:id="@+id/summary_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> + <TextView + android:id="@android:id/title" + android:layout_width="0dip" + android:layout_height="wrap_content" + android:layout_weight="1" + android:singleLine="true" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textAlignment="viewStart" /> + <ImageView android:id="@android:id/icon1" - android:layout_width="24dip" - android:layout_height="24dip" - android:layout_marginEnd="6dip" + android:layout_width="@dimen/root_icon_size" + android:layout_height="@dimen/root_icon_size" + android:layout_marginStart="8dip" android:scaleType="centerInside" android:contentDescription="@null" /> + </LinearLayout> + + <LinearLayout + android:id="@+id/line2" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + <TextView - android:id="@android:id/summary" - android:layout_width="0dp" + android:id="@+id/date" + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_weight="1" android:layout_gravity="center_vertical" - android:layout_marginEnd="8dp" + android:minWidth="70dp" android:singleLine="true" android:ellipsize="marquee" android:textAlignment="viewStart" @@ -78,23 +86,26 @@ <TextView android:id="@+id/size" - android:layout_width="70dp" + android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:layout_marginEnd="8dp" + android:minWidth="70dp" + android:layout_marginStart="8dp" android:singleLine="true" android:ellipsize="marquee" - android:textAlignment="viewEnd" + android:textAlignment="viewStart" android:textAppearance="?android:attr/textAppearanceSmall" /> <TextView - android:id="@+id/date" - android:layout_width="70dp" + android:id="@android:id/summary" + android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_weight="1" android:layout_gravity="center_vertical" + android:layout_marginStart="8dp" android:singleLine="true" android:ellipsize="marquee" - android:textAlignment="viewEnd" + android:textAlignment="viewStart" android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout> diff --git a/packages/DocumentsUI/res/layout/item_root.xml b/packages/DocumentsUI/res/layout/item_root.xml index e9cf3aaab730..ce97b5710427 100644 --- a/packages/DocumentsUI/res/layout/item_root.xml +++ b/packages/DocumentsUI/res/layout/item_root.xml @@ -17,17 +17,17 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - android:minHeight="?android:attr/listPreferredItemHeight" + android:minHeight="?android:attr/listPreferredItemHeightSmall" android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:gravity="center_vertical" - android:orientation="horizontal"> + android:orientation="horizontal" + android:background="@drawable/item_root"> <ImageView android:id="@android:id/icon" - android:layout_width="@android:dimen/app_icon_size" - android:layout_height="@android:dimen/app_icon_size" - android:layout_rowSpan="2" + android:layout_width="@dimen/icon_size" + android:layout_height="@dimen/icon_size" android:layout_marginEnd="8dip" android:scaleType="centerInside" android:contentDescription="@null" /> diff --git a/packages/DocumentsUI/res/layout/item_root_header.xml b/packages/DocumentsUI/res/layout/item_root_header.xml index 2b9a46f32df4..127b2544abbf 100644 --- a/packages/DocumentsUI/res/layout/item_root_header.xml +++ b/packages/DocumentsUI/res/layout/item_root_header.xml @@ -16,14 +16,4 @@ <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingStart="?android:attr/listPreferredItemPaddingStart" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" - android:paddingTop="8dp" - android:paddingBottom="8dp" - android:singleLine="true" - android:ellipsize="marquee" - android:textAllCaps="true" - android:textAppearance="?android:attr/textAppearanceSmall" - android:textAlignment="viewStart" /> + style="?android:attr/listSeparatorTextViewStyle" /> diff --git a/packages/DocumentsUI/res/layout/item_title.xml b/packages/DocumentsUI/res/layout/item_title.xml index eab3839586eb..9594e4ea32aa 100644 --- a/packages/DocumentsUI/res/layout/item_title.xml +++ b/packages/DocumentsUI/res/layout/item_title.xml @@ -17,8 +17,20 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" + android:minHeight="?android:attr/listPreferredItemHeightSmall" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:gravity="center_vertical" - android:orientation="vertical"> + android:orientation="horizontal"> + + <ImageView + android:id="@+id/subdir" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:scaleType="centerInside" + android:visibility="gone" + android:src="@drawable/ic_subdirectory_arrow" + android:contentDescription="@null" /> <TextView android:id="@android:id/title" diff --git a/packages/DocumentsUI/res/menu/activity.xml b/packages/DocumentsUI/res/menu/activity.xml index 4d3dc56fb48a..6c37a4e37ffe 100644 --- a/packages/DocumentsUI/res/menu/activity.xml +++ b/packages/DocumentsUI/res/menu/activity.xml @@ -23,14 +23,14 @@ <item android:id="@+id/menu_search" android:title="@string/menu_search" - android:icon="@drawable/ic_menu_search_holo_light" + android:icon="@drawable/ic_menu_search" android:showAsAction="always|collapseActionView" android:actionViewClass="android.widget.SearchView" android:imeOptions="actionSearch" /> <item android:id="@+id/menu_sort" android:title="@string/menu_sort" - android:icon="@drawable/ic_menu_sortby_holo_light" + android:icon="@drawable/ic_menu_sortby" android:showAsAction="always"> <menu> <item @@ -57,6 +57,6 @@ <item android:id="@+id/menu_settings" android:title="@string/menu_settings" - android:icon="@drawable/ic_perm_group_system_tools" + android:icon="@drawable/ic_menu_settings" android:showAsAction="never" /> </menu> diff --git a/packages/DocumentsUI/res/values/colors.xml b/packages/DocumentsUI/res/values/colors.xml index ff3e999b9ccf..6d627597c673 100644 --- a/packages/DocumentsUI/res/values/colors.xml +++ b/packages/DocumentsUI/res/values/colors.xml @@ -16,4 +16,5 @@ <resources> <color name="chip">#ddd</color> + <color name="item_root_activated">#cccccc</color> </resources> diff --git a/packages/DocumentsUI/res/values/dimens.xml b/packages/DocumentsUI/res/values/dimens.xml index e5c4138ab0f4..e5b5b4e1f578 100644 --- a/packages/DocumentsUI/res/values/dimens.xml +++ b/packages/DocumentsUI/res/values/dimens.xml @@ -15,5 +15,8 @@ --> <resources> + <dimen name="icon_size">32dp</dimen> + <dimen name="root_icon_size">24dp</dimen> <dimen name="grid_width">180dp</dimen> + <dimen name="grid_height">180dp</dimen> </resources> diff --git a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java index e0b8d1971a6e..d8e60aa2eed3 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java @@ -70,7 +70,7 @@ public class CreateDirectoryFragment extends DialogFragment { try { final Uri childUri = DocumentsContract.createDocument( - resolver, cwd.uri, Document.MIME_TYPE_DIR, displayName); + resolver, cwd.derivedUri, Document.MIME_TYPE_DIR, displayName); // Navigate into newly created child final DocumentInfo childDoc = DocumentInfo.fromUri(resolver, childUri); diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java index ba47037e4bba..a13beba56c3a 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java @@ -20,6 +20,8 @@ import static com.android.documentsui.DocumentsActivity.TAG; import static com.android.documentsui.DocumentsActivity.State.ACTION_MANAGE; import static com.android.documentsui.DocumentsActivity.State.MODE_GRID; import static com.android.documentsui.DocumentsActivity.State.MODE_LIST; +import static com.android.documentsui.DocumentsActivity.State.MODE_UNKNOWN; +import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_UNKNOWN; import static com.android.documentsui.model.DocumentInfo.getCursorInt; import static com.android.documentsui.model.DocumentInfo.getCursorLong; import static com.android.documentsui.model.DocumentInfo.getCursorString; @@ -91,43 +93,42 @@ public class DirectoryFragment extends Fragment { private int mType = TYPE_NORMAL; + private int mLastMode = MODE_UNKNOWN; + private int mLastSortOrder = SORT_ORDER_UNKNOWN; + private Point mThumbSize; private DocumentsAdapter mAdapter; private LoaderCallbacks<DirectoryResult> mCallbacks; private static final String EXTRA_TYPE = "type"; - private static final String EXTRA_AUTHORITY = "authority"; - private static final String EXTRA_ROOT_ID = "rootId"; - private static final String EXTRA_DOC_ID = "docId"; + private static final String EXTRA_ROOT = "root"; + private static final String EXTRA_DOC = "doc"; private static final String EXTRA_QUERY = "query"; private static AtomicInteger sLoaderId = new AtomicInteger(4000); - private int mLastSortOrder = -1; - private final int mLoaderId = sLoaderId.incrementAndGet(); - public static void showNormal(FragmentManager fm, Uri uri) { - show(fm, TYPE_NORMAL, uri.getAuthority(), null, DocumentsContract.getDocumentId(uri), null); + public static void showNormal(FragmentManager fm, RootInfo root, DocumentInfo doc) { + show(fm, TYPE_NORMAL, root, doc, null); } - public static void showSearch(FragmentManager fm, Uri uri, String query) { - show(fm, TYPE_SEARCH, uri.getAuthority(), null, DocumentsContract.getDocumentId(uri), - query); + public static void showSearch( + FragmentManager fm, RootInfo root, DocumentInfo doc, String query) { + show(fm, TYPE_SEARCH, root, doc, query); } public static void showRecentsOpen(FragmentManager fm) { - show(fm, TYPE_RECENT_OPEN, null, null, null, null); + show(fm, TYPE_RECENT_OPEN, null, null, null); } - private static void show(FragmentManager fm, int type, String authority, String rootId, - String docId, String query) { + private static void show( + FragmentManager fm, int type, RootInfo root, DocumentInfo doc, String query) { final Bundle args = new Bundle(); args.putInt(EXTRA_TYPE, type); - args.putString(EXTRA_AUTHORITY, authority); - args.putString(EXTRA_ROOT_ID, rootId); - args.putString(EXTRA_DOC_ID, docId); + args.putParcelable(EXTRA_ROOT, root); + args.putParcelable(EXTRA_DOC, doc); args.putString(EXTRA_QUERY, query); final DirectoryFragment fragment = new DirectoryFragment(); @@ -167,6 +168,7 @@ public class DirectoryFragment extends Fragment { super.onActivityCreated(savedInstanceState); final Context context = getActivity(); + final State state = getDisplayState(DirectoryFragment.this); mAdapter = new DocumentsAdapter(); mType = getArguments().getInt(EXTRA_TYPE); @@ -174,35 +176,48 @@ public class DirectoryFragment extends Fragment { mCallbacks = new LoaderCallbacks<DirectoryResult>() { @Override public Loader<DirectoryResult> onCreateLoader(int id, Bundle args) { - final State state = getDisplayState(DirectoryFragment.this); - - final String authority = getArguments().getString(EXTRA_AUTHORITY); - final String rootId = getArguments().getString(EXTRA_ROOT_ID); - final String docId = getArguments().getString(EXTRA_DOC_ID); + final RootInfo root = getArguments().getParcelable(EXTRA_ROOT); + final DocumentInfo doc = getArguments().getParcelable(EXTRA_DOC); final String query = getArguments().getString(EXTRA_QUERY); Uri contentsUri; switch (mType) { case TYPE_NORMAL: - contentsUri = DocumentsContract.buildChildDocumentsUri(authority, docId); - return new DirectoryLoader(context, rootId, contentsUri, state.sortOrder); + contentsUri = DocumentsContract.buildChildDocumentsUri( + doc.authority, doc.documentId); + return new DirectoryLoader(context, root, doc, contentsUri); case TYPE_SEARCH: contentsUri = DocumentsContract.buildSearchDocumentsUri( - authority, docId, query); - return new DirectoryLoader(context, rootId, contentsUri, state.sortOrder); + doc.authority, doc.documentId, query); + return new DirectoryLoader(context, root, doc, contentsUri); case TYPE_RECENT_OPEN: final RootsCache roots = DocumentsApplication.getRootsCache(context); final List<RootInfo> matchingRoots = roots.getMatchingRoots(state); - return new RecentLoader(context, matchingRoots); + return new RecentLoader(context, matchingRoots, state.acceptMimes); default: throw new IllegalStateException("Unknown type " + mType); - } } @Override public void onLoadFinished(Loader<DirectoryResult> loader, DirectoryResult result) { + if (!isAdded()) return; + mAdapter.swapCursor(result.cursor); + + // Push latest state up to UI + // TODO: if mode change was racing with us, don't overwrite it + state.mode = result.mode; + state.sortOrder = result.sortOrder; + ((DocumentsActivity) context).onStateChanged(); + + updateDisplayState(); + + if (mLastSortOrder != result.sortOrder) { + mLastSortOrder = result.sortOrder; + mListView.smoothScrollToPosition(0); + mGridView.smoothScrollToPosition(0); + } } @Override @@ -211,25 +226,39 @@ public class DirectoryFragment extends Fragment { } }; + // Kick off loader at least once + getLoaderManager().restartLoader(mLoaderId, null, mCallbacks); + + updateDisplayState(); + } + + @Override + public void onStart() { + super.onStart(); updateDisplayState(); } - public void updateDisplayState() { + public void onUserSortOrderChanged() { + // User change always triggers reload + getLoaderManager().restartLoader(mLoaderId, null, mCallbacks); + } + + public void onUserModeChanged() { + // Mode change is just display; no need to reload + updateDisplayState(); + } + + private void updateDisplayState() { final State state = getDisplayState(this); - if (mLastSortOrder != state.sortOrder) { - getLoaderManager().restartLoader(mLoaderId, null, mCallbacks); - mLastSortOrder = state.sortOrder; - } + mFilter = new MimePredicate(state.acceptMimes); - mListView.smoothScrollToPosition(0); - mGridView.smoothScrollToPosition(0); + if (mLastMode == state.mode) return; + mLastMode = state.mode; mListView.setVisibility(state.mode == MODE_LIST ? View.VISIBLE : View.GONE); mGridView.setVisibility(state.mode == MODE_GRID ? View.VISIBLE : View.GONE); - mFilter = new MimePredicate(state.acceptMimes); - final int choiceMode; if (state.allowMultiple) { choiceMode = ListView.CHOICE_MODE_MULTIPLE_MODAL; @@ -248,14 +277,14 @@ public class DirectoryFragment extends Fragment { mGridView.setChoiceMode(choiceMode); mCurrentView = mGridView; } else if (state.mode == MODE_LIST) { - thumbSize = getResources().getDimensionPixelSize(android.R.dimen.app_icon_size); + thumbSize = getResources().getDimensionPixelSize(R.dimen.icon_size); mGridView.setAdapter(null); mGridView.setChoiceMode(ListView.CHOICE_MODE_NONE); mListView.setAdapter(mAdapter); mListView.setChoiceMode(choiceMode); mCurrentView = mListView; } else { - throw new IllegalStateException(); + throw new IllegalStateException("Unknown state " + state.mode); } mThumbSize = new Point(thumbSize, thumbSize); @@ -360,7 +389,7 @@ public class DirectoryFragment extends Fragment { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setType(doc.mimeType); - intent.putExtra(Intent.EXTRA_STREAM, doc.uri); + intent.putExtra(Intent.EXTRA_STREAM, doc.derivedUri); } else if (docs.size() > 1) { intent = new Intent(Intent.ACTION_SEND_MULTIPLE); @@ -371,7 +400,7 @@ public class DirectoryFragment extends Fragment { final ArrayList<Uri> uris = Lists.newArrayList(); for (DocumentInfo doc : docs) { mimeTypes.add(doc.mimeType); - uris.add(doc.uri); + uris.add(doc.derivedUri); } intent.setType(findCommonMimeType(mimeTypes)); @@ -397,7 +426,7 @@ public class DirectoryFragment extends Fragment { continue; } - if (!DocumentsContract.deleteDocument(resolver, doc.uri)) { + if (!DocumentsContract.deleteDocument(resolver, doc.derivedUri)) { Log.w(TAG, "Failed to delete " + doc); hadTrouble = true; } @@ -477,13 +506,11 @@ public class DirectoryFragment extends Fragment { if (extras != null) { final String info = extras.getString(DocumentsContract.EXTRA_INFO); if (info != null) { - mFooters.add(new MessageFooter( - com.android.internal.R.drawable.ic_menu_info_details, info)); + mFooters.add(new MessageFooter(R.drawable.ic_dialog_alert, info)); } final String error = extras.getString(DocumentsContract.EXTRA_ERROR); if (error != null) { - mFooters.add(new MessageFooter( - com.android.internal.R.drawable.ic_dialog_alert, error)); + mFooters.add(new MessageFooter(R.drawable.ic_dialog_alert, error)); } if (extras.getBoolean(DocumentsContract.EXTRA_LOADING, false)) { mFooters.add(new LoadingFooter()); @@ -543,7 +570,7 @@ public class DirectoryFragment extends Fragment { final ImageView icon = (ImageView) convertView.findViewById(android.R.id.icon); final TextView title = (TextView) convertView.findViewById(android.R.id.title); - final View summaryGrid = convertView.findViewById(R.id.summary_grid); + final View line2 = convertView.findViewById(R.id.line2); final ImageView icon1 = (ImageView) convertView.findViewById(android.R.id.icon1); final TextView summary = (TextView) convertView.findViewById(android.R.id.summary); final TextView date = (TextView) convertView.findViewById(R.id.date); @@ -573,31 +600,32 @@ public class DirectoryFragment extends Fragment { title.setText(docDisplayName); + boolean hasLine2 = false; + if (mType == TYPE_RECENT_OPEN) { final RootInfo root = roots.getRoot(docAuthority, docRootId); icon1.setVisibility(View.VISIBLE); icon1.setImageDrawable(root.loadIcon(context)); summary.setText(root.getDirectoryString()); summary.setVisibility(View.VISIBLE); + summary.setTextAlignment(TextView.TEXT_ALIGNMENT_TEXT_END); + hasLine2 = true; } else { icon1.setVisibility(View.GONE); if (docSummary != null) { summary.setText(docSummary); summary.setVisibility(View.VISIBLE); + hasLine2 = true; } else { summary.setVisibility(View.INVISIBLE); } } - if (summaryGrid != null) { - summaryGrid.setVisibility( - (summary.getVisibility() == View.VISIBLE) ? View.VISIBLE : View.GONE); - } - if (docLastModified == -1) { date.setText(null); } else { date.setText(formatTime(context, docLastModified)); + hasLine2 = true; } if (state.showSize) { @@ -606,11 +634,14 @@ public class DirectoryFragment extends Fragment { size.setText(null); } else { size.setText(Formatter.formatFileSize(context, docSize)); + hasLine2 = true; } } else { size.setVisibility(View.GONE); } + line2.setVisibility(hasLine2 ? View.VISIBLE : View.GONE); + return convertView; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java index 6ea57d77cfa6..72dfa30377ec 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java @@ -16,18 +16,29 @@ package com.android.documentsui; +import static com.android.documentsui.DocumentsActivity.TAG; +import static com.android.documentsui.DocumentsActivity.State.MODE_UNKNOWN; import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_DISPLAY_NAME; import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_LAST_MODIFIED; import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_SIZE; +import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_UNKNOWN; +import static com.android.documentsui.model.DocumentInfo.getCursorInt; import android.content.AsyncTaskLoader; import android.content.ContentProviderClient; +import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.CancellationSignal; import android.os.OperationCanceledException; import android.provider.DocumentsContract.Document; +import android.util.Log; + +import com.android.documentsui.DocumentsActivity.State; +import com.android.documentsui.RecentsProvider.StateColumns; +import com.android.documentsui.model.DocumentInfo; +import com.android.documentsui.model.RootInfo; import libcore.io.IoUtils; @@ -36,6 +47,9 @@ class DirectoryResult implements AutoCloseable { Cursor cursor; Exception exception; + int mode = MODE_UNKNOWN; + int sortOrder = SORT_ORDER_UNKNOWN; + @Override public void close() { IoUtils.closeQuietly(cursor); @@ -48,18 +62,18 @@ class DirectoryResult implements AutoCloseable { public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver(); - private final String mRootId; + private final RootInfo mRoot; + private final DocumentInfo mDoc; private final Uri mUri; - private final int mSortOrder; private CancellationSignal mSignal; private DirectoryResult mResult; - public DirectoryLoader(Context context, String rootId, Uri uri, int sortOrder) { + public DirectoryLoader(Context context, RootInfo root, DocumentInfo doc, Uri uri) { super(context); - mRootId = rootId; + mRoot = root; + mDoc = doc; mUri = uri; - mSortOrder = sortOrder; } @Override @@ -70,20 +84,65 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { } mSignal = new CancellationSignal(); } - final DirectoryResult result = new DirectoryResult(); + + final ContentResolver resolver = getContext().getContentResolver(); final String authority = mUri.getAuthority(); + + final DirectoryResult result = new DirectoryResult(); + + int userMode = State.MODE_UNKNOWN; + int userSortOrder = State.SORT_ORDER_UNKNOWN; + + // Pick up any custom modes requested by user + Cursor cursor = null; try { - result.client = getContext() - .getContentResolver().acquireUnstableContentProviderClient(authority); - final Cursor cursor = result.client.query( - mUri, null, null, null, getQuerySortOrder(mSortOrder), mSignal); + final Uri stateUri = RecentsProvider.buildState( + mRoot.authority, mRoot.rootId, mDoc.documentId); + cursor = resolver.query(stateUri, null, null, null, null); + if (cursor.moveToFirst()) { + userMode = getCursorInt(cursor, StateColumns.MODE); + userSortOrder = getCursorInt(cursor, StateColumns.SORT_ORDER); + } + } finally { + IoUtils.closeQuietly(cursor); + } + + if (userMode != State.MODE_UNKNOWN) { + result.mode = userMode; + } else { + if ((mDoc.flags & Document.FLAG_DIR_PREFERS_GRID) != 0) { + result.mode = State.MODE_GRID; + } else { + result.mode = State.MODE_LIST; + } + } + + if (userSortOrder != State.SORT_ORDER_UNKNOWN) { + result.sortOrder = userSortOrder; + } else { + if ((mDoc.flags & Document.FLAG_DIR_PREFERS_LAST_MODIFIED) != 0) { + result.sortOrder = State.SORT_ORDER_LAST_MODIFIED; + } else { + result.sortOrder = State.SORT_ORDER_DISPLAY_NAME; + } + } + + Log.d(TAG, "userMode=" + userMode + ", userSortOrder=" + userSortOrder + " --> mode=" + + result.mode + ", sortOrder=" + result.sortOrder); + + try { + result.client = resolver.acquireUnstableContentProviderClient(authority); + cursor = result.client.query( + mUri, null, null, null, getQuerySortOrder(result.sortOrder), mSignal); cursor.registerContentObserver(mObserver); - final Cursor withRoot = new RootCursorWrapper(mUri.getAuthority(), mRootId, cursor, -1); - final Cursor sorted = new SortingCursorWrapper(withRoot, mSortOrder); + final Cursor withRoot = new RootCursorWrapper( + mUri.getAuthority(), mRoot.rootId, cursor, -1); + final Cursor sorted = new SortingCursorWrapper(withRoot, result.sortOrder); result.cursor = sorted; } catch (Exception e) { + Log.d(TAG, "Failed to query", e); result.exception = e; ContentProviderClient.closeQuietly(result.client); } finally { @@ -91,6 +150,7 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { mSignal = null; } } + return result; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java index 8715055c7d8c..fe398004ee87 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java @@ -53,12 +53,16 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; +import android.widget.ImageView; import android.widget.SearchView; import android.widget.SearchView.OnCloseListener; import android.widget.SearchView.OnQueryTextListener; import android.widget.TextView; import android.widget.Toast; +import com.android.documentsui.RecentsProvider.RecentColumns; +import com.android.documentsui.RecentsProvider.ResumeColumns; +import com.android.documentsui.RecentsProvider.StateColumns; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.DocumentStack; import com.android.documentsui.model.DurableUtils; @@ -104,7 +108,7 @@ public class DocumentsActivity extends Activity { R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close); mDrawerLayout.setDrawerListener(mDrawerListener); - mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); + mDrawerLayout.setDrawerShadow(R.drawable.ic_drawer_shadow, GravityCompat.START); if (icicle != null) { mState = icicle.getParcelable(EXTRA_STATE); @@ -190,7 +194,7 @@ public class DocumentsActivity extends Activity { try { if (cursor.moveToFirst()) { final byte[] rawStack = cursor.getBlob( - cursor.getColumnIndex(RecentsProvider.COL_PATH)); + cursor.getColumnIndex(ResumeColumns.STACK)); DurableUtils.readFromArray(rawStack, mState.stack); } } catch (IOException e) { @@ -203,7 +207,7 @@ public class DocumentsActivity extends Activity { final RootInfo root = getCurrentRoot(); final List<RootInfo> matchingRoots = mRoots.getMatchingRoots(mState); if (!matchingRoots.contains(root)) { - mState.stack.clear(); + mState.stack.reset(); } // Only open drawer when showing recents @@ -342,11 +346,16 @@ public class DocumentsActivity extends Activity { final MenuItem list = menu.findItem(R.id.menu_list); final MenuItem settings = menu.findItem(R.id.menu_settings); - grid.setVisible(mState.mode != MODE_GRID); - list.setVisible(mState.mode != MODE_LIST); + if (cwd != null) { + sort.setVisible(true); + grid.setVisible(mState.mode != MODE_GRID); + list.setVisible(mState.mode != MODE_LIST); + } else { + sort.setVisible(false); + grid.setVisible(false); + list.setVisible(false); + } - // No sorting in recents - sort.setVisible(cwd != null); // Only sort by size when visible sortSize.setVisible(mState.showSize); @@ -391,28 +400,19 @@ public class DocumentsActivity extends Activity { } else if (id == R.id.menu_search) { return false; } else if (id == R.id.menu_sort_name) { - mState.sortOrder = State.SORT_ORDER_DISPLAY_NAME; - updateDisplayState(); + setUserSortOrder(State.SORT_ORDER_DISPLAY_NAME); return true; } else if (id == R.id.menu_sort_date) { - mState.sortOrder = State.SORT_ORDER_LAST_MODIFIED; - updateDisplayState(); + setUserSortOrder(State.SORT_ORDER_LAST_MODIFIED); return true; } else if (id == R.id.menu_sort_size) { - mState.sortOrder = State.SORT_ORDER_SIZE; - updateDisplayState(); + setUserSortOrder(State.SORT_ORDER_SIZE); return true; } else if (id == R.id.menu_grid) { - // TODO: persist explicit user mode for cwd - mState.mode = MODE_GRID; - updateDisplayState(); - invalidateOptionsMenu(); + setUserMode(State.MODE_GRID); return true; } else if (id == R.id.menu_list) { - // TODO: persist explicit user mode for cwd - mState.mode = MODE_LIST; - updateDisplayState(); - invalidateOptionsMenu(); + setUserMode(State.MODE_LIST); return true; } else if (id == R.id.menu_settings) { startActivity(new Intent(this, SettingsActivity.class)); @@ -422,6 +422,51 @@ public class DocumentsActivity extends Activity { } } + /** + * Update UI to reflect internal state changes not from user. + */ + public void onStateChanged() { + invalidateOptionsMenu(); + } + + /** + * Set state sort order based on explicit user action. + */ + private void setUserSortOrder(int sortOrder) { + final RootInfo root = getCurrentRoot(); + final DocumentInfo cwd = getCurrentDirectory(); + + // TODO: persist async, then trigger rebind + final Uri stateUri = RecentsProvider.buildState( + root.authority, root.rootId, cwd.documentId); + final ContentValues values = new ContentValues(); + values.put(StateColumns.SORT_ORDER, sortOrder); + getContentResolver().insert(stateUri, values); + + DirectoryFragment.get(getFragmentManager()).onUserSortOrderChanged(); + onStateChanged(); + } + + /** + * Set state mode based on explicit user action. + */ + private void setUserMode(int mode) { + final RootInfo root = getCurrentRoot(); + final DocumentInfo cwd = getCurrentDirectory(); + + // TODO: persist async, then trigger rebind + final Uri stateUri = RecentsProvider.buildState( + root.authority, root.rootId, cwd.documentId); + final ContentValues values = new ContentValues(); + values.put(StateColumns.MODE, mode); + getContentResolver().insert(stateUri, values); + + mState.mode = mode; + + DirectoryFragment.get(getFragmentManager()).onUserModeChanged(); + onStateChanged(); + } + @Override public void onBackPressed() { final int size = mState.stack.size(); @@ -481,6 +526,8 @@ public class DocumentsActivity extends Activity { title.setText(doc.displayName); } + // No padding when shown in actionbar + convertView.setPadding(0, 0, 0, 0); return convertView; } @@ -488,17 +535,20 @@ public class DocumentsActivity extends Activity { public View getDropDownView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()) - .inflate(android.R.layout.simple_dropdown_item_1line, parent, false); + .inflate(R.layout.item_title, parent, false); } - final TextView text1 = (TextView) convertView.findViewById(android.R.id.text1); + final ImageView subdir = (ImageView) convertView.findViewById(R.id.subdir); + final TextView title = (TextView) convertView.findViewById(android.R.id.title); final DocumentInfo doc = getItem(position); if (position == 0) { final RootInfo root = getCurrentRoot(); - text1.setText(root.title); + title.setText(root.title); + subdir.setVisibility(View.GONE); } else { - text1.setText(doc.displayName); + title.setText(doc.displayName); + subdir.setVisibility(View.VISIBLE); } return convertView; @@ -522,8 +572,8 @@ public class DocumentsActivity extends Activity { }; public RootInfo getCurrentRoot() { - if (mState.stack.size() > 0) { - return mState.stack.getRoot(mRoots); + if (mState.stack.root != null) { + return mState.stack.root; } else { return mRoots.getRecentsRoot(); } @@ -539,6 +589,7 @@ public class DocumentsActivity extends Activity { private void onCurrentDirectoryChanged() { final FragmentManager fm = getFragmentManager(); + final RootInfo root = getCurrentRoot(); final DocumentInfo cwd = getCurrentDirectory(); if (cwd == null) { @@ -551,10 +602,10 @@ public class DocumentsActivity extends Activity { } else { if (mState.currentSearch != null) { // Ongoing search - DirectoryFragment.showSearch(fm, cwd.uri, mState.currentSearch); + DirectoryFragment.showSearch(fm, root, cwd, mState.currentSearch); } else { // Normal boring directory - DirectoryFragment.showNormal(fm, cwd.uri); + DirectoryFragment.showNormal(fm, root, cwd); } } @@ -566,16 +617,16 @@ public class DocumentsActivity extends Activity { } } + final RootsFragment roots = RootsFragment.get(fm); + if (roots != null) { + roots.onCurrentRootChanged(); + } + updateActionBar(); invalidateOptionsMenu(); dumpStack(); } - private void updateDisplayState() { - // TODO: handle multiple directory stacks on tablets - DirectoryFragment.get(getFragmentManager()).updateDisplayState(); - } - public void onStackPicked(DocumentStack stack) { mState.stack = stack; onCurrentDirectoryChanged(); @@ -583,6 +634,7 @@ public class DocumentsActivity extends Activity { public void onRootPicked(RootInfo root, boolean closeDrawer) { // Clear entire backstack and start in new root + mState.stack.root = root; mState.stack.clear(); if (!mRoots.isRecentsRoot(root)) { @@ -622,7 +674,7 @@ public class DocumentsActivity extends Activity { onCurrentDirectoryChanged(); } else if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) { // Explicit file picked, return - onFinished(doc.uri); + onFinished(doc.derivedUri); } else if (mState.action == ACTION_CREATE) { // Replace selected file SaveFragment.get(fm).setReplaceTarget(doc); @@ -630,7 +682,7 @@ public class DocumentsActivity extends Activity { // First try managing the document; we expect manager to filter // based on authority, so we don't grant. final Intent manage = new Intent(DocumentsContract.ACTION_MANAGE_DOCUMENT); - manage.setData(doc.uri); + manage.setData(doc.derivedUri); try { startActivity(manage); @@ -638,7 +690,7 @@ public class DocumentsActivity extends Activity { // Fall back to viewing final Intent view = new Intent(Intent.ACTION_VIEW); view.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - view.setData(doc.uri); + view.setData(doc.derivedUri); try { startActivity(view); @@ -654,22 +706,21 @@ public class DocumentsActivity extends Activity { final int size = docs.size(); final Uri[] uris = new Uri[size]; for (int i = 0; i < size; i++) { - uris[i] = docs.get(i).uri; + uris[i] = docs.get(i).derivedUri; } onFinished(uris); } } public void onSaveRequested(DocumentInfo replaceTarget) { - onFinished(replaceTarget.uri); + onFinished(replaceTarget.derivedUri); } public void onSaveRequested(String mimeType, String displayName) { final DocumentInfo cwd = getCurrentDirectory(); - final String authority = cwd.uri.getAuthority(); final Uri childUri = DocumentsContract.createDocument( - getContentResolver(), cwd.uri, mimeType, displayName); + getContentResolver(), cwd.derivedUri, mimeType, displayName); if (childUri != null) { onFinished(childUri); } else { @@ -687,22 +738,14 @@ public class DocumentsActivity extends Activity { if (mState.action == ACTION_CREATE) { // Remember stack for last create values.clear(); - values.put(RecentsProvider.COL_PATH, rawStack); - resolver.insert(RecentsProvider.buildRecentCreate(), values); - - } else if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) { - // Remember opened items - for (Uri uri : uris) { - values.clear(); - values.put(RecentsProvider.COL_URI, uri.toString()); - resolver.insert(RecentsProvider.buildRecentOpen(), values); - } + values.put(RecentColumns.STACK, rawStack); + resolver.insert(RecentsProvider.buildRecent(), values); } // Remember location for next app launch final String packageName = getCallingPackage(); values.clear(); - values.put(RecentsProvider.COL_PATH, rawStack); + values.put(ResumeColumns.STACK, rawStack); resolver.insert(RecentsProvider.buildResume(packageName), values); final Intent intent = new Intent(); @@ -749,12 +792,14 @@ public class DocumentsActivity extends Activity { public static final int ACTION_GET_CONTENT = 3; public static final int ACTION_MANAGE = 4; - public static final int MODE_LIST = 0; - public static final int MODE_GRID = 1; + public static final int MODE_UNKNOWN = 0; + public static final int MODE_LIST = 1; + public static final int MODE_GRID = 2; - public static final int SORT_ORDER_DISPLAY_NAME = 0; - public static final int SORT_ORDER_LAST_MODIFIED = 1; - public static final int SORT_ORDER_SIZE = 2; + public static final int SORT_ORDER_UNKNOWN = 0; + public static final int SORT_ORDER_DISPLAY_NAME = 1; + public static final int SORT_ORDER_LAST_MODIFIED = 2; + public static final int SORT_ORDER_SIZE = 3; @Override public int describeContents() { @@ -800,9 +845,10 @@ public class DocumentsActivity extends Activity { } private void dumpStack() { - Log.d(TAG, "Current stack:"); + Log.d(TAG, "Current stack: "); + Log.d(TAG, " * " + mState.stack.root); for (DocumentInfo doc : mState.stack) { - Log.d(TAG, "--> " + doc); + Log.d(TAG, " +-- " + doc); } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/FilteringCursorWrapper.java b/packages/DocumentsUI/src/com/android/documentsui/FilteringCursorWrapper.java new file mode 100644 index 000000000000..60f010380b66 --- /dev/null +++ b/packages/DocumentsUI/src/com/android/documentsui/FilteringCursorWrapper.java @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.documentsui; + +import static com.android.documentsui.DocumentsActivity.TAG; + +import android.database.AbstractCursor; +import android.database.Cursor; +import android.os.Bundle; +import android.provider.DocumentsContract.Document; +import android.util.Log; + +/** + * Cursor wrapper that filters MIME types not matching given list. + */ +public class FilteringCursorWrapper extends AbstractCursor { + private final Cursor mCursor; + + private final int[] mPosition; + private int mCount; + + public FilteringCursorWrapper(Cursor cursor, String[] acceptMimes) { + mCursor = cursor; + + final int count = cursor.getCount(); + mPosition = new int[count]; + + cursor.moveToPosition(-1); + while (cursor.moveToNext()) { + final String mimeType = cursor.getString( + cursor.getColumnIndex(Document.COLUMN_MIME_TYPE)); + if (MimePredicate.mimeMatches(acceptMimes, mimeType)) { + mPosition[mCount++] = cursor.getPosition(); + } + } + + Log.d(TAG, "Before filtering " + cursor.getCount() + ", after " + mCount); + } + + @Override + public Bundle getExtras() { + return mCursor.getExtras(); + } + + @Override + public void close() { + super.close(); + mCursor.close(); + } + + @Override + public boolean onMove(int oldPosition, int newPosition) { + return mCursor.moveToPosition(mPosition[newPosition]); + } + + @Override + public String[] getColumnNames() { + return mCursor.getColumnNames(); + } + + @Override + public int getCount() { + return mCount; + } + + @Override + public double getDouble(int column) { + return mCursor.getDouble(column); + } + + @Override + public float getFloat(int column) { + return mCursor.getFloat(column); + } + + @Override + public int getInt(int column) { + return mCursor.getInt(column); + } + + @Override + public long getLong(int column) { + return mCursor.getLong(column); + } + + @Override + public short getShort(int column) { + return mCursor.getShort(column); + } + + @Override + public String getString(int column) { + return mCursor.getString(column); + } + + @Override + public int getType(int column) { + return mCursor.getType(column); + } + + @Override + public boolean isNull(int column) { + return mCursor.isNull(column); + } +} diff --git a/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java b/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java index b5b10334fc8a..5caf9ba0db29 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java +++ b/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java @@ -210,7 +210,8 @@ public class IconUtils { final Resources res = context.getResources(); if (Document.MIME_TYPE_DIR.equals(mimeType)) { - return res.getDrawable(R.drawable.ic_dir); + // TODO: return a mipmap, since this is used for grid + return res.getDrawable(R.drawable.ic_root_folder); } // Look for exact match first diff --git a/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java b/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java index 85d0988514c0..b55ce820f25e 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java +++ b/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java @@ -49,6 +49,18 @@ public class MimePredicate implements Predicate<DocumentInfo> { return false; } + public static boolean mimeMatches(String filter, String[] tests) { + if (tests == null) { + return true; + } + for (String test : tests) { + if (mimeMatches(filter, test)) { + return true; + } + } + return false; + } + public static boolean mimeMatches(String[] filters, String test) { if (filters == null) { return true; diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java index 756a29796039..57442a030697 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java @@ -17,6 +17,9 @@ package com.android.documentsui; import static com.android.documentsui.DocumentsActivity.TAG; +import static com.android.documentsui.DocumentsActivity.State.MODE_GRID; +import static com.android.documentsui.DocumentsActivity.State.MODE_LIST; +import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_LAST_MODIFIED; import android.content.AsyncTaskLoader; import android.content.ContentProviderClient; @@ -79,6 +82,7 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> { } private final List<RootInfo> mRoots; + private final String[] mAcceptMimes; private final HashMap<RootInfo, RecentTask> mTasks = Maps.newHashMap(); @@ -135,9 +139,10 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> { } } - public RecentLoader(Context context, List<RootInfo> roots) { + public RecentLoader(Context context, List<RootInfo> roots, String[] acceptMimes) { super(context); mRoots = roots; + mAcceptMimes = acceptMimes; } @Override @@ -171,7 +176,15 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> { for (RecentTask task : mTasks.values()) { if (task.isDone()) { try { - cursors.add(task.get()); + final Cursor cursor = task.get(); + final FilteringCursorWrapper filtered = new FilteringCursorWrapper( + cursor, mAcceptMimes) { + @Override + public void close() { + // Ignored, since we manage cursor lifecycle internally + } + }; + cursors.add(filtered); } catch (InterruptedException e) { throw new RuntimeException(e); } catch (ExecutionException e) { @@ -181,15 +194,14 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> { } final DirectoryResult result = new DirectoryResult(); + + final boolean acceptImages = MimePredicate.mimeMatches("image/*", mAcceptMimes); + result.mode = acceptImages ? MODE_GRID : MODE_LIST; + result.sortOrder = SORT_ORDER_LAST_MODIFIED; + if (cursors.size() > 0) { final MergeCursor merged = new MergeCursor(cursors.toArray(new Cursor[cursors.size()])); - final SortingCursorWrapper sorted = new SortingCursorWrapper( - merged, State.SORT_ORDER_LAST_MODIFIED) { - @Override - public void close() { - // Ignored, since we manage cursor lifecycle internally - } - }; + final SortingCursorWrapper sorted = new SortingCursorWrapper(merged, result.sortOrder); result.cursor = sorted; } return result; diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java index fd7293d46b87..9391ca927e62 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java @@ -41,8 +41,8 @@ import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; +import com.android.documentsui.RecentsProvider.RecentColumns; import com.android.documentsui.model.DocumentStack; -import com.android.documentsui.model.RootInfo; import com.google.android.collect.Lists; import libcore.io.IoUtils; @@ -128,7 +128,7 @@ public class RecentsCreateFragment extends Fragment { public static class RecentsCreateLoader extends UriDerivativeLoader<Uri, List<DocumentStack>> { public RecentsCreateLoader(Context context) { - super(context, RecentsProvider.buildRecentCreate()); + super(context, RecentsProvider.buildRecent()); } @Override @@ -137,14 +137,14 @@ public class RecentsCreateFragment extends Fragment { final ContentResolver resolver = getContext().getContentResolver(); final Cursor cursor = resolver.query( - uri, null, null, null, RecentsProvider.COL_TIMESTAMP + " DESC", signal); + uri, null, null, null, RecentColumns.TIMESTAMP + " DESC", signal); try { while (cursor != null && cursor.moveToNext()) { - final byte[] raw = cursor.getBlob( - cursor.getColumnIndex(RecentsProvider.COL_PATH)); + final byte[] rawStack = cursor.getBlob( + cursor.getColumnIndex(RecentColumns.STACK)); try { final DocumentStack stack = new DocumentStack(); - stack.read(new DataInputStream(new ByteArrayInputStream(raw))); + stack.read(new DataInputStream(new ByteArrayInputStream(rawStack))); result.add(stack); } catch (IOException e) { Log.w(TAG, "Failed to resolve stack: " + e); @@ -181,11 +181,9 @@ public class RecentsCreateFragment extends Fragment { final ImageView icon = (ImageView) convertView.findViewById(android.R.id.icon); final TextView title = (TextView) convertView.findViewById(android.R.id.title); - final View summaryList = convertView.findViewById(R.id.summary_list); final DocumentStack stack = getItem(position); - final RootInfo root = stack.getRoot(roots); - icon.setImageDrawable(root.loadIcon(context)); + icon.setImageDrawable(stack.root.loadIcon(context)); final StringBuilder builder = new StringBuilder(); for (int i = stack.size() - 1; i >= 0; i--) { @@ -197,8 +195,6 @@ public class RecentsCreateFragment extends Fragment { title.setText(builder.toString()); title.setEllipsize(TruncateAt.MIDDLE); - summaryList.setVisibility(View.GONE); - return convertView; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java index 0c87783673a9..df7ed4a6b77e 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java @@ -25,51 +25,64 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; +import android.provider.DocumentsContract.Document; +import android.provider.DocumentsContract.Root; import android.text.format.DateUtils; import android.util.Log; public class RecentsProvider extends ContentProvider { private static final String TAG = "RecentsProvider"; - // TODO: offer view of recents that handles backend root resolution before - // returning cursor, include extra columns + public static final long MAX_HISTORY_IN_MILLIS = DateUtils.DAY_IN_MILLIS * 45; - public static final String AUTHORITY = "com.android.documentsui.recents"; + private static final String AUTHORITY = "com.android.documentsui.recents"; private static final UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH); - private static final int URI_RECENT_OPEN = 1; - private static final int URI_RECENT_CREATE = 2; + private static final int URI_RECENT = 1; + private static final int URI_STATE = 2; private static final int URI_RESUME = 3; static { - sMatcher.addURI(AUTHORITY, "recent_open", URI_RECENT_OPEN); - sMatcher.addURI(AUTHORITY, "recent_create", URI_RECENT_CREATE); + sMatcher.addURI(AUTHORITY, "recent", URI_RECENT); + // state/authority/rootId/docId + sMatcher.addURI(AUTHORITY, "state/*/*/*", URI_STATE); + // resume/packageName sMatcher.addURI(AUTHORITY, "resume/*", URI_RESUME); } - private static final String TABLE_RECENT_OPEN = "recent_open"; - private static final String TABLE_RECENT_CREATE = "recent_create"; - private static final String TABLE_RESUME = "resume"; - - /** - * String of URIs pointing at a storage backend, stored as a JSON array, - * starting with root. - */ - public static final String COL_PATH = "path"; - public static final String COL_URI = "uri"; - public static final String COL_PACKAGE_NAME = "package_name"; - public static final String COL_TIMESTAMP = "timestamp"; - - @Deprecated - public static Uri buildRecentOpen() { - return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) - .authority(AUTHORITY).appendPath("recent_open").build(); + public static final String TABLE_RECENT = "recent"; + public static final String TABLE_STATE = "state"; + public static final String TABLE_RESUME = "resume"; + + public static class RecentColumns { + public static final String STACK = "stack"; + public static final String TIMESTAMP = "timestamp"; + } + + public static class StateColumns { + public static final String AUTHORITY = "authority"; + public static final String ROOT_ID = Root.COLUMN_ROOT_ID; + public static final String DOCUMENT_ID = Document.COLUMN_DOCUMENT_ID; + public static final String MODE = "mode"; + public static final String SORT_ORDER = "sortOrder"; } - public static Uri buildRecentCreate() { + public static class ResumeColumns { + public static final String PACKAGE_NAME = "package_name"; + public static final String STACK = "stack"; + public static final String TIMESTAMP = "timestamp"; + } + + public static Uri buildRecent() { return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) - .authority(AUTHORITY).appendPath("recent_create").build(); + .authority(AUTHORITY).appendPath("recent").build(); + } + + public static Uri buildState(String authority, String rootId, String documentId) { + return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(AUTHORITY) + .appendPath("state").appendPath(authority).appendPath(rootId).appendPath(documentId) + .build(); } public static Uri buildResume(String packageName) { @@ -83,35 +96,42 @@ public class RecentsProvider extends ContentProvider { private static final String DB_NAME = "recents.db"; private static final int VERSION_INIT = 1; + private static final int VERSION_AS_BLOB = 3; public DatabaseHelper(Context context) { - super(context, DB_NAME, null, VERSION_INIT); + super(context, DB_NAME, null, VERSION_AS_BLOB); } @Override public void onCreate(SQLiteDatabase db) { - db.execSQL("CREATE TABLE " + TABLE_RECENT_OPEN + " (" + - COL_URI + " TEXT PRIMARY KEY ON CONFLICT REPLACE," + - COL_TIMESTAMP + " INTEGER" + + + db.execSQL("CREATE TABLE " + TABLE_RECENT + " (" + + RecentColumns.STACK + " BLOB PRIMARY KEY ON CONFLICT REPLACE," + + RecentColumns.TIMESTAMP + " INTEGER" + ")"); - db.execSQL("CREATE TABLE " + TABLE_RECENT_CREATE + " (" + - COL_PATH + " TEXT PRIMARY KEY ON CONFLICT REPLACE," + - COL_TIMESTAMP + " INTEGER" + + db.execSQL("CREATE TABLE " + TABLE_STATE + " (" + + StateColumns.AUTHORITY + " TEXT," + + StateColumns.ROOT_ID + " TEXT," + + StateColumns.DOCUMENT_ID + " TEXT," + + StateColumns.MODE + " INTEGER," + + StateColumns.SORT_ORDER + " INTEGER," + + "PRIMARY KEY (" + StateColumns.AUTHORITY + ", " + StateColumns.ROOT_ID + ", " + + StateColumns.DOCUMENT_ID + ")" + ")"); db.execSQL("CREATE TABLE " + TABLE_RESUME + " (" + - COL_PACKAGE_NAME + " TEXT PRIMARY KEY ON CONFLICT REPLACE," + - COL_PATH + " TEXT," + - COL_TIMESTAMP + " INTEGER" + + ResumeColumns.PACKAGE_NAME + " TEXT PRIMARY KEY ON CONFLICT REPLACE," + + ResumeColumns.STACK + " BLOB," + + ResumeColumns.TIMESTAMP + " INTEGER" + ")"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(TAG, "Upgrading database; wiping app data"); - db.execSQL("DROP TABLE IF EXISTS " + TABLE_RECENT_OPEN); - db.execSQL("DROP TABLE IF EXISTS " + TABLE_RECENT_CREATE); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_RECENT); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_STATE); db.execSQL("DROP TABLE IF EXISTS " + TABLE_RESUME); onCreate(db); } @@ -128,22 +148,23 @@ public class RecentsProvider extends ContentProvider { String sortOrder) { final SQLiteDatabase db = mHelper.getReadableDatabase(); switch (sMatcher.match(uri)) { - case URI_RECENT_OPEN: { - return db.query(TABLE_RECENT_OPEN, projection, - buildWhereYounger(DateUtils.WEEK_IN_MILLIS), null, null, null, null); - } - case URI_RECENT_CREATE: { - return db.query(TABLE_RECENT_CREATE, projection, - buildWhereYounger(DateUtils.WEEK_IN_MILLIS), null, null, null, null); - } - case URI_RESUME: { + case URI_RECENT: + return db.query(TABLE_RECENT, projection, + RecentColumns.TIMESTAMP + "<" + MAX_HISTORY_IN_MILLIS, null, null, null, + null); + case URI_STATE: + final String authority = uri.getPathSegments().get(1); + final String rootId = uri.getPathSegments().get(2); + final String documentId = uri.getPathSegments().get(3); + return db.query(TABLE_STATE, projection, StateColumns.AUTHORITY + "=? AND " + + StateColumns.ROOT_ID + "=? AND " + StateColumns.DOCUMENT_ID + "=?", + new String[] { authority, rootId, documentId }, null, null, null); + case URI_RESUME: final String packageName = uri.getPathSegments().get(1); - return db.query(TABLE_RESUME, projection, COL_PACKAGE_NAME + "=?", + return db.query(TABLE_RESUME, projection, ResumeColumns.PACKAGE_NAME + "=?", new String[] { packageName }, null, null, null); - } - default: { + default: throw new UnsupportedOperationException("Unsupported Uri " + uri); - } } } @@ -156,28 +177,37 @@ public class RecentsProvider extends ContentProvider { public Uri insert(Uri uri, ContentValues values) { final SQLiteDatabase db = mHelper.getWritableDatabase(); switch (sMatcher.match(uri)) { - case URI_RECENT_OPEN: { - values.put(COL_TIMESTAMP, System.currentTimeMillis()); - db.insert(TABLE_RECENT_OPEN, null, values); - db.delete(TABLE_RECENT_OPEN, buildWhereOlder(DateUtils.WEEK_IN_MILLIS), null); + case URI_RECENT: + values.put(RecentColumns.TIMESTAMP, System.currentTimeMillis()); + db.insert(TABLE_RECENT, null, values); + db.delete( + TABLE_RECENT, RecentColumns.TIMESTAMP + ">" + MAX_HISTORY_IN_MILLIS, null); return uri; - } - case URI_RECENT_CREATE: { - values.put(COL_TIMESTAMP, System.currentTimeMillis()); - db.insert(TABLE_RECENT_CREATE, null, values); - db.delete(TABLE_RECENT_CREATE, buildWhereOlder(DateUtils.WEEK_IN_MILLIS), null); + case URI_STATE: + final String authority = uri.getPathSegments().get(1); + final String rootId = uri.getPathSegments().get(2); + final String documentId = uri.getPathSegments().get(3); + + final ContentValues key = new ContentValues(); + key.put(StateColumns.AUTHORITY, authority); + key.put(StateColumns.ROOT_ID, rootId); + key.put(StateColumns.DOCUMENT_ID, documentId); + + // Ensure that row exists, then update with changed values + db.insertWithOnConflict(TABLE_STATE, null, key, SQLiteDatabase.CONFLICT_IGNORE); + db.update(TABLE_STATE, values, StateColumns.AUTHORITY + "=? AND " + + StateColumns.ROOT_ID + "=? AND " + StateColumns.DOCUMENT_ID + "=?", + new String[] { authority, rootId, documentId }); + return uri; - } - case URI_RESUME: { + case URI_RESUME: final String packageName = uri.getPathSegments().get(1); - values.put(COL_PACKAGE_NAME, packageName); - values.put(COL_TIMESTAMP, System.currentTimeMillis()); + values.put(ResumeColumns.PACKAGE_NAME, packageName); + values.put(ResumeColumns.TIMESTAMP, System.currentTimeMillis()); db.insert(TABLE_RESUME, null, values); return uri; - } - default: { + default: throw new UnsupportedOperationException("Unsupported Uri " + uri); - } } } @@ -190,12 +220,4 @@ public class RecentsProvider extends ContentProvider { public int delete(Uri uri, String selection, String[] selectionArgs) { throw new UnsupportedOperationException("Unsupported Uri " + uri); } - - private static String buildWhereOlder(long deltaMillis) { - return COL_TIMESTAMP + "<" + (System.currentTimeMillis() - deltaMillis); - } - - private static String buildWhereYounger(long deltaMillis) { - return COL_TIMESTAMP + ">" + (System.currentTimeMillis() - deltaMillis); - } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java index d192378ea71e..8530a9f9b100 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java @@ -72,7 +72,7 @@ public class RootsCache { // Create special root for recents final RootInfo root = new RootInfo(); root.rootType = Root.ROOT_TYPE_SHORTCUT; - root.icon = R.drawable.ic_dir; + root.icon = R.drawable.ic_root_recent; root.flags = Root.FLAG_LOCAL_ONLY | Root.FLAG_SUPPORTS_CREATE; root.title = mContext.getString(R.string.root_recent); root.availableBytes = -1; @@ -151,8 +151,12 @@ public class RootsCache { @GuardedBy("ActivityThread") public List<RootInfo> getMatchingRoots(State state) { + return getMatchingRoots(mRoots, state); + } + + public static List<RootInfo> getMatchingRoots(List<RootInfo> roots, State state) { ArrayList<RootInfo> matching = Lists.newArrayList(); - for (RootInfo root : mRoots) { + for (RootInfo root : roots) { final boolean supportsCreate = (root.flags & Root.FLAG_SUPPORTS_CREATE) != 0; final boolean advanced = (root.flags & Root.FLAG_ADVANCED) != 0; final boolean localOnly = (root.flags & Root.FLAG_LOCAL_ONLY) != 0; @@ -165,7 +169,10 @@ public class RootsCache { if (state.localOnly && !localOnly) continue; // Only include roots that serve requested content - if (!MimePredicate.mimeMatches(root.mimeTypes, state.acceptMimes)) { + final boolean overlap = + MimePredicate.mimeMatches(root.derivedMimeTypes, state.acceptMimes) || + MimePredicate.mimeMatches(state.acceptMimes, root.derivedMimeTypes); + if (!overlap) { continue; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java index ef3a31d86ee9..efb972d44c0a 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java @@ -40,6 +40,7 @@ import com.android.documentsui.DocumentsActivity.State; import com.android.documentsui.SectionedListAdapter.SectionAdapter; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.RootInfo; +import com.android.internal.util.Objects; import java.util.Comparator; import java.util.List; @@ -78,6 +79,7 @@ public class RootsFragment extends Fragment { final View view = inflater.inflate(R.layout.fragment_roots, container, false); mList = (ListView) view.findViewById(android.R.id.list); mList.setOnItemClickListener(mItemListener); + mList.setChoiceMode(ListView.CHOICE_MODE_SINGLE); return view; } @@ -100,6 +102,21 @@ public class RootsFragment extends Fragment { mAdapter = new SectionedRootsAdapter(context, matchingRoots, includeApps); mList.setAdapter(mAdapter); + + onCurrentRootChanged(); + } + + public void onCurrentRootChanged() { + if (mAdapter == null) return; + + final RootInfo root = ((DocumentsActivity) getActivity()).getCurrentRoot(); + for (int i = 0; i < mAdapter.getCount(); i++) { + final Object item = mAdapter.getItem(i); + if (Objects.equal(item, root)) { + mList.setItemChecked(i, true); + return; + } + } } private OnItemClickListener mItemListener = new OnItemClickListener() { diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java index a1489a53b4f8..c69103ef5d7e 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java @@ -20,6 +20,8 @@ import android.content.ContentProviderClient; import android.content.ContentResolver; import android.database.Cursor; import android.net.Uri; +import android.os.Parcel; +import android.os.Parcelable; import android.provider.DocumentsContract; import android.provider.DocumentsContract.Document; @@ -32,15 +34,16 @@ import java.io.DataOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.ProtocolException; -import java.util.Comparator; /** * Representation of a {@link Document}. */ -public class DocumentInfo implements Durable { +public class DocumentInfo implements Durable, Parcelable { private static final int VERSION_INIT = 1; + private static final int VERSION_SPLIT_URI = 2; - public Uri uri; + public String authority; + public String documentId; public String mimeType; public String displayName; public long lastModified; @@ -49,13 +52,17 @@ public class DocumentInfo implements Durable { public long size; public int icon; + /** Derived fields that aren't persisted */ + public Uri derivedUri; + public DocumentInfo() { reset(); } @Override public void reset() { - uri = null; + authority = null; + documentId = null; mimeType = null; displayName = null; lastModified = -1; @@ -63,6 +70,8 @@ public class DocumentInfo implements Durable { summary = null; size = -1; icon = 0; + + derivedUri = null; } @Override @@ -70,8 +79,10 @@ public class DocumentInfo implements Durable { final int version = in.readInt(); switch (version) { case VERSION_INIT: - final String rawUri = DurableUtils.readNullableString(in); - uri = rawUri != null ? Uri.parse(rawUri) : null; + throw new ProtocolException("Ignored upgrade"); + case VERSION_SPLIT_URI: + authority = DurableUtils.readNullableString(in); + documentId = DurableUtils.readNullableString(in); mimeType = DurableUtils.readNullableString(in); displayName = DurableUtils.readNullableString(in); lastModified = in.readLong(); @@ -79,6 +90,7 @@ public class DocumentInfo implements Durable { summary = DurableUtils.readNullableString(in); size = in.readLong(); icon = in.readInt(); + deriveFields(); break; default: throw new ProtocolException("Unknown version " + version); @@ -87,8 +99,9 @@ public class DocumentInfo implements Durable { @Override public void write(DataOutputStream out) throws IOException { - out.writeInt(VERSION_INIT); - DurableUtils.writeNullableString(out, uri.toString()); + out.writeInt(VERSION_SPLIT_URI); + DurableUtils.writeNullableString(out, authority); + DurableUtils.writeNullableString(out, documentId); DurableUtils.writeNullableString(out, mimeType); DurableUtils.writeNullableString(out, displayName); out.writeLong(lastModified); @@ -98,11 +111,41 @@ public class DocumentInfo implements Durable { out.writeInt(icon); } + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + DurableUtils.writeToParcel(dest, this); + } + + public static final Creator<DocumentInfo> CREATOR = new Creator<DocumentInfo>() { + @Override + public DocumentInfo createFromParcel(Parcel in) { + final DocumentInfo doc = new DocumentInfo(); + DurableUtils.readFromParcel(in, doc); + return doc; + } + + @Override + public DocumentInfo[] newArray(int size) { + return new DocumentInfo[size]; + } + }; + public static DocumentInfo fromDirectoryCursor(Cursor cursor) { - final DocumentInfo doc = new DocumentInfo(); final String authority = getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY); - final String docId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID); - doc.uri = DocumentsContract.buildDocumentUri(authority, docId); + return fromCursor(cursor, authority); + } + + public static DocumentInfo fromCursor(Cursor cursor, String authority) { + final DocumentInfo doc = new DocumentInfo(); + doc.authority = authority; + doc.documentId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID); + doc.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); + doc.documentId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID); doc.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); doc.displayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME); doc.lastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED); @@ -110,6 +153,7 @@ public class DocumentInfo implements Durable { doc.summary = getCursorString(cursor, Document.COLUMN_SUMMARY); doc.size = getCursorLong(cursor, Document.COLUMN_SIZE); doc.icon = getCursorInt(cursor, Document.COLUMN_ICON); + doc.deriveFields(); return doc; } @@ -122,16 +166,7 @@ public class DocumentInfo implements Durable { if (!cursor.moveToFirst()) { throw new FileNotFoundException("Missing details for " + uri); } - final DocumentInfo doc = new DocumentInfo(); - doc.uri = uri; - doc.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); - doc.displayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME); - doc.lastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED); - doc.flags = getCursorInt(cursor, Document.COLUMN_FLAGS); - doc.summary = getCursorString(cursor, Document.COLUMN_SUMMARY); - doc.size = getCursorLong(cursor, Document.COLUMN_SIZE); - doc.icon = getCursorInt(cursor, Document.COLUMN_ICON); - return doc; + return fromCursor(cursor, uri.getAuthority()); } catch (Throwable t) { throw asFileNotFoundException(t); } finally { @@ -140,9 +175,13 @@ public class DocumentInfo implements Durable { } } + private void deriveFields() { + derivedUri = DocumentsContract.buildDocumentUri(authority, documentId); + } + @Override public String toString() { - return "Document{name=" + displayName + ", uri=" + uri + "}"; + return "Document{name=" + displayName + ", docId=" + documentId + "}"; } public boolean isCreateSupported() { @@ -189,42 +228,14 @@ public class DocumentInfo implements Durable { } } + /** + * Missing or null values are returned as 0. + */ public static int getCursorInt(Cursor cursor, String columnName) { final int index = cursor.getColumnIndex(columnName); return (index != -1) ? cursor.getInt(index) : 0; } - @Deprecated - public static class DisplayNameComparator implements Comparator<DocumentInfo> { - @Override - public int compare(DocumentInfo lhs, DocumentInfo rhs) { - final boolean leftDir = lhs.isDirectory(); - final boolean rightDir = rhs.isDirectory(); - - if (leftDir != rightDir) { - return leftDir ? -1 : 1; - } else { - return compareToIgnoreCaseNullable(lhs.displayName, rhs.displayName); - } - } - } - - @Deprecated - public static class LastModifiedComparator implements Comparator<DocumentInfo> { - @Override - public int compare(DocumentInfo lhs, DocumentInfo rhs) { - return Long.compare(rhs.lastModified, lhs.lastModified); - } - } - - @Deprecated - public static class SizeComparator implements Comparator<DocumentInfo> { - @Override - public int compare(DocumentInfo lhs, DocumentInfo rhs) { - return Long.compare(rhs.size, lhs.size); - } - } - public static FileNotFoundException asFileNotFoundException(Throwable t) throws FileNotFoundException { if (t instanceof FileNotFoundException) { diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java index 33a1376e2144..254144065f8a 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java @@ -16,8 +16,6 @@ package com.android.documentsui.model; -import com.android.documentsui.RootsCache; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -30,14 +28,13 @@ import java.util.LinkedList; */ public class DocumentStack extends LinkedList<DocumentInfo> implements Durable { private static final int VERSION_INIT = 1; + private static final int VERSION_ADD_ROOT = 2; - public RootInfo getRoot(RootsCache roots) { - return roots.findRoot(getLast().uri); - } + public RootInfo root; - public String getTitle(RootsCache roots) { - if (size() == 1) { - return getRoot(roots).title; + public String getTitle() { + if (size() == 1 && root != null) { + return root.title; } else if (size() > 1) { return peek().displayName; } else { @@ -52,6 +49,7 @@ public class DocumentStack extends LinkedList<DocumentInfo> implements Durable { @Override public void reset() { clear(); + root = null; } @Override @@ -59,6 +57,12 @@ public class DocumentStack extends LinkedList<DocumentInfo> implements Durable { final int version = in.readInt(); switch (version) { case VERSION_INIT: + throw new ProtocolException("Ignored upgrade"); + case VERSION_ADD_ROOT: + if (in.readBoolean()) { + root = new RootInfo(); + root.read(in); + } final int size = in.readInt(); for (int i = 0; i < size; i++) { final DocumentInfo doc = new DocumentInfo(); @@ -73,7 +77,13 @@ public class DocumentStack extends LinkedList<DocumentInfo> implements Durable { @Override public void write(DataOutputStream out) throws IOException { - out.writeInt(VERSION_INIT); + out.writeInt(VERSION_ADD_ROOT); + if (root != null) { + out.writeBoolean(true); + root.write(out); + } else { + out.writeBoolean(false); + } final int size = size(); out.writeInt(size); for (int i = 0; i < size; i++) { diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java index 75baa0ac5725..e0e8acf98ece 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java @@ -23,16 +23,25 @@ import static com.android.documentsui.model.DocumentInfo.getCursorString; import android.content.Context; import android.database.Cursor; import android.graphics.drawable.Drawable; +import android.os.Parcel; +import android.os.Parcelable; import android.provider.DocumentsContract.Root; import com.android.documentsui.IconUtils; +import com.android.documentsui.R; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.ProtocolException; import java.util.Objects; /** * Representation of a {@link Root}. */ -public class RootInfo { +public class RootInfo implements Durable, Parcelable { + private static final int VERSION_INIT = 1; + public String authority; public String rootId; public int rootType; @@ -42,7 +51,93 @@ public class RootInfo { public String summary; public String documentId; public long availableBytes; - public String[] mimeTypes; + public String mimeTypes; + + /** Derived fields that aren't persisted */ + public String[] derivedMimeTypes; + public int derivedIcon; + + public RootInfo() { + reset(); + } + + @Override + public void reset() { + authority = null; + rootId = null; + rootType = 0; + flags = 0; + icon = 0; + title = null; + summary = null; + documentId = null; + availableBytes = -1; + mimeTypes = null; + + derivedMimeTypes = null; + derivedIcon = 0; + } + + @Override + public void read(DataInputStream in) throws IOException { + final int version = in.readInt(); + switch (version) { + case VERSION_INIT: + authority = DurableUtils.readNullableString(in); + rootId = DurableUtils.readNullableString(in); + rootType = in.readInt(); + flags = in.readInt(); + icon = in.readInt(); + title = DurableUtils.readNullableString(in); + summary = DurableUtils.readNullableString(in); + documentId = DurableUtils.readNullableString(in); + availableBytes = in.readLong(); + mimeTypes = DurableUtils.readNullableString(in); + deriveFields(); + break; + default: + throw new ProtocolException("Unknown version " + version); + } + } + + @Override + public void write(DataOutputStream out) throws IOException { + out.writeInt(VERSION_INIT); + DurableUtils.writeNullableString(out, authority); + DurableUtils.writeNullableString(out, rootId); + out.writeInt(rootType); + out.writeInt(flags); + out.writeInt(icon); + DurableUtils.writeNullableString(out, title); + DurableUtils.writeNullableString(out, summary); + DurableUtils.writeNullableString(out, documentId); + out.writeLong(availableBytes); + DurableUtils.writeNullableString(out, mimeTypes); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + DurableUtils.writeToParcel(dest, this); + } + + public static final Creator<RootInfo> CREATOR = new Creator<RootInfo>() { + @Override + public RootInfo createFromParcel(Parcel in) { + final RootInfo root = new RootInfo(); + DurableUtils.readFromParcel(in, root); + return root; + } + + @Override + public RootInfo[] newArray(int size) { + return new RootInfo[size]; + } + }; public static RootInfo fromRootsCursor(String authority, Cursor cursor) { final RootInfo root = new RootInfo(); @@ -55,15 +150,41 @@ public class RootInfo { root.summary = getCursorString(cursor, Root.COLUMN_SUMMARY); root.documentId = getCursorString(cursor, Root.COLUMN_DOCUMENT_ID); root.availableBytes = getCursorLong(cursor, Root.COLUMN_AVAILABLE_BYTES); + root.mimeTypes = getCursorString(cursor, Root.COLUMN_MIME_TYPES); + root.deriveFields(); + return root; + } - final String raw = getCursorString(cursor, Root.COLUMN_MIME_TYPES); - root.mimeTypes = (raw != null) ? raw.split("\n") : null; + private void deriveFields() { + derivedMimeTypes = (mimeTypes != null) ? mimeTypes.split("\n") : null; - return root; + // TODO: remove these special case icons + if ("com.android.externalstorage.documents".equals(authority)) { + derivedIcon = R.drawable.ic_root_sdcard; + } + if ("com.android.providers.downloads.documents".equals(authority)) { + derivedIcon = R.drawable.ic_root_download; + } + if ("com.android.providers.media.documents".equals(authority)) { + if ("image".equals(rootId)) { + derivedIcon = R.drawable.ic_doc_image; + } else if ("audio".equals(rootId)) { + derivedIcon = R.drawable.ic_doc_audio; + } + } + } + + @Override + public String toString() { + return "Root{title=" + title + ", rootId=" + rootId + "}"; } public Drawable loadIcon(Context context) { - return IconUtils.loadPackageIcon(context, authority, icon); + if (derivedIcon != 0) { + return context.getResources().getDrawable(derivedIcon); + } else { + return IconUtils.loadPackageIcon(context, authority, icon); + } } @Override diff --git a/packages/DocumentsUI/tests/Android.mk b/packages/DocumentsUI/tests/Android.mk new file mode 100644 index 000000000000..fdf4fabacce0 --- /dev/null +++ b/packages/DocumentsUI/tests/Android.mk @@ -0,0 +1,16 @@ + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := tests + +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_JAVA_LIBRARIES := android.test.runner + +LOCAL_PACKAGE_NAME := DocumentsUITests +LOCAL_INSTRUMENTATION_FOR := DocumentsUI + +LOCAL_CERTIFICATE := platform + +include $(BUILD_PACKAGE) diff --git a/packages/DocumentsUI/tests/AndroidManifest.xml b/packages/DocumentsUI/tests/AndroidManifest.xml new file mode 100644 index 000000000000..81a2889a8ee9 --- /dev/null +++ b/packages/DocumentsUI/tests/AndroidManifest.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.documentsui.tests"> + + <application> + <uses-library android:name="android.test.runner" /> + </application> + + <instrumentation android:name="android.test.InstrumentationTestRunner" + android:targetPackage="com.android.documentsui" + android:label="Tests for DocumentsUI" /> + +</manifest> diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/RootsCacheTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/RootsCacheTest.java new file mode 100644 index 000000000000..f53e60dcfcaf --- /dev/null +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/RootsCacheTest.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.documentsui; + +import android.test.AndroidTestCase; +import android.test.suitebuilder.annotation.SmallTest; + +import com.android.documentsui.DocumentsActivity.State; +import com.android.documentsui.model.RootInfo; +import com.google.android.collect.Lists; + +import java.util.List; + +@SmallTest +public class RootsCacheTest extends AndroidTestCase { + + private static RootInfo buildForMimeTypes(String... mimeTypes) { + final RootInfo root = new RootInfo(); + root.mimeTypes = mimeTypes; + return root; + } + + private RootInfo mNull = new RootInfo(); + private RootInfo mEmpty = buildForMimeTypes(); + private RootInfo mWild = buildForMimeTypes("*/*"); + private RootInfo mImages = buildForMimeTypes("image/*"); + private RootInfo mAudio = buildForMimeTypes("audio/*", "application/ogg", "application/x-flac"); + private RootInfo mDocs = buildForMimeTypes("application/msword", "application/vnd.ms-excel"); + private RootInfo mMalformed1 = buildForMimeTypes("meow"); + private RootInfo mMalformed2 = buildForMimeTypes("*/meow"); + + private List<RootInfo> mRoots = Lists.newArrayList( + mNull, mWild, mEmpty, mImages, mAudio, mDocs, mMalformed1, mMalformed2); + + private State mState; + + @Override + protected void setUp() throws Exception { + super.setUp(); + + mState = new State(); + mState.action = State.ACTION_OPEN; + mState.showAdvanced = true; + mState.localOnly = false; + } + + public void testMatchingRootsEverything() throws Exception { + mState.acceptMimes = new String[] { "*/*" }; + assertContainsExactly( + Lists.newArrayList(mNull, mWild, mImages, mAudio, mDocs, mMalformed1, mMalformed2), + RootsCache.getMatchingRoots(mRoots, mState)); + } + + public void testMatchingRootsPngOrWild() throws Exception { + mState.acceptMimes = new String[] { "image/png", "*/*" }; + assertContainsExactly( + Lists.newArrayList(mNull, mWild, mImages, mAudio, mDocs, mMalformed1, mMalformed2), + RootsCache.getMatchingRoots(mRoots, mState)); + } + + public void testMatchingRootsAudioWild() throws Exception { + mState.acceptMimes = new String[] { "audio/*" }; + assertContainsExactly( + Lists.newArrayList(mNull, mWild, mAudio), + RootsCache.getMatchingRoots(mRoots, mState)); + } + + public void testMatchingRootsAudioWildOrImageWild() throws Exception { + mState.acceptMimes = new String[] { "audio/*", "image/*" }; + assertContainsExactly( + Lists.newArrayList(mNull, mWild, mAudio, mImages), + RootsCache.getMatchingRoots(mRoots, mState)); + } + + public void testMatchingRootsAudioSpecific() throws Exception { + mState.acceptMimes = new String[] { "audio/mpeg" }; + assertContainsExactly( + Lists.newArrayList(mNull, mWild, mAudio), + RootsCache.getMatchingRoots(mRoots, mState)); + } + + public void testMatchingRootsDocument() throws Exception { + mState.acceptMimes = new String[] { "application/msword" }; + assertContainsExactly( + Lists.newArrayList(mNull, mWild, mDocs), + RootsCache.getMatchingRoots(mRoots, mState)); + } + + public void testMatchingRootsApplication() throws Exception { + mState.acceptMimes = new String[] { "application/*" }; + assertContainsExactly( + Lists.newArrayList(mNull, mWild, mAudio, mDocs), + RootsCache.getMatchingRoots(mRoots, mState)); + } + + public void testMatchingRootsFlacOrPng() throws Exception { + mState.acceptMimes = new String[] { "application/x-flac", "image/png" }; + assertContainsExactly( + Lists.newArrayList(mNull, mWild, mAudio, mImages), + RootsCache.getMatchingRoots(mRoots, mState)); + } + + private static void assertContainsExactly(List<?> expected, List<?> actual) { + assertEquals(expected.size(), actual.size()); + for (Object o : expected) { + assertTrue(actual.contains(o)); + } + } +} diff --git a/packages/ExternalStorageProvider/res/drawable-hdpi/ic_pdf.png b/packages/ExternalStorageProvider/res/drawable-hdpi/ic_pdf.png Binary files differdeleted file mode 100644 index 961a9bbfcfcf..000000000000 --- a/packages/ExternalStorageProvider/res/drawable-hdpi/ic_pdf.png +++ /dev/null diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java index bbe3b455f54c..226d6351e96f 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java @@ -88,7 +88,6 @@ public class ExternalStorageProvider extends DocumentsProvider { root.rootId = "primary"; root.rootType = Root.ROOT_TYPE_DEVICE; root.flags = Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY | Root.FLAG_ADVANCED; - root.icon = R.drawable.ic_pdf; root.title = getContext().getString(R.string.root_internal_storage); root.docId = getDocIdForFile(path); mRoots.add(root); diff --git a/packages/Keyguard/AndroidManifest.xml b/packages/Keyguard/AndroidManifest.xml index 7d77c48b5636..d2c82c844835 100644 --- a/packages/Keyguard/AndroidManifest.xml +++ b/packages/Keyguard/AndroidManifest.xml @@ -37,6 +37,8 @@ <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" /> <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" /> <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" /> + <!-- Permission to perform hotword recognition --> + <uses-permission android:name="android.permission.HOTWORD_RECOGNITION" /> <application android:label="@string/app_name" android:process="com.android.systemui" diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java index 00124b0563fc..78b842cd474c 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java @@ -1784,30 +1784,23 @@ public class KeyguardHostView extends KeyguardViewBase { } } - public void onHotwordRecognized(final PendingIntent intent) { + public void onHotwordRecognized(final Intent intent) { if (DEBUG) Log.d(TAG, "onHotwordRecognized"); maybeStopHotwordDetector(); + // See if an activity can handle this intent. + if (getContext().getPackageManager().resolveActivity(intent, 0) == null) + return; if (SecurityMode.None == mCurrentSecuritySelection) { if (intent != null) { - try { - intent.send(); - } catch (PendingIntent.CanceledException e) { - Log.w(TAG, "Failed to launch PendingIntent. Encountered CanceledException"); - } + mActivityLauncher.launchActivity(intent, true, true, null, null); } mCallback.userActivity(0); - mCallback.dismiss(false); } else if (ENABLE_HOTWORD_SECURE && mLockPatternUtils.isSecure()) { setOnDismissAction(new OnDismissAction() { @Override public boolean onDismiss() { if (intent != null) { - try { - intent.send(); - } catch (PendingIntent.CanceledException e) { - Log.w(TAG, "Failed to launch PendingIntent." - + "Encountered CanceledException"); - } + mActivityLauncher.launchActivity(intent, true, true, null, null); } return false; } diff --git a/packages/SystemUI/res/drawable-hdpi/ic_notification_overlay.9.png b/packages/SystemUI/res/drawable-hdpi/ic_notification_overlay.9.png Binary files differindex fd33ef33ee57..a93916f99357 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_notification_overlay.9.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_notification_overlay.9.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png Binary files differindex be6bad3536cf..4ff22d2762ce 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png Binary files differindex 5382e0a8245e..612b3622176a 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png Binary files differindex 4c60c68b1cad..c779e7e8df63 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png Binary files differindex f526262fe4d8..a6d47967bea1 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png Binary files differindex dffa104333ab..67a6a731ff14 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png Binary files differindex 5870080d22a7..f972ebd2e8f2 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png Binary files differindex 017e5a1922a9..b707fa1de37c 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png Binary files differindex 362b38ddb43b..82d654531e97 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim0.png Binary files differindex b225e7f0503a..59edd98e81d2 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim0.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim100.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim100.png Binary files differindex e676c2aca6dc..450dd70d80f3 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim100.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim100.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim15.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim15.png Binary files differindex b76a124be2af..ae6fee5f2c0d 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim15.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim15.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim28.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim28.png Binary files differindex 843b833a5dbb..67fa3adc6264 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim28.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim28.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim43.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim43.png Binary files differindex ac0b5eff04fe..ba367ea00f38 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim43.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim43.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim57.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim57.png Binary files differindex 807fdc536665..3ce0c6e44e3f 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim57.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim57.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim71.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim71.png Binary files differindex cdbdea25b4e5..d502d5d8ebf9 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim71.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim71.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim85.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim85.png Binary files differindex 269eab112853..2f4464318e20 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim85.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim85.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png Binary files differindex 1489b90043cd..7ed4c78de97c 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png Binary files differindex fe7d2808aa33..5ce8708db094 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_0.png Binary files differindex a59c84409c17..8f17b724a1c9 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_0.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png Binary files differindex 6253d9a1606d..da941c8e0825 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png Binary files differindex 6253d9a1606d..0fd09d745daa 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png Binary files differindex 0bed6d98c090..cf07aae81803 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png Binary files differindex 0b273311aafc..cfe43dd42c3b 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png Binary files differindex 6bb92a38e73b..50aa77fbaca5 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png Binary files differindex c77c37f0f28b..92a5b1c1e66e 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png Binary files differindex 92e6837bf505..045182c19d4d 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png Binary files differindex 269eae2caba9..9454cd8ab61a 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png Binary files differindex ac2eaf08f3ab..5232169c729b 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png Binary files differindex d9da0d9f5250..6cb18c74eb4e 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png Binary files differindex e02a84b5d652..45ed7ca9f34b 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_tty_mode.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_tty_mode.png Binary files differindex a2aadd926582..ece3450f3f4d 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_tty_mode.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_tty_mode.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png Binary files differindex 986e7fb45993..0060eba9899a 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png Binary files differindex a5795ed4d79f..2b0da2cb78c6 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png Binary files differindex b647f45bf720..faf4153b0883 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png Binary files differindex 02144e59a3da..24755d999ee0 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png Binary files differindex 7eb285fb4acf..6a257051c834 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png Binary files differindex 20364a33549c..3f30896aa52e 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png Binary files differindex 169d6846fc75..c6098479312c 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png Binary files differindex 850150ae53dd..87da72bc5956 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png Binary files differindex 7279d5a648ad..6248cfd7b09b 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png Binary files differindex 546a222a3648..8c3e896fb37c 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png Binary files differindex 4ecb2a8d9764..b477332dbe97 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png Binary files differindex f0b0588df0a2..b477332dbe97 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1.png Binary files differindex 2c86ddf03fce..395adadf1dbd 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png Binary files differindex 508a0737b48f..36cb7e54b763 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2.png Binary files differindex 6232c94d8bb8..4ded92394645 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png Binary files differindex 73c5c2cc08ad..cc30aa1973d2 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3.png Binary files differindex 49c0c0b3c1ae..568c29671e90 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png Binary files differindex a03ac3873b28..6f0b419846ed 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4.png Binary files differindex 21e5ae83ad98..000f93dd5f41 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png Binary files differindex 8cfc0f84f1b0..01d47c57793c 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png Binary files differindex ecca5d53ee95..cd4056cdcc37 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png Binary files differindex bea4247c69d6..6f457e0be5ec 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png Binary files differindex 3fda61d18857..6f457e0be5ec 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1.png Binary files differindex 28dd0abdf2a9..33a35d055037 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png Binary files differindex 7c01b4061633..45d733e8aa03 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2.png Binary files differindex dbd3c59838cb..71e396e2f25c 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png Binary files differindex 2cf3eff277f3..093387af55b3 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3.png Binary files differindex 19cdc6138ac8..b61b1e037c9b 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png Binary files differindex 0478d4aeaa6a..2f32c4cdd53a 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4.png Binary files differindex 126e31d1c63e..7121abba0663 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png Binary files differindex d32e3096af29..8e9ba9c55d34 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png Binary files differindex b961902d49e7..c18d10317431 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png Binary files differindex dca7457fbc47..60ede0a47687 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png Binary files differindex 474795c0f4db..a22fa28f10fe 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1.png Binary files differindex 8718fa8f3f60..ef913284a6a4 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png Binary files differindex 6710650fd825..26a0543f07a3 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2.png Binary files differindex dcfd2d192344..ffb3b559dd57 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png Binary files differindex caa4189bef5e..ec311628c36b 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3.png Binary files differindex 69cc6c493395..85eef224ac2d 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png Binary files differindex 7e0158f32d0f..26cd26f7cfbb 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4.png Binary files differindex 9d5b2c7767f1..5aeb91327f38 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png Binary files differindex 03b5c5537876..25ed6265c0b1 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png Binary files differindex 2ef75ac429ed..37da33399f41 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png Binary files differindex db8d8c138c40..5950ef8ac36f 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png Binary files differindex db8d8c138c40..a930649fd852 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1.png Binary files differindex 1d21ea1ae436..dc4a01e6da95 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png Binary files differindex d1609d606aa3..9245462fb096 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2.png Binary files differindex fe80d3d5b6d8..bb6fd30f245e 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png Binary files differindex ef7312360166..b5b8884fc38e 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3.png Binary files differindex a80d45abb7dd..b77c83385e25 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png Binary files differindex d40cb3f06c78..11b58327a1d2 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4.png Binary files differindex 880a7355e62f..448d79b0d3d5 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png Binary files differindex f11bffff6df4..ff8246ef7abc 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_notification_overlay.9.png b/packages/SystemUI/res/drawable-mdpi/ic_notification_overlay.9.png Binary files differindex 667b13d8ff31..7ae60792c199 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_notification_overlay.9.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_notification_overlay.9.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png Binary files differindex 017023ed9d26..edcb1b3d9cdc 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png Binary files differindex 09f30c3bd2bb..8e0ec0f47c52 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png Binary files differindex 580a81c0237a..62807cdc1271 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png Binary files differindex 6b4383dc5dde..868bbbc28a1e 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png Binary files differindex 9d304470e446..890129e94b0b 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png Binary files differindex 3c4c07f1eb79..86279af539d9 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png Binary files differindex b5436397331b..de2aa4e5c5b1 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png Binary files differindex 3c59cbb14e4a..c008d6f4c95c 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim0.png Binary files differindex 3ae122816228..62ab39a50b90 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim0.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim100.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim100.png Binary files differindex cc4d343639a8..4082a2ced614 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim100.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim100.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim15.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim15.png Binary files differindex e26142fbc6a4..8c1c15a76a3d 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim15.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim15.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim28.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim28.png Binary files differindex f088b6b76f1a..6ba3496df394 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim28.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim28.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim43.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim43.png Binary files differindex bbbe14a0ca5d..4a91d65a9cea 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim43.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim43.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim57.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim57.png Binary files differindex d4370fdbcdb6..18d61987725a 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim57.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim57.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim71.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim71.png Binary files differindex 82057f811513..a11e57ecec31 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim71.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim71.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim85.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim85.png Binary files differindex faacde9723bf..5a3a627cba9c 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim85.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim85.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png Binary files differindex a28235b1c92b..bd4e1ae0dfad 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png Binary files differindex 6a08773a9900..bdf0f67d546e 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png Binary files differindex 55173f8165af..ca0260573380 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png Binary files differindex 55173f8165af..2dcbe28aaf0d 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png Binary files differindex 6649d7cf6b42..c3c6b9326b6a 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png Binary files differindex dcfe5b492ec5..fe7189308ed4 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png Binary files differindex be3fe62d2d80..bb2e9baec648 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png Binary files differindex 734c52ae76f0..a6c61fff5df1 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png Binary files differindex 0deb8686158e..6583922bf443 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png Binary files differindex d808990bc251..ba4a9d9b6c94 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png Binary files differindex f890c2b3fe56..9b1cbcce9c96 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png Binary files differindex 0e11ce84eaf7..79c2ec16a29d 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png Binary files differindex 1ffeaa35d9af..454861762cea 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_tty_mode.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_tty_mode.png Binary files differindex fb70ba874fd0..b4db0bb235bf 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_tty_mode.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_tty_mode.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png Binary files differindex 716cc7c81186..3cc96ee3b447 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png Binary files differindex 5891ff0eba4d..3fb4427342db 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png Binary files differindex 188ea3d61b46..34ae3bf53884 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png Binary files differindex b42650f38125..abcc317ddbb4 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png Binary files differindex 17680cec3dd9..cb3623a68cbc 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png Binary files differindex add0a9325d3c..a3b267806aa2 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png Binary files differindex 7023c4f0b29c..4f9a8b05cf14 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png Binary files differindex 6f2a767cc3f4..b4278f2c6ab6 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png Binary files differindex 318bfd5002ca..441de0ce78f8 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png Binary files differindex 26ea7b64a6ed..34abc98e519d 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png diff --git a/packages/SystemUI/res/drawable-nodpi/lightning.png b/packages/SystemUI/res/drawable-nodpi/lightning.png Binary files differdeleted file mode 100644 index 29de3085a533..000000000000 --- a/packages/SystemUI/res/drawable-nodpi/lightning.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_notification_overlay.9.png b/packages/SystemUI/res/drawable-xhdpi/ic_notification_overlay.9.png Binary files differindex 8758b02fd664..aae807b72ff8 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_notification_overlay.9.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_notification_overlay.9.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png Binary files differindex 11305ea47613..8ea54eee32ec 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png Binary files differindex 9cd3dbbb3a08..877abf42a3f0 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png Binary files differindex 2c6a018de777..1e68ac7846f9 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png Binary files differindex 045a0801a763..c4b77ec07659 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png Binary files differindex 91d96941e451..9983d60cf6d8 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png Binary files differindex c87bbf21a84c..de09dc6f5217 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png Binary files differindex d6290959247a..99908696f08c 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png Binary files differindex da7dc8f83a30..7a630f93f80b 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim0.png Binary files differindex 3350a2d978bf..4378a8954b13 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim0.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim0.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim100.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim100.png Binary files differindex 8af85158e05f..dc144aacffbc 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim100.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim100.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim15.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim15.png Binary files differindex af3f5f577152..722148ce3b33 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim15.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim15.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim28.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim28.png Binary files differindex 919e71dfd947..a3d11f2333c1 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim28.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim28.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim43.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim43.png Binary files differindex 4d925032b2e5..9e63b786b069 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim43.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim43.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim57.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim57.png Binary files differindex b7aa3d1feb47..74f912971bfd 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim57.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim57.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim71.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim71.png Binary files differindex 0b25ab351dff..38838fe29491 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim71.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim71.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim85.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim85.png Binary files differindex b6992963b550..28d26f2d28c2 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim85.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim85.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png Binary files differindex 0896225571d8..757dbf3be7c5 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png Binary files differindex eeac6ade4622..461535cc24f3 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png Binary files differindex 8b34373471aa..659275f251dc 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png Binary files differindex 8b34373471aa..17c0d9994a3e 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png Binary files differindex 610e78f1e1dd..23288de8e0d9 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png Binary files differindex f682a0ee15c1..8a5a476cc425 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png Binary files differindex 5bb372e3b72c..32e05feb06c8 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png Binary files differindex ef05975e9e3e..a6c12b2eb1db 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png Binary files differindex d556733a32a2..f2f88a12d5fa 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png Binary files differindex c5088b513ce5..3fdc60e7465b 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png Binary files differindex e1bd8bd29820..7a38994b24d1 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png Binary files differindex c82a4350bcba..b09247e1aca5 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png Binary files differindex 298b27d693b1..3b94b6b94c64 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png Binary files differindex 0ae59e3fd1fc..e402ff66322c 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1.png Binary files differindex 172ab5b9f22b..a93e3a87bef1 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png Binary files differindex 0368f1723963..313ce4e81239 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2.png Binary files differindex 669750f6b16a..24b47b2c9c53 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png Binary files differindex 2813464ef15d..546c7a8412e6 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3.png Binary files differindex 5e11523563d5..b4b3f0265747 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png Binary files differindex 811038c3e5b1..ec45d867cabe 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4.png Binary files differindex b6b65553c83e..758ebe7117b8 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png Binary files differindex b4821d7b93c4..459a1a2e83ce 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png Binary files differindex bdf7bcad215c..d6f752afc76a 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_notification_overlay.9.png b/packages/SystemUI/res/drawable-xxhdpi/ic_notification_overlay.9.png Binary files differnew file mode 100644 index 000000000000..fa7de0ed0d87 --- /dev/null +++ b/packages/SystemUI/res/drawable-xxhdpi/ic_notification_overlay.9.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png Binary files differindex 0795f3aa1cfe..2d916d7b7fd9 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png Binary files differindex 5b002df789b2..fe3c7506bab7 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png Binary files differindex c03248aaf558..d02693668a7f 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png Binary files differindex e489d2c39134..224be03d419a 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png Binary files differindex 68a1be8db6cd..dabed32a8a60 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png Binary files differindex e5f639d7a6f2..82d04c5754e6 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png Binary files differindex ddfa4241d882..1d403c6fccf3 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png Binary files differindex 3b3025bba45f..b917d37be165 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim0.png Binary files differindex 7ece3af60498..3356733c8308 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim0.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim0.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim100.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim100.png Binary files differindex 2f4cf038129c..080bdda83246 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim100.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim100.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim15.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim15.png Binary files differindex 8179ebae54df..0d1e47a81a80 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim15.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim15.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim28.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim28.png Binary files differindex 5c925c12580d..f5650463b217 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim28.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim28.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim43.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim43.png Binary files differindex f52767975149..378d4335d105 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim43.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim43.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim57.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim57.png Binary files differindex fab08f48c591..3bd5759b41f6 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim57.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim57.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim71.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim71.png Binary files differindex 1f8dc5ec83fd..3d56db460f70 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim71.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim71.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim85.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim85.png Binary files differindex 7f1f977a558b..2d24d99983d9 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim85.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim85.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png Binary files differindex b9825f905a3a..17ffdb9a4128 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png Binary files differindex 32415c22ee35..7b03a11d1acf 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png Binary files differindex 361ff48f3295..3c9d3e6083dc 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png Binary files differindex 937839b9976d..065f1dabbe28 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1.png Binary files differindex d185a4d63582..afacef534517 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png Binary files differindex 2bd6eb10c3d2..da2da18dd3f0 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2.png Binary files differindex 95946078c2f6..1b1c86351bf0 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png Binary files differindex aad369e1bc3c..30c5abfb8fa6 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3.png Binary files differindex 6f9f50c4549e..99094e3624f4 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png Binary files differindex c76e188e9c3d..e49fd0a05b10 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4.png Binary files differindex 75a182fc3cfd..8aff99988a94 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png Binary files differindex 1889813158a8..c5114e7f1d66 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png Binary files differindex 93fd9b6bc243..bc272edc09b4 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1.png Binary files differindex a8681ec7139b..3fe77d0838eb 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png Binary files differindex 47a04cbf6baa..d032db365661 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2.png Binary files differindex 343eef90e7dc..dec522d9c991 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png Binary files differindex 033bced28b53..562101b91b9a 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3.png Binary files differindex 168f8ffd7635..9e679c229e32 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png Binary files differindex c546e080c469..ceb416380983 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4.png Binary files differindex a7b32c92e8e8..f4c7250cb64d 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png Binary files differindex 1126d9bf31b7..494b005326d8 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png Binary files differindex 5f8e67b462bf..3da56adb9dc9 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png diff --git a/packages/SystemUI/res/values/arrays.xml b/packages/SystemUI/res/values/arrays.xml index 174fb9e34081..b2c8aee4aaf6 100644 --- a/packages/SystemUI/res/values/arrays.xml +++ b/packages/SystemUI/res/values/arrays.xml @@ -47,9 +47,18 @@ <item>100</item> </array> <array name="batterymeter_color_values"> - <item>#FFFF0000</item> - <item>#FFFE6600</item> + <item>#FFFF3300</item> + <item>#FFFF3300</item> <item>#FFFFFFFF</item> </array> - + <array name="batterymeter_bolt_points"> + <item>88</item> <item>0</item> + <item>459</item><item>1</item> + <item>238</item><item>333</item> + <item>525</item><item>310</item> + <item>120</item><item>840</item> + <item>82</item> <item>818</item> + <item>246</item><item>373</item> + <item>0</item> <item>408</item> + </array> </resources> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index 2c06aec1405c..67a932a8a3f2 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -34,8 +34,7 @@ <drawable name="heads_up_notification_bg_pressed">#ff33B5E5</drawable> <drawable name="notification_header_bg">#FF000000</drawable> <color name="notification_panel_scrim_color">#B0000000</color> - - <color name="batterymeter_frame_color">#33FFFFFF</color> - <color name="batterymeter_charge_color">#7FFFFFFF</color> + <color name="batterymeter_frame_color">#66FFFFFF</color><!-- 40% white --> + <color name="batterymeter_charge_color">#FFFFFFFF</color> <color name="status_bar_clock_color">#FFFFFFFF</color> </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index e0b3bc62bb72..3076ab4c824a 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -89,7 +89,7 @@ <dimen name="status_bar_icon_drawing_size">18dip</dimen> <!-- opacity at which Notification icons will be drawn in the status bar --> - <item type="dimen" name="status_bar_icon_drawing_alpha">65%</item> + <item type="dimen" name="status_bar_icon_drawing_alpha">75%</item> <!-- gap on either side of status bar notification icons --> <dimen name="status_bar_icon_padding">0dp</dimen> diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java index 6a0f6e3e3107..2257617b5429 100755 --- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java @@ -24,10 +24,12 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Typeface; -import android.graphics.drawable.Drawable; import android.os.BatteryManager; import android.os.Bundle; import android.provider.Settings; @@ -48,15 +50,21 @@ public class BatteryMeterView extends View implements DemoMode { int[] mColors; boolean mShowPercent = true; - Paint mFramePaint, mBatteryPaint, mWarningTextPaint, mTextPaint; + Paint mFramePaint, mBatteryPaint, mWarningTextPaint, mTextPaint, mBoltPaint; int mButtonHeight; private float mTextHeight, mWarningTextHeight; - Drawable mLightning; private int mHeight; private int mWidth; private String mWarningString; private final int mChargeColor; + private final float[] mBoltPoints; + private final Path mBoltPath = new Path(); + + private final RectF mFrame = new RectF(); + private final RectF mButtonFrame = new RectF(); + private final RectF mClipFrame = new RectF(); + private final Rect mBoltFrame = new Rect(); private class BatteryTracker extends BroadcastReceiver { // current battery status @@ -169,7 +177,8 @@ public class BatteryMeterView extends View implements DemoMode { mColors[2*i] = levels.getInt(i, 0); mColors[2*i+1] = colors.getColor(i, 0); } - + levels.recycle(); + colors.recycle(); mShowPercent = ENABLE_PERCENT && 0 != Settings.System.getInt( context.getContentResolver(), "status_bar_show_battery_percent", 0); @@ -192,8 +201,28 @@ public class BatteryMeterView extends View implements DemoMode { mWarningTextPaint.setTypeface(font); mWarningTextPaint.setTextAlign(Paint.Align.CENTER); - mLightning = getResources().getDrawable(R.drawable.lightning); mChargeColor = getResources().getColor(R.color.batterymeter_charge_color); + + mBoltPaint = new Paint(); + mBoltPaint.setAntiAlias(true); + mBoltPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); // punch hole + setLayerType(LAYER_TYPE_HARDWARE, null); + mBoltPoints = loadBoltPoints(res); + } + + private static float[] loadBoltPoints(Resources res) { + final int[] pts = res.getIntArray(R.array.batterymeter_bolt_points); + int maxX = 0, maxY = 0; + for (int i = 0; i < pts.length; i += 2) { + maxX = Math.max(maxX, pts[i]); + maxY = Math.max(maxY, pts[i + 1]); + } + final float[] ptsF = new float[pts.length]; + for (int i = 0; i < pts.length; i += 2) { + ptsF[i] = (float)pts[i] / maxX; + ptsF[i + 1] = (float)pts[i + 1] / maxY; + } + return ptsF; } @Override @@ -228,22 +257,19 @@ public class BatteryMeterView extends View implements DemoMode { mButtonHeight = (int) (height * 0.12f); - final RectF frame = new RectF(0, 0, width, height); - frame.offset(pl, pt); - - // Log.v("BatteryGauge", String.format("canvas: %dx%d frame: %s", - // c.getWidth(), c.getHeight(), frame.toString())); + mFrame.set(0, 0, width, height); + mFrame.offset(pl, pt); - final RectF buttonframe = new RectF( - frame.left + width * 0.25f, - frame.top, - frame.right - width * 0.25f, - frame.top + mButtonHeight); + mButtonFrame.set( + mFrame.left + width * 0.25f, + mFrame.top, + mFrame.right - width * 0.25f, + mFrame.top + mButtonHeight); - frame.top += mButtonHeight; + mFrame.top += mButtonHeight; // first, draw the battery shape - c.drawRect(frame, mFramePaint); + c.drawRect(mFrame, mFramePaint); // fill 'er up final int pct = tracker.level; @@ -256,15 +282,14 @@ public class BatteryMeterView extends View implements DemoMode { drawFrac = 0f; } - c.drawRect(buttonframe, - drawFrac == 1f ? mBatteryPaint : mFramePaint); + c.drawRect(mButtonFrame, drawFrac == 1f ? mBatteryPaint : mFramePaint); - RectF clip = new RectF(frame); - clip.top += (frame.height() * (1f - drawFrac)); + mClipFrame.set(mFrame); + mClipFrame.top += (mFrame.height() * (1f - drawFrac)); c.save(Canvas.CLIP_SAVE_FLAG); - c.clipRect(clip); - c.drawRect(frame, mBatteryPaint); + c.clipRect(mClipFrame); + c.drawRect(mFrame, mBatteryPaint); c.restore(); if (level <= EMPTY) { @@ -272,11 +297,28 @@ public class BatteryMeterView extends View implements DemoMode { final float y = (mHeight + mWarningTextHeight) * 0.48f; c.drawText(mWarningString, x, y, mWarningTextPaint); } else if (tracker.plugged) { - final Rect r = new Rect( - (int)frame.left + width / 4, (int)frame.top + height / 5, - (int)frame.right - width / 4, (int)frame.bottom - height / 6); - mLightning.setBounds(r); - mLightning.draw(c); + // draw the bolt + final int bl = (int)(mFrame.left + width / 4f); + final int bt = (int)(mFrame.top + height / 6f); + final int br = (int)(mFrame.right - width / 5f); + final int bb = (int)(mFrame.bottom - height / 6f); + if (mBoltFrame.left != bl || mBoltFrame.top != bt + || mBoltFrame.right != br || mBoltFrame.bottom != bb) { + mBoltFrame.set(bl, bt, br, bb); + mBoltPath.reset(); + mBoltPath.moveTo( + mBoltFrame.left + mBoltPoints[0] * mBoltFrame.width(), + mBoltFrame.top + mBoltPoints[1] * mBoltFrame.height()); + for (int i = 2; i < mBoltPoints.length; i += 2) { + mBoltPath.lineTo( + mBoltFrame.left + mBoltPoints[i] * mBoltFrame.width(), + mBoltFrame.top + mBoltPoints[i + 1] * mBoltFrame.height()); + } + mBoltPath.lineTo( + mBoltFrame.left + mBoltPoints[0] * mBoltFrame.width(), + mBoltFrame.top + mBoltPoints[1] * mBoltFrame.height()); + } + c.drawPath(mBoltPath, mBoltPaint); } else if (mShowPercent && !(tracker.level == 100 && !SHOW_100_PERCENT)) { mTextPaint.setTextSize(height * (SINGLE_DIGIT_PERCENT ? 0.75f @@ -290,17 +332,6 @@ public class BatteryMeterView extends View implements DemoMode { x, y, mTextPaint); - -// Paint pt = new Paint(); -// pt.setStrokeWidth(1f); -// pt.setStyle(Paint.Style.STROKE); -// pt.setColor(0xFFFF0000); -// c.drawRect(x, y-mTextHeight, x+tw, y, pt); -// -// Slog.v(TAG, "tw=" + tw + " th=" + mTextHeight); -// -// pt.setColor(0xFFFF00FF); -// c.drawRect(1, 1, mWidth, mHeight, pt); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index 63e0c7acf697..b263a6ecbd04 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -16,10 +16,6 @@ package com.android.systemui.statusbar.phone; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT; - -import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.app.ActivityManager; @@ -57,8 +53,7 @@ public class PhoneStatusBarView extends PanelBar { private final int mTransparent; private final float mAlphaWhenOpaque; private final float mAlphaWhenTransparent = 1; - private View mLeftSide; - private View mRightSide; + private View mLeftSide, mStatusIcons, mSignalCluster, mClock; public StatusBarTransitions(Context context) { super(context, PhoneStatusBarView.this); @@ -69,7 +64,9 @@ public class PhoneStatusBarView extends PanelBar { public void init() { mLeftSide = findViewById(R.id.notification_icon_area); - mRightSide = findViewById(R.id.system_icon_area); + mStatusIcons = findViewById(R.id.statusIcons); + mSignalCluster = findViewById(R.id.signal_battery_cluster); + mClock = findViewById(R.id.clock); applyMode(getMode(), false /*animate*/); } @@ -84,8 +81,11 @@ public class PhoneStatusBarView extends PanelBar { } public float getAlphaFor(int mode) { - final boolean isTransparent = mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSPARENT; - return isTransparent ? mAlphaWhenTransparent : mAlphaWhenOpaque; + return isTransparent(mode) ? mAlphaWhenTransparent : mAlphaWhenOpaque; + } + + private boolean isTransparent(int mode) { + return mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSPARENT; } @Override @@ -95,17 +95,22 @@ public class PhoneStatusBarView extends PanelBar { } private void applyMode(int mode, boolean animate) { - if (mLeftSide == null || mRightSide == null) return; + if (mLeftSide == null) return; // pre-init float newAlpha = getAlphaFor(mode); if (animate) { - ObjectAnimator lhs = animateTransitionTo(mLeftSide, newAlpha); - ObjectAnimator rhs = animateTransitionTo(mRightSide, newAlpha); - AnimatorSet set = new AnimatorSet(); - set.playTogether(lhs, rhs); - set.start(); + AnimatorSet anims = new AnimatorSet(); + anims.playTogether( + animateTransitionTo(mLeftSide, newAlpha), + animateTransitionTo(mStatusIcons, newAlpha), + animateTransitionTo(mSignalCluster, newAlpha), + animateTransitionTo(mClock, newAlpha) + ); + anims.start(); } else { mLeftSide.setAlpha(newAlpha); - mRightSide.setAlpha(newAlpha); + mStatusIcons.setAlpha(newAlpha); + mSignalCluster.setAlpha(newAlpha); + mClock.setAlpha(newAlpha); } } } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index d377902ae52e..27bf38cc3d9f 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -460,6 +460,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { PowerManager.WakeLock mBroadcastWakeLock; boolean mHavePendingMediaKeyRepeatWithWakeLock; + private int mCurrentUserId; + // Maps global key codes to the components that will handle them. private GlobalKeyManager mGlobalKeyManager; @@ -4813,7 +4815,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { ResolveInfo info = mContext.getPackageManager().resolveActivityAsUser( intent, PackageManager.MATCH_DEFAULT_ONLY | PackageManager.GET_META_DATA, - getCurrentUserId()); + mCurrentUserId); if (info != null) { ai = info.activityInfo; } @@ -4828,16 +4830,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { return null; } - private int getCurrentUserId() { - try { - UserInfo user = ActivityManagerNative.getDefault().getCurrentUser(); - return user != null ? user.id : UserHandle.USER_NULL; - } catch (RemoteException e) { - // noop - } - return UserHandle.USER_NULL; - } - void startDockOrHome() { awakenDreams(); @@ -5093,9 +5085,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean oldTransientNav = isTransientNavigationAllowed(oldVis); boolean isTransientNav = isTransientNavigationAllowed(vis); if (mFocusedWindow != null && oldTransientNav != isTransientNav) { - final int uid = getCurrentUserId(); final String pkg = mFocusedWindow.getOwningPackage(); - mTransientNavigationConfirmation.transientNavigationChanged(uid, pkg, isTransientNav); + mTransientNavigationConfirmation.transientNavigationChanged(mCurrentUserId, pkg, + isTransientNav); } vis = mNavigationBarController.updateVisibilityLw(isTransientNav, oldVis, vis); @@ -5174,6 +5166,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public void setCurrentUserLw(int newUserId) { + mCurrentUserId = newUserId; if (mKeyguardDelegate != null) { mKeyguardDelegate.setCurrentUser(newUserId); } diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index ad9192a570ca..c4eb7a433d3a 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -5358,47 +5358,53 @@ class BackupManagerService extends IBackupManager.Stub { } // Enable/disable the backup service + @Override public void setBackupEnabled(boolean enable) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "setBackupEnabled"); Slog.i(TAG, "Backup enabled => " + enable); - boolean wasEnabled = mEnabled; - synchronized (this) { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.BACKUP_ENABLED, enable ? 1 : 0); - mEnabled = enable; - } + long oldId = Binder.clearCallingIdentity(); + try { + boolean wasEnabled = mEnabled; + synchronized (this) { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.BACKUP_ENABLED, enable ? 1 : 0); + mEnabled = enable; + } - synchronized (mQueueLock) { - if (enable && !wasEnabled && mProvisioned) { - // if we've just been enabled, start scheduling backup passes - startBackupAlarmsLocked(BACKUP_INTERVAL); - } else if (!enable) { - // No longer enabled, so stop running backups - if (DEBUG) Slog.i(TAG, "Opting out of backup"); - - mAlarmManager.cancel(mRunBackupIntent); - - // This also constitutes an opt-out, so we wipe any data for - // this device from the backend. We start that process with - // an alarm in order to guarantee wakelock states. - if (wasEnabled && mProvisioned) { - // NOTE: we currently flush every registered transport, not just - // the currently-active one. - HashSet<String> allTransports; - synchronized (mTransports) { - allTransports = new HashSet<String>(mTransports.keySet()); - } - // build the set of transports for which we are posting an init - for (String transport : allTransports) { - recordInitPendingLocked(true, transport); + synchronized (mQueueLock) { + if (enable && !wasEnabled && mProvisioned) { + // if we've just been enabled, start scheduling backup passes + startBackupAlarmsLocked(BACKUP_INTERVAL); + } else if (!enable) { + // No longer enabled, so stop running backups + if (DEBUG) Slog.i(TAG, "Opting out of backup"); + + mAlarmManager.cancel(mRunBackupIntent); + + // This also constitutes an opt-out, so we wipe any data for + // this device from the backend. We start that process with + // an alarm in order to guarantee wakelock states. + if (wasEnabled && mProvisioned) { + // NOTE: we currently flush every registered transport, not just + // the currently-active one. + HashSet<String> allTransports; + synchronized (mTransports) { + allTransports = new HashSet<String>(mTransports.keySet()); + } + // build the set of transports for which we are posting an init + for (String transport : allTransports) { + recordInitPendingLocked(true, transport); + } + mAlarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), + mRunInitIntent); } - mAlarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), - mRunInitIntent); } } + } finally { + Binder.restoreCallingIdentity(oldId); } } diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index 7f9dc26fe364..02a78dea3320 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -184,7 +184,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { private static final String ACTION_PKT_CNT_SAMPLE_INTERVAL_ELAPSED = "android.net.ConnectivityService.action.PKT_CNT_SAMPLE_INTERVAL_ELAPSED"; - private static final int SAMPLE_INTERVAL_ELAPSED_REQURST_CODE = 0; + private static final int SAMPLE_INTERVAL_ELAPSED_REQUEST_CODE = 0; private PendingIntent mSampleIntervalElapsedIntent; @@ -661,7 +661,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { // start network sampling .. Intent intent = new Intent(ACTION_PKT_CNT_SAMPLE_INTERVAL_ELAPSED, null); mSampleIntervalElapsedIntent = PendingIntent.getBroadcast(mContext, - SAMPLE_INTERVAL_ELAPSED_REQURST_CODE, intent, 0); + SAMPLE_INTERVAL_ELAPSED_REQUEST_CODE, intent, 0); mAlarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE); setAlarm(DEFAULT_START_SAMPLING_INTERVAL_IN_SECONDS * 1000, mSampleIntervalElapsedIntent); @@ -2299,6 +2299,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { } thisNet.setTeardownRequested(false); updateNetworkSettings(thisNet); + updateMtuSizeSettings(thisNet); handleConnectivityChange(newNetType, false); sendConnectedBroadcastDelayed(info, getConnectivityChangeDelay()); @@ -2636,6 +2637,26 @@ public class ConnectivityService extends IConnectivityManager.Stub { return routesChanged; } + /** + * Reads the network specific MTU size from reources. + * and set it on it's iface. + */ + private void updateMtuSizeSettings(NetworkStateTracker nt) { + final String iface = nt.getLinkProperties().getInterfaceName(); + final int mtu = nt.getLinkProperties().getMtu(); + + if (mtu < 68 || mtu > 10000) { + loge("Unexpected mtu value: " + nt); + return; + } + + try { + if (VDBG) log("Setting MTU size: " + iface + ", " + mtu); + mNetd.setMtu(iface, mtu); + } catch (Exception e) { + Slog.e(TAG, "exception in setMtu()" + e); + } + } /** * Reads the network specific TCP buffer sizes from SystemProperties @@ -3017,7 +3038,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { public void handleMessage(Message msg) { NetworkInfo info; switch (msg.what) { - case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: + case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: { String causedBy = null; synchronized (ConnectivityService.this) { if (msg.arg1 == mNetTransitionWakeLockSerialNumber && @@ -3030,49 +3051,44 @@ public class ConnectivityService extends IConnectivityManager.Stub { log("NetTransition Wakelock for " + causedBy + " released by timeout"); } break; - case EVENT_RESTORE_DEFAULT_NETWORK: + } + case EVENT_RESTORE_DEFAULT_NETWORK: { FeatureUser u = (FeatureUser)msg.obj; u.expire(); break; - case EVENT_INET_CONDITION_CHANGE: - { + } + case EVENT_INET_CONDITION_CHANGE: { int netType = msg.arg1; int condition = msg.arg2; handleInetConditionChange(netType, condition); break; } - case EVENT_INET_CONDITION_HOLD_END: - { + case EVENT_INET_CONDITION_HOLD_END: { int netType = msg.arg1; int sequence = msg.arg2; handleInetConditionHoldEnd(netType, sequence); break; } - case EVENT_SET_NETWORK_PREFERENCE: - { + case EVENT_SET_NETWORK_PREFERENCE: { int preference = msg.arg1; handleSetNetworkPreference(preference); break; } - case EVENT_SET_MOBILE_DATA: - { + case EVENT_SET_MOBILE_DATA: { boolean enabled = (msg.arg1 == ENABLED); handleSetMobileData(enabled); break; } - case EVENT_APPLY_GLOBAL_HTTP_PROXY: - { + case EVENT_APPLY_GLOBAL_HTTP_PROXY: { handleDeprecatedGlobalHttpProxy(); break; } - case EVENT_SET_DEPENDENCY_MET: - { + case EVENT_SET_DEPENDENCY_MET: { boolean met = (msg.arg1 == ENABLED); handleSetDependencyMet(msg.arg2, met); break; } - case EVENT_SEND_STICKY_BROADCAST_INTENT: - { + case EVENT_SEND_STICKY_BROADCAST_INTENT: { Intent intent = (Intent)msg.obj; sendStickyBroadcast(intent); break; @@ -3101,10 +3117,12 @@ public class ConnectivityService extends IConnectivityManager.Stub { log("EVENT_ENABLE_FAIL_FAST_MOBILE_DATA: stale arg1:" + msg.arg1 + " != tag:" + tag); } + break; } - case EVENT_SAMPLE_INTERVAL_ELAPSED: + case EVENT_SAMPLE_INTERVAL_ELAPSED: { handleNetworkSamplingTimeout(); break; + } } } } @@ -3911,39 +3929,41 @@ public class ConnectivityService extends IConnectivityManager.Stub { /** * No connection was possible to the network. + * This is NOT a warm sim. */ - public static final int CMP_RESULT_CODE_NO_CONNECTION = 0; + private static final int CMP_RESULT_CODE_NO_CONNECTION = 0; /** * A connection was made to the internet, all is well. + * This is NOT a warm sim. */ - public static final int CMP_RESULT_CODE_CONNECTABLE = 1; + private static final int CMP_RESULT_CODE_CONNECTABLE = 1; /** - * A connection was made but there was a redirection, we appear to be in walled garden. - * This is an indication of a warm sim on a mobile network. + * A connection was made but no dns server was available to resolve a name to address. + * This is NOT a warm sim since provisioning network is supported. */ - public static final int CMP_RESULT_CODE_REDIRECTED = 2; + private static final int CMP_RESULT_CODE_NO_DNS = 2; /** - * A connection was made but no dns server was available to resolve a name to address. - * This is an indication of a warm sim on a mobile network. + * A connection was made but could not open a TCP connection. + * This is NOT a warm sim since provisioning network is supported. */ - public static final int CMP_RESULT_CODE_NO_DNS = 3; + private static final int CMP_RESULT_CODE_NO_TCP_CONNECTION = 3; /** - * A connection was made but could not open a TCP connection. - * This is an indication of a warm sim on a mobile network. + * A connection was made but there was a redirection, we appear to be in walled garden. + * This is an indication of a warm sim on a mobile network such as T-Mobile. */ - public static final int CMP_RESULT_CODE_NO_TCP_CONNECTION = 4; + private static final int CMP_RESULT_CODE_REDIRECTED = 4; /** * The mobile network is a provisioning network. - * This is an indication of a warm sim on a mobile network. + * This is an indication of a warm sim on a mobile network such as AT&T. */ - public static final int CMP_RESULT_CODE_PROVISIONING_NETWORK = 5; + private static final int CMP_RESULT_CODE_PROVISIONING_NETWORK = 5; - AtomicBoolean mIsCheckingMobileProvisioning = new AtomicBoolean(false); + private AtomicBoolean mIsCheckingMobileProvisioning = new AtomicBoolean(false); @Override public int checkMobileProvisioning(int suggestedTimeOutMs) { @@ -4018,7 +4038,9 @@ public class ConnectivityService extends IConnectivityManager.Stub { mNetTrackers[ConnectivityManager.TYPE_MOBILE_HIPRI].getNetworkInfo(); switch(result) { case CMP_RESULT_CODE_CONNECTABLE: - case CMP_RESULT_CODE_NO_CONNECTION: { + case CMP_RESULT_CODE_NO_CONNECTION: + case CMP_RESULT_CODE_NO_DNS: + case CMP_RESULT_CODE_NO_TCP_CONNECTION: { if (DBG) log("CheckMp.onComplete: ignore, connected or no connection"); break; } @@ -4037,8 +4059,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { } break; } - case CMP_RESULT_CODE_NO_DNS: - case CMP_RESULT_CODE_NO_TCP_CONNECTION: { + case CMP_RESULT_CODE_PROVISIONING_NETWORK: { String url = getMobileProvisioningUrl(); if (TextUtils.isEmpty(url) == false) { if (DBG) log("CheckMp.onComplete: warm (no dns/tcp), url=" + url); @@ -4204,8 +4225,8 @@ public class ConnectivityService extends IConnectivityManager.Stub { MobileDataStateTracker mdst = (MobileDataStateTracker) mCs.mNetTrackers[ConnectivityManager.TYPE_MOBILE_HIPRI]; if (mdst.isProvisioningNetwork()) { - if (DBG) log("isMobileOk: isProvisioningNetwork is true, no TCP conn"); - result = CMP_RESULT_CODE_NO_TCP_CONNECTION; + if (DBG) log("isMobileOk: isProvisioningNetwork is true"); + result = CMP_RESULT_CODE_PROVISIONING_NETWORK; return result; } else { if (DBG) log("isMobileOk: isProvisioningNetwork is false, continue"); @@ -4285,25 +4306,37 @@ public class ConnectivityService extends IConnectivityManager.Stub { urlConn.setAllowUserInteraction(false); urlConn.setRequestProperty("Connection", "close"); int responseCode = urlConn.getResponseCode(); + + // For debug display the headers + Map<String, List<String>> headers = urlConn.getHeaderFields(); + log("isMobileOk: headers=" + headers); + + // Close the connection + urlConn.disconnect(); + urlConn = null; + if (responseCode == 204) { + // Return + log("isMobileOk: expected responseCode=" + responseCode); result = CMP_RESULT_CODE_CONNECTABLE; + return result; } else { + // Retry to be sure this was redirected, we've gotten + // occasions where a server returned 200 even though + // the device didn't have a "warm" sim. + log("isMobileOk: not expected responseCode=" + responseCode); result = CMP_RESULT_CODE_REDIRECTED; } - log("isMobileOk: connected responseCode=" + responseCode); - urlConn.disconnect(); - urlConn = null; - return result; } catch (Exception e) { log("isMobileOk: HttpURLConnection Exception e=" + e); + result = CMP_RESULT_CODE_NO_TCP_CONNECTION; if (urlConn != null) { urlConn.disconnect(); urlConn = null; } } } - result = CMP_RESULT_CODE_NO_TCP_CONNECTION; - log("isMobileOk: loops|timed out"); + log("isMobileOk: loops|timed out result=" + result); return result; } catch (Exception e) { log("isMobileOk: Exception e=" + e); @@ -4774,4 +4807,3 @@ public class ConnectivityService extends IConnectivityManager.Stub { mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, wakeupTime, intent); } } - diff --git a/services/java/com/android/server/CountryDetectorService.java b/services/java/com/android/server/CountryDetectorService.java index 4956dd5bd80a..a478b2f47637 100644 --- a/services/java/com/android/server/CountryDetectorService.java +++ b/services/java/com/android/server/CountryDetectorService.java @@ -97,11 +97,12 @@ public class CountryDetectorService extends ICountryDetector.Stub implements Run } @Override - public Country detectCountry() throws RemoteException { + public Country detectCountry() { if (!mSystemReady) { - throw new RemoteException(); + return null; // server not yet active + } else { + return mCountryDetector.detectCountry(); } - return mCountryDetector.detectCountry(); } /** diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java index dfcab292d653..82cc54007e4d 100644 --- a/services/java/com/android/server/NetworkManagementService.java +++ b/services/java/com/android/server/NetworkManagementService.java @@ -838,6 +838,18 @@ public class NetworkManagementService extends INetworkManagementService.Stub } @Override + public void setMtu(String iface, int mtu) { + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); + + final NativeDaemonEvent event; + try { + event = mConnector.execute("interface", "setmtu", iface, mtu); + } catch (NativeDaemonConnectorException e) { + throw e.rethrowAsParcelableException(); + } + } + + @Override public void shutdown() { // TODO: remove from aidl if nobody calls externally mContext.enforceCallingOrSelfPermission(SHUTDOWN, TAG); diff --git a/services/java/com/android/server/WallpaperManagerService.java b/services/java/com/android/server/WallpaperManagerService.java index d677f2497cbd..162add425cf5 100644 --- a/services/java/com/android/server/WallpaperManagerService.java +++ b/services/java/com/android/server/WallpaperManagerService.java @@ -821,6 +821,11 @@ class WallpaperManagerService extends IWallpaperManager.Stub { int serviceUserId = wallpaper.userId; ServiceInfo si = mIPackageManager.getServiceInfo(componentName, PackageManager.GET_META_DATA | PackageManager.GET_PERMISSIONS, serviceUserId); + if (si == null) { + // The wallpaper component we're trying to use doesn't exist + Slog.w(TAG, "Attempted wallpaper " + componentName + " is unavailable"); + return false; + } if (!android.Manifest.permission.BIND_WALLPAPER.equals(si.permission)) { String msg = "Selected service does not require " + android.Manifest.permission.BIND_WALLPAPER diff --git a/services/java/com/android/server/Watchdog.java b/services/java/com/android/server/Watchdog.java index ec573f947a50..616090ebe13b 100644 --- a/services/java/com/android/server/Watchdog.java +++ b/services/java/com/android/server/Watchdog.java @@ -129,7 +129,12 @@ public class Watchdog extends Thread { } public String describeBlockedStateLocked() { - return mCurrentMonitor == null ? mName : mCurrentMonitor.getClass().getName(); + if (mCurrentMonitor == null) { + return "Blocked in handler on " + mName + " (" + getThread().getName() + ")"; + } else { + return "Blocked in monitor " + mCurrentMonitor.getClass().getName() + + " on " + mName + " (" + getThread().getName() + ")"; + } } @Override @@ -291,7 +296,7 @@ public class Watchdog extends Thread { boolean waitedHalf = false; while (true) { final ArrayList<HandlerChecker> blockedCheckers; - final String name; + final String subject; final boolean allowRestart; synchronized (this) { long timeout = TIME_TO_WAIT; @@ -336,14 +341,14 @@ public class Watchdog extends Thread { } blockedCheckers = getBlockedCheckersLocked(); - name = describeCheckersLocked(blockedCheckers); + subject = describeCheckersLocked(blockedCheckers); allowRestart = mAllowRestart; } // If we got here, that means that the system is most likely hung. // First collect stack traces from all threads of the system process. // Then kill this process so that the system will restart. - EventLog.writeEvent(EventLogTags.WATCHDOG, name); + EventLog.writeEvent(EventLogTags.WATCHDOG, subject); ArrayList<Integer> pids = new ArrayList<Integer>(); pids.add(Process.myPid()); @@ -379,7 +384,7 @@ public class Watchdog extends Thread { public void run() { mActivity.addErrorToDropBox( "watchdog", null, "system_server", null, null, - name, null, stack, null); + subject, null, stack, null); } }; dropboxThread.start(); @@ -396,7 +401,7 @@ public class Watchdog extends Thread { try { Binder.setDumpDisabled("Service dumps disabled due to hung system process."); // 1 = keep waiting, -1 = kill system - int res = controller.systemNotResponding(name); + int res = controller.systemNotResponding(subject); if (res >= 0) { Slog.i(TAG, "Activity controller requested to coninue to wait"); waitedHalf = false; @@ -412,7 +417,7 @@ public class Watchdog extends Thread { } else if (!allowRestart) { Slog.w(TAG, "Restart not allowed: Watchdog is *not* killing the system process"); } else { - Slog.w(TAG, "*** WATCHDOG KILLING SYSTEM PROCESS: " + name); + Slog.w(TAG, "*** WATCHDOG KILLING SYSTEM PROCESS: " + subject); for (int i=0; i<blockedCheckers.size(); i++) { Slog.w(TAG, blockedCheckers.get(i).getName() + " stack trace:"); StackTraceElement[] stackTrace diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 75cf5d03c8a4..1e3fb400858f 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -1574,12 +1574,12 @@ public final class ActivityManagerService extends ActivityManagerNative mSystemThread.installSystemApplicationInfo(info); synchronized (mSelf) { - ProcessRecord app = mSelf.newProcessRecordLocked( - mSystemThread.getApplicationThread(), info, + ProcessRecord app = mSelf.newProcessRecordLocked(info, info.processName, false); app.persistent = true; app.pid = MY_PID; app.maxAdj = ProcessList.SYSTEM_ADJ; + app.makeActive(mSystemThread.getApplicationThread(), mSelf.mProcessStats); mSelf.mProcessNames.put(app.processName, app.uid, app); synchronized (mSelf.mPidsSelfLocked) { mSelf.mPidsSelfLocked.put(app.pid, app); @@ -2282,7 +2282,7 @@ public final class ActivityManagerService extends ActivityManagerNative } if (app == null) { - app = newProcessRecordLocked(null, info, processName, isolated); + app = newProcessRecordLocked(info, processName, isolated); if (app == null) { Slog.w(TAG, "Failed making new process record for " + processName + "/" + info.uid + " isolated=" + isolated); @@ -3628,6 +3628,7 @@ public final class ActivityManagerService extends ActivityManagerNative info.append(" (").append(activity.shortComponentName).append(")"); } info.append("\n"); + info.append("PID: ").append(app.pid).append("\n"); if (annotation != null) { info.append("Reason: ").append(annotation).append("\n"); } @@ -4487,7 +4488,7 @@ public final class ActivityManagerService extends ActivityManagerNative EventLog.writeEvent(EventLogTags.AM_PROC_BOUND, app.userId, app.pid, app.processName); - app.thread = thread; + app.makeActive(thread, mProcessStats); app.curAdj = app.setAdj = -100; app.curSchedGroup = app.setSchedGroup = Process.THREAD_GROUP_DEFAULT; app.forcingToForeground = null; @@ -7544,8 +7545,8 @@ public final class ActivityManagerService extends ActivityManagerNative // GLOBAL MANAGEMENT // ========================================================= - final ProcessRecord newProcessRecordLocked(IApplicationThread thread, - ApplicationInfo info, String customProcess, boolean isolated) { + final ProcessRecord newProcessRecordLocked(ApplicationInfo info, String customProcess, + boolean isolated) { String proc = customProcess != null ? customProcess : info.processName; BatteryStatsImpl.Uid.Proc ps = null; BatteryStatsImpl stats = mBatteryStatsService.getActiveStatistics(); @@ -7573,8 +7574,7 @@ public final class ActivityManagerService extends ActivityManagerNative synchronized (stats) { ps = stats.getProcessStatsLocked(info.uid, proc); } - return new ProcessRecord(ps, thread, info, proc, uid, - mProcessStats.getProcessStateLocked(info.packageName, info.uid, proc)); + return new ProcessRecord(ps, info, proc, uid); } final ProcessRecord addAppLocked(ApplicationInfo info, boolean isolated) { @@ -7586,7 +7586,7 @@ public final class ActivityManagerService extends ActivityManagerNative } if (app == null) { - app = newProcessRecordLocked(null, info, null, isolated); + app = newProcessRecordLocked(info, null, isolated); mProcessNames.put(info.processName, app.uid, app); if (isolated) { mIsolatedProcesses.put(app.uid, app); @@ -11788,7 +11788,7 @@ public final class ActivityManagerService extends ActivityManagerNative app.resetPackageList(mProcessStats); app.unlinkDeathRecipient(); - app.thread = null; + app.makeInactive(mProcessStats); app.forcingToForeground = null; app.foregroundServices = false; app.foregroundActivities = false; @@ -14692,7 +14692,9 @@ public final class ActivityManagerService extends ActivityManagerNative } private final void setProcessTrackerState(ProcessRecord proc, int memFactor, long now) { - proc.baseProcessTracker.setState(proc.repProcState, memFactor, now, proc.pkgList); + if (proc.thread != null) { + proc.baseProcessTracker.setState(proc.repProcState, memFactor, now, proc.pkgList); + } } private final boolean updateOomAdjLocked(ProcessRecord app, int cachedAdj, diff --git a/services/java/com/android/server/am/ProcessRecord.java b/services/java/com/android/server/am/ProcessRecord.java index f1a030e731da..283d122c8c02 100644 --- a/services/java/com/android/server/am/ProcessRecord.java +++ b/services/java/com/android/server/am/ProcessRecord.java @@ -52,13 +52,13 @@ final class ProcessRecord { final int uid; // uid of process; may be different from 'info' if isolated final int userId; // user of process. final String processName; // name of the process - final ProcessStats.ProcessState baseProcessTracker; // List of packages running in the process final ArrayMap<String, ProcessStats.ProcessState> pkgList = new ArrayMap<String, ProcessStats.ProcessState>(); IApplicationThread thread; // the actual proc... may be null only if // 'persistent' is true (in which case we // are in the process of launching the app) + ProcessStats.ProcessState baseProcessTracker; int pid; // The process of this application; 0 if none boolean starting; // True if the process is being started long lastActivityTime; // For managing the LRU list @@ -349,18 +349,15 @@ final class ProcessRecord { } } - ProcessRecord(BatteryStatsImpl.Uid.Proc _batteryStats, IApplicationThread _thread, - ApplicationInfo _info, String _processName, int _uid, - ProcessStats.ProcessState tracker) { + ProcessRecord(BatteryStatsImpl.Uid.Proc _batteryStats, ApplicationInfo _info, + String _processName, int _uid) { batteryStats = _batteryStats; info = _info; isolated = _info.uid != _uid; uid = _uid; userId = UserHandle.getUserId(_uid); processName = _processName; - baseProcessTracker = tracker; - pkgList.put(_info.packageName, tracker); - thread = _thread; + pkgList.put(_info.packageName, null); maxAdj = ProcessList.UNKNOWN_ADJ; curRawAdj = setRawAdj = -100; curAdj = setAdj = -100; @@ -374,7 +371,53 @@ final class ProcessRecord { shortStringName = null; stringName = null; } - + + public void makeActive(IApplicationThread _thread, ProcessStatsService tracker) { + if (thread == null) { + final ProcessStats.ProcessState origBase = baseProcessTracker; + if (origBase != null) { + origBase.setState(ProcessStats.STATE_NOTHING, + tracker.getMemFactorLocked(), SystemClock.uptimeMillis(), pkgList); + origBase.makeInactive(); + } + baseProcessTracker = tracker.getProcessStateLocked(info.packageName, info.uid, + processName); + baseProcessTracker.makeActive(); + for (int i=0; i<pkgList.size(); i++) { + ProcessStats.ProcessState ps = pkgList.valueAt(i); + if (ps != null && ps != origBase) { + ps.makeInactive(); + } + ps = tracker.getProcessStateLocked(pkgList.keyAt(i), info.uid, processName); + if (ps != baseProcessTracker) { + ps.makeActive(); + } + pkgList.setValueAt(i, ps); + } + } + thread = _thread; + } + + public void makeInactive(ProcessStatsService tracker) { + if (thread != null) { + thread = null; + final ProcessStats.ProcessState origBase = baseProcessTracker; + if (origBase != null) { + origBase.setState(ProcessStats.STATE_NOTHING, + tracker.getMemFactorLocked(), SystemClock.uptimeMillis(), pkgList); + origBase.makeInactive(); + } + baseProcessTracker = null; + for (int i=0; i<pkgList.size(); i++) { + ProcessStats.ProcessState ps = pkgList.valueAt(i); + if (ps != null && ps != origBase) { + ps.makeInactive(); + } + pkgList.setValueAt(i, null); + } + } + } + /** * This method returns true if any of the activities within the process record are interesting * to the user. See HistoryRecord.isInterestingToUserLocked() @@ -518,10 +561,22 @@ final class ProcessRecord { long now = SystemClock.uptimeMillis(); baseProcessTracker.setState(ProcessStats.STATE_NOTHING, tracker.getMemFactorLocked(), now, pkgList); - if (pkgList.size() != 1) { + final int N = pkgList.size(); + if (N != 1) { + for (int i=0; i<N; i++) { + ProcessStats.ProcessState ps = pkgList.valueAt(i); + if (ps != null && ps != baseProcessTracker) { + ps.makeInactive(); + } + + } pkgList.clear(); - pkgList.put(info.packageName, tracker.getProcessStateLocked( - info.packageName, info.uid, processName)); + ProcessStats.ProcessState ps = tracker.getProcessStateLocked( + info.packageName, info.uid, processName); + pkgList.put(info.packageName, ps); + if (thread != null && ps != baseProcessTracker) { + ps.makeActive(); + } } } diff --git a/services/java/com/android/server/am/ProcessStatsService.java b/services/java/com/android/server/am/ProcessStatsService.java index 43ae46fd33c4..c180f6e38b28 100644 --- a/services/java/com/android/server/am/ProcessStatsService.java +++ b/services/java/com/android/server/am/ProcessStatsService.java @@ -54,12 +54,12 @@ public final class ProcessStatsService extends IProcessStats.Stub { // exists in and the offset into the array to find it. The constants below // define the encoding of that data in an integer. - static final int MAX_HISTORIC_STATES = 4; // Maximum number of historic states we will keep. + static final int MAX_HISTORIC_STATES = 6; // Maximum number of historic states we will keep. static final String STATE_FILE_PREFIX = "state-"; // Prefix to use for state filenames. static final String STATE_FILE_SUFFIX = ".bin"; // Suffix to use for state filenames. static final String STATE_FILE_CHECKIN_SUFFIX = ".ci"; // State files that have checked in. static long WRITE_PERIOD = 30*60*1000; // Write file every 30 minutes or so. - static long COMMIT_PERIOD = 24*60*60*1000; // Commit current stats every day. + static long COMMIT_PERIOD = 12*60*60*1000; // Commit current stats every 12 hours. final ActivityManagerService mAm; final File mBaseDir; @@ -132,7 +132,7 @@ public final class ProcessStatsService extends IProcessStats.Stub { ArrayMap<String, ProcessStats.ServiceState> services = pkg.mServices; for (int k=0; k<services.size(); k++) { ProcessStats.ServiceState service = services.valueAt(k); - if (service.isActive()) { + if (service.isInUse()) { if (service.mStartedState != ProcessStats.STATE_NOTHING) { service.setStarted(true, memFactor, now); } diff --git a/services/java/com/android/server/am/ServiceRecord.java b/services/java/com/android/server/am/ServiceRecord.java index 39756c349feb..8293bb8a2a37 100644 --- a/services/java/com/android/server/am/ServiceRecord.java +++ b/services/java/com/android/server/am/ServiceRecord.java @@ -318,6 +318,7 @@ final class ServiceRecord extends Binder { if ((serviceInfo.applicationInfo.flags&ApplicationInfo.FLAG_PERSISTENT) == 0) { tracker = ams.mProcessStats.getServiceStateLocked(serviceInfo.packageName, serviceInfo.applicationInfo.uid, serviceInfo.processName, serviceInfo.name); + tracker.makeActive(); } return tracker; } diff --git a/services/java/com/android/server/print/PrintManagerService.java b/services/java/com/android/server/print/PrintManagerService.java index 2563b580f674..926f822d0eda 100644 --- a/services/java/com/android/server/print/PrintManagerService.java +++ b/services/java/com/android/server/print/PrintManagerService.java @@ -41,6 +41,8 @@ import android.util.SparseArray; import com.android.internal.content.PackageMonitor; import com.android.internal.os.BackgroundThread; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.Iterator; import java.util.List; import java.util.Set; @@ -298,6 +300,27 @@ public final class PrintManagerService extends IPrintManager.Stub { } } + @Override + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + if (mContext.checkCallingOrSelfPermission(Manifest.permission.DUMP) + != PackageManager.PERMISSION_GRANTED) { + pw.println("Permission Denial: can't dump PrintManager from from pid=" + + Binder.getCallingPid() + + ", uid=" + Binder.getCallingUid()); + return; + } + + synchronized (mLock) { + pw.println("PRINT MANAGER STATE (dumpsys print)"); + final int userStateCount = mUserStates.size(); + for (int i = 0; i < userStateCount; i++) { + UserState userState = mUserStates.get(i); + userState.dump(fd, pw, ""); + pw.println(); + } + } + } + private void registerContentObservers() { final Uri enabledPrintServicesUri = Settings.Secure.getUriFor( Settings.Secure.ENABLED_PRINT_SERVICES); diff --git a/services/java/com/android/server/print/RemotePrintService.java b/services/java/com/android/server/print/RemotePrintService.java index 2ded2024d48b..ddff0ae55449 100644 --- a/services/java/com/android/server/print/RemotePrintService.java +++ b/services/java/com/android/server/print/RemotePrintService.java @@ -41,6 +41,7 @@ import android.util.Slog; import com.android.internal.R; +import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -137,6 +138,19 @@ final class RemotePrintService implements DeathRecipient { }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null); } + public void dump(PrintWriter pw, String prefix) { + String tab = " "; + pw.append(prefix).append("service:").println(); + pw.append(prefix).append(tab).append("componentName=") + .append(mComponentName.flattenToString()).println(); + pw.append(prefix).append(tab).append("destroyed=") + .append(String.valueOf(mDestroyed)).println(); + pw.append(prefix).append(tab).append("bound=") + .append(String.valueOf(isBound())).println(); + pw.append(prefix).append(tab).append("hasDicoverySession=") + .append(String.valueOf(mHasPrinterDiscoverySession)); + } + private void failAllActivePrintJobs() { List<PrintJobInfo> printJobs = mSpooler.getPrintJobInfos(mComponentName, PrintJobInfo.STATE_ANY_ACTIVE, PrintManager.APP_ID_ANY); diff --git a/services/java/com/android/server/print/RemotePrintSpooler.java b/services/java/com/android/server/print/RemotePrintSpooler.java index db0eb3367aee..28a6186cbeb3 100644 --- a/services/java/com/android/server/print/RemotePrintSpooler.java +++ b/services/java/com/android/server/print/RemotePrintSpooler.java @@ -34,11 +34,14 @@ import android.print.IPrintSpoolerCallbacks; import android.print.IPrintSpoolerClient; import android.print.PrintAttributes; import android.print.PrintJobInfo; +import android.print.PrintManager; import android.util.Slog; import android.util.TimedRemoteCaller; import libcore.io.IoUtils; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.List; import java.util.concurrent.TimeoutException; @@ -291,6 +294,28 @@ final class RemotePrintSpooler { } } + public void dump(FileDescriptor fd, PrintWriter pw, String prefix) { + synchronized (mLock) { + pw.append(prefix).append("destroyed=") + .append(String.valueOf(mDestroyed)).println(); + pw.append(prefix).append("bound=") + .append((mRemoteInstance != null) ? "true" : "false").println(); + pw.append(prefix).append("print jobs:").println(); + if (mRemoteInstance != null) { + List<PrintJobInfo> printJobs = getPrintJobInfos(null, + PrintJobInfo.STATE_ANY, PrintManager.APP_ID_ANY); + if (printJobs != null) { + final int printJobCount = printJobs.size(); + for (int i = 0; i < printJobCount; i++) { + PrintJobInfo printJob = printJobs.get(i); + pw.append(prefix).append(prefix).append(printJob.toString()); + pw.println(); + } + } + } + } + } + private void onAllPrintJobsHandled() { synchronized (mLock) { throwIfDestroyedLocked(); diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java index 8fe979bb2383..5392975466ba 100644 --- a/services/java/com/android/server/print/UserState.java +++ b/services/java/com/android/server/print/UserState.java @@ -39,14 +39,16 @@ import android.provider.Settings; import android.text.TextUtils; import android.text.TextUtils.SimpleStringSplitter; import android.util.ArrayMap; +import android.util.ArraySet; import android.util.Log; import android.util.Slog; import com.android.internal.os.SomeArgs; import com.android.server.print.RemotePrintSpooler.PrintSpoolerCallbacks; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -72,14 +74,14 @@ final class UserState implements PrintSpoolerCallbacks { private final Intent mQueryIntent = new Intent(android.printservice.PrintService.SERVICE_INTERFACE); - private final Map<ComponentName, RemotePrintService> mActiveServices = - new HashMap<ComponentName, RemotePrintService>(); + private final ArrayMap<ComponentName, RemotePrintService> mActiveServices = + new ArrayMap<ComponentName, RemotePrintService>(); private final List<PrintServiceInfo> mInstalledServices = new ArrayList<PrintServiceInfo>(); private final Set<ComponentName> mEnabledServices = - new HashSet<ComponentName>(); + new ArraySet<ComponentName>(); private final Object mLock; @@ -318,6 +320,57 @@ final class UserState implements PrintSpoolerCallbacks { mDestroyed = true; } + public void dump(FileDescriptor fd, PrintWriter pw, String prefix) { + pw.append(prefix).append("user state ").append(String.valueOf(mUserId)).append(":"); + pw.println(); + + String tab = " "; + + pw.append(prefix).append(tab).append("installed services:").println(); + final int installedServiceCount = mInstalledServices.size(); + for (int i = 0; i < installedServiceCount; i++) { + PrintServiceInfo installedService = mInstalledServices.get(i); + String installedServicePrefix = prefix + tab + tab; + pw.append(installedServicePrefix).append("service:").println(); + ResolveInfo resolveInfo = installedService.getResolveInfo(); + ComponentName componentName = new ComponentName( + resolveInfo.serviceInfo.packageName, + resolveInfo.serviceInfo.name); + pw.append(installedServicePrefix).append(tab).append("componentName=") + .append(componentName.flattenToString()).println(); + pw.append(installedServicePrefix).append(tab).append("settingsActivity=") + .append(installedService.getSettingsActivityName()).println(); + pw.append(installedServicePrefix).append(tab).append("addPrintersActivity=") + .append(installedService.getAddPrintersActivityName()).println(); + } + + pw.append(prefix).append(tab).append("enabled services:").println(); + for (ComponentName enabledService : mEnabledServices) { + String enabledServicePrefix = prefix + tab + tab; + pw.append(enabledServicePrefix).append("service:").println(); + pw.append(enabledServicePrefix).append(tab).append("componentName=") + .append(enabledService.flattenToString()); + pw.println(); + } + + pw.append(prefix).append(tab).append("active services:").println(); + final int activeServiceCount = mActiveServices.size(); + for (int i = 0; i < activeServiceCount; i++) { + RemotePrintService activeService = mActiveServices.valueAt(i); + activeService.dump(pw, prefix + tab + tab); + pw.println(); + } + + pw.append(prefix).append(tab).append("discovery mediator:").println(); + if (mPrinterDiscoverySession != null) { + mPrinterDiscoverySession.dump(pw, prefix + tab + tab); + } + + pw.append(prefix).append(tab).append("print spooler:").println(); + mSpooler.dump(fd, pw, prefix + tab + tab); + pw.println(); + } + private boolean readConfigurationLocked() { boolean somethingChanged = false; somethingChanged |= readInstalledPrintServicesLocked(); @@ -779,21 +832,21 @@ final class UserState implements PrintSpoolerCallbacks { return; } // Remove the printers for that service. - List<PrinterInfo> removedPrinters = null; + List<PrinterId> removedPrinterIds = null; final int printerCount = mPrinters.size(); for (int i = 0; i < printerCount; i++) { - PrinterInfo printer = mPrinters.get(i); - if (printer.getId().getServiceName().equals(serviceName)) { - if (removedPrinters == null) { - removedPrinters = new ArrayList<PrinterInfo>(); + PrinterId printerId = mPrinters.keyAt(i); + if (printerId.getServiceName().equals(serviceName)) { + if (removedPrinterIds == null) { + removedPrinterIds = new ArrayList<PrinterId>(); } - removedPrinters.add(printer); + removedPrinterIds.add(printerId); } } - if (!removedPrinters.isEmpty()) { + if (!removedPrinterIds.isEmpty()) { mHandler.obtainMessage( SessionHandler.MSG_DISPATCH_PRINTERS_REMOVED, - removedPrinters).sendToTarget(); + removedPrinterIds).sendToTarget(); } } @@ -814,6 +867,47 @@ final class UserState implements PrintSpoolerCallbacks { } } + public void dump(PrintWriter pw, String prefix) { + pw.append(prefix).append("destroyed=") + .append(String.valueOf(mDestroyed)).println(); + + pw.append(prefix).append("printDiscoveryInProgress=") + .append(String.valueOf(!mStartedPrinterDiscoveryTokens.isEmpty())).println(); + + String tab = " "; + + pw.append(prefix).append(tab).append("printer discovery observers:").println(); + final int observerCount = mDiscoveryObservers.beginBroadcast(); + for (int i = 0; i < observerCount; i++) { + IPrinterDiscoveryObserver observer = mDiscoveryObservers.getBroadcastItem(i); + pw.append(prefix).append(prefix).append(observer.toString()); + pw.println(); + } + mDiscoveryObservers.finishBroadcast(); + + pw.append(prefix).append(tab).append("start discovery requests:").println(); + final int tokenCount = this.mStartedPrinterDiscoveryTokens.size(); + for (int i = 0; i < tokenCount; i++) { + IBinder token = mStartedPrinterDiscoveryTokens.get(i); + pw.append(prefix).append(tab).append(tab).append(token.toString()).println(); + } + + pw.append(prefix).append(tab).append("tracked printer requests:").println(); + final int trackedPrinters = mStateTrackedPrinters.size(); + for (int i = 0; i < trackedPrinters; i++) { + PrinterId printer = mStateTrackedPrinters.get(i); + pw.append(prefix).append(tab).append(tab).append(printer.toString()).println(); + } + + pw.append(prefix).append(tab).append("printers:").println(); + final int pritnerCount = mPrinters.size(); + for (int i = 0; i < pritnerCount; i++) { + PrinterInfo printer = mPrinters.valueAt(i); + pw.append(prefix).append(tab).append(tab).append( + printer.toString()).println(); + } + } + private void handleDispatchPrintersAdded(List<PrinterInfo> addedPrinters) { final int observerCount = mDiscoveryObservers.beginBroadcast(); for (int i = 0; i < observerCount; i++) { diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 4185aea5278d..40201ada54b8 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -412,12 +412,12 @@ public class TelephonyManager { case RILConstants.NETWORK_MODE_GSM_UMTS: case RILConstants.NETWORK_MODE_LTE_GSM_WCDMA: case RILConstants.NETWORK_MODE_LTE_WCDMA: + case RILConstants.NETWORK_MODE_LTE_CMDA_EVDO_GSM_WCDMA: return PhoneConstants.PHONE_TYPE_GSM; // Use CDMA Phone for the global mode including CDMA case RILConstants.NETWORK_MODE_GLOBAL: case RILConstants.NETWORK_MODE_LTE_CDMA_EVDO: - case RILConstants.NETWORK_MODE_LTE_CMDA_EVDO_GSM_WCDMA: return PhoneConstants.PHONE_TYPE_CDMA; case RILConstants.NETWORK_MODE_LTE_ONLY: diff --git a/test-runner/src/android/test/mock/MockContentProvider.java b/test-runner/src/android/test/mock/MockContentProvider.java index 596ea0aee6a6..28d52b005de3 100644 --- a/test-runner/src/android/test/mock/MockContentProvider.java +++ b/test-runner/src/android/test/mock/MockContentProvider.java @@ -137,6 +137,16 @@ public class MockContentProvider extends ContentProvider { public ICancellationSignal createCancellationSignal() throws RemoteException { return null; } + + @Override + public Uri canonicalize(String callingPkg, Uri uri) throws RemoteException { + return MockContentProvider.this.canonicalize(uri); + } + + @Override + public Uri uncanonicalize(String callingPkg, Uri uri) throws RemoteException { + return MockContentProvider.this.uncanonicalize(uri); + } } private final InversionIContentProvider mIContentProvider = new InversionIContentProvider(); diff --git a/test-runner/src/android/test/mock/MockIContentProvider.java b/test-runner/src/android/test/mock/MockIContentProvider.java index b14ce4935120..c0dc7c3ca316 100644 --- a/test-runner/src/android/test/mock/MockIContentProvider.java +++ b/test-runner/src/android/test/mock/MockIContentProvider.java @@ -114,4 +114,14 @@ public class MockIContentProvider implements IContentProvider { public ICancellationSignal createCancellationSignal() throws RemoteException { throw new UnsupportedOperationException("unimplemented mock method"); } + + @Override + public Uri canonicalize(String callingPkg, Uri uri) throws RemoteException { + throw new UnsupportedOperationException("unimplemented mock method"); + } + + @Override + public Uri uncanonicalize(String callingPkg, Uri uri) throws RemoteException { + throw new UnsupportedOperationException("unimplemented mock method"); + } } diff --git a/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java index 5256b583f8d3..04ce9d077b53 100644 --- a/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java @@ -24,10 +24,13 @@ import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.content.res.BridgeResources.NinePatchInputStream; import android.graphics.BitmapFactory.Options; +import android.graphics.Bitmap_Delegate.BitmapCreateFlags; import java.io.FileDescriptor; import java.io.IOException; import java.io.InputStream; +import java.util.EnumSet; +import java.util.Set; /** * Delegate implementing the native methods of android.graphics.BitmapFactory @@ -98,8 +101,12 @@ import java.io.InputStream; //TODO support rescaling Density density = Density.MEDIUM; + Set<BitmapCreateFlags> bitmapCreateFlags = EnumSet.of(BitmapCreateFlags.MUTABLE); if (opts != null) { density = Density.getEnum(opts.inDensity); + if (opts.inPremultiplied) { + bitmapCreateFlags.add(BitmapCreateFlags.PREMULTIPLIED); + } } try { @@ -112,7 +119,7 @@ import java.io.InputStream; npis, true /*is9Patch*/, false /*convert*/); // get the bitmap and chunk objects. - bm = Bitmap_Delegate.createBitmap(ninePatch.getImage(), true /*isMutable*/, + bm = Bitmap_Delegate.createBitmap(ninePatch.getImage(), bitmapCreateFlags, density); NinePatchChunk chunk = ninePatch.getChunk(); @@ -127,7 +134,7 @@ import java.io.InputStream; padding.bottom = paddingarray[3]; } else { // load the bitmap directly. - bm = Bitmap_Delegate.createBitmap(is, true, density); + bm = Bitmap_Delegate.createBitmap(is, bitmapCreateFlags, density); } } catch (IOException e) { Bridge.getLog().error(null,"Failed to load image" , e, null); diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java index 4121f798ba9a..ec284ac3cfed 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java @@ -33,6 +33,8 @@ import java.io.InputStream; import java.io.OutputStream; import java.nio.Buffer; import java.util.Arrays; +import java.util.EnumSet; +import java.util.Set; import javax.imageio.ImageIO; @@ -51,6 +53,10 @@ import javax.imageio.ImageIO; */ public final class Bitmap_Delegate { + public enum BitmapCreateFlags { + PREMULTIPLIED, MUTABLE + } + // ---- delegate manager ---- private static final DelegateManager<Bitmap_Delegate> sManager = new DelegateManager<Bitmap_Delegate>(Bitmap_Delegate.class); @@ -93,10 +99,25 @@ public final class Bitmap_Delegate { */ public static Bitmap createBitmap(File input, boolean isMutable, Density density) throws IOException { + return createBitmap(input, getPremultipliedBitmapCreateFlags(isMutable), density); + } + + /** + * Creates and returns a {@link Bitmap} initialized with the given file content. + * + * @param input the file from which to read the bitmap content + * @param density the density associated with the bitmap + * + * @see Bitmap#isPremultiplied() + * @see Bitmap#isMutable() + * @see Bitmap#getDensity() + */ + public static Bitmap createBitmap(File input, Set<BitmapCreateFlags> createFlags, + Density density) throws IOException { // create a delegate with the content of the file. Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input), Config.ARGB_8888); - return createBitmap(delegate, isMutable, density.getDpiValue()); + return createBitmap(delegate, createFlags, density.getDpiValue()); } /** @@ -111,10 +132,26 @@ public final class Bitmap_Delegate { */ public static Bitmap createBitmap(InputStream input, boolean isMutable, Density density) throws IOException { + return createBitmap(input, getPremultipliedBitmapCreateFlags(isMutable), density); + } + + /** + * Creates and returns a {@link Bitmap} initialized with the given stream content. + * + * @param input the stream from which to read the bitmap content + * @param createFlags + * @param density the density associated with the bitmap + * + * @see Bitmap#isPremultiplied() + * @see Bitmap#isMutable() + * @see Bitmap#getDensity() + */ + public static Bitmap createBitmap(InputStream input, Set<BitmapCreateFlags> createFlags, + Density density) throws IOException { // create a delegate with the content of the stream. Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input), Config.ARGB_8888); - return createBitmap(delegate, isMutable, density.getDpiValue()); + return createBitmap(delegate, createFlags, density.getDpiValue()); } /** @@ -129,10 +166,26 @@ public final class Bitmap_Delegate { */ public static Bitmap createBitmap(BufferedImage image, boolean isMutable, Density density) throws IOException { + return createBitmap(image, getPremultipliedBitmapCreateFlags(isMutable), density); + } + + /** + * Creates and returns a {@link Bitmap} initialized with the given {@link BufferedImage} + * + * @param image the bitmap content + * @param createFlags + * @param density the density associated with the bitmap + * + * @see Bitmap#isPremultiplied() + * @see Bitmap#isMutable() + * @see Bitmap#getDensity() + */ + public static Bitmap createBitmap(BufferedImage image, Set<BitmapCreateFlags> createFlags, + Density density) throws IOException { // create a delegate with the given image. Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.ARGB_8888); - return createBitmap(delegate, isMutable, density.getDpiValue()); + return createBitmap(delegate, createFlags, density.getDpiValue()); } /** @@ -203,7 +256,7 @@ public final class Bitmap_Delegate { @LayoutlibDelegate /*package*/ static Bitmap nativeCreate(int[] colors, int offset, int stride, int width, - int height, int nativeConfig, boolean mutable) { + int height, int nativeConfig, boolean isMutable) { int imageType = getBufferedImageType(nativeConfig); // create the image @@ -216,7 +269,8 @@ public final class Bitmap_Delegate { // create a delegate with the content of the stream. Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.nativeToConfig(nativeConfig)); - return createBitmap(delegate, mutable, Bitmap.getDefaultDensity()); + return createBitmap(delegate, getPremultipliedBitmapCreateFlags(isMutable), + Bitmap.getDefaultDensity()); } @LayoutlibDelegate @@ -244,7 +298,8 @@ public final class Bitmap_Delegate { // create a delegate with the content of the stream. Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.nativeToConfig(nativeConfig)); - return createBitmap(delegate, isMutable, Bitmap.getDefaultDensity()); + return createBitmap(delegate, getPremultipliedBitmapCreateFlags(isMutable), + Bitmap.getDefaultDensity()); } @LayoutlibDelegate @@ -464,7 +519,7 @@ public final class Bitmap_Delegate { Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.ALPHA_8); // the density doesn't matter, it's set by the Java method. - return createBitmap(delegate, false /*isMutable*/, + return createBitmap(delegate, EnumSet.of(BitmapCreateFlags.MUTABLE), Density.DEFAULT_DENSITY /*density*/); } @@ -546,15 +601,27 @@ public final class Bitmap_Delegate { mConfig = config; } - private static Bitmap createBitmap(Bitmap_Delegate delegate, boolean isMutable, int density) { + private static Bitmap createBitmap(Bitmap_Delegate delegate, + Set<BitmapCreateFlags> createFlags, int density) { // get its native_int int nativeInt = sManager.addNewDelegate(delegate); + int width = delegate.mImage.getWidth(); + int height = delegate.mImage.getHeight(); + boolean isMutable = createFlags.contains(BitmapCreateFlags.MUTABLE); + boolean isPremultiplied = createFlags.contains(BitmapCreateFlags.PREMULTIPLIED); + // and create/return a new Bitmap with it - // TODO: pass correct width, height, isPremultiplied - return new Bitmap(nativeInt, null /* buffer */, -1 /* width */, -1 /* height */, density, - isMutable, true /* isPremultiplied */, - null /*ninePatchChunk*/, null /* layoutBounds */); + return new Bitmap(nativeInt, null /* buffer */, width, height, density, isMutable, + isPremultiplied, null /*ninePatchChunk*/, null /* layoutBounds */); + } + + private static Set<BitmapCreateFlags> getPremultipliedBitmapCreateFlags(boolean isMutable) { + Set<BitmapCreateFlags> createFlags = EnumSet.of(BitmapCreateFlags.PREMULTIPLIED); + if (isMutable) { + createFlags.add(BitmapCreateFlags.MUTABLE); + } + return createFlags; } /** diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContentProvider.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContentProvider.java index 688cc87f20a3..01740b16a0bb 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContentProvider.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContentProvider.java @@ -134,4 +134,14 @@ public final class BridgeContentProvider implements IContentProvider { // TODO Auto-generated method stub return null; } + + @Override + public Uri canonicalize(String callingPkg, Uri uri) throws RemoteException { + return null; + } + + @Override + public Uri uncanonicalize(String callingPkg, Uri uri) throws RemoteException { + return null; + } } diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java index f86a51c9bd2f..83789e265518 100644 --- a/wifi/java/android/net/wifi/WifiNative.java +++ b/wifi/java/android/net/wifi/WifiNative.java @@ -500,7 +500,7 @@ public class WifiNative { } public void bssFlush() { - doBooleanCommand("BSS_FLUSH"); + doBooleanCommand("BSS_FLUSH 0"); } public boolean startWpsPbc(String bssid) { |