1469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes/* 2469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * Copyright (C) 2014 The Android Open Source Project 3469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * 4469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 5469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * you may not use this file except in compliance with the License. 6469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * You may obtain a copy of the License at 7469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * 8469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * http://www.apache.org/licenses/LICENSE-2.0 9469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * 10469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * Unless required by applicable law or agreed to in writing, software 11469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * distributed under the License is distributed on an "AS IS" BASIS, 12469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * See the License for the specific language governing permissions and 14469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * limitations under the License. 15469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes */ 16469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 17469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banespackage android.support.v7.internal.widget; 18469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 19469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.content.Context; 20469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.content.res.ColorStateList; 21469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.content.res.Resources; 22469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.content.res.TypedArray; 23469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.drawable.Drawable; 24469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.util.AttributeSet; 25469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.util.TypedValue; 26469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 27469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes/** 28469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * A class that wraps a {@link android.content.res.TypedArray} and provides the same public API 29469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * surface. The purpose of this class is so that we can intercept the {@link #getDrawable(int)} 30469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * call and tint the result. 31469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * 32469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * @hide 33469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes */ 34469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banespublic class TintTypedArray { 35469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 36469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes private final Context mContext; 37469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes private final TypedArray mWrapped; 38469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 39469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes private TintManager mTintManager; 40469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 41469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public static TintTypedArray obtainStyledAttributes(Context context, AttributeSet set, 42469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes int[] attrs) { 43469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes TypedArray array = context.obtainStyledAttributes(set, attrs); 44469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return new TintTypedArray(context, array); 45469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 46469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 47469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public static TintTypedArray obtainStyledAttributes(Context context, AttributeSet set, 48469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes int[] attrs, int defStyleAttr, int defStyleRes) { 49469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes TypedArray array = context.obtainStyledAttributes(set, attrs, defStyleAttr, defStyleRes); 50469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return new TintTypedArray(context, array); 51469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 52469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 53469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes private TintTypedArray(Context context, TypedArray array) { 54469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes mContext = context; 55469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes mWrapped = array; 56469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 57469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 58469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public Drawable getDrawable(int index) { 59469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes if (mWrapped.hasValue(index)) { 60469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes final int resourceId = mWrapped.getResourceId(index, 0); 61e13edbefc9ab32deb08d2352490778ab666b65f5Chris Banes if (resourceId != 0) { 62e13edbefc9ab32deb08d2352490778ab666b65f5Chris Banes return getTintManager().getDrawable(resourceId); 63e13edbefc9ab32deb08d2352490778ab666b65f5Chris Banes } 64469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 65469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getDrawable(index); 66469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 67469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 684ab820f4155444d20b37e105873775dd71907eefChris Banes public Drawable getDrawableIfKnown(int index) { 694ab820f4155444d20b37e105873775dd71907eefChris Banes if (mWrapped.hasValue(index)) { 704ab820f4155444d20b37e105873775dd71907eefChris Banes final int resourceId = mWrapped.getResourceId(index, 0); 714ab820f4155444d20b37e105873775dd71907eefChris Banes if (resourceId != 0) { 724ab820f4155444d20b37e105873775dd71907eefChris Banes return getTintManager().getDrawable(resourceId, true); 734ab820f4155444d20b37e105873775dd71907eefChris Banes } 744ab820f4155444d20b37e105873775dd71907eefChris Banes } 754ab820f4155444d20b37e105873775dd71907eefChris Banes return null; 764ab820f4155444d20b37e105873775dd71907eefChris Banes } 774ab820f4155444d20b37e105873775dd71907eefChris Banes 78469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int length() { 79469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.length(); 80469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 81469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 82469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getIndexCount() { 83469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getIndexCount(); 84469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 85469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 86469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getIndex(int at) { 87469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getIndex(at); 88469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 89469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 90469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public Resources getResources() { 91469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getResources(); 92469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 93469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 94469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public CharSequence getText(int index) { 95469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getText(index); 96469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 97469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 98469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public String getString(int index) { 99469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getString(index); 100469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 101469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 102469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public String getNonResourceString(int index) { 103469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getNonResourceString(index); 104469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 105469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 106469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public boolean getBoolean(int index, boolean defValue) { 107469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getBoolean(index, defValue); 108469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 109469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 110469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getInt(int index, int defValue) { 111469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getInt(index, defValue); 112469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 113469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 114469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public float getFloat(int index, float defValue) { 115469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getFloat(index, defValue); 116469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 117469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 118469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getColor(int index, int defValue) { 119469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getColor(index, defValue); 120469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 121469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 122469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public ColorStateList getColorStateList(int index) { 123469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getColorStateList(index); 124469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 125469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 126469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getInteger(int index, int defValue) { 127469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getInteger(index, defValue); 128469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 129469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 130469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public float getDimension(int index, float defValue) { 131469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getDimension(index, defValue); 132469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 133469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 134469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getDimensionPixelOffset(int index, int defValue) { 135469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getDimensionPixelOffset(index, defValue); 136469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 137469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 138469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getDimensionPixelSize(int index, int defValue) { 139469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getDimensionPixelSize(index, defValue); 140469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 141469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 142469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getLayoutDimension(int index, String name) { 143469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getLayoutDimension(index, name); 144469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 145469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 146469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getLayoutDimension(int index, int defValue) { 147469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getLayoutDimension(index, defValue); 148469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 149469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 150469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public float getFraction(int index, int base, int pbase, float defValue) { 151469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getFraction(index, base, pbase, defValue); 152469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 153469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 154469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getResourceId(int index, int defValue) { 155469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getResourceId(index, defValue); 156469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 157469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 158469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public CharSequence[] getTextArray(int index) { 159469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getTextArray(index); 160469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 161469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 162469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public boolean getValue(int index, TypedValue outValue) { 163469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getValue(index, outValue); 164469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 165469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 166469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getType(int index) { 167469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getType(index); 168469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 169469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 170469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public boolean hasValue(int index) { 171469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.hasValue(index); 172469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 173469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 174469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public TypedValue peekValue(int index) { 175469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.peekValue(index); 176469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 177469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 178469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public String getPositionDescription() { 179469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getPositionDescription(); 180469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 181469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 182469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public void recycle() { 183469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes mWrapped.recycle(); 184469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 185469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 186469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getChangingConfigurations() { 187469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mWrapped.getChangingConfigurations(); 188469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 189469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 190469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public TintManager getTintManager() { 191469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes if (mTintManager == null) { 192cd6e77607caba0b3b26163791a361938afb8b9c5Chris Banes mTintManager = TintManager.get(mContext); 193469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 194469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mTintManager; 195469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 196469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 197469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes} 198