diff options
283 files changed, 1098 insertions, 702 deletions
diff --git a/api/current.txt b/api/current.txt index 44f5b27..e0736b6 100644 --- a/api/current.txt +++ b/api/current.txt @@ -22181,6 +22181,7 @@ package android.text.format { field public static final char MONTH = 77; // 0x004d 'M' field public static final char QUOTE = 39; // 0x0027 '\'' field public static final char SECONDS = 115; // 0x0073 's' + field public static final char STANDALONE_MONTH = 76; // 0x004c 'L' field public static final char TIME_ZONE = 122; // 0x007a 'z' field public static final char YEAR = 121; // 0x0079 'y' } @@ -23332,17 +23333,6 @@ package android.util { method public void set(T, V); } - public class PropertyValueModel extends android.util.ValueModel { - method public T get(); - method public H getHost(); - method public android.util.Property<H, T> getProperty(); - method public java.lang.Class<T> getType(); - method public static android.util.PropertyValueModel<H, T> of(H, android.util.Property<H, T>); - method public static android.util.PropertyValueModel<H, T> of(H, java.lang.Class<T>, java.lang.String); - method public static android.util.PropertyValueModel of(java.lang.Object, java.lang.String); - method public void set(T); - } - public class SparseArray implements java.lang.Cloneable { ctor public SparseArray(); ctor public SparseArray(int); @@ -23491,14 +23481,6 @@ package android.util { field public int type; } - public abstract class ValueModel { - ctor protected ValueModel(); - method public abstract T get(); - method public abstract java.lang.Class<T> getType(); - method public abstract void set(T); - field public static final android.util.ValueModel EMPTY; - } - public class Xml { method public static android.util.AttributeSet asAttributeSet(org.xmlpull.v1.XmlPullParser); method public static android.util.Xml.Encoding findEncodingByName(java.lang.String) throws java.io.UnsupportedEncodingException; @@ -27907,12 +27889,10 @@ package android.widget { method public abstract void onSelectedDayChange(android.widget.CalendarView, int, int, int); } - public class CheckBox extends android.widget.CompoundButton implements android.widget.ValueEditor { + public class CheckBox extends android.widget.CompoundButton { ctor public CheckBox(android.content.Context); ctor public CheckBox(android.content.Context, android.util.AttributeSet); ctor public CheckBox(android.content.Context, android.util.AttributeSet, int); - method public android.util.ValueModel<java.lang.Boolean> getValueModel(); - method public void setValueModel(android.util.ValueModel<java.lang.Boolean>); } public abstract interface Checkable { @@ -28085,16 +28065,14 @@ package android.widget { method public void setSize(int, int); } - public class EditText extends android.widget.TextView implements android.widget.ValueEditor { + public class EditText extends android.widget.TextView { ctor public EditText(android.content.Context); ctor public EditText(android.content.Context, android.util.AttributeSet); ctor public EditText(android.content.Context, android.util.AttributeSet, int); method public void extendSelection(int); - method public android.util.ValueModel<java.lang.CharSequence> getValueModel(); method public void selectAll(); method public void setSelection(int, int); method public void setSelection(int); - method public void setValueModel(android.util.ValueModel<java.lang.CharSequence>); } public abstract interface ExpandableListAdapter { @@ -29120,13 +29098,11 @@ package android.widget { method public abstract java.lang.Object[] getSections(); } - public class SeekBar extends android.widget.AbsSeekBar implements android.widget.ValueEditor { + public class SeekBar extends android.widget.AbsSeekBar { ctor public SeekBar(android.content.Context); ctor public SeekBar(android.content.Context, android.util.AttributeSet); ctor public SeekBar(android.content.Context, android.util.AttributeSet, int); - method public android.util.ValueModel<java.lang.Integer> getValueModel(); method public void setOnSeekBarChangeListener(android.widget.SeekBar.OnSeekBarChangeListener); - method public void setValueModel(android.util.ValueModel<java.lang.Integer>); } public static abstract interface SeekBar.OnSeekBarChangeListener { @@ -29700,11 +29676,6 @@ package android.widget { method public android.widget.TextView getText2(); } - public abstract interface ValueEditor { - method public abstract android.util.ValueModel<T> getValueModel(); - method public abstract void setValueModel(android.util.ValueModel<T>); - } - public class VideoView extends android.view.SurfaceView implements android.widget.MediaController.MediaPlayerControl { ctor public VideoView(android.content.Context); ctor public VideoView(android.content.Context, android.util.AttributeSet); diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index eae3b1f..773f73c 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -404,6 +404,14 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } + case ACTIVITY_RESUMED_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + IBinder token = data.readStrongBinder(); + activityResumed(token); + reply.writeNoException(); + return true; + } + case ACTIVITY_PAUSED_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder token = data.readStrongBinder(); @@ -2152,6 +2160,17 @@ class ActivityManagerProxy implements IActivityManager data.recycle(); reply.recycle(); } + public void activityResumed(IBinder token) throws RemoteException + { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + data.writeStrongBinder(token); + mRemote.transact(ACTIVITY_RESUMED_TRANSACTION, data, reply, 0); + reply.readException(); + data.recycle(); + reply.recycle(); + } public void activityPaused(IBinder token) throws RemoteException { Parcel data = Parcel.obtain(); diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index cb4d4a1..9b82f2a 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -1245,7 +1245,7 @@ public final class ActivityThread { case RESUME_ACTIVITY: Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityResume"); handleResumeActivity((IBinder)msg.obj, true, - msg.arg1 != 0); + msg.arg1 != 0, true); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); break; case SEND_RESULT: @@ -2175,7 +2175,8 @@ public final class ActivityThread { if (a != null) { r.createdConfig = new Configuration(mConfiguration); Bundle oldState = r.state; - handleResumeActivity(r.token, false, r.isForward); + handleResumeActivity(r.token, false, r.isForward, + !r.activity.mFinished && !r.startsNotResumed); if (!r.activity.mFinished && r.startsNotResumed) { // The activity manager actually wants this one to start out @@ -2684,7 +2685,8 @@ public final class ActivityThread { r.mPendingRemoveWindowManager = null; } - final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward) { + final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward, + boolean reallyResume) { // If we are getting ready to gc after going to the background, well // we are back active so skip it. unscheduleGcIdler(); @@ -2781,6 +2783,14 @@ public final class ActivityThread { } r.onlyLocalRequest = false; + // Tell the activity manager we have resumed. + if (reallyResume) { + try { + ActivityManagerNative.getDefault().activityResumed(token); + } catch (RemoteException ex) { + } + } + } else { // If an exception was thrown when trying to resume, then // just end this activity. @@ -2865,7 +2875,7 @@ public final class ActivityThread { if (r.isPreHoneycomb()) { QueuedWork.waitToFinish(); } - + // Tell the activity manager we have paused. try { ActivityManagerNative.getDefault().activityPaused(token); diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 9ef375a..2fb17b6 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -87,19 +87,15 @@ public interface IActivityManager extends IInterface { String resultData, Bundle map, String requiredPermission, boolean serialized, boolean sticky, int userId) throws RemoteException; public void unbroadcastIntent(IApplicationThread caller, Intent intent, int userId) throws RemoteException; - /* oneway */ public void finishReceiver(IBinder who, int resultCode, String resultData, Bundle map, boolean abortBroadcast) throws RemoteException; public void attachApplication(IApplicationThread app) throws RemoteException; - /* oneway */ + public void activityResumed(IBinder token) throws RemoteException; public void activityIdle(IBinder token, Configuration config, boolean stopProfiling) throws RemoteException; public void activityPaused(IBinder token) throws RemoteException; - /* oneway */ public void activityStopped(IBinder token, Bundle state, Bitmap thumbnail, CharSequence description) throws RemoteException; - /* oneway */ public void activitySlept(IBinder token) throws RemoteException; - /* oneway */ public void activityDestroyed(IBinder token) throws RemoteException; public String getCallingPackage(IBinder token) throws RemoteException; public ComponentName getCallingActivity(IBinder token) throws RemoteException; @@ -496,7 +492,7 @@ public interface IActivityManager extends IInterface { int BIND_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+35; int UNBIND_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+36; int PUBLISH_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+37; - + int ACTIVITY_RESUMED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+38; int GOING_TO_SLEEP_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+39; int WAKING_UP_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+40; int SET_DEBUG_APP_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+41; diff --git a/core/java/android/app/TaskStackBuilder.java b/core/java/android/app/TaskStackBuilder.java index 9c83362..cadf5e4 100644 --- a/core/java/android/app/TaskStackBuilder.java +++ b/core/java/android/app/TaskStackBuilder.java @@ -162,7 +162,7 @@ public class TaskStackBuilder { ActivityInfo info = pm.getActivityInfo(sourceActivityName, 0); String parentActivity = info.parentActivityName; while (parentActivity != null) { - final ComponentName target = new ComponentName(mSourceContext, parentActivity); + final ComponentName target = new ComponentName(info.packageName, parentActivity); info = pm.getActivityInfo(target, 0); parentActivity = info.parentActivityName; final Intent parent = parentActivity == null && insertAt == 0 @@ -216,11 +216,7 @@ public class TaskStackBuilder { "No intents added to TaskStackBuilder; cannot startActivities"); } - Intent[] intents = mIntents.toArray(new Intent[mIntents.size()]); - intents[0].addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | - Intent.FLAG_ACTIVITY_CLEAR_TASK | - Intent.FLAG_ACTIVITY_TASK_ON_HOME); - mSourceContext.startActivities(intents, options); + mSourceContext.startActivities(getIntents(), options); } /** @@ -260,11 +256,8 @@ public class TaskStackBuilder { "No intents added to TaskStackBuilder; cannot getPendingIntent"); } - Intent[] intents = mIntents.toArray(new Intent[mIntents.size()]); - intents[0].addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | - Intent.FLAG_ACTIVITY_CLEAR_TASK | - Intent.FLAG_ACTIVITY_TASK_ON_HOME); - return PendingIntent.getActivities(mSourceContext, requestCode, intents, flags, options); + return PendingIntent.getActivities(mSourceContext, requestCode, getIntents(), + flags, options); } /** @@ -275,6 +268,15 @@ public class TaskStackBuilder { * @return An array containing the intents added to this builder. */ public Intent[] getIntents() { - return mIntents.toArray(new Intent[mIntents.size()]); + Intent[] intents = new Intent[mIntents.size()]; + if (intents.length == 0) return intents; + + intents[0] = new Intent(mIntents.get(0)).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | + Intent.FLAG_ACTIVITY_CLEAR_TASK | + Intent.FLAG_ACTIVITY_TASK_ON_HOME); + for (int i = 1; i < intents.length; i++) { + intents[i] = new Intent(mIntents.get(i)); + } + return intents; } } diff --git a/core/java/android/appwidget/AppWidgetHost.java b/core/java/android/appwidget/AppWidgetHost.java index 51a81c5..84a447f 100644 --- a/core/java/android/appwidget/AppWidgetHost.java +++ b/core/java/android/appwidget/AppWidgetHost.java @@ -117,7 +117,7 @@ public class AppWidgetHost { private OnClickHandler mOnClickHandler; public AppWidgetHost(Context context, int hostId) { - this(context, hostId, null, Looper.getMainLooper()); + this(context, hostId, null, context.getMainLooper()); } /** diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index ece8841..cd1e882 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -1219,9 +1219,16 @@ public abstract class ContentResolver { public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer) { + registerContentObserver(uri, notifyForDescendents, observer, UserHandle.myUserId()); + } + + /** @hide - designated user version */ + public final void registerContentObserver(Uri uri, boolean notifyForDescendents, + ContentObserver observer, int userHandle) + { try { getContentService().registerContentObserver(uri, notifyForDescendents, - observer.getContentObserver()); + observer.getContentObserver(), userHandle); } catch (RemoteException e) { } } @@ -1276,10 +1283,21 @@ public abstract class ContentResolver { * @see #requestSync(android.accounts.Account, String, android.os.Bundle) */ public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) { + notifyChange(uri, observer, syncToNetwork, UserHandle.myUserId()); + } + + /** + * Notify registered observers within the designated user(s) that a row was updated. + * + * @hide + */ + public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork, + int userHandle) { try { getContentService().notifyChange( uri, observer == null ? null : observer.getContentObserver(), - observer != null && observer.deliverSelfNotifications(), syncToNetwork); + observer != null && observer.deliverSelfNotifications(), syncToNetwork, + userHandle); } catch (RemoteException e) { } } diff --git a/core/java/android/content/ContentService.java b/core/java/android/content/ContentService.java index 472fe94..0f6488a 100644 --- a/core/java/android/content/ContentService.java +++ b/core/java/android/content/ContentService.java @@ -17,6 +17,7 @@ package android.content; import android.accounts.Account; +import android.app.ActivityManager; import android.database.IContentObserver; import android.database.sqlite.SQLiteException; import android.net.Uri; @@ -33,6 +34,7 @@ import android.Manifest; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.security.InvalidParameterException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -138,19 +140,49 @@ public final class ContentService extends IContentService.Stub { getSyncManager(); } - public void registerContentObserver(Uri uri, boolean notifyForDescendents, - IContentObserver observer) { + /** + * Register a content observer tied to a specific user's view of the provider. + * @param userHandle the user whose view of the provider is to be observed. May be + * the calling user without requiring any permission, otherwise the caller needs to + * hold the INTERACT_ACROSS_USERS_FULL permission. Pseudousers USER_ALL and + * USER_CURRENT are properly handled; all other pseudousers are forbidden. + */ + @Override + public void registerContentObserver(Uri uri, boolean notifyForDescendants, + IContentObserver observer, int userHandle) { if (observer == null || uri == null) { throw new IllegalArgumentException("You must pass a valid uri and observer"); } + + final int callingUser = UserHandle.getCallingUserId(); + if (callingUser != userHandle) { + mContext.enforceCallingOrSelfPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL, + "no permission to observe other users' provider view"); + } + + if (userHandle < 0) { + if (userHandle == UserHandle.USER_CURRENT) { + userHandle = ActivityManager.getCurrentUser(); + } else if (userHandle != UserHandle.USER_ALL) { + throw new InvalidParameterException("Bad user handle for registerContentObserver: " + + userHandle); + } + } + synchronized (mRootNode) { - mRootNode.addObserverLocked(uri, observer, notifyForDescendents, mRootNode, - Binder.getCallingUid(), Binder.getCallingPid()); + mRootNode.addObserverLocked(uri, observer, notifyForDescendants, mRootNode, + Binder.getCallingUid(), Binder.getCallingPid(), userHandle); if (false) Log.v(TAG, "Registered observer " + observer + " at " + uri + - " with notifyForDescendents " + notifyForDescendents); + " with notifyForDescendants " + notifyForDescendants); } } + public void registerContentObserver(Uri uri, boolean notifyForDescendants, + IContentObserver observer) { + registerContentObserver(uri, notifyForDescendants, observer, + UserHandle.getCallingUserId()); + } + public void unregisterContentObserver(IContentObserver observer) { if (observer == null) { throw new IllegalArgumentException("You must pass a valid observer"); @@ -161,14 +193,39 @@ public final class ContentService extends IContentService.Stub { } } + /** + * Notify observers of a particular user's view of the provider. + * @param userHandle the user whose view of the provider is to be notified. May be + * the calling user without requiring any permission, otherwise the caller needs to + * hold the INTERACT_ACROSS_USERS_FULL permission. Pseudousers USER_ALL and + * USER_CURRENT are properly interpreted; no other pseudousers are allowed. + */ + @Override public void notifyChange(Uri uri, IContentObserver observer, - boolean observerWantsSelfNotifications, boolean syncToNetwork) { + boolean observerWantsSelfNotifications, boolean syncToNetwork, + int userHandle) { if (Log.isLoggable(TAG, Log.VERBOSE)) { - Log.v(TAG, "Notifying update of " + uri + " from observer " + observer - + ", syncToNetwork " + syncToNetwork); + Log.v(TAG, "Notifying update of " + uri + " for user " + userHandle + + " from observer " + observer + ", syncToNetwork " + syncToNetwork); + } + + // Notify for any user other than the caller's own requires permission. + final int callingUserHandle = UserHandle.getCallingUserId(); + if (userHandle != callingUserHandle) { + mContext.enforceCallingOrSelfPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL, + "no permission to notify other users"); + } + + // We passed the permission check; resolve pseudouser targets as appropriate + if (userHandle < 0) { + if (userHandle == UserHandle.USER_CURRENT) { + userHandle = ActivityManager.getCurrentUser(); + } else if (userHandle != UserHandle.USER_ALL) { + throw new InvalidParameterException("Bad user handle for notifyChange: " + + userHandle); + } } - int userId = UserHandle.getCallingUserId(); // This makes it so that future permission checks will be in the context of this // process rather than the caller's process. We will restore this before returning. long identityToken = clearCallingIdentity(); @@ -176,7 +233,7 @@ public final class ContentService extends IContentService.Stub { ArrayList<ObserverCall> calls = new ArrayList<ObserverCall>(); synchronized (mRootNode) { mRootNode.collectObserversLocked(uri, 0, observer, observerWantsSelfNotifications, - calls); + userHandle, calls); } final int numCalls = calls.size(); for (int i=0; i<numCalls; i++) { @@ -207,7 +264,7 @@ public final class ContentService extends IContentService.Stub { if (syncToNetwork) { SyncManager syncManager = getSyncManager(); if (syncManager != null) { - syncManager.scheduleLocalSync(null /* all accounts */, userId, + syncManager.scheduleLocalSync(null /* all accounts */, callingUserHandle, uri.getAuthority()); } } @@ -216,6 +273,12 @@ public final class ContentService extends IContentService.Stub { } } + public void notifyChange(Uri uri, IContentObserver observer, + boolean observerWantsSelfNotifications, boolean syncToNetwork) { + notifyChange(uri, observer, observerWantsSelfNotifications, syncToNetwork, + UserHandle.getCallingUserId()); + } + /** * Hide this class since it is not part of api, * but current unittest framework requires it to be public @@ -543,16 +606,18 @@ public final class ContentService extends IContentService.Stub { public final IContentObserver observer; public final int uid; public final int pid; - public final boolean notifyForDescendents; + public final boolean notifyForDescendants; + private final int userHandle; private final Object observersLock; public ObserverEntry(IContentObserver o, boolean n, Object observersLock, - int _uid, int _pid) { + int _uid, int _pid, int _userHandle) { this.observersLock = observersLock; observer = o; uid = _uid; pid = _pid; - notifyForDescendents = n; + userHandle = _userHandle; + notifyForDescendants = n; try { observer.asBinder().linkToDeath(this, 0); } catch (RemoteException e) { @@ -571,7 +636,8 @@ public final class ContentService extends IContentService.Stub { pidCounts.put(pid, pidCounts.get(pid)+1); pw.print(prefix); pw.print(name); pw.print(": pid="); pw.print(pid); pw.print(" uid="); - pw.print(uid); pw.print(" target="); + pw.print(uid); pw.print(" user="); + pw.print(userHandle); pw.print(" target="); pw.println(Integer.toHexString(System.identityHashCode( observer != null ? observer.asBinder() : null))); } @@ -639,17 +705,21 @@ public final class ContentService extends IContentService.Stub { return uri.getPathSegments().size() + 1; } + // Invariant: userHandle is either a hard user number or is USER_ALL public void addObserverLocked(Uri uri, IContentObserver observer, - boolean notifyForDescendents, Object observersLock, int uid, int pid) { - addObserverLocked(uri, 0, observer, notifyForDescendents, observersLock, uid, pid); + boolean notifyForDescendants, Object observersLock, + int uid, int pid, int userHandle) { + addObserverLocked(uri, 0, observer, notifyForDescendants, observersLock, + uid, pid, userHandle); } private void addObserverLocked(Uri uri, int index, IContentObserver observer, - boolean notifyForDescendents, Object observersLock, int uid, int pid) { + boolean notifyForDescendants, Object observersLock, + int uid, int pid, int userHandle) { // If this is the leaf node add the observer if (index == countUriSegments(uri)) { - mObservers.add(new ObserverEntry(observer, notifyForDescendents, observersLock, - uid, pid)); + mObservers.add(new ObserverEntry(observer, notifyForDescendants, observersLock, + uid, pid, userHandle)); return; } @@ -662,8 +732,8 @@ public final class ContentService extends IContentService.Stub { for (int i = 0; i < N; i++) { ObserverNode node = mChildren.get(i); if (node.mName.equals(segment)) { - node.addObserverLocked(uri, index + 1, observer, notifyForDescendents, - observersLock, uid, pid); + node.addObserverLocked(uri, index + 1, observer, notifyForDescendants, + observersLock, uid, pid, userHandle); return; } } @@ -671,8 +741,8 @@ public final class ContentService extends IContentService.Stub { // No child found, create one ObserverNode node = new ObserverNode(segment); mChildren.add(node); - node.addObserverLocked(uri, index + 1, observer, notifyForDescendents, - observersLock, uid, pid); + node.addObserverLocked(uri, index + 1, observer, notifyForDescendants, + observersLock, uid, pid, userHandle); } public boolean removeObserverLocked(IContentObserver observer) { @@ -705,37 +775,49 @@ public final class ContentService extends IContentService.Stub { } private void collectMyObserversLocked(boolean leaf, IContentObserver observer, - boolean observerWantsSelfNotifications, ArrayList<ObserverCall> calls) { + boolean observerWantsSelfNotifications, int targetUserHandle, + ArrayList<ObserverCall> calls) { int N = mObservers.size(); IBinder observerBinder = observer == null ? null : observer.asBinder(); for (int i = 0; i < N; i++) { ObserverEntry entry = mObservers.get(i); - // Don't notify the observer if it sent the notification and isn't interesed + // Don't notify the observer if it sent the notification and isn't interested // in self notifications boolean selfChange = (entry.observer.asBinder() == observerBinder); if (selfChange && !observerWantsSelfNotifications) { continue; } - // Make sure the observer is interested in the notification - if (leaf || (!leaf && entry.notifyForDescendents)) { - calls.add(new ObserverCall(this, entry.observer, selfChange)); + // Does this observer match the target user? + if (targetUserHandle == UserHandle.USER_ALL + || entry.userHandle == UserHandle.USER_ALL + || targetUserHandle == entry.userHandle) { + // Make sure the observer is interested in the notification + if (leaf || (!leaf && entry.notifyForDescendants)) { + calls.add(new ObserverCall(this, entry.observer, selfChange)); + } } } } + /** + * targetUserHandle is either a hard user handle or is USER_ALL + */ public void collectObserversLocked(Uri uri, int index, IContentObserver observer, - boolean observerWantsSelfNotifications, ArrayList<ObserverCall> calls) { + boolean observerWantsSelfNotifications, int targetUserHandle, + ArrayList<ObserverCall> calls) { String segment = null; int segmentCount = countUriSegments(uri); if (index >= segmentCount) { // This is the leaf node, notify all observers - collectMyObserversLocked(true, observer, observerWantsSelfNotifications, calls); + collectMyObserversLocked(true, observer, observerWantsSelfNotifications, + targetUserHandle, calls); } else if (index < segmentCount){ segment = getUriSegment(uri, index); - // Notify any observers at this level who are interested in descendents - collectMyObserversLocked(false, observer, observerWantsSelfNotifications, calls); + // Notify any observers at this level who are interested in descendants + collectMyObserversLocked(false, observer, observerWantsSelfNotifications, + targetUserHandle, calls); } int N = mChildren.size(); @@ -744,7 +826,7 @@ public final class ContentService extends IContentService.Stub { if (segment == null || node.mName.equals(segment)) { // We found the child, node.collectObserversLocked(uri, index + 1, - observer, observerWantsSelfNotifications, calls); + observer, observerWantsSelfNotifications, targetUserHandle, calls); if (segment != null) { break; } diff --git a/core/java/android/content/IContentService.aidl b/core/java/android/content/IContentService.aidl index 86a9392..f956bcf 100644 --- a/core/java/android/content/IContentService.aidl +++ b/core/java/android/content/IContentService.aidl @@ -30,12 +30,28 @@ import android.database.IContentObserver; * @hide */ interface IContentService { - void registerContentObserver(in Uri uri, boolean notifyForDescendentsn, - IContentObserver observer); void unregisterContentObserver(IContentObserver observer); + /** + * Register a content observer tied to a specific user's view of the provider. + * @param userHandle the user whose view of the provider is to be observed. May be + * the calling user without requiring any permission, otherwise the caller needs to + * hold the INTERACT_ACROSS_USERS_FULL permission. Pseudousers USER_ALL and + * USER_CURRENT are properly handled. + */ + void registerContentObserver(in Uri uri, boolean notifyForDescendants, + IContentObserver observer, int userHandle); + + /** + * Notify observers of a particular user's view of the provider. + * @param userHandle the user whose view of the provider is to be notified. May be + * the calling user without requiring any permission, otherwise the caller needs to + * hold the INTERACT_ACROSS_USERS_FULL permission. Pseudousers USER_ALL + * USER_CURRENT are properly interpreted. + */ void notifyChange(in Uri uri, IContentObserver observer, - boolean observerWantsSelfNotifications, boolean syncToNetwork); + boolean observerWantsSelfNotifications, boolean syncToNetwork, + int userHandle); void requestSync(in Account account, String authority, in Bundle extras); void cancelSync(in Account account, String authority); diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl index c7a8493..653c5f3 100644 --- a/core/java/android/os/IUserManager.aidl +++ b/core/java/android/os/IUserManager.aidl @@ -28,6 +28,7 @@ interface IUserManager { boolean removeUser(int userHandle); void setUserName(int userHandle, String name); ParcelFileDescriptor setUserIcon(int userHandle); + ParcelFileDescriptor getUserIcon(int userHandle); List<UserInfo> getUsers(); UserInfo getUserInfo(int userHandle); void setGuestEnabled(boolean enable); diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 6c7c50b..daec7ea 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -167,6 +167,22 @@ public class UserManager { } /** + * Returns a file descriptor for the user's photo. PNG data can be read from this file. + * @param userHandle the user whose photo we want to read. + * @return a {@link ParcelFileDescriptor} from which to read the file, or null if there's no + * photo. + * @hide + */ + public ParcelFileDescriptor getUserIcon(int userHandle) { + try { + return mService.getUserIcon(userHandle); + } catch (RemoteException re) { + Log.w(TAG, "Could not set the user icon ", re); + return null; + } + } + + /** * Enable or disable the use of a guest account. If disabled, the existing guest account * will be wiped. * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. diff --git a/core/java/android/text/format/DateFormat.java b/core/java/android/text/format/DateFormat.java index 524f941..c36273e 100644 --- a/core/java/android/text/format/DateFormat.java +++ b/core/java/android/text/format/DateFormat.java @@ -35,10 +35,18 @@ import java.text.SimpleDateFormat; Utility class for producing strings with formatted date/time. <p> - This class takes as inputs a format string and a representation of a date/time. - The format string controls how the output is generated. + Most callers should avoid supplying their own format strings to this + class' {@code format} methods and rely on the correctly localized ones + supplied by the system. This class' factory methods return + appropriately-localized {@link java.text.DateFormat} instances, suitable + for both formatting and parsing dates. For the canonical documentation + of format strings, see {@link java.text.SimpleDateFormat}. </p> <p> + The format methods in this class takes as inputs a format string and a representation of a date/time. + The format string controls how the output is generated. + This class only supports a subset of the full Unicode specification. + Use {@link java.text.SimpleDateFormat} if you need more. Formatting characters may be repeated in order to get more detailed representations of that field. For instance, the format character 'M' is used to represent the month. Depending on how many times that character is repeated @@ -152,7 +160,8 @@ public class DateFormat { public static final char MINUTE = 'm'; /** - This designator indicates the month of the year + This designator indicates the month of the year. See also + {@link #STANDALONE_MONTH}. Examples for September: M -> 9 @@ -163,6 +172,14 @@ public class DateFormat { public static final char MONTH = 'M'; /** + This designator indicates the standalone month of the year, + necessary in some format strings in some languages. For + example, Russian distinguishes between the "June" in + "June" and that in "June 2010". + */ + public static final char STANDALONE_MONTH = 'L'; + + /** This designator indicates the seconds of the minute. Examples for 7 seconds past the minute: @@ -374,7 +391,7 @@ public class DateFormat { index++; } - if (!foundMonth && (c == MONTH)) { + if (!foundMonth && (c == MONTH || c == STANDALONE_MONTH)) { foundMonth = true; order[index] = MONTH; index++; @@ -494,9 +511,10 @@ public class DateFormat { break; case MONTH: - replacement = getMonthString(inDate, count); + case STANDALONE_MONTH: + replacement = getMonthString(inDate, count, c); break; - + case SECONDS: replacement = zeroPad(inDate.get(Calendar.SECOND), count); break; @@ -527,14 +545,19 @@ public class DateFormat { return s.toString(); } - private static final String getMonthString(Calendar inDate, int count) { + private static final String getMonthString(Calendar inDate, int count, int kind) { + boolean standalone = (kind == STANDALONE_MONTH); int month = inDate.get(Calendar.MONTH); - if (count >= 4) - return DateUtils.getMonthString(month, DateUtils.LENGTH_LONG); - else if (count == 3) - return DateUtils.getMonthString(month, DateUtils.LENGTH_MEDIUM); - else { + if (count >= 4) { + return standalone + ? DateUtils.getStandaloneMonthString(month, DateUtils.LENGTH_LONG) + : DateUtils.getMonthString(month, DateUtils.LENGTH_LONG); + } else if (count == 3) { + return standalone + ? DateUtils.getStandaloneMonthString(month, DateUtils.LENGTH_MEDIUM) + : DateUtils.getMonthString(month, DateUtils.LENGTH_MEDIUM); + } else { // Calendar.JANUARY == 0, so add 1 to month. return zeroPad(month+1, count); } @@ -574,7 +597,8 @@ public class DateFormat { private static final String getYearString(Calendar inDate, int count) { int year = inDate.get(Calendar.YEAR); - return (count <= 2) ? zeroPad(year % 100, 2) : String.valueOf(year); + return (count <= 2) ? zeroPad(year % 100, 2) + : String.format(Locale.getDefault(), "%d", year); } private static final int appendQuotedText(SpannableStringBuilder s, int i, int len) { @@ -615,17 +639,6 @@ public class DateFormat { } private static final String zeroPad(int inValue, int inMinDigits) { - String val = String.valueOf(inValue); - - if (val.length() < inMinDigits) { - char[] buf = new char[inMinDigits]; - - for (int i = 0; i < inMinDigits; i++) - buf[i] = '0'; - - val.getChars(0, val.length(), buf, inMinDigits - val.length()); - val = new String(buf); - } - return val; + return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue); } } diff --git a/core/java/android/util/PropertyValueModel.java b/core/java/android/util/PropertyValueModel.java deleted file mode 100755 index eb9c47d..0000000 --- a/core/java/android/util/PropertyValueModel.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.util; - -/** - * A value model for a {@link Property property} of a host object. This class can be used for - * both reflective and non-reflective property implementations. - * - * @param <H> the host type, where the host is the object that holds this property - * @param <T> the value type - * - * @see Property - * @see ValueModel - */ -public class PropertyValueModel<H, T> extends ValueModel<T> { - private final H mHost; - private final Property<H, T> mProperty; - - private PropertyValueModel(H host, Property<H, T> property) { - mProperty = property; - mHost = host; - } - - /** - * Returns the host. - * - * @return the host - */ - public H getHost() { - return mHost; - } - - /** - * Returns the property. - * - * @return the property - */ - public Property<H, T> getProperty() { - return mProperty; - } - - @Override - public Class<T> getType() { - return mProperty.getType(); - } - - @Override - public T get() { - return mProperty.get(mHost); - } - - @Override - public void set(T value) { - mProperty.set(mHost, value); - } - - /** - * Return an appropriate PropertyValueModel for this host and property. - * - * @param host the host - * @param property the property - * @return the value model - */ - public static <H, T> PropertyValueModel<H, T> of(H host, Property<H, T> property) { - return new PropertyValueModel<H, T>(host, property); - } - - /** - * Return a PropertyValueModel for this {@code host} and a - * reflective property, constructed from this {@code propertyType} and {@code propertyName}. - * - * @param host - * @param propertyType the property type - * @param propertyName the property name - * @return a value model with this host and a reflective property with this type and name - * - * @see Property#of - */ - public static <H, T> PropertyValueModel<H, T> of(H host, Class<T> propertyType, - String propertyName) { - return of(host, Property.of((Class<H>) host.getClass(), propertyType, propertyName)); - } - - private static Class getNullaryMethodReturnType(Class c, String name) { - try { - return c.getMethod(name).getReturnType(); - } catch (NoSuchMethodException e) { - return null; - } - } - - private static Class getFieldType(Class c, String name) { - try { - return c.getField(name).getType(); - } catch (NoSuchFieldException e) { - return null; - } - } - - private static String capitalize(String name) { - if (name.isEmpty()) { - return name; - } - return Character.toUpperCase(name.charAt(0)) + name.substring(1); - } - - /** - * Return a PropertyValueModel for this {@code host} and and {@code propertyName}. - * - * @param host the host - * @param propertyName the property name - * @return a value model with this host and a reflective property with this name - */ - public static PropertyValueModel of(Object host, String propertyName) { - Class clazz = host.getClass(); - String suffix = capitalize(propertyName); - Class propertyType = getNullaryMethodReturnType(clazz, "get" + suffix); - if (propertyType == null) { - propertyType = getNullaryMethodReturnType(clazz, "is" + suffix); - } - if (propertyType == null) { - propertyType = getFieldType(clazz, propertyName); - } - if (propertyType == null) { - throw new NoSuchPropertyException(propertyName); - } - return of(host, propertyType, propertyName); - } -} diff --git a/core/java/android/util/ValueModel.java b/core/java/android/util/ValueModel.java deleted file mode 100755 index 4789682..0000000 --- a/core/java/android/util/ValueModel.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.util; - -/** - * A ValueModel is an abstraction for a 'slot' or place in memory in which a value - * may be stored and retrieved. A common implementation of ValueModel is a regular property of - * an object, whose value may be retrieved by calling the appropriate <em>getter</em> - * method and set by calling the corresponding <em>setter</em> method. - * - * @param <T> the value type - * - * @see PropertyValueModel - */ -public abstract class ValueModel<T> { - /** - * The empty model should be used in place of {@code null} to indicate that a - * model has not been set. The empty model has no value and does nothing when it is set. - */ - public static final ValueModel EMPTY = new ValueModel() { - @Override - public Class getType() { - return Object.class; - } - - @Override - public Object get() { - return null; - } - - @Override - public void set(Object value) { - - } - }; - - protected ValueModel() { - } - - /** - * Returns the type of this property. - * - * @return the property type - */ - public abstract Class<T> getType(); - - /** - * Returns the value of this property. - * - * @return the property value - */ - public abstract T get(); - - /** - * Sets the value of this property. - * - * @param value the new value for this property - */ - public abstract void set(T value); -}
\ No newline at end of file diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index 869cd00..032ff7b 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/GLES20Canvas.java @@ -150,7 +150,7 @@ class GLES20Canvas extends HardwareCanvas { static native int nCreateTextureLayer(boolean opaque, int[] layerInfo); static native int nCreateLayer(int width, int height, boolean isOpaque, int[] layerInfo); - static native void nResizeLayer(int layerId, int width, int height, int[] layerInfo); + static native boolean nResizeLayer(int layerId, int width, int height, int[] layerInfo); static native void nSetOpaqueLayer(int layerId, boolean isOpaque); static native void nSetLayerPaint(int layerId, int nativePaint); static native void nSetLayerColorFilter(int layerId, int nativeColorFilter); diff --git a/core/java/android/view/GLES20RenderLayer.java b/core/java/android/view/GLES20RenderLayer.java index a77425a..fcfc8e1 100644 --- a/core/java/android/view/GLES20RenderLayer.java +++ b/core/java/android/view/GLES20RenderLayer.java @@ -54,8 +54,8 @@ class GLES20RenderLayer extends GLES20Layer { } @Override - void resize(int width, int height) { - if (!isValid() || width <= 0 || height <= 0) return; + boolean resize(int width, int height) { + if (!isValid() || width <= 0 || height <= 0) return false; mWidth = width; mHeight = height; @@ -63,11 +63,17 @@ class GLES20RenderLayer extends GLES20Layer { if (width != mLayerWidth || height != mLayerHeight) { int[] layerInfo = new int[2]; - GLES20Canvas.nResizeLayer(mLayer, width, height, layerInfo); - - mLayerWidth = layerInfo[0]; - mLayerHeight = layerInfo[1]; + if (GLES20Canvas.nResizeLayer(mLayer, width, height, layerInfo)) { + mLayerWidth = layerInfo[0]; + mLayerHeight = layerInfo[1]; + } else { + // Failure: not enough GPU resources for requested size + mLayer = 0; + mLayerWidth = 0; + mLayerHeight = 0; + } } + return isValid(); } @Override diff --git a/core/java/android/view/GLES20TextureLayer.java b/core/java/android/view/GLES20TextureLayer.java index e198ef6..b0ee2aa 100644 --- a/core/java/android/view/GLES20TextureLayer.java +++ b/core/java/android/view/GLES20TextureLayer.java @@ -48,7 +48,8 @@ class GLES20TextureLayer extends GLES20Layer { } @Override - void resize(int width, int height) { + boolean resize(int width, int height) { + return isValid(); } @Override diff --git a/core/java/android/view/HardwareLayer.java b/core/java/android/view/HardwareLayer.java index 6e763b2..d798e73 100644 --- a/core/java/android/view/HardwareLayer.java +++ b/core/java/android/view/HardwareLayer.java @@ -135,8 +135,9 @@ abstract class HardwareLayer { * * @param width The new desired minimum width for this layer * @param height The new desired minimum height for this layer + * @return True if the resulting layer is valid, false otherwise */ - abstract void resize(int width, int height); + abstract boolean resize(int width, int height); /** * Returns a hardware canvas that can be used to render onto diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index f906e24..446a51e 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -733,13 +733,17 @@ public abstract class HardwareRenderer { */ void checkEglErrors() { if (isEnabled()) { - int error = sEgl.eglGetError(); - if (error != EGL_SUCCESS) { - // something bad has happened revert to - // normal rendering. - Log.w(LOG_TAG, "EGL error: " + GLUtils.getEGLErrorString(error)); - fallback(error != EGL11.EGL_CONTEXT_LOST); - } + checkEglErrorsForced(); + } + } + + private void checkEglErrorsForced() { + int error = sEgl.eglGetError(); + if (error != EGL_SUCCESS) { + // something bad has happened revert to + // normal rendering. + Log.w(LOG_TAG, "EGL error: " + GLUtils.getEGLErrorString(error)); + fallback(error != EGL11.EGL_CONTEXT_LOST); } } @@ -812,7 +816,9 @@ public abstract class HardwareRenderer { throw new RuntimeException("eglInitialize failed " + GLUtils.getEGLErrorString(sEgl.eglGetError())); } - + + checkEglErrorsForced(); + sEglConfig = chooseEglConfig(); if (sEglConfig == null) { // We tried to use EGL_SWAP_BEHAVIOR_PRESERVED_BIT, try again without diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 03f9b72..d93c1be 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -12213,8 +12213,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mLocalDirtyRect.set(0, 0, width, height); } else { if (mHardwareLayer.getWidth() != width || mHardwareLayer.getHeight() != height) { - mHardwareLayer.resize(width, height); - mLocalDirtyRect.set(0, 0, width, height); + if (mHardwareLayer.resize(width, height)) { + mLocalDirtyRect.set(0, 0, width, height); + } } // This should not be necessary but applications that change @@ -12225,7 +12226,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, computeOpaqueFlags(); final boolean opaque = isOpaque(); - if (mHardwareLayer.isOpaque() != opaque) { + if (mHardwareLayer.isValid() && mHardwareLayer.isOpaque() != opaque) { mHardwareLayer.setOpaque(opaque); mLocalDirtyRect.set(0, 0, width, height); } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index d6a0203..27fd374 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1402,6 +1402,7 @@ public final class ViewRootImpl implements ViewParent, mResizeBuffer.getHeight() != mHeight) { mResizeBuffer.resize(mWidth, mHeight); } + // TODO: should handle create/resize failure layerCanvas = mResizeBuffer.start(hwRendererCanvas); layerCanvas.setViewport(mWidth, mHeight); layerCanvas.onPreDraw(null); diff --git a/core/java/android/widget/CheckBox.java b/core/java/android/widget/CheckBox.java index 41ab5f2..f1804f8 100644 --- a/core/java/android/widget/CheckBox.java +++ b/core/java/android/widget/CheckBox.java @@ -20,7 +20,6 @@ import android.content.Context; import android.util.AttributeSet; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; -import android.util.ValueModel; /** @@ -56,9 +55,7 @@ import android.util.ValueModel; * {@link android.R.styleable#View View Attributes} * </p> */ -public class CheckBox extends CompoundButton implements ValueEditor<Boolean> { - private ValueModel<Boolean> mValueModel = ValueModel.EMPTY; - +public class CheckBox extends CompoundButton { public CheckBox(Context context) { this(context, null); } @@ -82,22 +79,4 @@ public class CheckBox extends CompoundButton implements ValueEditor<Boolean> { super.onInitializeAccessibilityNodeInfo(info); info.setClassName(CheckBox.class.getName()); } - - @Override - public ValueModel<Boolean> getValueModel() { - return mValueModel; - } - - @Override - public void setValueModel(ValueModel<Boolean> valueModel) { - mValueModel = valueModel; - setChecked(mValueModel.get()); - } - - @Override - public boolean performClick() { - boolean handled = super.performClick(); - mValueModel.set(isChecked()); - return handled; - } } diff --git a/core/java/android/widget/EditText.java b/core/java/android/widget/EditText.java index ec81214..57e51c2 100644 --- a/core/java/android/widget/EditText.java +++ b/core/java/android/widget/EditText.java @@ -17,7 +17,6 @@ package android.widget; import android.content.Context; -import android.graphics.Rect; import android.text.Editable; import android.text.Selection; import android.text.Spannable; @@ -25,7 +24,6 @@ import android.text.TextUtils; import android.text.method.ArrowKeyMovementMethod; import android.text.method.MovementMethod; import android.util.AttributeSet; -import android.util.ValueModel; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; @@ -49,9 +47,7 @@ import android.view.accessibility.AccessibilityNodeInfo; * {@link android.R.styleable#TextView TextView Attributes}, * {@link android.R.styleable#View View Attributes} */ -public class EditText extends TextView implements ValueEditor<CharSequence> { - private ValueModel<CharSequence> mValueModel = ValueModel.EMPTY; - +public class EditText extends TextView { public EditText(Context context) { this(context, null); } @@ -132,21 +128,4 @@ public class EditText extends TextView implements ValueEditor<CharSequence> { super.onInitializeAccessibilityNodeInfo(info); info.setClassName(EditText.class.getName()); } - - @Override - public ValueModel<CharSequence> getValueModel() { - return mValueModel; - } - - @Override - public void setValueModel(ValueModel<CharSequence> valueModel) { - mValueModel = valueModel; - setText(mValueModel.get()); - } - - @Override - void sendAfterTextChanged(Editable text) { - super.sendAfterTextChanged(text); - mValueModel.set(text); - } } diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 7f9dab9..237275a 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -1801,13 +1801,13 @@ public class Editor { mTextView.deleteText_internal(dragSourceStart, dragSourceEnd); // Make sure we do not leave two adjacent spaces. - CharSequence t = mTextView.getTransformedText(dragSourceStart - 1, dragSourceStart + 1); - if ( (dragSourceStart == 0 || Character.isSpaceChar(t.charAt(0))) && - (dragSourceStart == mTextView.getText().length() || - Character.isSpaceChar(t.charAt(1))) ) { - final int pos = dragSourceStart == mTextView.getText().length() ? - dragSourceStart - 1 : dragSourceStart; - mTextView.deleteText_internal(pos, pos + 1); + final int prevCharIdx = Math.max(0, dragSourceStart - 1); + final int nextCharIdx = Math.min(mTextView.getText().length(), dragSourceStart + 1); + if (nextCharIdx > prevCharIdx + 1) { + CharSequence t = mTextView.getTransformedText(prevCharIdx, nextCharIdx); + if (Character.isSpaceChar(t.charAt(0)) && Character.isSpaceChar(t.charAt(1))) { + mTextView.deleteText_internal(prevCharIdx, prevCharIdx + 1); + } } } } diff --git a/core/java/android/widget/SeekBar.java b/core/java/android/widget/SeekBar.java index a6486a8..2737f94 100644 --- a/core/java/android/widget/SeekBar.java +++ b/core/java/android/widget/SeekBar.java @@ -18,7 +18,6 @@ package android.widget; import android.content.Context; import android.util.AttributeSet; -import android.util.ValueModel; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; @@ -34,7 +33,7 @@ import android.view.accessibility.AccessibilityNodeInfo; * * @attr ref android.R.styleable#SeekBar_thumb */ -public class SeekBar extends AbsSeekBar implements ValueEditor<Integer> { +public class SeekBar extends AbsSeekBar { /** * A callback that notifies clients when the progress level has been @@ -70,9 +69,8 @@ public class SeekBar extends AbsSeekBar implements ValueEditor<Integer> { void onStopTrackingTouch(SeekBar seekBar); } - private ValueModel<Integer> mValueModel = ValueModel.EMPTY; private OnSeekBarChangeListener mOnSeekBarChangeListener; - + public SeekBar(Context context) { this(context, null); } @@ -91,23 +89,9 @@ public class SeekBar extends AbsSeekBar implements ValueEditor<Integer> { if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onProgressChanged(this, getProgress(), fromUser); - if (fromUser) { - mValueModel.set(getProgress()); - } } } - @Override - public ValueModel<Integer> getValueModel() { - return mValueModel; - } - - @Override - public void setValueModel(ValueModel<Integer> valueModel) { - mValueModel = valueModel; - setProgress(mValueModel.get()); - } - /** * Sets a listener to receive notifications of changes to the SeekBar's progress level. Also * provides notifications of when the user starts and stops a touch gesture within the SeekBar. diff --git a/core/java/android/widget/ValueEditor.java b/core/java/android/widget/ValueEditor.java deleted file mode 100755 index 2b91abf..0000000 --- a/core/java/android/widget/ValueEditor.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.widget; - -import android.util.ValueModel; - -/** - * An interface for editors of simple values. Classes implementing this interface are normally - * UI controls (subclasses of {@link android.view.View View}) that can provide a suitable - * user interface to display and edit values of the specified type. This interface is - * intended to describe editors for simple types, like {@code boolean}, {@code int} or - * {@code String}, where the values themselves are immutable. - * <p> - * For example, {@link android.widget.CheckBox CheckBox} implements - * this interface for the Boolean type as it is capable of providing an appropriate - * mechanism for displaying and changing the value of a Boolean property. - * - * @param <T> the value type that this editor supports - */ -public interface ValueEditor<T> { - /** - * Return the last value model that was set. If no value model has been set, the editor - * should return the value {@link android.util.ValueModel#EMPTY}. - * - * @return the value model - */ - public ValueModel<T> getValueModel(); - - /** - * Sets the value model for this editor. When the value model is set, the editor should - * retrieve the value from the value model, using {@link android.util.ValueModel#get()}, - * and set its internal state accordingly. Likewise, when the editor's internal state changes - * it should update the value model by calling {@link android.util.ValueModel#set(T)} - * with the appropriate value. - * - * @param valueModel the new value model for this editor. - */ - public void setValueModel(ValueModel<T> valueModel); -} diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp index 7dbf9ec..2ff886e 100644 --- a/core/jni/android_view_GLES20Canvas.cpp +++ b/core/jni/android_view_GLES20Canvas.cpp @@ -766,14 +766,16 @@ static Layer* android_view_GLES20Canvas_createLayer(JNIEnv* env, jobject clazz, return layer; } -static void android_view_GLES20Canvas_resizeLayer(JNIEnv* env, jobject clazz, +static bool android_view_GLES20Canvas_resizeLayer(JNIEnv* env, jobject clazz, Layer* layer, jint width, jint height, jintArray layerInfo) { - LayerRenderer::resizeLayer(layer, width, height); - - jint* storage = env->GetIntArrayElements(layerInfo, NULL); - storage[0] = layer->getWidth(); - storage[1] = layer->getHeight(); - env->ReleaseIntArrayElements(layerInfo, storage, 0); + if (LayerRenderer::resizeLayer(layer, width, height)) { + jint* storage = env->GetIntArrayElements(layerInfo, NULL); + storage[0] = layer->getWidth(); + storage[1] = layer->getHeight(); + env->ReleaseIntArrayElements(layerInfo, storage, 0); + return true; + } + return false; } static void android_view_GLES20Canvas_setLayerPaint(JNIEnv* env, jobject clazz, @@ -992,7 +994,7 @@ static JNINativeMethod gMethods[] = { { "nCreateLayerRenderer", "(I)I", (void*) android_view_GLES20Canvas_createLayerRenderer }, { "nCreateLayer", "(IIZ[I)I", (void*) android_view_GLES20Canvas_createLayer }, - { "nResizeLayer", "(III[I)V" , (void*) android_view_GLES20Canvas_resizeLayer }, + { "nResizeLayer", "(III[I)Z" , (void*) android_view_GLES20Canvas_resizeLayer }, { "nSetLayerPaint", "(II)V", (void*) android_view_GLES20Canvas_setLayerPaint }, { "nSetLayerColorFilter", "(II)V", (void*) android_view_GLES20Canvas_setLayerColorFilter }, { "nSetOpaqueLayer", "(IZ)V", (void*) android_view_GLES20Canvas_setOpaqueLayer }, diff --git a/core/res/res/layout/keyguard_transport_control_view.xml b/core/res/res/layout/keyguard_transport_control_view.xml index 8e76164..c40aa66 100644 --- a/core/res/res/layout/keyguard_transport_control_view.xml +++ b/core/res/res/layout/keyguard_transport_control_view.xml @@ -20,7 +20,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" - android:layerType="hardware" android:id="@+id/keyguard_transport_control"> <!-- FrameLayout used as scrim to show between album art and buttons --> diff --git a/core/tests/coretests/src/android/content/ObserverNodeTest.java b/core/tests/coretests/src/android/content/ObserverNodeTest.java index 95b8465..1acff9c 100644 --- a/core/tests/coretests/src/android/content/ObserverNodeTest.java +++ b/core/tests/coretests/src/android/content/ObserverNodeTest.java @@ -23,6 +23,7 @@ import android.content.ContentService.ObserverNode; import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; +import android.os.UserHandle; import android.test.AndroidTestCase; public class ObserverNodeTest extends AndroidTestCase { @@ -33,6 +34,8 @@ public class ObserverNodeTest extends AndroidTestCase { } public void testUri() { + final int myUserHandle = UserHandle.myUserId(); + ObserverNode root = new ObserverNode(""); Uri[] uris = new Uri[] { Uri.parse("content://c/a/"), @@ -48,21 +51,25 @@ public class ObserverNodeTest extends AndroidTestCase { int[] nums = new int[] {4, 7, 1, 4, 2, 2, 3, 3}; // special case - root.addObserverLocked(uris[0], new TestObserver().getContentObserver(), false, root, 0, 0); + root.addObserverLocked(uris[0], new TestObserver().getContentObserver(), false, root, + 0, 0, myUserHandle); for(int i = 1; i < uris.length; i++) { - root.addObserverLocked(uris[i], new TestObserver().getContentObserver(), true, root, 0, 0); + root.addObserverLocked(uris[i], new TestObserver().getContentObserver(), true, root, + 0, 0, myUserHandle); } ArrayList<ObserverCall> calls = new ArrayList<ObserverCall>(); for (int i = nums.length - 1; i >=0; --i) { - root.collectObserversLocked(uris[i], 0, null, false, calls); + root.collectObserversLocked(uris[i], 0, null, false, myUserHandle, calls); assertEquals(nums[i], calls.size()); calls.clear(); } } public void testUriNotNotify() { + final int myUserHandle = UserHandle.myUserId(); + ObserverNode root = new ObserverNode(""); Uri[] uris = new Uri[] { Uri.parse("content://c/"), @@ -77,13 +84,14 @@ public class ObserverNodeTest extends AndroidTestCase { int[] nums = new int[] {7, 1, 3, 3, 1, 1, 1, 1}; for(int i = 0; i < uris.length; i++) { - root.addObserverLocked(uris[i], new TestObserver().getContentObserver(), false, root, 0, 0); + root.addObserverLocked(uris[i], new TestObserver().getContentObserver(), false, root, + 0, 0, myUserHandle); } ArrayList<ObserverCall> calls = new ArrayList<ObserverCall>(); for (int i = uris.length - 1; i >=0; --i) { - root.collectObserversLocked(uris[i], 0, null, false, calls); + root.collectObserversLocked(uris[i], 0, null, false, myUserHandle, calls); assertEquals(nums[i], calls.size()); calls.clear(); } diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp index c3444e6..cc72df6 100644 --- a/libs/hwui/DisplayListRenderer.cpp +++ b/libs/hwui/DisplayListRenderer.cpp @@ -182,6 +182,10 @@ void DisplayList::clearResources() { caches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i)); } + for (size_t i = 0; i < mLayers.size(); i++) { + caches.resourceCache.decrementRefcountLocked(mLayers.itemAt(i)); + } + caches.resourceCache.unlock(); for (size_t i = 0; i < mPaints.size(); i++) { @@ -206,6 +210,7 @@ void DisplayList::clearResources() { mPaints.clear(); mPaths.clear(); mMatrices.clear(); + mLayers.clear(); } void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) { @@ -264,6 +269,12 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde caches.resourceCache.incrementRefcountLocked(sourcePaths.itemAt(i)); } + const Vector<Layer*>& layers = recorder.getLayers(); + for (size_t i = 0; i < layers.size(); i++) { + mLayers.add(layers.itemAt(i)); + caches.resourceCache.incrementRefcountLocked(layers.itemAt(i)); + } + caches.resourceCache.unlock(); const Vector<SkPaint*>& paints = recorder.getPaints(); @@ -1361,6 +1372,10 @@ void DisplayListRenderer::reset() { mCaches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i)); } + for (size_t i = 0; i < mLayers.size(); i++) { + mCaches.resourceCache.decrementRefcountLocked(mLayers.itemAt(i)); + } + mCaches.resourceCache.unlock(); mBitmapResources.clear(); @@ -1379,6 +1394,8 @@ void DisplayListRenderer::reset() { mMatrices.clear(); + mLayers.clear(); + mHasDrawOps = false; } @@ -1539,7 +1556,7 @@ status_t DisplayListRenderer::drawDisplayList(DisplayList* displayList, status_t DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) { addOp(DisplayList::DrawLayer); - addInt((int) layer); + addLayer(layer); addPoint(x, y); addPaint(paint); return DrawGlInfo::kStatusDone; diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h index 8e4f2d3..a0b1630 100644 --- a/libs/hwui/DisplayListRenderer.h +++ b/libs/hwui/DisplayListRenderer.h @@ -496,6 +496,7 @@ private: SortedVector<SkPath*> mSourcePaths; Vector<SkMatrix*> mMatrices; Vector<SkiaShader*> mShaders; + Vector<Layer*> mLayers; mutable SkFlattenableReadBuffer mReader; @@ -652,6 +653,10 @@ public: return mSourcePaths; } + const Vector<Layer*>& getLayers() const { + return mLayers; + } + const Vector<SkMatrix*>& getMatrices() const { return mMatrices; } @@ -804,6 +809,12 @@ private: mMatrices.add(copy); } + inline void addLayer(Layer* layer) { + addInt((int) layer); + mLayers.add(layer); + mCaches.resourceCache.incrementRefcount(layer); + } + inline void addBitmap(SkBitmap* bitmap) { // Note that this assumes the bitmap is immutable. There are cases this won't handle // correctly, such as creating the bitmap from scratch, drawing with it, changing its @@ -862,6 +873,8 @@ private: Vector<SkMatrix*> mMatrices; + Vector<Layer*> mLayers; + uint32_t mBufferSize; int mRestoreSaveCount; diff --git a/libs/hwui/Layer.cpp b/libs/hwui/Layer.cpp index 31e169b..76b274b 100644 --- a/libs/hwui/Layer.cpp +++ b/libs/hwui/Layer.cpp @@ -25,10 +25,29 @@ namespace android { namespace uirenderer { +Layer::Layer(const uint32_t layerWidth, const uint32_t layerHeight) { + mesh = NULL; + meshIndices = NULL; + meshElementCount = 0; + cacheable = true; + textureLayer = false; + renderTarget = GL_TEXTURE_2D; + texture.width = layerWidth; + texture.height = layerHeight; + colorFilter = NULL; + deferredUpdateScheduled = false; + renderer = NULL; + displayList = NULL; + fbo = 0; + Caches::getInstance().resourceCache.incrementRefcount(this); +} + Layer::~Layer() { if (mesh) delete mesh; if (meshIndices) delete meshIndices; if (colorFilter) Caches::getInstance().resourceCache.decrementRefcount(colorFilter); + if (fbo) Caches::getInstance().fboCache.put(fbo); + deleteTexture(); } void Layer::setPaint(SkPaint* paint) { diff --git a/libs/hwui/Layer.h b/libs/hwui/Layer.h index 76da671..420073a 100644 --- a/libs/hwui/Layer.h +++ b/libs/hwui/Layer.h @@ -46,21 +46,7 @@ class DisplayList; */ struct Layer { - Layer(const uint32_t layerWidth, const uint32_t layerHeight) { - mesh = NULL; - meshIndices = NULL; - meshElementCount = 0; - cacheable = true; - textureLayer = false; - renderTarget = GL_TEXTURE_2D; - texture.width = layerWidth; - texture.height = layerHeight; - colorFilter = NULL; - deferredUpdateScheduled = false; - renderer = NULL; - displayList = NULL; - } - + Layer(const uint32_t layerWidth, const uint32_t layerHeight); ~Layer(); /** diff --git a/libs/hwui/LayerCache.cpp b/libs/hwui/LayerCache.cpp index eea707e..ce74cee 100644 --- a/libs/hwui/LayerCache.cpp +++ b/libs/hwui/LayerCache.cpp @@ -69,15 +69,10 @@ void LayerCache::setMaxSize(uint32_t maxSize) { void LayerCache::deleteLayer(Layer* layer) { if (layer) { - GLuint fbo = layer->getFbo(); - LAYER_LOGD("Destroying layer %dx%d, fbo %d", layer->getWidth(), layer->getHeight(), fbo); - + LAYER_LOGD("Destroying layer %dx%d, fbo %d", layer->getWidth(), layer->getHeight(), + layer->getFbo()); mSize -= layer->getWidth() * layer->getHeight() * 4; - - if (fbo) Caches::getInstance().fboCache.put(fbo); - layer->deleteTexture(); - - delete layer; + Caches::getInstance().resourceCache.decrementRefcount(layer); } } diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp index 02af5e2..b57d806 100644 --- a/libs/hwui/LayerRenderer.cpp +++ b/libs/hwui/LayerRenderer.cpp @@ -211,10 +211,8 @@ Layer* LayerRenderer::createLayer(uint32_t width, uint32_t height, bool isOpaque fbo, width, height); glBindFramebuffer(GL_FRAMEBUFFER, previousFbo); - caches.fboCache.put(fbo); - layer->deleteTexture(); - delete layer; + Caches::getInstance().resourceCache.decrementRefcount(layer); return NULL; } @@ -240,8 +238,7 @@ bool LayerRenderer::resizeLayer(Layer* layer, uint32_t width, uint32_t height) { layer->texCoords.set(0.0f, height / float(layer->getHeight()), width / float(layer->getWidth()), 0.0f); } else { - layer->deleteTexture(); - delete layer; + Caches::getInstance().resourceCache.decrementRefcount(layer); return false; } } @@ -303,8 +300,7 @@ void LayerRenderer::destroyLayer(Layer* layer) { if (!Caches::getInstance().layerCache.put(layer)) { LAYER_RENDERER_LOGD(" Destroyed!"); - layer->deleteTexture(); - delete layer; + Caches::getInstance().resourceCache.decrementRefcount(layer); } else { LAYER_RENDERER_LOGD(" Cached!"); #if DEBUG_LAYER_RENDERER diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 02448e8..4aefcba 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -643,10 +643,8 @@ bool OpenGLRenderer::createFboLayer(Layer* layer, Rect& bounds, Rect& clip, GLui ALOGE("Framebuffer incomplete (GL error code 0x%x)", status); glBindFramebuffer(GL_FRAMEBUFFER, previousFbo); - layer->deleteTexture(); - mCaches.fboCache.put(layer->getFbo()); - delete layer; + Caches::getInstance().resourceCache.decrementRefcount(layer); return false; } @@ -732,8 +730,7 @@ void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) { // Failing to add the layer to the cache should happen only if the layer is too large if (!mCaches.layerCache.put(layer)) { LAYER_LOGD("Deleting layer"); - layer->deleteTexture(); - delete layer; + Caches::getInstance().resourceCache.decrementRefcount(layer); } } diff --git a/libs/hwui/Program.h b/libs/hwui/Program.h index a3bfaa4..a821a9c 100644 --- a/libs/hwui/Program.h +++ b/libs/hwui/Program.h @@ -204,8 +204,7 @@ struct ProgramDescription { * be provided with a modulation color. */ bool setColor(const float r, const float g, const float b, const float a) { - modulate = a < COLOR_COMPONENT_THRESHOLD || r < COLOR_COMPONENT_THRESHOLD || - g < COLOR_COMPONENT_THRESHOLD || b < COLOR_COMPONENT_THRESHOLD; + modulate = a < COLOR_COMPONENT_THRESHOLD; return modulate; } diff --git a/libs/hwui/ProgramCache.cpp b/libs/hwui/ProgramCache.cpp index be8f80a..2d13f60 100644 --- a/libs/hwui/ProgramCache.cpp +++ b/libs/hwui/ProgramCache.cpp @@ -140,9 +140,9 @@ const char* gFS_Header_Uniforms_PointHasBitmap = "uniform vec2 textureDimension;\n" "uniform float pointSize;\n"; const char* gFS_Uniforms_TextureSampler = - "uniform sampler2D sampler;\n"; + "uniform sampler2D baseSampler;\n"; const char* gFS_Uniforms_ExternalTextureSampler = - "uniform samplerExternalOES sampler;\n"; + "uniform samplerExternalOES baseSampler;\n"; #define FS_UNIFORMS_DITHER \ "uniform float ditherSize;\n" \ "uniform sampler2D ditherSampler;\n" @@ -199,27 +199,27 @@ const char* gFS_Fast_SingleColor = "}\n\n"; const char* gFS_Fast_SingleTexture = "\nvoid main(void) {\n" - " gl_FragColor = texture2D(sampler, outTexCoords);\n" + " gl_FragColor = texture2D(baseSampler, outTexCoords);\n" "}\n\n"; const char* gFS_Fast_SingleModulateTexture = "\nvoid main(void) {\n" - " gl_FragColor = color.a * texture2D(sampler, outTexCoords);\n" + " gl_FragColor = color.a * texture2D(baseSampler, outTexCoords);\n" "}\n\n"; const char* gFS_Fast_SingleA8Texture = "\nvoid main(void) {\n" - " gl_FragColor = texture2D(sampler, outTexCoords);\n" + " gl_FragColor = texture2D(baseSampler, outTexCoords);\n" "}\n\n"; const char* gFS_Fast_SingleA8Texture_ApplyGamma = "\nvoid main(void) {\n" - " gl_FragColor = vec4(0.0, 0.0, 0.0, pow(texture2D(sampler, outTexCoords).a, gamma));\n" + " gl_FragColor = vec4(0.0, 0.0, 0.0, pow(texture2D(baseSampler, outTexCoords).a, gamma));\n" "}\n\n"; const char* gFS_Fast_SingleModulateA8Texture = "\nvoid main(void) {\n" - " gl_FragColor = color * texture2D(sampler, outTexCoords).a;\n" + " gl_FragColor = color * texture2D(baseSampler, outTexCoords).a;\n" "}\n\n"; const char* gFS_Fast_SingleModulateA8Texture_ApplyGamma = "\nvoid main(void) {\n" - " gl_FragColor = color * pow(texture2D(sampler, outTexCoords).a, gamma);\n" + " gl_FragColor = color * pow(texture2D(baseSampler, outTexCoords).a, gamma);\n" "}\n\n"; const char* gFS_Fast_SingleGradient[2] = { "\nvoid main(void) {\n" @@ -231,10 +231,10 @@ const char* gFS_Fast_SingleGradient[2] = { }; const char* gFS_Fast_SingleModulateGradient[2] = { "\nvoid main(void) {\n" - " gl_FragColor " FS_MAIN_DITHER " + color.a * texture2D(gradientSampler, linear);\n" + " gl_FragColor = " FS_MAIN_DITHER " + color.a * texture2D(gradientSampler, linear);\n" "}\n\n", "\nvoid main(void) {\n" - " gl_FragColor " FS_MAIN_DITHER " + color.a * mix(startColor, endColor, clamp(linear, 0.0, 1.0));\n" + " gl_FragColor = " FS_MAIN_DITHER " + color.a * mix(startColor, endColor, clamp(linear, 0.0, 1.0));\n" "}\n\n" }; @@ -243,8 +243,6 @@ const char* gFS_Main_FetchColor = " fragColor = color;\n"; const char* gFS_Main_ModulateColor = " fragColor *= color.a;\n"; -const char* gFS_Main_ModulateColor_ApplyGamma = - " fragColor *= pow(color.a, gamma);\n"; const char* gFS_Main_AccountForAA = " fragColor *= (1.0 - smoothstep(boundaryWidth, 0.5, abs(0.5 - widthProportion)))\n" " * (1.0 - smoothstep(boundaryLength, 0.5, abs(0.5 - lengthProportion)));\n"; @@ -253,15 +251,17 @@ const char* gFS_Main_AccountForAARect = const char* gFS_Main_FetchTexture[2] = { // Don't modulate - " fragColor = texture2D(sampler, outTexCoords);\n", + " fragColor = texture2D(baseSampler, outTexCoords);\n", // Modulate - " fragColor = color * texture2D(sampler, outTexCoords);\n" + " fragColor = color * texture2D(baseSampler, outTexCoords);\n" }; -const char* gFS_Main_FetchA8Texture[2] = { +const char* gFS_Main_FetchA8Texture[4] = { // Don't modulate - " fragColor = texture2D(sampler, outTexCoords);\n", + " fragColor = texture2D(baseSampler, outTexCoords);\n", + " fragColor = texture2D(baseSampler, outTexCoords);\n", // Modulate - " fragColor = color * texture2D(sampler, outTexCoords).a;\n" + " fragColor = color * texture2D(baseSampler, outTexCoords).a;\n", + " fragColor = color * pow(texture2D(baseSampler, outTexCoords).a, gamma);\n" }; const char* gFS_Main_FetchGradient[6] = { // Linear @@ -289,29 +289,38 @@ const char* gFS_Main_BlendShadersBG = " fragColor = blendShaders(gradientColor, bitmapColor)"; const char* gFS_Main_BlendShadersGB = " fragColor = blendShaders(bitmapColor, gradientColor)"; -const char* gFS_Main_BlendShaders_Modulate[3] = { +const char* gFS_Main_BlendShaders_Modulate[6] = { // Don't modulate ";\n", + ";\n", // Modulate " * fragColor.a;\n", + " * fragColor.a;\n", // Modulate with alpha 8 texture - " * texture2D(sampler, outTexCoords).a;\n" + " * texture2D(baseSampler, outTexCoords).a;\n", + " * pow(texture2D(baseSampler, outTexCoords).a, gamma);\n" }; -const char* gFS_Main_GradientShader_Modulate[3] = { +const char* gFS_Main_GradientShader_Modulate[6] = { // Don't modulate " fragColor = gradientColor;\n", + " fragColor = gradientColor;\n", // Modulate " fragColor = gradientColor * fragColor.a;\n", + " fragColor = gradientColor * fragColor.a;\n", // Modulate with alpha 8 texture - " fragColor = gradientColor * texture2D(sampler, outTexCoords).a;\n" + " fragColor = gradientColor * texture2D(baseSampler, outTexCoords).a;\n", + " fragColor = gradientColor * pow(texture2D(baseSampler, outTexCoords).a, gamma);\n" }; -const char* gFS_Main_BitmapShader_Modulate[3] = { +const char* gFS_Main_BitmapShader_Modulate[6] = { // Don't modulate " fragColor = bitmapColor;\n", + " fragColor = bitmapColor;\n", // Modulate " fragColor = bitmapColor * fragColor.a;\n", + " fragColor = bitmapColor * fragColor.a;\n", // Modulate with alpha 8 texture - " fragColor = bitmapColor * texture2D(sampler, outTexCoords).a;\n" + " fragColor = bitmapColor * texture2D(baseSampler, outTexCoords).a;\n", + " fragColor = bitmapColor * pow(texture2D(baseSampler, outTexCoords).a, gamma);\n" }; const char* gFS_Main_FragColor = " gl_FragColor = fragColor;\n"; @@ -518,6 +527,14 @@ String8 ProgramCache::generateVertexShader(const ProgramDescription& description return shader; } +static bool shaderOp(const ProgramDescription& description, String8& shader, + const int modulateOp, const char** snippets) { + int op = description.hasAlpha8Texture ? MODULATE_OP_MODULATE_A8 : modulateOp; + op = op * 2 + description.hasGammaCorrection; + shader.append(snippets[op]); + return description.hasAlpha8Texture; +} + String8 ProgramCache::generateFragmentShader(const ProgramDescription& description) { String8 shader; @@ -661,13 +678,14 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti if (description.hasTexture || description.hasExternalTexture) { if (description.hasAlpha8Texture) { if (!description.hasGradient && !description.hasBitmap) { - shader.append(gFS_Main_FetchA8Texture[modulateOp]); + shader.append(gFS_Main_FetchA8Texture[modulateOp * 2 + + description.hasGammaCorrection]); } } else { shader.append(gFS_Main_FetchTexture[modulateOp]); } } else { - if ((!description.hasGradient && !description.hasBitmap) || description.modulate) { + if (!description.hasGradient && !description.hasBitmap) { shader.append(gFS_Main_FetchColor); } } @@ -688,32 +706,27 @@ String8 ProgramCache::generateFragmentShader(const ProgramDescription& descripti bool applyModulate = false; // Case when we have two shaders set if (description.hasGradient && description.hasBitmap) { - int op = description.hasAlpha8Texture ? MODULATE_OP_MODULATE_A8 : modulateOp; if (description.isBitmapFirst) { shader.append(gFS_Main_BlendShadersBG); } else { shader.append(gFS_Main_BlendShadersGB); } - shader.append(gFS_Main_BlendShaders_Modulate[op]); - applyModulate = true; + applyModulate = shaderOp(description, shader, modulateOp, + gFS_Main_BlendShaders_Modulate); } else { if (description.hasGradient) { - int op = description.hasAlpha8Texture ? MODULATE_OP_MODULATE_A8 : modulateOp; - shader.append(gFS_Main_GradientShader_Modulate[op]); - applyModulate = true; + applyModulate = shaderOp(description, shader, modulateOp, + gFS_Main_GradientShader_Modulate); } else if (description.hasBitmap) { - int op = description.hasAlpha8Texture ? MODULATE_OP_MODULATE_A8 : modulateOp; - shader.append(gFS_Main_BitmapShader_Modulate[op]); - applyModulate = true; + applyModulate = shaderOp(description, shader, modulateOp, + gFS_Main_BitmapShader_Modulate); } } + if (description.modulate && applyModulate) { - if (description.hasGammaCorrection) { - shader.append(gFS_Main_ModulateColor_ApplyGamma); - } else { - shader.append(gFS_Main_ModulateColor); - } + shader.append(gFS_Main_ModulateColor); } + // Apply the color op if needed shader.append(gFS_Main_ApplyColorOp[description.colorOp]); diff --git a/libs/hwui/ResourceCache.cpp b/libs/hwui/ResourceCache.cpp index b0c57d1..1c83ea4 100644 --- a/libs/hwui/ResourceCache.cpp +++ b/libs/hwui/ResourceCache.cpp @@ -79,6 +79,10 @@ void ResourceCache::incrementRefcount(SkiaColorFilter* filterResource) { incrementRefcount((void*) filterResource, kColorFilter); } +void ResourceCache::incrementRefcount(Layer* layerResource) { + incrementRefcount((void*) layerResource, kLayer); +} + void ResourceCache::incrementRefcountLocked(void* resource, ResourceType resourceType) { ssize_t index = mCache->indexOfKey(resource); ResourceReference* ref = index >= 0 ? mCache->valueAt(index) : NULL; @@ -109,6 +113,10 @@ void ResourceCache::incrementRefcountLocked(SkiaColorFilter* filterResource) { incrementRefcountLocked((void*) filterResource, kColorFilter); } +void ResourceCache::incrementRefcountLocked(Layer* layerResource) { + incrementRefcountLocked((void*) layerResource, kLayer); +} + void ResourceCache::decrementRefcount(void* resource) { Mutex::Autolock _l(mLock); decrementRefcountLocked(resource); @@ -134,6 +142,10 @@ void ResourceCache::decrementRefcount(SkiaColorFilter* filterResource) { decrementRefcount((void*) filterResource); } +void ResourceCache::decrementRefcount(Layer* layerResource) { + decrementRefcount((void*) layerResource); +} + void ResourceCache::decrementRefcountLocked(void* resource) { ssize_t index = mCache->indexOfKey(resource); ResourceReference* ref = index >= 0 ? mCache->valueAt(index) : NULL; @@ -167,6 +179,10 @@ void ResourceCache::decrementRefcountLocked(SkiaColorFilter* filterResource) { decrementRefcountLocked((void*) filterResource); } +void ResourceCache::decrementRefcountLocked(Layer* layerResource) { + decrementRefcountLocked((void*) layerResource); +} + void ResourceCache::destructor(SkPath* resource) { Mutex::Autolock _l(mLock); destructorLocked(resource); @@ -280,7 +296,7 @@ void ResourceCache::deleteResourceReference(void* resource, ResourceReference* r if (ref->recycled && ref->resourceType == kBitmap) { ((SkBitmap*) resource)->setPixels(NULL, NULL); } - if (ref->destroyed) { + if (ref->destroyed || ref->resourceType == kLayer) { switch (ref->resourceType) { case kBitmap: { SkBitmap* bitmap = (SkBitmap*) resource; @@ -308,6 +324,11 @@ void ResourceCache::deleteResourceReference(void* resource, ResourceReference* r delete filter; } break; + case kLayer: { + Layer* layer = (Layer*) resource; + delete layer; + } + break; } } mCache->removeItem(resource); diff --git a/libs/hwui/ResourceCache.h b/libs/hwui/ResourceCache.h index 60ffa7d..2053d96 100644 --- a/libs/hwui/ResourceCache.h +++ b/libs/hwui/ResourceCache.h @@ -23,6 +23,7 @@ #include <SkiaColorFilter.h> #include <SkiaShader.h> #include <utils/KeyedVector.h> +#include "Layer.h" namespace android { namespace uirenderer { @@ -35,6 +36,7 @@ enum ResourceType { kShader, kColorFilter, kPath, + kLayer }; class ResourceReference { @@ -67,21 +69,25 @@ public: void incrementRefcount(SkBitmap* resource); void incrementRefcount(SkiaShader* resource); void incrementRefcount(SkiaColorFilter* resource); + void incrementRefcount(Layer* resource); void incrementRefcountLocked(SkPath* resource); void incrementRefcountLocked(SkBitmap* resource); void incrementRefcountLocked(SkiaShader* resource); void incrementRefcountLocked(SkiaColorFilter* resource); + void incrementRefcountLocked(Layer* resource); void decrementRefcount(SkBitmap* resource); void decrementRefcount(SkPath* resource); void decrementRefcount(SkiaShader* resource); void decrementRefcount(SkiaColorFilter* resource); + void decrementRefcount(Layer* resource); void decrementRefcountLocked(SkBitmap* resource); void decrementRefcountLocked(SkPath* resource); void decrementRefcountLocked(SkiaShader* resource); void decrementRefcountLocked(SkiaColorFilter* resource); + void decrementRefcountLocked(Layer* resource); void destructor(SkPath* resource); void destructor(SkBitmap* resource); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 7cc5dec..a0ae9e3 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -317,13 +317,14 @@ public class SettingsProvider extends ContentProvider { boolean backedUpDataChanged = false; String property = null, table = uri.getPathSegments().get(0); + final boolean isGlobal = table.equals(TABLE_GLOBAL); if (table.equals(TABLE_SYSTEM)) { property = Settings.System.SYS_PROP_SETTING_VERSION + '_' + userHandle; backedUpDataChanged = true; } else if (table.equals(TABLE_SECURE)) { property = Settings.Secure.SYS_PROP_SETTING_VERSION + '_' + userHandle; backedUpDataChanged = true; - } else if (table.equals(TABLE_GLOBAL)) { + } else if (isGlobal) { property = Settings.Global.SYS_PROP_SETTING_VERSION; // this one is global backedUpDataChanged = true; } @@ -342,8 +343,9 @@ public class SettingsProvider extends ContentProvider { String notify = uri.getQueryParameter("notify"); if (notify == null || "true".equals(notify)) { - getContext().getContentResolver().notifyChange(uri, null); - if (LOCAL_LOGV) Log.v(TAG, "notifying: " + uri); + final int notifyTarget = isGlobal ? UserHandle.USER_ALL : userHandle; + getContext().getContentResolver().notifyChange(uri, null, true, notifyTarget); + if (LOCAL_LOGV) Log.v(TAG, "notifying for " + notifyTarget + ": " + uri); } else { if (LOCAL_LOGV) Log.v(TAG, "notification suppressed: " + uri); } diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png Binary files differindex ba286d5..bfe0990 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_off.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_on.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_on.png Binary files differindex 3b334de..b2be115 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_on.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_airplane_on.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_auto_rotate.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_auto_rotate.png Binary files differindex ec1ac15..d5f1e29 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_auto_rotate.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_auto_rotate.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_0.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_0.png Binary files differindex 6f6de2d..6fd7910 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_0.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_0.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_100.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_100.png Binary files differindex b07cff9..f3632f3 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_100.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_100.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_15.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_15.png Binary files differindex 6290840..228f59a 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_15.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_15.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_28.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_28.png Binary files differindex d046c86..dc8510d 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_28.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_28.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_43.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_43.png Binary files differindex bee1025..77abaaa 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_43.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_43.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_57.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_57.png Binary files differindex a95cec5..403bfbc 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_57.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_57.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_71.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_71.png Binary files differindex 58fa9c7..c0ff12c 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_71.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_71.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_85.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_85.png Binary files differindex 5ea7466..18e8864 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_85.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_85.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_0.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_0.png Binary files differindex 311b659..9ab1d8f 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_0.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_0.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_100.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_100.png Binary files differindex 6884c16..64db815 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_100.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_100.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_15.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_15.png Binary files differindex c92c5d8..3965162 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_15.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_15.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_28.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_28.png Binary files differindex 02ff6e6..4b14d62 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_28.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_28.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_43.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_43.png Binary files differindex 76245ef..3f51ba5 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_43.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_43.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_57.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_57.png Binary files differindex 9f358fc..aecf7e6 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_57.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_57.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_71.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_71.png Binary files differindex 5544567..524bf73 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_71.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_71.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_85.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_85.png Binary files differindex cde5bfa..80325c7 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_85.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_charge_85.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_unknown.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_unknown.png Binary files differindex 48cd877..ceaa03b 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_unknown.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_battery_unknown.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png Binary files differindex 2a02413..2ba62f9 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_off.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_on.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_on.png Binary files differindex 322a747..7d6fed5 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_on.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_bluetooth_on.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_off.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_off.png Binary files differindex a5c8693..464bb6a 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_off.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_off.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_on.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_on.png Binary files differindex ba0f893..dbdc524 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_on.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_brightness_auto_on.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_default_user.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_default_user.png Binary files differnew file mode 100644 index 0000000..03c450c --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_default_user.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_ime.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_ime.png Binary files differindex 97324c6..e46d8a3 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_ime.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_ime.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_location.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_location.png Binary files differindex 9699e81..7e67171 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_location.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_location.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_mirroring.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_mirroring.png Binary files differindex 7a4fb11..5912301 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_mirroring.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_mirroring.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_rotation_locked.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_rotation_locked.png Binary files differindex e7797b9..1a7618d 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_rotation_locked.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_rotation_locked.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png Binary files differindex 6e56c8c..115bc41 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_0.png Binary files differindex ce55266..39fff41 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_0.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_0.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.png Binary files differindex 6209b9d..97558ff 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.png Binary files differindex 8a50dc0..f5f0f74 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.png Binary files differindex d9e0a46..80472e5 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.png Binary files differindex 4034681..59af783 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.png Binary files differindex 2356cfa..54be048 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.png Binary files differindex 2f17ccf..2495d07 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.png Binary files differindex 4e60d05..7616e17 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.png Binary files differindex 6a71c36..2bd5949 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1.png Binary files differindex 8875fb2..544dcf9 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1x.png Binary files differindex 4b987a0..5ca9892 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1x.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1x.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_2.png Binary files differindex 9d0bb26..7f050f8 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_2.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_2.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3.png Binary files differindex 65a9949..be1ed56 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3g.png Binary files differindex 34fe280..5eab3c8 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3g.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3g.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4.png Binary files differindex 928fd16..502787b 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_e.png Binary files differindex 0717cc6..e436ed8 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_e.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_e.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_g.png Binary files differindex dd44443..304c278 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_g.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_g.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_h.png Binary files differindex 2d46d93..26687ca 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_h.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_h.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_r.png Binary files differnew file mode 100644 index 0000000..b0449e1 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_r.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.png Binary files differindex 03137e2..ce77c5e 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.png Binary files differindex 5c8793e..7d8d284 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png Binary files differindex a601b2a..bf0e995 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png Binary files differindex ce511b3..1782c1c 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png Binary files differindex 3d1bd3c..c97a167 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png Binary files differindex 70f364a..f999c6e 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.png Binary files differindex e459f64..1431c3d 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_usb_device.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_usb_device.png Binary files differindex 971b9e0..13ee0a5 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_usb_device.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_usb_device.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_0.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_0.png Binary files differnew file mode 100644 index 0000000..7e7d068 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_0.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.png Binary files differindex 377a009..bdba14e 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.png Binary files differindex d62b0bd..b51b0a6 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.png Binary files differindex b40f6d9..e1ac946 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.png Binary files differindex 6d1e410..fec4d2b 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_1.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_1.png Binary files differnew file mode 100644 index 0000000..0a31297 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_1.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_2.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_2.png Binary files differnew file mode 100644 index 0000000..3e712ad --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_2.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_3.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_3.png Binary files differnew file mode 100644 index 0000000..565ae54 --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_3.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_4.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_4.png Binary files differnew file mode 100644 index 0000000..2c30f8e --- /dev/null +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_4.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png Binary files differindex 049086a..bf0e995 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png Binary files differindex aec214d..1782c1c 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png Binary files differindex 73ac90c..ea6d235 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png Binary files differindex b3956ee..f999c6e 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png Binary files differindex 1a111df..53ef509 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_off.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_on.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_on.png Binary files differindex 956699c..a20f6b2 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_on.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_airplane_on.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_auto_rotate.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_auto_rotate.png Binary files differindex 3a202d0..10ae0f0 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_auto_rotate.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_auto_rotate.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_0.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_0.png Binary files differindex a33d423..c581919 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_0.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_0.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_100.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_100.png Binary files differindex 8203b3f..2f330f7 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_100.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_100.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_15.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_15.png Binary files differindex 0e237c0..2a1637c 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_15.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_15.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_28.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_28.png Binary files differindex 4bbd29e..8457c2b 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_28.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_28.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_43.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_43.png Binary files differindex ac0e62c..f72fe4a 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_43.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_43.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_57.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_57.png Binary files differindex 2863a58..10e3275 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_57.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_57.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_71.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_71.png Binary files differindex 4029d83..ca1613c 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_71.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_71.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_85.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_85.png Binary files differindex d0ea00a..2bfe20d 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_85.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_85.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_0.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_0.png Binary files differindex 0ffa232..b917281 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_0.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_0.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_100.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_100.png Binary files differindex aa6458d..480f579 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_100.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_100.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_15.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_15.png Binary files differindex 8841868..cee2a44 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_15.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_15.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_28.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_28.png Binary files differindex 777bc7a..f2056db 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_28.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_28.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_43.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_43.png Binary files differindex 7271089..697d4ec 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_43.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_43.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_57.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_57.png Binary files differindex d2be21b..9c53dd4 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_57.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_57.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_71.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_71.png Binary files differindex 1708d32..c967999 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_71.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_71.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_85.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_85.png Binary files differindex 103d3b8..8df8234 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_85.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_charge_85.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_unknown.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_unknown.png Binary files differindex 8246a60..c3a4ab4 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_unknown.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_battery_unknown.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png Binary files differindex b288094..6246ebe 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_off.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_on.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_on.png Binary files differindex 48fed00..ec30791 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_on.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_bluetooth_on.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_off.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_off.png Binary files differindex 76b65cf..2a530f8 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_off.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_off.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_on.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_on.png Binary files differindex ab274ee..9940a65 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_on.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_brightness_auto_on.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_default_user.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_default_user.png Binary files differnew file mode 100644 index 0000000..d90bdd3 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_default_user.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_ime.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_ime.png Binary files differindex 6667050..10e325d 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_ime.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_ime.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_location.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_location.png Binary files differindex fce92ba..79f1f47 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_location.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_location.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_mirroring.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_mirroring.png Binary files differindex 28253ea..a5f16e8 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_mirroring.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_mirroring.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_rotation_locked.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_rotation_locked.png Binary files differindex 1ef88fc..b70df3d 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_rotation_locked.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_rotation_locked.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png Binary files differindex 2b2abdd..c410310 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_0.png Binary files differindex 20c13d0..d46fced 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_0.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_0.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.png Binary files differindex 278681d..3bd6001 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.png Binary files differindex 6ef198d..9599611 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.png Binary files differindex 79691fc..975ac27 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.png Binary files differindex d3c09b7..3c221cf 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.png Binary files differindex dd8d13a..d75ef889 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.png Binary files differindex 004299f..d367585 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.png Binary files differindex 80f72b4..97b3dda 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.png Binary files differindex b5bc3d9..4d49307 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1.png Binary files differindex 192d234..5c8dc82 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1x.png Binary files differindex cc8ac74..01560e8 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1x.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1x.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2.png Binary files differindex 8d916b4..3082ff0 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3.png Binary files differindex 293db72..7966be8 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3g.png Binary files differindex 9bd6e55..a78c4d6 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3g.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3g.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4.png Binary files differindex c9dc1d8..dce07ae 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_e.png Binary files differindex 641b002..828a728 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_e.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_e.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_g.png Binary files differindex 3230eb9..f1a8017 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_g.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_g.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_h.png Binary files differindex 67b0c37..9077d56 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_h.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_h.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_r.png Binary files differnew file mode 100644 index 0000000..d298624 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_r.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.png Binary files differindex 80096e7..2eeff7f 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.png Binary files differindex ba99cec..c708e00 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png Binary files differindex 9f8c107..bfa3f12 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png Binary files differindex cb44955..8302636 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png Binary files differindex e03e230..90aa923 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png Binary files differindex 78fbd30..889be88 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.png Binary files differindex 3b1e093..92f7fcc 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_usb_device.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_usb_device.png Binary files differindex 94069bd..6ac70fa 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_usb_device.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_usb_device.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_0.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_0.png Binary files differnew file mode 100644 index 0000000..9ab044d --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_0.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.png Binary files differindex 6b4e5c2..473851b 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.png Binary files differindex 3847828..da2fe94 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.png Binary files differindex bf43969..44d98be 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.png Binary files differindex 53838ee..1a06411 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_1.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_1.png Binary files differnew file mode 100644 index 0000000..e78ab6b --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_1.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_2.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_2.png Binary files differnew file mode 100644 index 0000000..1b025f26 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_2.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_3.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_3.png Binary files differnew file mode 100644 index 0000000..3036c86 --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_3.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_4.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_4.png Binary files differnew file mode 100644 index 0000000..de000eb --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_4.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png Binary files differindex 490a172..bfa3f12 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png Binary files differindex 6f27626..8302636 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png Binary files differindex f5f5f40..d392496 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png Binary files differindex a9d0e2e..889be88 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png Binary files differindex 8f3809b..c05d4d6 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_off.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_on.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_on.png Binary files differindex dc2530d..ef8a7eb 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_on.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_airplane_on.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_auto_rotate.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_auto_rotate.png Binary files differindex e0cc192..5bceaf5 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_auto_rotate.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_auto_rotate.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_0.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_0.png Binary files differindex b62fb34..2b592cc 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_0.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_0.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_100.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_100.png Binary files differindex f5d8e7d..2c56c9b 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_100.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_100.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_15.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_15.png Binary files differindex c57e62d..9895f71 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_15.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_15.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_28.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_28.png Binary files differindex f4bfe1a..323fa8b 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_28.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_28.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_43.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_43.png Binary files differindex 07d2c83..98eea99 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_43.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_43.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_57.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_57.png Binary files differindex 06aaf11..64555c0 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_57.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_57.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_71.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_71.png Binary files differindex 2f56daa..ad8b15f 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_71.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_71.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_85.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_85.png Binary files differindex ac0d7bc..071b79b 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_85.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_85.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_0.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_0.png Binary files differindex 1f5b55a..1ecedca 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_0.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_0.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_100.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_100.png Binary files differindex 18cd25c..234bb63 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_100.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_100.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_15.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_15.png Binary files differindex ecd4734..e3c6920 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_15.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_15.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_28.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_28.png Binary files differindex dc54996..3dfbe4c 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_28.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_28.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_43.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_43.png Binary files differindex 758a874..3f493f1 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_43.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_43.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_57.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_57.png Binary files differindex c4ab7d5..0cce725 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_57.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_57.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_71.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_71.png Binary files differindex a63e7e3..f6fff00 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_71.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_71.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_85.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_85.png Binary files differindex b0f7aa6..35ef746 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_85.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_charge_85.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_unknown.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_unknown.png Binary files differindex 71fe29f..f5fbbfb 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_unknown.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_battery_unknown.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png Binary files differindex 9bd89fd..1302a26 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_off.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_on.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_on.png Binary files differindex a1c0911..7ac3015 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_on.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_bluetooth_on.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_off.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_off.png Binary files differindex 1d9a027..b2b563b 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_off.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_off.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_on.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_on.png Binary files differindex fabb79c..b1c8753 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_on.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_brightness_auto_on.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_default_user.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_default_user.png Binary files differnew file mode 100644 index 0000000..fd9b677 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_default_user.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_ime.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_ime.png Binary files differindex 98683f9..f84e614 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_ime.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_ime.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_location.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_location.png Binary files differindex a5351b2..b2033df 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_location.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_location.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_mirroring.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_mirroring.png Binary files differindex 7d2d650..eb6d5a6 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_mirroring.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_mirroring.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_rotation_locked.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_rotation_locked.png Binary files differindex b641f40..0098df4 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_rotation_locked.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_rotation_locked.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png Binary files differindex 349370d..011a0e8 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_0.png Binary files differindex 22aea9d..7419be9 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_0.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_0.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.png Binary files differindex 88df979..ddf4217 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.png Binary files differindex cbac90f..e237331 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.png Binary files differindex a085bf4..e074dd3 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.png Binary files differindex f104e1a..12abe5c 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.png Binary files differindex 3f0a8df..8d84c6e 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.png Binary files differindex da0a281..0a42598 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.png Binary files differindex a6e8c21..08634e3 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.png Binary files differindex f6eeb1d..10f1d09 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1.png Binary files differindex 32ff8ff..1cbe239 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1x.png Binary files differindex 1fca536..9507162 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1x.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1x.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_2.png Binary files differindex e5fe0b2..deb8c87 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_2.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_2.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3.png Binary files differindex bf53c7c..7186579 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3g.png Binary files differindex 2e97c3a..1aa2393 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3g.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3g.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4.png Binary files differindex 4684eaa..adafb2c 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_e.png Binary files differindex 0bff121..67e2e11 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_e.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_e.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_g.png Binary files differindex 9836082..f47c63e 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_g.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_g.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_h.png Binary files differindex 1877a28..2421050 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_h.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_h.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_r.png Binary files differnew file mode 100644 index 0000000..cb4782e --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_r.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.png Binary files differindex d888704..0dc8a58 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.png Binary files differindex 029f109..752c3f7 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png Binary files differindex baa6d86..7a14016 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png Binary files differindex 633bfc8..af7f76d 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png Binary files differindex 6c46e32..2af3c24 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png Binary files differindex dea0415..a4e0243 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.png Binary files differindex 53d0915..16193e7 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_usb_device.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_usb_device.png Binary files differindex d1ee39b..780a511 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_usb_device.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_usb_device.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_0.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_0.png Binary files differnew file mode 100644 index 0000000..42fdbe8 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_0.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.png Binary files differindex ad0ba68..005c6c6 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.png Binary files differindex 54236b4..a088e83 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.png Binary files differindex 7d2218b..6c2deb2 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.png Binary files differindex 152c428..fdb7a9b 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_1.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_1.png Binary files differnew file mode 100644 index 0000000..7d9f032 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_1.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_2.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_2.png Binary files differnew file mode 100644 index 0000000..896eacc --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_2.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_3.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_3.png Binary files differnew file mode 100644 index 0000000..0224da1 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_3.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_4.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_4.png Binary files differnew file mode 100644 index 0000000..fe28671 --- /dev/null +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_4.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png Binary files differindex 2836e4c..7a14016 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png Binary files differindex 01bbe33..af7f76d 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png Binary files differindex b36c4c3..66c3b92 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png Binary files differindex 07f2012..a4e0243 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png diff --git a/packages/SystemUI/res/drawable/qs_tile_background.xml b/packages/SystemUI/res/drawable/qs_tile_background.xml new file mode 100644 index 0000000..83dadd8 --- /dev/null +++ b/packages/SystemUI/res/drawable/qs_tile_background.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2012, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true"> + <color android:color="#252725" /> + </item> + <item> + <color android:color="#1B1D1B" /> + </item> +</selector> diff --git a/packages/SystemUI/res/layout/quick_settings.xml b/packages/SystemUI/res/layout/quick_settings.xml index d89f279..2dd3b9f 100644 --- a/packages/SystemUI/res/layout/quick_settings.xml +++ b/packages/SystemUI/res/layout/quick_settings.xml @@ -22,16 +22,20 @@ android:background="@drawable/notification_panel_bg" > <!-- TODO: Put into ScrollView --> - <com.android.systemui.statusbar.phone.QuickSettingsContainerView - android:id="@+id/quick_settings_container" + <ScrollView android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingBottom="@dimen/quick_settings_container_padding" - android:paddingLeft="@dimen/quick_settings_container_padding" - android:paddingRight="@dimen/quick_settings_container_padding" - android:animateLayoutChanges="true" - android:columnCount="@integer/quick_settings_num_columns" - /> + android:layout_height="wrap_content"> + <com.android.systemui.statusbar.phone.QuickSettingsContainerView + android:id="@+id/quick_settings_container" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingBottom="@dimen/quick_settings_container_padding" + android:paddingLeft="@dimen/quick_settings_container_padding" + android:paddingRight="@dimen/quick_settings_container_padding" + android:animateLayoutChanges="true" + android:columnCount="@integer/quick_settings_num_columns" + /> + </ScrollView> <LinearLayout android:id="@+id/handle" android:layout_width="match_parent" android:layout_height="@dimen/close_handle_height" diff --git a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml index 528121e..5f46e96 100644 --- a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml +++ b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml @@ -24,14 +24,17 @@ <ImageView android:id="@+id/brightness_icon" style="@style/SystemBarPanelSettingsIcon" + android:layout_gravity="center_vertical" + android:paddingRight="10dp" android:src="@drawable/ic_sysbar_brightness" /> <com.android.systemui.statusbar.policy.ToggleSlider android:id="@+id/brightness_slider" android:layout_width="0dp" - android:layout_height="match_parent" + android:layout_height="40dp" android:layout_weight="1" android:layout_marginRight="2dp" + android:layout_gravity="center_vertical" systemui:text="@string/status_bar_settings_auto_brightness_label" /> </LinearLayout> diff --git a/packages/SystemUI/res/layout/quick_settings_tile.xml b/packages/SystemUI/res/layout/quick_settings_tile.xml index a571393..911f6a2 100644 --- a/packages/SystemUI/res/layout/quick_settings_tile.xml +++ b/packages/SystemUI/res/layout/quick_settings_tile.xml @@ -17,4 +17,4 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="@dimen/quick_settings_cell_height" - android:background="#1B1D1B" />
\ No newline at end of file + android:background="@drawable/qs_tile_background" />
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/quick_settings_tile_brightness.xml b/packages/SystemUI/res/layout/quick_settings_tile_brightness.xml index 7cae199..ac872e6 100644 --- a/packages/SystemUI/res/layout/quick_settings_tile_brightness.xml +++ b/packages/SystemUI/res/layout/quick_settings_tile_brightness.xml @@ -16,6 +16,7 @@ <TextView xmlns:android="http://schemas.android.com/apk/res/android" style="@style/TextAppearance.QuickSettings.TileView" + android:id="@+id/brightness_textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" diff --git a/packages/SystemUI/res/layout/quick_settings_tile_user.xml b/packages/SystemUI/res/layout/quick_settings_tile_user.xml index 33d9a09..08e8e20 100644 --- a/packages/SystemUI/res/layout/quick_settings_tile_user.xml +++ b/packages/SystemUI/res/layout/quick_settings_tile_user.xml @@ -17,6 +17,12 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> + <ImageView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:src="@drawable/ic_qs_default_user" + android:scaleType="centerCrop" + /> <TextView style="@style/TextAppearance.QuickSettings.TileView" android:id="@+id/user_textview" diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index b65b013..cbd9957 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -409,6 +409,8 @@ <string name="quick_settings_battery_charged_label">Charged</string> <!-- QuickSettings: Bluetooth [CHAR LIMIT=NONE] --> <string name="quick_settings_bluetooth_label">Bluetooth</string> + <!-- QuickSettings: Bluetooth (Multiple) [CHAR LIMIT=NONE] --> + <string name="quick_settings_bluetooth_multiple_devices_label">Bluetooth (<xliff:g id="number">%d</xliff:g> Devices)</string> <!-- QuickSettings: Brightness [CHAR LIMIT=NONE] --> <string name="quick_settings_brightness_label">Brightness</string> <!-- QuickSettings: Rotation Unlocked [CHAR LIMIT=NONE] --> diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java index cd33951..9c3756c 100644 --- a/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java @@ -33,6 +33,7 @@ import com.android.systemui.statusbar.tablet.StatusBarPanel; public class RecentsActivity extends Activity { public static final String TOGGLE_RECENTS_INTENT = "com.android.systemui.TOGGLE_RECENTS"; public static final String CLOSE_RECENTS_INTENT = "com.android.systemui.CLOSE_RECENTS"; + private static final String WAS_SHOWING = "was_showing"; private RecentsPanelView mRecentsPanel; private IntentFilter mIntentFilter; @@ -139,7 +140,10 @@ public class RecentsActivity extends Activity { mRecentsPanel.setMinSwipeAlpha( getResources().getInteger(R.integer.config_recent_item_min_alpha) / 100f); - handleIntent(getIntent()); + if (savedInstanceState == null || + savedInstanceState.getBoolean(WAS_SHOWING)) { + handleIntent(getIntent()); + } mIntentFilter = new IntentFilter(); mIntentFilter.addAction(CLOSE_RECENTS_INTENT); registerReceiver(mIntentReceiver, mIntentFilter); @@ -147,6 +151,11 @@ public class RecentsActivity extends Activity { } @Override + protected void onSaveInstanceState(Bundle outState) { + outState.putBoolean(WAS_SHOWING, mRecentsPanel.isShowing()); + } + + @Override protected void onDestroy() { final SystemUIApplication app = (SystemUIApplication) getApplication(); final RecentTasksLoader recentTasksLoader = app.getRecentTasksLoader(); @@ -165,7 +174,7 @@ public class RecentsActivity extends Activity { if (TOGGLE_RECENTS_INTENT.equals(intent.getAction())) { if (mRecentsPanel != null) { - if (mRecentsPanel.isShowing() && mForeground) { + if (mRecentsPanel.isShowing()) { dismissAndGoBack(); } else { final SystemUIApplication app = (SystemUIApplication) getApplication(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java index 3a10155..9fb6d7c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone; import android.app.Dialog; import android.app.PendingIntent; +import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -35,6 +36,7 @@ import android.hardware.display.DisplayManager; import android.hardware.display.WifiDisplay; import android.hardware.display.WifiDisplayStatus; import android.net.Uri; +import android.os.Debug; import android.provider.ContactsContract; import android.provider.Settings; import android.view.LayoutInflater; @@ -51,6 +53,7 @@ import android.widget.TextView; import com.android.internal.view.RotationPolicy; import com.android.systemui.R; +import com.android.systemui.statusbar.phone.QuickSettingsModel.BrightnessState; import com.android.systemui.statusbar.phone.QuickSettingsModel.RSSIState; import com.android.systemui.statusbar.phone.QuickSettingsModel.State; import com.android.systemui.statusbar.phone.QuickSettingsModel.UserState; @@ -63,6 +66,7 @@ import com.android.systemui.statusbar.policy.ToggleSlider; import java.util.ArrayList; import java.util.Comparator; +import java.util.Set; /** @@ -80,6 +84,7 @@ class QuickSettings { private WifiDisplayListAdapter mWifiDisplayListAdapter; private BrightnessController mBrightnessController; + private BluetoothController mBluetoothController; private Dialog mBrightnessDialog; private CursorLoader mUserInfoLoader; @@ -116,10 +121,6 @@ class QuickSettings { IntentFilter filter = new IntentFilter(); filter.addAction(DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED); mContext.registerReceiver(mReceiver, filter); - - setupQuickSettings(); - updateWifiDisplayStatus(); - updateResources(); } void setBar(PanelBar bar) { @@ -132,6 +133,12 @@ class QuickSettings { void setup(NetworkController networkController, BluetoothController bluetoothController, BatteryController batteryController, LocationController locationController) { + mBluetoothController = bluetoothController; + + setupQuickSettings(); + updateWifiDisplayStatus(); + updateResources(); + networkController.addNetworkSignalChangedCallback(mModel); bluetoothController.addStateChangedCallback(mModel); batteryController.addStateChangedCallback(mModel); @@ -273,7 +280,7 @@ class QuickSettings { @Override public void refreshView(QuickSettingsTileView view, State state) { TextView tv = (TextView) view.findViewById(R.id.wifi_textview); - tv.setCompoundDrawablesRelativeWithIntrinsicBounds(0, state.iconId, 0, 0); + tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0); tv.setText(state.label); } }); @@ -329,7 +336,7 @@ class QuickSettings { @Override public void refreshView(QuickSettingsTileView view, State state) { TextView tv = (TextView) view.findViewById(R.id.rotation_lock_textview); - tv.setCompoundDrawablesRelativeWithIntrinsicBounds(0, state.iconId, 0, 0); + tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0); tv.setText(state.label); } }); @@ -381,7 +388,7 @@ class QuickSettings { @Override public void refreshView(QuickSettingsTileView view, State state) { TextView tv = (TextView) view.findViewById(R.id.airplane_mode_textview); - tv.setCompoundDrawablesRelativeWithIntrinsicBounds(0, state.iconId, 0, 0); + tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0); } }); parent.addView(airplaneTile); @@ -401,7 +408,27 @@ class QuickSettings { @Override public void refreshView(QuickSettingsTileView view, State state) { TextView tv = (TextView) view.findViewById(R.id.bluetooth_textview); - tv.setCompoundDrawablesRelativeWithIntrinsicBounds(0, state.iconId, 0, 0); + tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0); + + Resources r = mContext.getResources(); + String label = null; + /* + //TODO: Show connected bluetooth device label + Set<BluetoothDevice> btDevices = + mBluetoothController.getBondedBluetoothDevices(); + if (btDevices.size() == 1) { + // Show the name of the bluetooth device you are connected to + label = btDevices.iterator().next().getName(); + } else if (btDevices.size() > 1) { + // Show a generic label about the number of bluetooth devices + label = r.getString(R.string.quick_settings_bluetooth_multiple_devices_label, + btDevices.size()); + } + */ + if (label == null) { + label = r.getString(R.string.quick_settings_bluetooth_label); + } + tv.setText(label); } }); parent.addView(bluetoothTile); @@ -414,11 +441,17 @@ class QuickSettings { brightnessTile.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - // startSettingsActivity(android.provider.Settings.ACTION_DISPLAY_SETTINGS); mBar.collapseAllPanels(true); showBrightnessDialog(); } }); + mModel.addBrightnessTile(brightnessTile, new QuickSettingsModel.RefreshCallback() { + @Override + public void refreshView(QuickSettingsTileView view, State state) { + TextView tv = (TextView) view.findViewById(R.id.brightness_textview); + tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0); + } + }); parent.addView(brightnessTile); } @@ -529,6 +562,7 @@ class QuickSettings { mBrightnessController = new BrightnessController(mContext, (ToggleSlider) mBrightnessDialog.findViewById(R.id.brightness_slider)); + mBrightnessController.addStateChangedCallback(mModel); mBrightnessDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java index f239110..485b3e5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java @@ -39,6 +39,7 @@ import android.view.inputmethod.InputMethodSubtype; import com.android.internal.view.RotationPolicy; import com.android.systemui.R; import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback; +import com.android.systemui.statusbar.policy.BrightnessController.BrightnessStateChangeCallback; import com.android.systemui.statusbar.policy.LocationController.LocationGpsStateChangeCallback; import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback; @@ -48,7 +49,8 @@ import java.util.List; class QuickSettingsModel implements BluetoothStateChangeCallback, NetworkSignalChangedCallback, BatteryStateChangeCallback, - LocationGpsStateChangeCallback { + LocationGpsStateChangeCallback, + BrightnessStateChangeCallback { /** Represents the state of a given attribute. */ static class State { @@ -67,6 +69,9 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, static class UserState extends State { Drawable avatar; } + static class BrightnessState extends State { + boolean autoBrightness; + } /** The callback to update a given tile. */ interface RefreshCallback { @@ -150,6 +155,10 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, private RefreshCallback mRotationLockCallback; private State mRotationLockState = new State(); + private QuickSettingsTileView mBrightnessTile; + private RefreshCallback mBrightnessCallback; + private BrightnessState mBrightnessState = new BrightnessState(); + public QuickSettingsModel(Context context) { mContext = context; mHandler = new Handler(); @@ -406,4 +415,23 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, } } + // Brightness + void addBrightnessTile(QuickSettingsTileView view, RefreshCallback cb) { + mBrightnessTile = view; + mBrightnessCallback = cb; + onBrightnessLevelChanged(); + } + @Override + public void onBrightnessLevelChanged() { + int mode = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS_MODE, + Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); + mBrightnessState.autoBrightness = + (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC); + mBrightnessState.iconId = mBrightnessState.autoBrightness + ? R.drawable.ic_qs_brightness_auto_on + : R.drawable.ic_qs_brightness_auto_off; + mBrightnessCallback.refreshView(mBrightnessTile, mBrightnessState); + } + }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java index e517dde..0567371 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.policy; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter.BluetoothStateChangeCallback; +import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -25,10 +26,12 @@ import android.content.IntentFilter; import android.view.View; import android.widget.ImageView; -import java.util.ArrayList; - import com.android.systemui.R; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; + public class BluetoothController extends BroadcastReceiver { private static final String TAG = "StatusBar.BluetoothController"; @@ -39,6 +42,8 @@ public class BluetoothController extends BroadcastReceiver { private int mContentDescriptionId = 0; private boolean mEnabled = false; + private Set<BluetoothDevice> mBondedDevices = new HashSet<BluetoothDevice>(); + private ArrayList<BluetoothStateChangeCallback> mChangeCallbacks = new ArrayList<BluetoothStateChangeCallback>(); @@ -48,6 +53,7 @@ public class BluetoothController extends BroadcastReceiver { IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED); + filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED); context.registerReceiver(this, filter); final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); @@ -56,6 +62,7 @@ public class BluetoothController extends BroadcastReceiver { handleConnectionStateChange(adapter.getConnectionState()); } refreshViews(); + updateBondedBluetoothDevices(); } public void addIconView(ImageView v) { @@ -66,6 +73,10 @@ public class BluetoothController extends BroadcastReceiver { mChangeCallbacks.add(cb); } + public Set<BluetoothDevice> getBondedBluetoothDevices() { + return mBondedDevices; + } + @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); @@ -77,8 +88,25 @@ public class BluetoothController extends BroadcastReceiver { handleConnectionStateChange( intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE, BluetoothAdapter.STATE_DISCONNECTED)); + } else if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) { + // Fall through and update bonded devices and refresh view } refreshViews(); + updateBondedBluetoothDevices(); + } + + private void updateBondedBluetoothDevices() { + Set<BluetoothDevice> devices = BluetoothAdapter.getDefaultAdapter().getBondedDevices(); + if (devices != null) { + mBondedDevices.clear(); + for (BluetoothDevice device : devices) { + if (device.getBondState() != BluetoothDevice.BOND_NONE) { + mBondedDevices.add(device); + } + } + } else { + mBondedDevices.clear(); + } } public void handleAdapterStateChange(int adapterState) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java index 457e9dd..bb59420 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java @@ -29,6 +29,10 @@ import android.util.Slog; import android.view.IWindowManager; import android.widget.CompoundButton; +import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback; + +import java.util.ArrayList; + public class BrightnessController implements ToggleSlider.Listener { private static final String TAG = "StatusBar.BrightnessController"; @@ -39,6 +43,13 @@ public class BrightnessController implements ToggleSlider.Listener { private ToggleSlider mControl; private IPowerManager mPower; + private ArrayList<BrightnessStateChangeCallback> mChangeCallbacks = + new ArrayList<BrightnessStateChangeCallback>(); + + public interface BrightnessStateChangeCallback { + public void onBrightnessLevelChanged(); + } + public BrightnessController(Context context, ToggleSlider control) { mContext = context; mControl = control; @@ -79,6 +90,10 @@ public class BrightnessController implements ToggleSlider.Listener { control.setOnChangedListener(this); } + public void addStateChangedCallback(BrightnessStateChangeCallback cb) { + mChangeCallbacks.add(cb); + } + public void onChanged(ToggleSlider view, boolean tracking, boolean automatic, int value) { setMode(automatic ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC : Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); @@ -94,6 +109,10 @@ public class BrightnessController implements ToggleSlider.Listener { }); } } + + for (BrightnessStateChangeCallback cb : mChangeCallbacks) { + cb.onBrightnessLevelChanged(); + } } private void setMode(int mode) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java index 556ae59..ee82777 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java @@ -556,7 +556,8 @@ public class NetworkController extends BroadcastReceiver { } } mPhoneSignalIconId = iconList[iconLevel]; - mQSPhoneSignalIconId = TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[iconLevel]; + mQSPhoneSignalIconId = + TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[mInetCondition][iconLevel]; mContentDescriptionPhoneSignal = mContext.getString( AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[iconLevel]); mDataSignalIconId = TelephonyIcons.DATA_SIGNAL_STRENGTH[mInetCondition][iconLevel]; @@ -863,7 +864,7 @@ public class NetworkController extends BroadcastReceiver { private void updateWifiIcons() { if (mWifiConnected) { mWifiIconId = WifiIcons.WIFI_SIGNAL_STRENGTH[mInetCondition][mWifiLevel]; - mQSWifiIconId = WifiIcons.QS_WIFI_SIGNAL_STRENGTH[mWifiLevel]; + mQSWifiIconId = WifiIcons.QS_WIFI_SIGNAL_STRENGTH[mInetCondition][mWifiLevel]; mContentDescriptionWifi = mContext.getString( AccessibilityContentDescriptions.WIFI_CONNECTION_STRENGTH[mWifiLevel]); } else { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java index de9b218..3b953a0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java @@ -35,12 +35,17 @@ class TelephonyIcons { R.drawable.stat_sys_signal_4_fully } }; - static final int[] QS_TELEPHONY_SIGNAL_STRENGTH = { - R.drawable.ic_qs_signal_0, + static final int[][] QS_TELEPHONY_SIGNAL_STRENGTH = { + { R.drawable.ic_qs_signal_0, R.drawable.ic_qs_signal_1, R.drawable.ic_qs_signal_2, R.drawable.ic_qs_signal_3, - R.drawable.ic_qs_signal_4 + R.drawable.ic_qs_signal_4 }, + { R.drawable.ic_qs_signal_full_0, + R.drawable.ic_qs_signal_full_1, + R.drawable.ic_qs_signal_full_2, + R.drawable.ic_qs_signal_full_3, + R.drawable.ic_qs_signal_full_4 } }; static final int[][] TELEPHONY_SIGNAL_STRENGTH_ROAMING = { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java index f5d6484..8cc0338 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java @@ -32,12 +32,17 @@ class WifiIcons { R.drawable.stat_sys_wifi_signal_4_fully } }; - static final int[] QS_WIFI_SIGNAL_STRENGTH = { - R.drawable.ic_qs_wifi_not_connected, + static final int[][] QS_WIFI_SIGNAL_STRENGTH = { + { R.drawable.ic_qs_wifi_0, R.drawable.ic_qs_wifi_1, R.drawable.ic_qs_wifi_2, R.drawable.ic_qs_wifi_3, - R.drawable.ic_qs_wifi_4 + R.drawable.ic_qs_wifi_4 }, + { R.drawable.ic_qs_wifi_0, + R.drawable.ic_qs_wifi_full_1, + R.drawable.ic_qs_wifi_full_2, + R.drawable.ic_qs_wifi_full_3, + R.drawable.ic_qs_wifi_full_4 } }; static final int WIFI_LEVEL_COUNT = WIFI_SIGNAL_STRENGTH[0].length; diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSubdivisionLayout.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSubdivisionLayout.java index b7d94a9..1cd796c 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSubdivisionLayout.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSubdivisionLayout.java @@ -97,12 +97,14 @@ public class KeyguardSubdivisionLayout extends ViewGroup { leafs.clear(); getLeafs(leafs, 1); - // We find the first leaf who's depth is not + // If the tree is complete, then we start a new level at the rightmost side. double r = log2(leafs.size()); if (Math.ceil(r) == Math.floor(r)) { return leafs.get(leafs.size() - 1); } + // Tree is not complete, find the first leaf who's depth is less than the depth of + // the tree. int treeDepth = depth(); for (int i = leafs.size() - 1; i >= 0; i--) { BiTree n = leafs.get(i); diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java index f957753..70a6ffa 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java @@ -91,7 +91,14 @@ public class KeyguardWidgetFrame extends FrameLayout { mForegroundAlpha = (int) Math.round((r * 255)); mForegroundDrawable.setAlpha(mForegroundAlpha); + if (getLayerType() != LAYER_TYPE_HARDWARE) { + setLayerType(LAYER_TYPE_HARDWARE, null); + } invalidate(); + } else { + if (getLayerType() != LAYER_TYPE_NONE) { + setLayerType(LAYER_TYPE_NONE, null); + } } } } diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 989477f..db042b5 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -1794,7 +1794,7 @@ public final class ActivityManagerService extends ActivityManagerNative } private final void updateLruProcessInternalLocked(ProcessRecord app, - boolean oomAdj, boolean updateActivityTime, int bestPos) { + boolean updateActivityTime, int bestPos) { // put it on the LRU to keep track of when it should be exited. int lrui = mLruProcesses.indexOf(app); if (lrui >= 0) mLruProcesses.remove(lrui); @@ -1851,7 +1851,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (cr.binding != null && cr.binding.service != null && cr.binding.service.app != null && cr.binding.service.app.lruSeq != mLruSeq) { - updateLruProcessInternalLocked(cr.binding.service.app, false, + updateLruProcessInternalLocked(cr.binding.service.app, updateActivityTime, i+1); } } @@ -1859,21 +1859,21 @@ public final class ActivityManagerService extends ActivityManagerNative for (int j=app.conProviders.size()-1; j>=0; j--) { ContentProviderRecord cpr = app.conProviders.get(j).provider; if (cpr.proc != null && cpr.proc.lruSeq != mLruSeq) { - updateLruProcessInternalLocked(cpr.proc, false, + updateLruProcessInternalLocked(cpr.proc, updateActivityTime, i+1); } } - - //Slog.i(TAG, "Putting proc to front: " + app.processName); - if (oomAdj) { - updateOomAdjLocked(); - } } final void updateLruProcessLocked(ProcessRecord app, boolean oomAdj, boolean updateActivityTime) { mLruSeq++; - updateLruProcessInternalLocked(app, oomAdj, updateActivityTime, 0); + updateLruProcessInternalLocked(app, updateActivityTime, 0); + + //Slog.i(TAG, "Putting proc to front: " + app.processName); + if (oomAdj) { + updateOomAdjLocked(); + } } final ProcessRecord getProcessRecordLocked( @@ -4455,7 +4455,13 @@ public final class ActivityManagerService extends ActivityManagerNative enableScreenAfterBoot(); } } - + + public final void activityResumed(IBinder token) { + final long origId = Binder.clearCallingIdentity(); + mMainStack.activityResumed(token); + Binder.restoreCallingIdentity(origId); + } + public final void activityPaused(IBinder token) { final long origId = Binder.clearCallingIdentity(); mMainStack.activityPaused(token, false); diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index f72d318..29ee0bc 100755 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -52,7 +52,6 @@ import android.os.IBinder; import android.os.Message; import android.os.ParcelFileDescriptor; import android.os.PowerManager; -import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; import android.os.UserHandle; @@ -755,8 +754,6 @@ final class ActivityStack { completeResumeLocked(r); checkReadyForSleepLocked(); if (DEBUG_SAVED_STATE) Slog.i(TAG, "Launch completed; removing icicle of " + r.icicle); - r.icicle = null; - r.haveState = false; } else { // This activity is not starting in the resumed state... which // should look like we asked it to pause+stop (but remain visible), @@ -1010,7 +1007,21 @@ final class ActivityStack { resumeTopActivityLocked(null); } } - + + final void activityResumed(IBinder token) { + ActivityRecord r = null; + + synchronized (mService) { + int index = indexOfTokenLocked(token); + if (index >= 0) { + r = mHistory.get(index); + if (DEBUG_SAVED_STATE) Slog.i(TAG, "Resumed activity; dropping state of: " + r); + r.icicle = null; + r.haveState = false; + } + } + } + final void activityPaused(IBinder token, boolean timeout) { if (DEBUG_PAUSE) Slog.v( TAG, "Activity paused: token=" + token + ", timeout=" + timeout); @@ -1488,6 +1499,15 @@ final class ActivityStack { // can be resumed... if (mResumedActivity != null) { if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing"); + // At this point we want to put the upcoming activity's process + // at the top of the LRU list, since we know we will be needing it + // very soon and it would be a waste to let it get killed if it + // happens to be sitting towards the end. + if (next.app != null && next.app.thread != null) { + // No reason to do full oom adj update here; we'll let that + // happen whenever it needs to later. + mService.updateLruProcessLocked(next.app, false, true); + } startPausingLocked(userLeaving, false); return true; } @@ -1728,11 +1748,6 @@ final class ActivityStack { "resume-exception", true); return true; } - - // Didn't need to use the icicle, and it is now out of date. - if (DEBUG_SAVED_STATE) Slog.i(TAG, "Resumed activity; didn't need icicle of: " + next); - next.icicle = null; - next.haveState = false; next.stopped = false; } else { @@ -2578,7 +2593,6 @@ final class ActivityStack { mDismissKeyguardOnNextActivity = false; mService.mWindowManager.dismissKeyguard(); } - Slog.i(TAG, "DONE STARTING!"); return err; } diff --git a/services/java/com/android/server/display/WifiDisplayController.java b/services/java/com/android/server/display/WifiDisplayController.java index 141cbd7..3bc19a1 100644 --- a/services/java/com/android/server/display/WifiDisplayController.java +++ b/services/java/com/android/server/display/WifiDisplayController.java @@ -129,6 +129,9 @@ final class WifiDisplayController implements DumpUtils.Dump { // True if RTSP has connected. private boolean mRemoteDisplayConnected; + // True if the remote submix is enabled. + private boolean mRemoteSubmixOn; + public WifiDisplayController(Context context, Handler handler, Listener listener) { mContext = context; mHandler = handler; @@ -160,6 +163,7 @@ final class WifiDisplayController implements DumpUtils.Dump { pw.println("mRemoteDisplay=" + mRemoteDisplay); pw.println("mRemoteDisplayInterface=" + mRemoteDisplayInterface); pw.println("mRemoteDisplayConnected=" + mRemoteDisplayConnected); + pw.println("mRemoteSubmixOn=" + mRemoteSubmixOn); pw.println("mKnownWifiDisplayPeers: size=" + mKnownWifiDisplayPeers.size()); for (WifiP2pDevice device : mKnownWifiDisplayPeers) { @@ -390,16 +394,14 @@ final class WifiDisplayController implements DumpUtils.Dump { Slog.i(TAG, "Stopped listening for RTSP connection on " + mRemoteDisplayInterface + " from Wifi display: " + mConnectedDevice.deviceName); - if (mRemoteDisplayConnected) { - mAudioManager.setRemoteSubmixOn(false, REMOTE_SUBMIX_ADDRESS); - } - mRemoteDisplay.dispose(); mRemoteDisplay = null; mRemoteDisplayInterface = null; mRemoteDisplayConnected = false; mHandler.removeCallbacks(mRtspTimeout); + setRemoteSubmixOn(false); + mHandler.post(new Runnable() { @Override public void run() { @@ -483,6 +485,8 @@ final class WifiDisplayController implements DumpUtils.Dump { mConnectingDevice = mDesiredDevice; WifiP2pConfig config = new WifiP2pConfig(); config.deviceAddress = mConnectingDevice.deviceAddress; + // Helps with STA & P2P concurrency + config.groupOwnerIntent = WifiP2pConfig.MAX_GO_INTENT; final WifiDisplay display = createWifiDisplay(mConnectingDevice); mHandler.post(new Runnable() { @@ -527,6 +531,8 @@ final class WifiDisplayController implements DumpUtils.Dump { return; // done } + setRemoteSubmixOn(true); + final WifiP2pDevice oldDevice = mConnectedDevice; final int port = getPortNumber(mConnectedDevice); final String iface = addr.getHostAddress() + ":" + port; @@ -545,8 +551,6 @@ final class WifiDisplayController implements DumpUtils.Dump { mRemoteDisplayConnected = true; mHandler.removeCallbacks(mRtspTimeout); - mAudioManager.setRemoteSubmixOn(true, REMOTE_SUBMIX_ADDRESS); - final WifiDisplay display = createWifiDisplay(mConnectedDevice); mHandler.post(new Runnable() { @Override @@ -583,6 +587,13 @@ final class WifiDisplayController implements DumpUtils.Dump { } } + private void setRemoteSubmixOn(boolean on) { + if (mRemoteSubmixOn != on) { + mRemoteSubmixOn = on; + mAudioManager.setRemoteSubmixOn(on, REMOTE_SUBMIX_ADDRESS); + } + } + private void handleStateChanged(boolean enabled) { if (mWifiP2pEnabled != enabled) { mWifiP2pEnabled = enabled; diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index ce52d2b..536c612 100644 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -3535,8 +3535,8 @@ public class PackageManagerService extends IPackageManager.Stub { return DEX_OPT_DEFERRED; } else { Log.i(TAG, "Running dexopt on: " + pkg.applicationInfo.packageName); - ret = mInstaller.dexopt(path, pkg.applicationInfo.uid, - !isForwardLocked(pkg)); + final int sharedGid = UserHandle.getSharedAppGid(pkg.applicationInfo.uid); + ret = mInstaller.dexopt(path, sharedGid, !isForwardLocked(pkg)); pkg.mDidDexOpt = true; performed = true; } diff --git a/services/java/com/android/server/pm/UserManagerService.java b/services/java/com/android/server/pm/UserManagerService.java index a58c4ea..690d7c9 100644 --- a/services/java/com/android/server/pm/UserManagerService.java +++ b/services/java/com/android/server/pm/UserManagerService.java @@ -196,7 +196,7 @@ public class UserManagerService extends IUserManager.Stub { synchronized (mPackagesLock) { UserInfo info = mUsers.get(userId); if (info == null) return null; - ParcelFileDescriptor fd = updateIconBitmapLocked(info); + ParcelFileDescriptor fd = openIconBitmapLocked(info, true /* write */); if (fd != null) { writeUserLocked(info); } @@ -205,6 +205,17 @@ public class UserManagerService extends IUserManager.Stub { } @Override + public ParcelFileDescriptor getUserIcon(int userId) { + checkManageUsersPermission("read users"); + synchronized (mPackagesLock) { + UserInfo info = mUsers.get(userId); + if (info == null || info.iconPath == null) return null; + ParcelFileDescriptor fd = openIconBitmapLocked(info, false /* read */); + return fd; + } + } + + @Override public void setGuestEnabled(boolean enable) { checkManageUsersPermission("enable guest users"); synchronized (mPackagesLock) { @@ -278,7 +289,7 @@ public class UserManagerService extends IUserManager.Stub { } } - private ParcelFileDescriptor updateIconBitmapLocked(UserInfo info) { + private ParcelFileDescriptor openIconBitmapLocked(UserInfo info, boolean toWrite) { try { File dir = new File(mUsersDir, Integer.toString(info.id)); File file = new File(dir, USER_PHOTO_FILENAME); @@ -290,8 +301,10 @@ public class UserManagerService extends IUserManager.Stub { -1, -1); } ParcelFileDescriptor fd = ParcelFileDescriptor.open(file, - MODE_CREATE|MODE_READ_WRITE); - info.iconPath = file.getAbsolutePath(); + toWrite ? MODE_CREATE|MODE_READ_WRITE : MODE_READ_WRITE); + if (toWrite) { + info.iconPath = file.getAbsolutePath(); + } return fd; } catch (FileNotFoundException e) { Slog.w(LOG_TAG, "Error setting photo for user ", e); @@ -688,7 +701,7 @@ public class UserManagerService extends IUserManager.Stub { */ private int getNextAvailableIdLocked() { synchronized (mPackagesLock) { - int i = 0; + int i = 10; while (i < Integer.MAX_VALUE) { if (mUsers.indexOfKey(i) < 0) { break; diff --git a/services/java/com/android/server/updatable/ConfigUpdateInstallReceiver.java b/services/java/com/android/server/updatable/ConfigUpdateInstallReceiver.java index c1f45a8..a74a648 100644 --- a/services/java/com/android/server/updatable/ConfigUpdateInstallReceiver.java +++ b/services/java/com/android/server/updatable/ConfigUpdateInstallReceiver.java @@ -89,12 +89,15 @@ public class ConfigUpdateInstallReceiver extends BroadcastReceiver { // get the hash of the currently used value String currentHash = getCurrentHash(getCurrentContent()); if (!verifyVersion(currentVersion, altVersion)) { - Slog.e(TAG, "New version is not greater than current version, aborting!"); + EventLog.writeEvent(EventLogTags.CONFIG_INSTALL_FAILED, + "New version is not greater than current version"); } else if (!verifyPreviousHash(currentHash, altRequiredHash)) { - Slog.e(TAG, "Current hash did not match required value, aborting!"); + EventLog.writeEvent(EventLogTags.CONFIG_INSTALL_FAILED, + "Current hash did not match required value"); } else if (!verifySignature(altContent, altVersion, altRequiredHash, altSig, cert)) { - Slog.e(TAG, "Signature did not verify, aborting!"); + EventLog.writeEvent(EventLogTags.CONFIG_INSTALL_FAILED, + "Signature did not verify"); } else { // install the new content Slog.i(TAG, "Found new update, installing..."); @@ -103,8 +106,12 @@ public class ConfigUpdateInstallReceiver extends BroadcastReceiver { } } catch (Exception e) { Slog.e(TAG, "Could not update content!", e); - EventLog.writeEvent(EventLogTags.CONFIG_INSTALL_FAILED, - updateDir.toString()); + // keep the error message <= 100 chars + String errMsg = e.toString(); + if (errMsg.length() > 100) { + errMsg = errMsg.substring(0, 99); + } + EventLog.writeEvent(EventLogTags.CONFIG_INSTALL_FAILED, errMsg); } } }.start(); diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java index 4494058..0a4e6d3 100644 --- a/services/java/com/android/server/wm/WindowAnimator.java +++ b/services/java/com/android/server/wm/WindowAnimator.java @@ -101,6 +101,23 @@ public class WindowAnimator { boolean mInitialized = false; + // forceHiding states. + static final int KEYGUARD_NOT_SHOWN = 0; + static final int KEYGUARD_ANIMATING_IN = 1; + static final int KEYGUARD_SHOWN = 2; + static final int KEYGUARD_ANIMATING_OUT = 3; + int mForceHiding = KEYGUARD_NOT_SHOWN; + + private String forceHidingToString() { + switch (mForceHiding) { + case KEYGUARD_NOT_SHOWN: return "KEYGUARD_NOT_SHOWN"; + case KEYGUARD_ANIMATING_IN: return "KEYGUARD_ANIMATING_IN"; + case KEYGUARD_SHOWN: return "KEYGUARD_SHOWN"; + case KEYGUARD_ANIMATING_OUT:return "KEYGUARD_ANIMATING_OUT"; + default: return "KEYGUARD STATE UNKNOWN " + mForceHiding; + } + } + WindowAnimator(final WindowManagerService service) { mService = service; mContext = service.mContext; @@ -280,13 +297,7 @@ public class WindowAnimator { getDisplayContentsAnimatorLocked(displayId).mWinAnimators; ArrayList<WindowStateAnimator> unForceHiding = null; boolean wallpaperInUnForceHiding = false; - - // forceHiding states. - final int KEYGUARD_NOT_SHOWN = 0; - final int KEYGUARD_ANIMATING_IN = 1; - final int KEYGUARD_SHOWN = 2; - final int KEYGUARD_ANIMATING_OUT = 3; - int forceHiding = KEYGUARD_NOT_SHOWN; + mForceHiding = KEYGUARD_NOT_SHOWN; for (int i = winAnimatorList.size() - 1; i >= 0; i--) { WindowStateAnimator winAnimator = winAnimatorList.get(i); @@ -329,16 +340,16 @@ public class WindowAnimator { if (win.isReadyForDisplay()) { if (nowAnimating) { if (winAnimator.mAnimationIsEntrance) { - forceHiding = KEYGUARD_ANIMATING_IN; + mForceHiding = KEYGUARD_ANIMATING_IN; } else { - forceHiding = KEYGUARD_ANIMATING_OUT; + mForceHiding = KEYGUARD_ANIMATING_OUT; } } else { - forceHiding = KEYGUARD_SHOWN; + mForceHiding = KEYGUARD_SHOWN; } } if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, - "Force hide " + forceHiding + "Force hide " + mForceHiding + " hasSurface=" + win.mHasSurface + " policyVis=" + win.mPolicyVisibility + " destroying=" + win.mDestroying @@ -350,9 +361,9 @@ public class WindowAnimator { final boolean hideWhenLocked = (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0; final boolean changed; - if (((forceHiding == KEYGUARD_ANIMATING_IN) + if (((mForceHiding == KEYGUARD_ANIMATING_IN) && (!winAnimator.isAnimating() || hideWhenLocked)) - || ((forceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) { + || ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) { changed = win.hideLw(false, false); if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG, "Now policy hidden: " + win); @@ -708,10 +719,11 @@ public class WindowAnimator { if (dumpAll) { if (mWindowDetachedWallpaper != null) { pw.print(prefix); pw.print("mWindowDetachedWallpaper="); - pw.println(mWindowDetachedWallpaper); + pw.println(mWindowDetachedWallpaper); } pw.print(prefix); pw.print("mAnimTransactionSequence="); - pw.println(mAnimTransactionSequence); + pw.print(mAnimTransactionSequence); + pw.println(" mForceHiding=" + forceHidingToString()); for (int i = 0; i < mDisplayContentsAnimators.size(); i++) { pw.print(prefix); pw.print("DisplayContentsAnimator #"); pw.println(mDisplayContentsAnimators.keyAt(i)); diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java index a06ee3b..b62028e 100644 --- a/services/java/com/android/server/wm/WindowState.java +++ b/services/java/com/android/server/wm/WindowState.java @@ -1133,7 +1133,8 @@ final class WindowState implements WindowManagerPolicy.WindowState { pw.print(prefix); pw.print("mConfiguration="); pw.println(mConfiguration); } pw.print(prefix); pw.print("mHasSurface="); pw.print(mHasSurface); - pw.print(" mShownFrame="); mShownFrame.printShortString(pw); pw.println(); + pw.print(" mShownFrame="); mShownFrame.printShortString(pw); + pw.print(" isReadyForDisplay()="); pw.println(isReadyForDisplay()); if (dumpAll) { pw.print(prefix); pw.print("mFrame="); mFrame.printShortString(pw); pw.print(" last="); mLastFrame.printShortString(pw); diff --git a/tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java b/tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java index e39d53c..5e27ba7 100644 --- a/tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java +++ b/tests/MemoryUsage/src/com/android/tests/memoryusage/MemoryUsageTest.java @@ -72,6 +72,7 @@ public class MemoryUsageTest extends InstrumentationTestCase { try { processName = startApp(app); measureMemory(app, processName, results); + closeApp(); } catch (NameNotFoundException e) { Log.i(TAG, "Application " + app + " not found"); } @@ -139,13 +140,22 @@ public class MemoryUsageTest extends InstrumentationTestCase { return process; } + private void closeApp() { + Intent homeIntent = new Intent(Intent.ACTION_MAIN); + homeIntent.addCategory(Intent.CATEGORY_HOME); + homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); + getInstrumentation().getContext().startActivity(homeIntent); + sleep(3000); + } + private void measureMemory(String appName, String processName, Bundle results) { List<Integer> pssData = new ArrayList<Integer>(); int pss = 0; int iteration = 0; while (iteration < MAX_ITERATIONS) { - sleep(); + sleep(SLEEP_TIME); pss = getPss(processName); Log.i(TAG, appName + "=" + pss); if (pss < 0) { @@ -184,9 +194,9 @@ public class MemoryUsageTest extends InstrumentationTestCase { return (diff1 + diff2) < THRESHOLD; } - private void sleep() { + private void sleep(int time) { try { - Thread.sleep(SLEEP_TIME); + Thread.sleep(time); } catch (InterruptedException e) { // ignore } diff --git a/tools/aapt/Bundle.h b/tools/aapt/Bundle.h index a5aa0b5..fde3bd6 100644 --- a/tools/aapt/Bundle.h +++ b/tools/aapt/Bundle.h @@ -61,7 +61,8 @@ public: mMinSdkVersion(NULL), mTargetSdkVersion(NULL), mMaxSdkVersion(NULL), mVersionCode(NULL), mVersionName(NULL), mCustomPackage(NULL), mExtraPackages(NULL), mMaxResVersion(NULL), mDebugMode(false), mNonConstantId(false), mProduct(NULL), - mUseCrunchCache(false), mArgc(0), mArgv(NULL) + mUseCrunchCache(false), mErrorOnFailedInsert(false), mOutputTextSymbols(NULL), + mArgc(0), mArgv(NULL) {} ~Bundle(void) {} @@ -110,6 +111,8 @@ public: void setAutoAddOverlay(bool val) { mAutoAddOverlay = val; } bool getGenDependencies() { return mGenDependencies; } void setGenDependencies(bool val) { mGenDependencies = val; } + bool getErrorOnFailedInsert() { return mErrorOnFailedInsert; } + void setErrorOnFailedInsert(bool val) { mErrorOnFailedInsert = val; } bool getUTF16StringsOption() { return mWantUTF16 || !isMinSdkAtLeast(SDK_FROYO); @@ -171,6 +174,8 @@ public: void setProduct(const char * val) { mProduct = val; } void setUseCrunchCache(bool val) { mUseCrunchCache = val; } bool getUseCrunchCache() const { return mUseCrunchCache; } + const char* getOutputTextSymbols() const { return mOutputTextSymbols; } + void setOutputTextSymbols(const char* val) { mOutputTextSymbols = val; } /* * Set and get the file specification. @@ -276,6 +281,8 @@ private: bool mNonConstantId; const char* mProduct; bool mUseCrunchCache; + bool mErrorOnFailedInsert; + const char* mOutputTextSymbols; /* file specification */ int mArgc; diff --git a/tools/aapt/Main.cpp b/tools/aapt/Main.cpp index 9570c66..f398de0 100644 --- a/tools/aapt/Main.cpp +++ b/tools/aapt/Main.cpp @@ -69,7 +69,8 @@ void usage(void) " [-F apk-file] [-J R-file-dir] \\\n" " [--product product1,product2,...] \\\n" " [-c CONFIGS] [--preferred-configurations CONFIGS] \\\n" - " [raw-files-dir [raw-files-dir] ...]\n" + " [raw-files-dir [raw-files-dir] ...] \\\n" + " [--output-text-symbols DIR]\n" "\n" " Package the android resources. It will read assets and resources that are\n" " supplied with the -M -A -S or raw-files-dir arguments. The -J -P -F and -R\n" @@ -177,6 +178,14 @@ void usage(void) " Make the resources ID non constant. This is required to make an R java class\n" " that does not contain the final value but is used to make reusable compiled\n" " libraries that need to access resources.\n" + " --error-on-failed-insert\n" + " Forces aapt to return an error if it fails to insert values into the manifest\n" + " with --debug-mode, --min-sdk-version, --target-sdk-version --version-code\n" + " and --version-name.\n" + " Insertion typically fails if the manifest already defines the attribute.\n" + " --output-text-symbols\n" + " Generates a text file containing the resource symbols of the R class in the\n" + " specified folder.\n" " --ignore-assets\n" " Assets to be ignored. Default pattern is:\n" " %s\n", @@ -542,6 +551,17 @@ int main(int argc, char* const argv[]) bundle.setInstrumentationPackageNameOverride(argv[0]); } else if (strcmp(cp, "-auto-add-overlay") == 0) { bundle.setAutoAddOverlay(true); + } else if (strcmp(cp, "-error-on-failed-insert") == 0) { + bundle.setErrorOnFailedInsert(true); + } else if (strcmp(cp, "-output-text-symbols") == 0) { + argc--; + argv++; + if (!argc) { + fprintf(stderr, "ERROR: No argument supplied for '-output-text-symbols' option\n"); + wantUsage = true; + goto bail; + } + bundle.setOutputTextSymbols(argv[0]); } else if (strcmp(cp, "-product") == 0) { argc--; argv++; diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp index ee076e6..9c2e1b9 100644 --- a/tools/aapt/Resource.cpp +++ b/tools/aapt/Resource.cpp @@ -673,24 +673,40 @@ static bool applyFileOverlay(Bundle *bundle, return true; } -void addTagAttribute(const sp<XMLNode>& node, const char* ns8, - const char* attr8, const char* value) +/* + * Inserts an attribute in a given node, only if the attribute does not + * exist. + * If errorOnFailedInsert is true, and the attribute already exists, returns false. + * Returns true otherwise, even if the attribute already exists. + */ +bool addTagAttribute(const sp<XMLNode>& node, const char* ns8, + const char* attr8, const char* value, bool errorOnFailedInsert) { if (value == NULL) { - return; + return true; } - + const String16 ns(ns8); const String16 attr(attr8); - + if (node->getAttribute(ns, attr) != NULL) { + if (errorOnFailedInsert) { + fprintf(stderr, "Error: AndroidManifest.xml already defines %s (in %s);" + " cannot insert new value %s.\n", + String8(attr).string(), String8(ns).string(), value); + return false; + } + fprintf(stderr, "Warning: AndroidManifest.xml already defines %s (in %s);" " using existing value in manifest.\n", String8(attr).string(), String8(ns).string()); - return; + + // don't stop the build. + return true; } node->addAttribute(ns, attr, String16(value)); + return true; } static void fullyQualifyClassName(const String8& package, sp<XMLNode> node, @@ -728,11 +744,17 @@ status_t massageManifest(Bundle* bundle, sp<XMLNode> root) fprintf(stderr, "No <manifest> tag.\n"); return UNKNOWN_ERROR; } - - addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionCode", - bundle->getVersionCode()); - addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionName", - bundle->getVersionName()); + + bool errorOnFailedInsert = bundle->getErrorOnFailedInsert(); + + if (!addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionCode", + bundle->getVersionCode(), errorOnFailedInsert)) { + return UNKNOWN_ERROR; + } + if (!addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionName", + bundle->getVersionName(), errorOnFailedInsert)) { + return UNKNOWN_ERROR; + } if (bundle->getMinSdkVersion() != NULL || bundle->getTargetSdkVersion() != NULL @@ -743,18 +765,27 @@ status_t massageManifest(Bundle* bundle, sp<XMLNode> root) root->insertChildAt(vers, 0); } - addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "minSdkVersion", - bundle->getMinSdkVersion()); - addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "targetSdkVersion", - bundle->getTargetSdkVersion()); - addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "maxSdkVersion", - bundle->getMaxSdkVersion()); + if (!addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "minSdkVersion", + bundle->getMinSdkVersion(), errorOnFailedInsert)) { + return UNKNOWN_ERROR; + } + if (!addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "targetSdkVersion", + bundle->getTargetSdkVersion(), errorOnFailedInsert)) { + return UNKNOWN_ERROR; + } + if (!addTagAttribute(vers, RESOURCES_ANDROID_NAMESPACE, "maxSdkVersion", + bundle->getMaxSdkVersion(), errorOnFailedInsert)) { + return UNKNOWN_ERROR; + } } if (bundle->getDebugMode()) { sp<XMLNode> application = root->getChildElement(String16(), String16("application")); if (application != NULL) { - addTagAttribute(application, RESOURCES_ANDROID_NAMESPACE, "debuggable", "true"); + if (!addTagAttribute(application, RESOURCES_ANDROID_NAMESPACE, "debuggable", "true", + errorOnFailedInsert)) { + return UNKNOWN_ERROR; + } } } @@ -1821,6 +1852,110 @@ static status_t writeLayoutClasses( return hasErrors ? UNKNOWN_ERROR : NO_ERROR; } +static status_t writeTextLayoutClasses( + FILE* fp, const sp<AaptAssets>& assets, + const sp<AaptSymbols>& symbols, bool includePrivate) +{ + String16 attr16("attr"); + String16 package16(assets->getPackage()); + + bool hasErrors = false; + + size_t i; + size_t N = symbols->getNestedSymbols().size(); + for (i=0; i<N; i++) { + sp<AaptSymbols> nsymbols = symbols->getNestedSymbols().valueAt(i); + String16 nclassName16(symbols->getNestedSymbols().keyAt(i)); + String8 realClassName(nclassName16); + if (fixupSymbol(&nclassName16) != NO_ERROR) { + hasErrors = true; + } + String8 nclassName(nclassName16); + + SortedVector<uint32_t> idents; + Vector<uint32_t> origOrder; + Vector<bool> publicFlags; + + size_t a; + size_t NA = nsymbols->getSymbols().size(); + for (a=0; a<NA; a++) { + const AaptSymbolEntry& sym(nsymbols->getSymbols().valueAt(a)); + int32_t code = sym.typeCode == AaptSymbolEntry::TYPE_INT32 + ? sym.int32Val : 0; + bool isPublic = true; + if (code == 0) { + String16 name16(sym.name); + uint32_t typeSpecFlags; + code = assets->getIncludedResources().identifierForName( + name16.string(), name16.size(), + attr16.string(), attr16.size(), + package16.string(), package16.size(), &typeSpecFlags); + if (code == 0) { + fprintf(stderr, "ERROR: In <declare-styleable> %s, unable to find attribute %s\n", + nclassName.string(), sym.name.string()); + hasErrors = true; + } + isPublic = (typeSpecFlags&ResTable_typeSpec::SPEC_PUBLIC) != 0; + } + idents.add(code); + origOrder.add(code); + publicFlags.add(isPublic); + } + + NA = idents.size(); + + fprintf(fp, "int[] styleable %s {", nclassName.string()); + + for (a=0; a<NA; a++) { + if (a != 0) { + fprintf(fp, ","); + } + fprintf(fp, " 0x%08x", idents[a]); + } + + fprintf(fp, " }\n"); + + for (a=0; a<NA; a++) { + ssize_t pos = idents.indexOf(origOrder.itemAt(a)); + if (pos >= 0) { + const AaptSymbolEntry& sym = nsymbols->getSymbols().valueAt(a); + if (!publicFlags.itemAt(a) && !includePrivate) { + continue; + } + String8 name8(sym.name); + String16 comment(sym.comment); + String16 typeComment; + if (comment.size() <= 0) { + comment = getAttributeComment(assets, name8, &typeComment); + } else { + getAttributeComment(assets, name8, &typeComment); + } + String16 name(name8); + if (fixupSymbol(&name) != NO_ERROR) { + hasErrors = true; + } + + uint32_t typeSpecFlags = 0; + String16 name16(sym.name); + assets->getIncludedResources().identifierForName( + name16.string(), name16.size(), + attr16.string(), attr16.size(), + package16.string(), package16.size(), &typeSpecFlags); + //printf("%s:%s/%s: 0x%08x\n", String8(package16).string(), + // String8(attr16).string(), String8(name16).string(), typeSpecFlags); + const bool pub = (typeSpecFlags&ResTable_typeSpec::SPEC_PUBLIC) != 0; + + fprintf(fp, + "int styleable.%s_%s %d\n", + nclassName.string(), + String8(name).string(), (int)pos); + } + } + } + + return hasErrors ? UNKNOWN_ERROR : NO_ERROR; +} + static status_t writeSymbolClass( FILE* fp, const sp<AaptAssets>& assets, bool includePrivate, const sp<AaptSymbols>& symbols, const String8& className, int indent, @@ -1848,7 +1983,6 @@ static status_t writeSymbolClass( continue; } String16 name(sym.name); - String8 realName(name); if (fixupSymbol(&name) != NO_ERROR) { return UNKNOWN_ERROR; } @@ -1960,6 +2094,51 @@ static status_t writeSymbolClass( return NO_ERROR; } +static status_t writeTextSymbolClass( + FILE* fp, const sp<AaptAssets>& assets, bool includePrivate, + const sp<AaptSymbols>& symbols, const String8& className) +{ + size_t i; + status_t err = NO_ERROR; + + size_t N = symbols->getSymbols().size(); + for (i=0; i<N; i++) { + const AaptSymbolEntry& sym = symbols->getSymbols().valueAt(i); + if (sym.typeCode != AaptSymbolEntry::TYPE_INT32) { + continue; + } + + if (!assets->isJavaSymbol(sym, includePrivate)) { + continue; + } + + String16 name(sym.name); + if (fixupSymbol(&name) != NO_ERROR) { + return UNKNOWN_ERROR; + } + + fprintf(fp, "int %s %s 0x%08x\n", + className.string(), + String8(name).string(), (int)sym.int32Val); + } + + N = symbols->getNestedSymbols().size(); + for (i=0; i<N; i++) { + sp<AaptSymbols> nsymbols = symbols->getNestedSymbols().valueAt(i); + String8 nclassName(symbols->getNestedSymbols().keyAt(i)); + if (nclassName == "styleable") { + err = writeTextLayoutClasses(fp, assets, nsymbols, includePrivate); + } else { + err = writeTextSymbolClass(fp, assets, includePrivate, nsymbols, nclassName); + } + if (err != NO_ERROR) { + return err; + } + } + + return NO_ERROR; +} + status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets, const String8& package, bool includePrivate) { @@ -1967,11 +2146,15 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets, return NO_ERROR; } + const char* textSymbolsDest = bundle->getOutputTextSymbols(); + + String8 R("R"); const size_t N = assets->getSymbols().size(); for (size_t i=0; i<N; i++) { sp<AaptSymbols> symbols = assets->getSymbols().valueAt(i); String8 className(assets->getSymbols().keyAt(i)); String8 dest(bundle->getRClassDir()); + if (bundle->getMakePackageDirs()) { String8 pkg(package); const char* last = pkg.string(); @@ -2003,14 +2186,14 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets, } fprintf(fp, - "/* AUTO-GENERATED FILE. DO NOT MODIFY.\n" - " *\n" - " * This class was automatically generated by the\n" - " * aapt tool from the resource data it found. It\n" - " * should not be modified by hand.\n" - " */\n" - "\n" - "package %s;\n\n", package.string()); + "/* AUTO-GENERATED FILE. DO NOT MODIFY.\n" + " *\n" + " * This class was automatically generated by the\n" + " * aapt tool from the resource data it found. It\n" + " * should not be modified by hand.\n" + " */\n" + "\n" + "package %s;\n\n", package.string()); status_t err = writeSymbolClass(fp, assets, includePrivate, symbols, className, 0, bundle->getNonConstantId()); @@ -2019,14 +2202,37 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets, } fclose(fp); + if (textSymbolsDest != NULL && R == className) { + String8 textDest(textSymbolsDest); + textDest.appendPath(className); + textDest.append(".txt"); + + FILE* fp = fopen(textDest.string(), "w+"); + if (fp == NULL) { + fprintf(stderr, "ERROR: Unable to open text symbol file %s: %s\n", + textDest.string(), strerror(errno)); + return UNKNOWN_ERROR; + } + if (bundle->getVerbose()) { + printf(" Writing text symbols for class %s.\n", className.string()); + } + + status_t err = writeTextSymbolClass(fp, assets, includePrivate, symbols, + className); + if (err != NO_ERROR) { + return err; + } + fclose(fp); + } + // If we were asked to generate a dependency file, we'll go ahead and add this R.java // as a target in the dependency file right next to it. - if (bundle->getGenDependencies()) { + if (bundle->getGenDependencies() && R == className) { // Add this R.java to the dependency file String8 dependencyFile(bundle->getRClassDir()); dependencyFile.appendPath("R.java.d"); - fp = fopen(dependencyFile.string(), "a"); + FILE *fp = fopen(dependencyFile.string(), "a"); fprintf(fp,"%s \\\n", dest.string()); fclose(fp); } @@ -2036,7 +2242,6 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets, } - class ProguardKeepSet { public: diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java index b3260b1..9fe1c60 100644 --- a/wifi/java/android/net/wifi/WifiStateMachine.java +++ b/wifi/java/android/net/wifi/WifiStateMachine.java @@ -1771,15 +1771,18 @@ public class WifiStateMachine extends StateMachine { } /* Disable power save and suspend optimizations during DHCP */ - mWifiNative.setPowerSave(false); + // Note: The order here is important for now. Brcm driver changes + // power settings when we control suspend mode optimizations. + // TODO: Remove this comment when the driver is fixed. setSuspendOptimizationsNative(SUSPEND_DUE_TO_DHCP, false); + mWifiNative.setPowerSave(false); } void handlePostDhcpSetup() { /* Restore power save and suspend optimizations */ - mWifiNative.setPowerSave(true); setSuspendOptimizationsNative(SUSPEND_DUE_TO_DHCP, true); + mWifiNative.setPowerSave(true); // Set the coexistence mode back to its default value mWifiNative.setBluetoothCoexistenceMode( @@ -2710,8 +2713,6 @@ public class WifiStateMachine extends StateMachine { mWifiNative.stopFilteringMulticastV4Packets(); } - mWifiNative.setPowerSave(true); - if (mIsScanMode) { mWifiNative.setScanResultHandling(SCAN_ONLY_MODE); mWifiNative.disconnect(); @@ -2736,6 +2737,7 @@ public class WifiStateMachine extends StateMachine { mWifiNative.setSuspendOptimizations(mSuspendOptNeedsDisabled == 0 && mUserWantsSuspendOpt.get()); } + mWifiNative.setPowerSave(true); if (mP2pSupported) mWifiP2pChannel.sendMessage(WifiStateMachine.CMD_ENABLE_P2P); } diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java b/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java index 100e062..213fab9 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java @@ -37,6 +37,9 @@ public class WifiP2pConfig implements Parcelable { */ public WpsInfo wps; + /** @hide */ + public static final int MAX_GO_INTENT = 15; + /** * This is an integer value between 0 and 15 where 0 indicates the least * inclination to be a group owner and 15 indicates the highest inclination diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pService.java b/wifi/java/android/net/wifi/p2p/WifiP2pService.java index edd1dac..a42470f 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pService.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pService.java @@ -135,7 +135,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { private static final int DISCOVER_TIMEOUT_S = 120; /* Idle time after a peer is gone when the group is torn down */ - private static final int GROUP_IDLE_TIME_S = 5; + private static final int GROUP_IDLE_TIME_S = 25; /** * Delay between restarts upon failure to setup connection with supplicant |