Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cc3f3385 authored by Alan Viverette's avatar Alan Viverette
Browse files

Allow alpha modulation in ColorStateList items

This makes it much easier to define a disabled state color as an alpha
modulation of some base color.

Change-Id: Ie2ecf40b1f6560fcd8eda208d780616dddfc0d08
parent cba616d8
Loading
Loading
Loading
Loading
+30 −10
Original line number Diff line number Diff line
@@ -17,12 +17,14 @@
package android.content.res;

import android.graphics.Color;

import com.android.internal.util.ArrayUtils;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.util.AttributeSet;
import android.util.MathUtils;
import android.util.SparseArray;
import android.util.StateSet;
import android.util.Xml;
@@ -195,6 +197,8 @@ public class ColorStateList implements Parcelable {
                continue;
            }

            int alphaRes = 0;
            float alpha = 1.0f;
            int colorRes = 0;
            int color = 0xffff0000;
            boolean haveColor = false;
@@ -206,17 +210,20 @@ public class ColorStateList implements Parcelable {
            for (i = 0; i < numAttrs; i++) {
                final int stateResId = attrs.getAttributeNameResource(i);
                if (stateResId == 0) break;
                if (stateResId == com.android.internal.R.attr.color) {
                if (stateResId == com.android.internal.R.attr.alpha) {
                    alphaRes = attrs.getAttributeResourceValue(i, 0);
                    if (alphaRes == 0) {
                        alpha = attrs.getAttributeFloatValue(i, 1.0f);
                    }
                } else if (stateResId == com.android.internal.R.attr.color) {
                    colorRes = attrs.getAttributeResourceValue(i, 0);

                    if (colorRes == 0) {
                        color = attrs.getAttributeIntValue(i, color);
                        haveColor = true;
                    }
                } else {
                    stateSpec[j++] = attrs.getAttributeBooleanValue(i, false)
                                  ? stateResId
                                  : -stateResId;
                            ? stateResId : -stateResId;
                }
            }
            stateSpec = StateSet.trimStateSet(stateSpec, j);
@@ -229,6 +236,14 @@ public class ColorStateList implements Parcelable {
                        + ": <item> tag requires a 'android:color' attribute.");
            }

            if (alphaRes != 0) {
                alpha = r.getFraction(alphaRes, 1, 1);
            }

            // Apply alpha modulation.
            final int alphaMod = MathUtils.constrain((int) (Color.alpha(color) * alpha), 0, 255);
            color = (color & 0xFFFFFF) | (alphaMod << 24);

            if (listSize == 0 || stateSpec.length == 0) {
                mDefaultColor = color;
            }
@@ -300,6 +315,7 @@ public class ColorStateList implements Parcelable {
        return mDefaultColor;
    }

    @Override
    public String toString() {
        return "ColorStateList{" +
               "mStateSpecs=" + Arrays.deepToString(mStateSpecs) +
@@ -307,10 +323,12 @@ public class ColorStateList implements Parcelable {
               "mDefaultColor=" + mDefaultColor + '}';
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        final int N = mStateSpecs.length;
        dest.writeInt(N);
@@ -322,17 +340,19 @@ public class ColorStateList implements Parcelable {

    public static final Parcelable.Creator<ColorStateList> CREATOR =
            new Parcelable.Creator<ColorStateList>() {
        @Override
        public ColorStateList[] newArray(int size) {
            return new ColorStateList[size];
        }

        @Override
        public ColorStateList createFromParcel(Parcel source) {
            final int N = source.readInt();
            int[][] stateSpecs = new int[N][];
            final int[][] stateSpecs = new int[N][];
            for (int i = 0; i < N; i++) {
                stateSpecs[i] = source.createIntArray();
            }
            int[] colors = source.createIntArray();
            final int[] colors = source.createIntArray();
            return new ColorStateList(stateSpecs, colors);
        }
    };