am 82935916: am 033fe243: am bbe1682b: Merge changes from topic \'fix-media-notifications\' into mnc-dev
* commit '829359163dd8c26232627e781ef30ab1373d4463': Fully support Icons in Notification actions. Fix media notification action icons.
This commit is contained in:
@@ -930,9 +930,9 @@ public class Notification implements Parcelable
|
||||
private Action(Parcel in) {
|
||||
if (in.readInt() != 0) {
|
||||
mIcon = Icon.CREATOR.createFromParcel(in);
|
||||
}
|
||||
if (mIcon.getType() == Icon.TYPE_RESOURCE) {
|
||||
icon = mIcon.getResId();
|
||||
if (mIcon.getType() == Icon.TYPE_RESOURCE) {
|
||||
icon = mIcon.getResId();
|
||||
}
|
||||
}
|
||||
title = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
|
||||
if (in.readInt() == 1) {
|
||||
@@ -3174,7 +3174,8 @@ public class Notification implements Parcelable
|
||||
RemoteViews button = new BuilderRemoteViews(mContext.getApplicationInfo(),
|
||||
tombstone ? getActionTombstoneLayoutResource()
|
||||
: getActionLayoutResource());
|
||||
button.setTextViewCompoundDrawablesRelative(R.id.action0, action.icon, 0, 0, 0);
|
||||
final Icon ai = action.getIcon();
|
||||
button.setTextViewCompoundDrawablesRelative(R.id.action0, ai, null, null, null);
|
||||
button.setTextViewText(R.id.action0, processLegacyText(action.title));
|
||||
if (!tombstone) {
|
||||
button.setOnClickPendingIntent(R.id.action0, action.actionIntent);
|
||||
@@ -3193,7 +3194,7 @@ public class Notification implements Parcelable
|
||||
}
|
||||
|
||||
private void processLegacyAction(Action action, RemoteViews button) {
|
||||
if (!isLegacy() || mColorUtil.isGrayscaleIcon(mContext, action.icon)) {
|
||||
if (!isLegacy() || mColorUtil.isGrayscaleIcon(mContext, action.getIcon())) {
|
||||
button.setTextViewCompoundDrawablesRelativeColorFilter(R.id.action0, 0,
|
||||
mContext.getColor(R.color.notification_action_color_filter),
|
||||
PorterDuff.Mode.MULTIPLY);
|
||||
@@ -3608,7 +3609,6 @@ public class Notification implements Parcelable
|
||||
mContentText = extras.getCharSequence(EXTRA_TEXT);
|
||||
mSubText = extras.getCharSequence(EXTRA_SUB_TEXT);
|
||||
mContentInfo = extras.getCharSequence(EXTRA_INFO_TEXT);
|
||||
mSmallIcon = extras.getParcelable(EXTRA_SMALL_ICON);
|
||||
mProgress = extras.getInt(EXTRA_PROGRESS);
|
||||
mProgressMax = extras.getInt(EXTRA_PROGRESS_MAX);
|
||||
mProgressIndeterminate = extras.getBoolean(EXTRA_PROGRESS_INDETERMINATE);
|
||||
@@ -4442,7 +4442,7 @@ public class Notification implements Parcelable
|
||||
final boolean tombstone = (action.actionIntent == null);
|
||||
RemoteViews button = new BuilderRemoteViews(mBuilder.mContext.getApplicationInfo(),
|
||||
R.layout.notification_material_media_action);
|
||||
button.setImageViewResource(R.id.action0, action.icon);
|
||||
button.setImageViewIcon(R.id.action0, action.getIcon());
|
||||
button.setDrawableParameters(R.id.action0, false, -1,
|
||||
0xFFFFFFFF,
|
||||
PorterDuff.Mode.SRC_ATOP, -1);
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
package android.service.notification;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.os.UserHandle;
|
||||
@@ -40,6 +43,7 @@ public class StatusBarNotification implements Parcelable {
|
||||
private final long postTime;
|
||||
|
||||
private final int score;
|
||||
private Context mContext; // used for inflation & icon expansion
|
||||
|
||||
/** @hide */
|
||||
public StatusBarNotification(String pkg, String opPkg, int id, String tag, int uid,
|
||||
@@ -261,4 +265,24 @@ public class StatusBarNotification implements Parcelable {
|
||||
public String getGroupKey() {
|
||||
return groupKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
public Context getPackageContext(Context context) {
|
||||
if (mContext == null) {
|
||||
try {
|
||||
ApplicationInfo ai = context.getPackageManager()
|
||||
.getApplicationInfo(pkg, PackageManager.GET_UNINSTALLED_PACKAGES);
|
||||
mContext = context.createApplicationContext(ai,
|
||||
Context.CONTEXT_RESTRICTED);
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
mContext = null;
|
||||
}
|
||||
}
|
||||
if (mContext == null) {
|
||||
mContext = context;
|
||||
}
|
||||
return mContext;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1412,39 +1412,108 @@ public class RemoteViews implements Parcelable, Filter {
|
||||
public TextViewDrawableAction(int viewId, boolean isRelative, int d1, int d2, int d3, int d4) {
|
||||
this.viewId = viewId;
|
||||
this.isRelative = isRelative;
|
||||
this.useIcons = false;
|
||||
this.d1 = d1;
|
||||
this.d2 = d2;
|
||||
this.d3 = d3;
|
||||
this.d4 = d4;
|
||||
}
|
||||
|
||||
public TextViewDrawableAction(int viewId, boolean isRelative,
|
||||
Icon i1, Icon i2, Icon i3, Icon i4) {
|
||||
this.viewId = viewId;
|
||||
this.isRelative = isRelative;
|
||||
this.useIcons = true;
|
||||
this.i1 = i1;
|
||||
this.i2 = i2;
|
||||
this.i3 = i3;
|
||||
this.i4 = i4;
|
||||
}
|
||||
|
||||
public TextViewDrawableAction(Parcel parcel) {
|
||||
viewId = parcel.readInt();
|
||||
isRelative = (parcel.readInt() != 0);
|
||||
d1 = parcel.readInt();
|
||||
d2 = parcel.readInt();
|
||||
d3 = parcel.readInt();
|
||||
d4 = parcel.readInt();
|
||||
useIcons = (parcel.readInt() != 0);
|
||||
if (useIcons) {
|
||||
if (parcel.readInt() != 0) {
|
||||
i1 = Icon.CREATOR.createFromParcel(parcel);
|
||||
}
|
||||
if (parcel.readInt() != 0) {
|
||||
i2 = Icon.CREATOR.createFromParcel(parcel);
|
||||
}
|
||||
if (parcel.readInt() != 0) {
|
||||
i3 = Icon.CREATOR.createFromParcel(parcel);
|
||||
}
|
||||
if (parcel.readInt() != 0) {
|
||||
i4 = Icon.CREATOR.createFromParcel(parcel);
|
||||
}
|
||||
} else {
|
||||
d1 = parcel.readInt();
|
||||
d2 = parcel.readInt();
|
||||
d3 = parcel.readInt();
|
||||
d4 = parcel.readInt();
|
||||
}
|
||||
}
|
||||
|
||||
public void writeToParcel(Parcel dest, int flags) {
|
||||
dest.writeInt(TAG);
|
||||
dest.writeInt(viewId);
|
||||
dest.writeInt(isRelative ? 1 : 0);
|
||||
dest.writeInt(d1);
|
||||
dest.writeInt(d2);
|
||||
dest.writeInt(d3);
|
||||
dest.writeInt(d4);
|
||||
dest.writeInt(useIcons ? 1 : 0);
|
||||
if (useIcons) {
|
||||
if (i1 != null) {
|
||||
dest.writeInt(1);
|
||||
i1.writeToParcel(dest, 0);
|
||||
} else {
|
||||
dest.writeInt(0);
|
||||
}
|
||||
if (i2 != null) {
|
||||
dest.writeInt(1);
|
||||
i2.writeToParcel(dest, 0);
|
||||
} else {
|
||||
dest.writeInt(0);
|
||||
}
|
||||
if (i3 != null) {
|
||||
dest.writeInt(1);
|
||||
i3.writeToParcel(dest, 0);
|
||||
} else {
|
||||
dest.writeInt(0);
|
||||
}
|
||||
if (i4 != null) {
|
||||
dest.writeInt(1);
|
||||
i4.writeToParcel(dest, 0);
|
||||
} else {
|
||||
dest.writeInt(0);
|
||||
}
|
||||
} else {
|
||||
dest.writeInt(d1);
|
||||
dest.writeInt(d2);
|
||||
dest.writeInt(d3);
|
||||
dest.writeInt(d4);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void apply(View root, ViewGroup rootParent, OnClickHandler handler) {
|
||||
final TextView target = (TextView) root.findViewById(viewId);
|
||||
if (target == null) return;
|
||||
if (isRelative) {
|
||||
target.setCompoundDrawablesRelativeWithIntrinsicBounds(d1, d2, d3, d4);
|
||||
if (useIcons) {
|
||||
final Context ctx = target.getContext();
|
||||
final Drawable id1 = i1 == null ? null : i1.loadDrawable(ctx);
|
||||
final Drawable id2 = i2 == null ? null : i2.loadDrawable(ctx);
|
||||
final Drawable id3 = i3 == null ? null : i3.loadDrawable(ctx);
|
||||
final Drawable id4 = i4 == null ? null : i4.loadDrawable(ctx);
|
||||
if (isRelative) {
|
||||
target.setCompoundDrawablesRelativeWithIntrinsicBounds(id1, id2, id3, id4);
|
||||
} else {
|
||||
target.setCompoundDrawablesWithIntrinsicBounds(id1, id2, id3, id4);
|
||||
}
|
||||
} else {
|
||||
target.setCompoundDrawablesWithIntrinsicBounds(d1, d2, d3, d4);
|
||||
if (isRelative) {
|
||||
target.setCompoundDrawablesRelativeWithIntrinsicBounds(d1, d2, d3, d4);
|
||||
} else {
|
||||
target.setCompoundDrawablesWithIntrinsicBounds(d1, d2, d3, d4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1453,7 +1522,9 @@ public class RemoteViews implements Parcelable, Filter {
|
||||
}
|
||||
|
||||
boolean isRelative = false;
|
||||
boolean useIcons = false;
|
||||
int d1, d2, d3, d4;
|
||||
Icon i1, i2, i3, i4;
|
||||
|
||||
public final static int TAG = 11;
|
||||
}
|
||||
@@ -2066,6 +2137,41 @@ public class RemoteViews implements Parcelable, Filter {
|
||||
addAction(new TextViewDrawableColorFilterAction(viewId, true, index, color, mode));
|
||||
}
|
||||
|
||||
/**
|
||||
* Equivalent to calling {@link
|
||||
* TextView#setCompoundDrawablesWithIntrinsicBounds(Drawable, Drawable, Drawable, Drawable)}
|
||||
* using the drawables yielded by {@link Icon#loadDrawable(Context)}.
|
||||
*
|
||||
* @param viewId The id of the view whose text should change
|
||||
* @param left an Icon to place to the left of the text, or 0
|
||||
* @param top an Icon to place above the text, or 0
|
||||
* @param right an Icon to place to the right of the text, or 0
|
||||
* @param bottom an Icon to place below the text, or 0
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public void setTextViewCompoundDrawables(int viewId, Icon left, Icon top, Icon right, Icon bottom) {
|
||||
addAction(new TextViewDrawableAction(viewId, false, left, top, right, bottom));
|
||||
}
|
||||
|
||||
/**
|
||||
* Equivalent to calling {@link
|
||||
* TextView#setCompoundDrawablesRelativeWithIntrinsicBounds(Drawable, Drawable, Drawable, Drawable)}
|
||||
* using the drawables yielded by {@link Icon#loadDrawable(Context)}.
|
||||
*
|
||||
* @param viewId The id of the view whose text should change
|
||||
* @param start an Icon to place before the text (relative to the
|
||||
* layout direction), or 0
|
||||
* @param top an Icon to place above the text, or 0
|
||||
* @param end an Icon to place after the text, or 0
|
||||
* @param bottom an Icon to place below the text, or 0
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public void setTextViewCompoundDrawablesRelative(int viewId, Icon start, Icon top, Icon end, Icon bottom) {
|
||||
addAction(new TextViewDrawableAction(viewId, true, start, top, end, bottom));
|
||||
}
|
||||
|
||||
/**
|
||||
* Equivalent to calling ImageView.setImageResource
|
||||
*
|
||||
|
||||
@@ -2270,6 +2270,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
* @attr ref android.R.styleable#TextView_drawableRight
|
||||
* @attr ref android.R.styleable#TextView_drawableBottom
|
||||
*/
|
||||
@android.view.RemotableViewMethod
|
||||
public void setCompoundDrawablesWithIntrinsicBounds(@Nullable Drawable left,
|
||||
@Nullable Drawable top, @Nullable Drawable right, @Nullable Drawable bottom) {
|
||||
|
||||
@@ -2302,6 +2303,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
* @attr ref android.R.styleable#TextView_drawableEnd
|
||||
* @attr ref android.R.styleable#TextView_drawableBottom
|
||||
*/
|
||||
@android.view.RemotableViewMethod
|
||||
public void setCompoundDrawablesRelative(@Nullable Drawable start, @Nullable Drawable top,
|
||||
@Nullable Drawable end, @Nullable Drawable bottom) {
|
||||
Drawables dr = mDrawables;
|
||||
@@ -2472,6 +2474,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
* @attr ref android.R.styleable#TextView_drawableEnd
|
||||
* @attr ref android.R.styleable#TextView_drawableBottom
|
||||
*/
|
||||
@android.view.RemotableViewMethod
|
||||
public void setCompoundDrawablesRelativeWithIntrinsicBounds(@Nullable Drawable start,
|
||||
@Nullable Drawable top, @Nullable Drawable end, @Nullable Drawable bottom) {
|
||||
|
||||
|
||||
@@ -1328,14 +1328,20 @@ public abstract class BaseStatusBar extends SystemUI implements
|
||||
View bigContentViewLocal = null;
|
||||
View headsUpContentViewLocal = null;
|
||||
try {
|
||||
contentViewLocal = contentView.apply(mContext, contentContainer,
|
||||
contentViewLocal = contentView.apply(
|
||||
sbn.getPackageContext(mContext),
|
||||
contentContainer,
|
||||
mOnClickHandler);
|
||||
if (bigContentView != null) {
|
||||
bigContentViewLocal = bigContentView.apply(mContext, contentContainer,
|
||||
bigContentViewLocal = bigContentView.apply(
|
||||
sbn.getPackageContext(mContext),
|
||||
contentContainer,
|
||||
mOnClickHandler);
|
||||
}
|
||||
if (headsUpContentView != null) {
|
||||
headsUpContentViewLocal = headsUpContentView.apply(mContext, contentContainer,
|
||||
headsUpContentViewLocal = headsUpContentView.apply(
|
||||
sbn.getPackageContext(mContext),
|
||||
contentContainer,
|
||||
mOnClickHandler);
|
||||
}
|
||||
}
|
||||
@@ -1362,7 +1368,8 @@ public abstract class BaseStatusBar extends SystemUI implements
|
||||
View publicViewLocal = null;
|
||||
if (publicNotification != null) {
|
||||
try {
|
||||
publicViewLocal = publicNotification.contentView.apply(mContext,
|
||||
publicViewLocal = publicNotification.contentView.apply(
|
||||
sbn.getPackageContext(mContext),
|
||||
contentContainerPublic, mOnClickHandler);
|
||||
|
||||
if (publicViewLocal != null) {
|
||||
@@ -1981,15 +1988,18 @@ public abstract class BaseStatusBar extends SystemUI implements
|
||||
// Reapply the RemoteViews
|
||||
contentView.reapply(mContext, entry.getContentView(), mOnClickHandler);
|
||||
if (bigContentView != null && entry.getExpandedContentView() != null) {
|
||||
bigContentView.reapply(mContext, entry.getExpandedContentView(),
|
||||
bigContentView.reapply(notification.getPackageContext(mContext),
|
||||
entry.getExpandedContentView(),
|
||||
mOnClickHandler);
|
||||
}
|
||||
View headsUpChild = entry.getHeadsUpContentView();
|
||||
if (headsUpContentView != null && headsUpChild != null) {
|
||||
headsUpContentView.reapply(mContext, headsUpChild, mOnClickHandler);
|
||||
headsUpContentView.reapply(notification.getPackageContext(mContext),
|
||||
headsUpChild, mOnClickHandler);
|
||||
}
|
||||
if (publicContentView != null && entry.getPublicContentView() != null) {
|
||||
publicContentView.reapply(mContext, entry.getPublicContentView(), mOnClickHandler);
|
||||
publicContentView.reapply(notification.getPackageContext(mContext),
|
||||
entry.getPublicContentView(), mOnClickHandler);
|
||||
}
|
||||
// update the contentIntent
|
||||
mNotificationClicker.register(entry.row, notification);
|
||||
|
||||
Reference in New Issue
Block a user