1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package android.support.v7.graphics.drawable; 18 19import android.content.res.ColorStateList; 20import android.graphics.Canvas; 21import android.graphics.ColorFilter; 22import android.graphics.PorterDuff; 23import android.graphics.Rect; 24import android.graphics.Region; 25import android.graphics.drawable.Drawable; 26import android.support.v4.graphics.drawable.DrawableCompat; 27import android.view.View; 28 29/** 30 * Drawable which delegates all calls to it's wrapped {@link Drawable}. 31 * <p> 32 * The wrapped {@link Drawable} <em>must</em> be fully released from any {@link View} 33 * before wrapping, otherwise internal {@link Drawable.Callback} may be dropped. 34 * 35 * @hide 36 */ 37public class DrawableWrapper extends Drawable implements Drawable.Callback { 38 39 private Drawable mDrawable; 40 41 public DrawableWrapper(Drawable drawable) { 42 setWrappedDrawable(drawable); 43 } 44 45 @Override 46 public void draw(Canvas canvas) { 47 mDrawable.draw(canvas); 48 } 49 50 @Override 51 protected void onBoundsChange(Rect bounds) { 52 mDrawable.setBounds(bounds); 53 } 54 55 @Override 56 public void setChangingConfigurations(int configs) { 57 mDrawable.setChangingConfigurations(configs); 58 } 59 60 @Override 61 public int getChangingConfigurations() { 62 return mDrawable.getChangingConfigurations(); 63 } 64 65 @Override 66 public void setDither(boolean dither) { 67 mDrawable.setDither(dither); 68 } 69 70 @Override 71 public void setFilterBitmap(boolean filter) { 72 mDrawable.setFilterBitmap(filter); 73 } 74 75 @Override 76 public void setAlpha(int alpha) { 77 mDrawable.setAlpha(alpha); 78 } 79 80 @Override 81 public void setColorFilter(ColorFilter cf) { 82 mDrawable.setColorFilter(cf); 83 } 84 85 @Override 86 public boolean isStateful() { 87 return mDrawable.isStateful(); 88 } 89 90 @Override 91 public boolean setState(final int[] stateSet) { 92 return mDrawable.setState(stateSet); 93 } 94 95 @Override 96 public int[] getState() { 97 return mDrawable.getState(); 98 } 99 100 public void jumpToCurrentState() { 101 DrawableCompat.jumpToCurrentState(mDrawable); 102 } 103 104 @Override 105 public Drawable getCurrent() { 106 return mDrawable.getCurrent(); 107 } 108 109 @Override 110 public boolean setVisible(boolean visible, boolean restart) { 111 return super.setVisible(visible, restart) || mDrawable.setVisible(visible, restart); 112 } 113 114 @Override 115 public int getOpacity() { 116 return mDrawable.getOpacity(); 117 } 118 119 @Override 120 public Region getTransparentRegion() { 121 return mDrawable.getTransparentRegion(); 122 } 123 124 @Override 125 public int getIntrinsicWidth() { 126 return mDrawable.getIntrinsicWidth(); 127 } 128 129 @Override 130 public int getIntrinsicHeight() { 131 return mDrawable.getIntrinsicHeight(); 132 } 133 134 @Override 135 public int getMinimumWidth() { 136 return mDrawable.getMinimumWidth(); 137 } 138 139 @Override 140 public int getMinimumHeight() { 141 return mDrawable.getMinimumHeight(); 142 } 143 144 @Override 145 public boolean getPadding(Rect padding) { 146 return mDrawable.getPadding(padding); 147 } 148 149 /** 150 * {@inheritDoc} 151 */ 152 public void invalidateDrawable(Drawable who) { 153 invalidateSelf(); 154 } 155 156 /** 157 * {@inheritDoc} 158 */ 159 public void scheduleDrawable(Drawable who, Runnable what, long when) { 160 scheduleSelf(what, when); 161 } 162 163 /** 164 * {@inheritDoc} 165 */ 166 public void unscheduleDrawable(Drawable who, Runnable what) { 167 unscheduleSelf(what); 168 } 169 170 @Override 171 protected boolean onLevelChange(int level) { 172 return mDrawable.setLevel(level); 173 } 174 175 @Override 176 public void setAutoMirrored(boolean mirrored) { 177 DrawableCompat.setAutoMirrored(mDrawable, mirrored); 178 } 179 180 @Override 181 public boolean isAutoMirrored() { 182 return DrawableCompat.isAutoMirrored(mDrawable); 183 } 184 185 @Override 186 public void setTint(int tint) { 187 DrawableCompat.setTint(mDrawable, tint); 188 } 189 190 @Override 191 public void setTintList(ColorStateList tint) { 192 DrawableCompat.setTintList(mDrawable, tint); 193 } 194 195 @Override 196 public void setTintMode(PorterDuff.Mode tintMode) { 197 DrawableCompat.setTintMode(mDrawable, tintMode); 198 } 199 200 @Override 201 public void setHotspot(float x, float y) { 202 DrawableCompat.setHotspot(mDrawable, x, y); 203 } 204 205 @Override 206 public void setHotspotBounds(int left, int top, int right, int bottom) { 207 DrawableCompat.setHotspotBounds(mDrawable, left, top, right, bottom); 208 } 209 210 public Drawable getWrappedDrawable() { 211 return mDrawable; 212 } 213 214 public void setWrappedDrawable(Drawable drawable) { 215 if (mDrawable != null) { 216 mDrawable.setCallback(null); 217 } 218 219 mDrawable = drawable; 220 221 if (drawable != null) { 222 drawable.setCallback(this); 223 } 224 } 225} 226