am 20d80a4a: Merge "Quantum notification improvements."
* commit '20d80a4a05249fca9f4aa6c80b61a1f7a9e18dd0': Quantum notification improvements.
This commit is contained in:
@@ -4438,6 +4438,7 @@ package android.app {
|
||||
field public static final java.lang.String CATEGORY_STATUS = "status";
|
||||
field public static final java.lang.String CATEGORY_SYSTEM = "sys";
|
||||
field public static final java.lang.String CATEGORY_TRANSPORT = "transport";
|
||||
field public static final int COLOR_DEFAULT = 0; // 0x0
|
||||
field public static final android.os.Parcelable.Creator CREATOR;
|
||||
field public static final int DEFAULT_ALL = -1; // 0xffffffff
|
||||
field public static final int DEFAULT_LIGHTS = 4; // 0x4
|
||||
@@ -4483,6 +4484,7 @@ package android.app {
|
||||
field public int audioStreamType;
|
||||
field public android.widget.RemoteViews bigContentView;
|
||||
field public java.lang.String category;
|
||||
field public int color;
|
||||
field public android.app.PendingIntent contentIntent;
|
||||
field public android.widget.RemoteViews contentView;
|
||||
field public int defaults;
|
||||
@@ -4545,6 +4547,7 @@ package android.app {
|
||||
method public deprecated android.app.Notification getNotification();
|
||||
method public android.app.Notification.Builder setAutoCancel(boolean);
|
||||
method public android.app.Notification.Builder setCategory(java.lang.String);
|
||||
method public android.app.Notification.Builder setColor(int);
|
||||
method public android.app.Notification.Builder setContent(android.widget.RemoteViews);
|
||||
method public android.app.Notification.Builder setContentInfo(java.lang.CharSequence);
|
||||
method public android.app.Notification.Builder setContentIntent(android.app.PendingIntent);
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
package android.app;
|
||||
|
||||
import com.android.internal.R;
|
||||
import com.android.internal.util.LegacyNotificationUtil;
|
||||
import com.android.internal.util.NotificationColorUtil;
|
||||
|
||||
import android.annotation.IntDef;
|
||||
import android.content.Context;
|
||||
@@ -28,6 +28,7 @@ import android.graphics.PorterDuff;
|
||||
import android.media.AudioManager;
|
||||
import android.net.Uri;
|
||||
import android.os.BadParcelableException;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
@@ -420,6 +421,21 @@ public class Notification implements Parcelable
|
||||
@Priority
|
||||
public int priority;
|
||||
|
||||
/**
|
||||
* Accent color (an ARGB integer like the constants in {@link android.graphics.Color})
|
||||
* to be applied by the standard Style templates when presenting this notification.
|
||||
*
|
||||
* The current template design constructs a colorful header image by overlaying the
|
||||
* {@link #icon} image (stenciled in white) atop a field of this color. Alpha components are
|
||||
* ignored.
|
||||
*/
|
||||
public int color = COLOR_DEFAULT;
|
||||
|
||||
/**
|
||||
* Special value of {@link #color} telling the system not to decorate this notification with
|
||||
* any special color but instead use default colors when presenting this notification.
|
||||
*/
|
||||
public static final int COLOR_DEFAULT = 0; // AKA Color.TRANSPARENT
|
||||
|
||||
/**
|
||||
* Sphere of visibility of this notification, which affects how and when the SystemUI reveals
|
||||
@@ -877,6 +893,8 @@ public class Notification implements Parcelable
|
||||
if (parcel.readInt() != 0) {
|
||||
publicVersion = Notification.CREATOR.createFromParcel(parcel);
|
||||
}
|
||||
|
||||
color = parcel.readInt();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -968,6 +986,8 @@ public class Notification implements Parcelable
|
||||
this.publicVersion.cloneInto(that.publicVersion, heavy);
|
||||
}
|
||||
|
||||
that.color = this.color;
|
||||
|
||||
if (!heavy) {
|
||||
that.lightenPayload(); // will clean out extras
|
||||
}
|
||||
@@ -1110,6 +1130,8 @@ public class Notification implements Parcelable
|
||||
} else {
|
||||
parcel.writeInt(0);
|
||||
}
|
||||
|
||||
parcel.writeInt(color);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1218,6 +1240,7 @@ public class Notification implements Parcelable
|
||||
sb.append(Integer.toHexString(this.defaults));
|
||||
sb.append(" flags=0x");
|
||||
sb.append(Integer.toHexString(this.flags));
|
||||
sb.append(String.format(" color=0x%08x", this.color));
|
||||
sb.append(" category="); sb.append(this.category);
|
||||
if (actions != null) {
|
||||
sb.append(" ");
|
||||
@@ -1309,9 +1332,10 @@ public class Notification implements Parcelable
|
||||
private boolean mShowWhen = true;
|
||||
private int mVisibility = VISIBILITY_PRIVATE;
|
||||
private Notification mPublicVersion = null;
|
||||
private boolean mQuantumTheme;
|
||||
private final LegacyNotificationUtil mLegacyNotificationUtil;
|
||||
private final NotificationColorUtil mColorUtil;
|
||||
private ArrayList<String> mPeople;
|
||||
private boolean mPreQuantum;
|
||||
private int mColor = COLOR_DEFAULT;
|
||||
|
||||
/**
|
||||
* Constructs a new Builder with the defaults:
|
||||
@@ -1341,12 +1365,8 @@ public class Notification implements Parcelable
|
||||
mPriority = PRIORITY_DEFAULT;
|
||||
mPeople = new ArrayList<String>();
|
||||
|
||||
// TODO: Decide on targetSdk from calling app whether to use quantum theme.
|
||||
mQuantumTheme = true;
|
||||
|
||||
// TODO: Decide on targetSdk from calling app whether to instantiate the processor at
|
||||
// all.
|
||||
mLegacyNotificationUtil = LegacyNotificationUtil.getInstance();
|
||||
mPreQuantum = context.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.L;
|
||||
mColorUtil = NotificationColorUtil.getInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1853,29 +1873,38 @@ public class Notification implements Parcelable
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets {@link Notification#color}.
|
||||
*
|
||||
* @param argb The accent color to use
|
||||
*
|
||||
* @return The same Builder.
|
||||
*/
|
||||
public Builder setColor(int argb) {
|
||||
mColor = argb;
|
||||
return this;
|
||||
}
|
||||
|
||||
private RemoteViews applyStandardTemplate(int resId, boolean fitIn1U) {
|
||||
RemoteViews contentView = new RemoteViews(mContext.getPackageName(), resId);
|
||||
boolean showLine3 = false;
|
||||
boolean showLine2 = false;
|
||||
int smallIconImageViewId = R.id.icon;
|
||||
if (!mQuantumTheme && mPriority < PRIORITY_LOW) {
|
||||
contentView.setInt(R.id.icon,
|
||||
"setBackgroundResource", R.drawable.notification_template_icon_low_bg);
|
||||
contentView.setInt(R.id.status_bar_latest_event_content,
|
||||
"setBackgroundResource", R.drawable.notification_bg_low);
|
||||
if (mPriority < PRIORITY_LOW) {
|
||||
// TODO: Low priority presentation
|
||||
}
|
||||
if (mLargeIcon != null) {
|
||||
contentView.setImageViewBitmap(R.id.icon, mLargeIcon);
|
||||
processLegacyLargeIcon(mLargeIcon, contentView);
|
||||
processLargeIcon(mLargeIcon, contentView);
|
||||
smallIconImageViewId = R.id.right_icon;
|
||||
}
|
||||
if (mSmallIcon != 0) {
|
||||
contentView.setImageViewResource(smallIconImageViewId, mSmallIcon);
|
||||
contentView.setViewVisibility(smallIconImageViewId, View.VISIBLE);
|
||||
if (mLargeIcon != null) {
|
||||
processLegacySmallIcon(mSmallIcon, smallIconImageViewId, contentView);
|
||||
processSmallRightIcon(mSmallIcon, smallIconImageViewId, contentView);
|
||||
} else {
|
||||
processLegacyLargeIcon(mSmallIcon, contentView);
|
||||
processSmallIconAsLarge(mSmallIcon, contentView);
|
||||
}
|
||||
|
||||
} else {
|
||||
@@ -2035,12 +2064,12 @@ public class Notification implements Parcelable
|
||||
* doesn't create quantum notifications by itself) app.
|
||||
*/
|
||||
private boolean isLegacy() {
|
||||
return mLegacyNotificationUtil != null;
|
||||
return mColorUtil != null;
|
||||
}
|
||||
|
||||
private void processLegacyAction(Action action, RemoteViews button) {
|
||||
if (isLegacy()) {
|
||||
if (mLegacyNotificationUtil.isGrayscale(mContext, action.icon)) {
|
||||
if (mColorUtil.isGrayscale(mContext, action.icon)) {
|
||||
button.setTextViewCompoundDrawablesRelativeColorFilter(R.id.action0, 0,
|
||||
mContext.getResources().getColor(
|
||||
R.color.notification_action_legacy_color_filter),
|
||||
@@ -2051,47 +2080,70 @@ public class Notification implements Parcelable
|
||||
|
||||
private CharSequence processLegacyText(CharSequence charSequence) {
|
||||
if (isLegacy()) {
|
||||
return mLegacyNotificationUtil.invertCharSequenceColors(charSequence);
|
||||
return mColorUtil.invertCharSequenceColors(charSequence);
|
||||
} else {
|
||||
return charSequence;
|
||||
}
|
||||
}
|
||||
|
||||
private void processLegacyLargeIcon(int largeIconId, RemoteViews contentView) {
|
||||
if (isLegacy()) {
|
||||
processLegacyLargeIcon(
|
||||
mLegacyNotificationUtil.isGrayscale(mContext, largeIconId),
|
||||
contentView);
|
||||
/**
|
||||
* Apply any necessary background to smallIcons being used in the largeIcon spot.
|
||||
*/
|
||||
private void processSmallIconAsLarge(int largeIconId, RemoteViews contentView) {
|
||||
if (!isLegacy() || mColorUtil.isGrayscale(mContext, largeIconId)) {
|
||||
applyLargeIconBackground(contentView);
|
||||
}
|
||||
}
|
||||
|
||||
private void processLegacyLargeIcon(Bitmap largeIcon, RemoteViews contentView) {
|
||||
if (isLegacy()) {
|
||||
processLegacyLargeIcon(
|
||||
mLegacyNotificationUtil.isGrayscale(largeIcon),
|
||||
contentView);
|
||||
/**
|
||||
* Apply any necessary background to a largeIcon if it's a fake smallIcon (that is,
|
||||
* if it's grayscale).
|
||||
*/
|
||||
// TODO: also check bounds, transparency, that sort of thing.
|
||||
private void processLargeIcon(Bitmap largeIcon, RemoteViews contentView) {
|
||||
if (!isLegacy() || mColorUtil.isGrayscale(largeIcon)) {
|
||||
applyLargeIconBackground(contentView);
|
||||
}
|
||||
}
|
||||
|
||||
private void processLegacyLargeIcon(boolean isGrayscale, RemoteViews contentView) {
|
||||
if (isLegacy() && isGrayscale) {
|
||||
contentView.setInt(R.id.icon, "setBackgroundResource",
|
||||
R.drawable.notification_icon_legacy_bg_inset);
|
||||
}
|
||||
/**
|
||||
* Add a colored circle behind the largeIcon slot.
|
||||
*/
|
||||
private void applyLargeIconBackground(RemoteViews contentView) {
|
||||
contentView.setInt(R.id.icon, "setBackgroundResource",
|
||||
R.drawable.notification_icon_legacy_bg_inset);
|
||||
|
||||
contentView.setDrawableParameters(
|
||||
R.id.icon,
|
||||
true,
|
||||
-1,
|
||||
mColor,
|
||||
PorterDuff.Mode.SRC_ATOP,
|
||||
-1);
|
||||
}
|
||||
|
||||
private void processLegacySmallIcon(int smallIconDrawableId, int smallIconImageViewId,
|
||||
/**
|
||||
* Recolor small icons when used in the R.id.right_icon slot.
|
||||
*/
|
||||
private void processSmallRightIcon(int smallIconDrawableId, int smallIconImageViewId,
|
||||
RemoteViews contentView) {
|
||||
if (isLegacy()) {
|
||||
if (mLegacyNotificationUtil.isGrayscale(mContext, smallIconDrawableId)) {
|
||||
contentView.setDrawableParameters(smallIconImageViewId, false, -1,
|
||||
mContext.getResources().getColor(
|
||||
R.color.notification_action_legacy_color_filter),
|
||||
PorterDuff.Mode.MULTIPLY, -1);
|
||||
}
|
||||
if (!isLegacy() || mColorUtil.isGrayscale(mContext, smallIconDrawableId)) {
|
||||
contentView.setDrawableParameters(smallIconImageViewId, false, -1,
|
||||
mContext.getResources().getColor(
|
||||
R.color.notification_action_legacy_color_filter),
|
||||
PorterDuff.Mode.MULTIPLY, -1);
|
||||
}
|
||||
}
|
||||
|
||||
private int resolveColor() {
|
||||
if (mColor == COLOR_DEFAULT) {
|
||||
mColor = mContext.getResources().getColor(R.color.notification_icon_bg_color);
|
||||
} else {
|
||||
mColor |= 0xFF000000; // no alpha for custom colors
|
||||
}
|
||||
return mColor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply the unstyled operations and return a new {@link Notification} object.
|
||||
* @hide
|
||||
@@ -2102,6 +2154,9 @@ public class Notification implements Parcelable
|
||||
n.icon = mSmallIcon;
|
||||
n.iconLevel = mSmallIconLevel;
|
||||
n.number = mNumber;
|
||||
|
||||
n.color = resolveColor();
|
||||
|
||||
n.contentView = makeContentView();
|
||||
n.contentIntent = mContentIntent;
|
||||
n.deleteIntent = mDeleteIntent;
|
||||
@@ -2207,45 +2262,31 @@ public class Notification implements Parcelable
|
||||
|
||||
|
||||
private int getBaseLayoutResource() {
|
||||
return mQuantumTheme
|
||||
? R.layout.notification_template_quantum_base
|
||||
: R.layout.notification_template_base;
|
||||
return R.layout.notification_template_quantum_base;
|
||||
}
|
||||
|
||||
private int getBigBaseLayoutResource() {
|
||||
return mQuantumTheme
|
||||
? R.layout.notification_template_quantum_big_base
|
||||
: R.layout.notification_template_big_base;
|
||||
return R.layout.notification_template_quantum_big_base;
|
||||
}
|
||||
|
||||
private int getBigPictureLayoutResource() {
|
||||
return mQuantumTheme
|
||||
? R.layout.notification_template_quantum_big_picture
|
||||
: R.layout.notification_template_big_picture;
|
||||
return R.layout.notification_template_quantum_big_picture;
|
||||
}
|
||||
|
||||
private int getBigTextLayoutResource() {
|
||||
return mQuantumTheme
|
||||
? R.layout.notification_template_quantum_big_text
|
||||
: R.layout.notification_template_big_text;
|
||||
return R.layout.notification_template_quantum_big_text;
|
||||
}
|
||||
|
||||
private int getInboxLayoutResource() {
|
||||
return mQuantumTheme
|
||||
? R.layout.notification_template_quantum_inbox
|
||||
: R.layout.notification_template_inbox;
|
||||
return R.layout.notification_template_quantum_inbox;
|
||||
}
|
||||
|
||||
private int getActionLayoutResource() {
|
||||
return mQuantumTheme
|
||||
? R.layout.notification_quantum_action
|
||||
: R.layout.notification_action;
|
||||
return R.layout.notification_quantum_action;
|
||||
}
|
||||
|
||||
private int getActionTombstoneLayoutResource() {
|
||||
return mQuantumTheme
|
||||
? R.layout.notification_quantum_action_tombstone
|
||||
: R.layout.notification_action_tombstone;
|
||||
return R.layout.notification_quantum_action_tombstone;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ import android.graphics.Color;
|
||||
import android.graphics.drawable.AnimationDrawable;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.VectorDrawable;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.text.Spanned;
|
||||
import android.text.style.TextAppearanceSpan;
|
||||
@@ -38,21 +39,21 @@ import java.util.WeakHashMap;
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public class LegacyNotificationUtil {
|
||||
public class NotificationColorUtil {
|
||||
|
||||
private static final String TAG = "LegacyNotificationUtil";
|
||||
private static final String TAG = "NotificationColorUtil";
|
||||
|
||||
private static final Object sLock = new Object();
|
||||
private static LegacyNotificationUtil sInstance;
|
||||
private static NotificationColorUtil sInstance;
|
||||
|
||||
private final ImageUtils mImageUtils = new ImageUtils();
|
||||
private final WeakHashMap<Bitmap, Pair<Boolean, Integer>> mGrayscaleBitmapCache =
|
||||
new WeakHashMap<Bitmap, Pair<Boolean, Integer>>();
|
||||
|
||||
public static LegacyNotificationUtil getInstance() {
|
||||
public static NotificationColorUtil getInstance() {
|
||||
synchronized (sLock) {
|
||||
if (sInstance == null) {
|
||||
sInstance = new LegacyNotificationUtil();
|
||||
sInstance = new NotificationColorUtil();
|
||||
}
|
||||
return sInstance;
|
||||
}
|
||||
@@ -107,6 +108,9 @@ public class LegacyNotificationUtil {
|
||||
AnimationDrawable ad = (AnimationDrawable) d;
|
||||
int count = ad.getNumberOfFrames();
|
||||
return count > 0 && isGrayscale(ad.getFrame(0));
|
||||
} else if (d instanceof VectorDrawable) {
|
||||
// We just assume you're doing the right thing if using vectors
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
@@ -18,5 +18,5 @@
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval">
|
||||
<solid
|
||||
android:color="@color/notification_icon_legacy_bg_color"/>
|
||||
android:color="@color/notification_icon_bg_color"/>
|
||||
</shape>
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
<drawable name="notification_template_icon_bg">#3333B5E5</drawable>
|
||||
<drawable name="notification_template_icon_low_bg">#0cffffff</drawable>
|
||||
|
||||
<color name="notification_icon_legacy_bg_color">#ff4285F4</color>
|
||||
<color name="notification_icon_bg_color">#ffa3a3a3</color>
|
||||
<color name="notification_action_legacy_color_filter">#ff555555</color>
|
||||
|
||||
<!-- Keyguard colors -->
|
||||
|
||||
@@ -1664,6 +1664,7 @@
|
||||
<java-symbol type="layout" name="notification_template_quantum_big_text" />
|
||||
<java-symbol type="layout" name="notification_template_quantum_inbox" />
|
||||
<java-symbol type="color" name="notification_action_legacy_color_filter" />
|
||||
<java-symbol type="color" name="notification_icon_bg_color" />
|
||||
<java-symbol type="drawable" name="notification_icon_legacy_bg_inset" />
|
||||
<java-symbol type="drawable" name="notification_quantum_bg_dim" />
|
||||
<java-symbol type="drawable" name="notification_quantum_bg" />
|
||||
|
||||
@@ -70,7 +70,7 @@ import android.widget.TextView;
|
||||
import com.android.internal.statusbar.IStatusBarService;
|
||||
import com.android.internal.statusbar.StatusBarIcon;
|
||||
import com.android.internal.statusbar.StatusBarIconList;
|
||||
import com.android.internal.util.LegacyNotificationUtil;
|
||||
import com.android.internal.util.NotificationColorUtil;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.RecentsComponent;
|
||||
import com.android.systemui.SearchPanelView;
|
||||
@@ -143,7 +143,7 @@ public abstract class BaseStatusBar extends SystemUI implements
|
||||
// public mode, private notifications, etc
|
||||
private boolean mLockscreenPublicMode = false;
|
||||
private final SparseBooleanArray mUsersAllowingPrivateNotifications = new SparseBooleanArray();
|
||||
private LegacyNotificationUtil mLegacyNotificationUtil = LegacyNotificationUtil.getInstance();
|
||||
private NotificationColorUtil mNotificationColorUtil = NotificationColorUtil.getInstance();
|
||||
|
||||
private UserManager mUserManager;
|
||||
|
||||
@@ -852,7 +852,7 @@ public abstract class BaseStatusBar extends SystemUI implements
|
||||
|
||||
Drawable iconDrawable = StatusBarIconView.getIcon(mContext, ic);
|
||||
icon.setImageDrawable(iconDrawable);
|
||||
if (mLegacyNotificationUtil.isGrayscale(iconDrawable)) {
|
||||
if (mNotificationColorUtil.isGrayscale(iconDrawable)) {
|
||||
icon.setBackgroundResource(
|
||||
com.android.internal.R.drawable.notification_icon_legacy_bg_inset);
|
||||
}
|
||||
|
||||
@@ -471,6 +471,7 @@ public class NotificationManagerService extends SystemService {
|
||||
pw.println(prefix + String.format(" defaults=0x%08x flags=0x%08x",
|
||||
notification.defaults, notification.flags));
|
||||
pw.println(prefix + " sound=" + notification.sound);
|
||||
pw.println(prefix + String.format(" color=0x%08x", notification.color));
|
||||
pw.println(prefix + " vibrate=" + Arrays.toString(notification.vibrate));
|
||||
pw.println(prefix + String.format(" led=0x%08x onMs=%d offMs=%d",
|
||||
notification.ledARGB, notification.ledOnMS, notification.ledOffMS));
|
||||
|
||||
Reference in New Issue
Block a user