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.res.ColorStateList; 20469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.Canvas; 21469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.ColorFilter; 22469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.PorterDuff; 23469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.Rect; 24469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.Region; 25469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.drawable.Drawable; 26469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.graphics.drawable.DrawableContainer; 27469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.os.Build; 28469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.support.v4.graphics.drawable.DrawableCompat; 29469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesimport android.view.View; 30469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 31469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes/** 32469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * Base wrapper that delegates all calls to another {@link Drawable}. The wrapped {@link Drawable} 33469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * <em>must</em> be fully released from any {@link View} before wrapping, otherwise internal {@link 34469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * Drawable.Callback} may be dropped. 35469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes */ 36469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banesclass DrawableWrapper extends Drawable implements Drawable.Callback { 37469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 38a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes private Drawable mDrawable; 39469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 40469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public DrawableWrapper(Drawable drawable) { 41a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes setWrappedDrawable(drawable); 42469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 43469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 44469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 45469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public void draw(Canvas canvas) { 46469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes mDrawable.draw(canvas); 47469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 48469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 49469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 50469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public void setBounds(int left, int top, int right, int bottom) { 51469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes super.setBounds(left, top, right, bottom); 52469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes mDrawable.setBounds(left, top, right, bottom); 53469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 54469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 55469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 56469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public void setChangingConfigurations(int configs) { 57469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes mDrawable.setChangingConfigurations(configs); 58469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 59469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 60469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 61469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getChangingConfigurations() { 62469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mDrawable.getChangingConfigurations(); 63469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 64469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 65469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 66469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public void setDither(boolean dither) { 67469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes mDrawable.setDither(dither); 68469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 69469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 70469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 71469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public void setFilterBitmap(boolean filter) { 72469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes mDrawable.setFilterBitmap(filter); 73469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 74469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 75469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 76469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public void setAlpha(int alpha) { 77469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes mDrawable.setAlpha(alpha); 78469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 79469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 80469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 81469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public void setColorFilter(ColorFilter cf) { 82469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes mDrawable.setColorFilter(cf); 83469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 84469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 85469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 86469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public boolean isStateful() { 87469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mDrawable.isStateful(); 88469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 89469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 90469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 91469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public boolean setState(final int[] stateSet) { 92469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mDrawable.setState(stateSet); 93469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 94469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 95469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 96469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int[] getState() { 97469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mDrawable.getState(); 98469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 99469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 100469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public void jumpToCurrentState() { 101469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes DrawableCompat.jumpToCurrentState(mDrawable); 102469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 103469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 104469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 105469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public Drawable getCurrent() { 106469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mDrawable.getCurrent(); 107469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 108469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 109469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 110469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public boolean setVisible(boolean visible, boolean restart) { 111469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return super.setVisible(visible, restart) || mDrawable.setVisible(visible, restart); 112469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 113469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 114469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 115469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getOpacity() { 116469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mDrawable.getOpacity(); 117469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 118469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 119469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 120469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public Region getTransparentRegion() { 121469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mDrawable.getTransparentRegion(); 122469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 123469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 124469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 125469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getIntrinsicWidth() { 126469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mDrawable.getIntrinsicWidth(); 127469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 128469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 129469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 130469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getIntrinsicHeight() { 131469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mDrawable.getIntrinsicHeight(); 132469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 133469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 134469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 135469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getMinimumWidth() { 136469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mDrawable.getMinimumWidth(); 137469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 138469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 139469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 140469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public int getMinimumHeight() { 141469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mDrawable.getMinimumHeight(); 142469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 143469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 144469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 145469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public boolean getPadding(Rect padding) { 146469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mDrawable.getPadding(padding); 147469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 148469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 149469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes /** 150469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * {@inheritDoc} 151469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes */ 152469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public void invalidateDrawable(Drawable who) { 153469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes invalidateSelf(); 154469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 155469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 156469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes /** 157469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * {@inheritDoc} 158469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes */ 159469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public void scheduleDrawable(Drawable who, Runnable what, long when) { 160469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes scheduleSelf(what, when); 161469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 162469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 163469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes /** 164469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes * {@inheritDoc} 165469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes */ 166469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public void unscheduleDrawable(Drawable who, Runnable what) { 167469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes unscheduleSelf(what); 168469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 169469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 170469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 171469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes protected boolean onLevelChange(int level) { 172469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return mDrawable.setLevel(level); 173469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 174469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 175469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 176469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public void setAutoMirrored(boolean mirrored) { 177469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes DrawableCompat.setAutoMirrored(mDrawable, mirrored); 178469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 179469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 180469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 181469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public boolean isAutoMirrored() { 182469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes return DrawableCompat.isAutoMirrored(mDrawable); 183469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 184469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 185469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 186469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public void setTint(int tint) { 187469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes DrawableCompat.setTint(mDrawable, tint); 188469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 189469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 190469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 191469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public void setTintList(ColorStateList tint) { 192469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes DrawableCompat.setTintList(mDrawable, tint); 193469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 194469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes 195469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes @Override 196469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes public void setTintMode(PorterDuff.Mode tintMode) { 197469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes DrawableCompat.setTintMode(mDrawable, tintMode); 198469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes } 19980e66c1609421dacff3e49770411e201039aa1d8Chris Banes 20080e66c1609421dacff3e49770411e201039aa1d8Chris Banes @Override 20180e66c1609421dacff3e49770411e201039aa1d8Chris Banes public void setHotspot(float x, float y) { 20280e66c1609421dacff3e49770411e201039aa1d8Chris Banes DrawableCompat.setHotspot(mDrawable, x, y); 20380e66c1609421dacff3e49770411e201039aa1d8Chris Banes } 20480e66c1609421dacff3e49770411e201039aa1d8Chris Banes 20580e66c1609421dacff3e49770411e201039aa1d8Chris Banes @Override 20680e66c1609421dacff3e49770411e201039aa1d8Chris Banes public void setHotspotBounds(int left, int top, int right, int bottom) { 20780e66c1609421dacff3e49770411e201039aa1d8Chris Banes DrawableCompat.setHotspotBounds(mDrawable, left, top, right, bottom); 20880e66c1609421dacff3e49770411e201039aa1d8Chris Banes } 209a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes 210a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes public Drawable getWrappedDrawable() { 211a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes return mDrawable; 212a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes } 213a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes 214a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes public void setWrappedDrawable(Drawable drawable) { 215a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes if (mDrawable != null) { 216a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes mDrawable.setCallback(null); 217a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes } 218a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes 219a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes mDrawable = drawable; 220a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes 221a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes if (drawable != null) { 222a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes drawable.setCallback(this); 223a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes } 224a9585dae398a69dd67797e7ca86f44ffcabd9e86Chris Banes } 225469286122bcbbecbdd0bef74fb50f9d8920e77b9Chris Banes} 226