diff options
645 files changed, 5323 insertions, 1393 deletions
diff --git a/api/current.txt b/api/current.txt index dd846fc..6e89e8b 100644 --- a/api/current.txt +++ b/api/current.txt @@ -465,6 +465,7 @@ package android { field public static final int contentInsetLeft = 16843863; // 0x1010457 field public static final int contentInsetRight = 16843864; // 0x1010458 field public static final int contentInsetStart = 16843861; // 0x1010455 + field public static final int contentRatingSystemXml = 16843957; // 0x10104b5 field public static final int controlX1 = 16843798; // 0x1010416 field public static final int controlX2 = 16843800; // 0x1010418 field public static final int controlY1 = 16843799; // 0x1010417 @@ -1435,8 +1436,12 @@ package android { field public static final int windowNoDisplay = 16843294; // 0x101021e field public static final int windowNoTitle = 16842838; // 0x1010056 field public static final int windowOverscan = 16843727; // 0x10103cf + field public static final int windowReenterTransition = 16843954; // 0x10104b2 + field public static final int windowReturnTransition = 16843953; // 0x10104b1 field public static final int windowSharedElementEnterTransition = 16843835; // 0x101043b field public static final int windowSharedElementExitTransition = 16843836; // 0x101043c + field public static final int windowSharedElementReenterTransition = 16843956; // 0x10104b4 + field public static final int windowSharedElementReturnTransition = 16843955; // 0x10104b3 field public static final int windowShowAnimation = 16842934; // 0x10100b6 field public static final int windowShowWallpaper = 16843410; // 0x1010292 field public static final int windowSoftInputMode = 16843307; // 0x101022b @@ -4692,6 +4697,7 @@ package android.app { field public android.os.Bundle extras; field public int flags; field public android.app.PendingIntent fullScreenIntent; + field public android.widget.RemoteViews headsUpContentView; field public int icon; field public int iconLevel; field public android.graphics.Bitmap largeIcon; @@ -8515,9 +8521,11 @@ package android.content.pm { method public android.graphics.Bitmap getAppIcon(); method public java.lang.CharSequence getAppLabel(); method public java.lang.String getAppPackageName(); + method public android.content.Intent getDetailsIntent(); method public java.lang.String getInstallerPackageName(); method public float getProgress(); method public int getSessionId(); + method public boolean isOpen(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; } @@ -8531,7 +8539,6 @@ package android.content.pm { method public void setInstallLocation(int); method public void setOriginatingUri(android.net.Uri); method public void setReferrerUri(android.net.Uri); - method public void setSignatures(android.content.pm.Signature[]); method public void setSize(long); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; @@ -8647,6 +8654,8 @@ package android.content.pm { method public android.content.pm.PackageInstaller.Session openSession(int); method public void removeSessionCallback(android.content.pm.PackageInstaller.SessionCallback); method public void uninstall(java.lang.String, android.content.pm.PackageInstaller.UninstallCallback); + field public static final java.lang.String ACTION_SESSION_DETAILS = "android.content.pm.action.SESSION_DETAILS"; + field public static final java.lang.String EXTRA_SESSION_ID = "android.content.pm.extra.SESSION_ID"; } public static abstract class PackageInstaller.CommitCallback { @@ -8666,14 +8675,18 @@ package android.content.pm { method public void close(); method public void commit(android.content.pm.PackageInstaller.CommitCallback); method public void fsync(java.io.OutputStream) throws java.io.IOException; + method public java.lang.String[] list(); + method public java.io.InputStream openRead(java.lang.String) throws java.io.IOException; method public java.io.OutputStream openWrite(java.lang.String, long, long) throws java.io.IOException; method public void setProgress(float); } public static abstract class PackageInstaller.SessionCallback { ctor public PackageInstaller.SessionCallback(); + method public abstract void onClosed(int); method public abstract void onCreated(int); method public abstract void onFinished(int, boolean); + method public abstract void onOpened(int); method public abstract void onProgressChanged(int, float); } @@ -16835,28 +16848,14 @@ package android.media.session { package android.media.tv { public final class TvContentRating { - ctor public TvContentRating(java.lang.String); - ctor public TvContentRating(java.lang.String, java.lang.String[]); + method public static android.media.tv.TvContentRating createRating(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String...); method public java.lang.String flattenToString(); + method public java.lang.String getCountry(); + method public java.lang.String getDomain(); method public java.lang.String getMainRating(); + method public java.lang.String getRatingSystem(); method public java.util.List<java.lang.String> getSubRatings(); method public static android.media.tv.TvContentRating unflattenFromString(java.lang.String); - field public static final java.lang.String RATING_KR_12 = "RATING_KR_12"; - field public static final java.lang.String RATING_KR_15 = "RATING_KR_15"; - field public static final java.lang.String RATING_KR_19 = "RATING_KR_19"; - field public static final java.lang.String RATING_KR_7 = "RATING_KR_7"; - field public static final java.lang.String RATING_KR_ALL = "RATING_KR_ALL"; - field public static final java.lang.String RATING_US_TV_14 = "RATING_US_TV_14"; - field public static final java.lang.String RATING_US_TV_G = "RATING_US_TV_G"; - field public static final java.lang.String RATING_US_TV_MA = "RATING_US_TV_MA"; - field public static final java.lang.String RATING_US_TV_PG = "RATING_US_TV_PG"; - field public static final java.lang.String RATING_US_TV_Y = "RATING_US_TV_Y"; - field public static final java.lang.String RATING_US_TV_Y7 = "RATING_US_TV_Y7"; - field public static final java.lang.String SUBRATING_US_D = "SUBRATING_US_D"; - field public static final java.lang.String SUBRATING_US_FV = "SUBRATING_US_FV"; - field public static final java.lang.String SUBRATING_US_L = "SUBRATING_US_L"; - field public static final java.lang.String SUBRATING_US_S = "SUBRATING_US_S"; - field public static final java.lang.String SUBRATING_US_V = "SUBRATING_US_V"; } public final class TvContract { @@ -27505,7 +27504,6 @@ package android.service.voice { field public static final int RECOGNITION_MODE_USER_IDENTIFICATION = 2; // 0x2 field public static final int RECOGNITION_MODE_VOICE_TRIGGER = 1; // 0x1 field public static final int STATE_HARDWARE_UNAVAILABLE = -2; // 0xfffffffe - field public static final int STATE_INVALID = -3; // 0xfffffffd field public static final int STATE_KEYPHRASE_ENROLLED = 2; // 0x2 field public static final int STATE_KEYPHRASE_UNENROLLED = 1; // 0x1 field public static final int STATE_KEYPHRASE_UNSUPPORTED = -1; // 0xffffffff @@ -31751,7 +31749,7 @@ package android.text.style { field public static final int WEEKDAY_WEDNESDAY = 4; // 0x4 } - public static abstract class TtsSpan.Builder { + public static class TtsSpan.Builder { ctor public TtsSpan.Builder(java.lang.String); method public android.text.style.TtsSpan build(); method public C setIntArgument(java.lang.String, int); @@ -35322,8 +35320,12 @@ package android.view { method protected final int getLocalFeatures(); method public android.media.session.MediaController getMediaController(); method public abstract int getNavigationBarColor(); + method public android.transition.Transition getReenterTransition(); + method public android.transition.Transition getReturnTransition(); method public android.transition.Transition getSharedElementEnterTransition(); method public android.transition.Transition getSharedElementExitTransition(); + method public android.transition.Transition getSharedElementReenterTransition(); + method public android.transition.Transition getSharedElementReturnTransition(); method public abstract int getStatusBarColor(); method public long getTransitionBackgroundFadeDuration(); method public android.transition.TransitionManager getTransitionManager(); @@ -35379,8 +35381,12 @@ package android.view { method public void setLogo(int); method public void setMediaController(android.media.session.MediaController); method public abstract void setNavigationBarColor(int); + method public void setReenterTransition(android.transition.Transition); + method public void setReturnTransition(android.transition.Transition); method public void setSharedElementEnterTransition(android.transition.Transition); method public void setSharedElementExitTransition(android.transition.Transition); + method public void setSharedElementReenterTransition(android.transition.Transition); + method public void setSharedElementReturnTransition(android.transition.Transition); method public void setSoftInputMode(int); method public abstract void setStatusBarColor(int); method public abstract void setTitle(java.lang.CharSequence); diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java index bc16800..1f25dd0 100644 --- a/cmds/pm/src/com/android/commands/pm/Pm.java +++ b/cmds/pm/src/com/android/commands/pm/Pm.java @@ -59,7 +59,6 @@ import com.android.internal.util.ArrayUtils; import com.android.internal.util.SizedInputStream; import libcore.io.IoUtils; -import libcore.io.Streams; import java.io.File; import java.io.FileDescriptor; @@ -1068,6 +1067,8 @@ public final class Pm { } } + final InstallSessionInfo info = mInstaller.getSessionInfo(sessionId); + PackageInstaller.Session session = null; InputStream in = null; OutputStream out = null; @@ -1081,16 +1082,21 @@ public final class Pm { } out = session.openWrite(splitName, 0, sizeBytes); - final int n = Streams.copy(in, out); - session.fsync(out); + int total = 0; + byte[] buffer = new byte[65536]; + int c; + while ((c = in.read(buffer)) != -1) { + total += c; + out.write(buffer, 0, c); - final InstallSessionInfo info = mInstaller.getSessionInfo(sessionId); - if (info.sizeBytes > 0) { - final float fraction = ((float) n / (float) info.sizeBytes); - session.addProgress(fraction); + if (info.sizeBytes > 0) { + final float fraction = ((float) c / (float) info.sizeBytes); + session.addProgress(fraction); + } } + session.fsync(out); - System.out.println("Success: streamed " + n + " bytes"); + System.out.println("Success: streamed " + total + " bytes"); } finally { IoUtils.closeQuietly(out); IoUtils.closeQuietly(in); diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index 5262a5f..2a17fa6 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -25,4 +25,6 @@ public abstract class ActivityManagerInternal { // Called by the power manager. public abstract void goingToSleep(); public abstract void wakingUp(); + public abstract int startIsolatedProcess(String entryPoint, String[] mainArgs, + String processName, String abiOverride, int uid, Runnable crashHandler); } diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java index 1326064..b5d362d 100644 --- a/core/java/android/app/EnterTransitionCoordinator.java +++ b/core/java/android/app/EnterTransitionCoordinator.java @@ -256,7 +256,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { @Override protected Transition getViewsTransition() { if (mIsReturning) { - return getWindow().getExitTransition(); + return getWindow().getReenterTransition(); } else { return getWindow().getEnterTransition(); } @@ -264,7 +264,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { protected Transition getSharedElementTransition() { if (mIsReturning) { - return getWindow().getSharedElementExitTransition(); + return getWindow().getSharedElementReenterTransition(); } else { return getWindow().getSharedElementEnterTransition(); } diff --git a/core/java/android/app/ExitTransitionCoordinator.java b/core/java/android/app/ExitTransitionCoordinator.java index 2ce6018..b3fdcc7 100644 --- a/core/java/android/app/ExitTransitionCoordinator.java +++ b/core/java/android/app/ExitTransitionCoordinator.java @@ -395,7 +395,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { @Override protected Transition getViewsTransition() { if (mIsReturning) { - return getWindow().getEnterTransition(); + return getWindow().getReturnTransition(); } else { return getWindow().getExitTransition(); } @@ -403,7 +403,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { protected Transition getSharedElementTransition() { if (mIsReturning) { - return getWindow().getSharedElementEnterTransition(); + return getWindow().getSharedElementReturnTransition(); } else { return getWindow().getSharedElementExitTransition(); } diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 5347f03..772e132 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -454,7 +454,7 @@ public interface IActivityManager extends IInterface { * Private non-Binder interfaces */ /* package */ boolean testIsSystemReady(); - + /** Information you can retrieve about a particular application. */ public static class ContentProviderHolder implements Parcelable { public final ProviderInfo info; diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index c7fdbed..acf7ade 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -247,7 +247,6 @@ public class Notification implements Parcelable /** - * @hide * A medium-format version of {@link #contentView}, providing the Notification an * opportunity to add action buttons to contentView. At its discretion, the system UI may * choose to show this as a heads-up notification, which will pop up so the user can see diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 8be52a2..e28f00c 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -449,9 +449,17 @@ public class DevicePolicyManager { * active (enabled) in the system. */ public boolean isAdminActive(ComponentName who) { + return isAdminActiveAsUser(who, UserHandle.myUserId()); + } + + /** + * @see #isAdminActive(ComponentName) + * @hide + */ + public boolean isAdminActiveAsUser(ComponentName who, int userId) { if (mService != null) { try { - return mService.isAdminActive(who, UserHandle.myUserId()); + return mService.isAdminActive(who, userId); } catch (RemoteException e) { Log.w(TAG, "Failed talking with device policy service", e); } @@ -465,9 +473,17 @@ public class DevicePolicyManager { * returned. */ public List<ComponentName> getActiveAdmins() { + return getActiveAdminsAsUser(UserHandle.myUserId()); + } + + /** + * @see #getActiveAdmins() + * @hide + */ + public List<ComponentName> getActiveAdminsAsUser(int userId) { if (mService != null) { try { - return mService.getActiveAdmins(UserHandle.myUserId()); + return mService.getActiveAdmins(userId); } catch (RemoteException e) { Log.w(TAG, "Failed talking with device policy service", e); } @@ -2314,9 +2330,17 @@ public class DevicePolicyManager { * @throws IllegalArgumentException if the userId is invalid. */ public ComponentName getProfileOwner() throws IllegalArgumentException { + return getProfileOwnerAsUser(Process.myUserHandle().getIdentifier()); + } + + /** + * @see #getProfileOwner() + * @hide + */ + public ComponentName getProfileOwnerAsUser(final int userId) throws IllegalArgumentException { if (mService != null) { try { - return mService.getProfileOwner(Process.myUserHandle().getIdentifier()); + return mService.getProfileOwner(userId); } catch (RemoteException re) { Log.w(TAG, "Failed to get profile owner"); throw new IllegalArgumentException( @@ -2856,7 +2880,7 @@ public class DevicePolicyManager { * @see #setAccountManagementDisabled */ public String[] getAccountTypesWithManagementDisabled() { - return getAccountTypesWithManagementDisabledAsUser(UserHandle.getCallingUserId()); + return getAccountTypesWithManagementDisabledAsUser(UserHandle.myUserId()); } /** diff --git a/core/java/android/content/pm/IPackageInstallerCallback.aidl b/core/java/android/content/pm/IPackageInstallerCallback.aidl index a31ae54..39ae1a0 100644 --- a/core/java/android/content/pm/IPackageInstallerCallback.aidl +++ b/core/java/android/content/pm/IPackageInstallerCallback.aidl @@ -19,6 +19,8 @@ package android.content.pm; /** {@hide} */ oneway interface IPackageInstallerCallback { void onSessionCreated(int sessionId); + void onSessionOpened(int sessionId); void onSessionProgressChanged(int sessionId, float progress); + void onSessionClosed(int sessionId); void onSessionFinished(int sessionId, boolean success); } diff --git a/core/java/android/content/pm/IPackageInstallerSession.aidl b/core/java/android/content/pm/IPackageInstallerSession.aidl index 2fd7ddb..af0323f 100644 --- a/core/java/android/content/pm/IPackageInstallerSession.aidl +++ b/core/java/android/content/pm/IPackageInstallerSession.aidl @@ -24,7 +24,9 @@ interface IPackageInstallerSession { void setClientProgress(float progress); void addClientProgress(float progress); + String[] list(); ParcelFileDescriptor openWrite(String name, long offsetBytes, long lengthBytes); + ParcelFileDescriptor openRead(String name); void close(); void commit(in IPackageInstallObserver2 observer); diff --git a/core/java/android/content/pm/InstallSessionInfo.java b/core/java/android/content/pm/InstallSessionInfo.java index a9c574a..f263885 100644 --- a/core/java/android/content/pm/InstallSessionInfo.java +++ b/core/java/android/content/pm/InstallSessionInfo.java @@ -16,7 +16,9 @@ package android.content.pm; +import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.Intent; import android.graphics.Bitmap; import android.os.Parcel; import android.os.Parcelable; @@ -32,6 +34,8 @@ public class InstallSessionInfo implements Parcelable { public String installerPackageName; /** {@hide} */ public float progress; + /** {@hide} */ + public boolean open; /** {@hide} */ public int mode; @@ -53,6 +57,7 @@ public class InstallSessionInfo implements Parcelable { sessionId = source.readInt(); installerPackageName = source.readString(); progress = source.readFloat(); + open = source.readInt() != 0; mode = source.readInt(); sizeBytes = source.readLong(); @@ -88,6 +93,13 @@ public class InstallSessionInfo implements Parcelable { } /** + * Return if this session is currently open. + */ + public boolean isOpen() { + return open; + } + + /** * Return the package name this session is working with. May be {@code null} * if unknown. */ @@ -111,6 +123,23 @@ public class InstallSessionInfo implements Parcelable { return appLabel; } + /** + * Return an Intent that can be started to view details about this install + * session. This may surface actions such as pause, resume, or cancel. + * <p> + * In some cases, a matching Activity may not exist, so ensure you safeguard + * against this. + * + * @see PackageInstaller#ACTION_SESSION_DETAILS + */ + public @Nullable Intent getDetailsIntent() { + final Intent intent = new Intent(PackageInstaller.ACTION_SESSION_DETAILS); + intent.putExtra(PackageInstaller.EXTRA_SESSION_ID, sessionId); + intent.setPackage(installerPackageName); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + return intent; + } + @Override public int describeContents() { return 0; @@ -121,6 +150,7 @@ public class InstallSessionInfo implements Parcelable { dest.writeInt(sessionId); dest.writeString(installerPackageName); dest.writeFloat(progress); + dest.writeInt(open ? 1 : 0); dest.writeInt(mode); dest.writeLong(sizeBytes); diff --git a/core/java/android/content/pm/InstallSessionParams.java b/core/java/android/content/pm/InstallSessionParams.java index 3de9863..1716e39 100644 --- a/core/java/android/content/pm/InstallSessionParams.java +++ b/core/java/android/content/pm/InstallSessionParams.java @@ -17,6 +17,7 @@ package android.content.pm; import android.annotation.Nullable; +import android.app.ActivityManager; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; @@ -30,6 +31,9 @@ import com.android.internal.util.IndentingPrintWriter; */ public class InstallSessionParams implements Parcelable { + /** {@hide} */ + public static final int MODE_INVALID = -1; + /** * Mode for an install session whose staged APKs should fully replace any * existing APKs for the target app. @@ -48,21 +52,19 @@ public class InstallSessionParams implements Parcelable { public static final int MODE_INHERIT_EXISTING = 2; /** {@hide} */ - public int mode; + public int mode = MODE_INVALID; /** {@hide} */ public int installFlags; /** {@hide} */ public int installLocation = PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY; /** {@hide} */ - public Signature[] signatures; - /** {@hide} */ public long sizeBytes = -1; /** {@hide} */ public String appPackageName; /** {@hide} */ public Bitmap appIcon; /** {@hide} */ - public CharSequence appLabel; + public String appLabel; /** {@hide} */ public Uri originatingUri; /** {@hide} */ @@ -86,7 +88,6 @@ public class InstallSessionParams implements Parcelable { mode = source.readInt(); installFlags = source.readInt(); installLocation = source.readInt(); - signatures = (Signature[]) source.readParcelableArray(null); sizeBytes = source.readLong(); appPackageName = source.readString(); appIcon = source.readParcelable(null); @@ -106,16 +107,13 @@ public class InstallSessionParams implements Parcelable { } /** - * Optionally provide a set of certificates for the app being installed. - * <p> - * If the APKs staged in the session aren't consistent with these - * signatures, the install will fail. Regardless of this value, all APKs in - * the app must have the same signing certificates. - * - * @see PackageInfo#signatures + * @deprecated use {@link PackageInstaller.Session#openRead(String)} to + * calculate message digest instead. + * @hide */ + @Deprecated public void setSignatures(@Nullable Signature[] signatures) { - this.signatures = signatures; + throw new UnsupportedOperationException(); } /** @@ -146,7 +144,8 @@ public class InstallSessionParams implements Parcelable { /** * Optionally set an icon representing the app being installed. This should - * be at least {@link android.R.dimen#app_icon_size} in both dimensions. + * be roughly {@link ActivityManager#getLauncherLargeIconSize()} in both + * dimensions. */ public void setAppIcon(@Nullable Bitmap appIcon) { this.appIcon = appIcon; @@ -156,7 +155,7 @@ public class InstallSessionParams implements Parcelable { * Optionally set a label representing the app being installed. */ public void setAppLabel(@Nullable CharSequence appLabel) { - this.appLabel = appLabel; + this.appLabel = (appLabel != null) ? appLabel.toString() : null; } /** @@ -184,7 +183,6 @@ public class InstallSessionParams implements Parcelable { pw.printPair("mode", mode); pw.printHexPair("installFlags", installFlags); pw.printPair("installLocation", installLocation); - pw.printPair("signatures", (signatures != null)); pw.printPair("sizeBytes", sizeBytes); pw.printPair("appPackageName", appPackageName); pw.printPair("appIcon", (appIcon != null)); @@ -205,11 +203,10 @@ public class InstallSessionParams implements Parcelable { dest.writeInt(mode); dest.writeInt(installFlags); dest.writeInt(installLocation); - dest.writeParcelableArray(signatures, flags); dest.writeLong(sizeBytes); dest.writeString(appPackageName); dest.writeParcelable(appIcon, flags); - dest.writeString(appLabel != null ? appLabel.toString() : null); + dest.writeString(appLabel); dest.writeParcelable(originatingUri, flags); dest.writeParcelable(referrerUri, flags); dest.writeString(abiOverride); diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index a114bb8..8af827e 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -18,9 +18,10 @@ package android.content.pm; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.SdkConstant; +import android.annotation.SdkConstant.SdkConstantType; import android.app.PackageInstallObserver; import android.app.PackageUninstallObserver; -import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.os.FileBridge; import android.os.Handler; @@ -32,7 +33,9 @@ import android.util.ExceptionUtils; import java.io.Closeable; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; +import java.security.MessageDigest; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -63,6 +66,27 @@ import java.util.List; * </ul> */ public class PackageInstaller { + /** + * Activity Action: Show details about a particular install session. This + * may surface actions such as pause, resume, or cancel. + * <p> + * This should always be scoped to the installer package that owns the + * session. Clients should use {@link InstallSessionInfo#getDetailsIntent()} + * to build this intent correctly. + * <p> + * In some cases, a matching Activity may not exist, so ensure you safeguard + * against this. + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_SESSION_DETAILS = "android.content.pm.action.SESSION_DETAILS"; + + /** + * An integer session ID. + * + * @see #ACTION_SESSION_DETAILS + */ + public static final String EXTRA_SESSION_ID = "android.content.pm.extra.SESSION_ID"; + private final PackageManager mPm; private final IPackageInstaller mInstaller; private final int mUserId; @@ -180,14 +204,32 @@ public class PackageInstaller { /** * Events for observing session lifecycle. + * <p> + * A typical session lifecycle looks like this: + * <ul> + * <li>An installer creates a session to indicate pending app delivery. All + * install details are available at this point. + * <li>The installer opens the session to deliver APK data. Note that a + * session may be opened and closed multiple times as network connectivity + * changes. The installer may deliver periodic progress updates. + * <li>The installer commits or abandons the session, resulting in the + * session being finished. + * </ul> */ public static abstract class SessionCallback { /** - * New session has been created. + * New session has been created. Details about the session can be + * obtained from {@link PackageInstaller#getSessionInfo(int)}. */ public abstract void onCreated(int sessionId); /** + * Session has been opened. A session is usually opened when the + * installer is actively writing data. + */ + public abstract void onOpened(int sessionId); + + /** * Progress for given session has been updated. * <p> * Note that this progress may not directly correspond to the value @@ -198,6 +240,11 @@ public class PackageInstaller { public abstract void onProgressChanged(int sessionId, float progress); /** + * Session has been closed. + */ + public abstract void onClosed(int sessionId); + + /** * Session has completely finished, either with success or failure. */ public abstract void onFinished(int sessionId, boolean success); @@ -207,8 +254,10 @@ public class PackageInstaller { private static class SessionCallbackDelegate extends IPackageInstallerCallback.Stub implements Handler.Callback { private static final int MSG_SESSION_CREATED = 1; - private static final int MSG_SESSION_PROGRESS_CHANGED = 2; - private static final int MSG_SESSION_FINISHED = 3; + private static final int MSG_SESSION_OPENED = 2; + private static final int MSG_SESSION_PROGRESS_CHANGED = 3; + private static final int MSG_SESSION_CLOSED = 4; + private static final int MSG_SESSION_FINISHED = 5; final SessionCallback mCallback; final Handler mHandler; @@ -224,9 +273,15 @@ public class PackageInstaller { case MSG_SESSION_CREATED: mCallback.onCreated(msg.arg1); return true; + case MSG_SESSION_OPENED: + mCallback.onOpened(msg.arg1); + return true; case MSG_SESSION_PROGRESS_CHANGED: mCallback.onProgressChanged(msg.arg1, (float) msg.obj); return true; + case MSG_SESSION_CLOSED: + mCallback.onClosed(msg.arg1); + return true; case MSG_SESSION_FINISHED: mCallback.onFinished(msg.arg1, msg.arg2 != 0); return true; @@ -240,12 +295,22 @@ public class PackageInstaller { } @Override + public void onSessionOpened(int sessionId) { + mHandler.obtainMessage(MSG_SESSION_OPENED, sessionId, 0).sendToTarget(); + } + + @Override public void onSessionProgressChanged(int sessionId, float progress) { mHandler.obtainMessage(MSG_SESSION_PROGRESS_CHANGED, sessionId, 0, progress) .sendToTarget(); } @Override + public void onSessionClosed(int sessionId) { + mHandler.obtainMessage(MSG_SESSION_CLOSED, sessionId, 0).sendToTarget(); + } + + @Override public void onSessionFinished(int sessionId, boolean success) { mHandler.obtainMessage(MSG_SESSION_FINISHED, sessionId, success ? 1 : 0) .sendToTarget(); @@ -373,7 +438,7 @@ public class PackageInstaller { ExceptionUtils.maybeUnwrapIOException(e); throw e; } catch (RemoteException e) { - throw new IOException(e); + throw e.rethrowAsRuntimeException(); } } @@ -391,6 +456,40 @@ public class PackageInstaller { } /** + * List all APK names contained in this session. + * <p> + * This returns all names which have been previously written through + * {@link #openWrite(String, long, long)} as part of this session. + */ + public @NonNull String[] list() { + try { + return mSession.list(); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } + + /** + * Open a stream to read an APK file from the session. + * <p> + * This is only valid for names which have been previously written + * through {@link #openWrite(String, long, long)} as part of this + * session. For example, this stream may be used to calculate a + * {@link MessageDigest} of a written APK before committing. + */ + public @NonNull InputStream openRead(@NonNull String name) throws IOException { + try { + final ParcelFileDescriptor pfd = mSession.openRead(name); + return new ParcelFileDescriptor.AutoCloseInputStream(pfd); + } catch (RuntimeException e) { + ExceptionUtils.maybeUnwrapIOException(e); + throw e; + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } + + /** * Attempt to commit everything staged in this session. This may require * user intervention, and so it may not happen immediately. The final * result of the commit will be reported through the given callback. diff --git a/core/java/android/hardware/hdmi/HdmiCecDeviceInfo.java b/core/java/android/hardware/hdmi/HdmiCecDeviceInfo.java index 27829a7..6e1844a 100644 --- a/core/java/android/hardware/hdmi/HdmiCecDeviceInfo.java +++ b/core/java/android/hardware/hdmi/HdmiCecDeviceInfo.java @@ -65,6 +65,18 @@ public final class HdmiCecDeviceInfo implements Parcelable { */ public static final int ADDR_INTERNAL = 0; + /** + * Physical address used to indicate the source comes from internal device. + * The physical address of TV(0) is used. + */ + public static final int PATH_INTERNAL = 0x0000; + + /** Invalid physical address (routing path) */ + public static final int PATH_INVALID = 0xFFFF; + + /** Invalid port ID */ + public static final int PORT_INVALID = -1; + // Logical address, physical address, device type, vendor id and display name // are immutable value. private final int mLogicalAddress; diff --git a/core/java/android/hardware/hdmi/IHdmiControlService.aidl b/core/java/android/hardware/hdmi/IHdmiControlService.aidl index 808e0c9..920a1f4 100644 --- a/core/java/android/hardware/hdmi/IHdmiControlService.aidl +++ b/core/java/android/hardware/hdmi/IHdmiControlService.aidl @@ -37,6 +37,7 @@ import java.util.List; */ interface IHdmiControlService { int[] getSupportedTypes(); + HdmiCecDeviceInfo getActiveSource(); void oneTouchPlay(IHdmiControlCallback callback); void queryDisplayStatus(IHdmiControlCallback callback); void addHotplugEventListener(IHdmiHotplugEventListener listener); diff --git a/core/java/android/hardware/location/GeofenceHardwareImpl.java b/core/java/android/hardware/location/GeofenceHardwareImpl.java index 6734878..5c7a8da 100644 --- a/core/java/android/hardware/location/GeofenceHardwareImpl.java +++ b/core/java/android/hardware/location/GeofenceHardwareImpl.java @@ -139,8 +139,8 @@ public final class GeofenceHardwareImpl { private void updateFusedHardwareAvailability() { boolean fusedSupported; try { - fusedSupported = mFusedService.isSupported(); - } catch(RemoteException e) { + fusedSupported = (mFusedService != null ? mFusedService.isSupported() : false); + } catch (RemoteException e) { Log.e(TAG, "RemoteException calling LocationManagerService"); fusedSupported = false; } diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index afac239..c3ac012 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -61,6 +61,12 @@ public class Process { public static final String SECONDARY_ZYGOTE_SOCKET = "zygote_secondary"; /** + * Defines the root UID. + * @hide + */ + public static final int ROOT_UID = 0; + + /** * Defines the UID/GID under which system code runs. */ public static final int SYSTEM_UID = 1000; diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index d385131..13f93a7 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -625,8 +625,9 @@ public class UserManager { Settings.Secure.putStringForUser(context.getContentResolver(), Settings.Secure.SKIP_FIRST_USE_HINTS, "1", guest.id); try { - mService.setUserRestrictions( - mService.getDefaultGuestRestrictions(), guest.id); + Bundle guestRestrictions = mService.getDefaultGuestRestrictions(); + guestRestrictions.putBoolean(DISALLOW_SMS, true); + mService.setUserRestrictions(guestRestrictions, guest.id); } catch (RemoteException re) { Log.w(TAG, "Could not update guest restrictions"); } diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java index 3f53ad4..5248131 100644 --- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java +++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java @@ -45,18 +45,22 @@ public class AlwaysOnHotwordDetector { * Indicates that this hotword detector is no longer valid for any recognition * and should not be used anymore. */ - public static final int STATE_INVALID = -3; + private static final int STATE_INVALID = -3; + /** * Indicates that recognition for the given keyphrase is not available on the system * because of the hardware configuration. + * No further interaction should be performed with the detector that returns this availability. */ public static final int STATE_HARDWARE_UNAVAILABLE = -2; /** * Indicates that recognition for the given keyphrase is not supported. + * No further interaction should be performed with the detector that returns this availability. */ public static final int STATE_KEYPHRASE_UNSUPPORTED = -1; /** * Indicates that the given keyphrase is not enrolled. + * The caller may choose to begin an enrollment flow for the keyphrase. */ public static final int STATE_KEYPHRASE_UNENROLLED = 1; /** @@ -91,12 +95,14 @@ public class AlwaysOnHotwordDetector { // Must be kept in sync with the related attribute defined as searchKeyphraseRecognitionFlags. /** - * Simple recognition of the key phrase. Returned by {@link #getSupportedRecognitionModes()} + * Simple recognition of the key phrase. + * Returned by {@link #getSupportedRecognitionModes()} */ public static final int RECOGNITION_MODE_VOICE_TRIGGER = SoundTrigger.RECOGNITION_MODE_VOICE_TRIGGER; /** - * Trigger only if one user is identified. Returned by {@link #getSupportedRecognitionModes()} + * User identification performed with the keyphrase recognition. + * Returned by {@link #getSupportedRecognitionModes()} */ public static final int RECOGNITION_MODE_USER_IDENTIFICATION = SoundTrigger.RECOGNITION_MODE_USER_IDENTIFICATION; @@ -149,16 +155,11 @@ public class AlwaysOnHotwordDetector { * * Availability implies whether the hardware on this system is capable of listening for * the given keyphrase or not. <p/> - * If the return code is one of {@link #STATE_HARDWARE_UNAVAILABLE} or - * {@link #STATE_KEYPHRASE_UNSUPPORTED}, - * detection is not possible and no further interaction should be - * performed with this detector. <br/> - * If it is {@link #STATE_KEYPHRASE_UNENROLLED} the caller may choose to begin - * an enrollment flow for the keyphrase. <br/> - * and for {@link #STATE_KEYPHRASE_ENROLLED} a recognition can be started as desired. <p/> * - * If the return code is {@link #STATE_INVALID}, this detector is stale. - * A new detector should be obtained for use in the future. + * @see AlwaysOnHotwordDetector#STATE_HARDWARE_UNAVAILABLE + * @see AlwaysOnHotwordDetector#STATE_KEYPHRASE_UNSUPPORTED + * @see AlwaysOnHotwordDetector#STATE_KEYPHRASE_UNENROLLED + * @see AlwaysOnHotwordDetector#STATE_KEYPHRASE_ENROLLED */ void onAvailabilityChanged(int status); /** @@ -217,9 +218,15 @@ public class AlwaysOnHotwordDetector { /** * Gets the recognition modes supported by the associated keyphrase. * + * @see #RECOGNITION_MODE_USER_IDENTIFICATION + * @see #RECOGNITION_MODE_VOICE_TRIGGER + * * @throws UnsupportedOperationException if the keyphrase itself isn't supported. * Callers should only call this method after a supported state callback on * {@link Callback#onAvailabilityChanged(int)} to avoid this exception. + * @throws IllegalStateException if the detector is in an invalid state. + * This may happen if another detector has been instantiated or the + * {@link VoiceInteractionService} hosting this detector has been shut down. */ public int getSupportedRecognitionModes() { synchronized (mLock) { @@ -228,6 +235,11 @@ public class AlwaysOnHotwordDetector { } private int getSupportedRecognitionModesLocked() { + if (mAvailability == STATE_INVALID) { + throw new IllegalStateException( + "getSupportedRecognitionModes called on an invalid detector"); + } + // This method only makes sense if we can actually support a recognition. if (mAvailability != STATE_KEYPHRASE_ENROLLED && mAvailability != STATE_KEYPHRASE_UNENROLLED) { @@ -247,9 +259,16 @@ public class AlwaysOnHotwordDetector { * @throws UnsupportedOperationException if the recognition isn't supported. * Callers should only call this method after a supported state callback on * {@link Callback#onAvailabilityChanged(int)} to avoid this exception. + * @throws IllegalStateException if the detector is in an invalid state. + * This may happen if another detector has been instantiated or the + * {@link VoiceInteractionService} hosting this detector has been shut down. */ public void startRecognition(int recognitionFlags) { synchronized (mLock) { + if (mAvailability == STATE_INVALID) { + throw new IllegalStateException("startRecognition called on an invalid detector"); + } + // Check if we can start/stop a recognition. if (mAvailability != STATE_KEYPHRASE_ENROLLED) { throw new UnsupportedOperationException( @@ -268,9 +287,16 @@ public class AlwaysOnHotwordDetector { * @throws UnsupportedOperationException if the recognition isn't supported. * Callers should only call this method after a supported state callback on * {@link Callback#onAvailabilityChanged(int)} to avoid this exception. + * @throws IllegalStateException if the detector is in an invalid state. + * This may happen if another detector has been instantiated or the + * {@link VoiceInteractionService} hosting this detector has been shut down. */ public void stopRecognition() { synchronized (mLock) { + if (mAvailability == STATE_INVALID) { + throw new IllegalStateException("stopRecognition called on an invalid detector"); + } + // Check if we can start/stop a recognition. if (mAvailability != STATE_KEYPHRASE_ENROLLED) { throw new UnsupportedOperationException( @@ -293,14 +319,28 @@ public class AlwaysOnHotwordDetector { * @throws UnsupportedOperationException if managing they keyphrase isn't supported. * Callers should only call this method after a supported state callback on * {@link Callback#onAvailabilityChanged(int)} to avoid this exception. + * @throws IllegalStateException if the detector is in an invalid state. + * This may happen if another detector has been instantiated or the + * {@link VoiceInteractionService} hosting this detector has been shut down. */ public Intent getManageIntent(int action) { + synchronized (mLock) { + return getManageIntentLocked(action); + } + } + + private Intent getManageIntentLocked(int action) { + if (mAvailability == STATE_INVALID) { + throw new IllegalStateException("getManageIntent called on an invalid detector"); + } + // This method only makes sense if we can actually support a recognition. if (mAvailability != STATE_KEYPHRASE_ENROLLED && mAvailability != STATE_KEYPHRASE_UNENROLLED) { throw new UnsupportedOperationException( "Managing the given keyphrase is not supported"); } + if (action != MANAGE_ACTION_ENROLL && action != MANAGE_ACTION_RE_ENROLL && action != MANAGE_ACTION_UN_ENROLL) { @@ -387,7 +427,6 @@ public class AlwaysOnHotwordDetector { if (DBG) Slog.d(TAG, "starting recognition..."); int status = startRecognitionLocked(); if (status == STATUS_OK) { - mInternalState |= FLAG_STARTED; mHandler.sendEmptyMessage(MSG_DETECTION_STARTED); } else { if (DBG) Slog.d(TAG, "failed to start recognition: " + status); @@ -404,7 +443,6 @@ public class AlwaysOnHotwordDetector { if (DBG) Slog.d(TAG, "stopping recognition..."); int status = stopRecognitionLocked(); if (status == STATUS_OK) { - mInternalState &= ~FLAG_STARTED; if (!requested) mHandler.sendEmptyMessage(MSG_DETECTION_STOPPED); } else { if (!requested) mHandler.sendEmptyMessage(MSG_DETECTION_ERROR); @@ -483,20 +521,42 @@ public class AlwaysOnHotwordDetector { class MyHandler extends Handler { @Override public void handleMessage(Message msg) { + synchronized (mLock) { + if (mAvailability == STATE_INVALID) { + Slog.w(TAG, "Received message: " + msg.what + " for an invalid detector"); + return; + } + } + switch (msg.what) { case MSG_STATE_CHANGED: mExternalCallback.onAvailabilityChanged(msg.arg1); break; case MSG_HOTWORD_DETECTED: + synchronized (mLock) { + mInternalState &= ~FLAG_REQUESTED; + mInternalState &= ~FLAG_STARTED; + } mExternalCallback.onDetected((byte[]) msg.obj); break; case MSG_DETECTION_STARTED: + synchronized (mLock) { + mInternalState |= FLAG_STARTED; + } mExternalCallback.onDetectionStarted(); break; case MSG_DETECTION_STOPPED: + synchronized (mLock) { + mInternalState &= ~FLAG_REQUESTED; + mInternalState &= ~FLAG_STARTED; + } mExternalCallback.onDetectionStopped(); break; case MSG_DETECTION_ERROR: + synchronized (mLock) { + mInternalState &= ~FLAG_REQUESTED; + mInternalState &= ~FLAG_STARTED; + } mExternalCallback.onError(); break; default: diff --git a/core/java/android/text/style/TtsSpan.java b/core/java/android/text/style/TtsSpan.java index f3a48a6..cb447fd 100644 --- a/core/java/android/text/style/TtsSpan.java +++ b/core/java/android/text/style/TtsSpan.java @@ -518,7 +518,7 @@ public class TtsSpan implements ParcelableSpan { * This class uses generics so methods from this class can return instances * of its child classes, resulting in a fluent API (CRTP pattern). */ - public static abstract class Builder<C extends Builder<C>> { + public static class Builder<C extends Builder<?>> { // Holds the type of this class. private final String mType; @@ -580,7 +580,7 @@ public class TtsSpan implements ParcelableSpan { * this builder like {@link TtsSpan.TextBuilder} and * {@link TtsSpan.CardinalBuilder} are likely more useful. */ - public static class SemioticClassBuilder<C extends SemioticClassBuilder<C>> + public static class SemioticClassBuilder<C extends SemioticClassBuilder<?>> extends Builder<C> { public SemioticClassBuilder(String type) { diff --git a/core/java/android/view/RenderNode.java b/core/java/android/view/RenderNode.java index e9ec565..eee4973 100644 --- a/core/java/android/view/RenderNode.java +++ b/core/java/android/view/RenderNode.java @@ -355,9 +355,10 @@ public class RenderNode { return nSetOutlineEmpty(mNativeRenderNode); } else if (outline.mRect != null) { return nSetOutlineRoundRect(mNativeRenderNode, outline.mRect.left, outline.mRect.top, - outline.mRect.right, outline.mRect.bottom, outline.mRadius); + outline.mRect.right, outline.mRect.bottom, outline.mRadius, outline.mAlpha); } else if (outline.mPath != null) { - return nSetOutlineConvexPath(mNativeRenderNode, outline.mPath.mNativePath); + return nSetOutlineConvexPath(mNativeRenderNode, outline.mPath.mNativePath, + outline.mAlpha); } throw new IllegalArgumentException("Unrecognized outline?"); } @@ -849,8 +850,9 @@ public class RenderNode { private static native boolean nSetProjectBackwards(long renderNode, boolean shouldProject); private static native boolean nSetProjectionReceiver(long renderNode, boolean shouldRecieve); private static native boolean nSetOutlineRoundRect(long renderNode, int left, int top, - int right, int bottom, float radius); - private static native boolean nSetOutlineConvexPath(long renderNode, long nativePath); + int right, int bottom, float radius, float alpha); + private static native boolean nSetOutlineConvexPath(long renderNode, long nativePath, + float alpha); private static native boolean nSetOutlineEmpty(long renderNode); private static native boolean nSetOutlineNone(long renderNode); private static native boolean nSetClipToOutline(long renderNode, boolean clipToOutline); diff --git a/core/java/android/view/ViewOutlineProvider.java b/core/java/android/view/ViewOutlineProvider.java index 64624ae..4054031 100644 --- a/core/java/android/view/ViewOutlineProvider.java +++ b/core/java/android/view/ViewOutlineProvider.java @@ -25,7 +25,8 @@ import android.graphics.drawable.Drawable; public abstract class ViewOutlineProvider { /** * Default outline provider for Views, which queries the Outline from the View's background, - * or returns <code>false</code> if the View does not have a background. + * or generates a 0 alpha, rectangular Outline the size of the View if a background + * isn't present. * * @see Drawable#getOutline(Outline) */ @@ -35,6 +36,10 @@ public abstract class ViewOutlineProvider { Drawable background = view.getBackground(); if (background != null) { background.getOutline(outline); + } else { + + outline.setRect(0, 0, view.getWidth(), view.getHeight()); + outline.setAlpha(0.0f); } } }; diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index c169d35..e7b3152 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -1425,6 +1425,21 @@ public abstract class Window { public void setEnterTransition(Transition transition) {} /** + * Sets the Transition that will be used to move Views out of the scene when the Window is + * preparing to close, for example after a call to + * {@link android.app.Activity#finishAfterTransition()}. The exiting + * Views will be those that are regular Views or ViewGroups that have + * {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend + * {@link android.transition.Visibility} as entering is governed by changing visibility from + * {@link View#VISIBLE} to {@link View#INVISIBLE}. If <code>transition</code> is null, + * entering Views will remain unaffected. If nothing is set, the default will be to + * use the same value as set in {@link #setEnterTransition(android.transition.Transition)}. + * @param transition The Transition to use to move Views out of the Scene when the Window + * is preparing to close. + */ + public void setReturnTransition(Transition transition) {} + + /** * Sets the Transition that will be used to move Views out of the scene when starting a * new Activity. The exiting Views will be those that are regular Views or ViewGroups that * have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend @@ -1437,6 +1452,20 @@ public abstract class Window { public void setExitTransition(Transition transition) {} /** + * Sets the Transition that will be used to move Views in to the scene when returning from + * a previously-started Activity. The entering Views will be those that are regular Views + * or ViewGroups that have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions + * will extend {@link android.transition.Visibility} as exiting is governed by changing + * visibility from {@link View#VISIBLE} to {@link View#INVISIBLE}. If transition is null, + * the views will remain unaffected. If nothing is set, the default will be to use the same + * transition as {@link #setExitTransition(android.transition.Transition)}. + * Requires {@link #FEATURE_CONTENT_TRANSITIONS}. + * @param transition The Transition to use to move Views into the scene when reentering from a + * previously-started Activity. + */ + public void setReenterTransition(Transition transition) {} + + /** * Returns the transition used to move Views into the initial scene. The entering * Views will be those that are regular Views or ViewGroups that have * {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend @@ -1449,6 +1478,19 @@ public abstract class Window { public Transition getEnterTransition() { return null; } /** + * Returns he Transition that will be used to move Views out of the scene when the Window is + * preparing to close, for example after a call to + * {@link android.app.Activity#finishAfterTransition()}. The exiting + * Views will be those that are regular Views or ViewGroups that have + * {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend + * {@link android.transition.Visibility} as entering is governed by changing visibility from + * {@link View#VISIBLE} to {@link View#INVISIBLE}. + * @return The Transition to use to move Views out of the Scene when the Window + * is preparing to close. + */ + public Transition getReturnTransition() { return null; } + + /** * Returns the Transition that will be used to move Views out of the scene when starting a * new Activity. The exiting Views will be those that are regular Views or ViewGroups that * have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend @@ -1461,6 +1503,18 @@ public abstract class Window { public Transition getExitTransition() { return null; } /** + * Returns the Transition that will be used to move Views in to the scene when returning from + * a previously-started Activity. The entering Views will be those that are regular Views + * or ViewGroups that have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions + * will extend {@link android.transition.Visibility} as exiting is governed by changing + * visibility from {@link View#VISIBLE} to {@link View#INVISIBLE}. + * Requires {@link #FEATURE_CONTENT_TRANSITIONS}. + * @return The Transition to use to move Views into the scene when reentering from a + * previously-started Activity. + */ + public Transition getReenterTransition() { return null; } + + /** * Sets the Transition that will be used for shared elements transferred into the content * Scene. Typical Transitions will affect size and location, such as * {@link android.transition.ChangeBounds}. A null @@ -1472,6 +1526,19 @@ public abstract class Window { public void setSharedElementEnterTransition(Transition transition) {} /** + * Sets the Transition that will be used for shared elements transferred back to a + * calling Activity. Typical Transitions will affect size and location, such as + * {@link android.transition.ChangeBounds}. A null + * value will cause transferred shared elements to blink to the final position. + * If no value is set, the default will be to use the same value as + * {@link #setSharedElementEnterTransition(android.transition.Transition)}. + * Requires {@link #FEATURE_CONTENT_TRANSITIONS}. + * @param transition The Transition to use for shared elements transferred out of the content + * Scene. + */ + public void setSharedElementReturnTransition(Transition transition) {} + + /** * Returns the Transition that will be used for shared elements transferred into the content * Scene. Requires {@link #FEATURE_CONTENT_TRANSITIONS}. * @return Transition to use for sharend elements transferred into the content Scene. @@ -1479,6 +1546,13 @@ public abstract class Window { public Transition getSharedElementEnterTransition() { return null; } /** + * Returns the Transition that will be used for shared elements transferred back to a + * calling Activity. Requires {@link #FEATURE_CONTENT_TRANSITIONS}. + * @return Transition to use for sharend elements transferred into the content Scene. + */ + public Transition getSharedElementReturnTransition() { return null; } + + /** * Sets the Transition that will be used for shared elements after starting a new Activity * before the shared elements are transferred to the called Activity. If the shared elements * must animate during the exit transition, this Transition should be used. Upon completion, @@ -1490,6 +1564,17 @@ public abstract class Window { public void setSharedElementExitTransition(Transition transition) {} /** + * Sets the Transition that will be used for shared elements reentering from a started + * Activity after it has returned the shared element to it start location. If no value + * is set, this will default to + * {@link #setSharedElementExitTransition(android.transition.Transition)}. + * Requires {@link #FEATURE_CONTENT_TRANSITIONS}. + * @param transition The Transition to use for shared elements in the launching Window + * after the shared element has returned to the Window. + */ + public void setSharedElementReenterTransition(Transition transition) {} + + /** * Returns the Transition to use for shared elements in the launching Window prior * to transferring to the launched Activity's Window. * Requires {@link #FEATURE_CONTENT_TRANSITIONS}. @@ -1500,6 +1585,16 @@ public abstract class Window { public Transition getSharedElementExitTransition() { return null; } /** + * Returns the Transition that will be used for shared elements reentering from a started + * Activity after it has returned the shared element to it start location. + * Requires {@link #FEATURE_CONTENT_TRANSITIONS}. + * + * @return the Transition that will be used for shared elements reentering from a started + * Activity after it has returned the shared element to it start location. + */ + public Transition getSharedElementReenterTransition() { return null; } + + /** * Controls how the transition set in * {@link #setEnterTransition(android.transition.Transition)} overlaps with the exit * transition of the calling Activity. When true, the transition will start as soon as possible. diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java index 2c7b3eb..2e836fb 100644 --- a/core/java/android/webkit/WebViewFactory.java +++ b/core/java/android/webkit/WebViewFactory.java @@ -16,16 +16,26 @@ package android.webkit; +import android.app.ActivityManagerInternal; +import android.app.Application; +import android.app.AppGlobals; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; import android.os.Build; import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.StrictMode; +import android.os.SystemProperties; +import android.text.TextUtils; import android.util.AndroidRuntimeException; import android.util.Log; +import com.android.server.LocalServices; import dalvik.system.VMRuntime; import java.io.File; +import java.util.Arrays; import com.android.internal.os.Zygote; @@ -42,17 +52,15 @@ public final class WebViewFactory { private static final String NULL_WEBVIEW_FACTORY = "com.android.webview.nullwebview.NullWebViewFactoryProvider"; - // TODO(torne): we need to use a system property instead of hardcoding the library paths to - // enable it to be changed when a webview update apk is installed. - private static final String CHROMIUM_WEBVIEW_NATIVE_LIB_32 = - "/system/lib/libwebviewchromium.so"; - private static final String CHROMIUM_WEBVIEW_NATIVE_LIB_64 = - "/system/lib64/libwebviewchromium.so"; private static final String CHROMIUM_WEBVIEW_NATIVE_RELRO_32 = "/data/misc/shared_relro/libwebviewchromium32.relro"; private static final String CHROMIUM_WEBVIEW_NATIVE_RELRO_64 = "/data/misc/shared_relro/libwebviewchromium64.relro"; + public static final String CHROMIUM_WEBVIEW_VMSIZE_SIZE_PROPERTY = + "persist.sys.webview.vmsize"; + private static final long CHROMIUM_WEBVIEW_DEFAULT_VMSIZE_BYTES = 100 * 1024 * 1024; + private static final String LOGTAG = "WebViewFactory"; private static final boolean DEBUG = false; @@ -64,8 +72,8 @@ public final class WebViewFactory { private static boolean sAddressSpaceReserved = false; public static String getWebViewPackageName() { - // TODO: Make this dynamic based on resource configuration. - return "com.android.webview"; + return AppGlobals.getInitialApplication().getString( + com.android.internal.R.string.config_webViewPackageName); } static WebViewFactoryProvider getProvider() { @@ -99,10 +107,18 @@ public final class WebViewFactory { } private static Class<WebViewFactoryProvider> getFactoryClass() throws ClassNotFoundException { + Application initialApplication = AppGlobals.getInitialApplication(); try { - return (Class<WebViewFactoryProvider>) Class.forName(CHROMIUM_WEBVIEW_FACTORY); - } catch (ClassNotFoundException e) { - Log.e(LOGTAG, "Chromium WebView does not exist"); + Context webViewContext = initialApplication.createPackageContext( + getWebViewPackageName(), + Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); + initialApplication.getAssets().addAssetPath( + webViewContext.getApplicationInfo().sourceDir); + ClassLoader clazzLoader = webViewContext.getClassLoader(); + return (Class<WebViewFactoryProvider>) Class.forName(CHROMIUM_WEBVIEW_FACTORY, true, + clazzLoader); + } catch (PackageManager.NameNotFoundException e) { + Log.e(LOGTAG, "Chromium WebView package does not exist"); return (Class<WebViewFactoryProvider>) Class.forName(NULL_WEBVIEW_FACTORY); } } @@ -114,79 +130,197 @@ public final class WebViewFactory { public static void prepareWebViewInZygote() { try { System.loadLibrary("webviewchromium_loader"); - sAddressSpaceReserved = nativeReserveAddressSpace(CHROMIUM_WEBVIEW_NATIVE_LIB_32, - CHROMIUM_WEBVIEW_NATIVE_LIB_64); + long addressSpaceToReserve = + SystemProperties.getLong(CHROMIUM_WEBVIEW_VMSIZE_SIZE_PROPERTY, + CHROMIUM_WEBVIEW_DEFAULT_VMSIZE_BYTES); + sAddressSpaceReserved = nativeReserveAddressSpace(addressSpaceToReserve); + if (sAddressSpaceReserved) { - if (DEBUG) Log.v(LOGTAG, "address space reserved"); + if (DEBUG) { + Log.v(LOGTAG, "address space reserved: " + addressSpaceToReserve + " bytes"); + } } else { - Log.e(LOGTAG, "reserving address space failed"); + Log.e(LOGTAG, "reserving " + addressSpaceToReserve + + " bytes of address space failed"); } - } catch (Throwable e) { + } catch (Throwable t) { // Log and discard errors at this stage as we must not crash the zygote. - Log.e(LOGTAG, "error preparing native loader", e); + Log.e(LOGTAG, "error preparing native loader", t); } } /** * Perform any WebView loading preparations that must happen at boot from the system server, - * after the package manager has started. + * after the package manager has started or after an update to the webview is installed. * This must be called in the system server. * Currently, this means spawning the child processes which will create the relro files. */ public static void prepareWebViewInSystemServer() { + String[] nativePaths = null; + try { + nativePaths = getWebViewNativeLibraryPaths(); + } catch (PackageManager.NameNotFoundException e) { + } + prepareWebViewInSystemServer(nativePaths); + } + + private static void prepareWebViewInSystemServer(String[] nativeLibraryPaths) { if (DEBUG) Log.v(LOGTAG, "creating relro files"); - if (new File(CHROMIUM_WEBVIEW_NATIVE_LIB_64).exists()) { - createRelroFile(Build.SUPPORTED_64_BIT_ABIS[0]); + + // We must always trigger createRelRo regardless of the value of nativeLibraryPaths. Any + // unexpected values will be handled there to ensure that we trigger notifying any process + // waiting on relreo creation. + if (Build.SUPPORTED_32_BIT_ABIS.length > 0) { + if (DEBUG) Log.v(LOGTAG, "Create 32 bit relro"); + createRelroFile(false /* is64Bit */, nativeLibraryPaths); + } + + if (Build.SUPPORTED_64_BIT_ABIS.length > 0) { + if (DEBUG) Log.v(LOGTAG, "Create 64 bit relro"); + createRelroFile(true /* is64Bit */, nativeLibraryPaths); } - if (new File(CHROMIUM_WEBVIEW_NATIVE_LIB_32).exists()) { - createRelroFile(Build.SUPPORTED_32_BIT_ABIS[0]); + } + + public static void onWebViewUpdateInstalled() { + String[] nativeLibs = null; + try { + nativeLibs = WebViewFactory.getWebViewNativeLibraryPaths(); + } catch (PackageManager.NameNotFoundException e) { + } + + if (nativeLibs != null) { + long newVmSize = 0L; + + for (String path : nativeLibs) { + if (DEBUG) Log.d(LOGTAG, "Checking file size of " + path); + if (path == null) continue; + File f = new File(path); + if (f.exists()) { + long length = f.length(); + if (length > newVmSize) { + newVmSize = length; + } + } + } + + if (DEBUG) { + Log.v(LOGTAG, "Based on library size, need " + newVmSize + + " bytes of address space."); + } + // The required memory can be larger than the file on disk (due to .bss), and an + // upgraded version of the library will likely be larger, so always attempt to reserve + // twice as much as we think to allow for the library to grow during this boot cycle. + newVmSize = Math.max(2 * newVmSize, CHROMIUM_WEBVIEW_DEFAULT_VMSIZE_BYTES); + Log.d(LOGTAG, "Setting new address space to " + newVmSize); + SystemProperties.set(CHROMIUM_WEBVIEW_VMSIZE_SIZE_PROPERTY, + Long.toString(newVmSize)); + } + prepareWebViewInSystemServer(nativeLibs); + } + + private static String[] getWebViewNativeLibraryPaths() + throws PackageManager.NameNotFoundException { + final String NATIVE_LIB_FILE_NAME = "libwebviewchromium.so"; + + PackageManager pm = AppGlobals.getInitialApplication().getPackageManager(); + ApplicationInfo ai = pm.getApplicationInfo(getWebViewPackageName(), 0); + + String path32; + String path64; + boolean primaryArchIs64bit = VMRuntime.is64BitAbi(ai.primaryCpuAbi); + if (!TextUtils.isEmpty(ai.secondaryCpuAbi)) { + // Multi-arch case. + if (primaryArchIs64bit) { + // Primary arch: 64-bit, secondary: 32-bit. + path64 = ai.nativeLibraryDir; + path32 = ai.secondaryNativeLibraryDir; + } else { + // Primary arch: 32-bit, secondary: 64-bit. + path64 = ai.secondaryNativeLibraryDir; + path32 = ai.nativeLibraryDir; + } + } else if (primaryArchIs64bit) { + // Single-arch 64-bit. + path64 = ai.nativeLibraryDir; + path32 = ""; + } else { + // Single-arch 32-bit. + path32 = ai.nativeLibraryDir; + path64 = ""; } + if (!TextUtils.isEmpty(path32)) path32 += "/" + NATIVE_LIB_FILE_NAME; + if (!TextUtils.isEmpty(path64)) path64 += "/" + NATIVE_LIB_FILE_NAME; + return new String[] { path32, path64 }; } - private static void createRelroFile(String abi) { + private static void createRelroFile(final boolean is64Bit, String[] nativeLibraryPaths) { + final String abi = + is64Bit ? Build.SUPPORTED_64_BIT_ABIS[0] : Build.SUPPORTED_32_BIT_ABIS[0]; + + // crashHandler is invoked by the ActivityManagerService when the isolated process crashes. + Runnable crashHandler = new Runnable() { + @Override + public void run() { + try { + Log.e(LOGTAG, "relro file creator for " + abi + " crashed. Proceeding without"); + getUpdateService().notifyRelroCreationCompleted(is64Bit, false); + } catch (RemoteException e) { + Log.e(LOGTAG, "Cannot reach WebViewUpdateService. " + e.getMessage()); + } + } + }; + try { - Process.start("android.webkit.WebViewFactory$RelroFileCreator", - "WebViewLoader-" + abi, - Process.SHARED_RELRO_UID, - Process.SHARED_RELRO_UID, - null, - 0, // TODO(torne): do we need to set debug flags? - Zygote.MOUNT_EXTERNAL_NONE, - Build.VERSION.SDK_INT, - null, - abi, - null); - } catch (Throwable e) { + if (nativeLibraryPaths == null + || nativeLibraryPaths[0] == null || nativeLibraryPaths[1] == null) { + throw new IllegalArgumentException( + "Native library paths to the WebView RelRo process must not be null!"); + } + int pid = LocalServices.getService(ActivityManagerInternal.class).startIsolatedProcess( + RelroFileCreator.class.getName(), nativeLibraryPaths, "WebViewLoader-" + abi, abi, + Process.SHARED_RELRO_UID, crashHandler); + if (pid <= 0) throw new Exception("Failed to start the relro file creator process"); + } catch (Throwable t) { // Log and discard errors as we must not crash the system server. - Log.e(LOGTAG, "error starting relro file creator for abi " + abi, e); + Log.e(LOGTAG, "error starting relro file creator for abi " + abi, t); + crashHandler.run(); } } private static class RelroFileCreator { // Called in an unprivileged child process to create the relro file. public static void main(String[] args) { - if (!sAddressSpaceReserved) { - Log.e(LOGTAG, "can't create relro file; address space not reserved"); - return; - } - boolean result = nativeCreateRelroFile(CHROMIUM_WEBVIEW_NATIVE_LIB_32, - CHROMIUM_WEBVIEW_NATIVE_LIB_64, - CHROMIUM_WEBVIEW_NATIVE_RELRO_32, - CHROMIUM_WEBVIEW_NATIVE_RELRO_64); - if (!result) { - Log.e(LOGTAG, "failed to create relro file"); - } else if (DEBUG) { - Log.v(LOGTAG, "created relro file"); - } - try { - getUpdateService().notifyRelroCreationCompleted(VMRuntime.getRuntime().is64Bit(), - result); - } catch (RemoteException e) { - Log.e(LOGTAG, "error notifying update service", e); - } + boolean result = false; + boolean is64Bit = VMRuntime.getRuntime().is64Bit(); + try{ + if (args.length != 2 || args[0] == null || args[1] == null) { + Log.e(LOGTAG, "Invalid RelroFileCreator args: " + Arrays.toString(args)); + return; + } + Log.v(LOGTAG, "RelroFileCreator (64bit = " + is64Bit + "), " + + " 32-bit lib: " + args[0] + ", 64-bit lib: " + args[1]); + if (!sAddressSpaceReserved) { + Log.e(LOGTAG, "can't create relro file; address space not reserved"); + return; + } + result = nativeCreateRelroFile(args[0] /* path32 */, + args[1] /* path64 */, + CHROMIUM_WEBVIEW_NATIVE_RELRO_32, + CHROMIUM_WEBVIEW_NATIVE_RELRO_64); + if (result && DEBUG) Log.v(LOGTAG, "created relro file"); + } finally { + // We must do our best to always notify the update service, even if something fails. + try { + getUpdateService().notifyRelroCreationCompleted(is64Bit, result); + } catch (RemoteException e) { + Log.e(LOGTAG, "error notifying update service", e); + } + + if (!result) Log.e(LOGTAG, "failed to create relro file"); - // Must explicitly exit or else this process will just sit around after we return. - System.exit(0); + // Must explicitly exit or else this process will just sit around after we return. + System.exit(0); + } } } @@ -203,14 +337,19 @@ public final class WebViewFactory { return; } - boolean result = nativeLoadWithRelroFile(CHROMIUM_WEBVIEW_NATIVE_LIB_32, - CHROMIUM_WEBVIEW_NATIVE_LIB_64, - CHROMIUM_WEBVIEW_NATIVE_RELRO_32, - CHROMIUM_WEBVIEW_NATIVE_RELRO_64); - if (!result) { - Log.w(LOGTAG, "failed to load with relro file, proceeding without"); - } else if (DEBUG) { - Log.v(LOGTAG, "loaded with relro file"); + try { + String[] args = getWebViewNativeLibraryPaths(); + boolean result = nativeLoadWithRelroFile(args[0] /* path32 */, + args[1] /* path64 */, + CHROMIUM_WEBVIEW_NATIVE_RELRO_32, + CHROMIUM_WEBVIEW_NATIVE_RELRO_64); + if (!result) { + Log.w(LOGTAG, "failed to load with relro file, proceeding without"); + } else if (DEBUG) { + Log.v(LOGTAG, "loaded with relro file"); + } + } catch (PackageManager.NameNotFoundException e) { + Log.e(LOGTAG, "Failed to list WebView package libraries for loadNativeLibrary", e); } } @@ -218,7 +357,7 @@ public final class WebViewFactory { return IWebViewUpdateService.Stub.asInterface(ServiceManager.getService("webviewupdate")); } - private static native boolean nativeReserveAddressSpace(String lib32, String lib64); + private static native boolean nativeReserveAddressSpace(long addressSpaceToReserve); private static native boolean nativeCreateRelroFile(String lib32, String lib64, String relro32, String relro64); private static native boolean nativeLoadWithRelroFile(String lib32, String lib64, diff --git a/core/java/com/android/internal/util/XmlUtils.java b/core/java/com/android/internal/util/XmlUtils.java index dca9921..7db70ba 100644 --- a/core/java/com/android/internal/util/XmlUtils.java +++ b/core/java/com/android/internal/util/XmlUtils.java @@ -16,12 +16,18 @@ package com.android.internal.util; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Bitmap.CompressFormat; +import android.net.Uri; +import android.util.Base64; import android.util.Xml; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -1415,6 +1421,20 @@ public class XmlUtils { out.attribute(null, name, Long.toString(value)); } + public static float readFloatAttribute(XmlPullParser in, String name) throws IOException { + final String value = in.getAttributeValue(null, name); + try { + return Float.parseFloat(value); + } catch (NumberFormatException e) { + throw new ProtocolException("problem parsing " + name + "=" + value + " as long"); + } + } + + public static void writeFloatAttribute(XmlSerializer out, String name, float value) + throws IOException { + out.attribute(null, name, Float.toString(value)); + } + public static boolean readBooleanAttribute(XmlPullParser in, String name) { final String value = in.getAttributeValue(null, name); return Boolean.parseBoolean(value); @@ -1425,6 +1445,63 @@ public class XmlUtils { out.attribute(null, name, Boolean.toString(value)); } + public static Uri readUriAttribute(XmlPullParser in, String name) { + final String value = in.getAttributeValue(null, name); + return (value != null) ? Uri.parse(value) : null; + } + + public static void writeUriAttribute(XmlSerializer out, String name, Uri value) + throws IOException { + if (value != null) { + out.attribute(null, name, value.toString()); + } + } + + public static String readStringAttribute(XmlPullParser in, String name) { + return in.getAttributeValue(null, name); + } + + public static void writeStringAttribute(XmlSerializer out, String name, String value) + throws IOException { + if (value != null) { + out.attribute(null, name, value); + } + } + + public static byte[] readByteArrayAttribute(XmlPullParser in, String name) { + final String value = in.getAttributeValue(null, name); + if (value != null) { + return Base64.decode(value, Base64.DEFAULT); + } else { + return null; + } + } + + public static void writeByteArrayAttribute(XmlSerializer out, String name, byte[] value) + throws IOException { + if (value != null) { + out.attribute(null, name, Base64.encodeToString(value, Base64.DEFAULT)); + } + } + + public static Bitmap readBitmapAttribute(XmlPullParser in, String name) { + final byte[] value = readByteArrayAttribute(in, name); + if (value != null) { + return BitmapFactory.decodeByteArray(value, 0, value.length); + } else { + return null; + } + } + + public static void writeBitmapAttribute(XmlSerializer out, String name, Bitmap value) + throws IOException { + if (value != null) { + final ByteArrayOutputStream os = new ByteArrayOutputStream(); + value.compress(CompressFormat.PNG, 90, os); + writeByteArrayAttribute(out, name, os.toByteArray()); + } + } + /** @hide */ public interface WriteMapCallback { /** diff --git a/core/java/com/android/internal/widget/ActionBarContainer.java b/core/java/com/android/internal/widget/ActionBarContainer.java index 790b611..9e24844 100644 --- a/core/java/com/android/internal/widget/ActionBarContainer.java +++ b/core/java/com/android/internal/widget/ActionBarContainer.java @@ -16,10 +16,12 @@ package com.android.internal.widget; +import android.annotation.NonNull; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.ColorFilter; +import android.graphics.Outline; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.ActionMode; @@ -324,18 +326,36 @@ public class ActionBarContainer extends FrameLayout { * projection surfaces. */ private class ActionBarBackgroundDrawable extends Drawable { - @Override - public void draw(Canvas canvas) { + private Drawable getDrawable() { if (mIsSplit) { - if (mSplitBackground != null) mSplitBackground.draw(canvas); + if (mSplitBackground != null) { + return mSplitBackground; + } } else { if (mBackground != null) { - mBackground.draw(canvas); + return mBackground; } if (mStackedBackground != null && mIsStacked) { - mStackedBackground.draw(canvas); + return mStackedBackground; } } + return null; + } + + @Override + public void draw(Canvas canvas) { + final Drawable drawable = getDrawable(); + if (drawable != null) { + drawable.draw(canvas); + } + } + + @Override + public void getOutline(@NonNull Outline outline) { + final Drawable drawable = getDrawable(); + if (drawable != null) { + drawable.getOutline(outline); + } } @Override diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index a890eb4..2ce1b15 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -353,7 +353,7 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding ninePatchInsets = env->NewObject(gInsetStruct_class, gInsetStruct_constructorMethodID, peeker.mOpticalInsets[0], peeker.mOpticalInsets[1], peeker.mOpticalInsets[2], peeker.mOpticalInsets[3], peeker.mOutlineInsets[0], peeker.mOutlineInsets[1], peeker.mOutlineInsets[2], peeker.mOutlineInsets[3], - peeker.mOutlineRadius, peeker.mOutlineFilled, scale); + peeker.mOutlineRadius, peeker.mOutlineAlpha, scale); if (javaBitmap != NULL) { env->SetObjectField(javaBitmap, gBitmap_ninePatchInsetsFieldID, ninePatchInsets); } @@ -589,7 +589,7 @@ int register_android_graphics_BitmapFactory(JNIEnv* env) { "Landroid/graphics/NinePatch$InsetStruct;"); gInsetStruct_class = (jclass) env->NewGlobalRef(env->FindClass("android/graphics/NinePatch$InsetStruct")); - gInsetStruct_constructorMethodID = env->GetMethodID(gInsetStruct_class, "<init>", "(IIIIIIIIFZF)V"); + gInsetStruct_constructorMethodID = env->GetMethodID(gInsetStruct_class, "<init>", "(IIIIIIIIFIF)V"); int ret = AndroidRuntime::registerNativeMethods(env, "android/graphics/BitmapFactory$Options", diff --git a/core/jni/android/graphics/NinePatchPeeker.cpp b/core/jni/android/graphics/NinePatchPeeker.cpp index ea5193b..1dafa1b 100644 --- a/core/jni/android/graphics/NinePatchPeeker.cpp +++ b/core/jni/android/graphics/NinePatchPeeker.cpp @@ -48,11 +48,11 @@ bool NinePatchPeeker::peek(const char tag[], const void* data, size_t length) { } else if (!strcmp("npLb", tag) && length == sizeof(int32_t) * 4) { mHasInsets = true; memcpy(&mOpticalInsets, data, sizeof(int32_t) * 4); - } else if (!strcmp("npOl", tag) && length == 24) { // 4 int32_ts, 1 float, 1 int32_t sized bool + } else if (!strcmp("npOl", tag) && length == 24) { // 4 int32_ts, 1 float, 1 int32_t sized byte mHasInsets = true; memcpy(&mOutlineInsets, data, sizeof(int32_t) * 4); mOutlineRadius = ((const float*)data)[4]; - mOutlineFilled = ((const int32_t*)data)[5] & 0x01; + mOutlineAlpha = ((const int32_t*)data)[5] & 0xff; } return true; // keep on decoding } diff --git a/core/jni/android/graphics/NinePatchPeeker.h b/core/jni/android/graphics/NinePatchPeeker.h index 8d3e6cf..7c18b2d 100644 --- a/core/jni/android/graphics/NinePatchPeeker.h +++ b/core/jni/android/graphics/NinePatchPeeker.h @@ -33,7 +33,7 @@ public: , mPatchSize(0) , mHasInsets(false) , mOutlineRadius(0) - , mOutlineFilled(false) { + , mOutlineAlpha(0) { memset(mOpticalInsets, 0, 4 * sizeof(int32_t)); memset(mOutlineInsets, 0, 4 * sizeof(int32_t)); } @@ -50,7 +50,7 @@ public: int32_t mOpticalInsets[4]; int32_t mOutlineInsets[4]; float mOutlineRadius; - bool mOutlineFilled; + uint8_t mOutlineAlpha; }; #endif // NinePatchPeeker_h diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp index ff54fb9..1e9d722 100644 --- a/core/jni/android_view_RenderNode.cpp +++ b/core/jni/android_view_RenderNode.cpp @@ -140,18 +140,19 @@ static jboolean android_view_RenderNode_setProjectionReceiver(JNIEnv* env, static jboolean android_view_RenderNode_setOutlineRoundRect(JNIEnv* env, jobject clazz, jlong renderNodePtr, jint left, jint top, - jint right, jint bottom, jfloat radius) { + jint right, jint bottom, jfloat radius, jfloat alpha) { RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); - renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom, radius); + renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom, + radius, alpha); renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); return true; } static jboolean android_view_RenderNode_setOutlineConvexPath(JNIEnv* env, - jobject clazz, jlong renderNodePtr, jlong outlinePathPtr) { + jobject clazz, jlong renderNodePtr, jlong outlinePathPtr, jfloat alpha) { RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); SkPath* outlinePath = reinterpret_cast<SkPath*>(outlinePathPtr); - renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath); + renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath, alpha); renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); return true; } @@ -480,8 +481,8 @@ static JNINativeMethod gMethods[] = { { "nSetProjectBackwards", "(JZ)Z", (void*) android_view_RenderNode_setProjectBackwards }, { "nSetProjectionReceiver","(JZ)Z", (void*) android_view_RenderNode_setProjectionReceiver }, - { "nSetOutlineRoundRect", "(JIIIIF)Z", (void*) android_view_RenderNode_setOutlineRoundRect }, - { "nSetOutlineConvexPath", "(JJ)Z", (void*) android_view_RenderNode_setOutlineConvexPath }, + { "nSetOutlineRoundRect", "(JIIIIFF)Z", (void*) android_view_RenderNode_setOutlineRoundRect }, + { "nSetOutlineConvexPath", "(JJF)Z", (void*) android_view_RenderNode_setOutlineConvexPath }, { "nSetOutlineEmpty", "(J)Z", (void*) android_view_RenderNode_setOutlineEmpty }, { "nSetOutlineNone", "(J)Z", (void*) android_view_RenderNode_setOutlineNone }, { "nSetClipToOutline", "(JZ)Z", (void*) android_view_RenderNode_setClipToOutline }, diff --git a/core/res/res/drawable-hdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-hdpi/stat_notify_wifi_in_range.png Binary files differdeleted file mode 100644 index 8148ab8..0000000 --- a/core/res/res/drawable-hdpi/stat_notify_wifi_in_range.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/stat_sys_tether_wifi.png b/core/res/res/drawable-hdpi/stat_sys_tether_wifi.png Binary files differdeleted file mode 100644 index 7d4df50..0000000 --- a/core/res/res/drawable-hdpi/stat_sys_tether_wifi.png +++ /dev/null diff --git a/core/res/res/drawable-ldpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-ldpi/stat_notify_wifi_in_range.png Binary files differdeleted file mode 100644 index 1ff50ea..0000000 --- a/core/res/res/drawable-ldpi/stat_notify_wifi_in_range.png +++ /dev/null diff --git a/core/res/res/drawable-ldpi/stat_sys_tether_wifi.png b/core/res/res/drawable-ldpi/stat_sys_tether_wifi.png Binary files differdeleted file mode 100644 index b4b3cfd..0000000 --- a/core/res/res/drawable-ldpi/stat_sys_tether_wifi.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-mdpi/stat_notify_wifi_in_range.png Binary files differdeleted file mode 100644 index b7e2a6a..0000000 --- a/core/res/res/drawable-mdpi/stat_notify_wifi_in_range.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/stat_sys_tether_wifi.png b/core/res/res/drawable-mdpi/stat_sys_tether_wifi.png Binary files differdeleted file mode 100644 index 869ad35..0000000 --- a/core/res/res/drawable-mdpi/stat_sys_tether_wifi.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.png Binary files differdeleted file mode 100644 index 0dbae57..0000000 --- a/core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/stat_sys_tether_wifi.png b/core/res/res/drawable-xhdpi/stat_sys_tether_wifi.png Binary files differdeleted file mode 100644 index dc48646..0000000 --- a/core/res/res/drawable-xhdpi/stat_sys_tether_wifi.png +++ /dev/null diff --git a/core/res/res/drawable-xxhdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-xxhdpi/stat_notify_wifi_in_range.png Binary files differdeleted file mode 100644 index 47e74fb..0000000 --- a/core/res/res/drawable-xxhdpi/stat_notify_wifi_in_range.png +++ /dev/null diff --git a/core/res/res/drawable-xxhdpi/stat_sys_tether_wifi.png b/core/res/res/drawable-xxhdpi/stat_sys_tether_wifi.png Binary files differdeleted file mode 100644 index da44e6a..0000000 --- a/core/res/res/drawable-xxhdpi/stat_sys_tether_wifi.png +++ /dev/null diff --git a/core/res/res/drawable/stat_notify_wifi_in_range.xml b/core/res/res/drawable/stat_notify_wifi_in_range.xml new file mode 100644 index 0000000..9a5407d --- /dev/null +++ b/core/res/res/drawable/stat_notify_wifi_in_range.xml @@ -0,0 +1,27 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="26.0dp" + android:height="24.0dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M19.100000,14.000000l-3.400000,0.000000l0.000000,-1.500000c0.000000,-1.800000 0.800000,-2.800000 1.500000,-3.400000C18.100000,8.300000 19.200001,8.000000 20.600000,8.000000c1.200000,0.000000 2.300000,0.300000 3.100000,0.800000l1.900000,-2.300000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.500000,-8.100000L19.100000,14.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.500000,17.799999c0.000000,-0.800000 0.100000,-1.300000 0.200000,-1.600000c0.200000,-0.300000 0.500000,-0.700000 1.100000,-1.200000c0.400000,-0.400000 0.700000,-0.800000 1.000000,-1.100000s0.400000,-0.800000 0.400000,-1.200000c0.000000,-0.500000 -0.100000,-0.900000 -0.400000,-1.200000c-0.300000,-0.300000 -0.700000,-0.400000 -1.200000,-0.400000c-0.400000,0.000000 -0.800000,0.100000 -1.100000,0.300000c-0.300000,0.200000 -0.400000,0.600000 -0.400000,1.100000l-1.900000,0.000000c0.000000,-1.000000 0.300000,-1.700000 1.000000,-2.200000c0.600000,-0.500000 1.500000,-0.800000 2.500000,-0.800000c1.100000,0.000000 2.000000,0.300000 2.600000,0.800000c0.600000,0.500000 0.900000,1.300000 0.900000,2.300000c0.000000,0.700000 -0.200000,1.300000 -0.600000,1.800000c-0.400000,0.600000 -0.900000,1.100000 -1.500000,1.600000c-0.300000,0.300000 -0.500000,0.500000 -0.600000,0.700000c-0.100000,0.200000 -0.100000,0.600000 -0.100000,1.000000L19.500000,17.700001zM21.400000,21.000000l-1.900000,0.000000l0.000000,-1.800000l1.900000,0.000000L21.400000,21.000000z"/> +</vector> diff --git a/core/res/res/drawable/stat_sys_tether_wifi.xml b/core/res/res/drawable/stat_sys_tether_wifi.xml new file mode 100644 index 0000000..a816db8 --- /dev/null +++ b/core/res/res/drawable/stat_sys_tether_wifi.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="26.0dp" + android:height="24.0dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> +</vector> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 5cb3068..a31f18f 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -464,24 +464,48 @@ <attr name="windowEnterTransition" format="reference"/> <!-- Reference to a Transition XML resource defining the desired Transition + used to move Views out of the scene when the Window is + preparing to close. Corresponds to + {@link android.view.Window#setReturnTransition(android.transition.Transition)}. --> + <attr name="windowReturnTransition" format="reference"/> + + <!-- Reference to a Transition XML resource defining the desired Transition used to move Views out of the Window's content Scene when launching a new Activity. Corresponds to {@link android.view.Window#setExitTransition(android.transition.Transition)}. --> <attr name="windowExitTransition" format="reference"/> <!-- Reference to a Transition XML resource defining the desired Transition + used to move Views in to the scene when returning from a previously-started Activity. + Corresponds to + {@link android.view.Window#setReenterTransition(android.transition.Transition)}. --> + <attr name="windowReenterTransition" format="reference"/> + + <!-- Reference to a Transition XML resource defining the desired Transition used to move shared elements transferred into the Window's initial content Scene. Corresponds to {@link android.view.Window#setSharedElementEnterTransition( android.transition.Transition)}. --> <attr name="windowSharedElementEnterTransition" format="reference"/> <!-- Reference to a Transition XML resource defining the desired Transition + used to move shared elements transferred back to a calling Activity. + Corresponds to {@link android.view.Window#setSharedElementReturnTransition( + android.transition.Transition)}. --> + <attr name="windowSharedElementReturnTransition" format="reference"/> + + <!-- Reference to a Transition XML resource defining the desired Transition used when starting a new Activity to move shared elements prior to transferring to the called Activity. Corresponds to {@link android.view.Window#setSharedElementExitTransition( android.transition.Transition)}. --> <attr name="windowSharedElementExitTransition" format="reference"/> + <!-- Reference to a Transition XML resource defining the desired Transition + used for shared elements transferred back to a calling Activity. + Corresponds to {@link android.view.Window#setSharedElementReenterTransition( + android.transition.Transition)}. --> + <attr name="windowSharedElementReenterTransition" format="reference"/> + <!-- Flag indicating whether this Window's transition should overlap with the exiting transition of the calling Activity. Corresponds to {@link android.view.Window#setAllowEnterTransitionOverlap(boolean)}. --> @@ -1751,30 +1775,54 @@ or a fraction of the screen size in that dimension. --> <attr name="windowFixedHeightMajor" format="dimension|fraction" /> <attr name="windowOutsetBottom" format="dimension" /> - <!-- Reference to a TransitionManager XML resource defining the desired Transition + <!-- Reference to a Transition XML resource defining the desired Transition used to move Views into the initial Window's content Scene. Corresponds to {@link android.view.Window#setEnterTransition(android.transition.Transition)}. --> <attr name="windowEnterTransition"/> - <!-- Reference to a TransitionManager XML resource defining the desired Transition + <!-- Reference to a Transition XML resource defining the desired Transition + used to move Views out of the scene when the Window is + preparing to close. Corresponds to + {@link android.view.Window#setReturnTransition(android.transition.Transition)}. --> + <attr name="windowReturnTransition"/> + + <!-- Reference to a Transition XML resource defining the desired Transition used to move Views out of the Window's content Scene when launching a new Activity. Corresponds to {@link android.view.Window#setExitTransition(android.transition.Transition)}. --> <attr name="windowExitTransition"/> - <!-- Reference to a TransitionManager XML resource defining the desired Transition + <!-- Reference to a Transition XML resource defining the desired Transition + used to move Views in to the scene when returning from a previously-started Activity. + Corresponds to + {@link android.view.Window#setReenterTransition(android.transition.Transition)}. --> + <attr name="windowReenterTransition"/> + + <!-- Reference to a Transition XML resource defining the desired Transition used to move shared elements transferred into the Window's initial content Scene. Corresponds to {@link android.view.Window#setSharedElementEnterTransition( android.transition.Transition)}. --> <attr name="windowSharedElementEnterTransition"/> - <!-- Reference to a TransitionManager XML resource defining the desired Transition + <!-- Reference to a Transition XML resource defining the desired Transition + used to move shared elements transferred back to a calling Activity. + Corresponds to {@link android.view.Window#setSharedElementReturnTransition( + android.transition.Transition)}. --> + <attr name="windowSharedElementReturnTransition"/> + + <!-- Reference to a Transition XML resource defining the desired Transition used when starting a new Activity to move shared elements prior to transferring to the called Activity. Corresponds to {@link android.view.Window#setSharedElementExitTransition( android.transition.Transition)}. --> <attr name="windowSharedElementExitTransition"/> + <!-- Reference to a Transition XML resource defining the desired Transition + used for shared elements transferred back to a calling Activity. + Corresponds to {@link android.view.Window#setSharedElementReenterTransition( + android.transition.Transition)}. --> + <attr name="windowSharedElementReenterTransition"/> + <!-- Flag indicating whether this Window's transition should overlap with the exiting transition of the calling Activity. Corresponds to @@ -7211,7 +7259,9 @@ <!-- Component name of an activity that allows the user to modify the settings for this service. --> <attr name="settingsActivity" /> - <!-- Type of this service. --> + <!-- Component name of an xml file that describes the structure of TV content ratings that + this service uses. --> + <attr name="contentRatingSystemXml" format="reference" /> </declare-styleable> <declare-styleable name="ResolverDrawerLayout"> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 217658c..b9e5c66 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1661,4 +1661,8 @@ <!--Support decoding the user data payload as pack GSM 8-bit (a GSM alphabet string that's stored in 8-bit unpacked format) characters.--> <bool translatable="false" name="config_sms_decode_gsm_8bit_data">false</bool> + + <!-- Package name providing WebView implementation. --> + <string name="config_webViewPackageName" translatable="false">com.android.webview</string> + </resources> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 0cb14e3..08398f0 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2265,6 +2265,10 @@ <public type="attr" name="windowClipToOutline" /> <public type="attr" name="datePickerDialogTheme" /> <public type="attr" name="showText" /> + <public type="attr" name="windowReturnTransition" /> + <public type="attr" name="windowReenterTransition" /> + <public type="attr" name="windowSharedElementReturnTransition" /> + <public type="attr" name="windowSharedElementReenterTransition" /> <public-padding type="dimen" name="l_resource_pad" end="0x01050010" /> @@ -2556,4 +2560,6 @@ <public type="raw" name="loaderror" id="0x01100000"/> <!-- WebView error page for when domain lookup fails. @hide @SystemApi --> <public type="raw" name="nodomain"/> + + <public type="attr" name="contentRatingSystemXml"/> </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 11c41e3..195851f 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -3754,10 +3754,10 @@ <!-- DO NOT TRANSLATE --> <string name="locale_replacement">""</string> - <!-- Title of the pop-up dialog in which the user switches input method components. --> - <string name="select_input_method">Choose input method</string> - <!-- Title of a button to open the settings for input methods [CHAR LIMIT=30] --> - <string name="configure_input_methods">Set up input methods</string> + <!-- Title of the pop-up dialog in which the user switches keyboard, also known as input method. --> + <string name="select_input_method">Change keyboard</string> + <!-- Title of a button to open the settings to enable or disable keyboards, also known as input methods [CHAR LIMIT=30] --> + <string name="configure_input_methods">Choose keyboards</string> <!-- Summary text of a toggle switch to enable/disable use of the physical keyboard in the input method selector [CHAR LIMIT=25] --> <string name="use_physical_keyboard">Physical keyboard</string> <!-- Title of the physical keyboard category in the input method selector [CHAR LIMIT=10] --> @@ -4841,4 +4841,41 @@ <!-- Lock-to-app unlock password string --> <string name="lock_to_app_unlock_password">password</string> + <string name="display_name_ustvpg" translatable="false">US-TV</string> + <string name="description_ustvpg">The TV Parental Guidelines</string> + <string name="display_name_krtv" translatable="false">KR-TV</string> + + <string name="display_name_ustvpg_d" translatable="false">D</string> + <string name="display_name_ustvpg_l" translatable="false">L</string> + <string name="display_name_ustvpg_s" translatable="false">S</string> + <string name="display_name_ustvpg_v" translatable="false">V</string> + <string name="display_name_ustvpg_fv" translatable="false">FV</string> + <string name="display_name_ustvpg_y" translatable="false">TV-Y</string> + <string name="display_name_ustvpg_y7" translatable="false">TV-Y7</string> + <string name="display_name_ustvpg_g" translatable="false">TV-G</string> + <string name="display_name_ustvpg_pg" translatable="false">TV-PG</string> + <string name="display_name_ustvpg_14" translatable="false">TV-14</string> + <string name="display_name_ustvpg_ma" translatable="false">TV-MA</string> + <string name="display_name_krtv_all" translatable="false">모든연령시청가</string> + <string name="display_name_krtv_7" translatable="false">7세이상시청가</string> + <string name="display_name_krtv_12" translatable="false">12세이상시청가</string> + <string name="display_name_krtv_15" translatable="false">15세이상시청가</string> + <string name="display_name_krtv_19" translatable="false">19세이상시청가</string> + + <string name="description_ustvpg_d">Suggestive dialogue (Usually means talks about sex)</string> + <string name="description_ustvpg_l">Coarse language</string> + <string name="description_ustvpg_s">Sexual content</string> + <string name="description_ustvpg_v">Violence</string> + <string name="description_ustvpg_fv">Fantasy violence (Children\'s programming only)</string> + <string name="description_ustvpg_y">This program is designed to be appropriate for all children.</string> + <string name="description_ustvpg_y7">This program is designed for children age 7 and above.</string> + <string name="description_ustvpg_g">Most parents would find this program suitable for all ages.</string> + <string name="description_ustvpg_pg">This program contains material that parents may find unsuitable for younger children.</string> + <string name="description_ustvpg_14">This program contains some material that many parents would find unsuitable for children under 14 years of age.</string> + <string name="description_ustvpg_ma">This program is specifically designed to be viewed by adults and therefore may be unsuitable for children under 17.</string> + <string name="description_krtv_all">모든 연령의 시청자가 시청하기에 부적절한 내용이 없는 등급을 말한다.</string> + <string name="description_krtv_7">7세미만의 어린이가 시청하기에 부적절한 내용이 포함되어 있어 보호자의 시청지도가 필요한 등급을 말한다.</string> + <string name="description_krtv_12">12세미만의 청소년이 시청하기에 부적절한 내용이 포함되어 있어 보호자의 시청지도가 필요한 등급을 말한다.</string> + <string name="description_krtv_15">15세미만의 청소년이 시청하기에 부적절한 내용이 포함되어 있어 보호자의 시청지도가 필요한 등급을 말한다.</string> + <string name="description_krtv_19">19세미만의 청소년이 시청하기에 부적절한 내용이 포함되어 있어 청소년이 시청할 수 없는 등급을 말한다.</string> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 6e23557..ccd7005 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1259,6 +1259,7 @@ <java-symbol type="xml" name="audio_assets" /> <java-symbol type="xml" name="global_keys" /> <java-symbol type="xml" name="default_zen_mode_config" /> + <java-symbol type="xml" name="tv_content_rating_systems" /> <java-symbol type="raw" name="accessibility_gestures" /> <java-symbol type="raw" name="incognito_mode_start_page" /> @@ -1838,6 +1839,7 @@ <java-symbol type="attr" name="actionModeWebSearchDrawable" /> <java-symbol type="string" name="websearch" /> <java-symbol type="drawable" name="ic_media_video_poster" /> + <java-symbol type="string" name="config_webViewPackageName" /> <!-- From SubtitleView --> <java-symbol type="dimen" name="subtitle_corner_radius" /> diff --git a/core/res/res/xml/tv_content_rating_systems.xml b/core/res/res/xml/tv_content_rating_systems.xml new file mode 100644 index 0000000..238ce13 --- /dev/null +++ b/core/res/res/xml/tv_content_rating_systems.xml @@ -0,0 +1,127 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<rating-system-definitions> + <rating-system-definition id="US_TVPG" + displayName="@string/display_name_ustvpg" + description="@string/description_ustvpg" + country="US"> + <sub-rating-definition id="US_TVPG_D" + displayName="@string/display_name_ustvpg_d" + description="@string/description_ustvpg_d" /> + <sub-rating-definition id="US_TVPG_L" + displayName="@string/display_name_ustvpg_l" + description="@string/description_ustvpg_l" /> + <sub-rating-definition id="US_TVPG_S" + displayName="@string/display_name_ustvpg_s" + description="@string/description_ustvpg_s" /> + <sub-rating-definition id="US_TVPG_V" + displayName="@string/display_name_ustvpg_v" + description="@string/description_ustvpg_v" /> + <sub-rating-definition id="US_TVPG_FV" + displayName="@string/display_name_ustvpg_fv" + description="@string/description_ustvpg_fv" /> + + <rating-definition id="US_TVPG_TV_Y" + displayName="@string/display_name_ustvpg_y" + description="@string/description_ustvpg_y" + ageHint="0" /> + <rating-definition id="US_TVPG_TV_Y7" + displayName="@string/display_name_ustvpg_y7" + description="@string/description_ustvpg_y7" + ageHint="7"> + <sub-rating id="US_TVPG_FV" /> + </rating-definition> + <rating-definition id="US_TVPG_TV_G" + displayName="@string/display_name_ustvpg_g" + description="@string/description_ustvpg_g" + ageHint="0" /> + <rating-definition id="US_TVPG_TV_PG" + displayName="@string/display_name_ustvpg_pg" + description="@string/description_ustvpg_pg" + ageHint="14"> + <sub-rating id="US_TVPG_D" /> + <sub-rating id="US_TVPG_L" /> + <sub-rating id="US_TVPG_S" /> + <sub-rating id="US_TVPG_V" /> + </rating-definition> + <rating-definition id="US_TVPG_TV_14" + displayName="@string/display_name_ustvpg_14" + description="@string/description_ustvpg_14" + ageHint="14"> + <sub-rating id="US_TVPG_D" /> + <sub-rating id="US_TVPG_L" /> + <sub-rating id="US_TVPG_S" /> + <sub-rating id="US_TVPG_V" /> + </rating-definition> + <rating-definition id="US_TVPG_TV_MA" + displayName="@string/display_name_ustvpg_ma" + description="@string/description_ustvpg_ma" + ageHint="17"> + <sub-rating id="US_TVPG_L" /> + <sub-rating id="US_TVPG_S" /> + <sub-rating id="US_TVPG_V" /> + </rating-definition> + <order> + <rating id="US_TVPG_Y" /> + <rating id="US_TVPG_Y7" /> + </order> + <order> + <rating id="US_TVPG_TV_G" /> + <rating id="US_TVPG_TV_PG" /> + <rating id="US_TVPG_TV_14" /> + <rating id="US_TVPG_TV_MA" /> + </order> + </rating-system-definition> + + <rating-system-definition id="KR_TV" + displayName="@string/display_name_krtv" + country="KR"> + <rating-definition id="KR_TV_ALL" + displayName="@string/display_name_krtv_all" + description="@string/description_krtv_all" + ageHint="0" /> + <rating-definition id="KR_TV_7" + displayName="@string/display_name_krtv_7" + description="@string/description_krtv_7" + ageHint="7"> + </rating-definition> + <rating-definition id="KR_TV_12" + displayName="@string/display_name_krtv_12" + description="@string/description_krtv_12" + ageHint="12"> + </rating-definition> + <rating-definition id="KR_TV_15" + displayName="@string/display_name_krtv_15" + description="@string/description_krtv_15" + ageHint="15"> + </rating-definition> + <rating-definition id="KR_TV_19" + displayName="@string/display_name_krtv_19" + description="@string/description_krtv_19" + ageHint="19"> + </rating-definition> + <order> + <rating id="KR_TV_ALL" /> + <rating id="KR_TV_7" /> + <rating id="KR_TV_12" /> + <rating id="KR_TV_15" /> + <rating id="KR_TV_19" /> + </order> + </rating-system-definition> +</rating-system-definitions> diff --git a/docs/html/preview/preview_toc.cs b/docs/html/preview/preview_toc.cs index a505905..819976e 100644 --- a/docs/html/preview/preview_toc.cs +++ b/docs/html/preview/preview_toc.cs @@ -68,6 +68,8 @@ Recommendations</a></li> </ul> </li> + <li><a href="<?cs var:toroot ?>preview/tv/tif/index.html"> + TV Input Framework</a></li> <li><a href="<?cs var:toroot ?>preview/tv/games/index.html"> Games on TV</a></li> <li><a href="<?cs var:toroot ?>preview/tv/start/hardware-features.html"> diff --git a/docs/html/preview/tv/images/tif-overview.png b/docs/html/preview/tv/images/tif-overview.png Binary files differnew file mode 100644 index 0000000..197775e --- /dev/null +++ b/docs/html/preview/tv/images/tif-overview.png diff --git a/docs/html/preview/tv/tif/index.jd b/docs/html/preview/tv/tif/index.jd new file mode 100644 index 0000000..ef02def --- /dev/null +++ b/docs/html/preview/tv/tif/index.jd @@ -0,0 +1,38 @@ +page.title=TV Input Framework +page.tags=tif + +@jd:body + +<p> + Watching live television shows and other continuous, channel-based content is a big part of the + TV experience. Android supports receiving and playback of live video content through the TV Input + Framework. This framework provides a unified method for receiving audio and video channel content + from hardware sources, such as HDMI ports and built-in-tuners, and software sources, such as + video streamed over the internet. +</p> +<p> + The framework enables developers to define live TV input sources by implementing a TV input + service. This service publishes a list of channels and programs to the TV Provider. The live TV + app on a TV device gets the list of available channels and programs from the TV Provider and + displays them to a user. When a user selects a specific channel, the live TV app creates a + session for the associated TV input service through the TV Input Manager, and tells the TV input + service to tune to the requested channel and play the content to a display surface provided by + the TV app. +</p> + +<img src="{@docRoot}preview/tv/images/tif-overview.png" id="figure1"> +<p class="img-caption"> + <strong>Figure 1.</strong> Functional diagram of the TV Input Framework +</p> + +<p> + The TV Input Framework is designed to provide access to a wide variety of live TV input sources + and bring them together in a single user interface for users to browse, view, and enjoy content. + Building a TV input service for your content can help make it more accessible on TV devices. +</p> + +<p> + The APIs for the TV Input Framework are available in the L Developer Preview and you can + review them in the preview API reference docs. However, more changes are planned, so stay tuned + for additional information with the official Android platform launch. +</p> diff --git a/graphics/java/android/graphics/NinePatch.java b/graphics/java/android/graphics/NinePatch.java index 335bce0..3bccf08 100644 --- a/graphics/java/android/graphics/NinePatch.java +++ b/graphics/java/android/graphics/NinePatch.java @@ -43,7 +43,7 @@ public class NinePatch { @SuppressWarnings({"UnusedDeclaration"}) // called from JNI InsetStruct(int opticalLeft, int opticalTop, int opticalRight, int opticalBottom, int outlineLeft, int outlineTop, int outlineRight, int outlineBottom, - float outlineRadius, boolean outlineFilled, float decodeScale) { + float outlineRadius, int outlineAlpha, float decodeScale) { opticalRect = new Rect(opticalLeft, opticalTop, opticalRight, opticalBottom); outlineRect = new Rect(outlineLeft, outlineTop, outlineRight, outlineBottom); @@ -55,13 +55,13 @@ public class NinePatch { outlineRect.scaleRoundIn(decodeScale); } this.outlineRadius = outlineRadius * decodeScale; - this.outlineFilled = outlineFilled; + this.outlineAlpha = outlineAlpha / 255.0f; } public final Rect opticalRect; public final Rect outlineRect; public final float outlineRadius; - public final boolean outlineFilled; + public final float outlineAlpha; } private final Bitmap mBitmap; diff --git a/graphics/java/android/graphics/Outline.java b/graphics/java/android/graphics/Outline.java index 3a4c2a7..1cf5f37 100644 --- a/graphics/java/android/graphics/Outline.java +++ b/graphics/java/android/graphics/Outline.java @@ -37,9 +37,8 @@ public final class Outline { public Rect mRect; /** @hide */ public float mRadius; - /** @hide */ - public boolean mIsFilled; + public float mAlpha; /** * Constructs an empty Outline. Call one of the setter methods to make @@ -63,7 +62,6 @@ public final class Outline { mPath = null; mRect = null; mRadius = 0; - mIsFilled = true; } /** @@ -92,24 +90,24 @@ public final class Outline { } /** - * Sets whether the outline represents a fully opaque area. + * Sets the alpha represented by the Outline. * - * A filled outline is assumed, by the drawing system, to fully cover content beneath it, - * meaning content beneath may be optimized away. + * Content producing a fully opaque (alpha = 1.0f) outline is assumed, by the drawing system, + * to fully cover content beneath it, meaning content beneath may be optimized away. * * @hide */ - public void setFilled(boolean isFilled) { - mIsFilled = isFilled; + public void setAlpha(float alpha) { + mAlpha = alpha; } /** - * Returns whether the outline represents a fully opaque area. + * Sets the alpha represented by the Outline. * * @hide */ - public boolean isFilled() { - return !isEmpty() && mIsFilled; + public float getAlpha() { + return mAlpha; } /** @@ -132,7 +130,7 @@ public final class Outline { mRect.set(src.mRect); } mRadius = src.mRadius; - mIsFilled = src.mIsFilled; + mAlpha = src.mAlpha; } /** @@ -164,7 +162,6 @@ public final class Outline { mRect.set(left, top, right, bottom); mRadius = radius; mPath = null; - mIsFilled = true; } /** @@ -193,7 +190,6 @@ public final class Outline { mPath.reset(); mPath.addOval(left, top, right, bottom, Path.Direction.CW); mRect = null; - mIsFilled = true; } /** @@ -220,6 +216,5 @@ public final class Outline { mPath.set(convexPath); mRect = null; mRadius = -1.0f; - mIsFilled = true; } } diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java index acb34c2..df9f3c3 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -861,16 +861,14 @@ public abstract class Drawable { * This method is called by the default {@link android.view.ViewOutlineProvider} to define * the outline of the View. * <p> - * The default behavior defines the outline to be the bounding rectangle. Subclasses that wish - * to convey a different shape must override this method. - * - * @return true if this drawable actually has an outline, else false. The outline must be - * populated by the drawable if true is returned. + * The default behavior defines the outline to be the bounding rectangle of 0 alpha. + * Subclasses that wish to convey a different shape or alpha value must override this method. * * @see android.view.View#setOutlineProvider(android.view.ViewOutlineProvider) */ public void getOutline(@NonNull Outline outline) { outline.setRect(getBounds()); + outline.setAlpha(getAlpha() / 255.0f); } /** diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java index 4815586..a383aab 100644 --- a/graphics/java/android/graphics/drawable/GradientDrawable.java +++ b/graphics/java/android/graphics/drawable/GradientDrawable.java @@ -1413,6 +1413,7 @@ public class GradientDrawable extends Drawable { public void getOutline(Outline outline) { final GradientState st = mGradientState; final Rect bounds = getBounds(); + outline.setAlpha(mAlpha / 255.0f); switch (st.mShape) { case RECTANGLE: diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java index 073100a..d094ce4 100644 --- a/graphics/java/android/graphics/drawable/LayerDrawable.java +++ b/graphics/java/android/graphics/drawable/LayerDrawable.java @@ -595,12 +595,9 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { } /** - * Populates <code>outline</code> with the first available layer outline. - * Returns <code>true</code> if an outline is available, <code>false</code> - * otherwise. + * Populates <code>outline</code> with the first available (non-empty) layer outline. * * @param outline Outline in which to place the first available layer outline - * @return <code>true</code> if an outline is available */ @Override public void getOutline(@NonNull Outline outline) { diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java index 6afce41..3397e94 100644 --- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java +++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java @@ -296,7 +296,7 @@ public class NinePatchDrawable extends Drawable { bounds.right - outlineInsets.right, bounds.bottom - outlineInsets.bottom, insets.outlineRadius); - outline.setFilled(insets.outlineFilled); + outline.setAlpha(insets.outlineAlpha * (getAlpha() / 255.0f)); return; } } diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java index eb7291c..cf675ed 100644 --- a/graphics/java/android/graphics/drawable/RippleDrawable.java +++ b/graphics/java/android/graphics/drawable/RippleDrawable.java @@ -585,11 +585,9 @@ public class RippleDrawable extends LayerDrawable { /** * Populates <code>outline</code> with the first available layer outline, - * excluding the mask layer. Returns <code>true</code> if an outline is - * available, <code>false</code> otherwise. + * excluding the mask layer. * * @param outline Outline in which to place the first available layer outline - * @return <code>true</code> if an outline is available */ @Override public void getOutline(@NonNull Outline outline) { diff --git a/graphics/java/android/graphics/drawable/ShapeDrawable.java b/graphics/java/android/graphics/drawable/ShapeDrawable.java index 2bed3b0..394f584 100644 --- a/graphics/java/android/graphics/drawable/ShapeDrawable.java +++ b/graphics/java/android/graphics/drawable/ShapeDrawable.java @@ -470,6 +470,7 @@ public class ShapeDrawable extends Drawable { public void getOutline(Outline outline) { if (mShapeState.mShape != null) { mShapeState.mShape.getOutline(outline); + outline.setAlpha(getAlpha() / 255.0f); } } diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java index f41b11a..be02c9b 100644 --- a/graphics/java/android/graphics/drawable/VectorDrawable.java +++ b/graphics/java/android/graphics/drawable/VectorDrawable.java @@ -364,13 +364,19 @@ public class VectorDrawable extends Drawable { /** @hide */ public static VectorDrawable create(Resources resources, int rid) { try { - final XmlPullParser xpp = resources.getXml(rid); - final AttributeSet attrs = Xml.asAttributeSet(xpp); - final XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); - factory.setNamespaceAware(true); + final XmlPullParser parser = resources.getXml(rid); + final AttributeSet attrs = Xml.asAttributeSet(parser); + int type; + while ((type=parser.next()) != XmlPullParser.START_TAG && + type != XmlPullParser.END_DOCUMENT) { + // Empty loop + } + if (type != XmlPullParser.START_TAG) { + throw new XmlPullParserException("No start tag found"); + } final VectorDrawable drawable = new VectorDrawable(); - drawable.inflate(resources, xpp, attrs); + drawable.inflate(resources, parser, attrs); return drawable; } catch (XmlPullParserException e) { @@ -436,10 +442,10 @@ public class VectorDrawable extends Drawable { if (pathRenderer.mViewportWidth <= 0) { throw new XmlPullParserException(a.getPositionDescription() + - "<viewport> tag requires viewportWidth > 0"); + "<vector> tag requires viewportWidth > 0"); } else if (pathRenderer.mViewportHeight <= 0) { throw new XmlPullParserException(a.getPositionDescription() + - "<viewport> tag requires viewportHeight > 0"); + "<vector> tag requires viewportHeight > 0"); } pathRenderer.mBaseWidth = a.getDimension( @@ -449,10 +455,10 @@ public class VectorDrawable extends Drawable { if (pathRenderer.mBaseWidth <= 0) { throw new XmlPullParserException(a.getPositionDescription() + - "<size> tag requires width > 0"); + "<vector> tag requires width > 0"); } else if (pathRenderer.mBaseHeight <= 0) { throw new XmlPullParserException(a.getPositionDescription() + - "<size> tag requires height > 0"); + "<vector> tag requires height > 0"); } } diff --git a/libs/hwui/Outline.h b/libs/hwui/Outline.h index 83426e8..6dacd5e 100644 --- a/libs/hwui/Outline.h +++ b/libs/hwui/Outline.h @@ -28,18 +28,20 @@ public: Outline() : mShouldClip(false) , mType(kOutlineType_None) - , mRadius(0) {} + , mRadius(0) + , mAlpha(0.0f) {} - void setRoundRect(int left, int top, int right, int bottom, float radius) { + void setRoundRect(int left, int top, int right, int bottom, float radius, float alpha) { mType = kOutlineType_RoundRect; mBounds.set(left, top, right, bottom); mRadius = radius; mPath.reset(); mPath.addRoundRect(SkRect::MakeLTRB(left, top, right, bottom), radius, radius); + mAlpha = alpha; } - void setConvexPath(const SkPath* outline) { + void setConvexPath(const SkPath* outline, float alpha) { if (!outline) { setEmpty(); return; @@ -47,22 +49,29 @@ public: mType = kOutlineType_ConvexPath; mPath = *outline; mBounds.set(outline->getBounds()); + mAlpha = alpha; } void setEmpty() { mType = kOutlineType_Empty; mPath.reset(); + mAlpha = 0.0f; } void setNone() { mType = kOutlineType_None; mPath.reset(); + mAlpha = 0.0f; } bool isEmpty() const { return mType == kOutlineType_Empty; } + float getAlpha() const { + return mAlpha; + } + void setShouldClip(bool clip) { mShouldClip = clip; } @@ -103,6 +112,7 @@ private: OutlineType mType; Rect mBounds; float mRadius; + float mAlpha; SkPath mPath; }; diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index 0662ca2..fa1b21d 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -594,7 +594,12 @@ void RenderNode::buildZSortedChildList(Vector<ZDrawRenderNodeOpPair>& zTranslate template <class T> void RenderNode::issueDrawShadowOperation(const Matrix4& transformFromParent, T& handler) { - if (properties().getAlpha() <= 0.0f || !properties().getOutline().getPath()) return; + if (properties().getAlpha() <= 0.0f + || properties().getOutline().getAlpha() <= 0.0f + || !properties().getOutline().getPath()) { + // no shadow to draw + return; + } mat4 shadowMatrixXY(transformFromParent); applyViewPropertyTransforms(shadowMatrixXY); @@ -607,8 +612,9 @@ void RenderNode::issueDrawShadowOperation(const Matrix4& transformFromParent, T& const SkPath* revealClipPath = properties().getRevealClip().getPath(); if (revealClipPath && revealClipPath->isEmpty()) return; + float casterAlpha = properties().getAlpha() * properties().getOutline().getAlpha(); DisplayListOp* shadowOp = new (handler.allocator()) DrawShadowOp( - shadowMatrixXY, shadowMatrixZ, properties().getAlpha(), + shadowMatrixXY, shadowMatrixZ, casterAlpha, outlinePath, revealClipPath); handler(shadowOp, PROPERTY_SAVECOUNT, properties().getClipToBounds()); } diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java index 099cd3f..1225fd1 100644 --- a/media/java/android/media/AudioAttributes.java +++ b/media/java/android/media/AudioAttributes.java @@ -19,6 +19,7 @@ package android.media; import android.annotation.IntDef; import android.os.Parcel; import android.os.Parcelable; +import android.text.TextUtils; import android.util.Log; import java.lang.annotation.Retention; @@ -257,12 +258,7 @@ public final class AudioAttributes implements Parcelable { aa.mSource = mSource; aa.mFlags = mFlags; aa.mTags = (HashSet<String>) mTags.clone(); - final Iterator<String> tagIterator = mTags.iterator(); - String allTagsInOne = new String(); - while (tagIterator.hasNext()) { - allTagsInOne += tagIterator.next() + ";"; - } - aa.mFormattedTags = allTagsInOne; + aa.mFormattedTags = TextUtils.join(";", mTags); return aa; } @@ -503,12 +499,14 @@ public final class AudioAttributes implements Parcelable { boolean hasFlattenedTags = ((in.readInt() & FLATTEN_TAGS) == FLATTEN_TAGS); mTags = new HashSet<String>(); if (hasFlattenedTags) { - mTags.add(in.readString()); + mFormattedTags = new String(in.readString()); + mTags.add(mFormattedTags); } else { String[] tagsArray = in.readStringArray(); for (int i = tagsArray.length - 1 ; i >= 0 ; i--) { mTags.add(tagsArray[i]); } + mFormattedTags = TextUtils.join(";", mTags); } } @@ -535,7 +533,7 @@ public final class AudioAttributes implements Parcelable { + " usage=" + mUsage + " content=" + mContentType + " flags=0x" + Integer.toHexString(mFlags).toUpperCase() - + " tags=" + mTags); + + " tags=" + mFormattedTags); } /** @hide */ diff --git a/media/java/android/media/tv/ITvInputManager.aidl b/media/java/android/media/tv/ITvInputManager.aidl index 41c4f07..a2b7d6b 100644 --- a/media/java/android/media/tv/ITvInputManager.aidl +++ b/media/java/android/media/tv/ITvInputManager.aidl @@ -38,6 +38,8 @@ interface ITvInputManager { List<TvInputInfo> getTvInputList(int userId); TvInputInfo getTvInputInfo(in String inputId, int userId); + List<Uri> getTvContentRatingSystemXmls(int userId); + void registerCallback(in ITvInputManagerCallback callback, int userId); void unregisterCallback(in ITvInputManagerCallback callback, int userId); @@ -56,7 +58,7 @@ interface ITvInputManager { void dispatchSurfaceChanged(in IBinder sessionToken, int format, int width, int height, int userId); void setVolume(in IBinder sessionToken, float volume, int userId); - void tune(in IBinder sessionToken, in Uri channelUri, int userId); + void tune(in IBinder sessionToken, in Uri channelUri, in Bundle params, int userId); void setCaptionEnabled(in IBinder sessionToken, boolean enabled, int userId); void selectTrack(in IBinder sessionToken, in TvTrackInfo track, int userId); void unselectTrack(in IBinder sessionToken, in TvTrackInfo track, int userId); diff --git a/media/java/android/media/tv/ITvInputSession.aidl b/media/java/android/media/tv/ITvInputSession.aidl index df14ad6..9a0be25 100644 --- a/media/java/android/media/tv/ITvInputSession.aidl +++ b/media/java/android/media/tv/ITvInputSession.aidl @@ -35,7 +35,7 @@ oneway interface ITvInputSession { // TODO: Remove this once it becomes irrelevant for applications to handle audio focus. The plan // is to introduce some new concepts that will solve a number of problems in audio policy today. void setVolume(float volume); - void tune(in Uri channelUri); + void tune(in Uri channelUri, in Bundle params); void setCaptionEnabled(boolean enabled); void selectTrack(in TvTrackInfo track); void unselectTrack(in TvTrackInfo track); diff --git a/media/java/android/media/tv/ITvInputSessionWrapper.java b/media/java/android/media/tv/ITvInputSessionWrapper.java index 9fb552c..a809da9 100644 --- a/media/java/android/media/tv/ITvInputSessionWrapper.java +++ b/media/java/android/media/tv/ITvInputSessionWrapper.java @@ -111,7 +111,9 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand return; } case DO_TUNE: { - mTvInputSessionImpl.tune((Uri) msg.obj); + SomeArgs args = (SomeArgs) msg.obj; + mTvInputSessionImpl.tune((Uri) args.arg1, (Bundle) args.arg2); + args.recycle(); return; } case DO_SET_CAPTION_ENABLED: { @@ -184,8 +186,8 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand } @Override - public void tune(Uri channelUri) { - mCaller.executeOrSendMessage(mCaller.obtainMessageO(DO_TUNE, channelUri)); + public void tune(Uri channelUri, Bundle params) { + mCaller.executeOrSendMessage(mCaller.obtainMessageOO(DO_TUNE, channelUri, params)); } @Override diff --git a/media/java/android/media/tv/TvContentRating.java b/media/java/android/media/tv/TvContentRating.java index 986a7d9..1ace775 100644 --- a/media/java/android/media/tv/TvContentRating.java +++ b/media/java/android/media/tv/TvContentRating.java @@ -17,149 +17,275 @@ package android.media.tv; import android.annotation.SystemApi; +import android.net.Uri; import android.text.TextUtils; -import android.util.ArrayMap; import android.util.Log; import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.Map; /** * A class representing a TV content rating. + * When a TV input service provides the content rating information of a program into TV provider, + * TvContentRating class will be used for generating the value of {@link + * TvContract.Programs#COLUMN_CONTENT_RATING}. To create an object of {@link TvContentRating}, use + * the {@link #createRating} method with valid arguments. The arguments could be a system defined + * strings, or a TV input service defined strings. + * TV input service defined strings are in an xml file defined in <code><{@link + * android.R.styleable#TvInputService tv-input}></code> with the {@link + * android.R.attr#contentRatingSystemXml contentRatingSystemXml} attribute by the TV input service. + * + * <h3> Content Rating System XML format </h3> + * The XML file for publishing content rating system should follow the DTD bellow: + * <p><pre class="prettyprint"> + * <?xml version="1.0" encoding="UTF-8"?> + * <!DOCTYPE rating-systems [ + * <!ELEMENT rating-system-definitions (rating-system-definition+)> + * <!ELEMENT rating-system-definition ( + * (sub-rating-definition*, rating-definition, sub-rating-definition*)+, order*)> + * <!ATTLIST rating-system-definition + * id ID #REQUIRED + * displayName CDATA #IMPLIED + * description CDATA #IMPLIED + * country CDATA #IMPLIED> + * <!ELEMENT sub-rating-definition EMPTY> + * <!ATTLIST sub-rating-definition + * id ID #REQUIRED + * displayName CDATA #IMPLIED + * icon CDATA #IMPLIED + * description CDATA #IMPLIED> + * <!ELEMENT rating-definition (sub-rating*))> + * <!ATTLIST rating-definition + * id ID #REQUIRED + * displayName CDATA #IMPLIED + * icon CDATA #IMPLIED + * description CDATA #IMPLIED> + * <!ELEMENT sub-rating EMPTY> + * <!ATTLIST sub-rating id IDREF #REQUIRED> + * <!ELEMENT order (rating, rating+)> + * <!ELEMENT rating EMPTY> + * <!ATTLIST rating id IDREF #REQUIRED> + * ]> + * </pre></p> + * + * <h3>System defined rating strings</h3> + * + * <u>System defined string for {@code domain}</u> + * <table border="0" cellspacing="0" cellpadding="0"> + * <tr> + * <td>String value</td> + * <td>Comments</td> + * </tr> + * <tr> + * <td>android.media.tv</td> + * <td>Used for creating system defined content ratings</td> + * </tr> + * </table> + * <u>System defined string for {@code ratingSystem}</u> + * <table border="0" cellspacing="0" cellpadding="0"> + * <tr> + * <td>String value</td> + * <td>Comments</td> + * </tr> + * <tr> + * <td>US_TVPG</td> + * <td>The TV Parental Guidelines for US TV content ratings</td> + * </tr> + * <tr> + * <td>KR_TV</td> + * <td>The South Korean television rating system</td> + * </tr> + * </table> + * + * <u>System defined string for {@code rating}</u> + * <table border="0" cellspacing="0" cellpadding="0"> + * <tr> + * <td>String value</td> + * <td>Comments</td> + * </tr> + * <tr> + * <td>US_TVPG_TV_Y</td> + * <td>A rating string for the US_TVPG domain. Programs rated this are designed to be + * appropriate for all children. Whether animated or live-action, the themes and elements + * in this program are specifically designed for a very young audience, including children + * from ages 2-6. This program is not expected to frighten younger children.</td> + * </tr> + * <tr> + * <td>US_TVPG_TV_Y7</td> + * <td>A rating string for the US_TVPG domain. Programs rated this are designed for children + * age 7 and above. It may be more appropriate for children who have acquired the + * developmental skills needed to distinguish between make-believe and reality. Themes and + * elements in this program may include mild fantasy violence or comedic violence, or may + * frighten children under the age of 7. Therefore, parents may wish to consider the + * suitability of this program for their very young children. This rating may contain + * fantasy violence (US_TVPG_FV) when programs are generally more intense or more combative + * than other programs in this category.</td> + * </tr> + * <tr> + * <td>US_TVPG_TV_G</td> + * <td>A rating string for the US_TVPG domain. Most parents would find this program suitable + * for all ages. Although this rating does not signify a program designed specifically for + * children, most parents may let younger children watch this program unattended. It + * contains little or no violence, no strong language and little or no sexual dialogue or + * situations.</td> + * </tr> + * <tr> + * <td>US_TVPG_TV_PG</td> + * <td>A rating string for the US_TVPG domain. Programs rated this contain material that + * parents may find unsuitable for younger children. Many parents may want to watch it with + * their younger children. The theme itself may call for parental guidance and/or the + * program may contain one or more of the following: some suggestive dialogue (US_TVPG_D), + * infrequent coarse language (US_TVPG_L), some sexual situations (US_TVPG_S), or moderate + * violence (US_TVPG_V).</td> + * </tr> + * <tr> + * <td>US_TVPG_TV_14</td> + * <td>A rating string for the US_TVPG domain. Programs rated this contains some material + * that many parents would find unsuitable for children under 14 years of age. Parents are + * strongly urged to exercise greater care in monitoring this program and are cautioned + * against letting children under the age of 14 watch unattended. This program may contain + * one or more of the following: intensely suggestive dialogue (US_TVPG_D), strong coarse + * language (US_TVPG_L), intense sexual situations (US_TVPG_S), or intense violence + * (US_TVPG_V).</td> + * </tr> + * <tr> + * <td>US_TVPG_TV_MA</td> + * <td>A rating string for the US_TVPG domain. Programs rated TV-MA are specifically + * designed to be viewed by adults and therefore may be unsuitable for children under 17. + * This program may contain one or more of the following: crude indecent language + * (US_TVPG_L), explicit sexual activity (US_TVPG_S), or graphic violence (US_TVPG_V).</td> + * </tr> + * <tr> + * <td>KR_TV_ALL</td> + * <td>A rating string for the KR_TV domain. This rating is for programs that are + * appropriate for all ages. This program usually involves programs designed for children or + * families. This rating does not have an icon.</td> + * </tr> + * <tr> + * <td>KR_TV_7</td> + * <td>A rating string for the KR_TV domain. This rating is for programs that may contain + * material inappropriate for children younger than 7, and parental discretion should be + * used. Some cartoon programs not deemed strictly as "educational", and films rated "G" or + * "PG" in North America may fall into the 7 category.</td> + * </tr> + * <tr> + * <td>KR_TV_12</td> + * <td>A rating string for the KR_TV domain. This rating is for programs that may deemed + * inappropriate for those younger than 12, and parental discretion should be used. Usually + * used for animations that have stronger themes or violence then those designed for + * children, or for reality shows that have mild violence, themes, or language.</td> + * </tr> + * <tr> + * <td>KR_TV_15</td> + * <td>A rating string for the KR_TV domain. This rating is for programs that contain + * material that may be inappropriate for children under 15, and that parental discretion + * should be used. Examples include most dramas, and talk shows on OTA (over-the-air) TV + * (KBS, MBC, SBS), and many American TV shows/dramas on Cable TV channels like OCN and + * OnStyle. The programs that have this rating may include moderate or strong adult themes, + * language, sexual inference, and violence. As with the TV-14 rating in North America, this + * rating is commonly applied to live events where the occurrence of inappropriate dialogue + * is unpredictable. Since 2007, this rating is the most used rating for TV.</td> + * </tr> + * <tr> + * <td>KR_TV_19</td> + * <td>A rating string for the KR_TV domain. This rating is for programs that are intended + * for adults only. 19-rated programs cannot air during the hours of 7:00AM to 9:00AM, and + * 1:00PM to 10:00PM. Programs that receive this rating will almost certainly have adult + * themes, sexual situations, frequent use of strong language and disturbing scenes of + * violence.</td> + * </tr> + * </table> + * + * <u>System defined string for {@code subRating}</u> + * <table border="0" cellspacing="0" cellpadding="0"> + * <tr> + * <td>String value</td> + * <td>Comments</td> + * </tr> + * <tr> + * <td>US_TVPG_D</td> + * <td>Suggestive dialogue (Not used with US_TVPG_TV_MA)</td> + * </tr> + * <tr> + * <td>US_TVPG_L</td> + * <td>Coarse language</td> + * </tr> + * <tr> + * <td>US_TVPG_S</td> + * <td>Sexual content</td> + * </tr> + * <tr> + * <td>US_TVPG_V</td> + * <td>Violence</td> + * </tr> + * <tr> + * <td>US_TVPG_FV</td> + * <td>Fantasy violence (exclusive to US_TVPG_TV_Y7)</td> + * </tr> + * </table> */ public final class TvContentRating { private static final String TAG = "TvContentRating"; - private static final int RATING_PREFIX_LENGTH = 10; - private static final String PREFIX_RATING_US = "RATING_US_"; - private static final String PREFIX_SUBRATING_US = "SUBRATING_US_"; + /** @hide */ + public static final Uri SYSTEM_CONTENT_RATING_SYSTEM_XML = Uri.parse( + "android.resource://system/" + com.android.internal.R.xml.tv_content_rating_systems); - /** - * Rating constant for TV-Y from the TV Parental Guidelines system in US. This program is - * designed to be appropriate for all children. - */ - public static final String RATING_US_TV_Y = PREFIX_RATING_US + "TV_Y"; - /** - * Rating constant for TV-Y7 from the TV Parental Guidelines system in US. This program is - * designed for children age 7 and above. - */ - public static final String RATING_US_TV_Y7 = PREFIX_RATING_US + "TV_Y7"; - /** - * Rating constant for TV-G from the TV Parental Guidelines system in US. Most parents would - * find this program suitable for all ages. - */ - public static final String RATING_US_TV_G = PREFIX_RATING_US + "TV_G"; - /** - * Rating constant for TV-PG from the TV Parental Guidelines system in US. This program contains - * material that parents may find unsuitable for younger children. - */ - public static final String RATING_US_TV_PG = PREFIX_RATING_US + "TV_PG"; - /** - * Rating constant for TV-14 from the TV Parental Guidelines system in US. This program contains - * some material that many parents would find unsuitable for children under 14 years of age. - */ - public static final String RATING_US_TV_14 = PREFIX_RATING_US + "TV_14"; - /** - * Rating constant for TV-MA from the TV Parental Guidelines system in US. This program is - * specifically designed to be viewed by adults and therefore may be unsuitable for children - * under 17. - */ - public static final String RATING_US_TV_MA = PREFIX_RATING_US + "TV_MA"; - - /** - * Sub-rating constant for D (Suggestive dialogue) from the TV Parental Guidelines system in US. - */ - public static final String SUBRATING_US_D = PREFIX_SUBRATING_US + "D"; - /** - * Sub-rating constant for L (Coarse language) from the TV Parental Guidelines system in US. - */ - public static final String SUBRATING_US_L = PREFIX_SUBRATING_US + "L"; - /** - * Sub-rating constant for S (Sexual content) from the TV Parental Guidelines system in US. - */ - public static final String SUBRATING_US_S = PREFIX_SUBRATING_US + "S"; - /** - * Sub-rating constant for V (Violence) from the TV Parental Guidelines system in US. - */ - public static final String SUBRATING_US_V = PREFIX_SUBRATING_US + "V"; - /** - * Sub-rating constant for FV (Fantasy violence) from the TV Parental Guidelines system in US. - */ - public static final String SUBRATING_US_FV = PREFIX_SUBRATING_US + "FV"; + // TODO: Consider to use other DELIMITER. In some countries such as India may use this delimiter + // in the main ratings. + private static final String DELIMITER = "/"; - private static final String PREFIX_RATING_KR = "RATING_KR_"; + private final String mDomain; + private final String mCountryCode; + private final String mRatingSystem; + private final String mRating; + private final String[] mSubRatings; /** - * Rating constant for 'ALL' from the South Korean television rating system. This rating is for - * programming that is appropriate for all ages. - */ - public static final String RATING_KR_ALL = PREFIX_RATING_KR + "ALL"; - /** - * Rating constant for '7' from the South Korean television rating system. This rating is for - * programming that may contain material inappropriate for children younger than 7, and parental - * discretion should be used. - */ - public static final String RATING_KR_7 = PREFIX_RATING_KR + "7"; - /** - * Rating constant for '12' from the South Korean television rating system. This rating is for - * programs that may deemed inappropriate for those younger than 12, and parental discretion - * should be used. - */ - public static final String RATING_KR_12 = PREFIX_RATING_KR + "12"; - /** - * Rating constant for '15' from the South Korean television rating system. This rating is for - * programs that contain material that may be inappropriate for children under 15, and that - * parental discretion should be used. - */ - public static final String RATING_KR_15 = PREFIX_RATING_KR + "15"; - /** - * Rating constant for '19' from the South Korean television rating system. This rating is for - * programs that are intended for adults only. 19-rated programming cannot air during the hours - * of 7:00AM to 9:00AM, and 1:00PM to 10:00PM. + * Creates a TvContentRating object. + * + * @param domain The domain name. + * @param countryCode The country code in ISO 3166-2 format or {@code null}. + * @param ratingSystem The rating system id. + * @param rating The content rating string. + * @param subRatings The string array of sub-ratings. + * @return A TvContentRating object, or null if creation failed. */ - public static final String RATING_KR_19 = PREFIX_RATING_KR + "19"; - - private static final String DELIMITER = "/"; - - // A mapping from two-letter country code (ISO 3166-1 alpha-2) to its rating-to-sub-ratings map. - // This is used for validating the builder parameters. - private static final Map<String, Map<String, String[]>> sRatings - = new ArrayMap<String, Map<String, String[]>>(); - - static { - Map<String, String[]> usRatings = new ArrayMap<String, String[]>(); - usRatings.put(RATING_US_TV_Y, null); - usRatings.put(RATING_US_TV_Y7, new String[] { SUBRATING_US_FV }); - usRatings.put(RATING_US_TV_G, null); - usRatings.put(RATING_US_TV_PG, new String[] { - SUBRATING_US_D, SUBRATING_US_L, SUBRATING_US_S, SUBRATING_US_V }); - usRatings.put(RATING_US_TV_14, new String[] { - SUBRATING_US_D, SUBRATING_US_L, SUBRATING_US_S, SUBRATING_US_V }); - usRatings.put(RATING_US_TV_MA, new String[] { - SUBRATING_US_L, SUBRATING_US_S, SUBRATING_US_V }); - sRatings.put(PREFIX_RATING_US, usRatings); - - Map<String, String[]> krRatings = new ArrayMap<String, String[]>(); - krRatings.put(RATING_KR_ALL, null); - krRatings.put(RATING_KR_7, null); - krRatings.put(RATING_KR_12, null); - krRatings.put(RATING_KR_15, null); - krRatings.put(RATING_KR_19, null); - sRatings.put(PREFIX_RATING_KR, krRatings); + public static TvContentRating createRating(String domain, String countryCode, + String ratingSystem, String rating, String... subRatings) { + if (TextUtils.isEmpty(domain)) { + throw new IllegalArgumentException("domain cannot be empty"); + } + if (TextUtils.isEmpty(rating)) { + throw new IllegalArgumentException("rating cannot be empty"); + } + return new TvContentRating(domain, countryCode, ratingSystem, rating, subRatings); } - private final String mRating; - private final String[] mSubRatings; - /** - * Constructs a TvContentRating object from a given rating constant. + * Recovers a TvContentRating from a String that was previously created with + * {@link #flattenToString}. * - * @param rating The rating constant defined in this class. + * @param ratingString The String that was returned by flattenToString(). + * @return a new TvContentRating containing the domain, countryCode, rating system, rating and + * sub-ratings information was encoded in {@code ratingString}. + * @see #flattenToString */ - public TvContentRating(String rating) { - this(rating, null); + public static TvContentRating unflattenFromString(String ratingString) { + if (TextUtils.isEmpty(ratingString)) { + throw new IllegalArgumentException("ratingString cannot be empty"); + } + String[] strs = ratingString.split(DELIMITER); + if (strs.length < 4) { + throw new IllegalArgumentException("Invalid rating string: " + ratingString); + } + if (strs.length > 4) { + String[] subRatings = new String[strs.length - 4]; + System.arraycopy(strs, 4, subRatings, 0, subRatings.length); + return new TvContentRating(strs[0], strs[1], strs[2], strs[3], subRatings); + } + return new TvContentRating(strs[0], strs[1], strs[2], strs[3], null); } /** @@ -168,57 +294,45 @@ public final class TvContentRating { * @param rating The rating constant defined in this class. * @param subRatings The String array of sub-rating constants defined in this class. */ - public TvContentRating(String rating, String[] subRatings) { - if (TextUtils.isEmpty(rating)) { - throw new IllegalArgumentException("rating cannot be null"); - } + private TvContentRating(String domain, String countryCode, + String ratingSystem, String rating, String[] subRatings) { + mDomain = domain; + mCountryCode = countryCode; + mRatingSystem = ratingSystem; mRating = rating; mSubRatings = subRatings; - String prefix = ""; - if (mRating.length() > RATING_PREFIX_LENGTH) { - prefix = mRating.substring(0, RATING_PREFIX_LENGTH); - } - Map<String, String[]> ratings = sRatings.get(prefix); - if (ratings != null) { - if (!ratings.keySet().contains(mRating)) { - Log.w(TAG, "Unknown rating: " + mRating); - } else if (mSubRatings != null) { - String[] validSubRatings = ratings.get(mRating); - if (validSubRatings == null) { - Log.w(TAG, "Invalid subratings: " + mSubRatings); - } else { - List<String> validSubRatingList = Arrays.asList(subRatings); - for (String sr : mSubRatings) { - if (TextUtils.isEmpty(sr)) { - throw new IllegalArgumentException( - "subRatings cannot contain empty elements"); - } - if (!validSubRatingList.contains(sr)) { - Log.w(TAG, "Invalid subrating: " + sr); - break; - } - } - } - } - } else { - Log.w(TAG, "Rating undefined for " + mRating); - } } /** - * Returns the main rating constant. - * - * @return the rating string that starts with "RATING_" prefix as defined in this class. + * Returns the domain. + */ + public String getDomain() { + return mDomain; + } + + /** + * Returns the country code in ISO 3166-2 format or {@code null}. + */ + public String getCountry() { + return mCountryCode; + } + + /** + * Returns the rating system id. + */ + public String getRatingSystem() { + return mRatingSystem; + } + + /** + * Returns the main rating. */ public String getMainRating() { return mRating; } /** - * Returns the list of sub-rating constants. - * - * @return the unmodifiable {@code List} of sub-rating strings that start with "SUBRATING_" - * prefix as defined in this class. + * Returns the unmodifiable {@code List} of sub-rating strings. */ public List<String> getSubRatings() { if (mSubRatings == null) { @@ -238,10 +352,14 @@ public final class TvContentRating { * @see #unflattenFromString */ public String flattenToString() { - // TODO: Consider removing all obvious/redundant sub-strings including "RATING" and - // "SUBRATING" and find out a storage-efficient string format such as: - // <country>-<primary>/<sub1>/<sub2>/<sub3> - StringBuilder builder = new StringBuilder(mRating); + StringBuilder builder = new StringBuilder(); + builder.append(mDomain); + builder.append(DELIMITER); + builder.append(mCountryCode); + builder.append(DELIMITER); + builder.append(mRatingSystem); + builder.append(DELIMITER); + builder.append(mRating); if (mSubRatings != null) { for (String subRating : mSubRatings) { builder.append(DELIMITER); @@ -252,31 +370,6 @@ public final class TvContentRating { } /** - * Recovers a TvContentRating from a String that was previously created with - * {@link #flattenToString}. - * - * @param ratingString The String that was returned by flattenToString(). - * @return a new TvContentRating containing the rating and sub-ratings information was encoded - * in {@code ratingString}. - * @see #flattenToString - */ - public static TvContentRating unflattenFromString(String ratingString) { - if (TextUtils.isEmpty(ratingString)) { - throw new IllegalArgumentException("Empty rating string"); - } - String[] strs = ratingString.split(DELIMITER); - if (strs.length < 1) { - throw new IllegalArgumentException("Invalid rating string: " + ratingString); - } - if (strs.length > 1) { - String[] subRatings = new String[strs.length - 1]; - System.arraycopy(strs, 1, subRatings, 0, subRatings.length); - return new TvContentRating(strs[0], subRatings); - } - return new TvContentRating(strs[0]); - } - - /** * Returns true if this rating has the same main rating as the specified rating and when this * rating's sub-ratings contain the other's. * <p> diff --git a/media/java/android/media/tv/TvContract.java b/media/java/android/media/tv/TvContract.java index 1a43051..5a0ea0d 100644 --- a/media/java/android/media/tv/TvContract.java +++ b/media/java/android/media/tv/TvContract.java @@ -509,7 +509,7 @@ public final class TvContract { * The ID of the TV input service that provides this TV channel. * <p> * Use {@link #buildInputId} to build the ID. - * <p> + * </p><p> * This is a required field. * </p><p> * Type: TEXT @@ -662,7 +662,7 @@ public final class TvContract { * {@link Programs#COLUMN_VIDEO_HEIGHT} to get more accurate video resolution. * </p><p> * Type: TEXT - * </p><p> + * </p> * @see #getVideoResolution */ public static final String COLUMN_VIDEO_FORMAT = "video_format"; @@ -688,8 +688,7 @@ public final class TvContract { * the channel is searchable and can be included in search results, a value of 0 indicates * the channel and its TV programs are hidden from search. If not specified, this value is * set to 1 (searchable) by default. - * </p> - * <p> + * </p><p> * Type: INTEGER (boolean) * </p> */ @@ -743,14 +742,12 @@ public final class TvContract { * To access this directory, append {@link Channels.Logo#CONTENT_DIRECTORY} to the raw * channel URI. The resulting URI represents an image file, and should be interacted * using ContentResolver.openAssetFileDescriptor. - * </p> - * <p> + * </p><p> * Note that this sub-directory also supports opening the logo as an asset file in write * mode. Callers can create or replace the primary logo associated with this channel by * opening the asset file and writing the full-size photo contents into it. When the file * is closed, the image will be parsed, sized down if necessary, and stored. - * </p> - * <p> + * </p><p> * Usage example: * <pre> * public void writeChannelLogo(long channelId, byte[] logo) { @@ -1180,6 +1177,19 @@ public final class TvContract { */ public static final String COLUMN_DESCRIPTION = "description"; + /** + * Extra parameters of the tune operation. + * <p> + * This column contains an encoded string which is comma-separated key-value pairs. + * (Ex. "[key1]=[value1], [key2]=[value2]"). COLUMN_TUNE_PARAMS will use '%' as an escape + * character for the characters of '%', '=', and ','. + * </p><p> + * Type: TEXT + * </p> + * @see TvInputManager.Session.tune(Uri, Bundle) + */ + public static final String COLUMN_TUNE_PARAMS = "tune_params"; + private WatchedPrograms() {} } } diff --git a/media/java/android/media/tv/TvInputInfo.java b/media/java/android/media/tv/TvInputInfo.java index e48b805..bc0538c 100644 --- a/media/java/android/media/tv/TvInputInfo.java +++ b/media/java/android/media/tv/TvInputInfo.java @@ -18,6 +18,7 @@ package android.media.tv; import android.annotation.SystemApi; import android.content.ComponentName; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -118,6 +119,7 @@ public final class TvInputInfo implements Parcelable { private String mLabel; private Uri mIconUri; private boolean mIsConnectedToHdmiSwitch; + private Uri mRatingSystemXmlUri; static { sHardwareTypeToTvInputType.put(TvInputHardwareInfo.TV_INPUT_TYPE_OTHER_HARDWARE, @@ -237,6 +239,19 @@ public final class TvInputInfo implements Parcelable { Log.d(TAG, "Settings activity loaded. [" + input.mSettingsActivity + "] for " + si.name); } + int contentRatingSystemXml = sa.getResourceId( + com.android.internal.R.styleable.TvInputService_contentRatingSystemXml, -1); + if (contentRatingSystemXml != -1) { + input.mRatingSystemXmlUri = new Uri.Builder() + .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) + .authority(si.packageName) + .appendPath(Integer.toString(contentRatingSystemXml)) + .build(); + if (DEBUG) { + Log.d(TAG, "Content rating xml loaded. [" + contentRatingSystemXml + "] for " + + si.name); + } + } sa.recycle(); input.mLabel = label; @@ -346,6 +361,15 @@ public final class TvInputInfo implements Parcelable { } /** + * Returns the resource uri for the rating system xml of this TV input service. + * @hide + */ + @SystemApi + public Uri getRatingSystemXmlUri() { + return mRatingSystemXmlUri; + } + + /** * Returns {@code true} if this TV input is pass-though which does not have any real channels * in TvProvider. {@code false} otherwise. * @@ -449,9 +473,10 @@ public final class TvInputInfo implements Parcelable { dest.writeString(mSetupActivity); dest.writeString(mSettingsActivity); dest.writeInt(mType); - dest.writeString(mIconUri == null ? null : mIconUri.toString()); + dest.writeParcelable(mIconUri, flags); dest.writeString(mLabel); dest.writeByte(mIsConnectedToHdmiSwitch ? (byte) 1 : 0); + dest.writeParcelable(mRatingSystemXmlUri, flags); } private Drawable loadDefaultIcon(Context context) { @@ -521,11 +546,9 @@ public final class TvInputInfo implements Parcelable { mSetupActivity = in.readString(); mSettingsActivity = in.readString(); mType = in.readInt(); - String mIconUriString = in.readString(); - if (mIconUriString != null) { - mIconUri = Uri.parse(mIconUriString); - } + mIconUri = in.readParcelable(null); mLabel = in.readString(); mIsConnectedToHdmiSwitch = in.readByte() == 1 ? true : false; + mRatingSystemXmlUri = in.readParcelable(null); } } diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java index 49b2240..0334083 100644 --- a/media/java/android/media/tv/TvInputManager.java +++ b/media/java/android/media/tv/TvInputManager.java @@ -800,6 +800,19 @@ public final class TvInputManager { } /** + * Returns the list of xml resource uris for TV content rating systems. + * @hide + */ + @SystemApi + public List<Uri> getTvContentRatingSystemXmls() { + try { + return mService.getTvContentRatingSystemXmls(mUserId); + } catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + /** * Creates a {@link Session} for a given TV input. * <p> * The number of sessions that can be created at the same time is limited by the capability of @@ -1012,6 +1025,19 @@ public final class TvInputManager { * @throws IllegalArgumentException if the argument is {@code null}. */ public void tune(Uri channelUri) { + tune(channelUri, null); + } + + /** + * Tunes to a given channel. + * + * @param channelUri The URI of a channel. + * @param params A set of extra parameters which might be handled with this tune event. + * @throws IllegalArgumentException if {@code channelUri} is {@code null}. + * @hide + */ + @SystemApi + public void tune(Uri channelUri, Bundle params) { if (channelUri == null) { throw new IllegalArgumentException("channelUri cannot be null"); } @@ -1021,7 +1047,7 @@ public final class TvInputManager { } mTracks = null; try { - mService.tune(mToken, channelUri, mUserId); + mService.tune(mToken, channelUri, params, mUserId); } catch (RemoteException e) { throw new RuntimeException(e); } diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java index 29a2230..7ce278c 100644 --- a/media/java/android/media/tv/TvInputService.java +++ b/media/java/android/media/tv/TvInputService.java @@ -558,6 +558,19 @@ public abstract class TvInputService extends Service { public abstract boolean onTune(Uri channelUri); /** + * Calls {@link #onTune(Uri)}. Override this method in order to handle {@code params}. + * + * @param channelUri The URI of the channel. + * @param params The extra parameters from other applications. + * @return {@code true} the tuning was successful, {@code false} otherwise. + * @hide + */ + @SystemApi + public boolean onTune(Uri channelUri, Bundle params) { + return onTune(channelUri); + } + + /** * Enables or disables the caption. * <p> * The locale for the user's preferred captioning language can be obtained by calling @@ -809,8 +822,8 @@ public abstract class TvInputService extends Service { /** * Calls {@link #onTune}. */ - void tune(Uri channelUri) { - onTune(channelUri); + void tune(Uri channelUri, Bundle params) { + onTune(channelUri, params); // TODO: Handle failure. } diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java index 7031f05..2696a63 100644 --- a/media/java/android/media/tv/TvView.java +++ b/media/java/android/media/tv/TvView.java @@ -203,10 +203,23 @@ public class TvView extends ViewGroup { /** * Tunes to a given channel. * - * @param inputId the id of TV input which will play the given channel. + * @param inputId The id of TV input which will play the given channel. * @param channelUri The URI of a channel. */ public void tune(String inputId, Uri channelUri) { + tune(inputId, channelUri, null); + } + + /** + * Tunes to a given channel. + * + * @param inputId The id of TV input which will play the given channel. + * @param channelUri The URI of a channel. + * @param params Extra parameters which might be handled with the tune event. + * @hide + */ + @SystemApi + public void tune(String inputId, Uri channelUri, Bundle params) { if (DEBUG) Log.d(TAG, "tune(" + channelUri + ")"); if (TextUtils.isEmpty(inputId)) { throw new IllegalArgumentException("inputId cannot be null or an empty string"); @@ -218,11 +231,12 @@ public class TvView extends ViewGroup { } if (mSessionCallback != null && mSessionCallback.mInputId.equals(inputId)) { if (mSession != null) { - mSession.tune(channelUri); + mSession.tune(channelUri, params); } else { // Session is not created yet. Replace the channel which will be set once the // session is made. mSessionCallback.mChannelUri = channelUri; + mSessionCallback.mTuneParams = params; } } else { reset(); @@ -231,7 +245,7 @@ public class TvView extends ViewGroup { // The previous callbacks will be ignored. For the logic, mSessionCallback // is newly assigned for every createSession request and compared with // MySessionCreateCallback.this. - mSessionCallback = new MySessionCallback(inputId, channelUri); + mSessionCallback = new MySessionCallback(inputId, channelUri, params); mTvInputManager.createSession(inputId, mSessionCallback, mHandler); } } @@ -722,10 +736,12 @@ public class TvView extends ViewGroup { private class MySessionCallback extends SessionCallback { final String mInputId; Uri mChannelUri; + Bundle mTuneParams; - MySessionCallback(String inputId, Uri channelUri) { + MySessionCallback(String inputId, Uri channelUri, Bundle tuneParams) { mInputId = inputId; mChannelUri = channelUri; + mTuneParams = tuneParams; } @Override @@ -754,7 +770,7 @@ public class TvView extends ViewGroup { } } createSessionOverlayView(); - mSession.tune(mChannelUri); + mSession.tune(mChannelUri, mTuneParams); if (mHasStreamVolume) { mSession.setStreamVolume(mStreamVolume); } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java index dd7a828..91199c1 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java @@ -190,33 +190,34 @@ public class SettingsHelper { String localeString = loc.getLanguage(); String country = loc.getCountry(); if (!TextUtils.isEmpty(country)) { - localeString += "_" + country; + localeString += "-" + country; } return localeString.getBytes(); } /** - * Sets the locale specified. Input data is the equivalent of "ll_cc".getBytes(), where - * "ll" is the language code and "cc" is the country code. + * Sets the locale specified. Input data is the byte representation of a + * BCP-47 language tag. For backwards compatibility, strings of the form + * {@code ll_CC} are also accepted, where {@code ll} is a two letter language + * code and {@code CC} is a two letter country code. + * * @param data the locale string in bytes. */ void setLocaleData(byte[] data, int size) { // Check if locale was set by the user: Configuration conf = mContext.getResources().getConfiguration(); - Locale loc = conf.locale; // TODO: The following is not working as intended because the network is forcing a locale // change after registering. Need to find some other way to detect if the user manually // changed the locale if (conf.userSetLocale) return; // Don't change if user set it in the SetupWizard final String[] availableLocales = mContext.getAssets().getLocales(); - String localeCode = new String(data, 0, size); - String language = new String(data, 0, 2); - String country = size > 4 ? new String(data, 3, 2) : ""; - loc = null; + // Replace "_" with "-" to deal with older backups. + String localeCode = new String(data, 0, size).replace('_', '-'); + Locale loc = null; for (int i = 0; i < availableLocales.length; i++) { if (availableLocales[i].equals(localeCode)) { - loc = new Locale(language, country); + loc = Locale.forLanguageTag(localeCode); break; } } 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 differdeleted file mode 100644 index a14b8d8..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_0.png +++ /dev/null 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 differdeleted file mode 100644 index b226694..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.png +++ /dev/null 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 differdeleted file mode 100644 index cbabd61..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.png +++ /dev/null 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 differdeleted file mode 100644 index 1e9fbfd..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.png +++ /dev/null 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 differdeleted file mode 100644 index 0676919..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.png +++ /dev/null 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 differdeleted file mode 100644 index 12569d1..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.png +++ /dev/null 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 differdeleted file mode 100644 index 3ad9e76..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.png +++ /dev/null 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 differdeleted file mode 100644 index 7d5f6d0..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.png +++ /dev/null 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 differdeleted file mode 100644 index 2102263..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_0.png Binary files differdeleted file mode 100644 index c288137..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_0.png +++ /dev/null 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 differdeleted file mode 100644 index 2e3e486..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1.png +++ /dev/null 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 differdeleted file mode 100644 index c24cd4d..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1x.png +++ /dev/null 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 differdeleted file mode 100644 index 04e8220..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_2.png +++ /dev/null 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 differdeleted file mode 100644 index f8ed8f0..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3.png +++ /dev/null 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 differdeleted file mode 100644 index 4f76f66..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3g.png +++ /dev/null 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 differdeleted file mode 100644 index 9570dae..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4g.png Binary files differdeleted file mode 100644 index b23a043..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4g.png +++ /dev/null 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 differdeleted file mode 100644 index 75de8cd..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_e.png +++ /dev/null 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 differdeleted file mode 100644 index c0ae67c..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_g.png +++ /dev/null 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 differdeleted file mode 100644 index 858afc8..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_lte.png Binary files differdeleted file mode 100644 index 9dfde67..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_lte.png +++ /dev/null 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 differdeleted file mode 100644 index 4fea255..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_r.png +++ /dev/null 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 differdeleted file mode 100644 index fa905cc..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.png +++ /dev/null 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 differdeleted file mode 100644 index 5b5b5d2..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.png +++ /dev/null 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 differdeleted file mode 100644 index 250653b..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png +++ /dev/null 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 differdeleted file mode 100644 index 497c69f..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_lte.png Binary files differdeleted file mode 100644 index 5128c0d..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_network.png Binary files differdeleted file mode 100644 index 05bb0a0..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_network.png +++ /dev/null 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 differdeleted file mode 100644 index dd8ba8f..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png +++ /dev/null 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 differdeleted file mode 100644 index d750726..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png +++ /dev/null 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 differdeleted file mode 100644 index da77a35..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.png +++ /dev/null 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 differdeleted file mode 100644 index c416fc3..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_0.png +++ /dev/null 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 differdeleted file mode 100644 index c500691..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.png +++ /dev/null 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 differdeleted file mode 100644 index ae87896..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.png +++ /dev/null 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 differdeleted file mode 100644 index e47ef7a..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.png +++ /dev/null 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 differdeleted file mode 100644 index 9fd1ae6..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.png +++ /dev/null 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 differdeleted file mode 100644 index 93b45b4..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_1.png +++ /dev/null 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 differdeleted file mode 100644 index 21b2c61..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_2.png +++ /dev/null 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 differdeleted file mode 100644 index cd96ae0..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_3.png +++ /dev/null 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 differdeleted file mode 100644 index 43bfe3a..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_4.png +++ /dev/null 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 differdeleted file mode 100644 index 250653b..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png +++ /dev/null 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 differdeleted file mode 100644 index 497c69f..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png +++ /dev/null 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 differdeleted file mode 100644 index 45bc376..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_not_connected.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_not_connected.png Binary files differdeleted file mode 100644 index c416fc3..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_not_connected.png +++ /dev/null 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 differdeleted file mode 100644 index d750726..0000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.png Binary files differdeleted file mode 100644 index 804d1ac..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.png Binary files differdeleted file mode 100644 index 1d863e9..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_4g.png Binary files differdeleted file mode 100644 index 62970fe..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.png Binary files differdeleted file mode 100644 index 6c3fbdc..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_g.png Binary files differdeleted file mode 100644 index a5effe0..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png Binary files differdeleted file mode 100644 index b7071b9..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_lte.png Binary files differdeleted file mode 100644 index bd145fa..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_roam.png Binary files differdeleted file mode 100644 index be38df8..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_roam.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png Binary files differdeleted file mode 100644 index da941c8..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png Binary files differdeleted file mode 100644 index 0fd09d7..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png Binary files differdeleted file mode 100644 index cfe43dd..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png Binary files differdeleted file mode 100644 index 92a5b1c..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png Binary files differdeleted file mode 100644 index 9454cd8..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png Binary files differdeleted file mode 100644 index 6cb18c7..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png Binary files differdeleted file mode 100644 index 45ed7ca..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png Binary files differdeleted file mode 100644 index 0060eba..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png Binary files differdeleted file mode 100644 index faf4153..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png Binary files differdeleted file mode 100644 index 6a25705..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png Binary files differdeleted file mode 100644 index c609847..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png Binary files differdeleted file mode 100644 index 6248cfd..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png Binary files differdeleted file mode 100644 index 8c3e896..0000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_0.png Binary files differdeleted file mode 100644 index 49f9d8d..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1.png Binary files differdeleted file mode 100644 index b6388e1..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1x.png Binary files differdeleted file mode 100644 index 969bff4..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_2.png Binary files differdeleted file mode 100644 index 610a018..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_2.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3.png Binary files differdeleted file mode 100644 index badebf5..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3g.png Binary files differdeleted file mode 100644 index ff96e40..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4.png Binary files differdeleted file mode 100644 index 52c9a74..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4g.png Binary files differdeleted file mode 100644 index 312a384..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_e.png Binary files differdeleted file mode 100644 index 1211e0d..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_0.png Binary files differdeleted file mode 100644 index 49f9d8d..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1.png Binary files differdeleted file mode 100644 index ce85449..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1x.png Binary files differdeleted file mode 100644 index 3226db6..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_2.png Binary files differdeleted file mode 100644 index 050dde5..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_2.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3.png Binary files differdeleted file mode 100644 index 1498198..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3g.png Binary files differdeleted file mode 100644 index 99484b1..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4.png Binary files differdeleted file mode 100644 index 656f9ef..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4g.png Binary files differdeleted file mode 100644 index f4f0035..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_e.png Binary files differdeleted file mode 100644 index 935a743..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_g.png Binary files differdeleted file mode 100644 index 5510f6b..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_h.png Binary files differdeleted file mode 100644 index c21352c..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_lte.png Binary files differdeleted file mode 100644 index 9298dae..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_r.png Binary files differdeleted file mode 100644 index da4093e..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_r.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_g.png Binary files differdeleted file mode 100644 index b65abc6..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_h.png Binary files differdeleted file mode 100644 index 08e21d2..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_in.png Binary files differdeleted file mode 100644 index 64c6723..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_in.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_inout.png Binary files differdeleted file mode 100644 index 2338122..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_lte.png Binary files differdeleted file mode 100644 index 464ebbc..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_network.png Binary files differdeleted file mode 100644 index c532510..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_network.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_signal.png Binary files differdeleted file mode 100644 index f87944f..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_signal.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_out.png Binary files differdeleted file mode 100644 index 29df6d7..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_r.png Binary files differdeleted file mode 100644 index 37da1f4..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_r.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_1x.png Binary files differdeleted file mode 100644 index 3d82daf..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_3g.png Binary files differdeleted file mode 100644 index dfbf1a4..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_4g.png Binary files differdeleted file mode 100644 index 85721db..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_e.png Binary files differdeleted file mode 100644 index 4a2421c..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_g.png Binary files differdeleted file mode 100644 index acc98b7..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_h.png Binary files differdeleted file mode 100644 index 64653eb..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_lte.png Binary files differdeleted file mode 100644 index f440755..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_roam.png Binary files differdeleted file mode 100644 index ffb58ca..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_roam.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png Binary files differdeleted file mode 100644 index b477332..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png Binary files differdeleted file mode 100644 index b477332..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png Binary files differdeleted file mode 100644 index 36cb7e5..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png Binary files differdeleted file mode 100644 index cc30aa1..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png Binary files differdeleted file mode 100644 index 6f0b419..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png Binary files differdeleted file mode 100644 index 01d47c5..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png Binary files differdeleted file mode 100644 index cd4056c..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_0.png Binary files differdeleted file mode 100644 index ad699e2..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1.png Binary files differdeleted file mode 100644 index 7116084..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1x.png Binary files differdeleted file mode 100644 index 8596aa6..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_2.png Binary files differdeleted file mode 100644 index 1b81c42..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_2.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3.png Binary files differdeleted file mode 100644 index 03591c2..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3g.png Binary files differdeleted file mode 100644 index ee72967..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4.png Binary files differdeleted file mode 100644 index 162315c..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4g.png Binary files differdeleted file mode 100644 index c472f2b..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_e.png Binary files differdeleted file mode 100644 index e4bf4e2..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_0.png Binary files differdeleted file mode 100644 index ad699e2..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1.png Binary files differdeleted file mode 100644 index d45c0ad..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1x.png Binary files differdeleted file mode 100644 index e5e2c27..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_2.png Binary files differdeleted file mode 100644 index 55e7125..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_2.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3.png Binary files differdeleted file mode 100644 index db913dd..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3g.png Binary files differdeleted file mode 100644 index e1760b4..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4.png Binary files differdeleted file mode 100644 index c098fd9..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4g.png Binary files differdeleted file mode 100644 index d084a6b..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_e.png Binary files differdeleted file mode 100644 index 5c2e8e5..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_g.png Binary files differdeleted file mode 100644 index f69c1f7..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_h.png Binary files differdeleted file mode 100644 index 066efdd..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_lte.png Binary files differdeleted file mode 100644 index d3b51c1..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_r.png Binary files differdeleted file mode 100644 index 4fcc7bc..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_r.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_g.png Binary files differdeleted file mode 100644 index 98b0104..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_h.png Binary files differdeleted file mode 100644 index fc19c7a..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_in.png Binary files differdeleted file mode 100644 index 3fba731..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_in.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_inout.png Binary files differdeleted file mode 100644 index eb5fcd0..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_lte.png Binary files differdeleted file mode 100644 index 2250282..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_network.png Binary files differdeleted file mode 100644 index 5ec4543..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_network.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_signal.png Binary files differdeleted file mode 100644 index b8f137c..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_signal.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_out.png Binary files differdeleted file mode 100644 index a91c7c7..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_r.png Binary files differdeleted file mode 100644 index 8290e1b..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_r.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_1x.png Binary files differdeleted file mode 100644 index 0d97960..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_3g.png Binary files differdeleted file mode 100644 index f8e06e1..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_4g.png Binary files differdeleted file mode 100644 index 35be266..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_e.png Binary files differdeleted file mode 100644 index 64727d3..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_g.png Binary files differdeleted file mode 100644 index 3b14d98..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_h.png Binary files differdeleted file mode 100644 index c51c4b1..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_lte.png Binary files differdeleted file mode 100644 index 867a014..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_roam.png Binary files differdeleted file mode 100644 index c54ceba..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_roam.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png Binary files differdeleted file mode 100644 index 6f457e0..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png Binary files differdeleted file mode 100644 index 6f457e0..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png Binary files differdeleted file mode 100644 index 45d733e..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png Binary files differdeleted file mode 100644 index 093387a..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png Binary files differdeleted file mode 100644 index 2f32c4c..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png Binary files differdeleted file mode 100644 index 8e9ba9c..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png Binary files differdeleted file mode 100644 index c18d103..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_0.png Binary files differdeleted file mode 100644 index e50be70..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1.png Binary files differdeleted file mode 100644 index a5d68e1..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1x.png Binary files differdeleted file mode 100644 index 69d0461..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_2.png Binary files differdeleted file mode 100644 index df0948b..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_2.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3.png Binary files differdeleted file mode 100644 index 4409267..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3g.png Binary files differdeleted file mode 100644 index de0181b..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4.png Binary files differdeleted file mode 100644 index c3e4181..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4g.png Binary files differdeleted file mode 100644 index 69a950d..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_e.png Binary files differdeleted file mode 100644 index 04948ae..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_0.png Binary files differdeleted file mode 100644 index e50be70..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1.png Binary files differdeleted file mode 100644 index 53bf4de..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1x.png Binary files differdeleted file mode 100644 index 5733b5d..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_2.png Binary files differdeleted file mode 100644 index 5a69da2..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_2.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3.png Binary files differdeleted file mode 100644 index 52df2f7..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3g.png Binary files differdeleted file mode 100644 index 503cc78..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4.png Binary files differdeleted file mode 100644 index b5c176d..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4g.png Binary files differdeleted file mode 100644 index 4c169ec..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_e.png Binary files differdeleted file mode 100644 index 5d09b042..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_g.png Binary files differdeleted file mode 100644 index 94f332e..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_h.png Binary files differdeleted file mode 100644 index 1d2594b..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_lte.png Binary files differdeleted file mode 100644 index 22eec00..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_r.png Binary files differdeleted file mode 100644 index 99efc08..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_r.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_g.png Binary files differdeleted file mode 100644 index a6b0393..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_h.png Binary files differdeleted file mode 100644 index ede64f1..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_in.png Binary files differdeleted file mode 100644 index 521de12..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_in.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_inout.png Binary files differdeleted file mode 100644 index 4d015da..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_lte.png Binary files differdeleted file mode 100644 index e82ba13..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_network.png Binary files differdeleted file mode 100644 index 7097b26..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_network.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_signal.png Binary files differdeleted file mode 100644 index 43fbaeb..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_signal.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_out.png Binary files differdeleted file mode 100644 index d8209e6..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_r.png Binary files differdeleted file mode 100644 index 83e7206..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_r.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_1x.png Binary files differdeleted file mode 100644 index 8a72b0a..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_3g.png Binary files differdeleted file mode 100644 index 4f1632d..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_4g.png Binary files differdeleted file mode 100644 index fd9eb8b..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_e.png Binary files differdeleted file mode 100644 index aa0677e..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_g.png Binary files differdeleted file mode 100644 index cf1f099..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_h.png Binary files differdeleted file mode 100644 index 441e9dd..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_lte.png Binary files differdeleted file mode 100644 index 2614d61..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_roam.png Binary files differdeleted file mode 100644 index d8db235..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_roam.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png Binary files differdeleted file mode 100644 index 60ede0a..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png Binary files differdeleted file mode 100644 index a22fa28..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png Binary files differdeleted file mode 100644 index 26a0543..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png Binary files differdeleted file mode 100644 index ec31162..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png Binary files differdeleted file mode 100644 index 26cd26f..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png Binary files differdeleted file mode 100644 index 25ed626..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png Binary files differdeleted file mode 100644 index 37da333..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_0.png Binary files differdeleted file mode 100644 index 5298d41..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1.png Binary files differdeleted file mode 100644 index 19809c2..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1x.png Binary files differdeleted file mode 100644 index cd34141..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_2.png Binary files differdeleted file mode 100644 index 5691f96..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_2.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3.png Binary files differdeleted file mode 100644 index 56768dd..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3g.png Binary files differdeleted file mode 100644 index 094d4ca..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4.png Binary files differdeleted file mode 100644 index 55ec5b8..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4g.png Binary files differdeleted file mode 100644 index f92aac2..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_e.png Binary files differdeleted file mode 100644 index 4329b67..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_0.png Binary files differdeleted file mode 100644 index a9c0849..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1.png Binary files differdeleted file mode 100644 index 41c1f89..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1x.png Binary files differdeleted file mode 100644 index dea2bf2..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_2.png Binary files differdeleted file mode 100644 index 3a1678f..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_2.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3.png Binary files differdeleted file mode 100644 index 2e84aa1..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3g.png Binary files differdeleted file mode 100644 index 79c97fa..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4.png Binary files differdeleted file mode 100644 index 742b5bb..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4g.png Binary files differdeleted file mode 100644 index 3b297af..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_e.png Binary files differdeleted file mode 100644 index c5a7b8c..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_g.png Binary files differdeleted file mode 100644 index 077b754..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_h.png Binary files differdeleted file mode 100644 index 7907b02..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_lte.png Binary files differdeleted file mode 100644 index 190d3f4..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_r.png Binary files differdeleted file mode 100644 index 7c70da6..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_r.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_g.png Binary files differdeleted file mode 100644 index 3577fbb..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_h.png Binary files differdeleted file mode 100644 index 0aae48b..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_in.png Binary files differdeleted file mode 100644 index 3725b3f..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_in.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_inout.png Binary files differdeleted file mode 100644 index b72a274..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_lte.png Binary files differdeleted file mode 100644 index 2d2b106..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_network.png Binary files differdeleted file mode 100644 index 330b96b..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_network.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_signal.png Binary files differdeleted file mode 100644 index 30fe798..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_signal.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_out.png Binary files differdeleted file mode 100644 index aa2de43..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_r.png Binary files differdeleted file mode 100644 index a2003fc..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_r.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_1x.png Binary files differdeleted file mode 100644 index c4507c7..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_3g.png Binary files differdeleted file mode 100644 index bfef649..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_4g.png Binary files differdeleted file mode 100644 index c39658d..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_e.png Binary files differdeleted file mode 100644 index 0f2e79c..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_g.png Binary files differdeleted file mode 100644 index d37b2929..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_h.png Binary files differdeleted file mode 100644 index 96a1463..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_lte.png Binary files differdeleted file mode 100644 index 9b5dbfa..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_roam.png Binary files differdeleted file mode 100644 index cc6155f..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_roam.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png Binary files differdeleted file mode 100644 index 5950ef8..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png Binary files differdeleted file mode 100644 index a930649..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png Binary files differdeleted file mode 100644 index 9245462..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png Binary files differdeleted file mode 100644 index b5b8884..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png Binary files differdeleted file mode 100644 index 11b5832..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png Binary files differdeleted file mode 100644 index ff8246e..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.png Binary files differdeleted file mode 100644 index e0c5408..0000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.png +++ /dev/null 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 differdeleted file mode 100644 index 3afbca4..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_0.png +++ /dev/null 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 differdeleted file mode 100644 index 2994632..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.png +++ /dev/null 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 differdeleted file mode 100644 index a89191f..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.png +++ /dev/null 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 differdeleted file mode 100644 index b111939..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.png +++ /dev/null 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 differdeleted file mode 100644 index 98c8e25..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.png +++ /dev/null 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 differdeleted file mode 100644 index 8a8e323..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.png +++ /dev/null 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 differdeleted file mode 100644 index 625dbd9..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.png +++ /dev/null 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 differdeleted file mode 100644 index c1063a9..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.png +++ /dev/null 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 differdeleted file mode 100644 index f145410..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_0.png Binary files differdeleted file mode 100644 index ea4ab18..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_0.png +++ /dev/null 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 differdeleted file mode 100644 index 1d063d7..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1.png +++ /dev/null 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 differdeleted file mode 100644 index 2f76529..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1x.png +++ /dev/null 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 differdeleted file mode 100644 index b8551ac..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2.png +++ /dev/null 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 differdeleted file mode 100644 index 25e5586..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3.png +++ /dev/null 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 differdeleted file mode 100644 index 244280b..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3g.png +++ /dev/null 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 differdeleted file mode 100644 index f0bd70e..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4g.png Binary files differdeleted file mode 100644 index befe94d..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4g.png +++ /dev/null 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 differdeleted file mode 100644 index 01a81ab..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_e.png +++ /dev/null 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 differdeleted file mode 100644 index abed290..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_g.png +++ /dev/null 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 differdeleted file mode 100644 index e4b1fad..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_lte.png Binary files differdeleted file mode 100644 index da8ebce..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_lte.png +++ /dev/null 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 differdeleted file mode 100644 index 776210b..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_r.png +++ /dev/null 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 differdeleted file mode 100644 index a5de26f..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.png +++ /dev/null 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 differdeleted file mode 100644 index b3d4524..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.png +++ /dev/null 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 differdeleted file mode 100644 index 4a2119f..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png +++ /dev/null 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 differdeleted file mode 100644 index a53d764..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_lte.png Binary files differdeleted file mode 100644 index 0555eed..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_network.png Binary files differdeleted file mode 100644 index b27479a..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_network.png +++ /dev/null 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 differdeleted file mode 100644 index 5922161..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png +++ /dev/null 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 differdeleted file mode 100644 index 8b7251b..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png +++ /dev/null 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 differdeleted file mode 100644 index f1753d6..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.png +++ /dev/null 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 differdeleted file mode 100644 index b177999..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_0.png +++ /dev/null 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 differdeleted file mode 100644 index 60e38ad..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.png +++ /dev/null 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 differdeleted file mode 100644 index 8983380..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.png +++ /dev/null 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 differdeleted file mode 100644 index ff652df..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.png +++ /dev/null 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 differdeleted file mode 100644 index 8dd9c43..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.png +++ /dev/null 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 differdeleted file mode 100644 index b3318bc..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_1.png +++ /dev/null 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 differdeleted file mode 100644 index 18f5307..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_2.png +++ /dev/null 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 differdeleted file mode 100644 index 6d08001..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_3.png +++ /dev/null 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 differdeleted file mode 100644 index ef3023e..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_4.png +++ /dev/null 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 differdeleted file mode 100644 index 4a2119f..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png +++ /dev/null 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 differdeleted file mode 100644 index a53d764..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png +++ /dev/null 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 differdeleted file mode 100644 index 535a4fdc..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_not_connected.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_not_connected.png Binary files differdeleted file mode 100644 index b177999..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_not_connected.png +++ /dev/null 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 differdeleted file mode 100644 index 8b7251b..0000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_1x.png Binary files differdeleted file mode 100644 index 36713ae..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_3g.png Binary files differdeleted file mode 100644 index 1c9e313..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_4g.png Binary files differdeleted file mode 100644 index 7b1b16f..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_e.png Binary files differdeleted file mode 100644 index 02dc258..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_g.png Binary files differdeleted file mode 100644 index 27417d8..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_h.png Binary files differdeleted file mode 100644 index f3a805c..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_lte.png Binary files differdeleted file mode 100644 index 8a8c3d9..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_roam.png Binary files differdeleted file mode 100644 index fb2a6b6..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_roam.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png Binary files differdeleted file mode 100644 index ca02605..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png Binary files differdeleted file mode 100644 index 2dcbe28..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png Binary files differdeleted file mode 100644 index fe71893..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png Binary files differdeleted file mode 100644 index a6c61ff..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png Binary files differdeleted file mode 100644 index ba4a9d9..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png Binary files differdeleted file mode 100644 index 79c2ec1..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png Binary files differdeleted file mode 100644 index 4548617..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png Binary files differdeleted file mode 100644 index 3cc96ee..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png Binary files differdeleted file mode 100644 index 34ae3bf..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png Binary files differdeleted file mode 100644 index cb3623a..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png Binary files differdeleted file mode 100644 index 4f9a8b0..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png Binary files differdeleted file mode 100644 index 441de0c..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png Binary files differdeleted file mode 100644 index 34abc98..0000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png +++ /dev/null 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 differdeleted file mode 100644 index e303016..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_0.png +++ /dev/null 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 differdeleted file mode 100644 index abc9358..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.png +++ /dev/null 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 differdeleted file mode 100644 index f88e3a4..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.png +++ /dev/null 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 differdeleted file mode 100644 index 0419144..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.png +++ /dev/null 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 differdeleted file mode 100644 index 515ffe7..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.png +++ /dev/null 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 differdeleted file mode 100644 index 9aff8aa..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.png +++ /dev/null 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 differdeleted file mode 100644 index 118de2d..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.png +++ /dev/null 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 differdeleted file mode 100644 index 2e00303..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.png +++ /dev/null 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 differdeleted file mode 100644 index 33ae551..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_0.png Binary files differdeleted file mode 100644 index 2ef694e..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_0.png +++ /dev/null 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 differdeleted file mode 100644 index d6af953..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1.png +++ /dev/null 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 differdeleted file mode 100644 index 2866e4c..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1x.png +++ /dev/null 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 differdeleted file mode 100644 index a702239..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_2.png +++ /dev/null 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 differdeleted file mode 100644 index 33e0310..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3.png +++ /dev/null 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 differdeleted file mode 100644 index 922f7ca..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3g.png +++ /dev/null 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 differdeleted file mode 100644 index a857c32..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4g.png Binary files differdeleted file mode 100644 index 82ced1e..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4g.png +++ /dev/null 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 differdeleted file mode 100644 index 7ae8f90..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_e.png +++ /dev/null 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 differdeleted file mode 100644 index 050cbcb..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_g.png +++ /dev/null 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 differdeleted file mode 100644 index 7440bc0..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_lte.png Binary files differdeleted file mode 100644 index 4212e49..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_lte.png +++ /dev/null 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 differdeleted file mode 100644 index 2176a88..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_r.png +++ /dev/null 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 differdeleted file mode 100644 index fb09a26..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.png +++ /dev/null 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 differdeleted file mode 100644 index b52aec7..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.png +++ /dev/null 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 differdeleted file mode 100644 index 1664688..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png +++ /dev/null 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 differdeleted file mode 100644 index b38e3ef..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_lte.png Binary files differdeleted file mode 100644 index 9942e7a..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_network.png Binary files differdeleted file mode 100644 index f7571db..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_network.png +++ /dev/null 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 differdeleted file mode 100644 index 48650c7..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png +++ /dev/null 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 differdeleted file mode 100644 index c645859..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png +++ /dev/null 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 differdeleted file mode 100644 index 1efdebf..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.png +++ /dev/null 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 differdeleted file mode 100644 index 2afe504..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_0.png +++ /dev/null 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 differdeleted file mode 100644 index 715e60a..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.png +++ /dev/null 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 differdeleted file mode 100644 index ed7f5b9..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.png +++ /dev/null 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 differdeleted file mode 100644 index 8f1464b..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.png +++ /dev/null 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 differdeleted file mode 100644 index b32c676..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.png +++ /dev/null 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 differdeleted file mode 100644 index 6df8484..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_1.png +++ /dev/null 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 differdeleted file mode 100644 index d7915c6..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_2.png +++ /dev/null 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 differdeleted file mode 100644 index c3773d2..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_3.png +++ /dev/null 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 differdeleted file mode 100644 index 263d697..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_4.png +++ /dev/null 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 differdeleted file mode 100644 index 1664688..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png +++ /dev/null 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 differdeleted file mode 100644 index b38e3ef..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png +++ /dev/null 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 differdeleted file mode 100644 index b86f140..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_not_connected.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_not_connected.png Binary files differdeleted file mode 100644 index 2afe504..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_not_connected.png +++ /dev/null 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 differdeleted file mode 100644 index c645859..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_1x.png Binary files differdeleted file mode 100644 index 2204093..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_3g.png Binary files differdeleted file mode 100644 index 9f5e4af..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_4g.png Binary files differdeleted file mode 100644 index a95b9e1..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_e.png Binary files differdeleted file mode 100644 index 42ad245..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_g.png Binary files differdeleted file mode 100644 index fde5323..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_h.png Binary files differdeleted file mode 100644 index c6cca3e..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_lte.png Binary files differdeleted file mode 100644 index 84f5cb1..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_roam.png Binary files differdeleted file mode 100644 index 5228c29..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_roam.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png Binary files differdeleted file mode 100644 index 659275f..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png Binary files differdeleted file mode 100644 index 17c0d99..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png Binary files differdeleted file mode 100644 index 8a5a476..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png Binary files differdeleted file mode 100644 index a6c12b2..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png Binary files differdeleted file mode 100644 index 3fdc60e..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png Binary files differdeleted file mode 100644 index b09247e..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png Binary files differdeleted file mode 100644 index 3b94b6b..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png Binary files differdeleted file mode 100644 index e402ff6..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png Binary files differdeleted file mode 100644 index 313ce4e..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png Binary files differdeleted file mode 100644 index 546c7a8..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png Binary files differdeleted file mode 100644 index ec45d86..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png Binary files differdeleted file mode 100644 index 459a1a2..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png Binary files differdeleted file mode 100644 index d6f752a..0000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_0.png Binary files differdeleted file mode 100644 index 76f39c0..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1.png Binary files differdeleted file mode 100644 index 746b9ea..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1x.png Binary files differdeleted file mode 100644 index 6706ae2..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_2.png Binary files differdeleted file mode 100644 index 55ba5ab..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_2.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3.png Binary files differdeleted file mode 100644 index 547f875..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3g.png Binary files differdeleted file mode 100644 index 4d1dc75..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4.png Binary files differdeleted file mode 100644 index 1f65ad5..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4g.png Binary files differdeleted file mode 100644 index aab9d27..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_e.png Binary files differdeleted file mode 100644 index cd92c5f..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_0.png Binary files differdeleted file mode 100644 index eb4b855..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1.png Binary files differdeleted file mode 100644 index d8556b2..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1x.png Binary files differdeleted file mode 100644 index ed1f7c5..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_2.png Binary files differdeleted file mode 100644 index b913f6e..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_2.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3.png Binary files differdeleted file mode 100644 index 7a1de13..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3g.png Binary files differdeleted file mode 100644 index a4f4461..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4.png Binary files differdeleted file mode 100644 index 7b3d06d..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4g.png Binary files differdeleted file mode 100644 index 7cdcdf4..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_e.png Binary files differdeleted file mode 100644 index c9bed1a..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_g.png Binary files differdeleted file mode 100644 index b9aca9a..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_h.png Binary files differdeleted file mode 100644 index 25edf97..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_lte.png Binary files differdeleted file mode 100644 index 0dc66b4..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_r.png Binary files differdeleted file mode 100644 index b60cda6..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_r.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_g.png Binary files differdeleted file mode 100644 index b686376..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_h.png Binary files differdeleted file mode 100644 index bfe2271..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png Binary files differdeleted file mode 100644 index 3725b3f..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png Binary files differdeleted file mode 100644 index b72a274..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_lte.png Binary files differdeleted file mode 100644 index b5def3e..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_network.png Binary files differdeleted file mode 100644 index 78fe964..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_network.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.png Binary files differdeleted file mode 100644 index 9755011..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png Binary files differdeleted file mode 100644 index aa2de43..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_r.png Binary files differdeleted file mode 100644 index 60e2bd3..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_r.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_0.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_0.png Binary files differdeleted file mode 100644 index 1951654..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_1.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_1.png Binary files differdeleted file mode 100644 index 01274a6..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_1.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_2.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_2.png Binary files differdeleted file mode 100644 index a02832d..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_2.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_3.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_3.png Binary files differdeleted file mode 100644 index 7e55bbb..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_3.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_4.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_4.png Binary files differdeleted file mode 100644 index eeb8989..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_4.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_1.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_1.png Binary files differdeleted file mode 100644 index f60d8a5..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_1.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_2.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_2.png Binary files differdeleted file mode 100644 index ac88239..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_2.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_3.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_3.png Binary files differdeleted file mode 100644 index 4a3c770..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_3.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_4.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_4.png Binary files differdeleted file mode 100644 index b7e7d6f..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_4.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png Binary files differdeleted file mode 100644 index 5b80893..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png Binary files differdeleted file mode 100644 index 21b2118..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.png Binary files differdeleted file mode 100644 index 9bbb359..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_not_connected.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_not_connected.png Binary files differdeleted file mode 100644 index 89c8fc1..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_not_connected.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png Binary files differdeleted file mode 100644 index 3f0447d..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_1x.png Binary files differdeleted file mode 100644 index ba64922..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_1x.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_3g.png Binary files differdeleted file mode 100644 index 5b57c1e..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_3g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_4g.png Binary files differdeleted file mode 100644 index 64b8b26..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_4g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_e.png Binary files differdeleted file mode 100644 index 02e7411..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_e.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_g.png Binary files differdeleted file mode 100644 index 0a5dc61..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_g.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_h.png Binary files differdeleted file mode 100644 index 96a747c..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_h.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_lte.png Binary files differdeleted file mode 100644 index 46584bc..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_lte.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_roam.png Binary files differdeleted file mode 100644 index 1f8549e..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_roam.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png Binary files differdeleted file mode 100644 index 3c9d3e6..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png Binary files differdeleted file mode 100644 index 065f1da..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png Binary files differdeleted file mode 100644 index da2da18..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png Binary files differdeleted file mode 100644 index 30c5abf..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png Binary files differdeleted file mode 100644 index e49fd0a..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png Binary files differdeleted file mode 100644 index c5114e7..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.png Binary files differdeleted file mode 100644 index b388b8f..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png Binary files differdeleted file mode 100644 index bc272ed..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png Binary files differdeleted file mode 100644 index d032db3..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png Binary files differdeleted file mode 100644 index 562101b..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png Binary files differdeleted file mode 100644 index ceb4163..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png Binary files differdeleted file mode 100644 index 494b005..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png Binary files differdeleted file mode 100644 index 3da56ad..0000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_0.xml b/packages/SystemUI/res/drawable/ic_qs_signal_0.xml new file mode 100644 index 0000000..f63dfb1 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_0.xml @@ -0,0 +1,31 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="32dp" + android:height="32dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> + <path + android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z" + android:fillColor="#4DFFFFFF"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_1.xml b/packages/SystemUI/res/drawable/ic_qs_signal_1.xml new file mode 100644 index 0000000..adbda4a --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_1.xml @@ -0,0 +1,34 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="32dp" + android:height="32dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M11.300000,12.700000l-9.300000,9.300000 9.300000,0.000000z"/> + <path + android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z" + android:fillColor="#4DFFFFFF"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_1x.xml b/packages/SystemUI/res/drawable/ic_qs_signal_1x.xml new file mode 100644 index 0000000..71c40df --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_1x.xml @@ -0,0 +1,27 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="16.0dp" + android:height="32dp" + android:viewportWidth="12.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M3.500000,11.000000L1.800000,11.000000L1.800000,4.400000L0.200000,5.100000L0.200000,3.700000l3.100000,-1.300000l0.200000,0.000000L3.500000,11.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M8.600000,5.500000l1.200000,-3.000000l1.900000,0.000000L9.700000,6.700000l2.200000,4.300000L9.900000,11.000000L8.700000,7.900000L7.400000,11.000000L5.500000,11.000000l2.100000,-4.300000L5.600000,2.500000l1.900000,0.000000L8.600000,5.500000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_2.xml b/packages/SystemUI/res/drawable/ic_qs_signal_2.xml new file mode 100644 index 0000000..3358d65 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_2.xml @@ -0,0 +1,34 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="32dp" + android:height="32dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M13.900000,10.000000l-11.900000,12.000000 11.900000,0.000000z"/> + <path + android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z" + android:fillColor="#4DFFFFFF"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_3.xml b/packages/SystemUI/res/drawable/ic_qs_signal_3.xml new file mode 100644 index 0000000..63838a9 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_3.xml @@ -0,0 +1,34 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="32dp" + android:height="32dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,19.900000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,9.900000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M16.700001,7.200000l-14.700001,14.700000 14.700001,0.000000z"/> + <path + android:pathData="M17.700001,7.900000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z" + android:fillColor="#4DFFFFFF"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_3g.xml b/packages/SystemUI/res/drawable/ic_qs_signal_3g.xml new file mode 100644 index 0000000..e9a57ea --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_3g.xml @@ -0,0 +1,27 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="17.333334dp" + android:height="32dp" + android:viewportWidth="13.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M2.000000,6.000000l0.800000,0.000000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000s0.200000,-0.500000 0.200000,-0.900000c0.000000,-0.300000 -0.100000,-0.600000 -0.200000,-0.800000S3.200000,3.700000 2.900000,3.700000C2.700000,3.700000 2.500000,3.800000 2.300000,4.000000S2.100000,4.400000 2.100000,4.700000L0.500000,4.700000C0.500000,4.000000 0.700000,3.400000 1.100000,3.000000s1.000000,-0.600000 1.700000,-0.600000c0.800000,0.000000 1.400000,0.200000 1.900000,0.600000s0.700000,1.000000 0.700000,1.800000c0.000000,0.400000 -0.100000,0.700000 -0.300000,1.100000S4.600000,6.500000 4.300000,6.600000C4.700000,6.800000 5.000000,7.100000 5.200000,7.400000s0.300000,0.700000 0.300000,1.200000c0.000000,0.800000 -0.200000,1.400000 -0.700000,1.800000s-1.100000,0.700000 -1.900000,0.700000c-0.700000,0.000000 -1.300000,-0.200000 -1.800000,-0.600000s-0.700000,-1.000000 -0.700000,-1.800000L2.000000,8.700000C2.000000,9.000000 2.100000,9.300000 2.300000,9.500000s0.400000,0.300000 0.600000,0.300000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000S3.900000,9.000000 3.900000,8.600000c0.000000,-0.500000 -0.100000,-0.800000 -0.300000,-1.000000S3.200000,7.300000 2.800000,7.300000L2.000000,7.300000L2.000000,6.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M12.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.700000,9.000000 6.700000,7.900000L6.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000s-0.500000,-0.300000 -0.900000,-0.300000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S8.400000,5.000000 8.400000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.799999,7.800000L9.600000,7.800000L9.600000,6.600000l2.900000,0.000000L12.500000,9.900000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_4.xml b/packages/SystemUI/res/drawable/ic_qs_signal_4.xml new file mode 100644 index 0000000..76690cc --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_4.xml @@ -0,0 +1,31 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="32dp" + android:height="32dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M2.000000,22.000000l15.700001,0.000000 0.000000,-14.000000 4.299999,0.000000 0.000000,-6.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_4g.xml b/packages/SystemUI/res/drawable/ic_qs_signal_4g.xml new file mode 100644 index 0000000..42045d1 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_4g.xml @@ -0,0 +1,27 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="16.0dp" + android:height="32dp" + android:viewportWidth="12.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M4.600000,7.800000l0.700000,0.000000l0.000000,1.300000L4.600000,9.100000L4.600000,11.000000L3.000000,11.000000L3.000000,9.200000L0.100000,9.200000L0.000000,8.100000L3.000000,2.500000l1.700000,0.000000L4.700000,7.800000zM1.600000,7.800000L3.000000,7.800000l0.000000,-3.000000L2.900000,5.000000L1.600000,7.800000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M11.900000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.100000,9.000000 6.100000,7.900000L6.100000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000S8.100000,2.400000 9.000000,2.400000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S9.500000,3.700000 9.000000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S7.700000,5.000000 7.700000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.099999,7.800000L9.000000,7.800000L9.000000,6.600000l2.900000,0.000000L11.900000,9.900000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_disabled.xml b/packages/SystemUI/res/drawable/ic_qs_signal_disabled.xml new file mode 100644 index 0000000..4f253e3 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_disabled.xml @@ -0,0 +1,28 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="32dp" + android:height="32dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M21.799999,22.299999l-1.199999,-1.299999 0.000000,0.000000 -9.600000,-10.000000 0.000000,0.000000 -6.400000,-6.700000 -1.300000,1.300000 6.400000,6.700000 -8.700000,8.700000 16.900000,0.000000 2.600000,2.700001z"/> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M21.000000,1.000000l-8.600000,8.600000 8.600000,9.100000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_e.xml b/packages/SystemUI/res/drawable/ic_qs_signal_e.xml new file mode 100644 index 0000000..e49a409 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_e.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="6.6666665dp" + android:height="32dp" + android:viewportWidth="5.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M4.400000,7.300000L1.700000,7.300000l0.000000,2.400000l3.300000,0.000000L5.000000,11.000000L0.000000,11.000000L0.000000,2.500000l4.900000,0.000000l0.000000,1.300000L1.700000,3.800000l0.000000,2.100000l2.800000,0.000000L4.500000,7.300000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_0.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_0.xml new file mode 100644 index 0000000..326373d --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_full_0.xml @@ -0,0 +1,25 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="32dp" + android:height="32dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_1.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_1.xml new file mode 100644 index 0000000..a71e33a --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_full_1.xml @@ -0,0 +1,28 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="32dp" + android:height="32dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M11.300000,12.700000l-9.300000,9.300000 9.300000,0.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_2.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_2.xml new file mode 100644 index 0000000..bf19a71 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_full_2.xml @@ -0,0 +1,28 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="32dp" + android:height="32dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M14.000000,10.000000l-12.000000,12.000000 12.000000,0.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_3.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_3.xml new file mode 100644 index 0000000..01839e85 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_full_3.xml @@ -0,0 +1,28 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="32dp" + android:height="32dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M16.700001,7.300000l-14.700001,14.700000 14.700001,0.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_4.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_4.xml new file mode 100644 index 0000000..48151ad --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_full_4.xml @@ -0,0 +1,25 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="32dp" + android:height="32dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_g.xml b/packages/SystemUI/res/drawable/ic_qs_signal_g.xml new file mode 100644 index 0000000..9d42a44 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_g.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="9.333333dp" + android:height="32dp" + android:viewportWidth="7.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M6.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S0.700000,9.000000 0.700000,7.900000L0.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000L4.700000,5.200000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S4.000000,3.700000 3.600000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S2.300000,5.000000 2.300000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L4.700000,7.800000L3.500000,7.800000L3.500000,6.600000l2.900000,0.000000L6.400000,9.900000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_h.xml b/packages/SystemUI/res/drawable/ic_qs_signal_h.xml new file mode 100644 index 0000000..f509d71 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_h.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="8.0dp" + android:height="32dp" + android:viewportWidth="6.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M6.000000,11.000000L4.400000,11.000000L4.400000,7.500000L1.700000,7.500000L1.700000,11.000000L0.000000,11.000000L0.000000,2.500000l1.700000,0.000000l0.000000,3.700000l2.700000,0.000000L4.400000,2.500000L6.000000,2.500000L6.000000,11.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_in.xml b/packages/SystemUI/res/drawable/ic_qs_signal_in.xml new file mode 100644 index 0000000..236fdac --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_in.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="6.0dp" + android:height="32dp" + android:viewportWidth="6.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M6.000000,15.700000l-3.000000,5.599999 -3.000000,-5.599999z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_lte.xml b/packages/SystemUI/res/drawable/ic_qs_signal_lte.xml new file mode 100644 index 0000000..b7242e6 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_lte.xml @@ -0,0 +1,30 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="17.333334dp" + android:height="32dp" + android:viewportWidth="13.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M2.000000,9.700000l2.000000,0.000000L4.000000,11.000000L0.300000,11.000000L0.300000,2.500000L2.000000,2.500000L2.000000,9.700000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M8.300000,3.800000L7.000000,3.800000L7.000000,11.000000L5.300000,11.000000L5.300000,3.800000L4.000000,3.800000L4.000000,2.500000l4.300000,0.000000L8.300000,3.800000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M12.400000,7.300000l-1.700000,0.000000l0.000000,2.400000l2.100000,0.000000L12.799999,11.000000L9.000000,11.000000L9.000000,2.500000l3.700000,0.000000l0.000000,1.300000l-2.100000,0.000000l0.000000,2.100000l1.700000,0.000000L12.300000,7.300000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_no_signal.xml b/packages/SystemUI/res/drawable/ic_qs_signal_no_signal.xml new file mode 100644 index 0000000..f7fd97c --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_no_signal.xml @@ -0,0 +1,25 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="32dp" + android:height="32dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M2.000000,22.000000l20.000000,0.000000L22.000000,2.000000L2.000000,22.000000zM20.000000,20.000000L6.800000,20.000000L20.000000,6.800000L20.000000,20.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_out.xml b/packages/SystemUI/res/drawable/ic_qs_signal_out.xml new file mode 100644 index 0000000..c510972 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_out.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="6.0dp" + android:height="32dp" + android:viewportWidth="6.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M0.000000,13.700000l3.000000,-5.700000 3.000000,5.700000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_r.xml b/packages/SystemUI/res/drawable/ic_qs_signal_r.xml new file mode 100644 index 0000000..66f64c9 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_r.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="8.0dp" + android:height="32dp" + android:viewportWidth="6.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M2.800000,7.900000l-1.000000,0.000000L1.800000,11.000000L0.200000,11.000000L0.200000,2.500000l2.700000,0.000000c0.900000,0.000000 1.500000,0.200000 2.000000,0.700000s0.700000,1.100000 0.700000,1.900000c0.000000,0.600000 -0.100000,1.100000 -0.300000,1.500000S4.800000,7.200000 4.400000,7.400000l1.500000,3.500000L5.900000,11.000000L4.100000,11.000000L2.800000,7.900000zM1.800000,6.500000l1.100000,0.000000c0.400000,0.000000 0.600000,-0.100000 0.800000,-0.400000S4.000000,5.600000 4.000000,5.200000c0.000000,-0.400000 -0.100000,-0.800000 -0.300000,-1.000000S3.300000,3.800000 2.900000,3.800000L1.800000,3.800000L1.800000,6.500000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_0.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_0.xml new file mode 100644 index 0000000..50c427e --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_0.xml @@ -0,0 +1,30 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32.0dp" + android:height="29.5dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M19.000000,8.000000l5.300000,0.000000l1.200000,-1.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_1.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_1.xml new file mode 100644 index 0000000..a2d11a0 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_1.xml @@ -0,0 +1,33 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32.0dp" + android:height="29.5dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M13.000000,22.000000l5.500000,-6.800000c-0.200000,-0.200000 -2.300000,-1.900000 -5.500000,-1.900000s-5.300000,1.800000 -5.500000,1.900000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_2.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_2.xml new file mode 100644 index 0000000..f2043fc --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_2.xml @@ -0,0 +1,33 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32.0dp" + android:height="29.5dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.000000,11.600000c-1.300000,-0.700000 -3.400000,-1.600000 -6.000000,-1.600000c-4.400000,0.000000 -7.300000,2.400000 -7.600000,2.700000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,11.600000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_3.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_3.xml new file mode 100644 index 0000000..b7a4f4c --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_3.xml @@ -0,0 +1,33 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32.0dp" + android:height="29.5dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.000000,8.600000c-1.600000,-0.700000 -3.600000,-1.300000 -6.000000,-1.300000c-5.300000,0.000000 -8.900000,3.000000 -9.200000,3.200000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.600000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_4.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_4.xml new file mode 100644 index 0000000..35a9138 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_4.xml @@ -0,0 +1,30 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32.0dp" + android:height="29.5dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_disabled.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_disabled.xml new file mode 100644 index 0000000..c505783 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_disabled.xml @@ -0,0 +1,27 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32.0dp" + android:height="29.5dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M17.500000,16.500000L5.800000,3.400000c0.000000,0.000000 0.000000,0.000000 0.000000,0.000000l-2.700000,-3.000000L1.600000,1.800000l2.200000,2.500000c-2.000000,1.000000 -3.200000,2.000000 -3.400000,2.200000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l3.200000,-3.900000l2.400000,2.700000l1.500000,-1.400000L17.500000,16.500000L17.500000,16.500000z"/> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000c-1.900000,0.000000 -3.600000,0.300000 -5.200000,0.700000L18.700001,15.000000L25.600000,6.500000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_full_0.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_full_0.xml new file mode 100644 index 0000000..1bc7438 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_full_0.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32.0dp" + android:height="29.5dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_full_1.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_full_1.xml new file mode 100644 index 0000000..5856115 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_full_1.xml @@ -0,0 +1,27 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32.0dp" + android:height="29.5dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M13.100000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.500000,6.500000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M13.100000,22.000000l5.500000,-6.800000c-0.200000,-0.200000 -2.300000,-1.900000 -5.500000,-1.900000s-5.300000,1.800000 -5.500000,1.900000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_full_2.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_full_2.xml new file mode 100644 index 0000000..4a5e1f8 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_full_2.xml @@ -0,0 +1,27 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32.0dp" + android:height="29.5dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M13.000000,22.000000l7.600000,-9.400000C20.299999,12.400000 17.400000,10.000000 13.000000,10.000000s-7.300000,2.400000 -7.600000,2.700000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_full_3.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_full_3.xml new file mode 100644 index 0000000..965442d --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_full_3.xml @@ -0,0 +1,27 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32.0dp" + android:height="29.5dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M13.000000,22.000000l9.200000,-11.400000c-0.400000,-0.300000 -3.900000,-3.200000 -9.200000,-3.200000s-8.900000,3.000000 -9.200000,3.200000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_full_4.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_full_4.xml new file mode 100644 index 0000000..b29d3f9 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_full_4.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32.0dp" + android:height="29.5dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_no_network.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_no_network.xml new file mode 100644 index 0000000..3d58869 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_no_network.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32.0dp" + android:height="29.5dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M13.000000,2.000000C7.700000,2.000000 3.700000,3.900000 0.400000,6.400000L13.000000,22.000000L25.600000,6.500000C22.299999,4.000000 18.299999,2.000000 13.000000,2.000000zM13.000000,18.600000L3.300000,7.000000l0.000000,0.000000l0.000000,0.000000C6.000000,5.300000 8.700000,4.000000 13.000000,4.000000s7.000000,1.400000 9.700000,3.000000l0.000000,0.000000l0.000000,0.000000L13.000000,18.600000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_1x.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_1x.xml new file mode 100644 index 0000000..26d2632 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_1x.xml @@ -0,0 +1,27 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="9.0dp" + android:height="18dp" + android:viewportWidth="12.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M3.500000,11.000000L1.800000,11.000000L1.800000,4.400000L0.200000,5.100000L0.200000,3.700000l3.100000,-1.300000l0.200000,0.000000L3.500000,11.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M8.600000,5.500000l1.200000,-3.000000l1.900000,0.000000L9.700000,6.700000l2.200000,4.300000L9.900000,11.000000L8.700000,7.900000L7.400000,11.000000L5.500000,11.000000l2.100000,-4.300000L5.600000,2.500000l1.900000,0.000000L8.600000,5.500000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_3g.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_3g.xml new file mode 100644 index 0000000..5aaf93b --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_3g.xml @@ -0,0 +1,27 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="9.75dp" + android:height="18dp" + android:viewportWidth="13.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M2.000000,6.000000l0.800000,0.000000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000s0.200000,-0.500000 0.200000,-0.900000c0.000000,-0.300000 -0.100000,-0.600000 -0.200000,-0.800000S3.200000,3.700000 2.900000,3.700000C2.700000,3.700000 2.500000,3.800000 2.300000,4.000000S2.100000,4.400000 2.100000,4.700000L0.500000,4.700000C0.500000,4.000000 0.700000,3.400000 1.100000,3.000000s1.000000,-0.600000 1.700000,-0.600000c0.800000,0.000000 1.400000,0.200000 1.900000,0.600000s0.700000,1.000000 0.700000,1.800000c0.000000,0.400000 -0.100000,0.700000 -0.300000,1.100000S4.600000,6.500000 4.300000,6.600000C4.700000,6.800000 5.000000,7.100000 5.200000,7.400000s0.300000,0.700000 0.300000,1.200000c0.000000,0.800000 -0.200000,1.400000 -0.700000,1.800000s-1.100000,0.700000 -1.900000,0.700000c-0.700000,0.000000 -1.300000,-0.200000 -1.800000,-0.600000s-0.700000,-1.000000 -0.700000,-1.800000L2.000000,8.700000C2.000000,9.000000 2.100000,9.300000 2.300000,9.500000s0.400000,0.300000 0.600000,0.300000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000S3.900000,9.000000 3.900000,8.600000c0.000000,-0.500000 -0.100000,-0.800000 -0.300000,-1.000000S3.200000,7.300000 2.800000,7.300000L2.000000,7.300000L2.000000,6.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M12.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.700000,9.000000 6.700000,7.900000L6.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000s-0.500000,-0.300000 -0.900000,-0.300000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S8.400000,5.000000 8.400000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.799999,7.800000L9.600000,7.800000L9.600000,6.600000l2.900000,0.000000L12.500000,9.900000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g.xml new file mode 100644 index 0000000..b7d84f0 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g.xml @@ -0,0 +1,27 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="9.0dp" + android:height="18dp" + android:viewportWidth="12.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M4.600000,7.800000l0.700000,0.000000l0.000000,1.300000L4.600000,9.100000L4.600000,11.000000L3.000000,11.000000L3.000000,9.200000L0.100000,9.200000L0.000000,8.100000L3.000000,2.500000l1.700000,0.000000L4.700000,7.800000zM1.600000,7.800000L3.000000,7.800000l0.000000,-3.000000L2.900000,5.000000L1.600000,7.800000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M11.900000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.100000,9.000000 6.100000,7.900000L6.100000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000S8.100000,2.400000 9.000000,2.400000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S9.500000,3.700000 9.000000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S7.700000,5.000000 7.700000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.099999,7.800000L9.000000,7.800000L9.000000,6.600000l2.900000,0.000000L11.900000,9.900000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_e.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_e.xml new file mode 100644 index 0000000..7111457 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_e.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="3.75dp" + android:height="18dp" + android:viewportWidth="5.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M4.400000,7.300000L1.700000,7.300000l0.000000,2.400000l3.300000,0.000000L5.000000,11.000000L0.000000,11.000000L0.000000,2.500000l4.900000,0.000000l0.000000,1.300000L1.700000,3.800000l0.000000,2.100000l2.800000,0.000000L4.500000,7.300000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_g.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_g.xml new file mode 100644 index 0000000..97962b2 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_g.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="5.25dp" + android:height="18dp" + android:viewportWidth="7.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M6.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S0.700000,9.000000 0.700000,7.900000L0.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000L4.700000,5.200000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S4.000000,3.700000 3.600000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S2.300000,5.000000 2.300000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L4.700000,7.800000L3.500000,7.800000L3.500000,6.600000l2.900000,0.000000L6.400000,9.900000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_h.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_h.xml new file mode 100644 index 0000000..4859c14 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_h.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="4.5dp" + android:height="18dp" + android:viewportWidth="6.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M6.000000,11.000000L4.400000,11.000000L4.400000,7.500000L1.700000,7.500000L1.700000,11.000000L0.000000,11.000000L0.000000,2.500000l1.700000,0.000000l0.000000,3.700000l2.700000,0.000000L4.400000,2.500000L6.000000,2.500000L6.000000,11.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte.xml new file mode 100644 index 0000000..d6446db --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte.xml @@ -0,0 +1,30 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="9.75dp" + android:height="18dp" + android:viewportWidth="13.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M2.000000,9.700000l2.000000,0.000000L4.000000,11.000000L0.300000,11.000000L0.300000,2.500000L2.000000,2.500000L2.000000,9.700000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M8.300000,3.800000L7.000000,3.800000L7.000000,11.000000L5.300000,11.000000L5.300000,3.800000L4.000000,3.800000L4.000000,2.500000l4.300000,0.000000L8.300000,3.800000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M12.400000,7.300000l-1.700000,0.000000l0.000000,2.400000l2.100000,0.000000L12.799999,11.000000L9.000000,11.000000L9.000000,2.500000l3.700000,0.000000l0.000000,1.300000l-2.100000,0.000000l0.000000,2.100000l1.700000,0.000000L12.300000,7.300000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_roam.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_roam.xml new file mode 100644 index 0000000..7f7d5fc --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_roam.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="4.5dp" + android:height="18dp" + android:viewportWidth="6.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M2.800000,7.900000l-1.000000,0.000000L1.800000,11.000000L0.200000,11.000000L0.200000,2.500000l2.700000,0.000000c0.900000,0.000000 1.500000,0.200000 2.000000,0.700000s0.700000,1.100000 0.700000,1.900000c0.000000,0.600000 -0.100000,1.100000 -0.300000,1.500000S4.800000,7.200000 4.400000,7.400000l1.500000,3.500000L5.900000,11.000000L4.100000,11.000000L2.800000,7.900000zM1.800000,6.500000l1.100000,0.000000c0.400000,0.000000 0.600000,-0.100000 0.800000,-0.400000S4.000000,5.600000 4.000000,5.200000c0.000000,-0.400000 -0.100000,-0.800000 -0.300000,-1.000000S3.300000,3.800000 2.900000,3.800000L1.800000,3.800000L1.800000,6.500000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_0.xml b/packages/SystemUI/res/drawable/stat_sys_signal_0.xml new file mode 100644 index 0000000..67d9259 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_signal_0.xml @@ -0,0 +1,31 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="18dp" + android:height="18dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> + <path + android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z" + android:fillColor="#4DFFFFFF"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_0_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_0_fully.xml new file mode 100644 index 0000000..3bbb800 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_signal_0_fully.xml @@ -0,0 +1,25 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="18dp" + android:height="18dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_1.xml b/packages/SystemUI/res/drawable/stat_sys_signal_1.xml new file mode 100644 index 0000000..55f764a --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_signal_1.xml @@ -0,0 +1,34 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="18dp" + android:height="18dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M11.300000,12.700000l-9.300000,9.300000 9.300000,0.000000z"/> + <path + android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z" + android:fillColor="#4DFFFFFF"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_1_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_1_fully.xml new file mode 100644 index 0000000..b82e428 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_signal_1_fully.xml @@ -0,0 +1,28 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="18dp" + android:height="18dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M11.300000,12.700000l-9.300000,9.300000 9.300000,0.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_2.xml b/packages/SystemUI/res/drawable/stat_sys_signal_2.xml new file mode 100644 index 0000000..ca0eeb3 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_signal_2.xml @@ -0,0 +1,34 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="18dp" + android:height="18dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M13.900000,10.000000l-11.900000,12.000000 11.900000,0.000000z"/> + <path + android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z" + android:fillColor="#4DFFFFFF"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_2_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_2_fully.xml new file mode 100644 index 0000000..abc8dd1 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_signal_2_fully.xml @@ -0,0 +1,28 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="18dp" + android:height="18dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M14.000000,10.000000l-12.000000,12.000000 12.000000,0.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_3.xml b/packages/SystemUI/res/drawable/stat_sys_signal_3.xml new file mode 100644 index 0000000..2b3e571 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_signal_3.xml @@ -0,0 +1,34 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="18dp" + android:height="18dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,19.900000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,9.900000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M16.700001,7.200000l-14.700001,14.700000 14.700001,0.000000z"/> + <path + android:pathData="M17.700001,7.900000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z" + android:fillColor="#4DFFFFFF"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_3_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_3_fully.xml new file mode 100644 index 0000000..d47f167 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_signal_3_fully.xml @@ -0,0 +1,28 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="18dp" + android:height="18dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M16.700001,7.300000l-14.700001,14.700000 14.700001,0.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_4.xml b/packages/SystemUI/res/drawable/stat_sys_signal_4.xml new file mode 100644 index 0000000..7d4dd8a --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_signal_4.xml @@ -0,0 +1,31 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="18dp" + android:height="18dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M2.000000,22.000000l15.700001,0.000000 0.000000,-14.000000 4.299999,0.000000 0.000000,-6.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_4_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_4_fully.xml new file mode 100644 index 0000000..5b1bac3 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_signal_4_fully.xml @@ -0,0 +1,25 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="18dp" + android:height="18dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_null.xml b/packages/SystemUI/res/drawable/stat_sys_signal_null.xml new file mode 100644 index 0000000..45d34a2 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_signal_null.xml @@ -0,0 +1,25 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:width="18dp" + android:height="18dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M2.000000,22.000000l20.000000,0.000000L22.000000,2.000000L2.000000,22.000000zM20.000000,20.000000L6.800000,20.000000L20.000000,6.800000L20.000000,20.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0.xml new file mode 100644 index 0000000..4965674 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0.xml @@ -0,0 +1,30 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="20dp" + android:height="18dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M19.000000,8.000000l5.300000,0.000000l1.200000,-1.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0_fully.xml new file mode 100644 index 0000000..e9cad0e --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0_fully.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="20dp" + android:height="18dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1.xml new file mode 100644 index 0000000..7d588a3 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1.xml @@ -0,0 +1,33 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="20dp" + android:height="18dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M13.000000,22.000000l5.500000,-6.800000c-0.200000,-0.200000 -2.300000,-1.900000 -5.500000,-1.900000s-5.300000,1.800000 -5.500000,1.900000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1_fully.xml new file mode 100644 index 0000000..348f963 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1_fully.xml @@ -0,0 +1,27 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="20dp" + android:height="18dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M13.100000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.500000,6.500000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M13.100000,22.000000l5.500000,-6.800000c-0.200000,-0.200000 -2.300000,-1.900000 -5.500000,-1.900000s-5.300000,1.800000 -5.500000,1.900000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2.xml new file mode 100644 index 0000000..4fbdd69 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2.xml @@ -0,0 +1,33 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="20dp" + android:height="18dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.000000,11.600000c-1.300000,-0.700000 -3.400000,-1.600000 -6.000000,-1.600000c-4.400000,0.000000 -7.300000,2.400000 -7.600000,2.700000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,11.600000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2_fully.xml new file mode 100644 index 0000000..66588f0 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2_fully.xml @@ -0,0 +1,27 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="20dp" + android:height="18dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M13.000000,22.000000l7.600000,-9.400000C20.299999,12.400000 17.400000,10.000000 13.000000,10.000000s-7.300000,2.400000 -7.600000,2.700000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3.xml new file mode 100644 index 0000000..1f3de74 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3.xml @@ -0,0 +1,33 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="20dp" + android:height="18dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.000000,8.600000c-1.600000,-0.700000 -3.600000,-1.300000 -6.000000,-1.300000c-5.300000,0.000000 -8.900000,3.000000 -9.200000,3.200000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.600000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3_fully.xml new file mode 100644 index 0000000..aa5d2ed --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3_fully.xml @@ -0,0 +1,27 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="20dp" + android:height="18dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M13.000000,22.000000l9.200000,-11.400000c-0.400000,-0.300000 -3.900000,-3.200000 -9.200000,-3.200000s-8.900000,3.000000 -9.200000,3.200000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4.xml new file mode 100644 index 0000000..ca53b56 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4.xml @@ -0,0 +1,30 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="20dp" + android:height="18dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4_fully.xml new file mode 100644 index 0000000..1c7a539 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4_fully.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="20dp" + android:height="18dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml new file mode 100644 index 0000000..c68fb49 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="20dp" + android:height="18dp" + android:viewportWidth="26.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M13.000000,2.000000C7.700000,2.000000 3.700000,3.900000 0.400000,6.400000L13.000000,22.000000L25.600000,6.500000C22.299999,4.000000 18.299999,2.000000 13.000000,2.000000zM13.000000,18.600000L3.300000,7.000000l0.000000,0.000000l0.000000,0.000000C6.000000,5.300000 8.700000,4.000000 13.000000,4.000000s7.000000,1.400000 9.700000,3.000000l0.000000,0.000000l0.000000,0.000000L13.000000,18.600000z"/> +</vector> diff --git a/packages/SystemUI/res/layout/signal_cluster_view.xml b/packages/SystemUI/res/layout/signal_cluster_view.xml index 2b9cef91..ae54f8c 100644 --- a/packages/SystemUI/res/layout/signal_cluster_view.xml +++ b/packages/SystemUI/res/layout/signal_cluster_view.xml @@ -17,27 +17,23 @@ ** limitations under the License. */ --> - +<!-- extends LinearLayout --> <com.android.systemui.statusbar.SignalClusterView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="wrap_content" - android:gravity="center" + android:gravity="center_vertical" android:orientation="horizontal" > <FrameLayout android:id="@+id/wifi_combo" android:layout_height="wrap_content" android:layout_width="wrap_content" - android:layout_marginEnd="-6dp" > <ImageView android:id="@+id/wifi_signal" android:layout_height="wrap_content" android:layout_width="wrap_content" - android:layout_alignParentEnd="true" - android:layout_centerVertical="true" - android:scaleType="center" /> </FrameLayout> <View @@ -46,22 +42,6 @@ android:visibility="gone" android:id="@+id/spacer" /> - <!--<FrameLayout - android:id="@+id/wimax_combo" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:layout_marginEnd="-6dp" - > - <ImageView - android:id="@+id/wimax_signal" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:layout_alignParentEnd="true" - android:layout_centerVertical="true" - android:scaleType="center" - /> - </FrameLayout> - --> <FrameLayout android:layout_height="wrap_content" android:layout_width="wrap_content" diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 32474c9..32425ad 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -201,8 +201,8 @@ <!-- The min translation in the Z index for the last task. --> <dimen name="recents_task_view_z_min">5dp</dimen> - <!-- The translation in the Z index for each task above the last task. --> - <dimen name="recents_task_view_z_increment">10dp</dimen> + <!-- The max translation in the Z index for the last task. --> + <dimen name="recents_task_view_z_max">65dp</dimen> <!-- The amount to translate when animating the removal of a task. --> <dimen name="recents_task_view_remove_anim_translation_x">100dp</dimen> @@ -395,4 +395,8 @@ <!-- Margin on the left side of the battery % when on Keyguard. --> <dimen name="header_battery_margin_keyguard">6dp</dimen> + + <!-- Additional translation (downwards) for appearing notifications when going to the full shade + from Keyguard. --> + <dimen name="go_to_full_shade_appearing_translation">200dp</dimen> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags b/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags index aa32e9c..5f2c348 100644 --- a/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags +++ b/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags @@ -6,6 +6,7 @@ option java_package com.android.systemui; # PhoneStatusBar.java # --------------------------- 36000 sysui_statusbar_touch (type|1),(x|1),(y|1),(enabled|1) +36001 sysui_heads_up_status (key|3),(visible|1) # --------------------------- # PhoneStatusBarView.java diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 4901f40..d216069 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -95,7 +95,7 @@ public class QSPanel extends ViewGroup { mDetailDoneButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - showDetail(false, mDetailRecord); + closeDetail(); } }); } @@ -134,7 +134,7 @@ public class QSPanel extends ViewGroup { if (mExpanded == expanded) return; mExpanded = expanded; if (!mExpanded) { - showDetail(false /*show*/, mDetailRecord); + closeDetail(); } } @@ -226,6 +226,14 @@ public class QSPanel extends ViewGroup { addView(r.tileView); } + public boolean isShowingDetail() { + return mDetailRecord != null; + } + + public void closeDetail() { + showDetail(false, mDetailRecord); + } + private void handleShowDetail(Record r, boolean show) { if (r instanceof TileRecord) { handleShowDetailTile((TileRecord) r, show); diff --git a/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java b/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java index d9447f7..1a555f1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java @@ -18,8 +18,6 @@ package com.android.systemui.qs; import android.animation.ValueAnimator; import android.content.Context; -import android.graphics.ColorFilter; -import android.graphics.LightingColorFilter; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; @@ -31,7 +29,6 @@ import com.android.systemui.qs.QSTile.SignalState; public final class SignalTileView extends QSTileView { private static final long DEFAULT_DURATION = new ValueAnimator().getDuration(); private static final long SHORT_DURATION = DEFAULT_DURATION / 3; - private static final ColorFilter FILTER = new LightingColorFilter(0xffffffff, 0xff283034); private FrameLayout mIconFrame; private ImageView mSignal; @@ -49,7 +46,6 @@ public final class SignalTileView extends QSTileView { private ImageView addTrafficView(int icon) { final ImageView traffic = new ImageView(mContext); traffic.setImageResource(icon); - traffic.setColorFilter(FILTER); traffic.setAlpha(0f); addView(traffic); return traffic; @@ -61,7 +57,7 @@ public final class SignalTileView extends QSTileView { mSignal = new ImageView(mContext); mIconFrame.addView(mSignal); mOverlay = new ImageView(mContext); - mIconFrame.addView(mOverlay); + mIconFrame.addView(mOverlay, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); return mIconFrame; } @@ -95,12 +91,10 @@ public final class SignalTileView extends QSTileView { final SignalState s = (SignalState) state; mSignal.setImageDrawable(null); // force refresh mSignal.setImageResource(s.iconId); - mSignal.setColorFilter(s.filter ? FILTER : null); if (s.overlayIconId > 0) { mOverlay.setVisibility(VISIBLE); mOverlay.setImageDrawable(null); // force refresh mOverlay.setImageResource(s.overlayIconId); - mOverlay.setColorFilter(s.filter ? FILTER : null); } else { mOverlay.setVisibility(GONE); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java index 42da282..ce42d47 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java @@ -91,10 +91,9 @@ public class CellularTile extends QSTile<QSTile.SignalState> { if (cb == null) return; final Resources r = mContext.getResources(); - state.iconId = cb.noSim - ? R.drawable.stat_sys_no_sim - : cb.enabled && (cb.mobileSignalIconId > 0) && !cb.airplaneModeEnabled - ? cb.mobileSignalIconId + state.iconId = cb.noSim ? R.drawable.stat_sys_no_sim + : !cb.enabled || cb.airplaneModeEnabled ? R.drawable.ic_qs_signal_disabled + : cb.mobileSignalIconId > 0 ? cb.mobileSignalIconId : R.drawable.ic_qs_signal_no_signal; state.overlayIconId = cb.enabled && (cb.dataTypeIconId > 0) && !cb.wifiConnected ? cb.dataTypeIconId diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java index 1707b32..5651d49 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java @@ -113,7 +113,11 @@ public class WifiTile extends QSTile<QSTile.SignalState> { state.filter = true; final String signalContentDescription; final Resources r = mContext.getResources(); - if (wifiConnected) { + if (!state.enabled) { + state.iconId = R.drawable.ic_qs_wifi_disabled; + state.label = r.getString(R.string.quick_settings_wifi_label); + signalContentDescription = r.getString(R.string.accessibility_wifi_off); + } else if (wifiConnected) { state.iconId = cb.wifiSignalIconId; state.label = removeDoubleQuotes(cb.enabledDesc); signalContentDescription = cb.wifiSignalContentDescription; diff --git a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java index cbcacc4..0b08b93 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java +++ b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java @@ -105,7 +105,8 @@ public class AlternateRecentsComponent implements ActivityOptions.OnAnimationSta } public void onStart() { - // Do nothing + // Initialize some static datastructures + TaskStackViewLayoutAlgorithm.initializeCurve(); } public void onBootCompleted() { @@ -322,7 +323,7 @@ public class AlternateRecentsComponent implements ActivityOptions.OnAnimationSta Rect taskStackBounds = new Rect(mTaskStackBounds); taskStackBounds.bottom -= mSystemInsets.bottom; tsv.computeRects(mWindowRect.width(), mWindowRect.height(), taskStackBounds); - tsv.setStackScrollToInitialState(); + tsv.getScroller().setStackScrollToInitialState(); // Find the running task in the TaskStack Task task = null; @@ -344,7 +345,7 @@ public class AlternateRecentsComponent implements ActivityOptions.OnAnimationSta } // Get the transform for the running task - mTmpTransform = algo.getStackTransform(task, tsv.getStackScroll(), mTmpTransform); + mTmpTransform = algo.getStackTransform(task, tsv.getScroller().getStackScroll(), mTmpTransform, null); return new Rect(mTmpTransform.rect); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/Constants.java b/packages/SystemUI/src/com/android/systemui/recents/Constants.java index c49e244..3d4d6c4 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/Constants.java +++ b/packages/SystemUI/src/com/android/systemui/recents/Constants.java @@ -25,8 +25,6 @@ public class Constants { public static final boolean Verbose = false; public static class App { - // Enables the simulated task affiliations - public static final boolean EnableSimulatedTaskGroups = false; // Enables the screenshot app->Recents transition public static final boolean EnableScreenshotAppTransition = false; // Enables the filtering of tasks according to their grouping @@ -43,11 +41,15 @@ public class Constants { public static final boolean EnableShadows = true; // This disables the bitmap and icon caches public static final boolean DisableBackgroundCache = false; - // For debugging, this enables us to create mock recents tasks + // Enables the simulated task affiliations + public static final boolean EnableSimulatedTaskGroups = false; + // Defines the number of mock task affiliations per group + public static final int TaskAffiliationsGroupCount = 12; + // Enables us to create mock recents tasks public static final boolean EnableSystemServicesProxy = false; - // For debugging, this defines the number of mock recents packages to create + // Defines the number of mock recents packages to create public static final int SystemServicesProxyMockPackageCount = 3; - // For debugging, this defines the number of mock recents tasks to create + // Defines the number of mock recents tasks to create public static final int SystemServicesProxyMockTaskCount = 100; } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java index 4534897..75fbad8 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java @@ -383,9 +383,6 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED); registerReceiver(mSystemBroadcastReceiver, filter); - // Register any broadcast receivers for the task loader - RecentsTaskLoader.getInstance().registerReceivers(this, mRecentsView); - // Private API calls to make the shadows look better try { Utilities.setShadowProperty("ambientShadowStrength", String.valueOf(35f)); @@ -451,6 +448,9 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView filter.addAction(ACTION_TOGGLE_RECENTS_ACTIVITY); filter.addAction(ACTION_START_ENTER_ANIMATION); registerReceiver(mServiceBroadcastReceiver, filter); + + // Register any broadcast receivers for the task loader + RecentsTaskLoader.getInstance().registerReceivers(this, mRecentsView); } @Override @@ -481,9 +481,15 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView protected void onStop() { super.onStop(); + // Remove all the views + mRecentsView.removeAllTaskStacks(); + // Unregister the RecentsService receiver unregisterReceiver(mServiceBroadcastReceiver); + // Unregister any broadcast receivers for the task loader + RecentsTaskLoader.getInstance().unregisterReceivers(); + // Stop listening for widget package changes if there was one bound if (mAppWidgetHost.isListening()) { mAppWidgetHost.stopListening(); @@ -496,7 +502,6 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView // Unregister the system broadcast receivers unregisterReceiver(mSystemBroadcastReceiver); - RecentsTaskLoader.getInstance().unregisterReceivers(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java index fbcbe2c..cf0a1dc 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java @@ -76,7 +76,7 @@ public class RecentsConfiguration { public int taskViewRemoveAnimDuration; public int taskViewRemoveAnimTranslationXPx; public int taskViewTranslationZMinPx; - public int taskViewTranslationZIncrementPx; + public int taskViewTranslationZMaxPx; public int taskViewRoundedCornerRadiusPx; public int taskViewHighlightPx; public int taskViewAffiliateGroupEnterOffsetPx; @@ -208,8 +208,7 @@ public class RecentsConfiguration { res.getDimensionPixelSize(R.dimen.recents_task_view_rounded_corners_radius); taskViewHighlightPx = res.getDimensionPixelSize(R.dimen.recents_task_view_highlight); taskViewTranslationZMinPx = res.getDimensionPixelSize(R.dimen.recents_task_view_z_min); - taskViewTranslationZIncrementPx = - res.getDimensionPixelSize(R.dimen.recents_task_view_z_increment); + taskViewTranslationZMaxPx = res.getDimensionPixelSize(R.dimen.recents_task_view_z_max); taskViewAffiliateGroupEnterOffsetPx = res.getDimensionPixelSize(R.dimen.recents_task_view_affiliate_group_enter_offset); diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java index 04ee9dd..fd6303f 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java @@ -337,7 +337,7 @@ public class TaskStack { String prevPackage = ""; int prevAffiliation = -1; Random r = new Random(); - int groupCountDown = 5; + int groupCountDown = Constants.DebugFlags.App.TaskAffiliationsGroupCount; for (int i = 0; i < taskCount; i++) { Task t = tasks.get(i); String packageName = t.key.baseIntent.getComponent().getPackageName(); @@ -352,7 +352,7 @@ public class TaskStack { addGroup(group); prevAffiliation = affiliation; prevPackage = packageName; - groupCountDown = 5; + groupCountDown = Constants.DebugFlags.App.TaskAffiliationsGroupCount; } group.addTask(t); taskMap.put(t.key, t); diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/DebugOverlayView.java b/packages/SystemUI/src/com/android/systemui/recents/views/DebugOverlayView.java index 4c3fbf0..452830d 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/DebugOverlayView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/DebugOverlayView.java @@ -26,6 +26,7 @@ import android.view.View; import android.widget.FrameLayout; import android.widget.SeekBar; import com.android.systemui.R; +import com.android.systemui.recents.RecentsConfiguration; import java.util.ArrayList; @@ -42,11 +43,14 @@ public class DebugOverlayView extends FrameLayout implements SeekBar.OnSeekBarCh final static int sCornerRectSize = 50; + RecentsConfiguration mConfig; DebugOverlayViewCallbacks mCb; ArrayList<Pair<Rect, Integer>> mRects = new ArrayList<Pair<Rect, Integer>>(); + String mText; Paint mDebugOutline = new Paint(); Paint mTmpPaint = new Paint(); + Rect mTmpRect = new Rect(); boolean mEnabled = true; SeekBar mPrimarySeekBar; @@ -66,6 +70,7 @@ public class DebugOverlayView extends FrameLayout implements SeekBar.OnSeekBarCh public DebugOverlayView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); + mConfig = RecentsConfiguration.getInstance(); mDebugOutline.setColor(0xFFff0000); mDebugOutline.setStyle(Paint.Style.STROKE); mDebugOutline.setStrokeWidth(8f); @@ -124,6 +129,12 @@ public class DebugOverlayView extends FrameLayout implements SeekBar.OnSeekBarCh invalidate(); } + /** Sets the debug text at the bottom of the screen. */ + void setText(String message) { + mText = message; + invalidate(); + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); @@ -145,6 +156,14 @@ public class DebugOverlayView extends FrameLayout implements SeekBar.OnSeekBarCh mTmpPaint.setColor(r.second); canvas.drawRect(r.first, mTmpPaint); } + + // Draw the text + if (mText != null && mText.length() > 0) { + mTmpPaint.setColor(0xFFff0000); + mTmpPaint.setTextSize(60); + mTmpPaint.getTextBounds(mText, 0, 1, mTmpRect); + canvas.drawText(mText, 10f, getMeasuredHeight() - mTmpRect.height() - mConfig.systemInsets.bottom, mTmpPaint); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java index 189578c..1a32b81 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java @@ -121,6 +121,17 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV } } + /** Removes all the task stack views from this recents view. */ + public void removeAllTaskStacks() { + int childCount = getChildCount(); + for (int i = childCount - 1; i >= 0; i--) { + View child = getChildAt(i); + if (child != mSearchBar) { + removeViewAt(i); + } + } + } + /** Launches the focused task from the first stack if possible */ public boolean launchFocusedTask() { // Get the first stack view @@ -225,6 +236,8 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV public void setSearchBarVisibility(int visibility) { if (mSearchBar != null) { mSearchBar.setVisibility(visibility); + // Always bring the search bar to the top + mSearchBar.bringToFront(); } } @@ -364,17 +377,17 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV View sourceView = tv; int offsetX = 0; int offsetY = 0; - int stackScroll = stackView.getStackScroll(); + float stackScroll = stackView.getScroller().getStackScroll(); if (tv == null) { // If there is no actual task view, then use the stack view as the source view // and then offset to the expected transform rect, but bound this to just // outside the display rect (to ensure we don't animate from too far away) sourceView = stackView; - transform = stackView.getStackAlgorithm().getStackTransform(task, stackScroll, transform); + transform = stackView.getStackAlgorithm().getStackTransform(task, stackScroll, transform, null); offsetX = transform.rect.left; offsetY = Math.min(transform.rect.top, mConfig.displayRect.height()); } else { - transform = stackView.getStackAlgorithm().getStackTransform(task, stackScroll, transform); + transform = stackView.getStackAlgorithm().getStackTransform(task, stackScroll, transform, null); } // Compute the thumbnail to scale up from diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java index 492e3aa..90bf12f 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java @@ -126,28 +126,6 @@ class TaskBarView extends FrameLayout { mIsFullscreen = isFullscreen; } - /** Synchronizes this bar view's properties with the task's transform */ - void updateViewPropertiesToTaskTransform(TaskViewTransform toTransform, int duration) { - if (duration > 0 && (mDismissButton.getVisibility() == View.VISIBLE)) { - ViewPropertyAnimator anim = mDismissButton.animate(); - - // Animate to the final state - if (toTransform.hasDismissAlphaChangedFrom(mDismissButton.getAlpha())) { - anim.alpha(toTransform.dismissAlpha) - .setStartDelay(0) - .setDuration(duration) - .setInterpolator(mConfig.fastOutSlowInInterpolator) - .withLayer() - .start(); - } - } else { - // Set the changed properties - if (toTransform.hasDismissAlphaChangedFrom(mDismissButton.getAlpha())) { - mDismissButton.setAlpha(toTransform.dismissAlpha); - } - } - } - @Override public boolean hasOverlappingRendering() { return false; diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java index aa67c1e..986df91 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java @@ -16,25 +16,17 @@ package com.android.systemui.recents.views; -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.ObjectAnimator; -import android.animation.ValueAnimator; import android.content.ComponentName; import android.content.Context; -import android.graphics.Canvas; import android.graphics.Rect; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; -import android.widget.OverScroller; import com.android.systemui.R; import com.android.systemui.recents.Constants; import com.android.systemui.recents.RecentsConfiguration; import com.android.systemui.recents.misc.DozeTrigger; -import com.android.systemui.recents.misc.ReferenceCountedTrigger; -import com.android.systemui.recents.misc.Utilities; import com.android.systemui.recents.model.RecentsPackageMonitor; import com.android.systemui.recents.model.RecentsTaskLoader; import com.android.systemui.recents.model.Task; @@ -47,8 +39,8 @@ import java.util.HashSet; /* The visual representation of a task stack view */ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCallbacks, - TaskView.TaskViewCallbacks, ViewPool.ViewPoolConsumer<TaskView, Task>, - RecentsPackageMonitor.PackageCallbacks { + TaskView.TaskViewCallbacks, TaskStackViewScroller.TaskStackViewScrollerCallbacks, + ViewPool.ViewPoolConsumer<TaskView, Task>, RecentsPackageMonitor.PackageCallbacks { /** The TaskView callbacks */ interface TaskStackViewCallbacks { @@ -64,8 +56,9 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal RecentsConfiguration mConfig; TaskStack mStack; - TaskStackViewLayoutAlgorithm mStackAlgorithm; + TaskStackViewLayoutAlgorithm mLayoutAlgorithm; TaskStackViewFilterAlgorithm mFilterAlgorithm; + TaskStackViewScroller mStackScroller; TaskStackViewTouchHandler mTouchHandler; TaskStackViewCallbacks mCb; ViewPool<TaskView, Task> mViewPool; @@ -73,18 +66,9 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal DozeTrigger mUIDozeTrigger; DebugOverlayView mDebugOverlay; Rect mTaskStackBounds = new Rect(); - - // The virtual stack scroll that we use for the card layout - int mStackScroll; - int mMinScroll; - int mMaxScroll; - int mStashedScroll; int mFocusedTaskIndex = -1; - OverScroller mScroller; - ObjectAnimator mScrollAnimator; // Optimizations - ReferenceCountedTrigger mHwLayersTrigger; int mStackViewsAnimationDuration; boolean mStackViewsDirty = true; boolean mAwaitingFirstLayout = true; @@ -114,12 +98,13 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal mConfig = RecentsConfiguration.getInstance(); mStack = stack; mStack.setCallbacks(this); - mScroller = new OverScroller(context); - mTouchHandler = new TaskStackViewTouchHandler(context, this); mViewPool = new ViewPool<TaskView, Task>(context, this); mInflater = LayoutInflater.from(context); - mStackAlgorithm = new TaskStackViewLayoutAlgorithm(mConfig); + mLayoutAlgorithm = new TaskStackViewLayoutAlgorithm(mConfig); mFilterAlgorithm = new TaskStackViewFilterAlgorithm(mConfig, this, mViewPool); + mStackScroller = new TaskStackViewScroller(context, mConfig, mLayoutAlgorithm); + mStackScroller.setCallbacks(this); + mTouchHandler = new TaskStackViewTouchHandler(context, this, mStackScroller); mUIDozeTrigger = new DozeTrigger(mConfig.taskBarDismissDozeDelaySeconds, new Runnable() { @Override public void run() { @@ -149,7 +134,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal } void requestSynchronizeStackViewsWithModel(int duration) { if (!mStackViewsDirty) { - invalidate(mStackAlgorithm.mStackRect); + invalidate(); mStackViewsDirty = true; } if (mAwaitingFirstLayout) { @@ -174,7 +159,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal /** Returns the stack algorithm for this task stack. */ public TaskStackViewLayoutAlgorithm getStackAlgorithm() { - return mStackAlgorithm; + return mLayoutAlgorithm; } /** @@ -182,7 +167,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal */ private boolean updateStackTransforms(ArrayList<TaskViewTransform> taskTransforms, ArrayList<Task> tasks, - int stackScroll, + float stackScroll, int[] visibleRangeOut, boolean boundTranslationsToRect) { // XXX: We should be intelligent about where to look for the visible stack range using the @@ -207,8 +192,10 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal } // Update the stack transforms + TaskViewTransform prevTransform = null; for (int i = taskCount - 1; i >= 0; i--) { - TaskViewTransform transform = mStackAlgorithm.getStackTransform(tasks.get(i), stackScroll, taskTransforms.get(i)); + TaskViewTransform transform = mLayoutAlgorithm.getStackTransform(tasks.get(i), + stackScroll, taskTransforms.get(i), prevTransform); if (transform.visible) { if (frontMostVisibleIndex < 0) { frontMostVisibleIndex = i; @@ -228,8 +215,9 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal if (boundTranslationsToRect) { transform.translationY = Math.min(transform.translationY, - mStackAlgorithm.mViewRect.bottom); + mLayoutAlgorithm.mViewRect.bottom); } + prevTransform = transform; } if (visibleRangeOut != null) { visibleRangeOut[0] = frontMostVisibleIndex; @@ -243,7 +231,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal * call is less optimal than calling updateStackTransforms directly. */ private ArrayList<TaskViewTransform> getStackTransforms(ArrayList<Task> tasks, - int stackScroll, + float stackScroll, int[] visibleRangeOut, boolean boundTranslationsToRect) { ArrayList<TaskViewTransform> taskTransforms = new ArrayList<TaskViewTransform>(); @@ -257,9 +245,13 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal if (mStackViewsDirty) { // Get all the task transforms ArrayList<Task> tasks = mStack.getTasks(); - int stackScroll = getStackScroll(); + float stackScroll = mStackScroller.getStackScroll(); int[] visibleRange = mTmpVisibleRange; - boolean isValidVisibleRange = updateStackTransforms(mCurrentTaskTransforms, tasks, stackScroll, visibleRange, false); + boolean isValidVisibleRange = updateStackTransforms(mCurrentTaskTransforms, tasks, + stackScroll, visibleRange, false); + if (mDebugOverlay != null) { + mDebugOverlay.setText("vis[" + visibleRange[1] + "-" + visibleRange[0] + "]"); + } // Return all the invisible children to the pool mTmpTaskViewMap.clear(); @@ -288,11 +280,10 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal if (mStackViewsAnimationDuration > 0) { // For items in the list, put them in start animating them from the // approriate ends of the list where they are expected to appear - if (transform.t < 0) { - mTmpTransform = mStackAlgorithm.getStackTransform(tasks.get(0), stackScroll, mTmpTransform); + if (Float.compare(transform.p, 0f) <= 0) { + mLayoutAlgorithm.getStackTransform(0f, 0f, mTmpTransform, null); } else { - int nextTaskStackScroll = mStackAlgorithm.getStackScrollForTaskIndex(task, 1); - mStackAlgorithm.getStackTransform(nextTaskStackScroll, stackScroll, mTmpTransform); + mLayoutAlgorithm.getStackTransform(1f, 0f, mTmpTransform, null); } tv.updateViewPropertiesToTaskTransform(mTmpTransform, 0); } @@ -357,143 +348,22 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal mTaskStackBounds.set(r); } - /** Sets the current stack scroll */ - public void setStackScroll(int value) { - mStackScroll = value; - mUIDozeTrigger.poke(); - requestSynchronizeStackViewsWithModel(); - } - - /** Sets the current stack scroll without synchronizing the stack view with the model */ - public void setStackScrollRaw(int value) { - mStackScroll = value; - mUIDozeTrigger.poke(); - } - /** Sets the current stack scroll to the initial state when you first enter recents */ - public void setStackScrollToInitialState() { - setStackScroll(getInitialStackScroll()); - } - /** Computes the initial stack scroll for the stack. */ - int getInitialStackScroll() { - if (mStack.getTaskCount() > 2) { - return Math.max(mMinScroll, mMaxScroll - (int) (mStackAlgorithm.mTaskRect.height() * (3f/4f))); - } - return mMaxScroll; - } - - /** Gets the current stack scroll */ - public int getStackScroll() { - return mStackScroll; - } - - /** Animates the stack scroll into bounds */ - ObjectAnimator animateBoundScroll() { - int curScroll = getStackScroll(); - int newScroll = Math.max(mMinScroll, Math.min(mMaxScroll, curScroll)); - if (newScroll != curScroll) { - // Start a new scroll animation - animateScroll(curScroll, newScroll, null); - } - return mScrollAnimator; - } - - /** Animates the stack scroll */ - void animateScroll(int curScroll, int newScroll, final Runnable postRunnable) { - // Abort any current animations - abortScroller(); - abortBoundScrollAnimation(); - - mScrollAnimator = ObjectAnimator.ofInt(this, "stackScroll", curScroll, newScroll); - mScrollAnimator.setDuration(Utilities.calculateTranslationAnimationDuration(newScroll - - curScroll, 250)); - mScrollAnimator.setInterpolator(mConfig.fastOutSlowInInterpolator); - mScrollAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - setStackScroll((Integer) animation.getAnimatedValue()); - } - }); - mScrollAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - if (postRunnable != null) { - postRunnable.run(); - } - mScrollAnimator.removeAllListeners(); - } - }); - mScrollAnimator.start(); - } - - /** Aborts any current stack scrolls */ - void abortBoundScrollAnimation() { - if (mScrollAnimator != null) { - mScrollAnimator.cancel(); - } - } - - /** Aborts the scroller and any current fling */ - void abortScroller() { - if (!mScroller.isFinished()) { - // Abort the scroller - mScroller.abortAnimation(); - } - } - - /** Bounds the current scroll if necessary */ - public boolean boundScroll() { - int curScroll = getStackScroll(); - int newScroll = Math.max(mMinScroll, Math.min(mMaxScroll, curScroll)); - if (newScroll != curScroll) { - setStackScroll(newScroll); - return true; - } - return false; - } - - /** - * Bounds the current scroll if necessary, but does not synchronize the stack view with the - * model. - */ - public boolean boundScrollRaw() { - int curScroll = getStackScroll(); - int newScroll = Math.max(mMinScroll, Math.min(mMaxScroll, curScroll)); - if (newScroll != curScroll) { - setStackScrollRaw(newScroll); - return true; - } - return false; - } - - - /** Returns the amount that the scroll is out of bounds */ - int getScrollAmountOutOfBounds(int scroll) { - if (scroll < mMinScroll) { - return mMinScroll - scroll; - } else if (scroll > mMaxScroll) { - return scroll - mMaxScroll; - } - return 0; - } - - /** Returns whether the specified scroll is out of bounds */ - boolean isScrollOutOfBounds() { - return getScrollAmountOutOfBounds(mStackScroll) != 0; - } - /** Updates the min and max virtual scroll bounds */ void updateMinMaxScroll(boolean boundScrollToNewMinMax) { // Compute the min and max scroll values - mStackAlgorithm.computeMinMaxScroll(mStack.getTasks()); - mMinScroll = mStackAlgorithm.mMinScroll; - mMaxScroll = mStackAlgorithm.mMaxScroll; + mLayoutAlgorithm.computeMinMaxScroll(mStack.getTasks()); // Debug logging if (boundScrollToNewMinMax) { - boundScroll(); + mStackScroller.boundScroll(); } } + /** Returns the scroller. */ + public TaskStackViewScroller getScroller() { + return mStackScroller; + } + /** Focuses the task at the specified index in the stack */ void focusTask(int taskIndex, boolean scrollToNewPosition) { if (0 <= taskIndex && taskIndex < mStack.getTaskCount()) { @@ -520,10 +390,10 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal if (scrollToNewPosition) { // Scroll the view into position - int newScroll = Math.max(mMinScroll, Math.min(mMaxScroll, - mStackAlgorithm.getStackScrollForTaskIndex(t))); - - animateScroll(getStackScroll(), newScroll, postScrollRunnable); + // XXX: We probably want this to be centered in view instead of p = 0f + float newScroll = mStackScroller.getBoundedStackScroll( + mLayoutAlgorithm.getStackScrollForTaskIndex(t)); + mStackScroller.animateScroll(mStackScroller.getStackScroll(), newScroll, postScrollRunnable); } else { if (postScrollRunnable != null) { postScrollRunnable.run(); @@ -558,24 +428,17 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal @Override public void computeScroll() { - if (mScroller.computeScrollOffset()) { - setStackScroll(mScroller.getCurrY()); - invalidate(); - } - } - - @Override - public void dispatchDraw(Canvas canvas) { + // Synchronize the views if (synchronizeStackViewsWithModel()) { clipTaskViews(); } - super.dispatchDraw(canvas); + mStackScroller.computeScroll(); } /** Computes the stack and task rects */ public void computeRects(int windowWidth, int windowHeight, Rect taskStackBounds) { // Compute the rects in the stack algorithm - mStackAlgorithm.computeRects(mStack.getTasks(), windowWidth, windowHeight, taskStackBounds); + mLayoutAlgorithm.computeRects(windowWidth, windowHeight, taskStackBounds); // Update the scroll bounds updateMinMaxScroll(false); @@ -598,7 +461,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal // If this is the first layout, then scroll to the front of the stack and synchronize the // stack views immediately to load all the views if (mAwaitingFirstLayout) { - setStackScrollToInitialState(); + mStackScroller.setStackScrollToInitialState(); requestSynchronizeStackViewsWithModel(); synchronizeStackViewsWithModel(); } @@ -611,9 +474,9 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal tv.measure(widthMeasureSpec, heightMeasureSpec); } else { tv.measure( - MeasureSpec.makeMeasureSpec(mStackAlgorithm.mTaskRect.width(), + MeasureSpec.makeMeasureSpec(mLayoutAlgorithm.mTaskRect.width(), MeasureSpec.EXACTLY), - MeasureSpec.makeMeasureSpec(mStackAlgorithm.mTaskRect.height() + + MeasureSpec.makeMeasureSpec(mLayoutAlgorithm.mTaskRect.height() + tv.getMaxFooterHeight(), MeasureSpec.EXACTLY)); } } @@ -635,8 +498,8 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal if (tv.isFullScreenView()) { tv.layout(left, top, left + tv.getMeasuredWidth(), top + tv.getMeasuredHeight()); } else { - tv.layout(mStackAlgorithm.mTaskRect.left, mStackAlgorithm.mTaskRect.top, - mStackAlgorithm.mTaskRect.right, mStackAlgorithm.mTaskRect.bottom + + tv.layout(mLayoutAlgorithm.mTaskRect.left, mLayoutAlgorithm.mTaskRect.top, + mLayoutAlgorithm.mTaskRect.right, mLayoutAlgorithm.mTaskRect.bottom + tv.getMaxFooterHeight()); } } @@ -649,8 +512,8 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal /** Handler for the first layout. */ void onFirstLayout() { - int offscreenY = mStackAlgorithm.mViewRect.bottom - - (mStackAlgorithm.mTaskRect.top - mStackAlgorithm.mViewRect.top); + int offscreenY = mLayoutAlgorithm.mViewRect.bottom - + (mLayoutAlgorithm.mTaskRect.top - mLayoutAlgorithm.mViewRect.top); // Find the launch target task Task launchTargetTask = null; @@ -717,10 +580,10 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal ctx.currentTaskTransform = new TaskViewTransform(); ctx.currentStackViewIndex = i; ctx.currentStackViewCount = childCount; - ctx.currentTaskRect = mStackAlgorithm.mTaskRect; + ctx.currentTaskRect = mLayoutAlgorithm.mTaskRect; ctx.currentTaskOccludesLaunchTarget = (launchTargetTask != null) && launchTargetTask.group.isTaskAboveTask(task, launchTargetTask); - mStackAlgorithm.getStackTransform(task, getStackScroll(), ctx.currentTaskTransform); + mLayoutAlgorithm.getStackTransform(task, mStackScroller.getStackScroll(), ctx.currentTaskTransform, null); tv.startEnterRecentsAnimation(ctx); } @@ -737,9 +600,12 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal /** Requests this task stacks to start it's exit-recents animation. */ public void startExitToHomeAnimation(ViewAnimation.TaskViewExitContext ctx) { - // Animate all the task views into view - ctx.offscreenTranslationY = mStackAlgorithm.mViewRect.bottom - - (mStackAlgorithm.mTaskRect.top - mStackAlgorithm.mViewRect.top); + // Stop any scrolling + mStackScroller.stopScroller(); + mStackScroller.stopBoundScrollAnimation(); + // Animate all the task views out of view + ctx.offscreenTranslationY = mLayoutAlgorithm.mViewRect.bottom - + (mLayoutAlgorithm.mTaskRect.top - mLayoutAlgorithm.mViewRect.top); int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { TaskView tv = (TaskView) getChildAt(i); @@ -753,8 +619,6 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal /** Animates a task view in this stack as it launches. */ public void startLaunchTaskAnimation(TaskView tv, final Runnable r) { Task launchTargetTask = tv.getTask(); - int offscreenTranslationY = mStackAlgorithm.mViewRect.bottom - - (mStackAlgorithm.mTaskRect.top - mStackAlgorithm.mViewRect.top); int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { TaskView t = (TaskView) getChildAt(i); @@ -788,17 +652,11 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal @Override public void onStackTaskAdded(TaskStack stack, Task t) { - // Update the task offsets - mStackAlgorithm.updateTaskOffsets(mStack.getTasks()); - requestSynchronizeStackViewsWithModel(); } @Override public void onStackTaskRemoved(TaskStack stack, Task removedTask, Task newFrontMostTask) { - // Update the task offsets - mStackAlgorithm.updateTaskOffsets(mStack.getTasks()); - // Remove the view associated with this task, we can't rely on updateTransforms // to work here because the task is no longer in the list TaskView tv = getChildViewForTask(removedTask); @@ -811,8 +669,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal // Update the min/max scroll and animate other task views into their new positions updateMinMaxScroll(true); - int movement = (int) mStackAlgorithm.getTaskOverlapHeight(); - requestSynchronizeStackViewsWithModel(Utilities.calculateTranslationAnimationDuration(movement)); + requestSynchronizeStackViewsWithModel(200); // Update the new front most task if (newFrontMostTask != null) { @@ -839,6 +696,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal @Override public void onStackFiltered(TaskStack newStack, final ArrayList<Task> curTasks, Task filteredTask) { + /* // Stash the scroll and filtered task for us to restore to when we unfilter mStashedScroll = getStackScroll(); @@ -847,11 +705,11 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal getStackTransforms(curTasks, getStackScroll(), null, true); // Update the task offsets - mStackAlgorithm.updateTaskOffsets(mStack.getTasks()); + mLayoutAlgorithm.updateTaskOffsets(mStack.getTasks()); // Scroll the item to the top of the stack (sans-peek) rect so that we can see it better updateMinMaxScroll(false); - float overlapHeight = mStackAlgorithm.getTaskOverlapHeight(); + float overlapHeight = mLayoutAlgorithm.getTaskOverlapHeight(); setStackScrollRaw((int) (newStack.indexOfTask(filteredTask) * overlapHeight)); boundScrollRaw(); @@ -865,16 +723,18 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal // Notify any callbacks mCb.onTaskStackFilterTriggered(); + */ } @Override public void onStackUnfiltered(TaskStack newStack, final ArrayList<Task> curTasks) { + /* // Calculate the current task transforms final ArrayList<TaskViewTransform> curTaskTransforms = getStackTransforms(curTasks, getStackScroll(), null, true); // Update the task offsets - mStackAlgorithm.updateTaskOffsets(mStack.getTasks()); + mLayoutAlgorithm.updateTaskOffsets(mStack.getTasks()); // Restore the stashed scroll updateMinMaxScroll(false); @@ -894,6 +754,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal // Notify any callbacks mCb.onTaskStackUnfilterTriggered(); + */ } /**** ViewPoolConsumer Implementation ****/ @@ -1014,7 +875,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal @Override public void onTaskViewClipStateChanged(TaskView tv) { - invalidate(mStackAlgorithm.mStackRect); + invalidate(); } @Override @@ -1022,6 +883,15 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal requestSynchronizeStackViewsWithModel(); } + /**** TaskStackViewScroller.TaskStackViewScrollerCallbacks ****/ + + @Override + public void onScrollChanged(float p) { + mUIDozeTrigger.poke(); + requestSynchronizeStackViewsWithModel(); + invalidate(); + } + /**** RecentsPackageMonitor.PackageCallbacks Implementation ****/ @Override diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java index 0fd4e86..b1482bb 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java @@ -18,184 +18,276 @@ package com.android.systemui.recents.views; import android.graphics.Rect; import com.android.systemui.recents.RecentsConfiguration; +import com.android.systemui.recents.misc.Console; import com.android.systemui.recents.misc.Utilities; import com.android.systemui.recents.model.Task; import java.util.ArrayList; import java.util.HashMap; -/* The layout logic for a TaskStackView */ +/* The layout logic for a TaskStackView. + * + * We are using a curve that defines the curve of the tasks as that go back in the recents list. + * The curve is defined such that at curve progress p = 0 is the end of the curve (the top of the + * stack rect), and p = 1 at the start of the curve and the bottom of the stack rect. + */ public class TaskStackViewLayoutAlgorithm { // These are all going to change - static final float StackOverlapPct = 0.65f; // The overlap height relative to the task height - static final float StackPeekHeightPct = 0.075f; // The height of the peek space relative to the stack height - static final float StackPeekMinScale = 0.8f; // The min scale of the last card in the peek area - static final int StackPeekNumCards = 3; // The number of cards we see in the peek space + static final float StackPeekMinScale = 0.825f; // The min scale of the last card in the peek area RecentsConfiguration mConfig; // The various rects that define the stack view Rect mViewRect = new Rect(); + Rect mStackVisibleRect = new Rect(); Rect mStackRect = new Rect(); - Rect mStackRectSansPeek = new Rect(); Rect mTaskRect = new Rect(); - // The min/max scroll - int mMinScroll; - int mMaxScroll; + // The min/max scroll progress + float mMinScrollP; + float mMaxScrollP; + float mInitialScrollP; + int mWithinAffiliationOffset; + int mBetweenAffiliationOffset; + HashMap<Task.TaskKey, Float> mTaskProgressMap = new HashMap<Task.TaskKey, Float>(); - HashMap<Task.TaskKey, Integer> mTaskOffsetMap = new HashMap<Task.TaskKey, Integer>(); + // Log function + static final float XScale = 1.75f; // The large the XScale, the longer the flat area of the curve + static final float LogBase = 300; + static final int PrecisionSteps = 250; + static float[] xp; + static float[] px; public TaskStackViewLayoutAlgorithm(RecentsConfiguration config) { mConfig = config; + mWithinAffiliationOffset = mConfig.taskBarHeight; + mBetweenAffiliationOffset = 4 * mConfig.taskBarHeight; + + // Precompute the path + initializeCurve(); } /** Computes the stack and task rects */ - public void computeRects(ArrayList<Task> tasks, int windowWidth, int windowHeight, - Rect taskStackBounds) { - // Note: We let the stack view be the full height because we want the cards to go under the - // navigation bar if possible. However, the stack rects which we use to calculate - // max scroll, etc. need to take the nav bar into account - + public void computeRects(int windowWidth, int windowHeight, Rect taskStackBounds) { // Compute the stack rects mViewRect.set(0, 0, windowWidth, windowHeight); mStackRect.set(taskStackBounds); + mStackVisibleRect.set(taskStackBounds); + mStackVisibleRect.bottom = mViewRect.bottom; int widthPadding = (int) (mConfig.taskStackWidthPaddingPct * mStackRect.width()); int heightPadding = mConfig.taskStackTopPaddingPx; mStackRect.inset(widthPadding, heightPadding); - mStackRectSansPeek.set(mStackRect); - mStackRectSansPeek.top += StackPeekHeightPct * windowHeight; // Compute the task rect int size = mStackRect.width(); int left = mStackRect.left + (mStackRect.width() - size) / 2; - mTaskRect.set(left, mStackRectSansPeek.top, - left + size, mStackRectSansPeek.top + size); - - // Update the task offsets once the size changes - updateTaskOffsets(tasks); + mTaskRect.set(left, mStackRect.top, + left + size, mStackRect.top + size); } + /** Computes the minimum and maximum scroll progress values */ void computeMinMaxScroll(ArrayList<Task> tasks) { - // Compute the min and max scroll values - int numTasks = Math.max(1, tasks.size()); + // Clear the progress map + mTaskProgressMap.clear(); + + // Return early if we have no tasks + if (tasks.isEmpty()) { + mMinScrollP = mMaxScrollP = 0; + return; + } + int taskHeight = mTaskRect.height(); - int stackHeight = mStackRectSansPeek.height(); - - if (numTasks <= 1) { - // If there is only one task, then center the task in the stack rect (sans peek) - mMinScroll = mMaxScroll = -(stackHeight - - (taskHeight + mConfig.taskViewLockToAppButtonHeight)) / 2; - } else { - int maxScrollHeight = getStackScrollForTaskIndex(tasks.get(tasks.size() - 1)) - + taskHeight + mConfig.taskViewLockToAppButtonHeight; - mMinScroll = Math.min(stackHeight, maxScrollHeight) - stackHeight; - mMaxScroll = maxScrollHeight - stackHeight; + float pAtBottomOfStackRect = screenYToCurveProgress(mStackVisibleRect.bottom); + float pWithinAffiliateOffset = pAtBottomOfStackRect - + screenYToCurveProgress(mStackVisibleRect.bottom - mWithinAffiliationOffset); + float pBetweenAffiliateOffset = pAtBottomOfStackRect - + screenYToCurveProgress(mStackVisibleRect.bottom - mBetweenAffiliationOffset); + float pTaskHeightOffset = pAtBottomOfStackRect - + screenYToCurveProgress(mStackVisibleRect.bottom - taskHeight); + float pNavBarOffset = pAtBottomOfStackRect - + screenYToCurveProgress(mStackVisibleRect.bottom - (mStackVisibleRect.bottom - mStackRect.bottom)); + + // Update the task offsets + float pAtBackMostCardTop = screenYToCurveProgress(mStackVisibleRect.top + + (mStackVisibleRect.height() - taskHeight) / 2); + float pAtFrontMostCardTop = pAtBackMostCardTop; + float pAtSecondFrontMostCardTop = pAtBackMostCardTop; + int taskCount = tasks.size(); + for (int i = 0; i < taskCount; i++) { + Task task = tasks.get(i); + mTaskProgressMap.put(task.key, pAtFrontMostCardTop); + + if (i < (taskCount - 1)) { + // Increment the peek height + float pPeek = task.group.isFrontMostTask(task) ? pBetweenAffiliateOffset : + pWithinAffiliateOffset; + pAtSecondFrontMostCardTop = pAtFrontMostCardTop; + pAtFrontMostCardTop += pPeek; + } } + + mMinScrollP = 0f; + mMaxScrollP = pAtFrontMostCardTop - ((1f - pTaskHeightOffset - pNavBarOffset)); + mInitialScrollP = pAtSecondFrontMostCardTop - ((1f - pTaskHeightOffset - pNavBarOffset)); } /** Update/get the transform */ - public TaskViewTransform getStackTransform(Task task, int stackScroll, TaskViewTransform transformOut) { + public TaskViewTransform getStackTransform(Task task, float stackScroll, TaskViewTransform transformOut, + TaskViewTransform prevTransform) { // Return early if we have an invalid index if (task == null) { transformOut.reset(); return transformOut; } - return getStackTransform(getStackScrollForTaskIndex(task), stackScroll, transformOut); + return getStackTransform(mTaskProgressMap.get(task.key), stackScroll, transformOut, prevTransform); } /** Update/get the transform */ - public TaskViewTransform getStackTransform(int taskStackScroll, int stackScroll, TaskViewTransform transformOut) { - // Map the items to an continuous position relative to the specified scroll - int numPeekCards = StackPeekNumCards; - float overlapHeight = StackOverlapPct * mTaskRect.height(); - float peekHeight = StackPeekHeightPct * mStackRect.height(); - float t = (taskStackScroll - stackScroll) / overlapHeight; - float boundedT = Math.max(t, -(numPeekCards + 1)); - - // Set the scale relative to its position - int numFrontScaledCards = 3; - float minScale = StackPeekMinScale; - float scaleRange = 1f - minScale; - float scaleInc = scaleRange / (numPeekCards + numFrontScaledCards); - float scale = Math.max(minScale, Math.min(1f, minScale + - ((boundedT + (numPeekCards + 1)) * scaleInc))); - float scaleYOffset = ((1f - scale) * mTaskRect.height()) / 2; - // Account for the bar offsets being scaled? - float scaleBarYOffset = (1f - scale) * mConfig.taskBarHeight; - transformOut.scale = scale; - - // Set the y translation - if (boundedT < 0f) { - transformOut.translationY = (int) ((Math.max(-numPeekCards, boundedT) / - numPeekCards) * peekHeight - scaleYOffset); - } else { - transformOut.translationY = (int) (boundedT * overlapHeight - scaleYOffset); + public TaskViewTransform getStackTransform(float taskProgress, float stackScroll, TaskViewTransform transformOut, TaskViewTransform prevTransform) { + float pTaskRelative = taskProgress - stackScroll; + float pBounded = Math.max(0, Math.min(pTaskRelative, 1f)); + // If the task top is outside of the bounds below the screen, then immediately reset it + if (pTaskRelative > 1f) { + transformOut.reset(); + return transformOut; } - - // Set the z translation + // The check for the top is trickier, since we want to show the next task if it is at all + // visible, even if p < 0. + if (pTaskRelative < 0f) { + if (prevTransform != null && Float.compare(prevTransform.p, 0f) <= 0) { + transformOut.reset(); + return transformOut; + } + } + float scale = curveProgressToScale(pBounded); + int scaleYOffset = (int) (((1f - scale) * mTaskRect.height()) / 2); int minZ = mConfig.taskViewTranslationZMinPx; - int incZ = mConfig.taskViewTranslationZIncrementPx; - transformOut.translationZ = (int) Math.max(minZ, minZ + ((boundedT + numPeekCards) * incZ)); - - // Set the alphas - // transformOut.dismissAlpha = Math.max(-1f, Math.min(0f, t + 1)) + 1f; - transformOut.dismissAlpha = 1f; - - // Update the rect and visibility + int maxZ = mConfig.taskViewTranslationZMaxPx; + transformOut.scale = scale; + transformOut.translationY = curveProgressToScreenY(pBounded) - mStackVisibleRect.top - + scaleYOffset; + transformOut.translationZ = Math.max(minZ, minZ + (pBounded * (maxZ - minZ))); transformOut.rect.set(mTaskRect); - if (t < -(numPeekCards + 1)) { - transformOut.visible = false; - } else { - transformOut.rect.offset(0, transformOut.translationY); - Utilities.scaleRectAboutCenter(transformOut.rect, transformOut.scale); - transformOut.visible = Rect.intersects(mViewRect, transformOut.rect); - } - transformOut.t = t; + transformOut.rect.offset(0, transformOut.translationY); + Utilities.scaleRectAboutCenter(transformOut.rect, transformOut.scale); + transformOut.visible = true; + transformOut.p = pTaskRelative; return transformOut; } /** - * Returns the overlap between one task and the next. + * Returns the scroll to such task top = 1f; */ - float getTaskOverlapHeight() { - return StackOverlapPct * mTaskRect.height(); + float getStackScrollForTaskIndex(Task t) { + return mTaskProgressMap.get(t.key); } - /** - * Returns the scroll to such that the task transform at that index will have t=0. (If the scroll - * is not bounded) - */ - int getStackScrollForTaskIndex(Task t) { - return mTaskOffsetMap.get(t.key); + /** Initializes the curve. */ + public static void initializeCurve() { + if (xp != null && px != null) return; + xp = new float[PrecisionSteps + 1]; + px = new float[PrecisionSteps + 1]; + + // Approximate f(x) + float[] fx = new float[PrecisionSteps + 1]; + float step = 1f / PrecisionSteps; + float x = 0; + for (int xStep = 0; xStep <= PrecisionSteps; xStep++) { + fx[xStep] = logFunc(x); + x += step; + } + // Calculate the arc length for x:1->0 + float pLength = 0; + float[] dx = new float[PrecisionSteps + 1]; + dx[0] = 0; + for (int xStep = 1; xStep < PrecisionSteps; xStep++) { + dx[xStep] = (float) Math.sqrt(Math.pow(fx[xStep] - fx[xStep - 1], 2) + Math.pow(step, 2)); + pLength += dx[xStep]; + } + // Approximate p(x), a function of cumulative progress with x, normalized to 0..1 + float p = 0; + px[0] = 0f; + px[PrecisionSteps] = 1f; + for (int xStep = 1; xStep <= PrecisionSteps; xStep++) { + p += Math.abs(dx[xStep] / pLength); + px[xStep] = p; + } + // Given p(x), calculate the inverse function x(p). This assumes that x(p) is also a valid + // function. + int xStep = 0; + p = 0; + xp[0] = 0f; + xp[PrecisionSteps] = 1f; + for (int pStep = 0; pStep < PrecisionSteps; pStep++) { + // Walk forward in px and find the x where px <= p && p < px+1 + while (xStep < PrecisionSteps) { + if (px[xStep] > p) break; + xStep++; + } + // Now, px[xStep-1] <= p < px[xStep] + if (xStep == 0) { + xp[pStep] = 0; + } else { + // Find x such that proportionally, x is correct + float fraction = (p - px[xStep - 1]) / (px[xStep] - px[xStep - 1]); + x = (xStep - 1 + fraction) * step; + xp[pStep] = x; + } + p += step; + } } - /** - * Returns the scroll to such that the task transform at that task + index will have t=0. - * (If the scroll is not bounded) - */ - int getStackScrollForTaskIndex(Task t, int relativeIndexOffset) { - return mTaskOffsetMap.get(t.key) + (int) (relativeIndexOffset * getTaskOverlapHeight()); + /** Reverses and scales out x. */ + static float reverse(float x) { + return (-x * XScale) + 1; + } + /** The log function describing the curve. */ + static float logFunc(float x) { + return 1f - (float) (Math.pow(LogBase, reverse(x))) / (LogBase); + } + /** The inverse of the log function describing the curve. */ + float invLogFunc(float y) { + return (float) (Math.log((1f - reverse(y)) * (LogBase - 1) + 1) / Math.log(LogBase)); } - /** - * Updates the cache of tasks to offsets. - */ - void updateTaskOffsets(ArrayList<Task> tasks) { - mTaskOffsetMap.clear(); - int offset = 0; - int taskCount = tasks.size(); - for (int i = 0; i < taskCount; i++) { - Task t = tasks.get(i); - mTaskOffsetMap.put(t.key, offset); - if (t.group.isFrontMostTask(t)) { - offset += getTaskOverlapHeight(); - } else { - offset += mConfig.taskBarHeight; - } + /** Converts from the progress along the curve to a screen coordinate. */ + int curveProgressToScreenY(float p) { + if (p < 0 || p > 1) return mStackVisibleRect.top + (int) (p * mStackVisibleRect.height()); + float pIndex = p * PrecisionSteps; + int pFloorIndex = (int) Math.floor(pIndex); + int pCeilIndex = (int) Math.ceil(pIndex); + float xFraction = 0; + if (pFloorIndex < PrecisionSteps && (pCeilIndex != pFloorIndex)) { + float pFraction = (pIndex - pFloorIndex) / (pCeilIndex - pFloorIndex); + xFraction = (xp[pCeilIndex] - xp[pFloorIndex]) * pFraction; } + float x = xp[pFloorIndex] + xFraction; + return mStackVisibleRect.top + (int) (x * mStackVisibleRect.height()); + } + + /** Converts from the progress along the curve to a scale. */ + float curveProgressToScale(float p) { + if (p < 0) return StackPeekMinScale; + if (p > 1) return 1f; + float scaleRange = (1f - StackPeekMinScale); + float scale = StackPeekMinScale + (p * scaleRange); + return scale; } + /** Converts from a screen coordinate to the progress along the curve. */ + float screenYToCurveProgress(int screenY) { + float x = (float) (screenY - mStackVisibleRect.top) / mStackVisibleRect.height(); + if (x < 0 || x > 1) return x; + float xIndex = x * PrecisionSteps; + int xFloorIndex = (int) Math.floor(xIndex); + int xCeilIndex = (int) Math.ceil(xIndex); + float pFraction = 0; + if (xFloorIndex < PrecisionSteps && (xCeilIndex != xFloorIndex)) { + float xFraction = (xIndex - xFloorIndex) / (xCeilIndex - xFloorIndex); + pFraction = (px[xCeilIndex] - px[xFloorIndex]) * xFraction; + } + return px[xFloorIndex] + pFraction; + } }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java new file mode 100644 index 0000000..0a12dab --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.recents.views; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; +import android.content.Context; +import android.widget.OverScroller; +import com.android.systemui.recents.RecentsConfiguration; + +/* The scrolling logic for a TaskStackView */ +public class TaskStackViewScroller { + public interface TaskStackViewScrollerCallbacks { + public void onScrollChanged(float p); + } + + RecentsConfiguration mConfig; + TaskStackViewLayoutAlgorithm mLayoutAlgorithm; + TaskStackViewScrollerCallbacks mCb; + + float mStackScrollP; + + OverScroller mScroller; + ObjectAnimator mScrollAnimator; + + public TaskStackViewScroller(Context context, RecentsConfiguration config, TaskStackViewLayoutAlgorithm layoutAlgorithm) { + mConfig = config; + mScroller = new OverScroller(context); + mLayoutAlgorithm = layoutAlgorithm; + setStackScroll(getStackScroll()); + } + + /** Sets the callbacks */ + void setCallbacks(TaskStackViewScrollerCallbacks cb) { + mCb = cb; + } + + /** Gets the current stack scroll */ + public float getStackScroll() { + return mStackScrollP; + } + + /** Sets the current stack scroll */ + public void setStackScroll(float s) { + mStackScrollP = s; + if (mCb != null) { + mCb.onScrollChanged(mStackScrollP); + } + } + + /** Sets the current stack scroll without calling the callback. */ + void setStackScrollRaw(float s) { + mStackScrollP = s; + } + + /** Sets the current stack scroll to the initial state when you first enter recents */ + public void setStackScrollToInitialState() { + setStackScroll(getBoundedStackScroll(mLayoutAlgorithm.mInitialScrollP)); + } + + /** Bounds the current scroll if necessary */ + public boolean boundScroll() { + float curScroll = getStackScroll(); + float newScroll = getBoundedStackScroll(curScroll); + if (Float.compare(newScroll, curScroll) != 0) { + setStackScroll(newScroll); + return true; + } + return false; + } + /** Bounds the current scroll if necessary, but does not synchronize the stack view with the model. */ + public boolean boundScrollRaw() { + float curScroll = getStackScroll(); + float newScroll = getBoundedStackScroll(curScroll); + if (Float.compare(newScroll, curScroll) != 0) { + setStackScrollRaw(newScroll); + return true; + } + return false; + } + + /** Returns the bounded stack scroll */ + float getBoundedStackScroll(float scroll) { + return Math.max(mLayoutAlgorithm.mMinScrollP, Math.min(mLayoutAlgorithm.mMaxScrollP, scroll)); + } + + /** Returns the amount that the aboslute value of how much the scroll is out of bounds. */ + float getScrollAmountOutOfBounds(float scroll) { + if (scroll < mLayoutAlgorithm.mMinScrollP) { + return Math.abs(scroll - mLayoutAlgorithm.mMinScrollP); + } else if (scroll > mLayoutAlgorithm.mMaxScrollP) { + return Math.abs(scroll - mLayoutAlgorithm.mMaxScrollP); + } + return 0f; + } + + /** Returns whether the specified scroll is out of bounds */ + boolean isScrollOutOfBounds() { + return Float.compare(getScrollAmountOutOfBounds(mStackScrollP), 0f) != 0; + } + + /** Animates the stack scroll into bounds */ + ObjectAnimator animateBoundScroll() { + float curScroll = getStackScroll(); + float newScroll = getBoundedStackScroll(curScroll); + if (Float.compare(newScroll, curScroll) != 0) { + // Start a new scroll animation + animateScroll(curScroll, newScroll, null); + } + return mScrollAnimator; + } + + /** Animates the stack scroll */ + void animateScroll(float curScroll, float newScroll, final Runnable postRunnable) { + // Abort any current animations + stopScroller(); + stopBoundScrollAnimation(); + + mScrollAnimator = ObjectAnimator.ofFloat(this, "stackScroll", curScroll, newScroll); + mScrollAnimator.setDuration(250); + // We would have to project the difference into the screen coords, and then use that as the + // duration +// mScrollAnimator.setDuration(Utilities.calculateTranslationAnimationDuration(newScroll - +// curScroll, 250)); + mScrollAnimator.setInterpolator(mConfig.fastOutSlowInInterpolator); + mScrollAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + setStackScroll((Float) animation.getAnimatedValue()); + } + }); + mScrollAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (postRunnable != null) { + postRunnable.run(); + } + mScrollAnimator.removeAllListeners(); + } + }); + mScrollAnimator.start(); + } + + /** Aborts any current stack scrolls */ + void stopBoundScrollAnimation() { + if (mScrollAnimator != null) { + mScrollAnimator.removeAllListeners(); + mScrollAnimator.cancel(); + } + } + + /**** OverScroller ****/ + + int progressToScrollRange(float p) { + return (int) (p * mLayoutAlgorithm.mStackVisibleRect.height()); + } + + float scrollRangeToProgress(int s) { + return (float) s / mLayoutAlgorithm.mStackVisibleRect.height(); + } + + /** Called from the view draw, computes the next scroll. */ + boolean computeScroll() { + if (mScroller.computeScrollOffset()) { + float scroll = scrollRangeToProgress(mScroller.getCurrY()); + setStackScrollRaw(scroll); + if (mCb != null) { + mCb.onScrollChanged(scroll); + } + return true; + } + return false; + } + + /** Returns whether the overscroller is scrolling. */ + boolean isScrolling() { + return !mScroller.isFinished(); + } + + /** Stops the scroller and any current fling. */ + void stopScroller() { + if (!mScroller.isFinished()) { + mScroller.abortAnimation(); + } + } +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java index b1c35f3..4cf6b82 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java @@ -29,16 +29,19 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { static int INACTIVE_POINTER_ID = -1; TaskStackView mSv; + TaskStackViewScroller mScroller; VelocityTracker mVelocityTracker; boolean mIsScrolling; + float mInitialP; + float mLastP; + float mTotalPMotion; int mInitialMotionX, mInitialMotionY; int mLastMotionX, mLastMotionY; int mActivePointerId = INACTIVE_POINTER_ID; TaskView mActiveTaskView = null; - int mTotalScrollMotion; int mMinimumVelocity; int mMaximumVelocity; // The scroll touch slop is used to calculate when we start scrolling @@ -49,14 +52,14 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { SwipeHelper mSwipeHelper; boolean mInterceptedBySwipeHelper; - public TaskStackViewTouchHandler(Context context, TaskStackView sv) { + public TaskStackViewTouchHandler(Context context, TaskStackView sv, TaskStackViewScroller scroller) { ViewConfiguration configuration = ViewConfiguration.get(context); mMinimumVelocity = configuration.getScaledMinimumFlingVelocity(); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); mScrollTouchSlop = configuration.getScaledTouchSlop(); mPagingTouchSlop = configuration.getScaledPagingTouchSlop(); mSv = sv; - + mScroller = scroller; float densityScale = context.getResources().getDisplayMetrics().density; mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, densityScale, mPagingTouchSlop); @@ -97,6 +100,13 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { return null; } + /** Constructs a simulated motion event for the current stack scroll. */ + MotionEvent createMotionEventForStackScroll(MotionEvent ev) { + MotionEvent pev = MotionEvent.obtainNoHistory(ev); + pev.setLocation(0, mScroller.progressToScrollRange(mScroller.getStackScroll())); + return pev; + } + /** Touch preprocessing for handling below */ public boolean onInterceptTouchEvent(MotionEvent ev) { // Return early if we have no children @@ -111,24 +121,25 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { return true; } - boolean wasScrolling = !mSv.mScroller.isFinished() || - (mSv.mScrollAnimator != null && mSv.mScrollAnimator.isRunning()); + boolean wasScrolling = mScroller.isScrolling() || + (mScroller.mScrollAnimator != null && mScroller.mScrollAnimator.isRunning()); int action = ev.getAction(); switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { // Save the touch down info mInitialMotionX = mLastMotionX = (int) ev.getX(); mInitialMotionY = mLastMotionY = (int) ev.getY(); + mInitialP = mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY); mActivePointerId = ev.getPointerId(0); mActiveTaskView = findViewAtPoint(mLastMotionX, mLastMotionY); // Stop the current scroll if it is still flinging - mSv.abortScroller(); - mSv.abortBoundScrollAnimation(); + mScroller.stopScroller(); + mScroller.stopBoundScrollAnimation(); // Initialize the velocity tracker initOrResetVelocityTracker(); - mVelocityTracker.addMovement(ev); + mVelocityTracker.addMovement(createMotionEventForStackScroll(ev)); // Check if the scroller is finished yet - mIsScrolling = !mSv.mScroller.isFinished(); + mIsScrolling = mScroller.isScrolling(); break; } case MotionEvent.ACTION_MOVE: { @@ -142,7 +153,7 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { mIsScrolling = true; // Initialize the velocity tracker if necessary initVelocityTrackerIfNotExists(); - mVelocityTracker.addMovement(ev); + mVelocityTracker.addMovement(createMotionEventForStackScroll(ev)); // Disallow parents from intercepting touch events final ViewParent parent = mSv.getParent(); if (parent != null) { @@ -152,17 +163,18 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { mLastMotionX = x; mLastMotionY = y; + mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY); break; } case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: { // Animate the scroll back if we've cancelled - mSv.animateBoundScroll(); + mScroller.animateBoundScroll(); // Reset the drag state and the velocity tracker mIsScrolling = false; mActivePointerId = INACTIVE_POINTER_ID; mActiveTaskView = null; - mTotalScrollMotion = 0; + mTotalPMotion = 0; recycleVelocityTracker(); break; } @@ -186,7 +198,6 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { // Update the velocity tracker initVelocityTrackerIfNotExists(); - mVelocityTracker.addMovement(ev); int action = ev.getAction(); switch (action & MotionEvent.ACTION_MASK) { @@ -194,14 +205,15 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { // Save the touch down info mInitialMotionX = mLastMotionX = (int) ev.getX(); mInitialMotionY = mLastMotionY = (int) ev.getY(); + mInitialP = mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY); mActivePointerId = ev.getPointerId(0); mActiveTaskView = findViewAtPoint(mLastMotionX, mLastMotionY); // Stop the current scroll if it is still flinging - mSv.abortScroller(); - mSv.abortBoundScrollAnimation(); + mScroller.stopScroller(); + mScroller.stopBoundScrollAnimation(); // Initialize the velocity tracker initOrResetVelocityTracker(); - mVelocityTracker.addMovement(ev); + mVelocityTracker.addMovement(createMotionEventForStackScroll(ev)); // Disallow parents from intercepting touch events final ViewParent parent = mSv.getParent(); if (parent != null) { @@ -214,6 +226,7 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { mActivePointerId = ev.getPointerId(index); mLastMotionX = (int) ev.getX(index); mLastMotionY = (int) ev.getY(index); + mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY); break; } case MotionEvent.ACTION_MOVE: { @@ -223,13 +236,14 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { int x = (int) ev.getX(activePointerIndex); int y = (int) ev.getY(activePointerIndex); int yTotal = Math.abs(y - mInitialMotionY); - int deltaY = mLastMotionY - y; + float curP = mSv.mLayoutAlgorithm.screenYToCurveProgress(y); + float deltaP = mLastP - curP; if (!mIsScrolling) { if (yTotal > mScrollTouchSlop) { mIsScrolling = true; // Initialize the velocity tracker initOrResetVelocityTracker(); - mVelocityTracker.addMovement(ev); + mVelocityTracker.addMovement(createMotionEventForStackScroll(ev)); // Disallow parents from intercepting touch events final ViewParent parent = mSv.getParent(); if (parent != null) { @@ -238,23 +252,26 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { } } if (mIsScrolling) { - int curStackScroll = mSv.getStackScroll(); - int overScrollAmount = mSv.getScrollAmountOutOfBounds(curStackScroll + deltaY); - if (overScrollAmount != 0) { + float curStackScroll = mScroller.getStackScroll(); + float overScrollAmount = mScroller.getScrollAmountOutOfBounds(curStackScroll + deltaP); + if (Float.compare(overScrollAmount, 0f) != 0) { // Bound the overscroll to a fixed amount, and inversely scale the y-movement // relative to how close we are to the max overscroll - float maxOverScroll = mSv.mStackAlgorithm.mTaskRect.height() / 3f; - deltaY = Math.round(deltaY * (1f - (Math.min(maxOverScroll, overScrollAmount) - / maxOverScroll))); + float maxOverScroll = 0.25f; + deltaP *= (1f - (Math.min(maxOverScroll, overScrollAmount) + / maxOverScroll)); } - mSv.setStackScroll(curStackScroll + deltaY); - if (mSv.isScrollOutOfBounds()) { + mScroller.setStackScroll(curStackScroll + deltaP); + if (mScroller.isScrollOutOfBounds()) { mVelocityTracker.clear(); + } else { + mVelocityTracker.addMovement(createMotionEventForStackScroll(ev)); } } mLastMotionX = x; mLastMotionY = y; - mTotalScrollMotion += Math.abs(deltaY); + mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY); + mTotalPMotion += Math.abs(deltaP); break; } case MotionEvent.ACTION_UP: { @@ -263,25 +280,27 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { int velocity = (int) velocityTracker.getYVelocity(mActivePointerId); if (mIsScrolling && (Math.abs(velocity) > mMinimumVelocity)) { + // XXX: Should this be calculated as a percentage of a curve? int overscrollRange = (int) (Math.min(1f, Math.abs((float) velocity / mMaximumVelocity)) * Constants.Values.TaskStackView.TaskStackOverscrollRange); // Fling scroll - mSv.mScroller.fling(0, mSv.getStackScroll(), - 0, -velocity, + mScroller.mScroller.fling(0, mScroller.progressToScrollRange(mScroller.getStackScroll()), + 0, velocity, 0, 0, - mSv.mMinScroll, mSv.mMaxScroll, + mScroller.progressToScrollRange(mSv.mLayoutAlgorithm.mMinScrollP), + mScroller.progressToScrollRange(mSv.mLayoutAlgorithm.mMaxScrollP), 0, overscrollRange); // Invalidate to kick off computeScroll - mSv.invalidate(mSv.mStackAlgorithm.mStackRect); - } else if (mSv.isScrollOutOfBounds()) { + mSv.invalidate(); + } else if (mScroller.isScrollOutOfBounds()) { // Animate the scroll back into bounds - mSv.animateBoundScroll(); + mScroller.animateBoundScroll(); } mActivePointerId = INACTIVE_POINTER_ID; mIsScrolling = false; - mTotalScrollMotion = 0; + mTotalPMotion = 0; recycleVelocityTracker(); break; } @@ -294,18 +313,19 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { mActivePointerId = ev.getPointerId(newPointerIndex); mLastMotionX = (int) ev.getX(newPointerIndex); mLastMotionY = (int) ev.getY(newPointerIndex); + mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY); mVelocityTracker.clear(); } break; } case MotionEvent.ACTION_CANCEL: { - if (mSv.isScrollOutOfBounds()) { + if (mScroller.isScrollOutOfBounds()) { // Animate the scroll back into bounds - mSv.animateBoundScroll(); + mScroller.animateBoundScroll(); } mActivePointerId = INACTIVE_POINTER_ID; mIsScrolling = false; - mTotalScrollMotion = 0; + mTotalPMotion = 0; recycleVelocityTracker(); break; } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java index 8a16d30..abf3c50 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java @@ -52,9 +52,11 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, RecentsConfiguration mConfig; + float mTaskProgress; + ObjectAnimator mTaskProgressAnimator; + float mMaxDimScale; int mDim; - int mMaxDim; - AccelerateInterpolator mDimInterpolator = new AccelerateInterpolator(); + AccelerateInterpolator mDimInterpolator = new AccelerateInterpolator(1.25f); PorterDuffColorFilter mDimColorFilter = new PorterDuffColorFilter(0, PorterDuff.Mode.MULTIPLY); Task mTask; @@ -76,7 +78,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { - updateDimOverlayFromScale(); + setTaskProgress((Float) animation.getAnimatedValue()); } }; @@ -96,10 +98,11 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, public TaskView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); mConfig = RecentsConfiguration.getInstance(); - mMaxDim = mConfig.taskStackMaxDim; + mMaxDimScale = mConfig.taskStackMaxDim / 255f; mClipViewInStack = true; mViewBounds = new AnimateableViewBounds(this, mConfig.taskViewRoundedCornerRadiusPx); setOutlineProvider(mViewBounds); + setTaskProgress(getTaskProgress()); setDim(getDim()); } @@ -159,9 +162,6 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, /** Synchronizes this view's properties with the task's transform */ void updateViewPropertiesToTaskTransform(TaskViewTransform toTransform, int duration) { - // Update the bar view - mBarView.updateViewPropertiesToTaskTransform(toTransform, duration); - // If we are a full screen view, then only update the Z to keep it in order // XXX: Also update/animate the dim as well if (mIsFullScreenView) { @@ -173,8 +173,21 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, } // Apply the transform - toTransform.applyToTaskView(this, duration, mConfig.fastOutSlowInInterpolator, false, - mUpdateDimListener); + toTransform.applyToTaskView(this, duration, mConfig.fastOutSlowInInterpolator, false); + + // Update the task progress + if (mTaskProgressAnimator != null) { + mTaskProgressAnimator.removeAllListeners(); + mTaskProgressAnimator.cancel(); + } + if (duration <= 0) { + setTaskProgress(toTransform.p); + } else { + mTaskProgressAnimator = ObjectAnimator.ofFloat(this, "taskProgress", toTransform.p); + mTaskProgressAnimator.setDuration(duration); + mTaskProgressAnimator.addUpdateListener(mUpdateDimListener); + mTaskProgressAnimator.start(); + } } /** Resets this view's properties */ @@ -325,7 +338,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, mThumbnailView.enableTaskBarClipAsRunnable(mBarView)); // Animate the dim into view as well - ObjectAnimator anim = ObjectAnimator.ofInt(this, "dim", getDimOverlayFromScale()); + ObjectAnimator anim = ObjectAnimator.ofInt(this, "dim", getDimFromTaskProgress()); anim.setStartDelay(mConfig.taskBarEnterAnimDelay); anim.setDuration(mConfig.taskBarEnterAnimDuration); anim.setInterpolator(mConfig.fastOutLinearInInterpolator); @@ -556,6 +569,17 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, } } + /** Sets the current task progress. */ + public void setTaskProgress(float p) { + mTaskProgress = p; + updateDimFromTaskProgress(); + } + + /** Returns the current task progress. */ + public float getTaskProgress() { + return mTaskProgress; + } + /** Returns the current dim. */ public void setDim(int dim) { mDim = dim; @@ -571,17 +595,14 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, } /** Compute the dim as a function of the scale of this view. */ - int getDimOverlayFromScale() { - float minScale = TaskStackViewLayoutAlgorithm.StackPeekMinScale; - float scaleRange = 1f - minScale; - float dim = (1f - getScaleX()) / scaleRange; - dim = mDimInterpolator.getInterpolation(Math.min(dim, 1f)); - return Math.max(0, Math.min(mMaxDim, (int) (dim * 255))); + int getDimFromTaskProgress() { + float dim = mMaxDimScale * mDimInterpolator.getInterpolation(1f - mTaskProgress); + return (int) (dim * 255); } /** Update the dim as a function of the scale of this view. */ - void updateDimOverlayFromScale() { - setDim(getDimOverlayFromScale()); + void updateDimFromTaskProgress() { + setDim(getDimFromTaskProgress()); } /**** View focus state ****/ @@ -650,9 +671,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, } mBarView.rebindToTask(mTask); // Rebind any listeners - if (Constants.DebugFlags.App.EnableTaskFiltering) { - mBarView.mApplicationIcon.setOnClickListener(this); - } + mBarView.mApplicationIcon.setOnClickListener(this); mBarView.mDismissButton.setOnClickListener(this); if (mFooterView != null) { mFooterView.setOnClickListener(this); @@ -675,9 +694,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, mThumbnailView.unbindFromTask(); mBarView.unbindFromTask(); // Unbind any listeners - if (Constants.DebugFlags.App.EnableTaskFiltering) { - mBarView.mApplicationIcon.setOnClickListener(null); - } + mBarView.mApplicationIcon.setOnClickListener(null); mBarView.mDismissButton.setOnClickListener(null); if (mFooterView != null) { mFooterView.setOnClickListener(null); @@ -717,7 +734,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, postDelayed(new Runnable() { @Override public void run() { - if (v == mBarView.mApplicationIcon) { + if (Constants.DebugFlags.App.EnableTaskFiltering && v == mBarView.mApplicationIcon) { mCb.onTaskViewAppIconClicked(tv); } else if (v == mBarView.mDismissButton) { // Animate out the view and call the callback @@ -729,7 +746,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, }); // Hide the footer tv.animateFooterVisibility(false, mConfig.taskViewRemoveAnimDuration); - } else if (v == tv || (v == mFooterView || v == mActionButtonView)) { + } else { mCb.onTaskViewClicked(tv, tv.getTask(), (v == mFooterView || v == mActionButtonView)); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java index aeb4fe4..ce2e80b 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java @@ -28,13 +28,12 @@ import com.android.systemui.recents.Constants; public class TaskViewTransform { public int startDelay = 0; public int translationY = 0; - public int translationZ = 0; + public float translationZ = 0; public float scale = 1f; public float alpha = 1f; - public float dismissAlpha = 1f; public boolean visible = false; public Rect rect = new Rect(); - float t = 0f; + float p = 0f; public TaskViewTransform() { // Do nothing @@ -46,10 +45,9 @@ public class TaskViewTransform { translationZ = o.translationZ; scale = o.scale; alpha = o.alpha; - dismissAlpha = o.dismissAlpha; visible = o.visible; rect.set(o.rect); - t = o.t; + p = o.p; } /** Resets the current transform */ @@ -59,19 +57,15 @@ public class TaskViewTransform { translationZ = 0; scale = 1f; alpha = 1f; - dismissAlpha = 1f; visible = false; rect.setEmpty(); - t = 0f; + p = 0f; } /** Convenience functions to compare against current property values */ public boolean hasAlphaChangedFrom(float v) { return (Float.compare(alpha, v) != 0); } - public boolean hasDismissAlphaChangedFrom(float v) { - return (Float.compare(dismissAlpha, v) != 0); - } public boolean hasScaleChangedFrom(float v) { return (Float.compare(scale, v) != 0); } @@ -83,8 +77,7 @@ public class TaskViewTransform { } /** Applies this transform to a view. */ - public void applyToTaskView(View v, int duration, Interpolator interp, boolean allowLayers, - ValueAnimator.AnimatorUpdateListener scaleUpdateListener) { + public void applyToTaskView(View v, int duration, Interpolator interp, boolean allowLayers) { // Check to see if any properties have changed, and update the task view if (duration > 0) { ViewPropertyAnimator anim = v.animate(); @@ -100,8 +93,7 @@ public class TaskViewTransform { } if (hasScaleChangedFrom(v.getScaleX())) { anim.scaleX(scale) - .scaleY(scale) - .setUpdateListener(scaleUpdateListener); + .scaleY(scale); requiresLayers = true; } if (hasAlphaChangedFrom(v.getAlpha())) { @@ -128,7 +120,6 @@ public class TaskViewTransform { if (hasScaleChangedFrom(v.getScaleX())) { v.setScaleX(scale); v.setScaleY(scale); - scaleUpdateListener.onAnimationUpdate(null); } if (hasAlphaChangedFrom(v.getAlpha())) { v.setAlpha(alpha); @@ -152,6 +143,6 @@ public class TaskViewTransform { public String toString() { return "TaskViewTransform delay: " + startDelay + " y: " + translationY + " z: " + translationZ + " scale: " + scale + " alpha: " + alpha + " visible: " + visible + " rect: " + rect + - " dismissAlpha: " + dismissAlpha; + " p: " + p; } } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 5771299..c559253 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -74,6 +74,8 @@ class SaveImageInBackgroundData { Runnable finisher; int iconSize; int result; + int previewWidth; + int previewheight; void clearImage() { image = null; @@ -131,17 +133,19 @@ class SaveImageInBackgroundTask extends AsyncTask<SaveImageInBackgroundData, Voi mImageWidth = data.image.getWidth(); mImageHeight = data.image.getHeight(); int iconSize = data.iconSize; + int previewWidth = data.previewWidth; + int previewHeight = data.previewheight; final int shortSide = mImageWidth < mImageHeight ? mImageWidth : mImageHeight; - Bitmap preview = Bitmap.createBitmap(shortSide, shortSide, data.image.getConfig()); + Bitmap preview = Bitmap.createBitmap(previewWidth, previewHeight, data.image.getConfig()); Canvas c = new Canvas(preview); Paint paint = new Paint(); ColorMatrix desat = new ColorMatrix(); desat.setSaturation(0.25f); paint.setColorFilter(new ColorMatrixColorFilter(desat)); Matrix matrix = new Matrix(); - matrix.postTranslate((shortSide - mImageWidth) / 2, - (shortSide - mImageHeight) / 2); + matrix.postTranslate((previewWidth - mImageWidth) / 2, + (previewHeight - mImageHeight) / 2); c.drawBitmap(data.image, matrix, paint); c.drawColor(0x40FFFFFF); c.setBitmap(null); @@ -343,6 +347,8 @@ class GlobalScreenshot { private static final float SCREENSHOT_DROP_OUT_MIN_SCALE = SCREENSHOT_SCALE * 0.45f; private static final float SCREENSHOT_FAST_DROP_OUT_MIN_SCALE = SCREENSHOT_SCALE * 0.6f; private static final float SCREENSHOT_DROP_OUT_MIN_SCALE_OFFSET = 0f; + private final int mPreviewWidth; + private final int mPreviewHeight; private Context mContext; private WindowManager mWindowManager; @@ -418,6 +424,16 @@ class GlobalScreenshot { mBgPadding = (float) r.getDimensionPixelSize(R.dimen.global_screenshot_bg_padding); mBgPaddingScale = mBgPadding / mDisplayMetrics.widthPixels; + // determine the optimal preview size + int panelWidth = 0; + try { + panelWidth = r.getDimensionPixelSize(R.dimen.notification_panel_width); + } catch (Resources.NotFoundException e) { + panelWidth = mDisplayMetrics.widthPixels; + } + mPreviewWidth = panelWidth; + mPreviewHeight = r.getDimensionPixelSize(R.dimen.notification_max_height); + // Setup the Camera shutter sound mCameraSound = new MediaActionSound(); mCameraSound.load(MediaActionSound.SHUTTER_CLICK); @@ -432,6 +448,8 @@ class GlobalScreenshot { data.image = mScreenBitmap; data.iconSize = mNotificationIconSize; data.finisher = finisher; + data.previewWidth = mPreviewWidth; + data.previewheight = mPreviewHeight; if (mSaveInBgTask != null) { mSaveInBgTask.cancel(false); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java index 4d7698a..1cd18a0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java @@ -43,7 +43,6 @@ import android.view.animation.LinearInterpolator; import android.view.animation.PathInterpolator; import com.android.systemui.R; -import com.android.systemui.statusbar.stack.StackStateAnimator; /** * Base class for both {@link ExpandableNotificationRow} and {@link NotificationOverflowContainer} @@ -449,19 +448,20 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView } @Override - public void performRemoveAnimation(float translationDirection, Runnable onFinishedRunnable) { + public void performRemoveAnimation(long duration, float translationDirection, + Runnable onFinishedRunnable) { enableAppearDrawing(true); if (mDrawingAppearAnimation) { startAppearAnimation(false /* isAppearing */, translationDirection, - 0, onFinishedRunnable); + 0, duration, onFinishedRunnable); } } @Override - public void performAddAnimation(long delay) { + public void performAddAnimation(long delay, long duration) { enableAppearDrawing(true); if (mDrawingAppearAnimation) { - startAppearAnimation(true /* isAppearing */, -1.0f, delay, null); + startAppearAnimation(true /* isAppearing */, -1.0f, delay, duration, null); } } @@ -470,8 +470,8 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView mScrimView.setAlpha(scrimAmount); } - private void startAppearAnimation(boolean isAppearing, - float translationDirection, long delay, final Runnable onFinishedRunnable) { + private void startAppearAnimation(boolean isAppearing, float translationDirection, long delay, + long duration, final Runnable onFinishedRunnable) { if (mAppearAnimator != null) { mAppearAnimator.cancel(); } @@ -501,8 +501,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView targetValue); mAppearAnimator.setInterpolator(mLinearInterpolator); mAppearAnimator.setDuration( - (long) (StackStateAnimator.ANIMATION_DURATION_APPEAR_DISAPPEAR - * Math.abs(mAppearAnimationFraction - targetValue))); + (long) (duration * Math.abs(mAppearAnimationFraction - targetValue))); mAppearAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 4b037d2..03508ea 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -1324,31 +1324,30 @@ public abstract class BaseStatusBar extends SystemUI implements return entry.notification; } - protected NotificationData.Entry createNotificationViews(StatusBarNotification notification) { + protected NotificationData.Entry createNotificationViews(StatusBarNotification sbn) { if (DEBUG) { - Log.d(TAG, "createNotificationViews(notification=" + notification); + Log.d(TAG, "createNotificationViews(notification=" + sbn); } // Construct the icon. + Notification n = sbn.getNotification(); final StatusBarIconView iconView = new StatusBarIconView(mContext, - notification.getPackageName() + "/0x" + Integer.toHexString(notification.getId()), - notification.getNotification()); + sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId()), n); iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); - final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(), - notification.getUser(), - notification.getNotification().icon, - notification.getNotification().iconLevel, - notification.getNotification().number, - notification.getNotification().tickerText); + final StatusBarIcon ic = new StatusBarIcon(sbn.getPackageName(), + sbn.getUser(), + n.icon, + n.iconLevel, + n.number, + n.tickerText); if (!iconView.set(ic)) { - handleNotificationError(notification, "Couldn't create icon: " + ic); + handleNotificationError(sbn, "Couldn't create icon: " + ic); return null; } // Construct the expanded view. - NotificationData.Entry entry = new NotificationData.Entry(notification, iconView); + NotificationData.Entry entry = new NotificationData.Entry(sbn, iconView); if (!inflateViews(entry, mStackScroller)) { - handleNotificationError(notification, "Couldn't expand RemoteViews for: " - + notification); + handleNotificationError(sbn, "Couldn't expand RemoteViews for: " + sbn); return null; } return entry; @@ -1464,15 +1463,16 @@ public abstract class BaseStatusBar extends SystemUI implements // XXX: modify when we do something more intelligent with the two content views final RemoteViews oldContentView = oldNotification.getNotification().contentView; - final RemoteViews contentView = notification.getNotification().contentView; + Notification n = notification.getNotification(); + final RemoteViews contentView = n.contentView; final RemoteViews oldBigContentView = oldNotification.getNotification().bigContentView; - final RemoteViews bigContentView = notification.getNotification().bigContentView; + final RemoteViews bigContentView = n.bigContentView; final RemoteViews oldHeadsUpContentView = oldNotification.getNotification().headsUpContentView; - final RemoteViews headsUpContentView = notification.getNotification().headsUpContentView; + final RemoteViews headsUpContentView = n.headsUpContentView; final Notification oldPublicNotification = oldNotification.getNotification().publicVersion; final RemoteViews oldPublicContentView = oldPublicNotification != null ? oldPublicNotification.contentView : null; - final Notification publicNotification = notification.getNotification().publicVersion; + final Notification publicNotification = n.publicVersion; final RemoteViews publicContentView = publicNotification != null ? publicNotification.contentView : null; @@ -1484,7 +1484,7 @@ public abstract class BaseStatusBar extends SystemUI implements + " bigContentView=" + oldBigContentView + " publicView=" + oldPublicContentView + " rowParent=" + oldEntry.row.getParent()); - Log.d(TAG, "new notification: when=" + notification.getNotification().when + Log.d(TAG, "new notification: when=" + n.when + " ongoing=" + oldNotification.isOngoing() + " contentView=" + contentView + " bigContentView=" + bigContentView @@ -1521,8 +1521,8 @@ public abstract class BaseStatusBar extends SystemUI implements && oldPublicContentView.getPackage() != null && oldPublicContentView.getPackage().equals(publicContentView.getPackage()) && oldPublicContentView.getLayoutId() == publicContentView.getLayoutId()); - boolean updateTicker = notification.getNotification().tickerText != null - && !TextUtils.equals(notification.getNotification().tickerText, + boolean updateTicker = n.tickerText != null + && !TextUtils.equals(n.tickerText, oldEntry.notification.getNotification().tickerText); final boolean shouldInterrupt = shouldInterrupt(notification); @@ -1537,10 +1537,11 @@ public abstract class BaseStatusBar extends SystemUI implements // Update the icon final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(), notification.getUser(), - notification.getNotification().icon, - notification.getNotification().iconLevel, - notification.getNotification().number, - notification.getNotification().tickerText); + n.icon, + n.iconLevel, + n.number, + n.tickerText); + oldEntry.icon.setNotification(n); if (!oldEntry.icon.set(ic)) { handleNotificationError(notification, "Couldn't update icon: " + ic); return; @@ -1607,10 +1608,11 @@ public abstract class BaseStatusBar extends SystemUI implements oldEntry.notification = notification; final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(), notification.getUser(), - notification.getNotification().icon, - notification.getNotification().iconLevel, - notification.getNotification().number, - notification.getNotification().tickerText); + n.icon, + n.iconLevel, + n.number, + n.tickerText); + oldEntry.icon.setNotification(n); oldEntry.icon.set(ic); inflateViews(oldEntry, mStackScroller, wasHeadsUp); mNotificationData.updateRanking(ranking); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java b/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java index d60c17f..9712ee2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java @@ -116,12 +116,15 @@ public class DismissView extends ExpandableView { } @Override - public void performRemoveAnimation(float translationDirection, Runnable onFinishedRunnable) { + public void performRemoveAnimation(long duration, float translationDirection, + Runnable onFinishedRunnable) { + // TODO: Use duration performVisibilityAnimation(false); } @Override - public void performAddAnimation(long delay) { + public void performAddAnimation(long delay, long duration) { + // TODO: use delay and duration performVisibilityAnimation(true); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java index b71cd77..5cadd1e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java @@ -220,6 +220,7 @@ public abstract class ExpandableView extends FrameLayout { /** * Perform a remove animation on this view. * + * @param duration The duration of the remove animation. * @param translationDirection The direction value from [-1 ... 1] indicating in which the * animation should be performed. A value of -1 means that The * remove animation should be performed upwards, @@ -227,10 +228,10 @@ public abstract class ExpandableView extends FrameLayout { * Should mean the opposite. * @param onFinishedRunnable A runnable which should be run when the animation is finished. */ - public abstract void performRemoveAnimation(float translationDirection, + public abstract void performRemoveAnimation(long duration, float translationDirection, Runnable onFinishedRunnable); - public abstract void performAddAnimation(long delay); + public abstract void performAddAnimation(long delay, long duration); public abstract void setScrimAmount(float scrimAmount); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java index 8bae19a..fb13126 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java @@ -17,9 +17,6 @@ package com.android.systemui.statusbar; import android.content.Context; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffColorFilter; -import android.os.Build; import android.util.AttributeSet; import android.util.Log; import android.view.View; @@ -36,16 +33,13 @@ public class SignalClusterView extends LinearLayout implements NetworkControllerImpl.SignalCluster { - static final boolean DEBUG = false; static final String TAG = "SignalClusterView"; - static final PorterDuffColorFilter PROBLEM_FILTER - = new PorterDuffColorFilter(0xffab653b, PorterDuff.Mode.SRC_ATOP); + static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); NetworkControllerImpl mNC; private boolean mWifiVisible = false; private int mWifiStrengthId = 0; - private boolean mInetProblem; private boolean mMobileVisible = false; private int mMobileStrengthId = 0, mMobileTypeId = 0; private boolean mIsAirplaneMode = false; @@ -102,22 +96,19 @@ public class SignalClusterView } @Override - public void setWifiIndicators(boolean visible, int strengthIcon, boolean problem, - String contentDescription) { + public void setWifiIndicators(boolean visible, int strengthIcon, String contentDescription) { mWifiVisible = visible; mWifiStrengthId = strengthIcon; - mInetProblem = problem; mWifiDescription = contentDescription; apply(); } @Override - public void setMobileDataIndicators(boolean visible, int strengthIcon, boolean problem, - int typeIcon, String contentDescription, String typeContentDescription) { + public void setMobileDataIndicators(boolean visible, int strengthIcon, int typeIcon, + String contentDescription, String typeContentDescription) { mMobileVisible = visible; mMobileStrengthId = strengthIcon; - mInetProblem = problem; mMobileTypeId = typeIcon; mMobileDescription = contentDescription; mMobileTypeDescription = typeContentDescription; @@ -172,17 +163,12 @@ public class SignalClusterView return false; } - private void applyInetProblem(ImageView iv) { - iv.setColorFilter(Build.IS_DEBUGGABLE && mInetProblem ? PROBLEM_FILTER : null); - } - // Run after each indicator change. private void apply() { if (mWifiGroup == null) return; if (mWifiVisible) { mWifi.setImageResource(mWifiStrengthId); - applyInetProblem(mWifi); mWifiGroup.setContentDescription(mWifiDescription); mWifiGroup.setVisibility(View.VISIBLE); } else { @@ -197,7 +183,6 @@ public class SignalClusterView if (mMobileVisible && !mIsAirplaneMode) { mMobile.setImageResource(mMobileStrengthId); mMobileType.setImageResource(mMobileTypeId); - applyInetProblem(mMobile); mMobileGroup.setContentDescription(mMobileTypeDescription + " " + mMobileDescription); mMobileGroup.setVisibility(View.VISIBLE); } else { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java index dfeadc5..816612b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java @@ -76,23 +76,25 @@ public class SpeedBumpView extends ExpandableView { return true; } - public void performVisibilityAnimation(boolean nowVisible) { - animateDivider(nowVisible, null /* onFinishedRunnable */); + public void performVisibilityAnimation(boolean nowVisible, long delay) { + animateDivider(nowVisible, delay, null /* onFinishedRunnable */); } /** * Animate the divider to a new visibility. * * @param nowVisible should it now be visible + * @param delay the delay after the animation should start * @param onFinishedRunnable A runnable which should be run when the animation is * finished. */ - public void animateDivider(boolean nowVisible, Runnable onFinishedRunnable) { + public void animateDivider(boolean nowVisible, long delay, Runnable onFinishedRunnable) { if (nowVisible != mIsVisible) { // Animate dividers float endValue = nowVisible ? 1.0f : 0.0f; mLine.animate() .alpha(endValue) + .setStartDelay(delay) .scaleX(endValue) .scaleY(endValue) .setInterpolator(mFastOutSlowInInterpolator) @@ -113,13 +115,16 @@ public class SpeedBumpView extends ExpandableView { } @Override - public void performRemoveAnimation(float translationDirection, Runnable onFinishedRunnable) { - performVisibilityAnimation(false); + public void performRemoveAnimation(long duration, float translationDirection, + Runnable onFinishedRunnable) { + // TODO: Use duration + performVisibilityAnimation(false, 0 /* delay */); } @Override - public void performAddAnimation(long delay) { - performVisibilityAnimation(true); + public void performAddAnimation(long delay, long duration) { + // TODO: Use duration + performVisibilityAnimation(true, delay); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index 6f839bd..20dd3e7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -57,8 +57,7 @@ public class StatusBarIconView extends AnimatedImageView { mNumberPain.setTextAlign(Paint.Align.CENTER); mNumberPain.setColor(res.getColor(R.drawable.notification_number_text_color)); mNumberPain.setAntiAlias(true); - mNotification = notification; - setContentDescription(notification); + setNotification(notification); // We do not resize and scale system icons (on the right), only notification icons (on the // left). @@ -73,6 +72,11 @@ public class StatusBarIconView extends AnimatedImageView { setScaleType(ImageView.ScaleType.CENTER); } + public void setNotification(Notification notification) { + mNotification = notification; + setContentDescription(notification); + } + public StatusBarIconView(Context context, AttributeSet attrs) { super(context, attrs); final Resources res = context.getResources(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 602b914..4f9d4a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -139,7 +139,7 @@ public class NotificationPanelView extends PanelView implements private boolean mIsLaunchTransitionRunning; private Runnable mLaunchAnimationEndRunnable; private boolean mOnlyAffordanceInThisMotion; - private boolean mKeyguardStatusBarAnimatingIn; + private boolean mKeyguardStatusViewAnimating; public NotificationPanelView(Context context, AttributeSet attrs) { super(context, attrs); @@ -285,7 +285,9 @@ public class NotificationPanelView extends PanelView implements } private void updateClock(float alpha, float scale) { - mKeyguardStatusView.setAlpha(alpha); + if (!mKeyguardStatusViewAnimating) { + mKeyguardStatusView.setAlpha(alpha); + } mKeyguardStatusView.setScaleX(scale); mKeyguardStatusView.setScaleY(scale); } @@ -671,7 +673,7 @@ public class NotificationPanelView extends PanelView implements } } - public void setBarState(int statusBarState) { + public void setBarState(int statusBarState, boolean keyguardFadingAway) { boolean keyguardShowing = statusBarState == StatusBarState.KEYGUARD || statusBarState == StatusBarState.SHADE_LOCKED; mKeyguardStatusBar.setAlpha(1f); @@ -680,11 +682,59 @@ public class NotificationPanelView extends PanelView implements setQsTranslation(mQsExpansionHeight); mHeader.setTranslationY(0f); } + setKeyguardStatusViewVisibility(statusBarState, keyguardFadingAway); mStatusBarState = statusBarState; mKeyguardShowing = keyguardShowing; updateQsState(); } + private final Runnable mAnimateKeyguardStatusViewInvisibleEndRunnable = new Runnable() { + @Override + public void run() { + mKeyguardStatusViewAnimating = false; + mKeyguardStatusView.setVisibility(View.GONE); + } + }; + + private final Runnable mAnimateKeyguardStatusViewVisibleEndRunnable = new Runnable() { + @Override + public void run() { + mKeyguardStatusViewAnimating = false; + } + }; + + private void setKeyguardStatusViewVisibility(int statusBarState, boolean keyguardFadingAway) { + if (!keyguardFadingAway && mStatusBarState == StatusBarState.KEYGUARD + && statusBarState != StatusBarState.KEYGUARD) { + mKeyguardStatusView.animate().cancel(); + mKeyguardStatusViewAnimating = true; + mKeyguardStatusView.animate() + .alpha(0f) + .setDuration(160) + .setInterpolator(PhoneStatusBar.ALPHA_OUT) + .withEndAction(mAnimateKeyguardStatusViewInvisibleEndRunnable); + } else if (mStatusBarState == StatusBarState.SHADE_LOCKED + && statusBarState == StatusBarState.KEYGUARD) { + mKeyguardStatusView.animate().cancel(); + mKeyguardStatusView.setVisibility(View.VISIBLE); + mKeyguardStatusViewAnimating = true; + mKeyguardStatusView.setAlpha(0f); + mKeyguardStatusView.animate() + .alpha(1f) + .setDuration(320) + .setInterpolator(PhoneStatusBar.ALPHA_IN) + .withEndAction(mAnimateKeyguardStatusViewVisibleEndRunnable); + } else if (statusBarState == StatusBarState.KEYGUARD) { + mKeyguardStatusView.animate().cancel(); + mKeyguardStatusView.setVisibility(View.VISIBLE); + mKeyguardStatusView.setAlpha(1f); + } else { + mKeyguardStatusView.animate().cancel(); + mKeyguardStatusView.setVisibility(View.GONE); + mKeyguardStatusView.setAlpha(1f); + } + } + private void updateQsState() { boolean expandVisually = mQsExpanded || mStackScrollerOverscrolling; mHeader.setVisibility((mQsExpanded || !mKeyguardShowing) ? View.VISIBLE : View.INVISIBLE); @@ -1076,7 +1126,7 @@ public class NotificationPanelView extends PanelView implements } alpha = Math.max(0, Math.min(alpha, 1)); alpha = (float) Math.pow(alpha, 0.75); - if (!mQsExpanded && !mKeyguardStatusBarAnimatingIn) { + if (!mQsExpanded) { mKeyguardStatusBar.setAlpha(alpha); } mKeyguardBottomArea.setAlpha(alpha); @@ -1374,6 +1424,14 @@ public class NotificationPanelView extends PanelView implements return mQsExpanded; } + public boolean isQsDetailShowing() { + return mQsPanel.isShowingDetail(); + } + + public void closeQsDetail() { + mQsPanel.closeDetail(); + } + @Override public boolean shouldDelayChildPressedState() { return true; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 0284036..06c7be2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -2969,6 +2969,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, private void setHeadsUpVisibility(boolean vis) { if (!ENABLE_HEADS_UP) return; if (DEBUG) Log.v(TAG, (vis ? "showing" : "hiding") + " heads up window"); + EventLog.writeEvent(EventLogTags.SYSUI_HEADS_UP_STATUS, + vis ? mHeadsUpNotificationView.getKey() : "", + vis ? 1 : 0); mHeadsUpNotificationView.setVisibility(vis ? View.VISIBLE : View.GONE); } @@ -3379,12 +3382,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, private void updateKeyguardState() { if (mState == StatusBarState.KEYGUARD) { - mKeyguardStatusView.setVisibility(View.VISIBLE); mKeyguardIndicationController.setVisible(true); mNotificationPanel.resetViews(); mKeyguardUserSwitcher.setKeyguard(true); } else { - mKeyguardStatusView.setVisibility(View.GONE); mKeyguardIndicationController.setVisible(false); mKeyguardUserSwitcher.setKeyguard(false); } @@ -3395,7 +3396,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mKeyguardBottomArea.setVisibility(View.GONE); mScrimController.setKeyguardShowing(false); } - mNotificationPanel.setBarState(mState); + mNotificationPanel.setBarState(mState, mKeyguardFadingAway); updateDozingState(); updateStackScrollerState(); updatePublicMode(); @@ -3457,7 +3458,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, return true; } if (mNotificationPanel.isQsExpanded()) { - mNotificationPanel.animateCloseQs(); + if (mNotificationPanel.isQsDetailShowing()) { + mNotificationPanel.closeQsDetail(); + } else { + mNotificationPanel.animateCloseQs(); + } return true; } if (mState != StatusBarState.KEYGUARD && mState != StatusBarState.SHADE_LOCKED) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java index ac260db..c2fa68f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java @@ -338,6 +338,10 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper. mBar.scheduleHeadsUpEscalation(); } + public String getKey() { + return mHeadsUp == null ? null : mHeadsUp.notification.getKey(); + } + private class EdgeSwipeHelper implements Gefingerpoken { private static final boolean DEBUG_EDGE_SWIPE = false; private final float mTouchSlop; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index 4fc2e06..dbf0c32 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -163,10 +163,9 @@ public class NetworkControllerImpl extends BroadcastReceiver boolean mDataAndWifiStacked = false; public interface SignalCluster { - void setWifiIndicators(boolean visible, int strengthIcon, boolean problem, - String contentDescription); - void setMobileDataIndicators(boolean visible, int strengthIcon, boolean problem, - int typeIcon, String contentDescription, String typeContentDescription); + void setWifiIndicators(boolean visible, int strengthIcon, String contentDescription); + void setMobileDataIndicators(boolean visible, int strengthIcon, int typeIcon, + String contentDescription, String typeContentDescription); void setIsAirplaneMode(boolean is, int airplaneIcon); } @@ -365,7 +364,6 @@ public class NetworkControllerImpl extends BroadcastReceiver // only show wifi in the cluster if connected or if wifi-only mWifiEnabled && (mWifiConnected || !mHasMobileDataFeature), mWifiIconId, - mInetCondition == 0, mContentDescriptionWifi); if (mIsWimaxEnabled && mWimaxConnected) { @@ -373,7 +371,6 @@ public class NetworkControllerImpl extends BroadcastReceiver cluster.setMobileDataIndicators( true, mAlwaysShowCdmaRssi ? mPhoneSignalIconId : mWimaxIconId, - mInetCondition == 0, mDataTypeIconId, mContentDescriptionWimax, mContentDescriptionDataType); @@ -382,7 +379,6 @@ public class NetworkControllerImpl extends BroadcastReceiver cluster.setMobileDataIndicators( mHasMobileDataFeature, mShowPhoneRSSIForData ? mPhoneSignalIconId : mDataSignalIconId, - mInetCondition == 0, mDataTypeIconId, mContentDescriptionPhoneSignal, mContentDescriptionDataType); @@ -1202,6 +1198,14 @@ public class NetworkControllerImpl extends BroadcastReceiver } } + if (mDemoMode) { + mQSWifiIconId = mDemoWifiLevel < 0 ? R.drawable.ic_qs_wifi_no_network + : WifiIcons.QS_WIFI_SIGNAL_STRENGTH[mDemoInetCondition][mDemoWifiLevel]; + mQSPhoneSignalIconId = mDemoMobileLevel < 0 ? R.drawable.ic_qs_signal_no_signal : + TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[mDemoInetCondition][mDemoMobileLevel]; + mQSDataTypeIconId = mDemoQSDataTypeIconId; + } + if (DEBUG) { Log.d(TAG, "refreshViews connected={" + (mWifiConnected?" wifi":"") @@ -1473,6 +1477,7 @@ public class NetworkControllerImpl extends BroadcastReceiver private int mDemoInetCondition; private int mDemoWifiLevel; private int mDemoDataTypeIconId; + private int mDemoQSDataTypeIconId; private int mDemoMobileLevel; @Override @@ -1482,12 +1487,14 @@ public class NetworkControllerImpl extends BroadcastReceiver mDemoWifiLevel = mWifiLevel; mDemoInetCondition = mInetCondition; mDemoDataTypeIconId = mDataTypeIconId; + mDemoQSDataTypeIconId = mQSDataTypeIconId; mDemoMobileLevel = mLastSignalLevel; } else if (mDemoMode && command.equals(COMMAND_EXIT)) { mDemoMode = false; for (SignalCluster cluster : mSignalClusters) { refreshSignalCluster(cluster); } + refreshViews(); } else if (mDemoMode && command.equals(COMMAND_NETWORK)) { String airplane = args.getString("airplane"); if (airplane != null) { @@ -1514,9 +1521,9 @@ public class NetworkControllerImpl extends BroadcastReceiver cluster.setWifiIndicators( show, iconId, - mDemoInetCondition == 0, "Demo"); } + refreshViews(); } String mobile = args.getString("mobile"); if (mobile != null) { @@ -1534,6 +1541,16 @@ public class NetworkControllerImpl extends BroadcastReceiver datatype.equals("roam") ? R.drawable.stat_sys_data_fully_connected_roam : 0; + mDemoQSDataTypeIconId = + datatype.equals("1x") ? R.drawable.ic_qs_signal_1x : + datatype.equals("3g") ? R.drawable.ic_qs_signal_3g : + datatype.equals("4g") ? R.drawable.ic_qs_signal_4g : + datatype.equals("e") ? R.drawable.ic_qs_signal_e : + datatype.equals("g") ? R.drawable.ic_qs_signal_g : + datatype.equals("h") ? R.drawable.ic_qs_signal_h : + datatype.equals("lte") ? R.drawable.ic_qs_signal_lte : + datatype.equals("roam") ? R.drawable.ic_qs_signal_r : + 0; } int[][] icons = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH; String level = args.getString("level"); @@ -1547,11 +1564,11 @@ public class NetworkControllerImpl extends BroadcastReceiver cluster.setMobileDataIndicators( show, iconId, - mDemoInetCondition == 0, mDemoDataTypeIconId, "Demo", "Demo"); } + refreshViews(); } } } 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 67ba879..84c53ce 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java @@ -23,11 +23,11 @@ class TelephonyIcons { //GSM/UMTS static final int[][] TELEPHONY_SIGNAL_STRENGTH = { - { R.drawable.stat_sys_signal_0_fully, - R.drawable.stat_sys_signal_1_fully, - R.drawable.stat_sys_signal_2_fully, - R.drawable.stat_sys_signal_3_fully, - R.drawable.stat_sys_signal_4_fully }, + { R.drawable.stat_sys_signal_0, + R.drawable.stat_sys_signal_1, + R.drawable.stat_sys_signal_2, + R.drawable.stat_sys_signal_3, + R.drawable.stat_sys_signal_4 }, { R.drawable.stat_sys_signal_0_fully, R.drawable.stat_sys_signal_1_fully, R.drawable.stat_sys_signal_2_fully, @@ -49,11 +49,11 @@ class TelephonyIcons { }; static final int[][] TELEPHONY_SIGNAL_STRENGTH_ROAMING = { - { R.drawable.stat_sys_signal_0_fully, - R.drawable.stat_sys_signal_1_fully, - R.drawable.stat_sys_signal_2_fully, - R.drawable.stat_sys_signal_3_fully, - R.drawable.stat_sys_signal_4_fully }, + { R.drawable.stat_sys_signal_0, + R.drawable.stat_sys_signal_1, + R.drawable.stat_sys_signal_2, + R.drawable.stat_sys_signal_3, + R.drawable.stat_sys_signal_4 }, { R.drawable.stat_sys_signal_0_fully, R.drawable.stat_sys_signal_1_fully, R.drawable.stat_sys_signal_2_fully, @@ -63,7 +63,7 @@ class TelephonyIcons { static final int[] QS_DATA_R = { R.drawable.ic_qs_signal_r, - R.drawable.ic_qs_signal_full_r + R.drawable.ic_qs_signal_r }; static final int[][] DATA_SIGNAL_STRENGTH = TELEPHONY_SIGNAL_STRENGTH; @@ -84,7 +84,7 @@ class TelephonyIcons { static final int[] QS_DATA_G = { R.drawable.ic_qs_signal_g, - R.drawable.ic_qs_signal_full_g + R.drawable.ic_qs_signal_g }; static final int[][] DATA_3G = { @@ -100,7 +100,7 @@ class TelephonyIcons { static final int[] QS_DATA_3G = { R.drawable.ic_qs_signal_3g, - R.drawable.ic_qs_signal_full_3g + R.drawable.ic_qs_signal_3g }; static final int[][] DATA_E = { @@ -116,7 +116,7 @@ class TelephonyIcons { static final int[] QS_DATA_E = { R.drawable.ic_qs_signal_e, - R.drawable.ic_qs_signal_full_e + R.drawable.ic_qs_signal_e }; //3.5G @@ -133,7 +133,7 @@ class TelephonyIcons { static final int[] QS_DATA_H = { R.drawable.ic_qs_signal_h, - R.drawable.ic_qs_signal_full_h + R.drawable.ic_qs_signal_h }; //CDMA @@ -151,7 +151,7 @@ class TelephonyIcons { static final int[] QS_DATA_1X = { R.drawable.ic_qs_signal_1x, - R.drawable.ic_qs_signal_full_1x + R.drawable.ic_qs_signal_1x }; // LTE and eHRPD @@ -168,7 +168,7 @@ class TelephonyIcons { static final int[] QS_DATA_4G = { R.drawable.ic_qs_signal_4g, - R.drawable.ic_qs_signal_full_4g + R.drawable.ic_qs_signal_4g }; // LTE branded "LTE" @@ -185,7 +185,7 @@ class TelephonyIcons { static final int[] QS_DATA_LTE = { R.drawable.ic_qs_signal_lte, - R.drawable.ic_qs_signal_full_lte + R.drawable.ic_qs_signal_lte }; } 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 57ddf7a..49af979 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java @@ -21,11 +21,11 @@ import com.android.systemui.R; class WifiIcons { static final int[][] WIFI_SIGNAL_STRENGTH = { { R.drawable.stat_sys_wifi_signal_0, - R.drawable.stat_sys_wifi_signal_1_fully, - R.drawable.stat_sys_wifi_signal_2_fully, - R.drawable.stat_sys_wifi_signal_3_fully, - R.drawable.stat_sys_wifi_signal_4_fully }, - { R.drawable.stat_sys_wifi_signal_0, + R.drawable.stat_sys_wifi_signal_1, + R.drawable.stat_sys_wifi_signal_2, + R.drawable.stat_sys_wifi_signal_3, + R.drawable.stat_sys_wifi_signal_4 }, + { R.drawable.stat_sys_wifi_signal_0_fully, R.drawable.stat_sys_wifi_signal_1_fully, R.drawable.stat_sys_wifi_signal_2_fully, R.drawable.stat_sys_wifi_signal_3_fully, @@ -38,7 +38,7 @@ class WifiIcons { R.drawable.ic_qs_wifi_2, R.drawable.ic_qs_wifi_3, R.drawable.ic_qs_wifi_4 }, - { R.drawable.ic_qs_wifi_0, + { R.drawable.ic_qs_wifi_full_0, R.drawable.ic_qs_wifi_full_1, R.drawable.ic_qs_wifi_full_2, R.drawable.ic_qs_wifi_full_3, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java index 99d3a01..2709384 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java @@ -31,6 +31,7 @@ public class AnimationFilter { boolean animateDimmed; boolean animateDark; boolean hasDelays; + boolean hasGoToFullShadeEvent; public AnimationFilter animateAlpha() { animateAlpha = true; @@ -87,6 +88,10 @@ public class AnimationFilter { int size = events.size(); for (int i = 0; i < size; i++) { combineFilter(events.get(i).filter); + if (events.get(i).animationType == + NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_GO_TO_FULL_SHADE) { + hasGoToFullShadeEvent = true; + } } } @@ -112,5 +117,6 @@ public class AnimationFilter { animateDimmed = false; animateDark = false; hasDelays = false; + hasGoToFullShadeEvent = false; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index e0167e9..aa41b9c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -133,6 +133,7 @@ public class NotificationStackScrollLayout extends ViewGroup private boolean mDimmedNeedsAnimation; private boolean mDarkNeedsAnimation; private boolean mActivateNeedsAnimation; + private boolean mGoToFullShadeNeedsAnimation; private boolean mIsExpanded = true; private boolean mChildrenUpdateRequested; private SpeedBumpView mSpeedBumpView; @@ -1214,6 +1215,9 @@ public class NotificationStackScrollLayout extends ViewGroup count++; } } + if (mDismissView.willBeGone()) { + count--; + } return count; } @@ -1573,6 +1577,7 @@ public class NotificationStackScrollLayout extends ViewGroup generateActivateEvent(); generateDimmedEvent(); generateDarkEvent(); + generateGoToFullShadeEvent(); mNeedsAnimation = false; } @@ -1656,6 +1661,14 @@ public class NotificationStackScrollLayout extends ViewGroup mDarkNeedsAnimation = false; } + private void generateGoToFullShadeEvent() { + if (mGoToFullShadeNeedsAnimation) { + mAnimationEvents.add( + new AnimationEvent(null, AnimationEvent.ANIMATION_TYPE_GO_TO_FULL_SHADE)); + } + mGoToFullShadeNeedsAnimation = false; + } + private boolean onInterceptTouchEventScroll(MotionEvent ev) { if (!isScrollingEnabled()) { return false; @@ -1919,11 +1932,8 @@ public class NotificationStackScrollLayout extends ViewGroup if (visible) { // Make invisible to ensure that the appear animation is played. mSpeedBumpView.setInvisible(); - if (!mIsExpansionChanging) { - generateAddAnimation(mSpeedBumpView); - } } else { - mSpeedBumpView.performVisibilityAnimation(false); + // TODO: This doesn't really work, because the view is already set to GONE above. generateRemoveAnimation(mSpeedBumpView); } } @@ -1932,6 +1942,9 @@ public class NotificationStackScrollLayout extends ViewGroup public void goToFullShade() { updateSpeedBump(true /* visibility */); mDismissView.setInvisible(); + mGoToFullShadeNeedsAnimation = true; + mNeedsAnimation = true; + requestChildrenUpdate(); } public void cancelExpandHelper() { @@ -2128,6 +2141,16 @@ public class NotificationStackScrollLayout extends ViewGroup // ANIMATION_TYPE_DARK new AnimationFilter() .animateDark(), + + // ANIMATION_TYPE_GO_TO_FULL_SHADE + new AnimationFilter() + .animateAlpha() + .animateHeight() + .animateTopInset() + .animateY() + .animateDimmed() + .animateScale() + .animateZ(), }; static int[] LENGTHS = new int[] { @@ -2161,6 +2184,9 @@ public class NotificationStackScrollLayout extends ViewGroup // ANIMATION_TYPE_DARK StackStateAnimator.ANIMATION_DURATION_STANDARD, + + // ANIMATION_TYPE_GO_TO_FULL_SHADE + StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE, }; static final int ANIMATION_TYPE_ADD = 0; @@ -2173,6 +2199,7 @@ public class NotificationStackScrollLayout extends ViewGroup static final int ANIMATION_TYPE_DIMMED = 7; static final int ANIMATION_TYPE_CHANGE_POSITION = 8; static final int ANIMATION_TYPE_DARK = 9; + static final int ANIMATION_TYPE_GO_TO_FULL_SHADE = 10; final long eventStartTime; final View changingView; @@ -2193,13 +2220,18 @@ public class NotificationStackScrollLayout extends ViewGroup * Combines the length of several animation events into a single value. * * @param events The events of the lengths to combine. - * @return The combined length. This is just the maximum of all length. + * @return The combined length. Depending on the event types, this might be the maximum of + * all events or the length of a specific event. */ static long combineLength(ArrayList<AnimationEvent> events) { long length = 0; int size = events.size(); for (int i = 0; i < size; i++) { - length = Math.max(length, events.get(i).length); + AnimationEvent event = events.get(i); + length = Math.max(length, event.length); + if (event.animationType == ANIMATION_TYPE_GO_TO_FULL_SHADE) { + return event.length; + } } return length; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java index 7b90a351..d0064c8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java @@ -171,8 +171,7 @@ public class StackScrollState { updateChildClip(child, newHeight, state.topOverLap); if(child instanceof SpeedBumpView) { - float lineEnd = newYTranslation + newHeight / 2; - performSpeedBumpAnimation(i, (SpeedBumpView) child, lineEnd); + performSpeedBumpAnimation(i, (SpeedBumpView) child, state, 0); } else if (child instanceof DismissView) { DismissView dismissView = (DismissView) child; boolean visible = state.topOverLap < mClearAllTopPadding; @@ -197,12 +196,14 @@ public class StackScrollState { child.setClipBounds(mClipRect); } - private void performSpeedBumpAnimation(int i, SpeedBumpView speedBump, float speedBumpEnd) { + public void performSpeedBumpAnimation(int i, SpeedBumpView speedBump, ViewState state, + long delay) { View nextChild = getNextChildNotGone(i); if (nextChild != null) { + float lineEnd = state.yTranslation + state.height / 2; ViewState nextState = getViewStateForView(nextChild); - boolean startIsAboveNext = nextState.yTranslation > speedBumpEnd; - speedBump.animateDivider(startIsAboveNext, null /* onFinishedRunnable */); + boolean startIsAboveNext = nextState.yTranslation > lineEnd; + speedBump.animateDivider(startIsAboveNext, delay, null /* onFinishedRunnable */); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java index 71524ec..edc669e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java @@ -27,6 +27,7 @@ import android.view.animation.Interpolator; import com.android.systemui.R; import com.android.systemui.statusbar.ExpandableView; +import com.android.systemui.statusbar.SpeedBumpView; import java.util.ArrayList; import java.util.HashSet; @@ -39,10 +40,12 @@ import java.util.Stack; public class StackStateAnimator { public static final int ANIMATION_DURATION_STANDARD = 360; + public static final int ANIMATION_DURATION_GO_TO_FULL_SHADE = 448; public static final int ANIMATION_DURATION_APPEAR_DISAPPEAR = 464; public static final int ANIMATION_DURATION_DIMMED_ACTIVATED = 220; public static final int ANIMATION_DELAY_PER_ELEMENT_INTERRUPTING = 80; public static final int ANIMATION_DELAY_PER_ELEMENT_MANUAL = 32; + public static final int ANIMATION_DELAY_PER_ELEMENT_GO_TO_FULL_SHADE = 48; private static final int DELAY_EFFECT_MAX_INDEX_DIFFERENCE = 2; private static final int TAG_ANIMATOR_TRANSLATION_Y = R.id.translation_y_animator_tag; @@ -65,16 +68,19 @@ public class StackStateAnimator { private static final int TAG_START_TOP_INSET = R.id.top_inset_animator_start_value_tag; private final Interpolator mFastOutSlowInInterpolator; + private final int mGoToFullShadeAppearingTranslation; public NotificationStackScrollLayout mHostLayout; private ArrayList<NotificationStackScrollLayout.AnimationEvent> mNewEvents = new ArrayList<>(); private ArrayList<View> mNewAddChildren = new ArrayList<>(); - private Set<Animator> mAnimatorSet = new HashSet<Animator>(); - private Stack<AnimatorListenerAdapter> mAnimationListenerPool - = new Stack<AnimatorListenerAdapter>(); + private Set<Animator> mAnimatorSet = new HashSet<>(); + private Stack<AnimatorListenerAdapter> mAnimationListenerPool = new Stack<>(); private AnimationFilter mAnimationFilter = new AnimationFilter(); private long mCurrentLength; + /** The current index for the last child which was not added in this event set. */ + private int mCurrentLastNotAddedIndex; + private ValueAnimator mTopOverScrollAnimator; private ValueAnimator mBottomOverScrollAnimator; @@ -82,6 +88,9 @@ public class StackStateAnimator { mHostLayout = hostLayout; mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(hostLayout.getContext(), android.R.interpolator.fast_out_slow_in); + mGoToFullShadeAppearingTranslation = + hostLayout.getContext().getResources().getDimensionPixelSize( + R.dimen.go_to_full_shade_appearing_translation); } public boolean isRunning() { @@ -97,6 +106,7 @@ public class StackStateAnimator { int childCount = mHostLayout.getChildCount(); mAnimationFilter.applyCombination(mNewEvents); mCurrentLength = NotificationStackScrollLayout.AnimationEvent.combineLength(mNewEvents); + mCurrentLastNotAddedIndex = findLastNotAddedIndex(finalState); for (int i = 0; i < childCount; i++) { final ExpandableView child = (ExpandableView) mHostLayout.getChildAt(i); @@ -106,7 +116,7 @@ public class StackStateAnimator { } child.setClipBounds(null); - startAnimations(child, viewState, finalState); + startAnimations(child, viewState, finalState, i); } if (!isRunning()) { // no child has preformed any animation, lets finish @@ -116,11 +126,27 @@ public class StackStateAnimator { mNewAddChildren.clear(); } + private int findLastNotAddedIndex(StackScrollState finalState) { + int childCount = mHostLayout.getChildCount(); + for (int i = childCount - 1; i >= 0; i--) { + final ExpandableView child = (ExpandableView) mHostLayout.getChildAt(i); + + StackScrollState.ViewState viewState = finalState.getViewStateForView(child); + if (viewState == null || child.getVisibility() == View.GONE) { + continue; + } + if (!mNewAddChildren.contains(child)) { + return viewState.notGoneIndex; + } + } + return -1; + } + /** * Start an animation to the given viewState */ private void startAnimations(final ExpandableView child, StackScrollState.ViewState viewState, - StackScrollState finalState) { + StackScrollState finalState, int i) { int childVisibility = child.getVisibility(); boolean wasVisible = childVisibility == View.VISIBLE; final float alpha = viewState.alpha; @@ -139,38 +165,48 @@ public class StackStateAnimator { boolean isDelayRelevant = yTranslationChanging || zTranslationChanging || scaleChanging || alphaChanging || heightChanging || topInsetChanging; long delay = 0; + long duration = mCurrentLength; if (hasDelays && isDelayRelevant || wasAdded) { delay = calculateChildAnimationDelay(viewState, finalState); } + if (wasAdded && mAnimationFilter.hasGoToFullShadeEvent) { + child.setTranslationY(child.getTranslationY() + mGoToFullShadeAppearingTranslation); + yTranslationChanging = true; + float longerDurationFactor = viewState.notGoneIndex - mCurrentLastNotAddedIndex; + longerDurationFactor = (float) Math.pow(longerDurationFactor, 0.7f); + duration = ANIMATION_DURATION_APPEAR_DISAPPEAR + 50 + + (long) (100 * longerDurationFactor); + } + // start translationY animation if (yTranslationChanging) { - startYTranslationAnimation(child, viewState, delay); + startYTranslationAnimation(child, viewState, duration, delay); } // start translationZ animation if (zTranslationChanging) { - startZTranslationAnimation(child, viewState, delay); + startZTranslationAnimation(child, viewState, duration, delay); } // start scale animation if (scaleChanging) { - startScaleAnimation(child, viewState); + startScaleAnimation(child, viewState, duration); } // start alpha animation if (alphaChanging && child.getTranslationX() == 0) { - startAlphaAnimation(child, viewState, delay); + startAlphaAnimation(child, viewState, duration, delay); } // start height animation if (heightChanging) { - startHeightAnimation(child, viewState, delay); + startHeightAnimation(child, viewState, duration, delay); } // start top inset animation if (topInsetChanging) { - startInsetAnimation(child, viewState, delay); + startInsetAnimation(child, viewState, duration, delay); } // start dimmed animation @@ -186,12 +222,19 @@ public class StackStateAnimator { child.setScrimAmount(viewState.scrimAmount); if (wasAdded) { - child.performAddAnimation(delay); + child.performAddAnimation(delay, mCurrentLength); + } + if (child instanceof SpeedBumpView) { + finalState.performSpeedBumpAnimation(i, (SpeedBumpView) child, viewState, + delay + duration); } } private long calculateChildAnimationDelay(StackScrollState.ViewState viewState, StackScrollState finalState) { + if (mAnimationFilter.hasGoToFullShadeEvent) { + return calculateDelayGoToFullShade(viewState); + } long minDelay = 0; for (NotificationStackScrollLayout.AnimationEvent event : mNewEvents) { long delayPerElement = ANIMATION_DELAY_PER_ELEMENT_INTERRUPTING; @@ -236,8 +279,14 @@ public class StackStateAnimator { return minDelay; } + private long calculateDelayGoToFullShade(StackScrollState.ViewState viewState) { + float index = viewState.notGoneIndex; + index = (float) Math.pow(index, 0.7f); + return (long) (index * ANIMATION_DELAY_PER_ELEMENT_GO_TO_FULL_SHADE); + } + private void startHeightAnimation(final ExpandableView child, - StackScrollState.ViewState viewState, long delay) { + StackScrollState.ViewState viewState, long duration, long delay) { Integer previousStartValue = getChildTag(child, TAG_START_HEIGHT); Integer previousEndValue = getChildTag(child, TAG_END_HEIGHT); int newEndValue = viewState.height; @@ -274,7 +323,7 @@ public class StackStateAnimator { } }); animator.setInterpolator(mFastOutSlowInInterpolator); - long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator); + long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator); animator.setDuration(newDuration); if (delay > 0 && (previousAnimator == null || !previousAnimator.isRunning())) { animator.setStartDelay(delay); @@ -296,7 +345,7 @@ public class StackStateAnimator { } private void startInsetAnimation(final ExpandableView child, - StackScrollState.ViewState viewState, long delay) { + StackScrollState.ViewState viewState, long duration, long delay) { Integer previousStartValue = getChildTag(child, TAG_START_TOP_INSET); Integer previousEndValue = getChildTag(child, TAG_END_TOP_INSET); int newEndValue = viewState.clipTopAmount; @@ -332,7 +381,7 @@ public class StackStateAnimator { } }); animator.setInterpolator(mFastOutSlowInInterpolator); - long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator); + long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator); animator.setDuration(newDuration); if (delay > 0 && (previousAnimator == null || !previousAnimator.isRunning())) { animator.setStartDelay(delay); @@ -354,7 +403,7 @@ public class StackStateAnimator { } private void startAlphaAnimation(final ExpandableView child, - final StackScrollState.ViewState viewState, long delay) { + final StackScrollState.ViewState viewState, long duration, long delay) { Float previousStartValue = getChildTag(child,TAG_START_ALPHA); Float previousEndValue = getChildTag(child,TAG_END_ALPHA); final float newEndValue = viewState.alpha; @@ -413,7 +462,7 @@ public class StackStateAnimator { mWasCancelled = false; } }); - long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator); + long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator); animator.setDuration(newDuration); if (delay > 0 && (previousAnimator == null || !previousAnimator.isRunning())) { animator.setStartDelay(delay); @@ -433,7 +482,7 @@ public class StackStateAnimator { } private void startZTranslationAnimation(final ExpandableView child, - final StackScrollState.ViewState viewState, long delay) { + final StackScrollState.ViewState viewState, long duration, long delay) { Float previousStartValue = getChildTag(child,TAG_START_TRANSLATION_Z); Float previousEndValue = getChildTag(child,TAG_END_TRANSLATION_Z); float newEndValue = viewState.zTranslation; @@ -463,7 +512,7 @@ public class StackStateAnimator { ObjectAnimator animator = ObjectAnimator.ofFloat(child, View.TRANSLATION_Z, child.getTranslationZ(), newEndValue); animator.setInterpolator(mFastOutSlowInInterpolator); - long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator); + long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator); animator.setDuration(newDuration); if (delay > 0 && (previousAnimator == null || !previousAnimator.isRunning())) { animator.setStartDelay(delay); @@ -485,7 +534,7 @@ public class StackStateAnimator { } private void startYTranslationAnimation(final ExpandableView child, - StackScrollState.ViewState viewState, long delay) { + StackScrollState.ViewState viewState, long duration, long delay) { Float previousStartValue = getChildTag(child,TAG_START_TRANSLATION_Y); Float previousEndValue = getChildTag(child,TAG_END_TRANSLATION_Y); float newEndValue = viewState.yTranslation; @@ -516,7 +565,7 @@ public class StackStateAnimator { ObjectAnimator animator = ObjectAnimator.ofFloat(child, View.TRANSLATION_Y, child.getTranslationY(), newEndValue); animator.setInterpolator(mFastOutSlowInInterpolator); - long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator); + long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator); animator.setDuration(newDuration); if (delay > 0 && (previousAnimator == null || !previousAnimator.isRunning())) { animator.setStartDelay(delay); @@ -538,7 +587,7 @@ public class StackStateAnimator { } private void startScaleAnimation(final ExpandableView child, - StackScrollState.ViewState viewState) { + StackScrollState.ViewState viewState, long duration) { Float previousStartValue = getChildTag(child, TAG_START_SCALE); Float previousEndValue = getChildTag(child, TAG_END_SCALE); float newEndValue = viewState.scale; @@ -573,7 +622,7 @@ public class StackStateAnimator { PropertyValuesHolder.ofFloat(View.SCALE_Y, child.getScaleY(), newEndValue); ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(child, holderX, holderY); animator.setInterpolator(mFastOutSlowInInterpolator); - long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator); + long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator); animator.setDuration(newDuration); animator.addListener(getGlobalAnimationFinishedListener()); // remove the tag when the animation is finished @@ -637,11 +686,12 @@ public class StackStateAnimator { /** * Cancel the previous animator and get the duration of the new animation. * + * @param duration the new duration * @param previousAnimator the animator which was running before * @return the new duration */ - private long cancelAnimatorAndGetNewDuration(ValueAnimator previousAnimator) { - long newDuration = mCurrentLength; + private long cancelAnimatorAndGetNewDuration(long duration, ValueAnimator previousAnimator) { + long newDuration = duration; if (previousAnimator != null) { // We take either the desired length of the new animation or the remaining time of // the previous animator, whichever is longer. @@ -710,7 +760,8 @@ public class StackStateAnimator { translationDirection = Math.max(Math.min(translationDirection, 1.0f),-1.0f); } - changingView.performRemoveAnimation(translationDirection, new Runnable() { + changingView.performRemoveAnimation(ANIMATION_DURATION_APPEAR_DISAPPEAR, + translationDirection, new Runnable() { @Override public void run() { // remove the temporary overlay diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java b/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java index 149d09a..984a5f4 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java @@ -45,6 +45,7 @@ import android.provider.Settings.Global; import android.util.Log; import android.util.SparseArray; import android.view.Gravity; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -249,6 +250,8 @@ public class VolumePanel extends Handler { private final VolumePanel mVolumePanel; private final AudioManager mAudioManager; + private boolean mNewVolumeUp; + SafetyWarning(Context context, VolumePanel volumePanel, AudioManager audioManager) { super(context); mContext = context; @@ -267,6 +270,24 @@ public class VolumePanel extends Handler { } @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && event.getRepeatCount() == 0) { + mNewVolumeUp = true; + } + return super.onKeyDown(keyCode, event); + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && mNewVolumeUp) { + if (LOGD) Log.d(TAG, "Confirmed warning via VOLUME_UP"); + mAudioManager.disableSafeMediaVolume(); + dismiss(); + } + return super.onKeyUp(keyCode, event); + } + + @Override public void onClick(DialogInterface dialog, int which) { mAudioManager.disableSafeMediaVolume(); } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index fdc91a4..ff3cd9d 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -50,7 +50,6 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.media.AudioManager; import android.media.session.MediaController; -import android.media.session.MediaSession; import android.media.session.MediaSessionLegacyHelper; import android.net.Uri; import android.os.Bundle; @@ -63,6 +62,7 @@ import android.transition.Scene; import android.transition.Transition; import android.transition.TransitionInflater; import android.transition.TransitionManager; +import android.transition.TransitionSet; import android.util.AndroidRuntimeException; import android.util.DisplayMetrics; import android.util.EventLog; @@ -126,6 +126,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { (1 << FEATURE_CONTENT_TRANSITIONS) | (1 << FEATURE_ACTION_MODE_OVERLAY); + private static final Transition USE_DEFAULT_TRANSITION = new TransitionSet(); + /** * Simple callback used by the context menu and its submenus. The options * menu submenus do not use this (their behavior is more complex). @@ -254,10 +256,14 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } }; - private Transition mEnterTransition; - private Transition mExitTransition; - private Transition mSharedElementEnterTransition; - private Transition mSharedElementExitTransition; + private Transition mEnterTransition = null; + private Transition mReturnTransition = USE_DEFAULT_TRANSITION; + private Transition mExitTransition = null; + private Transition mReenterTransition = USE_DEFAULT_TRANSITION; + private Transition mSharedElementEnterTransition = null; + private Transition mSharedElementReturnTransition = USE_DEFAULT_TRANSITION; + private Transition mSharedElementExitTransition = null; + private Transition mSharedElementReenterTransition = USE_DEFAULT_TRANSITION; private Boolean mAllowExitTransitionOverlap; private Boolean mAllowEnterTransitionOverlap; private long mBackgroundFadeDurationMillis = -1; @@ -3513,40 +3519,47 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } } - mEnterTransition = getTransition(mEnterTransition, + mEnterTransition = getTransition(mEnterTransition, null, R.styleable.Window_windowEnterTransition); - mExitTransition = getTransition(mExitTransition, + mReturnTransition = getTransition(mReturnTransition, USE_DEFAULT_TRANSITION, + R.styleable.Window_windowReturnTransition); + mExitTransition = getTransition(mExitTransition, null, R.styleable.Window_windowExitTransition); - mSharedElementEnterTransition = getTransition(mSharedElementEnterTransition, + mReenterTransition = getTransition(mReenterTransition, USE_DEFAULT_TRANSITION, + R.styleable.Window_windowReenterTransition); + mSharedElementEnterTransition = getTransition(mSharedElementEnterTransition, null, R.styleable.Window_windowSharedElementEnterTransition); - mSharedElementExitTransition = getTransition(mSharedElementExitTransition, + mSharedElementReturnTransition = getTransition(mSharedElementReturnTransition, + USE_DEFAULT_TRANSITION, + R.styleable.Window_windowSharedElementReturnTransition); + mSharedElementExitTransition = getTransition(mSharedElementExitTransition, null, R.styleable.Window_windowSharedElementExitTransition); + mSharedElementReenterTransition = getTransition(mSharedElementReenterTransition, + USE_DEFAULT_TRANSITION, + R.styleable.Window_windowSharedElementReenterTransition); if (mAllowEnterTransitionOverlap == null) { mAllowEnterTransitionOverlap = getWindowStyle().getBoolean( - R.styleable. - Window_windowAllowEnterTransitionOverlap, true); + R.styleable.Window_windowAllowEnterTransitionOverlap, true); } if (mAllowExitTransitionOverlap == null) { mAllowExitTransitionOverlap = getWindowStyle().getBoolean( - R.styleable. - Window_windowAllowExitTransitionOverlap, true); + R.styleable.Window_windowAllowExitTransitionOverlap, true); } if (mBackgroundFadeDurationMillis < 0) { mBackgroundFadeDurationMillis = getWindowStyle().getInteger( - R.styleable. - Window_windowTransitionBackgroundFadeDuration, + R.styleable.Window_windowTransitionBackgroundFadeDuration, DEFAULT_BACKGROUND_FADE_DURATION_MS); } } } } - private Transition getTransition(Transition currentValue, int id) { - if (currentValue != null) { + private Transition getTransition(Transition currentValue, Transition defaultValue, int id) { + if (currentValue != defaultValue) { return currentValue; } int transitionId = getWindowStyle().getResourceId(id, -1); - Transition transition = null; + Transition transition = defaultValue; if (transitionId != -1 && transitionId != R.transition.no_transition) { TransitionInflater inflater = TransitionInflater.from(getContext()); transition = inflater.inflateTransition(transitionId); @@ -3899,41 +3912,85 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } @Override + public void setReturnTransition(Transition transition) { + mReturnTransition = transition; + } + + @Override public void setExitTransition(Transition exitTransition) { mExitTransition = exitTransition; } @Override + public void setReenterTransition(Transition transition) { + mReenterTransition = transition; + } + + @Override public void setSharedElementEnterTransition(Transition sharedElementEnterTransition) { mSharedElementEnterTransition = sharedElementEnterTransition; } @Override + public void setSharedElementReturnTransition(Transition transition) { + mSharedElementReturnTransition = transition; + } + + @Override public void setSharedElementExitTransition(Transition sharedElementExitTransition) { mSharedElementExitTransition = sharedElementExitTransition; } @Override + public void setSharedElementReenterTransition(Transition transition) { + mSharedElementReenterTransition = transition; + } + + @Override public Transition getEnterTransition() { return mEnterTransition; } @Override + public Transition getReturnTransition() { + return mReturnTransition == USE_DEFAULT_TRANSITION ? getEnterTransition() + : mReturnTransition; + } + + @Override public Transition getExitTransition() { return mExitTransition; } @Override + public Transition getReenterTransition() { + return mReenterTransition == USE_DEFAULT_TRANSITION ? getExitTransition() + : mReenterTransition; + } + + @Override public Transition getSharedElementEnterTransition() { return mSharedElementEnterTransition; } @Override + public Transition getSharedElementReturnTransition() { + return mSharedElementReturnTransition == USE_DEFAULT_TRANSITION + ? getSharedElementEnterTransition() : mSharedElementReturnTransition; + } + + @Override public Transition getSharedElementExitTransition() { return mSharedElementExitTransition; } @Override + public Transition getSharedElementReenterTransition() { + return mSharedElementReenterTransition == USE_DEFAULT_TRANSITION + ? getSharedElementExitTransition() : mSharedElementReenterTransition; + } + + @Override public void setAllowEnterTransitionOverlap(boolean allow) { mAllowEnterTransitionOverlap = allow; } diff --git a/services/core/java/com/android/server/MmsServiceBroker.java b/services/core/java/com/android/server/MmsServiceBroker.java index 2fad73e..898b6f1 100644 --- a/services/core/java/com/android/server/MmsServiceBroker.java +++ b/services/core/java/com/android/server/MmsServiceBroker.java @@ -49,6 +49,11 @@ public class MmsServiceBroker extends SystemService { private static final int MSG_TRY_CONNECTING = 1; + private static final Uri FAKE_SMS_SENT_URI = Uri.parse("content://sms/sent/0"); + private static final Uri FAKE_MMS_SENT_URI = Uri.parse("content://mms/sent/0"); + private static final Uri FAKE_SMS_DRAFT_URI = Uri.parse("content://sms/draft/0"); + private static final Uri FAKE_MMS_DRAFT_URI = Uri.parse("content://mms/draft/0"); + private Context mContext; // The actual MMS service instance to invoke private volatile IMms mService; @@ -275,7 +280,9 @@ public class MmsServiceBroker extends SystemService { mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Import SMS message"); if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(), callingPkg) != AppOpsManager.MODE_ALLOWED) { - return null; + // Silently fail AppOps failure due to not being the default SMS app + // while writing the TelephonyProvider + return FAKE_SMS_SENT_URI; } return getServiceGuarded().importTextMessage( callingPkg, address, type, text, timestampMillis, seen, read); @@ -287,7 +294,9 @@ public class MmsServiceBroker extends SystemService { mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Import MMS message"); if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(), callingPkg) != AppOpsManager.MODE_ALLOWED) { - return null; + // Silently fail AppOps failure due to not being the default SMS app + // while writing the TelephonyProvider + return FAKE_MMS_SENT_URI; } return getServiceGuarded().importMultimediaMessage( callingPkg, pdu, messageId, timestampSecs, seen, read); @@ -340,7 +349,9 @@ public class MmsServiceBroker extends SystemService { mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Add SMS draft"); if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(), callingPkg) != AppOpsManager.MODE_ALLOWED) { - return null; + // Silently fail AppOps failure due to not being the default SMS app + // while writing the TelephonyProvider + return FAKE_SMS_DRAFT_URI; } return getServiceGuarded().addTextMessageDraft(callingPkg, address, text); } @@ -350,7 +361,9 @@ public class MmsServiceBroker extends SystemService { mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Add MMS draft"); if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(), callingPkg) != AppOpsManager.MODE_ALLOWED) { - return null; + // Silently fail AppOps failure due to not being the default SMS app + // while writing the TelephonyProvider + return FAKE_MMS_DRAFT_URI; } return getServiceGuarded().addMultimediaMessageDraft(callingPkg, pdu); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 9a58c56..0ad36fc 100755 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -1206,9 +1206,13 @@ public final class ActivityManagerService extends ActivityManagerNative } return; } - if (!showBackground && UserHandle.getAppId(proc.uid) - >= Process.FIRST_APPLICATION_UID && proc.userId != mCurrentUserId - && proc.pid != MY_PID) { + boolean isBackground = (UserHandle.getAppId(proc.uid) + >= Process.FIRST_APPLICATION_UID + && proc.pid != MY_PID); + for (int userId : mCurrentProfileIds) { + isBackground &= (proc.userId != userId); + } + if (isBackground && !showBackground) { Slog.w(TAG, "Skipping crash dialog of " + proc + ": background"); if (res != null) { res.set(0); @@ -2030,7 +2034,7 @@ public final class ActivityManagerService extends ActivityManagerNative mSystemThread.installSystemApplicationInfo(info); synchronized (this) { - ProcessRecord app = newProcessRecordLocked(info, info.processName, false); + ProcessRecord app = newProcessRecordLocked(info, info.processName, false, 0); app.persistent = true; app.pid = MY_PID; app.maxAdj = ProcessList.SYSTEM_ADJ; @@ -2830,10 +2834,45 @@ public final class ActivityManagerService extends ActivityManagerNative || transit == AppTransition.TRANSIT_TASK_TO_FRONT; } + int startIsolatedProcess(String entryPoint, String[] entryPointArgs, + String processName, String abiOverride, int uid, Runnable crashHandler) { + synchronized(this) { + ApplicationInfo info = new ApplicationInfo(); + // In general the ApplicationInfo.uid isn't neccesarily equal to ProcessRecord.uid. + // For isolated processes, the former contains the parent's uid and the latter the + // actual uid of the isolated process. + // In the special case introduced by this method (which is, starting an isolated + // process directly from the SystemServer without an actual parent app process) the + // closest thing to a parent's uid is SYSTEM_UID. + // The only important thing here is to keep AI.uid != PR.uid, in order to trigger + // the |isolated| logic in the ProcessRecord constructor. + info.uid = Process.SYSTEM_UID; + info.processName = processName; + info.className = entryPoint; + info.packageName = "android"; + ProcessRecord proc = startProcessLocked(processName, info /* info */, + false /* knownToBeDead */, 0 /* intentFlags */, "" /* hostingType */, + null /* hostingName */, true /* allowWhileBooting */, true /* isolated */, + uid, true /* keepIfLarge */, abiOverride, entryPoint, entryPointArgs, + crashHandler); + return proc != null ? proc.pid : 0; + } + } + final ProcessRecord startProcessLocked(String processName, ApplicationInfo info, boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName, boolean allowWhileBooting, boolean isolated, boolean keepIfLarge) { + return startProcessLocked(processName, info, knownToBeDead, intentFlags, hostingType, + hostingName, allowWhileBooting, isolated, 0 /* isolatedUid */, keepIfLarge, + null /* ABI override */, null /* entryPoint */, null /* entryPointArgs */, + null /* crashHandler */); + } + + final ProcessRecord startProcessLocked(String processName, ApplicationInfo info, + boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName, + boolean allowWhileBooting, boolean isolated, int isolatedUid, boolean keepIfLarge, + String abiOverride, String entryPoint, String[] entryPointArgs, Runnable crashHandler) { ProcessRecord app; if (!isolated) { app = getProcessRecordLocked(processName, info.uid, keepIfLarge); @@ -2901,7 +2940,8 @@ public final class ActivityManagerService extends ActivityManagerNative } if (app == null) { - app = newProcessRecordLocked(info, processName, isolated); + app = newProcessRecordLocked(info, processName, isolated, isolatedUid); + app.crashHandler = crashHandler; if (app == null) { Slog.w(TAG, "Failed making new process record for " + processName + "/" + info.uid + " isolated=" + isolated); @@ -2928,7 +2968,8 @@ public final class ActivityManagerService extends ActivityManagerNative return app; } - startProcessLocked(app, hostingType, hostingNameStr, null /* ABI override */); + startProcessLocked( + app, hostingType, hostingNameStr, abiOverride, entryPoint, entryPointArgs); return (app.pid != 0) ? app : null; } @@ -2937,7 +2978,13 @@ public final class ActivityManagerService extends ActivityManagerNative } private final void startProcessLocked(ProcessRecord app, - String hostingType, String hostingNameStr, String abiOverride) { + String hostingType, String hostingNameStr) { + startProcessLocked(app, hostingType, hostingNameStr, null /* abiOverride */, + null /* entryPoint */, null /* entryPointArgs */); + } + + private final void startProcessLocked(ProcessRecord app, String hostingType, + String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) { if (app.pid > 0 && app.pid != MY_PID) { synchronized (mPidsSelfLocked) { mPidsSelfLocked.remove(app.pid); @@ -3030,9 +3077,11 @@ public final class ActivityManagerService extends ActivityManagerNative // Start the process. It will either succeed and return a result containing // the PID of the new process, or else throw a RuntimeException. - Process.ProcessStartResult startResult = Process.start("android.app.ActivityThread", + boolean isActivityProcess = (entryPoint == null); + if (entryPoint == null) entryPoint = "android.app.ActivityThread"; + Process.ProcessStartResult startResult = Process.start(entryPoint, app.processName, uid, uid, gids, debugFlags, mountExternal, - app.info.targetSdkVersion, app.info.seinfo, requiredAbi, null); + app.info.targetSdkVersion, app.info.seinfo, requiredAbi, entryPointArgs); if (app.isolated) { mBatteryStatsService.addIsolatedUid(app.uid, app.info.uid); @@ -3052,6 +3101,11 @@ public final class ActivityManagerService extends ActivityManagerNative buf.setLength(0); buf.append("Start proc "); buf.append(app.processName); + if (!isActivityProcess) { + buf.append(" ["); + buf.append(entryPoint); + buf.append("]"); + } buf.append(" for "); buf.append(hostingType); if (hostingNameStr != null) { @@ -3082,10 +3136,12 @@ public final class ActivityManagerService extends ActivityManagerNative app.killedByAm = false; synchronized (mPidsSelfLocked) { this.mPidsSelfLocked.put(startResult.pid, app); - Message msg = mHandler.obtainMessage(PROC_START_TIMEOUT_MSG); - msg.obj = app; - mHandler.sendMessageDelayed(msg, startResult.usingWrapper - ? PROC_START_TIMEOUT_WITH_WRAPPER : PROC_START_TIMEOUT); + if (isActivityProcess) { + Message msg = mHandler.obtainMessage(PROC_START_TIMEOUT_MSG); + msg.obj = app; + mHandler.sendMessageDelayed(msg, startResult.usingWrapper + ? PROC_START_TIMEOUT_WITH_WRAPPER : PROC_START_TIMEOUT); + } } } catch (RuntimeException e) { // XXX do better error recovery. @@ -5355,7 +5411,7 @@ public final class ActivityManagerService extends ActivityManagerNative app.deathRecipient = adr; } catch (RemoteException e) { app.resetPackageList(mProcessStats); - startProcessLocked(app, "link fail", processName, null /* ABI override */); + startProcessLocked(app, "link fail", processName); return false; } @@ -5448,7 +5504,7 @@ public final class ActivityManagerService extends ActivityManagerNative app.resetPackageList(mProcessStats); app.unlinkDeathRecipient(); - startProcessLocked(app, "bind fail", processName, null /* ABI override */); + startProcessLocked(app, "bind fail", processName); return false; } @@ -5603,7 +5659,7 @@ public final class ActivityManagerService extends ActivityManagerNative for (int ip=0; ip<NP; ip++) { if (DEBUG_PROCESSES) Slog.v(TAG, "Starting process on hold: " + procs.get(ip)); - startProcessLocked(procs.get(ip), "on-hold", null, null /* ABI override */); + startProcessLocked(procs.get(ip), "on-hold", null); } } @@ -8951,29 +9007,35 @@ public final class ActivityManagerService extends ActivityManagerNative // ========================================================= final ProcessRecord newProcessRecordLocked(ApplicationInfo info, String customProcess, - boolean isolated) { + boolean isolated, int isolatedUid) { String proc = customProcess != null ? customProcess : info.processName; BatteryStatsImpl.Uid.Proc ps = null; BatteryStatsImpl stats = mBatteryStatsService.getActiveStatistics(); int uid = info.uid; if (isolated) { - int userId = UserHandle.getUserId(uid); - int stepsLeft = Process.LAST_ISOLATED_UID - Process.FIRST_ISOLATED_UID + 1; - while (true) { - if (mNextIsolatedProcessUid < Process.FIRST_ISOLATED_UID - || mNextIsolatedProcessUid > Process.LAST_ISOLATED_UID) { - mNextIsolatedProcessUid = Process.FIRST_ISOLATED_UID; - } - uid = UserHandle.getUid(userId, mNextIsolatedProcessUid); - mNextIsolatedProcessUid++; - if (mIsolatedProcesses.indexOfKey(uid) < 0) { - // No process for this uid, use it. - break; - } - stepsLeft--; - if (stepsLeft <= 0) { - return null; + if (isolatedUid == 0) { + int userId = UserHandle.getUserId(uid); + int stepsLeft = Process.LAST_ISOLATED_UID - Process.FIRST_ISOLATED_UID + 1; + while (true) { + if (mNextIsolatedProcessUid < Process.FIRST_ISOLATED_UID + || mNextIsolatedProcessUid > Process.LAST_ISOLATED_UID) { + mNextIsolatedProcessUid = Process.FIRST_ISOLATED_UID; + } + uid = UserHandle.getUid(userId, mNextIsolatedProcessUid); + mNextIsolatedProcessUid++; + if (mIsolatedProcesses.indexOfKey(uid) < 0) { + // No process for this uid, use it. + break; + } + stepsLeft--; + if (stepsLeft <= 0) { + return null; + } } + } else { + // Special case for startIsolatedProcess (internal only), where + // the uid of the isolated process is specified by the caller. + uid = isolatedUid; } } return new ProcessRecord(stats, info, proc, uid); @@ -8989,7 +9051,7 @@ public final class ActivityManagerService extends ActivityManagerNative } if (app == null) { - app = newProcessRecordLocked(info, null, isolated); + app = newProcessRecordLocked(info, null, isolated, 0); mProcessNames.put(info.processName, app.uid, app); if (isolated) { mIsolatedProcesses.put(app.uid, app); @@ -9015,8 +9077,8 @@ public final class ActivityManagerService extends ActivityManagerNative } if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) { mPersistentStartingProcesses.add(app); - startProcessLocked(app, "added application", app.processName, - abiOverride); + startProcessLocked(app, "added application", app.processName, abiOverride, + null /* entryPoint */, null /* entryPointArgs */); } return app; @@ -10515,6 +10577,7 @@ public final class ActivityManagerService extends ActivityManagerNative mProcessCrashTimes.put(app.info.processName, app.uid, now); } + if (app.crashHandler != null) mHandler.post(app.crashHandler); return true; } @@ -13513,7 +13576,7 @@ public final class ActivityManagerService extends ActivityManagerNative // We have components that still need to be running in the // process, so re-launch it. mProcessNames.put(app.processName, app.uid, app); - startProcessLocked(app, "restart", app.processName, null /* ABI override */); + startProcessLocked(app, "restart", app.processName); } else if (app.pid > 0 && app.pid != MY_PID) { // Goodbye! boolean removed; @@ -17845,6 +17908,13 @@ public final class ActivityManagerService extends ActivityManagerNative public void wakingUp() { ActivityManagerService.this.wakingUp(); } + + @Override + public int startIsolatedProcess(String entryPoint, String[] entryPointArgs, + String processName, String abiOverride, int uid, Runnable crashHandler) { + return ActivityManagerService.this.startIsolatedProcess(entryPoint, entryPointArgs, + processName, abiOverride, uid, crashHandler); + } } /** diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index b33f7b7..f1bcb60 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -127,7 +127,8 @@ final class ProcessRecord { Object adjSource; // Debugging: option dependent object. int adjSourceProcState; // Debugging: proc state of adjSource's process. Object adjTarget; // Debugging: target component impacting oom_adj. - + Runnable crashHandler; // Optional local handler to be invoked in the process crash. + // contains HistoryRecord objects final ArrayList<ActivityRecord> activities = new ArrayList<ActivityRecord>(); // all ServiceRecord running in this process diff --git a/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java b/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java index f3d570e..0b9094f 100644 --- a/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java +++ b/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java @@ -71,18 +71,16 @@ final class ActiveSourceHandler { tv.startNewDeviceAction(newActive); } - ActiveSource current = tv.getActiveSource(); if (!tv.isProhibitMode()) { tv.updateActiveSource(newActive); - if (!current.equals(newActive)) { - boolean notifyInputChange = (mCallback == null); - tv.updateActiveInput(newActive.physicalAddress, notifyInputChange); - } + boolean notifyInputChange = (mCallback == null); + tv.updateActiveInput(newActive.physicalAddress, notifyInputChange); invokeCallback(HdmiControlManager.RESULT_SUCCESS); } else { // TV is in a mode that should keep its current source/input from // being changed for its operation. Reclaim the active source // or switch the port back to the one used for the current mode. + ActiveSource current = tv.getActiveSource(); if (current.logicalAddress == getSourceAddress()) { HdmiCecMessage activeSourceCommand = HdmiCecMessageBuilder.buildActiveSource( current.logicalAddress, current.physicalAddress); diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java index 946d4ce..bfbaefe 100644 --- a/services/core/java/com/android/server/hdmi/Constants.java +++ b/services/core/java/com/android/server/hdmi/Constants.java @@ -178,8 +178,8 @@ final class Constants { static final int ROUTING_PATH_TOP_MASK = 0xF000; static final int ROUTING_PATH_TOP_SHIFT = 12; - static final int INVALID_PORT_ID = -1; - static final int INVALID_PHYSICAL_ADDRESS = 0xFFFF; + static final int INVALID_PORT_ID = HdmiCecDeviceInfo.PORT_INVALID; + static final int INVALID_PHYSICAL_ADDRESS = HdmiCecDeviceInfo.PATH_INVALID; // Send result codes. It should be consistent with hdmi_cec.h's send_message error code. static final int SEND_RESULT_SUCCESS = 0; diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index 9038fbc..eda7b18 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -148,6 +148,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { handleSelectInternalSource(); // Switching to internal source is always successful even when CEC control is disabled. setActiveSource(targetAddress, mService.getPhysicalAddress()); + setActivePath(mService.getPhysicalAddress()); invokeCallback(callback, HdmiControlManager.RESULT_SUCCESS); return; } @@ -237,9 +238,9 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { if (path == getActivePath()) { return; } + setPrevPortId(getActivePortId()); int portId = mService.pathToPortId(path); setActivePath(path); - setPrevPortId(portId); // TODO: Handle PAP/PIP case. // Show OSD port change banner if (notifyInputChange) { @@ -439,9 +440,10 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { if (isTailOfActivePath(path, getActivePath())) { removeAction(RoutingControlAction.class); int newPath = mService.portIdToPath(getActivePortId()); + setActivePath(newPath); mService.sendCecCommand(HdmiCecMessageBuilder.buildRoutingChange( mAddress, getActivePath(), newPath)); - addAndStartAction(new RoutingControlAction(this, getActivePortId(), false, null)); + addAndStartAction(new RoutingControlAction(this, newPath, false, null)); } } diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index bb9355e..87c90c6 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -54,6 +54,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.server.SystemService; import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; import com.android.server.hdmi.HdmiCecController.AllocateAddressCallback; +import com.android.server.hdmi.HdmiCecLocalDevice.ActiveSource; import com.android.server.hdmi.HdmiCecLocalDevice.PendingActionClearedCallback; import libcore.util.EmptyArray; @@ -720,6 +721,26 @@ public final class HdmiControlService extends SystemService { } @Override + public HdmiCecDeviceInfo getActiveSource() { + HdmiCecLocalDeviceTv tv = tv(); + if (tv == null) { + Slog.w(TAG, "Local tv device not available"); + return null; + } + ActiveSource activeSource = tv.getActiveSource(); + if (activeSource.isValid()) { + return new HdmiCecDeviceInfo(activeSource.logicalAddress, + activeSource.physicalAddress, HdmiCecDeviceInfo.PORT_INVALID, + HdmiCecDeviceInfo.DEVICE_INACTIVE, 0, ""); + } + int activePath = tv.getActivePath(); + if (activePath != HdmiCecDeviceInfo.PATH_INVALID) { + return new HdmiCecDeviceInfo(activePath, tv.getActivePortId()); + } + return null; + } + + @Override public void deviceSelect(final int logicalAddress, final IHdmiControlCallback callback) { enforceAccessPermission(); runOnServiceThread(new Runnable() { diff --git a/services/core/java/com/android/server/hdmi/RoutingControlAction.java b/services/core/java/com/android/server/hdmi/RoutingControlAction.java index f05394f..f50ae9b 100644 --- a/services/core/java/com/android/server/hdmi/RoutingControlAction.java +++ b/services/core/java/com/android/server/hdmi/RoutingControlAction.java @@ -101,12 +101,12 @@ final class RoutingControlAction extends FeatureAction { // If the routing path doesn't belong to the currently active one, we should // ignore it since it might have come from other routing change sequence. int routingPath = HdmiUtils.twoBytesToInt(params); - if (HdmiUtils.isInActiveRoutingPath(mCurrentRoutingPath, routingPath)) { + if (!HdmiUtils.isInActiveRoutingPath(mCurrentRoutingPath, routingPath)) { return true; } mCurrentRoutingPath = routingPath; // Stop possible previous routing change sequence if in progress. - removeAction(RoutingControlAction.class); + removeActionExcept(RoutingControlAction.class, this); addTimer(mState, TIMEOUT_ROUTING_INFORMATION_MS); return true; } else if (mState == STATE_WAIT_FOR_REPORT_POWER_STATUS diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 6036bcf..1650768 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -19,7 +19,22 @@ package com.android.server.pm; import static android.content.pm.PackageManager.INSTALL_ALL_USERS; import static android.content.pm.PackageManager.INSTALL_FROM_ADB; import static android.content.pm.PackageManager.INSTALL_REPLACE_EXISTING; - +import static com.android.internal.util.XmlUtils.readBitmapAttribute; +import static com.android.internal.util.XmlUtils.readBooleanAttribute; +import static com.android.internal.util.XmlUtils.readIntAttribute; +import static com.android.internal.util.XmlUtils.readLongAttribute; +import static com.android.internal.util.XmlUtils.readStringAttribute; +import static com.android.internal.util.XmlUtils.readUriAttribute; +import static com.android.internal.util.XmlUtils.writeBitmapAttribute; +import static com.android.internal.util.XmlUtils.writeBooleanAttribute; +import static com.android.internal.util.XmlUtils.writeIntAttribute; +import static com.android.internal.util.XmlUtils.writeLongAttribute; +import static com.android.internal.util.XmlUtils.writeStringAttribute; +import static com.android.internal.util.XmlUtils.writeUriAttribute; +import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; +import static org.xmlpull.v1.XmlPullParser.START_TAG; + +import android.app.ActivityManager; import android.app.AppOpsManager; import android.content.Context; import android.content.pm.IPackageDeleteObserver; @@ -29,9 +44,14 @@ import android.content.pm.IPackageInstallerSession; import android.content.pm.InstallSessionInfo; import android.content.pm.InstallSessionParams; import android.content.pm.PackageManager; +import android.graphics.Bitmap; import android.os.Binder; +import android.os.Environment; import android.os.FileUtils; +import android.os.Handler; import android.os.HandlerThread; +import android.os.Looper; +import android.os.Message; import android.os.Process; import android.os.RemoteCallbackList; import android.os.RemoteException; @@ -40,30 +60,70 @@ import android.os.UserHandle; import android.os.UserManager; import android.system.ErrnoException; import android.system.Os; +import android.text.format.DateUtils; import android.util.ArraySet; +import android.util.AtomicFile; import android.util.ExceptionUtils; +import android.util.Log; import android.util.Slog; import android.util.SparseArray; +import android.util.Xml; import com.android.internal.annotations.GuardedBy; +import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.IndentingPrintWriter; import com.android.server.IoThread; +import com.android.server.pm.PackageInstallerSession.Snapshot; import com.google.android.collect.Sets; +import libcore.io.IoUtils; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; + import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; +import java.security.SecureRandom; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Random; public class PackageInstallerService extends IPackageInstaller.Stub { private static final String TAG = "PackageInstaller"; + private static final boolean LOGD = true; - // TODO: destroy sessions with old timestamps // TODO: remove outstanding sessions when installer package goes away // TODO: notify listeners in other users when package has been installed there + /** XML constants used in {@link #mSessionsFile} */ + private static final String TAG_SESSIONS = "sessions"; + private static final String TAG_SESSION = "session"; + private static final String ATTR_SESSION_ID = "sessionId"; + private static final String ATTR_USER_ID = "userId"; + private static final String ATTR_INSTALLER_PACKAGE_NAME = "installerPackageName"; + private static final String ATTR_CREATED_MILLIS = "createdMillis"; + private static final String ATTR_SESSION_STAGE_DIR = "sessionStageDir"; + private static final String ATTR_SEALED = "sealed"; + private static final String ATTR_MODE = "mode"; + private static final String ATTR_INSTALL_FLAGS = "installFlags"; + private static final String ATTR_INSTALL_LOCATION = "installLocation"; + private static final String ATTR_SIZE_BYTES = "sizeBytes"; + private static final String ATTR_APP_PACKAGE_NAME = "appPackageName"; + private static final String ATTR_APP_ICON = "appIcon"; + private static final String ATTR_APP_LABEL = "appLabel"; + private static final String ATTR_ORIGINATING_URI = "originatingUri"; + private static final String ATTR_REFERRER_URI = "referrerUri"; + private static final String ATTR_ABI_OVERRIDE = "abiOverride"; + + private static final long MAX_AGE_MILLIS = 3 * DateUtils.DAY_IN_MILLIS; + private static final long MAX_ACTIVE_SESSIONS = 1024; + private final Context mContext; private final PackageManagerService mPm; private final AppOpsManager mAppOps; @@ -71,10 +131,21 @@ public class PackageInstallerService extends IPackageInstaller.Stub { private final File mStagingDir; private final HandlerThread mInstallThread; - private final Callback mCallback = new Callback(); + private final Callbacks mCallbacks; + + /** + * File storing persisted {@link #mSessions}. + */ + private final AtomicFile mSessionsFile; + + private final InternalCallback mInternalCallback = new InternalCallback(); + + /** + * Used for generating session IDs. Since this is created at boot time, + * normal random might be predictable. + */ + private final Random mRandom = new SecureRandom(); - @GuardedBy("mSessions") - private int mNextSessionId; @GuardedBy("mSessions") private final SparseArray<PackageInstallerSession> mSessions = new SparseArray<>(); @@ -82,8 +153,6 @@ public class PackageInstallerService extends IPackageInstaller.Stub { @GuardedBy("mSessions") private final SparseArray<PackageInstallerSession> mHistoricalSessions = new SparseArray<>(); - private RemoteCallbackList<IPackageInstallerCallback> mCallbacks = new RemoteCallbackList<>(); - private static final FilenameFilter sStageFilter = new FilenameFilter() { @Override public boolean accept(File dir, String name) { @@ -101,6 +170,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub { mInstallThread = new HandlerThread(TAG); mInstallThread.start(); + mCallbacks = new Callbacks(mInstallThread.getLooper()); + + mSessionsFile = new AtomicFile( + new File(Environment.getSystemSecureDirectory(), "install_sessions.xml")); + synchronized (mSessions) { readSessionsLocked(); @@ -133,13 +207,140 @@ public class PackageInstallerService extends IPackageInstaller.Stub { } private void readSessionsLocked() { - // TODO: implement persisting + if (LOGD) Slog.v(TAG, "readSessionsLocked()"); + mSessions.clear(); - mNextSessionId = 1; + + FileInputStream fis = null; + try { + fis = mSessionsFile.openRead(); + final XmlPullParser in = Xml.newPullParser(); + in.setInput(fis, null); + + int type; + while ((type = in.next()) != END_DOCUMENT) { + if (type == START_TAG) { + final String tag = in.getName(); + if (TAG_SESSION.equals(tag)) { + final PackageInstallerSession session = readSessionLocked(in); + final long age = System.currentTimeMillis() - session.createdMillis; + + final boolean valid; + if (age >= MAX_AGE_MILLIS) { + Slog.w(TAG, "Abandoning old session first created at " + + session.createdMillis); + valid = false; + } else if (!session.sessionStageDir.exists()) { + Slog.w(TAG, "Abandoning session with missing stage " + + session.sessionStageDir); + valid = false; + } else { + valid = true; + } + + if (valid) { + mSessions.put(session.sessionId, session); + } else { + // Since this is early during boot we don't send + // any observer events about the session, but we + // keep details around for dumpsys. + mHistoricalSessions.put(session.sessionId, session); + } + } + } + } + } catch (FileNotFoundException e) { + // Missing sessions are okay, probably first boot + } catch (IOException e) { + Log.wtf(TAG, "Failed reading install sessions", e); + } catch (XmlPullParserException e) { + Log.wtf(TAG, "Failed reading install sessions", e); + } finally { + IoUtils.closeQuietly(fis); + } + } + + private PackageInstallerSession readSessionLocked(XmlPullParser in) throws IOException { + final int sessionId = readIntAttribute(in, ATTR_SESSION_ID); + final int userId = readIntAttribute(in, ATTR_USER_ID); + final String installerPackageName = readStringAttribute(in, ATTR_INSTALLER_PACKAGE_NAME); + final long createdMillis = readLongAttribute(in, ATTR_CREATED_MILLIS); + final File sessionStageDir = new File(readStringAttribute(in, ATTR_SESSION_STAGE_DIR)); + final boolean sealed = readBooleanAttribute(in, ATTR_SEALED); + + final InstallSessionParams params = new InstallSessionParams( + InstallSessionParams.MODE_INVALID); + params.mode = readIntAttribute(in, ATTR_MODE); + params.installFlags = readIntAttribute(in, ATTR_INSTALL_FLAGS); + params.installLocation = readIntAttribute(in, ATTR_INSTALL_LOCATION); + params.sizeBytes = readLongAttribute(in, ATTR_SIZE_BYTES); + params.appPackageName = readStringAttribute(in, ATTR_APP_PACKAGE_NAME); + params.appIcon = readBitmapAttribute(in, ATTR_APP_ICON); + params.appLabel = readStringAttribute(in, ATTR_APP_LABEL); + params.originatingUri = readUriAttribute(in, ATTR_ORIGINATING_URI); + params.referrerUri = readUriAttribute(in, ATTR_REFERRER_URI); + params.abiOverride = readStringAttribute(in, ATTR_ABI_OVERRIDE); + + return new PackageInstallerSession(mInternalCallback, mPm, mInstallThread.getLooper(), + sessionId, userId, installerPackageName, params, createdMillis, sessionStageDir, + sealed); } private void writeSessionsLocked() { - // TODO: implement persisting + if (LOGD) Slog.v(TAG, "writeSessionsLocked()"); + + FileOutputStream fos = null; + try { + fos = mSessionsFile.startWrite(); + + XmlSerializer out = new FastXmlSerializer(); + out.setOutput(fos, "utf-8"); + out.startDocument(null, true); + out.startTag(null, TAG_SESSIONS); + final int size = mSessions.size(); + for (int i = 0; i < size; i++) { + final PackageInstallerSession session = mSessions.valueAt(i); + writeSessionLocked(out, session); + } + out.endTag(null, TAG_SESSIONS); + out.endDocument(); + + mSessionsFile.finishWrite(fos); + } catch (IOException e) { + if (fos != null) { + mSessionsFile.failWrite(fos); + } + } + } + + private void writeSessionLocked(XmlSerializer out, PackageInstallerSession session) + throws IOException { + final InstallSessionParams params = session.params; + final Snapshot snapshot = session.snapshot(); + + out.startTag(null, TAG_SESSION); + + writeIntAttribute(out, ATTR_SESSION_ID, session.sessionId); + writeIntAttribute(out, ATTR_USER_ID, session.userId); + writeStringAttribute(out, ATTR_INSTALLER_PACKAGE_NAME, + session.installerPackageName); + writeLongAttribute(out, ATTR_CREATED_MILLIS, session.createdMillis); + writeStringAttribute(out, ATTR_SESSION_STAGE_DIR, + session.sessionStageDir.getAbsolutePath()); + writeBooleanAttribute(out, ATTR_SEALED, snapshot.sealed); + + writeIntAttribute(out, ATTR_MODE, params.mode); + writeIntAttribute(out, ATTR_INSTALL_FLAGS, params.installFlags); + writeIntAttribute(out, ATTR_INSTALL_LOCATION, params.installLocation); + writeLongAttribute(out, ATTR_SIZE_BYTES, params.sizeBytes); + writeStringAttribute(out, ATTR_APP_PACKAGE_NAME, params.appPackageName); + writeBitmapAttribute(out, ATTR_APP_ICON, params.appIcon); + writeStringAttribute(out, ATTR_APP_LABEL, params.appLabel); + writeUriAttribute(out, ATTR_ORIGINATING_URI, params.originatingUri); + writeUriAttribute(out, ATTR_REFERRER_URI, params.referrerUri); + writeStringAttribute(out, ATTR_ABI_OVERRIDE, params.abiOverride); + + out.endTag(null, TAG_SESSION); } private void writeSessionsAsync() { @@ -163,8 +364,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub { throw new SecurityException("User restriction prevents installing"); } - if ((callingUid == Process.SHELL_UID) || (callingUid == 0)) { + if ((callingUid == Process.SHELL_UID) || (callingUid == Process.ROOT_UID)) { + installerPackageName = "com.android.shell"; + params.installFlags |= INSTALL_FROM_ADB; + } else { mAppOps.checkPackage(callingUid, installerPackageName); @@ -181,6 +385,18 @@ public class PackageInstallerService extends IPackageInstaller.Stub { throw new IllegalArgumentException("Params must have valid mode set"); } + // Defensively resize giant app icons + if (params.appIcon != null) { + final ActivityManager am = (ActivityManager) mContext.getSystemService( + Context.ACTIVITY_SERVICE); + final int iconSize = am.getLauncherLargeIconSize(); + if ((params.appIcon.getWidth() > iconSize * 2) + || (params.appIcon.getHeight() > iconSize * 2)) { + params.appIcon = Bitmap.createScaledBitmap(params.appIcon, iconSize, iconSize, + true); + } + } + // Sanity check that install could fit if (params.sizeBytes > 0) { try { @@ -193,18 +409,24 @@ public class PackageInstallerService extends IPackageInstaller.Stub { final int sessionId; final PackageInstallerSession session; synchronized (mSessions) { + // Sanity check that installer isn't going crazy + final int activeCount = getSessionCountLocked(callingUid); + if (activeCount >= MAX_ACTIVE_SESSIONS) { + throw new IllegalStateException("Too many active sessions for UID " + callingUid); + } + sessionId = allocateSessionIdLocked(); final long createdMillis = System.currentTimeMillis(); final File sessionStageDir = prepareSessionStageDir(sessionId); - session = new PackageInstallerSession(mCallback, mPm, sessionId, userId, - installerPackageName, callingUid, params, createdMillis, sessionStageDir, - mInstallThread.getLooper()); + session = new PackageInstallerSession(mInternalCallback, mPm, + mInstallThread.getLooper(), sessionId, userId, installerPackageName, params, + createdMillis, sessionStageDir, false); mSessions.put(sessionId, session); } - notifySessionCreated(session.generateInfo()); + mCallbacks.notifySessionCreated(session.sessionId, session.userId); writeSessionsAsync(); return sessionId; } @@ -216,25 +438,34 @@ public class PackageInstallerService extends IPackageInstaller.Stub { if (session == null) { throw new IllegalStateException("Missing session " + sessionId); } - if (Binder.getCallingUid() != session.installerUid) { + if (!isCallingUidOwner(session)) { throw new SecurityException("Caller has no access to session " + sessionId); } + if (session.openCount.getAndIncrement() == 0) { + mCallbacks.notifySessionOpened(sessionId, session.userId); + } return session; } } private int allocateSessionIdLocked() { - if (mSessions.get(mNextSessionId) != null) { - throw new IllegalStateException("Next session already allocated"); - } - return mNextSessionId++; + int n = 0; + int sessionId; + do { + sessionId = mRandom.nextInt(Integer.MAX_VALUE); + if (mSessions.get(sessionId) == null) { + return sessionId; + } + } while (n++ < 32); + + throw new IllegalStateException("Failed to allocate session ID"); } private File prepareSessionStageDir(int sessionId) { final File file = new File(mStagingDir, "vmdl" + sessionId + ".tmp"); if (file.exists()) { - throw new IllegalStateException(); + throw new IllegalStateException("Session dir already exists: " + file); } try { @@ -246,7 +477,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub { } if (!SELinux.restorecon(file)) { - throw new IllegalStateException("Failed to prepare session dir"); + throw new IllegalStateException("Failed to restorecon session dir"); } return file; @@ -256,9 +487,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub { public InstallSessionInfo getSessionInfo(int sessionId) { synchronized (mSessions) { final PackageInstallerSession session = mSessions.get(sessionId); - final boolean isOwner = (session != null) - && (session.installerUid == Binder.getCallingUid()); - if (!isOwner) { + if (!isCallingUidOwner(session)) { enforceCallerCanReadSessions(); } return session != null ? session.generateInfo() : null; @@ -323,7 +552,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub { mPm.enforceCrossUserPermission(Binder.getCallingUid(), userId, true, "registerCallback"); enforceCallerCanReadSessions(); - mCallbacks.register(callback, new UserHandle(userId)); + mCallbacks.register(callback, userId); } @Override @@ -331,9 +560,24 @@ public class PackageInstallerService extends IPackageInstaller.Stub { mCallbacks.unregister(callback); } - private int getSessionUserId(int sessionId) { - synchronized (mSessions) { - return UserHandle.getUserId(mSessions.get(sessionId).installerUid); + private int getSessionCountLocked(int installerUid) { + int count = 0; + final int size = mSessions.size(); + for (int i = 0; i < size; i++) { + final PackageInstallerSession session = mSessions.valueAt(i); + if (session.installerUid == installerUid) { + count++; + } + } + return count; + } + + private boolean isCallingUidOwner(PackageInstallerSession session) { + final int callingUid = Binder.getCallingUid(); + if (callingUid == Process.ROOT_UID) { + return true; + } else { + return (session != null) && (callingUid == session.installerUid); } } @@ -352,53 +596,87 @@ public class PackageInstallerService extends IPackageInstaller.Stub { } } - private void notifySessionCreated(InstallSessionInfo info) { - final int userId = getSessionUserId(info.sessionId); - final int n = mCallbacks.beginBroadcast(); - for (int i = 0; i < n; i++) { - final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i); - final UserHandle user = (UserHandle) mCallbacks.getBroadcastCookie(i); - // TODO: dispatch notifications for slave profiles - if (userId == user.getIdentifier()) { - try { - callback.onSessionCreated(info.sessionId); - } catch (RemoteException ignored) { - } - } + private static class Callbacks extends Handler { + private static final int MSG_SESSION_CREATED = 1; + private static final int MSG_SESSION_OPENED = 2; + private static final int MSG_SESSION_PROGRESS_CHANGED = 3; + private static final int MSG_SESSION_CLOSED = 4; + private static final int MSG_SESSION_FINISHED = 5; + + private final RemoteCallbackList<IPackageInstallerCallback> + mCallbacks = new RemoteCallbackList<>(); + + public Callbacks(Looper looper) { + super(looper); } - mCallbacks.finishBroadcast(); - } - private void notifySessionProgressChanged(int sessionId, float progress) { - final int userId = getSessionUserId(sessionId); - final int n = mCallbacks.beginBroadcast(); - for (int i = 0; i < n; i++) { - final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i); - final UserHandle user = (UserHandle) mCallbacks.getBroadcastCookie(i); - if (userId == user.getIdentifier()) { - try { - callback.onSessionProgressChanged(sessionId, progress); - } catch (RemoteException ignored) { + public void register(IPackageInstallerCallback callback, int userId) { + mCallbacks.register(callback, new UserHandle(userId)); + } + + public void unregister(IPackageInstallerCallback callback) { + mCallbacks.unregister(callback); + } + + @Override + public void handleMessage(Message msg) { + final int userId = msg.arg2; + final int n = mCallbacks.beginBroadcast(); + for (int i = 0; i < n; i++) { + final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i); + final UserHandle user = (UserHandle) mCallbacks.getBroadcastCookie(i); + // TODO: dispatch notifications for slave profiles + if (userId == user.getIdentifier()) { + try { + invokeCallback(callback, msg); + } catch (RemoteException ignored) { + } } } + mCallbacks.finishBroadcast(); } - mCallbacks.finishBroadcast(); - } - private void notifySessionFinished(int sessionId, boolean success) { - final int userId = getSessionUserId(sessionId); - final int n = mCallbacks.beginBroadcast(); - for (int i = 0; i < n; i++) { - final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i); - final UserHandle user = (UserHandle) mCallbacks.getBroadcastCookie(i); - if (userId == user.getIdentifier()) { - try { - callback.onSessionFinished(sessionId, success); - } catch (RemoteException ignored) { - } + private void invokeCallback(IPackageInstallerCallback callback, Message msg) + throws RemoteException { + final int sessionId = msg.arg1; + switch (msg.what) { + case MSG_SESSION_CREATED: + callback.onSessionCreated(sessionId); + break; + case MSG_SESSION_OPENED: + callback.onSessionOpened(sessionId); + break; + case MSG_SESSION_PROGRESS_CHANGED: + callback.onSessionProgressChanged(sessionId, (float) msg.obj); + break; + case MSG_SESSION_CLOSED: + callback.onSessionClosed(sessionId); + break; + case MSG_SESSION_FINISHED: + callback.onSessionFinished(sessionId, (boolean) msg.obj); + break; } } - mCallbacks.finishBroadcast(); + + private void notifySessionCreated(int sessionId, int userId) { + obtainMessage(MSG_SESSION_CREATED, sessionId, userId).sendToTarget(); + } + + private void notifySessionOpened(int sessionId, int userId) { + obtainMessage(MSG_SESSION_OPENED, sessionId, userId).sendToTarget(); + } + + private void notifySessionProgressChanged(int sessionId, int userId, float progress) { + obtainMessage(MSG_SESSION_PROGRESS_CHANGED, sessionId, userId, progress).sendToTarget(); + } + + private void notifySessionClosed(int sessionId, int userId) { + obtainMessage(MSG_SESSION_CLOSED, sessionId, userId).sendToTarget(); + } + + public void notifySessionFinished(int sessionId, int userId, boolean success) { + obtainMessage(MSG_SESSION_FINISHED, sessionId, userId, success).sendToTarget(); + } } void dump(IndentingPrintWriter pw) { @@ -427,13 +705,17 @@ public class PackageInstallerService extends IPackageInstaller.Stub { } } - class Callback { + class InternalCallback { public void onSessionProgressChanged(PackageInstallerSession session, float progress) { - notifySessionProgressChanged(session.sessionId, progress); + mCallbacks.notifySessionProgressChanged(session.sessionId, session.userId, progress); + } + + public void onSessionClosed(PackageInstallerSession session) { + mCallbacks.notifySessionClosed(session.sessionId, session.userId); } public void onSessionFinished(PackageInstallerSession session, boolean success) { - notifySessionFinished(session.sessionId, success); + mCallbacks.notifySessionFinished(session.sessionId, session.userId, success); synchronized (mSessions) { mSessions.remove(session.sessionId); mHistoricalSessions.put(session.sessionId, session); diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 06e1d53..26019db 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -21,6 +21,7 @@ import static android.content.pm.PackageManager.INSTALL_FAILED_INTERNAL_ERROR; import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK; import static android.content.pm.PackageManager.INSTALL_FAILED_PACKAGE_CHANGED; import static android.system.OsConstants.O_CREAT; +import static android.system.OsConstants.O_RDONLY; import static android.system.OsConstants.O_WRONLY; import android.content.pm.ApplicationInfo; @@ -40,7 +41,6 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.ParcelFileDescriptor; -import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; import android.system.ErrnoException; @@ -52,6 +52,7 @@ import android.util.ExceptionUtils; import android.util.MathUtils; import android.util.Slog; +import com.android.internal.annotations.GuardedBy; import com.android.internal.util.ArrayUtils; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; @@ -62,33 +63,64 @@ import java.io.File; import java.io.FileDescriptor; import java.io.IOException; import java.util.ArrayList; +import java.util.concurrent.atomic.AtomicInteger; public class PackageInstallerSession extends IPackageInstallerSession.Stub { private static final String TAG = "PackageInstaller"; private static final boolean LOGD = true; + private static final int MSG_COMMIT = 0; + // TODO: enforce INSTALL_ALLOW_TEST // TODO: enforce INSTALL_ALLOW_DOWNGRADE // TODO: handle INSTALL_EXTERNAL, INSTALL_INTERNAL // TODO: treat INHERIT_EXISTING as installExistingPackage() - private final PackageInstallerService.Callback mCallback; + private final PackageInstallerService.InternalCallback mCallback; private final PackageManagerService mPm; private final Handler mHandler; - public final int sessionId; - public final int userId; - public final String installerPackageName; - /** UID not persisted */ - public final int installerUid; - public final InstallSessionParams params; - public final long createdMillis; - public final File sessionStageDir; + final int sessionId; + final int userId; + final String installerPackageName; + final InstallSessionParams params; + final long createdMillis; + final File sessionStageDir; - private static final int MSG_COMMIT = 0; + /** Note that UID is not persisted; it's always derived at runtime. */ + final int installerUid; + + AtomicInteger openCount = new AtomicInteger(); + + private final Object mLock = new Object(); + + @GuardedBy("mLock") + private float mClientProgress = 0; + @GuardedBy("mLock") + private float mProgress = 0; + @GuardedBy("mLock") + private float mReportedProgress = -1; + + @GuardedBy("mLock") + private boolean mSealed = false; + @GuardedBy("mLock") + private boolean mPermissionsConfirmed = false; + @GuardedBy("mLock") + private boolean mDestroyed = false; + + @GuardedBy("mLock") + private ArrayList<FileBridge> mBridges = new ArrayList<>(); - private Handler.Callback mHandlerCallback = new Handler.Callback() { + @GuardedBy("mLock") + private IPackageInstallObserver2 mRemoteObserver; + + /** Fields derived from commit parsing */ + private String mPackageName; + private int mVersionCode; + private Signature[] mSignatures; + + private final Handler.Callback mHandlerCallback = new Handler.Callback() { @Override public boolean handleMessage(Message msg) { synchronized (mLock) { @@ -114,27 +146,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } }; - private final Object mLock = new Object(); - - private float mClientProgress; - private float mProgress = 0; - - private String mPackageName; - private int mVersionCode; - private Signature[] mSignatures; - - private boolean mMutationsAllowed; - private boolean mPermissionsConfirmed; - private boolean mInvalid; - - private ArrayList<FileBridge> mBridges = new ArrayList<>(); - - private IPackageInstallObserver2 mRemoteObserver; - - public PackageInstallerSession(PackageInstallerService.Callback callback, - PackageManagerService pm, int sessionId, int userId, String installerPackageName, - int installerUid, InstallSessionParams params, long createdMillis, File sessionStageDir, - Looper looper) { + public PackageInstallerSession(PackageInstallerService.InternalCallback callback, + PackageManagerService pm, Looper looper, int sessionId, int userId, + String installerPackageName, InstallSessionParams params, long createdMillis, + File sessionStageDir, boolean sealed) { mCallback = callback; mPm = pm; mHandler = new Handler(looper, mHandlerCallback); @@ -142,24 +157,23 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { this.sessionId = sessionId; this.userId = userId; this.installerPackageName = installerPackageName; - this.installerUid = installerUid; this.params = params; this.createdMillis = createdMillis; this.sessionStageDir = sessionStageDir; - // Check against any explicitly provided signatures - mSignatures = params.signatures; + mSealed = sealed; - // TODO: splice in flag when restoring persisted session - mMutationsAllowed = true; + // Always derived at runtime + installerUid = mPm.getPackageUid(installerPackageName, userId); - if (pm.checkPermission(android.Manifest.permission.INSTALL_PACKAGES, installerPackageName) - == PackageManager.PERMISSION_GRANTED) { - mPermissionsConfirmed = true; - } - if (installerUid == Process.SHELL_UID || installerUid == 0) { + if (mPm.checkPermission(android.Manifest.permission.INSTALL_PACKAGES, + installerPackageName) == PackageManager.PERMISSION_GRANTED) { mPermissionsConfirmed = true; + } else { + mPermissionsConfirmed = false; } + + computeProgressLocked(); } public InstallSessionInfo generateInfo() { @@ -168,6 +182,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { info.sessionId = sessionId; info.installerPackageName = installerPackageName; info.progress = mProgress; + info.open = openCount.get() > 0; info.mode = params.mode; info.sizeBytes = params.sizeBytes; @@ -178,16 +193,48 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { return info; } + private void assertNotSealed(String cookie) { + synchronized (mLock) { + if (mSealed) { + throw new SecurityException(cookie + " not allowed after commit"); + } + } + } + @Override public void setClientProgress(float progress) { - mClientProgress = progress; - mProgress = MathUtils.constrain(mClientProgress * 0.8f, 0f, 0.8f); - mCallback.onSessionProgressChanged(this, mProgress); + synchronized (mLock) { + mClientProgress = progress; + computeProgressLocked(); + } + maybePublishProgress(); } @Override public void addClientProgress(float progress) { - setClientProgress(mClientProgress + progress); + synchronized (mLock) { + mClientProgress += progress; + computeProgressLocked(); + } + maybePublishProgress(); + } + + private void computeProgressLocked() { + mProgress = MathUtils.constrain(mClientProgress * 0.8f, 0f, 0.8f); + } + + private void maybePublishProgress() { + // Only publish when meaningful change + if (Math.abs(mProgress - mReportedProgress) > 0.01) { + mReportedProgress = mProgress; + mCallback.onSessionProgressChanged(this, mProgress); + } + } + + @Override + public String[] list() { + assertNotSealed("list"); + return sessionStageDir.list(); } @Override @@ -208,9 +255,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { // will block any attempted install transitions. final FileBridge bridge; synchronized (mLock) { - if (!mMutationsAllowed) { - throw new IllegalStateException("Mutations not allowed"); - } + assertNotSealed("openWrite"); bridge = new FileBridge(); mBridges.add(bridge); @@ -252,25 +297,51 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } @Override + public ParcelFileDescriptor openRead(String name) { + try { + return openReadInternal(name); + } catch (IOException e) { + throw ExceptionUtils.wrap(e); + } + } + + private ParcelFileDescriptor openReadInternal(String name) throws IOException { + assertNotSealed("openRead"); + + try { + if (!FileUtils.isValidExtFilename(name)) { + throw new IllegalArgumentException("Invalid name: " + name); + } + final File target = new File(sessionStageDir, name); + + final FileDescriptor targetFd = Libcore.os.open(target.getAbsolutePath(), O_RDONLY, 0); + return new ParcelFileDescriptor(targetFd); + + } catch (ErrnoException e) { + throw e.rethrowAsIOException(); + } + } + + @Override public void commit(IPackageInstallObserver2 observer) { Preconditions.checkNotNull(observer); mHandler.obtainMessage(MSG_COMMIT, observer).sendToTarget(); } private void commitLocked() throws PackageManagerException { - if (mInvalid) { + if (mDestroyed) { throw new PackageManagerException(INSTALL_FAILED_ALREADY_EXISTS, "Invalid session"); } // Verify that all writers are hands-off - if (mMutationsAllowed) { + if (!mSealed) { for (FileBridge bridge : mBridges) { if (!bridge.isClosed()) { throw new PackageManagerException(INSTALL_FAILED_PACKAGE_CHANGED, "Files still open"); } } - mMutationsAllowed = false; + mSealed = true; // TODO: persist disabled mutations before going forward, since // beyond this point we may have hardlinks to the valid install @@ -331,6 +402,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { private void validateInstallLocked() throws PackageManagerException { mPackageName = null; mVersionCode = -1; + mSignatures = null; final File[] files = sessionStageDir.listFiles(); if (ArrayUtils.isEmpty(files)) { @@ -461,7 +533,9 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { @Override public void close() { - // Currently ignored + if (openCount.decrementAndGet() == 0) { + mCallback.onSessionClosed(this); + } } @Override @@ -475,7 +549,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { private void destroyInternal() { synchronized (mLock) { - mInvalid = true; + mSealed = true; + mDestroyed = true; } FileUtils.deleteContents(sessionStageDir); sessionStageDir.delete(); @@ -496,11 +571,26 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { pw.printPair("mClientProgress", mClientProgress); pw.printPair("mProgress", mProgress); - pw.printPair("mMutationsAllowed", mMutationsAllowed); + pw.printPair("mSealed", mSealed); pw.printPair("mPermissionsConfirmed", mPermissionsConfirmed); + pw.printPair("mDestroyed", mDestroyed); pw.printPair("mBridges", mBridges.size()); pw.println(); pw.decreaseIndent(); } + + Snapshot snapshot() { + return new Snapshot(this); + } + + static class Snapshot { + final float clientProgress; + final boolean sealed; + + public Snapshot(PackageInstallerSession session) { + clientProgress = session.mClientProgress; + sealed = session.mSealed; + } + } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index ee6d4d0..2b55bf5 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -8257,11 +8257,11 @@ public class PackageManagerService extends IPackageManager.Stub { // A restore should be performed at this point if (a) the install // succeeded, (b) the operation is not an update, and (c) the new - // package has a backupAgent defined. + // package has not opted out of backup participation. final boolean update = res.removedInfo.removedPackage != null; - boolean doRestore = (!update - && res.pkg != null - && res.pkg.applicationInfo.backupAgentName != null); + final int flags = (res.pkg == null) ? 0 : res.pkg.applicationInfo.flags; + boolean doRestore = !update + && ((flags & ApplicationInfo.FLAG_ALLOW_BACKUP) != 0); // Set up the post-install work request bookkeeping. This will be used // and cleaned up by the post-install event handling regardless of whether diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index 16597c0..e11b6a7 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -35,6 +35,7 @@ import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; +import android.content.res.Resources; import android.database.Cursor; import android.graphics.Rect; import android.hardware.hdmi.HdmiCecDeviceInfo; @@ -51,6 +52,7 @@ import android.media.tv.TvContentRating; import android.media.tv.TvContract; import android.media.tv.TvInputHardwareInfo; import android.media.tv.TvInputInfo; +import android.media.tv.TvInputManager; import android.media.tv.TvInputService; import android.media.tv.TvStreamConfig; import android.media.tv.TvTrackInfo; @@ -281,6 +283,18 @@ public final class TvInputManagerService extends SystemService { userState.inputMap.clear(); userState.inputMap = inputMap; + + Resources r = Resources.getSystem(); + userState.ratingSystemXmlUriSet.clear(); + userState.ratingSystemXmlUriSet.add(TvContentRating.SYSTEM_CONTENT_RATING_SYSTEM_XML); + for (TvInputState state : userState.inputMap.values()) { + Uri ratingSystemXmlUri = state.mInfo.getRatingSystemXmlUri(); + if (ratingSystemXmlUri != null) { + // TODO: need to check the validation of xml format and the duplication of rating + // systems. + userState.ratingSystemXmlUriSet.add(state.mInfo.getRatingSystemXmlUri()); + } + } } private void switchUser(int userId) { @@ -814,6 +828,23 @@ public final class TvInputManagerService extends SystemService { } @Override + public List<Uri> getTvContentRatingSystemXmls(int userId) { + final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), + Binder.getCallingUid(), userId, "getTvContentRatingSystemXmls"); + final long identity = Binder.clearCallingIdentity(); + try { + synchronized (mLock) { + UserState userState = getUserStateLocked(resolvedUserId); + List<Uri> ratingSystemXmlUriList = new ArrayList<Uri>(); + ratingSystemXmlUriList.addAll(userState.ratingSystemXmlUriSet); + return ratingSystemXmlUriList; + } + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + @Override public void registerCallback(final ITvInputManagerCallback callback, int userId) { final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), Binder.getCallingUid(), userId, "registerCallback"); @@ -1135,7 +1166,7 @@ public final class TvInputManagerService extends SystemService { } @Override - public void tune(IBinder sessionToken, final Uri channelUri, int userId) { + public void tune(IBinder sessionToken, final Uri channelUri, Bundle params, int userId) { final int callingUid = Binder.getCallingUid(); final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid, userId, "tune"); @@ -1143,7 +1174,8 @@ public final class TvInputManagerService extends SystemService { try { synchronized (mLock) { try { - getSessionLocked(sessionToken, callingUid, resolvedUserId).tune(channelUri); + getSessionLocked(sessionToken, callingUid, resolvedUserId).tune( + channelUri, params); if (TvContract.isChannelUriForPassthroughTvInput(channelUri)) { // Do not log the watch history for passthrough inputs. return; @@ -1170,6 +1202,10 @@ public final class TvInputManagerService extends SystemService { currentTime); values.put(TvContract.WatchedPrograms.COLUMN_WATCH_END_TIME_UTC_MILLIS, 0); values.put(TvContract.WatchedPrograms.COLUMN_CHANNEL_ID, channelId); + if (params != null) { + values.put(TvContract.WatchedPrograms.COLUMN_TUNE_PARAMS, + encodeTuneParams(params)); + } sessionState.mLogUri = mContentResolver.insert( TvContract.WatchedPrograms.CONTENT_URI, values); @@ -1582,6 +1618,39 @@ public final class TvInputManagerService extends SystemService { } } } + + private String encodeTuneParams(Bundle tuneParams) { + StringBuilder builder = new StringBuilder(); + Set<String> keySet = tuneParams.keySet(); + Iterator<String> it = keySet.iterator(); + while (it.hasNext()) { + String key = it.next(); + Object value = tuneParams.get(key); + if (value == null) { + continue; + } + builder.append(replaceEscapeCharacters(key)); + builder.append("="); + builder.append(replaceEscapeCharacters(value.toString())); + if (it.hasNext()) { + builder.append(", "); + } + } + return builder.toString(); + } + + private String replaceEscapeCharacters(String src) { + final char ESCAPE_CHARACTER = '%'; + final String ENCODING_TARGET_CHARACTERS = "%=,"; + StringBuilder builder = new StringBuilder(); + for (char ch : src.toCharArray()) { + if (ENCODING_TARGET_CHARACTERS.indexOf(ch) >= 0) { + builder.append(ESCAPE_CHARACTER); + } + builder.append(ch); + } + return builder.toString(); + } } private static final class TvInputState { @@ -1604,6 +1673,9 @@ public final class TvInputManagerService extends SystemService { // A set of all TV input packages. private final Set<String> packageSet = new HashSet<String>(); + // A set of all TV content rating system xml uris. + private final Set<Uri> ratingSystemXmlUriSet = new HashSet<Uri>(); + // A mapping from the token of a client to its state. private final Map<IBinder, ClientState> clientStateMap = new HashMap<IBinder, ClientState>(); diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateService.java b/services/core/java/com/android/server/webkit/WebViewUpdateService.java index 60724e7..d4c5f87 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdateService.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdateService.java @@ -22,17 +22,20 @@ import android.content.Intent; import android.content.IntentFilter; import android.os.Binder; import android.os.Process; -import android.util.Log; +import android.util.Slog; import android.webkit.IWebViewUpdateService; import android.webkit.WebViewFactory; +import com.android.server.SystemService; + /** * Private service to wait for the updatable WebView to be ready for use. * @hide */ -public class WebViewUpdateService extends IWebViewUpdateService.Stub { +public class WebViewUpdateService extends SystemService { private static final String TAG = "WebViewUpdateService"; + private static final int WAIT_TIMEOUT_MS = 5000; // Same as KEY_DISPATCHING_TIMEOUT. private boolean mRelroReady32Bit = false; private boolean mRelroReady64Bit = false; @@ -40,6 +43,11 @@ public class WebViewUpdateService extends IWebViewUpdateService.Stub { private BroadcastReceiver mWebViewUpdatedReceiver; public WebViewUpdateService(Context context) { + super(context); + } + + @Override + public void onStart() { mWebViewUpdatedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -52,57 +60,76 @@ public class WebViewUpdateService extends IWebViewUpdateService.Stub { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_PACKAGE_REPLACED); filter.addDataScheme("package"); - context.registerReceiver(mWebViewUpdatedReceiver, filter); + getContext().registerReceiver(mWebViewUpdatedReceiver, filter); + + publishBinderService("webviewupdate", new BinderService()); } - /** - * The shared relro process calls this to notify us that it's done trying to create a relro - * file. - */ - public void notifyRelroCreationCompleted(boolean is64Bit, boolean success) { - // Verify that the caller is the shared relro process. - if (Binder.getCallingUid() != Process.SHARED_RELRO_UID) { - return; - } + private void onWebViewUpdateInstalled() { + Slog.d(TAG, "WebView Package updated!"); synchronized (this) { - if (is64Bit) { - mRelroReady64Bit = true; - } else { - mRelroReady32Bit = true; - } - this.notifyAll(); + mRelroReady32Bit = false; + mRelroReady64Bit = false; } + WebViewFactory.onWebViewUpdateInstalled(); } - /** - * WebViewFactory calls this to block WebView loading until the relro file is created. - */ - public void waitForRelroCreationCompleted(boolean is64Bit) { - synchronized (this) { - if (is64Bit) { - while (!mRelroReady64Bit) { - try { - this.wait(); - } catch (InterruptedException e) {} + private class BinderService extends IWebViewUpdateService.Stub { + + /** + * The shared relro process calls this to notify us that it's done trying to create a relro + * file. This method gets called even if the relro creation has failed or the process + * crashed. + */ + @Override // Binder call + public void notifyRelroCreationCompleted(boolean is64Bit, boolean success) { + // Verify that the caller is either the shared relro process (nominal case) or the + // system server (only in the case the relro process crashes and we get here via the + // crashHandler). + if (Binder.getCallingUid() != Process.SHARED_RELRO_UID && + Binder.getCallingUid() != Process.SYSTEM_UID) { + return; + } + + synchronized (WebViewUpdateService.this) { + if (is64Bit) { + mRelroReady64Bit = true; + } else { + mRelroReady32Bit = true; } - } else { - while (!mRelroReady32Bit) { + WebViewUpdateService.this.notifyAll(); + } + } + + /** + * WebViewFactory calls this to block WebView loading until the relro file is created. + */ + @Override // Binder call + public void waitForRelroCreationCompleted(boolean is64Bit) { + // The WebViewUpdateService depends on the prepareWebViewInSystemServer call, which + // happens later (during the PHASE_ACTIVITY_MANAGER_READY) in SystemServer.java. If + // another service there tries to bring up a WebView in the between, the wait below + // would deadlock without the check below. + if (Binder.getCallingPid() == Process.myPid()) { + throw new IllegalStateException("Cannot create a WebView from the SystemServer"); + } + + final long NS_PER_MS = 1000000; + final long timeoutTimeMs = System.nanoTime() / NS_PER_MS + WAIT_TIMEOUT_MS; + boolean relroReady = (is64Bit ? mRelroReady64Bit : mRelroReady32Bit); + synchronized (WebViewUpdateService.this) { + while (!relroReady) { + final long timeNowMs = System.nanoTime() / NS_PER_MS; + if (timeNowMs >= timeoutTimeMs) break; try { - this.wait(); + WebViewUpdateService.this.wait(timeoutTimeMs - timeNowMs); } catch (InterruptedException e) {} + relroReady = (is64Bit ? mRelroReady64Bit : mRelroReady32Bit); } } + if (!relroReady) Slog.w(TAG, "creating relro file timed out"); } } - private void onWebViewUpdateInstalled() { - Log.d(TAG, "WebView Package updated!"); - - synchronized (this) { - mRelroReady32Bit = false; - mRelroReady64Bit = false; - } - WebViewFactory.prepareWebViewInSystemServer(); - } } diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index d955354..e8d6773 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -376,6 +376,9 @@ public final class SystemServer { mSystemServiceManager.startService(UsageStatsService.class); mActivityManagerService.setUsageStatsManager( LocalServices.getService(UsageStatsManagerInternal.class)); + + // Tracks whether the updatable WebView is in a ready state and watches for update installs. + mSystemServiceManager.startService(WebViewUpdateService.class); } /** @@ -422,12 +425,6 @@ public final class SystemServer { Slog.i(TAG, "Reading configuration..."); SystemConfig.getInstance(); - Slog.i(TAG, "WebView Update Service"); - ServiceManager.addService("webviewupdate", new WebViewUpdateService(context)); - - Slog.i(TAG, "WebViewFactory preparation"); - WebViewFactory.prepareWebViewInSystemServer(); - Slog.i(TAG, "Scheduling Policy"); ServiceManager.addService("scheduling_policy", new SchedulingPolicyService()); @@ -1080,6 +1077,10 @@ public final class SystemServer { } catch (Throwable e) { reportWtf("observing native crashes", e); } + + Slog.i(TAG, "WebViewFactory preparation"); + WebViewFactory.prepareWebViewInSystemServer(); + try { startSystemUi(context); } catch (Throwable e) { diff --git a/telephony/java/android/telephony/IccOpenLogicalChannelResponse.java b/telephony/java/android/telephony/IccOpenLogicalChannelResponse.java index bb5e277..e9db030 100644 --- a/telephony/java/android/telephony/IccOpenLogicalChannelResponse.java +++ b/telephony/java/android/telephony/IccOpenLogicalChannelResponse.java @@ -93,7 +93,7 @@ public class IccOpenLogicalChannelResponse implements Parcelable { public void writeToParcel(Parcel out, int flags) { out.writeInt(mChannel); out.writeInt(mStatus); - if (mSelectResponse != null & mSelectResponse.length > 0) { + if (mSelectResponse != null && mSelectResponse.length > 0) { out.writeInt(mSelectResponse.length); out.writeByteArray(mSelectResponse); } else { diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java index 49c3d0a..b43ad6f 100644 --- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java +++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java @@ -81,11 +81,6 @@ public class MainInteractionService extends VoiceInteractionService { private void hotwordAvailabilityChangeHelper(int availability) { Log.i(TAG, "Hotword availability = " + availability); switch (availability) { - case AlwaysOnHotwordDetector.STATE_INVALID: - Log.i(TAG, "STATE_INVALID"); - mHotwordDetector = - createAlwaysOnHotwordDetector("Hello There", "en-US", mHotwordCallback); - break; case AlwaysOnHotwordDetector.STATE_HARDWARE_UNAVAILABLE: Log.i(TAG, "STATE_HARDWARE_UNAVAILABLE"); break; diff --git a/tools/aapt/Images.cpp b/tools/aapt/Images.cpp index 28de933..cf3dd0a 100644 --- a/tools/aapt/Images.cpp +++ b/tools/aapt/Images.cpp @@ -83,7 +83,7 @@ struct image_info int32_t outlineInsetsRight; int32_t outlineInsetsBottom; float outlineRadius; - bool outlineFilled; + uint8_t outlineAlpha; png_uint_32 allocHeight; png_bytepp allocRows; @@ -410,12 +410,12 @@ static void find_max_opacity(png_byte** rows, int* out_inset) { bool opaque_within_inset = true; - unsigned char max_opacity = 0; + uint8_t max_opacity = 0; int inset = 0; *out_inset = 0; for (int x = startX, y = startY; x != endX && y != endY; x += dX, y += dY, inset++) { png_byte* color = rows[y] + x * 4; - unsigned char opacity = color[3]; + uint8_t opacity = color[3]; if (opacity > max_opacity) { max_opacity = opacity; *out_inset = inset; @@ -424,22 +424,24 @@ static void find_max_opacity(png_byte** rows, } } -static bool is_opaque_over_row(png_byte* row, int startX, int endX) +static uint8_t max_alpha_over_row(png_byte* row, int startX, int endX) { + uint8_t max_alpha = 0; for (int x = startX; x < endX; x++) { - png_byte* color = row + x * 4; - if (color[3] != 0xff) return false; + uint8_t alpha = (row + x * 4)[3]; + if (alpha > max_alpha) max_alpha = alpha; } - return true; + return max_alpha; } -static bool is_opaque_over_col(png_byte** rows, int offsetX, int startY, int endY) +static uint8_t max_alpha_over_col(png_byte** rows, int offsetX, int startY, int endY) { + uint8_t max_alpha = 0; for (int y = startY; y < endY; y++) { - png_byte* color = rows[y] + offsetX * 4; - if (color[3] != 0xff) return false; + uint8_t alpha = (rows[y] + offsetX * 4)[3]; + if (alpha > max_alpha) max_alpha = alpha; } - return true; + return max_alpha; } static void get_outline(image_info* image) @@ -476,8 +478,8 @@ static void get_outline(image_info* image) // assuming the image is a round rect, compute the radius by marching // diagonally from the top left corner towards the center - image->outlineFilled = is_opaque_over_row(image->rows[innerMidY], innerStartX, innerEndX) - && is_opaque_over_col(image->rows, innerMidX, innerStartY, innerStartY); + image->outlineAlpha = max(max_alpha_over_row(image->rows[innerMidY], innerStartX, innerEndX), + max_alpha_over_col(image->rows, innerMidX, innerStartY, innerStartY)); int diagonalInset = 0; find_max_opacity(image->rows, innerStartX, innerStartY, innerMidX, innerMidY, 1, 1, @@ -487,14 +489,13 @@ static void get_outline(image_info* image) // radius = 1 / (sqrt(2) - 1) * inset image->outlineRadius = 2.4142f * diagonalInset; - NOISY(printf("outline insets %d %d %d %d, rad %f, filled %d\n", - image->outlineFilled, + NOISY(printf("outline insets %d %d %d %d, rad %f, alpha %x\n", image->outlineInsetsLeft, image->outlineInsetsTop, image->outlineInsetsRight, image->outlineInsetsBottom, image->outlineRadius, - image->outlineFilled)); + image->outlineAlpha)); } @@ -691,8 +692,8 @@ static status_t do_9patch(const char* imageName, image_info* image) } NOISY(printf("Size ticks for %s: x0=%d, x1=%d, y0=%d, y1=%d\n", imageName, - image->info9Patch.xDivs[0], image->info9Patch.xDivs[1], - image->info9Patch.yDivs[0], image->info9Patch.yDivs[1])); + xDivs[0], xDivs[1], + yDivs[0], yDivs[1])); NOISY(printf("padding ticks for %s: l=%d, r=%d, t=%d, b=%d\n", imageName, image->info9Patch.paddingLeft, image->info9Patch.paddingRight, image->info9Patch.paddingTop, image->info9Patch.paddingBottom)); @@ -1167,7 +1168,7 @@ static void write_png(const char* imageName, png_byte outputData[chunk_size]; memcpy(&outputData, &imageInfo.outlineInsetsLeft, 4 * sizeof(png_uint_32)); ((float*) outputData)[4] = imageInfo.outlineRadius; - ((png_uint_32*) outputData)[5] = imageInfo.outlineFilled ? 1 : 0; + ((png_uint_32*) outputData)[5] = imageInfo.outlineAlpha; memcpy(unknowns[o_index].data, &outputData, chunk_size); unknowns[o_index].size = chunk_size; diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java index 67ff868..f0a7f38 100644 --- a/wifi/java/android/net/wifi/ScanResult.java +++ b/wifi/java/android/net/wifi/ScanResult.java @@ -185,6 +185,14 @@ public class ScanResult implements Parcelable { public static class InformationElement { public int id; public byte[] bytes; + + public InformationElement() { + } + + public InformationElement(InformationElement rhs) { + this.id = rhs.id; + this.bytes = rhs.bytes.clone(); + } } /** information elements found in the beacon diff --git a/wifi/java/android/net/wifi/WifiScanner.java b/wifi/java/android/net/wifi/WifiScanner.java index 4cdbc44..c5c44b5 100644 --- a/wifi/java/android/net/wifi/WifiScanner.java +++ b/wifi/java/android/net/wifi/WifiScanner.java @@ -145,6 +145,8 @@ public class WifiScanner { public int periodInMs; /** must have a valid REPORT_EVENT value */ public int reportEvents; + /** defines number of bssids to cache from each scan */ + public int numBssidsPerScan; /** Implement the Parcelable interface {@hide} */ public int describeContents() { @@ -267,13 +269,6 @@ public class WifiScanner { public void onFullResult(ScanResult fullScanResult); } - /** @hide */ - public void scan(ScanSettings settings, ScanListener listener) { - validateChannel(); - settings.periodInMs = 0; - sAsyncChannel.sendMessage(CMD_SCAN, 0, putListener(listener), settings); - } - /** start wifi scan in background * @param settings specifies various parameters for the scan; for more information look at * {@link ScanSettings} @@ -305,7 +300,7 @@ public class WifiScanner { } /** specifies information about an access point of interest */ - public static class HotspotInfo { + public static class BssidInfo { /** bssid of the access point; in XX:XX:XX:XX:XX:XX format */ public String bssid; /** low signal strength threshold; more information at {@link ScanResult#level} */ @@ -324,7 +319,7 @@ public class WifiScanner { public int unchangedSampleSize; /* samples to confirm no change */ public int minApsBreachingThreshold; /* change threshold to trigger event */ public int periodInMs; /* scan period in millisecond */ - public HotspotInfo[] hotspotInfos; + public BssidInfo[] bssidInfos; /** Implement the Parcelable interface {@hide} */ public int describeContents() { @@ -338,10 +333,10 @@ public class WifiScanner { dest.writeInt(unchangedSampleSize); dest.writeInt(minApsBreachingThreshold); dest.writeInt(periodInMs); - if (hotspotInfos != null) { - dest.writeInt(hotspotInfos.length); - for (int i = 0; i < hotspotInfos.length; i++) { - HotspotInfo info = hotspotInfos[i]; + if (bssidInfos != null) { + dest.writeInt(bssidInfos.length); + for (int i = 0; i < bssidInfos.length; i++) { + BssidInfo info = bssidInfos[i]; dest.writeString(info.bssid); dest.writeInt(info.low); dest.writeInt(info.high); @@ -363,14 +358,14 @@ public class WifiScanner { settings.minApsBreachingThreshold = in.readInt(); settings.periodInMs = in.readInt(); int len = in.readInt(); - settings.hotspotInfos = new HotspotInfo[len]; + settings.bssidInfos = new BssidInfo[len]; for (int i = 0; i < len; i++) { - HotspotInfo info = new HotspotInfo(); + BssidInfo info = new BssidInfo(); info.bssid = in.readString(); info.low = in.readInt(); info.high = in.readInt(); info.frequencyHint = in.readInt(); - settings.hotspotInfos[i] = info; + settings.bssidInfos[i] = info; } return settings; } @@ -389,7 +384,7 @@ public class WifiScanner { * @param minApsBreachingThreshold minimum number of access points that need to be * out of range to detect WifiChange * @param periodInMs indicates period of scan to find changes - * @param hotspotInfos access points to watch + * @param bssidInfos access points to watch */ public void configureWifiChange( int rssiSampleSize, /* sample size for RSSI averaging */ @@ -397,7 +392,7 @@ public class WifiScanner { int unchangedSampleSize, /* samples to confirm no change */ int minApsBreachingThreshold, /* change threshold to trigger event */ int periodInMs, /* period of scan */ - HotspotInfo[] hotspotInfos /* signal thresholds to crosss */ + BssidInfo[] bssidInfos /* signal thresholds to crosss */ ) { validateChannel(); @@ -408,7 +403,7 @@ public class WifiScanner { settings.unchangedSampleSize = unchangedSampleSize; settings.minApsBreachingThreshold = minApsBreachingThreshold; settings.periodInMs = periodInMs; - settings.hotspotInfos = hotspotInfos; + settings.bssidInfos = bssidInfos; configureWifiChange(settings); } @@ -455,7 +450,7 @@ public class WifiScanner { } /** interface to receive hotlist events on; use this on {@link #setHotlist} */ - public static interface HotspotListener extends ActionListener { + public static interface BssidListener extends ActionListener { /** indicates that access points were found by on going scans * @param results list of scan results, one for each access point visible currently */ @@ -465,7 +460,7 @@ public class WifiScanner { /** @hide */ @SystemApi public static class HotlistSettings implements Parcelable { - public HotspotInfo[] hotspotInfos; + public BssidInfo[] bssidInfos; public int apLostThreshold; /** Implement the Parcelable interface {@hide} */ @@ -477,10 +472,10 @@ public class WifiScanner { public void writeToParcel(Parcel dest, int flags) { dest.writeInt(apLostThreshold); - if (hotspotInfos != null) { - dest.writeInt(hotspotInfos.length); - for (int i = 0; i < hotspotInfos.length; i++) { - HotspotInfo info = hotspotInfos[i]; + if (bssidInfos != null) { + dest.writeInt(bssidInfos.length); + for (int i = 0; i < bssidInfos.length; i++) { + BssidInfo info = bssidInfos[i]; dest.writeString(info.bssid); dest.writeInt(info.low); dest.writeInt(info.high); @@ -498,14 +493,14 @@ public class WifiScanner { HotlistSettings settings = new HotlistSettings(); settings.apLostThreshold = in.readInt(); int n = in.readInt(); - settings.hotspotInfos = new HotspotInfo[n]; + settings.bssidInfos = new BssidInfo[n]; for (int i = 0; i < n; i++) { - HotspotInfo info = new HotspotInfo(); + BssidInfo info = new BssidInfo(); info.bssid = in.readString(); info.low = in.readInt(); info.high = in.readInt(); info.frequencyHint = in.readInt(); - settings.hotspotInfos[i] = info; + settings.bssidInfos[i] = info; } return settings; } @@ -518,24 +513,24 @@ public class WifiScanner { /** * set interesting access points to find - * @param hotspots access points of interest + * @param bssidInfos access points of interest * @param apLostThreshold number of scans needed to indicate that AP is lost * @param listener object provided to report events on; this object must be unique and must - * also be provided on {@link #stopTrackingHotspots} + * also be provided on {@link #stopTrackingBssids} */ - public void startTrackingHotspots(HotspotInfo[] hotspots, - int apLostThreshold, HotspotListener listener) { + public void startTrackingBssids(BssidInfo[] bssidInfos, + int apLostThreshold, BssidListener listener) { validateChannel(); HotlistSettings settings = new HotlistSettings(); - settings.hotspotInfos = hotspots; + settings.bssidInfos = bssidInfos; sAsyncChannel.sendMessage(CMD_SET_HOTLIST, 0, putListener(listener), settings); } /** * remove tracking of interesting access points - * @param listener same object provided in {@link #startTrackingHotspots} + * @param listener same object provided in {@link #startTrackingBssids} */ - public void stopTrackingHotspots(HotspotListener listener) { + public void stopTrackingBssids(BssidListener listener) { validateChannel(); sAsyncChannel.sendMessage(CMD_RESET_HOTLIST, 0, removeListener(listener)); } @@ -802,7 +797,7 @@ public class WifiScanner { ((ScanListener) listener).onPeriodChanged(msg.arg1); return; case CMD_AP_FOUND: - ((HotspotListener) listener).onFound( + ((BssidListener) listener).onFound( ((ParcelableScanResults) msg.obj).getResults()); return; case CMD_WIFI_CHANGE_DETECTED: |