19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.graphics.drawable;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
197dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craikimport android.annotation.NonNull;
20e7772d313b88e9fd3366670a9c8d1b145edef344Alan Viveretteimport android.content.res.ColorStateList;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
2252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viveretteimport android.content.res.Resources.Theme;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
2478aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Bitmap;
2578aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.BitmapFactory;
2678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Canvas;
27b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.Color;
2878aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.ColorFilter;
29b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.Insets;
3078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.NinePatch;
31b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craikimport android.graphics.Outline;
3278aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.PixelFormat;
3378aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.PorterDuff;
34b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.PorterDuff.Mode;
3578aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.PorterDuffColorFilter;
3678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Rect;
3778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Region;
38b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.Xfermode;
39b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.os.Trace;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
4111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackbornimport android.util.DisplayMetrics;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.StateSet;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue;
4478aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.util.Xml;
45d9273d6f289d9b55da3fd0db2f659fdfb48106a8Tor Norbyeimport android.view.View;
4678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne
47b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport org.xmlpull.v1.XmlPullParser;
48b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport org.xmlpull.v1.XmlPullParserException;
49b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
5078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport java.io.IOException;
5178aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport java.io.InputStream;
52f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guyimport java.lang.ref.WeakReference;
5378aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport java.util.Arrays;
54dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reckimport java.util.Collection;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A Drawable is a general abstraction for "something that can be drawn."  Most
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * often you will deal with Drawable as the type of resource retrieved for
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawing things to the screen; the Drawable class provides a generic API for
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dealing with an underlying visual resource that may take a variety of forms.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlike a {@link android.view.View}, a Drawable does not have any facility to
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receive events or otherwise interact with the user.
6323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy *
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In addition to simple drawing, Drawable provides a number of generic
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mechanisms for its client to interact with what is being drawn:
6623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy *
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> The {@link #setBounds} method <var>must</var> be called to tell the
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     Drawable where it is drawn and how large it should be.  All Drawables
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     should respect the requested size, often simply by scaling their
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     imagery.  A client can find the preferred size for some Drawables with
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     the {@link #getIntrinsicHeight} and {@link #getIntrinsicWidth} methods.
7323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy *
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> The {@link #getPadding} method can return from some Drawables
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     information about how to frame content that is placed inside of them.
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     For example, a Drawable that is intended to be the frame for a button
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     widget would need to return padding that correctly places the label
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     inside of itself.
7923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy *
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> The {@link #setState} method allows the client to tell the Drawable
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     in which state it is to be drawn, such as "focused", "selected", etc.
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     Some drawables may modify their imagery based on the selected state.
8323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy *
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> The {@link #setLevel} method allows the client to supply a single
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     continuous controller that can modify the Drawable is displayed, such as
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     a battery level or progress level.  Some drawables may modify their
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     imagery based on the current level.
8823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy *
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> A Drawable can perform animations by calling back to its client
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     through the {@link Callback} interface.  All clients should support this
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     interface (via {@link #setCallback}) so that animations will work.  A
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     simple way to do this is through the system facilities such as
93d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette *     {@link android.view.View#setBackground(Drawable)} and
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link android.widget.ImageView}.
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
9623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy *
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Though usually not visible to the application, Drawables may take a variety
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of forms:
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <b>Bitmap</b>: the simplest Drawable, a PNG or JPEG image.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <b>Nine Patch</b>: an extension to the PNG format allows it to
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     specify information about how to stretch it and place things inside of
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     it.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <b>Shape</b>: contains simple drawing commands instead of a raw
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     bitmap, allowing it to resize better in some cases.
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <b>Layers</b>: a compound drawable, which draws multiple underlying
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     drawables on top of each other.
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <b>States</b>: a compound drawable that selects one of a set of
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     drawables based on its state.
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <b>Levels</b>: a compound drawable that selects one of a set of
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     drawables based on its level.
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <b>Scale</b>: a compound drawable with a single child drawable,
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     whose overall size is modified based on the current level.
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
11661fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez *
11761fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <div class="special reference">
11861fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <h3>Developer Guides</h3>
11961fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <p>For more information about how to use drawables, read the
12061fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <a href="{@docRoot}guide/topics/graphics/2d-graphics.html">Canvas and Drawables</a> developer
12161fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * guide. For information and examples of creating drawable resources (XML or bitmap files that
12261fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * can be loaded in code), read the
12361fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>
12461fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * document.</p></div>
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class Drawable {
12723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy    private static final Rect ZERO_BOUNDS_RECT = new Rect();
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
129607bd848269fb802550e63aa61945790616f97a7Alan Viverette    static final PorterDuff.Mode DEFAULT_TINT_MODE = PorterDuff.Mode.SRC_IN;
130607bd848269fb802550e63aa61945790616f97a7Alan Viverette
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int[] mStateSet = StateSet.WILD_CARD;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mLevel = 0;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mChangingConfigurations = 0;
1340f07b2c850ee1462ca4cf3137a954a9fc4bdf773Brad Fitzpatrick    private Rect mBounds = ZERO_BOUNDS_RECT;  // lazily becomes a new Rect()
135f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy    private WeakReference<Callback> mCallback = null;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mVisible = true;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
138b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio    private int mLayoutDirection;
139b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Draw in its bounds (set via setBounds) respecting optional effects such
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as alpha (set via setAlpha) and color filter (set via setColorFilter).
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param canvas The canvas to draw into
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14616f1d81d47beb1e04504a76de66e2919dde08c33Alan Viverette    public abstract void draw(Canvas canvas);
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specify a bounding rectangle for the Drawable. This is where the drawable
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will draw when its draw() method is called.
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setBounds(int left, int top, int right, int bottom) {
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Rect oldBounds = mBounds;
15423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
15523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy        if (oldBounds == ZERO_BOUNDS_RECT) {
15623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy            oldBounds = mBounds = new Rect();
15723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy        }
15823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (oldBounds.left != left || oldBounds.top != top ||
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                oldBounds.right != right || oldBounds.bottom != bottom) {
16116f1d81d47beb1e04504a76de66e2919dde08c33Alan Viverette            if (!oldBounds.isEmpty()) {
16216f1d81d47beb1e04504a76de66e2919dde08c33Alan Viverette                // first invalidate the previous bounds
16316f1d81d47beb1e04504a76de66e2919dde08c33Alan Viverette                invalidateSelf();
164633326e29f008d2b86e523cfeedcbb2a0883181fChet Haase            }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBounds.set(left, top, right, bottom);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onBoundsChange(mBounds);
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specify a bounding rectangle for the Drawable. This is where the drawable
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will draw when its draw() method is called.
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setBounds(Rect bounds) {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setBounds(bounds.left, bounds.top, bounds.right, bounds.bottom);
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return a copy of the drawable's bounds in the specified Rect (allocated
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by the caller). The bounds specify where this will draw when its draw()
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method is called.
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param bounds Rect to receive the drawable's bounds (allocated by the
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               caller).
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void copyBounds(Rect bounds) {
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bounds.set(mBounds);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return a copy of the drawable's bounds in a new Rect. This returns the
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * same values as getBounds(), but the returned object is guaranteed to not
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be changed later by the drawable (i.e. it retains no reference to this
19423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     * rect). If the caller already has a Rect allocated, call copyBounds(rect).
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A copy of the drawable's bounds
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Rect copyBounds() {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new Rect(mBounds);
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the drawable's bounds Rect. Note: for efficiency, the returned
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * object may be the same object stored in the drawable (though this is not
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * guaranteed), so if a persistent copy of the bounds is needed, call
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * copyBounds(rect) instead.
20723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     * You should also not change the object returned by this method as it may
20823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     * be the same object stored in the drawable.
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The bounds of the drawable (which may change later, so caller
21123bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *         beware). DO NOT ALTER the returned object as it may change the
21223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *         stored bounds of this drawable.
21323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
21423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     * @see #copyBounds()
215e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     * @see #copyBounds(android.graphics.Rect)
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Rect getBounds() {
21823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy        if (mBounds == ZERO_BOUNDS_RECT) {
21923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy            mBounds = new Rect();
22023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy        }
22123bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mBounds;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
226d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     * Return the drawable's dirty bounds Rect. Note: for efficiency, the
227d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     * returned object may be the same object stored in the drawable (though
228d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     * this is not guaranteed).
229d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     * <p>
230d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     * By default, this returns the full drawable bounds. Custom drawables may
231d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     * override this method to perform more precise invalidation.
232d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     *
233e7772d313b88e9fd3366670a9c8d1b145edef344Alan Viverette     * @return The dirty bounds of this drawable
234d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     */
235d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette    public Rect getDirtyBounds() {
236d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette        return getBounds();
237d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette    }
238d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette
239d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette    /**
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set a mask of the configuration parameters for which this drawable
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * may change, requiring that it be re-created.
24223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param configs A mask of the changing configuration parameters, as
2448e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette     * defined by {@link android.content.pm.ActivityInfo}.
24523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
2468e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette     * @see android.content.pm.ActivityInfo
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setChangingConfigurations(int configs) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mChangingConfigurations = configs;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25123bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return a mask of the configuration parameters for which this drawable
25469ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick     * may change, requiring that it be re-created.  The default implementation
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns whatever was provided through
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setChangingConfigurations(int)} or 0 by default.  Subclasses
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * may extend this to or in the changing configurations of any other
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * drawables they hold.
25923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a mask of the changing configuration parameters, as
2618e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette     * defined by {@link android.content.pm.ActivityInfo}.
26223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
2638e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette     * @see android.content.pm.ActivityInfo
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getChangingConfigurations() {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mChangingConfigurations;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set to true to have the drawable dither its colors when drawn to a device
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with fewer than 8-bits per color component. This can improve the look on
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * those devices, but can also slow down the drawing a little.
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDither(boolean dither) {}
27523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set to true to have the drawable filter its bitmap when scaled or rotated
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (for drawables that use bitmaps). If the drawable does not use bitmaps,
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this call is ignored. This can improve the look when scaled or rotated,
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * but also slows down the drawing.
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setFilterBitmap(boolean filter) {}
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Implement this interface if you want to create an animated drawable that
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * extends {@link android.graphics.drawable.Drawable Drawable}.
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Upon retrieving a drawable, use
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Drawable#setCallback(android.graphics.drawable.Drawable.Callback)}
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to supply your implementation of the interface to the drawable; it uses
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this interface to schedule and execute animation changes.
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static interface Callback {
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when the drawable needs to be redrawn.  A view at this point
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * should invalidate itself (or at least the part of itself where the
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * drawable appears).
29723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy         *
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param who The drawable that is requesting the update.
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void invalidateDrawable(Drawable who);
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * A Drawable can call this to schedule the next frame of its
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * animation.  An implementation can generally simply call
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@link android.os.Handler#postAtTime(Runnable, Object, long)} with
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the parameters <var>(what, who, when)</var> to perform the
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * scheduling.
30823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy         *
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param who The drawable being scheduled.
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param what The action to execute.
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param when The time (in milliseconds) to run.  The timebase is
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *             {@link android.os.SystemClock#uptimeMillis}
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void scheduleDrawable(Drawable who, Runnable what, long when);
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * A Drawable can call this to unschedule an action previously
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * scheduled with {@link #scheduleDrawable}.  An implementation can
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * generally simply call
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@link android.os.Handler#removeCallbacks(Runnable, Object)} with
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the parameters <var>(what, who)</var> to unschedule the drawable.
32223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy         *
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param who The drawable being unscheduled.
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param what The action being unscheduled.
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unscheduleDrawable(Drawable who, Runnable what);
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Bind a {@link Callback} object to this Drawable.  Required for clients
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that want to support animated drawables.
33223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cb The client's Callback implementation.
334e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     *
335e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     * @see #getCallback()
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setCallback(Callback cb) {
338f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        mCallback = new WeakReference<Callback>(cb);
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
342f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy     * Return the current {@link Callback} implementation attached to this
343f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy     * Drawable.
344e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     *
345f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy     * @return A {@link Callback} instance or null if no callback was set.
346e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     *
347e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     * @see #setCallback(android.graphics.drawable.Drawable.Callback)
348f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy     */
349f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy    public Callback getCallback() {
350f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        if (mCallback != null) {
351f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy            return mCallback.get();
352f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        }
353f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        return null;
354f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy    }
355e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
356f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy    /**
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use the current {@link Callback} implementation to have this Drawable
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * redrawn.  Does nothing if there is no Callback attached to the
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Drawable.
36023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Callback#invalidateDrawable
362e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     * @see #getCallback()
363e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     * @see #setCallback(android.graphics.drawable.Drawable.Callback)
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
365f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy    public void invalidateSelf() {
366f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        final Callback callback = getCallback();
367f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        if (callback != null) {
368f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy            callback.invalidateDrawable(this);
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use the current {@link Callback} implementation to have this Drawable
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scheduled.  Does nothing if there is no Callback attached to the
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Drawable.
37623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param what The action being scheduled.
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param when The time (in milliseconds) to run.
37923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Callback#scheduleDrawable
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
382f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy    public void scheduleSelf(Runnable what, long when) {
383f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        final Callback callback = getCallback();
384f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        if (callback != null) {
385f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy            callback.scheduleDrawable(this, what, when);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use the current {@link Callback} implementation to have this Drawable
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * unscheduled.  Does nothing if there is no Callback attached to the
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Drawable.
39323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param what The runnable that you no longer want called.
39523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Callback#unscheduleDrawable
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
398f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy    public void unscheduleSelf(Runnable what) {
399f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        final Callback callback = getCallback();
400f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        if (callback != null) {
401f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy            callback.unscheduleDrawable(this, what);
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
406b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio     * Returns the resolved layout direction for this Drawable.
407b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio     *
408c5daf84f6647d3280c59554cd6ec9c2a4f119bfcFabrice Di Meglio     * @return One of {@link android.view.View#LAYOUT_DIRECTION_LTR},
409c5daf84f6647d3280c59554cd6ec9c2a4f119bfcFabrice Di Meglio     *   {@link android.view.View#LAYOUT_DIRECTION_RTL}
410f358260af4cd34961acc13d849819c8b6089f309Fabrice Di Meglio     *
411f358260af4cd34961acc13d849819c8b6089f309Fabrice Di Meglio     * @hide
412c1da65187a4b9de8f72bd617ef937030187c0a92Fabrice Di Meglio     */
413b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio    public int getLayoutDirection() {
414b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio        return mLayoutDirection;
415b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio    }
416b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio
417b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio    /**
418b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio     * Set the layout direction for this drawable. Should be a resolved direction as the
419b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio     * Drawable as no capacity to do the resolution on his own.
420b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio     *
421c5daf84f6647d3280c59554cd6ec9c2a4f119bfcFabrice Di Meglio     * @param layoutDirection One of {@link android.view.View#LAYOUT_DIRECTION_LTR},
422f358260af4cd34961acc13d849819c8b6089f309Fabrice Di Meglio     *   {@link android.view.View#LAYOUT_DIRECTION_RTL}
423b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio     *
424f358260af4cd34961acc13d849819c8b6089f309Fabrice Di Meglio     * @hide
425b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio     */
426d9273d6f289d9b55da3fd0db2f659fdfb48106a8Tor Norbye    public void setLayoutDirection(@View.ResolvedLayoutDir int layoutDirection) {
427b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio        if (getLayoutDirection() != layoutDirection) {
428b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio            mLayoutDirection = layoutDirection;
4296a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio        }
4306a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio    }
4316a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio
4326a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio    /**
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specify an alpha value for the drawable. 0 means fully transparent, and
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * 255 means fully opaque.
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract void setAlpha(int alpha);
43723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
439b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase     * Gets the current alpha value for the drawable. 0 means fully transparent,
440b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase     * 255 means fully opaque. This method is implemented by
441b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase     * Drawable subclasses and the value returned is specific to how that class treats alpha.
442b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase     * The default return value is 255 if the class does not override this method to return a value
443b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase     * specific to its use of alpha.
444b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase     */
445b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase    public int getAlpha() {
446b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase        return 0xFF;
447b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase    }
448b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase
449b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase    /**
45031049d76c55b18a6d9993f0d9687598740b16014Adam Powell     * @hide Consider for future API inclusion
45131049d76c55b18a6d9993f0d9687598740b16014Adam Powell     */
45231049d76c55b18a6d9993f0d9687598740b16014Adam Powell    public void setXfermode(Xfermode mode) {
45331049d76c55b18a6d9993f0d9687598740b16014Adam Powell        // Base implementation drops it on the floor for compatibility. Whee!
45431049d76c55b18a6d9993f0d9687598740b16014Adam Powell        // TODO: For this to be included in the API proper, all framework drawables need impls.
45531049d76c55b18a6d9993f0d9687598740b16014Adam Powell        // For right now only BitmapDrawable has it.
45631049d76c55b18a6d9993f0d9687598740b16014Adam Powell    }
45731049d76c55b18a6d9993f0d9687598740b16014Adam Powell
45831049d76c55b18a6d9993f0d9687598740b16014Adam Powell    /**
459813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette     * Specify an optional color filter for the drawable. Pass {@code null} to
460813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette     * remove any existing color filter.
461813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette     *
462813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette     * @param cf the color filter to apply, or {@code null} to remove the
463813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette     *            existing color filter
464813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette     */
465813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette    public abstract void setColorFilter(ColorFilter cf);
466813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette
467813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette    /**
468d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette     * Specify a color and Porter-Duff mode to be the color filter for this
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * drawable.
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setColorFilter(int color, PorterDuff.Mode mode) {
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setColorFilter(new PorterDuffColorFilter(color, mode));
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
475d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette    /**
476a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * Specifies a tint for this drawable.
477a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * <p>
478a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * Setting a color filter via {@link #setColorFilter(ColorFilter)} overrides
479a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * tint.
480a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     *
481a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * @param tint Color to use for tinting this drawable
482a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * @see #setTintMode(PorterDuff.Mode)
483a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     */
484a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    public void setTint(int tint) {
485a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette        setTintList(ColorStateList.valueOf(tint));
486a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    }
487a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette
488a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    /**
489a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * Specifies a tint for this drawable as a color state list.
490a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * <p>
491a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * Setting a color filter via {@link #setColorFilter(ColorFilter)} overrides
492a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * tint.
493a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     *
494a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * @param tint Color state list to use for tinting this drawable, or null to
495a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     *            clear the tint
496a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * @see #setTintMode(PorterDuff.Mode)
497a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     */
498a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    public void setTintList(ColorStateList tint) {}
499a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette
500a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    /**
501a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * Specifies a tint blending mode for this drawable.
502a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * <p>
503a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * Setting a color filter via {@link #setColorFilter(ColorFilter)} overrides
504a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * tint.
505a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     *
506a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * @param tintMode Color state list to use for tinting this drawable, or null to
507a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     *            clear the tint
508a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * @param tintMode A Porter-Duff blending mode
509a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     */
510a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    public void setTintMode(PorterDuff.Mode tintMode) {}
511a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette
512a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    /**
513813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette     * Returns the current color filter, or {@code null} if none set.
514813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette     *
515813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette     * @return the current color filter, or {@code null} if none set
516813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette     */
517813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette    public ColorFilter getColorFilter() {
518813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette        return null;
519813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette    }
520813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette
521813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette    /**
522d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette     * Removes the color filter for this drawable.
523d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette     */
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearColorFilter() {
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setColorFilter(null);
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
529c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette     * Specifies the hotspot's location within the drawable.
530223622a50db319d634616311ff74267cf49679e7Alan Viverette     *
531860126b78aa4d6e8db5208c7f96764a8556cf95fAlan Viverette     * @param x The X coordinate of the center of the hotspot
532860126b78aa4d6e8db5208c7f96764a8556cf95fAlan Viverette     * @param y The Y coordinate of the center of the hotspot
533223622a50db319d634616311ff74267cf49679e7Alan Viverette     */
534c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette    public void setHotspot(float x, float y) {}
535223622a50db319d634616311ff74267cf49679e7Alan Viverette
536223622a50db319d634616311ff74267cf49679e7Alan Viverette    /**
537c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette     * Sets the bounds to which the hotspot is constrained, if they should be
538c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette     * different from the drawable bounds.
53953a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette     *
540c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette     * @param left
541c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette     * @param top
542c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette     * @param right
543c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette     * @param bottom
54461956606818918194a38e045a8e35e7108480e5eAlan Viverette     */
54561956606818918194a38e045a8e35e7108480e5eAlan Viverette    public void setHotspotBounds(int left, int top, int right, int bottom) {}
546223622a50db319d634616311ff74267cf49679e7Alan Viverette
5477068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette    /** @hide For internal use only. Individual results may vary. */
5487068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette    public void getHotspotBounds(Rect outRect) {
5497068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette        outRect.set(getBounds());
5507068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette    }
5517068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette
552223622a50db319d634616311ff74267cf49679e7Alan Viverette    /**
553d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     * Whether this drawable requests projection.
554d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     *
555c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette     * @hide magic!
556d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     */
557d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette    public boolean isProjected() {
558d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette        return false;
559d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette    }
560d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette
561d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette    /**
5623b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette     * Indicates whether this drawable will change its appearance based on
5633b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette     * state. Clients can use this to determine whether it is necessary to
5643b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette     * calculate their state and call setState.
56523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
5663b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette     * @return True if this drawable changes its appearance based on state,
5673b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette     *         false otherwise.
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setState(int[])
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isStateful() {
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
57323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specify a set of states for the drawable. These are use-case specific,
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so see the relevant documentation. As an example, the background for
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * widgets like Button understand the following states:
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * [{@link android.R.attr#state_focused},
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  {@link android.R.attr#state_pressed}].
58023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If the new state you are supplying causes the appearance of the
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Drawable to change, then it is responsible for calling
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #invalidateSelf} in order to have itself redrawn, <em>and</em>
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * true will be returned from this function.
58523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note: The Drawable holds a reference on to <var>stateSet</var>
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * until a new state array is given to it, so you must not modify this
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * array during that time.</p>
58923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param stateSet The new set of states to be displayed.
59123bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if this change in state has caused the appearance
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the Drawable to change (hence requiring an invalidate), otherwise
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns false.
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean setState(final int[] stateSet) {
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Arrays.equals(mStateSet, stateSet)) {
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStateSet = stateSet;
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return onStateChange(stateSet);
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Describes the current state, as a union of primitve states, such as
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#state_focused},
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#state_selected}, etc.
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Some drawables may modify their imagery based on the selected state.
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return An array of resource Ids describing the current state.
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int[] getState() {
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStateSet;
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
61423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
616079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn     * If this Drawable does transition animations between states, ask that
617079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn     * it immediately jump to the current state and skip any active animations.
618079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn     */
619079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    public void jumpToCurrentState() {
620079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    }
621079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
622079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    /**
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The current drawable that will be used by this drawable. For simple drawables, this
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         is just the drawable itself. For drawables that change state like
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link StateListDrawable} and {@link LevelListDrawable} this will be the child drawable
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         currently in use.
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getCurrent() {
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return this;
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specify the level for the drawable.  This allows a drawable to vary its
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * imagery based on a continuous controller, for example to show progress
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or volume level.
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If the new level you are supplying causes the appearance of the
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Drawable to change, then it is responsible for calling
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #invalidateSelf} in order to have itself redrawn, <em>and</em>
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * true will be returned from this function.
64123bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param level The new level, from 0 (minimum) to 10000 (maximum).
64323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if this change in level has caused the appearance
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the Drawable to change (hence requiring an invalidate), otherwise
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns false.
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean setLevel(int level) {
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mLevel != level) {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLevel = level;
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return onLevelChange(level);
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the current level.
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return int Current level, from 0 (minimum) to 10000 (maximum).
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getLevel() {
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLevel;
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set whether this Drawable is visible.  This generally does not impact
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the Drawable's behavior, but is a hint that can be used by some
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Drawables, for example, to decide whether run animations.
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param visible Set to true if visible, false if not.
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param restart You can supply true here to force the drawable to behave
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                as if it has just become visible, even if it had last
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                been set visible.  Used for example to force animations
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                to restart.
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Returns true if the new visibility is different than
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         its previous state.
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean setVisible(boolean visible, boolean restart) {
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean changed = mVisible != visible;
6819891e1fce5f29d0421d34aa481037417bd70853dChet Haase        if (changed) {
6829891e1fce5f29d0421d34aa481037417bd70853dChet Haase            mVisible = visible;
6839891e1fce5f29d0421d34aa481037417bd70853dChet Haase            invalidateSelf();
6849891e1fce5f29d0421d34aa481037417bd70853dChet Haase        }
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return changed;
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isVisible() {
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mVisible;
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6933f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     * Set whether this Drawable is automatically mirrored when its layout direction is RTL
6943f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     * (right-to left). See {@link android.util.LayoutDirection}.
6953f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     *
6963f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     * @param mirrored Set to true if the Drawable should be mirrored, false if not.
6973f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     */
6983f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    public void setAutoMirrored(boolean mirrored) {
6993f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    }
7003f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio
7013f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    /**
7023f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     * Tells if this Drawable will be automatically mirrored  when its layout direction is RTL
7033f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     * right-to-left. See {@link android.util.LayoutDirection}.
7043f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     *
7053f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     * @return boolean Returns true if this Drawable will be automatically mirrored.
7063f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     */
7073f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    public boolean isAutoMirrored() {
7083f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio        return false;
7093f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    }
7103f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio
7113f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    /**
71252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * Applies the specified theme to this Drawable and its children.
71352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     */
71452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    public void applyTheme(@SuppressWarnings("unused") Theme t) {
71552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
71652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
71752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    public boolean canApplyTheme() {
71852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        return false;
71952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
72052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
72152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    /**
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the opacity/transparency of this Drawable.  The returned value is
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * one of the abstract format constants in
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.graphics.PixelFormat}:
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.graphics.PixelFormat#UNKNOWN},
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.graphics.PixelFormat#TRANSLUCENT},
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.graphics.PixelFormat#TRANSPARENT}, or
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.graphics.PixelFormat#OPAQUE}.
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Generally a Drawable should be as conservative as possible with the
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value it returns.  For example, if it contains multiple child drawables
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and only shows one of them at a time, if only one of the children is
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TRANSLUCENT and the others are OPAQUE then TRANSLUCENT should be
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned.  You can use the method {@link #resolveOpacity} to perform a
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * standard reduction of two opacities to the appropriate single output.
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note that the returned value does <em>not</em> take into account a
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * custom alpha or color filter that has been applied by the client through
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the {@link #setAlpha} or {@link #setColorFilter} methods.
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return int The opacity class of the Drawable.
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.graphics.PixelFormat
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract int getOpacity();
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the appropriate opacity value for two source opacities.  If
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * either is UNKNOWN, that is returned; else, if either is TRANSLUCENT,
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that is returned; else, if either is TRANSPARENT, that is returned;
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * else, OPAQUE is returned.
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This is to help in implementing {@link #getOpacity}.
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param op1 One opacity value.
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param op2 Another opacity value.
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return int The combined opacity value.
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getOpacity
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int resolveOpacity(int op1, int op2) {
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (op1 == op2) {
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return op1;
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (op1 == PixelFormat.UNKNOWN || op2 == PixelFormat.UNKNOWN) {
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PixelFormat.UNKNOWN;
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (op1 == PixelFormat.TRANSLUCENT || op2 == PixelFormat.TRANSLUCENT) {
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PixelFormat.TRANSLUCENT;
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (op1 == PixelFormat.TRANSPARENT || op2 == PixelFormat.TRANSPARENT) {
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PixelFormat.TRANSPARENT;
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PixelFormat.OPAQUE;
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a Region representing the part of the Drawable that is completely
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * transparent.  This can be used to perform drawing operations, identifying
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which parts of the target will not change when rendering the Drawable.
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation returns null, indicating no transparent
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * region; subclasses can optionally override this to return an actual
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Region if they want to supply this optimization information, but it is
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not required that they do so.
78623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns null if the Drawables has no transparent region to
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * report, else a Region holding the parts of the Drawable's bounds that
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are transparent.
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Region getTransparentRegion() {
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
79423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Override this in your subclass to change appearance if you recognize the
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * specified state.
79823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the state change has caused the appearance of
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the Drawable to change (that is, it needs to be drawn), else false
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if it looks the same and there is no need to redraw it since its
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * last state.
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean onStateChange(int[] state) { return false; }
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Override this in your subclass to change appearance if you vary based
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  on level.
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the level change has caused the appearance of
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the Drawable to change (that is, it needs to be drawn), else false
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if it looks the same and there is no need to redraw it since its
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * last level.
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean onLevelChange(int level) { return false; }
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
814c502744f2ddcc80a34f5197b5d2c0d701c7d6e71Newton Allen     * Override this in your subclass to change appearance if you vary based on
815c502744f2ddcc80a34f5197b5d2c0d701c7d6e71Newton Allen     * the bounds.
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onBoundsChange(Rect bounds) {}
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the intrinsic width of the underlying drawable object.  Returns
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * -1 if it has no intrinsic width, such as with a solid color.
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getIntrinsicWidth() {
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the intrinsic height of the underlying drawable object. Returns
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * -1 if it has no intrinsic height, such as with a solid color.
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getIntrinsicHeight() {
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
83423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the minimum width suggested by this Drawable. If a View uses this
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Drawable as a background, it is suggested that the View use at least this
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value for its width. (There will be some scenarios where this will not be
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * possible.) This value should INCLUDE any padding.
84023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The minimum width suggested by this Drawable. If this Drawable
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         doesn't have a suggested minimum width, 0 is returned.
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getMinimumWidth() {
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int intrinsicWidth = getIntrinsicWidth();
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return intrinsicWidth > 0 ? intrinsicWidth : 0;
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the minimum height suggested by this Drawable. If a View uses this
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Drawable as a background, it is suggested that the View use at least this
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value for its height. (There will be some scenarios where this will not be
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * possible.) This value should INCLUDE any padding.
85423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The minimum height suggested by this Drawable. If this Drawable
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         doesn't have a suggested minimum height, 0 is returned.
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getMinimumHeight() {
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int intrinsicHeight = getIntrinsicHeight();
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return intrinsicHeight > 0 ? intrinsicHeight : 0;
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
86223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return in padding the insets suggested by this Drawable for placing
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * content inside the drawable's bounds. Positive values move toward the
8667dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik     * center of the Drawable (set Rect.inset).
8677dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik     *
8687dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik     * @return true if this drawable actually has a padding, else false. When false is returned,
8697dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik     * the padding is always set to 0.
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8717dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik    public boolean getPadding(@NonNull Rect padding) {
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        padding.set(0, 0, 0, 0);
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8771557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne     * Return in insets the layout insets suggested by this Drawable for use with alignment
878bbd51f1e360b22eece1d74bd65c7e6a0b59dee59Philip Milne     * operations during layout.
8791557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne     *
8801557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne     * @hide
8811557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne     */
8827b7578184567f4e4f0740ce935cc192765410ccaPhilip Milne    public Insets getOpticalInsets() {
883bbd51f1e360b22eece1d74bd65c7e6a0b59dee59Philip Milne        return Insets.NONE;
8841557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne    }
8851557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne
8861557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne    /**
8879a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik     * Called to get the drawable to populate the Outline that defines its drawing area.
888b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik     * <p>
8899a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik     * This method is called by the default {@link android.view.ViewOutlineProvider} to define
8909a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik     * the outline of the View.
8917dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik     * <p>
89277b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik     * The default behavior defines the outline to be the bounding rectangle of 0 alpha.
89377b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik     * Subclasses that wish to convey a different shape or alpha value must override this method.
8947dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik     *
8959a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik     * @see android.view.View#setOutlineProvider(android.view.ViewOutlineProvider)
896b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik     */
89731ba192dd201df2cad96a8c503f730130ab0d80fChris Craik    public void getOutline(@NonNull Outline outline) {
898e6a39b12656ab8d5c77d8366b24aa6410fd42e11Chris Craik        outline.setRect(getBounds());
8993f873d86441c30f5d45640a9f70b3b7331985c90Chris Craik        outline.setAlpha(0);
900e6a39b12656ab8d5c77d8366b24aa6410fd42e11Chris Craik    }
901b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
902b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    /**
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Make this drawable mutable. This operation cannot be reversed. A mutable
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * drawable is guaranteed to not share its state with any other drawable.
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is especially useful when you need to modify properties of drawables
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * loaded from resources. By default, all drawables instances loaded from
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the same resource share a common state; if you modify the state of one
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance, all the other instances will receive the same modification.
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calling this method on a mutable Drawable will have no effect.
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return This drawable.
9131e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * @see ConstantState
9141e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * @see #getConstantState()
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable mutate() {
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return this;
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
921727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     * Clears the mutated state, allowing this drawable to be cached and
922727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     * mutated again.
923727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     * <p>
924727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     * This is hidden because only framework drawables can be cached, so
925727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     * custom drawables don't need to support constant state, mutate(), or
926727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     * clearMutated().
927727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     *
928727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     * @hide
929727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     */
930727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette    public void clearMutated() {
931727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette        // Default implementation is no-op.
932727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette    }
933727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette
934727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette    /**
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a drawable from an inputstream
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Drawable createFromStream(InputStream is, String srcName) {
9380acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, srcName != null ? srcName : "Unknown drawable");
9390acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        try {
9406dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette            return createFromResourceStream(null, null, is, srcName);
9410acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        } finally {
9420acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn            Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
9430acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        }
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
94711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn     * Create a drawable from an inputstream, using the given resources and
94811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn     * value to determine density information.
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Drawable createFromResourceStream(Resources res, TypedValue value,
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputStream is, String srcName) {
9520acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, srcName != null ? srcName : "Unknown drawable");
9530acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        try {
954910a0b4d02d0be3e164a32825785fa3d02fe55a2Alan Viverette            return createFromResourceStream(res, value, is, srcName, null);
9550acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        } finally {
9560acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn            Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
9570acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        }
9587341d7a104b47996445d069a695e155a07184606Dianne Hackborn    }
9597341d7a104b47996445d069a695e155a07184606Dianne Hackborn
9607341d7a104b47996445d069a695e155a07184606Dianne Hackborn    /**
9617341d7a104b47996445d069a695e155a07184606Dianne Hackborn     * Create a drawable from an inputstream, using the given resources and
9627341d7a104b47996445d069a695e155a07184606Dianne Hackborn     * value to determine density information.
9637341d7a104b47996445d069a695e155a07184606Dianne Hackborn     */
9647341d7a104b47996445d069a695e155a07184606Dianne Hackborn    public static Drawable createFromResourceStream(Resources res, TypedValue value,
9657341d7a104b47996445d069a695e155a07184606Dianne Hackborn            InputStream is, String srcName, BitmapFactory.Options opts) {
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (is == null) {
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*  ugh. The decodeStream contract is that we have already allocated
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            the pad rect, but if the bitmap does not had a ninepatch chunk,
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            then the pad will be ignored. If we could change this to lazily
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            alloc/assign the rect, we could avoid the GC churn of making new
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Rects only to drop them on the floor.
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        */
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Rect pad = new Rect();
977e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
97811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        // Special stuff for compatibility mode: if the target density is not
97911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        // the same as the display density, but the resource -is- the same as
98011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        // the display density, then don't scale it down to the target density.
98111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        // This allows us to load the system's density-correct resources into
98211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        // an application in compatibility mode, without scaling those down
98311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        // to the compatibility density only to have them scaled back up when
98411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        // drawn to the screen.
9857341d7a104b47996445d069a695e155a07184606Dianne Hackborn        if (opts == null) opts = new BitmapFactory.Options();
986f1c0aeda259dd0dbab4356c909d33fe7e1ca0d2aDianne Hackborn        opts.inScreenDensity = res != null
987f1c0aeda259dd0dbab4356c909d33fe7e1ca0d2aDianne Hackborn                ? res.getDisplayMetrics().noncompatDensityDpi : DisplayMetrics.DENSITY_DEVICE;
98811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        Bitmap  bm = BitmapFactory.decodeResourceStream(res, value, is, pad, opts);
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (bm != null) {
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] np = bm.getNinePatchChunk();
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (np == null || !NinePatch.isNinePatchChunk(np)) {
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                np = null;
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pad = null;
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
995c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette
996c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette            final Rect opticalInsets = new Rect();
997c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette            bm.getOpticalInsets(opticalInsets);
998c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette            return drawableFromBitmap(res, bm, np, pad, opticalInsets, srcName);
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a drawable from an XML document. For more information on how to
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * create resources in XML, see
1006dfe5c204403bc56c29bb36410574eab8b1950417Scott Main     * <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Drawable createFromXml(Resources r, XmlPullParser parser)
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
10106dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette        return createFromXml(r, parser, null);
101152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
101252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
101352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    /**
10146dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette     * Create a drawable from an XML document using an optional {@link Theme}.
10156dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette     * For more information on how to create resources in XML, see
101652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.
101752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     */
10186dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette    public static Drawable createFromXml(Resources r, XmlPullParser parser, Theme theme)
101952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            throws XmlPullParserException, IOException {
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttributeSet attrs = Xml.asAttributeSet(parser);
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.START_TAG &&
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                type != XmlPullParser.END_DOCUMENT) {
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Empty loop
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type != XmlPullParser.START_TAG) {
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new XmlPullParserException("No start tag found");
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10326dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette        Drawable drawable = createFromXmlInner(r, parser, attrs, theme);
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (drawable == null) {
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Unknown initial tag: " + parser.getName());
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return drawable;
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create from inside an XML document.  Called on a parser positioned at
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a tag in an XML document, tries to create a Drawable from that tag.
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns null if the tag is not a valid drawable.
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs)
104752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            throws XmlPullParserException, IOException {
10486dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette        return createFromXmlInner(r, parser, attrs, null);
104952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1051e5b082d6eb0489e7dbe3159338f8c94c0af61deeAlan Viverette    /**
10526dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette     * Create a drawable from inside an XML document using an optional
10536dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette     * {@link Theme}. Called on a parser positioned at a tag in an XML
10546dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette     * document, tries to create a Drawable from that tag. Returns {@code null}
10556dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette     * if the tag is not a valid drawable.
1056e5b082d6eb0489e7dbe3159338f8c94c0af61deeAlan Viverette     */
10576dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette    public static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs,
10586dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette            Theme theme) throws XmlPullParserException, IOException {
105952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        final Drawable drawable;
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
106152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        final String name = parser.getName();
1062d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar        switch (name) {
1063d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "selector":
1064d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new StateListDrawable();
1065d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1066d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "animated-selector":
1067d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new AnimatedStateListDrawable();
1068d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1069d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "level-list":
1070d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new LevelListDrawable();
1071d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1072d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "layer-list":
1073d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new LayerDrawable();
1074d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1075d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "transition":
1076d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new TransitionDrawable();
1077d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1078d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "ripple":
1079d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new RippleDrawable();
1080d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1081d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "color":
1082d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new ColorDrawable();
1083d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1084d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "shape":
1085d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new GradientDrawable();
1086d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1087d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "vector":
1088d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new VectorDrawable();
1089d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1090d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "animated-vector":
1091d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new AnimatedVectorDrawable();
1092d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1093d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "scale":
1094d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new ScaleDrawable();
1095d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1096d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "clip":
1097d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new ClipDrawable();
1098d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1099d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "rotate":
1100d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new RotateDrawable();
1101d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1102d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "animated-rotate":
1103d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new AnimatedRotateDrawable();
1104d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1105d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "animation-list":
1106d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new AnimationDrawable();
1107d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1108d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "inset":
1109d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new InsetDrawable();
1110d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1111d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "bitmap":
1112d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new BitmapDrawable(r);
1113d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                if (r != null) {
1114d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                    ((BitmapDrawable) drawable).setTargetDensity(r.getDisplayMetrics());
1115d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                }
1116d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1117d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            case "nine-patch":
1118d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                drawable = new NinePatchDrawable();
1119d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                if (r != null) {
1120d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                    ((NinePatchDrawable) drawable).setTargetDensity(r.getDisplayMetrics());
1121d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                }
1122d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                break;
1123d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar            default:
1124d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                throw new XmlPullParserException(parser.getPositionDescription() +
1125d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar                        ": invalid drawable tag " + name);
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1127d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar        }
112852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        drawable.inflate(r, parser, attrs, theme);
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return drawable;
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a drawable from file path name.
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Drawable createFromPath(String pathName) {
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pathName == null) {
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11410acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, pathName);
11420acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        try {
11430acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn            Bitmap bm = BitmapFactory.decodeFile(pathName);
11440acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn            if (bm != null) {
11450acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn                return drawableFromBitmap(null, bm, null, null, null, pathName);
11460acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn            }
11470acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        } finally {
11480acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn            Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11541e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne    /**
115552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * Inflate this Drawable from an XML resource. Does not apply a theme.
115652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     *
115752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * @see #inflate(Resources, XmlPullParser, AttributeSet, Theme)
11581e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     */
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs)
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
116152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        inflate(r, parser, attrs, null);
116252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
116352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
116452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    /**
116552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * Inflate this Drawable from an XML resource optionally styled by a theme.
116652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     *
116752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * @param r Resources used to resolve attribute values
116852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * @param parser XML parser from which to inflate this Drawable
116952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * @param attrs Base set of attribute values
117052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * @param theme Theme to apply, may be null
117152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * @throws XmlPullParserException
117252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * @throws IOException
117352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     */
117452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs, Theme theme)
117552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            throws XmlPullParserException, IOException {
117652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        final TypedArray a;
117752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        if (theme != null) {
117852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            a = theme.obtainStyledAttributes(
117952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette                    attrs, com.android.internal.R.styleable.Drawable, 0, 0);
118052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        } else {
118152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            a = r.obtainAttributes(attrs, com.android.internal.R.styleable.Drawable);
118252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        inflateWithAttributes(r, parser, a, com.android.internal.R.styleable.Drawable_visible);
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11881e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne    /**
11891e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * Inflate a Drawable from an XML resource.
11901e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     *
11911e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * @throws XmlPullParserException
11921e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * @throws IOException
11931e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     */
119452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    void inflateWithAttributes(Resources r, XmlPullParser parser, TypedArray attrs, int visibleAttr)
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mVisible = attrs.getBoolean(visibleAttr, mVisible);
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11991e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne    /**
12001e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * This abstract class is used by {@link Drawable}s to store shared constant state and data
12011e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * between Drawables. {@link BitmapDrawable}s created from the same resource will for instance
12021e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * share a unique bitmap stored in their ConstantState.
12031e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     *
12041e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * <p>
12051e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * {@link #newDrawable(Resources)} can be used as a factory to create new Drawable instances
12061e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * from this ConstantState.
12071e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * </p>
12081e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     *
12091e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * Use {@link Drawable#getConstantState()} to retrieve the ConstantState of a Drawable. Calling
12101e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * {@link Drawable#mutate()} on a Drawable should typically create a new ConstantState for that
12111e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * Drawable.
12121e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     */
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static abstract class ConstantState {
1214c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        /**
1215c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn         * Create a new drawable without supplying resources the caller
1216c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn         * is running in.  Note that using this means the density-dependent
1217c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn         * drawables (like bitmaps) will not be able to update their target
121820fc9bfe3ad16c5f36026fc43c85d0647b75cc40Gilles Debunne         * density correctly. One should use {@link #newDrawable(Resources)}
121920fc9bfe3ad16c5f36026fc43c85d0647b75cc40Gilles Debunne         * instead to provide a resource.
1220c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn         */
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract Drawable newDrawable();
122252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
1223c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        /**
1224c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn         * Create a new Drawable instance from its constant state.  This
1225c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn         * must be implemented for drawables that change based on the target
1226c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn         * density of their caller (that is depending on whether it is
1227c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn         * in compatibility mode).
1228c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn         */
1229c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        public Drawable newDrawable(Resources res) {
1230c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn            return newDrawable();
1231c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        }
123252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
123352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        /**
123452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette         * Create a new Drawable instance from its constant state. This must be
123552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette         * implemented for drawables that can have a theme applied.
123652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette         */
123752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        public Drawable newDrawable(Resources res, Theme theme) {
123817cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette            return newDrawable(null);
123952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
124052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
1241c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        /**
1242c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn         * Return a bit mask of configuration changes that will impact
1243c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn         * this drawable (and thus require completely reloading it).
1244c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn         */
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public abstract int getChangingConfigurations();
12463b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
12473b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        /**
1248dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck         * @return Total pixel count
12493b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy         * @hide
12503b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy         */
1251dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck        public int addAtlasableBitmaps(Collection<Bitmap> atlasList) {
1252dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck            return 0;
1253dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck        }
1254dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck
1255dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck        /** @hide */
1256dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck        protected final boolean isAtlasable(Bitmap bitmap) {
1257dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck            return bitmap != null && bitmap.getConfig() == Bitmap.Config.ARGB_8888;
12583b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        }
125952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
126052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        /**
126152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette         * Return whether this constant state can have a theme applied.
126252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette         */
126352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        public boolean canApplyTheme() {
126452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            return false;
126552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12681e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne    /**
12691e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * Return a {@link ConstantState} instance that holds the shared state of this Drawable.
1270d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette     *
12711e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * @return The ConstantState associated to that Drawable.
12721e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * @see ConstantState
12731e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * @see Drawable#mutate()
12741e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     */
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ConstantState getConstantState() {
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static Drawable drawableFromBitmap(Resources res, Bitmap bm, byte[] np,
1280ec4a50428d5f26a22df3edaf7e5b08f41d5cb54bAmith Yamasani            Rect pad, Rect layoutBounds, String srcName) {
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (np != null) {
12831557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne            return new NinePatchDrawable(res, bm, np, pad, layoutBounds, srcName);
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
128611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        return new BitmapDrawable(res, bm);
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1288d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette
1289d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette    /**
1290b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette     * Ensures the tint filter is consistent with the current tint color and
1291b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette     * mode.
1292b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette     */
1293b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    PorterDuffColorFilter updateTintFilter(PorterDuffColorFilter tintFilter, ColorStateList tint,
1294b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            PorterDuff.Mode tintMode) {
1295b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        if (tint == null || tintMode == null) {
1296b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            return null;
1297b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        }
1298b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
1299b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        final int color = tint.getColorForState(getState(), Color.TRANSPARENT);
1300b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        if (tintFilter == null) {
1301b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            return new PorterDuffColorFilter(color, tintMode);
1302b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        }
1303b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
1304b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        tintFilter.setColor(color);
1305b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        tintFilter.setMode(tintMode);
1306b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        return tintFilter;
1307b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    }
1308b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
1309b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    /**
131052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * Obtains styled attributes from the theme, if available, or unstyled
131152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * resources if the theme is null.
131252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     */
131352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    static TypedArray obtainAttributes(
131452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            Resources res, Theme theme, AttributeSet set, int[] attrs) {
131552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        if (theme == null) {
131652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            return res.obtainAttributes(set, attrs);
131752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
131852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        return theme.obtainStyledAttributes(set, attrs, 0, 0);
131952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
132052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
132152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    /**
132212b97f5d2b15194ed6673c9838b13c8312157709Alan Viverette     * Parses a {@link android.graphics.PorterDuff.Mode} from a tintMode
1323d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette     * attribute's enum value.
1324911743652b597057a1bd7ef8a921e9ff8dce0f4aAlan Viverette     *
1325911743652b597057a1bd7ef8a921e9ff8dce0f4aAlan Viverette     * @hide
1326d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette     */
1327911743652b597057a1bd7ef8a921e9ff8dce0f4aAlan Viverette    public static PorterDuff.Mode parseTintMode(int value, Mode defaultMode) {
132812b97f5d2b15194ed6673c9838b13c8312157709Alan Viverette        switch (value) {
13292f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette            case 3: return Mode.SRC_OVER;
13302f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette            case 5: return Mode.SRC_IN;
13312f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette            case 9: return Mode.SRC_ATOP;
13322f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette            case 14: return Mode.MULTIPLY;
13332f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette            case 15: return Mode.SCREEN;
13342f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette            case 16: return Mode.ADD;
13352f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette            default: return defaultMode;
1336d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette        }
1337d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette    }
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1340