Merge "Allow an icon to carry a tint with it, wherever it goes." into mnc-dev

This commit is contained in:
Dan Sandler
2015-06-24 02:10:23 +00:00
committed by Android (Google) Code Review
4 changed files with 113 additions and 4 deletions

View File

@@ -12453,6 +12453,9 @@ package android.graphics.drawable {
method public android.graphics.drawable.Drawable loadDrawable(android.content.Context);
method public void loadDrawableAsync(android.content.Context, android.os.Message);
method public void loadDrawableAsync(android.content.Context, android.graphics.drawable.Icon.OnDrawableLoadedListener, android.os.Handler);
method public android.graphics.drawable.Icon setTint(int);
method public android.graphics.drawable.Icon setTintList(android.content.res.ColorStateList);
method public android.graphics.drawable.Icon setTintMode(android.graphics.PorterDuff.Mode);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.graphics.drawable.Icon> CREATOR;
}

View File

@@ -12779,6 +12779,9 @@ package android.graphics.drawable {
method public android.graphics.drawable.Drawable loadDrawable(android.content.Context);
method public void loadDrawableAsync(android.content.Context, android.os.Message);
method public void loadDrawableAsync(android.content.Context, android.graphics.drawable.Icon.OnDrawableLoadedListener, android.os.Handler);
method public android.graphics.drawable.Icon setTint(int);
method public android.graphics.drawable.Icon setTintList(android.content.res.ColorStateList);
method public android.graphics.drawable.Icon setTintMode(android.graphics.PorterDuff.Mode);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.graphics.drawable.Icon> CREATOR;
}

View File

@@ -67,4 +67,38 @@ public class PorterDuff {
*/
public final int nativeInt;
}
/**
* @hide
*/
public static final int modeToInt(Mode mode) {
return mode.nativeInt;
}
/**
* @hide
*/
public static final Mode intToMode(int val) {
switch (val) {
default:
case 0: return Mode.CLEAR;
case 1: return Mode.SRC;
case 2: return Mode.DST;
case 3: return Mode.SRC_OVER;
case 4: return Mode.DST_OVER;
case 5: return Mode.SRC_IN;
case 6: return Mode.DST_IN;
case 7: return Mode.SRC_OUT;
case 8: return Mode.DST_OUT;
case 9: return Mode.SRC_ATOP;
case 10: return Mode.DST_ATOP;
case 11: return Mode.XOR;
case 16: return Mode.DARKEN;
case 17: return Mode.LIGHTEN;
case 13: return Mode.MULTIPLY;
case 14: return Mode.SCREEN;
case 12: return Mode.ADD;
case 15: return Mode.OVERLAY;
}
}
}

View File

@@ -16,13 +16,16 @@
package android.graphics.drawable;
import android.annotation.ColorInt;
import android.annotation.DrawableRes;
import android.content.res.ColorStateList;
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PorterDuff;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Handler;
@@ -67,6 +70,10 @@ public final class Icon implements Parcelable {
private final int mType;
private ColorStateList mTintList;
static final PorterDuff.Mode DEFAULT_TINT_MODE = Drawable.DEFAULT_TINT_MODE; // SRC_IN
private PorterDuff.Mode mTintMode = DEFAULT_TINT_MODE;
// To avoid adding unnecessary overhead, we have a few basic objects that get repurposed
// based on the value of mType.
@@ -258,6 +265,19 @@ public final class Icon implements Parcelable {
* @return A fresh instance of a drawable for this image, yours to keep.
*/
public Drawable loadDrawable(Context context) {
final Drawable result = loadDrawableInner(context);
if (result != null && (mTintList != null || mTintMode != DEFAULT_TINT_MODE)) {
result.mutate();
result.setTintList(mTintList);
result.setTintMode(mTintMode);
}
return result;
}
/**
* Do the heavy lifting of loading the drawable, but stop short of applying any tint.
*/
private Drawable loadDrawableInner(Context context) {
switch (mType) {
case TYPE_BITMAP:
return new BitmapDrawable(context.getResources(), getBitmap());
@@ -531,6 +551,38 @@ public final class Icon implements Parcelable {
return rep;
}
/**
* Store a color to use whenever this Icon is drawn.
*
* @param tint a color, as in {@link Drawable#setTint(int)}
* @return this same object, for use in chained construction
*/
public Icon setTint(@ColorInt int tint) {
return setTintList(ColorStateList.valueOf(tint));
}
/**
* Store a color to use whenever this Icon is drawn.
*
* @param tintList as in {@link Drawable#setTintList(ColorStateList)}, null to remove tint
* @return this same object, for use in chained construction
*/
public Icon setTintList(ColorStateList tintList) {
mTintList = tintList;
return this;
}
/**
* Store a blending mode to use whenever this Icon is drawn.
*
* @param mode a blending mode, as in {@link Drawable#setTintMode(PorterDuff.Mode)}, may be null
* @return this same object, for use in chained construction
*/
public Icon setTintMode(PorterDuff.Mode mode) {
mTintMode = mode;
return this;
}
/**
* Create an Icon pointing to an image file specified by path.
*
@@ -572,6 +624,15 @@ public final class Icon implements Parcelable {
sb.append(" uri=").append(getUriString());
break;
}
if (mTintList != null) {
sb.append(" tint=");
String sep = "";
for (int c : mTintList.getColors()) {
sb.append(String.format("%s0x%08x", sep, c));
sep = "|";
}
}
if (mTintMode != DEFAULT_TINT_MODE) sb.append(" mode=").append(mTintMode);
sb.append(")");
return sb.toString();
}
@@ -617,31 +678,39 @@ public final class Icon implements Parcelable {
throw new RuntimeException("invalid "
+ this.getClass().getSimpleName() + " type in parcel: " + mType);
}
if (in.readInt() == 1) {
mTintList = ColorStateList.CREATOR.createFromParcel(in);
}
mTintMode = PorterDuff.intToMode(in.readInt());
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mType);
switch (mType) {
case TYPE_BITMAP:
final Bitmap bits = getBitmap();
dest.writeInt(TYPE_BITMAP);
getBitmap().writeToParcel(dest, flags);
break;
case TYPE_RESOURCE:
dest.writeInt(TYPE_RESOURCE);
dest.writeString(getResPackage());
dest.writeInt(getResId());
break;
case TYPE_DATA:
dest.writeInt(TYPE_DATA);
dest.writeInt(getDataLength());
dest.writeBlob(getDataBytes(), getDataOffset(), getDataLength());
break;
case TYPE_URI:
dest.writeInt(TYPE_URI);
dest.writeString(getUriString());
break;
}
if (mTintList == null) {
dest.writeInt(0);
} else {
dest.writeInt(1);
mTintList.writeToParcel(dest, flags);
}
dest.writeInt(PorterDuff.modeToInt(mTintMode));
}
public static final Parcelable.Creator<Icon> CREATOR