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
19b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viveretteimport com.android.internal.R;
20b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette
21b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viveretteimport org.xmlpull.v1.XmlPullParser;
22b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viveretteimport org.xmlpull.v1.XmlPullParserException;
23b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette
24b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viveretteimport android.annotation.AttrRes;
2580756e38882720860db52f1fcc21fa1505a02abfTor Norbyeimport android.annotation.ColorInt;
26b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viveretteimport android.annotation.IntRange;
277dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craikimport android.annotation.NonNull;
28bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craikimport android.annotation.Nullable;
29ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viveretteimport android.content.pm.ActivityInfo.Config;
30e7772d313b88e9fd3366670a9c8d1b145edef344Alan Viveretteimport android.content.res.ColorStateList;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
3252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viveretteimport android.content.res.Resources.Theme;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
3478aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Bitmap;
3578aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.BitmapFactory;
3678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Canvas;
37b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.Color;
3878aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.ColorFilter;
39b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.Insets;
4078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.NinePatch;
41b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craikimport android.graphics.Outline;
4278aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.PixelFormat;
4378aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.PorterDuff;
44b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.PorterDuff.Mode;
4578aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.PorterDuffColorFilter;
4678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Rect;
4778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Region;
48b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.Xfermode;
49b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.os.Trace;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
5111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackbornimport android.util.DisplayMetrics;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.StateSet;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue;
5478aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.util.Xml;
55d9273d6f289d9b55da3fd0db2f659fdfb48106a8Tor Norbyeimport android.view.View;
5678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne
5778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport java.io.IOException;
5878aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport java.io.InputStream;
59f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guyimport java.lang.ref.WeakReference;
6078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport java.util.Arrays;
61dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reckimport java.util.Collection;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A Drawable is a general abstraction for "something that can be drawn."  Most
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * often you will deal with Drawable as the type of resource retrieved for
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawing things to the screen; the Drawable class provides a generic API for
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dealing with an underlying visual resource that may take a variety of forms.
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlike a {@link android.view.View}, a Drawable does not have any facility to
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receive events or otherwise interact with the user.
7023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy *
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In addition to simple drawing, Drawable provides a number of generic
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mechanisms for its client to interact with what is being drawn:
7323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy *
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> The {@link #setBounds} method <var>must</var> be called to tell the
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     Drawable where it is drawn and how large it should be.  All Drawables
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     should respect the requested size, often simply by scaling their
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     imagery.  A client can find the preferred size for some Drawables with
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     the {@link #getIntrinsicHeight} and {@link #getIntrinsicWidth} methods.
8023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy *
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> The {@link #getPadding} method can return from some Drawables
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     information about how to frame content that is placed inside of them.
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     For example, a Drawable that is intended to be the frame for a button
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     widget would need to return padding that correctly places the label
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     inside of itself.
8623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy *
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> The {@link #setState} method allows the client to tell the Drawable
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     in which state it is to be drawn, such as "focused", "selected", etc.
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     Some drawables may modify their imagery based on the selected state.
9023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy *
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> The {@link #setLevel} method allows the client to supply a single
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     continuous controller that can modify the Drawable is displayed, such as
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     a battery level or progress level.  Some drawables may modify their
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     imagery based on the current level.
9523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy *
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> A Drawable can perform animations by calling back to its client
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     through the {@link Callback} interface.  All clients should support this
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     interface (via {@link #setCallback}) so that animations will work.  A
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     simple way to do this is through the system facilities such as
100d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette *     {@link android.view.View#setBackground(Drawable)} and
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link android.widget.ImageView}.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
10323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy *
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Though usually not visible to the application, Drawables may take a variety
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of forms:
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <b>Bitmap</b>: the simplest Drawable, a PNG or JPEG image.
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <b>Nine Patch</b>: an extension to the PNG format allows it to
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     specify information about how to stretch it and place things inside of
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     it.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <b>Shape</b>: contains simple drawing commands instead of a raw
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     bitmap, allowing it to resize better in some cases.
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <b>Layers</b>: a compound drawable, which draws multiple underlying
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     drawables on top of each other.
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <b>States</b>: a compound drawable that selects one of a set of
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     drawables based on its state.
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <b>Levels</b>: a compound drawable that selects one of a set of
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     drawables based on its level.
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <b>Scale</b>: a compound drawable with a single child drawable,
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     whose overall size is modified based on the current level.
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
12361fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez *
124112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <a name="Custom"></a>
125112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <h3>Custom drawables</h3>
126112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette *
127112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <p>
128112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * All versions of Android allow the Drawable class to be extended and used at
129112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * run time in place of framework-provided drawable classes. Starting in
130112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * {@link android.os.Build.VERSION_CODES#N API 24}, custom drawables classes
131112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * may also be used in XML.
132112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <p>
133112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <strong>Note:</strong> Custom drawable classes are only accessible from
134112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * within your application package. Other applications will not be able to load
135112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * them.
136112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <p>
137112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * At a minimum, custom drawable classes must implement the abstract methods on
138112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * Drawable and should override the {@link Drawable#draw(Canvas)} method to
139112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * draw content.
140112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <p>
141112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * Custom drawables classes may be used in XML in multiple ways:
142112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <ul>
143112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette *     <li>
144112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette *         Using the fully-qualified class name as the XML element name. For
145112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette *         this method, the custom drawable class must be a public top-level
146112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette *         class.
147112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <pre>
148112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * &lt;com.myapp.MyCustomDrawable xmlns:android="http://schemas.android.com/apk/res/android"
149112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette *     android:color="#ffff0000" /&gt;
150112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * </pre>
151112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette *     </li>
152112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette *     <li>
153112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette *         Using <em>drawable</em> as the XML element name and specifying the
154112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette *         fully-qualified class name from the <em>class</em> attribute. This
155112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette *         method may be used for both public top-level classes and public
156112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette *         static inner classes.
157112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <pre>
158112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * &lt;drawable xmlns:android="http://schemas.android.com/apk/res/android"
159112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette *     class="com.myapp.MyTopLevelClass$InnerCustomDrawable"
160112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette *     android:color="#ffff0000" /&gt;
161112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * </pre>
162112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette *     </li>
163112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * </ul>
164112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette *
16561fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <div class="special reference">
16661fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <h3>Developer Guides</h3>
16761fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <p>For more information about how to use drawables, read the
16861fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <a href="{@docRoot}guide/topics/graphics/2d-graphics.html">Canvas and Drawables</a> developer
16961fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * guide. For information and examples of creating drawable resources (XML or bitmap files that
17061fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * can be loaded in code), read the
17161fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>
17261fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * document.</p></div>
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class Drawable {
17523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy    private static final Rect ZERO_BOUNDS_RECT = new Rect();
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
177607bd848269fb802550e63aa61945790616f97a7Alan Viverette    static final PorterDuff.Mode DEFAULT_TINT_MODE = PorterDuff.Mode.SRC_IN;
178607bd848269fb802550e63aa61945790616f97a7Alan Viverette
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int[] mStateSet = StateSet.WILD_CARD;
1800b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette    private int mLevel = 0;
181ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette    private @Config int mChangingConfigurations = 0;
1820f07b2c850ee1462ca4cf3137a954a9fc4bdf773Brad Fitzpatrick    private Rect mBounds = ZERO_BOUNDS_RECT;  // lazily becomes a new Rect()
183f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy    private WeakReference<Callback> mCallback = null;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mVisible = true;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
186b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio    private int mLayoutDirection;
187b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Draw in its bounds (set via setBounds) respecting optional effects such
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as alpha (set via setAlpha) and color filter (set via setColorFilter).
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param canvas The canvas to draw into
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
194b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public abstract void draw(@NonNull Canvas canvas);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specify a bounding rectangle for the Drawable. This is where the drawable
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will draw when its draw() method is called.
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setBounds(int left, int top, int right, int bottom) {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Rect oldBounds = mBounds;
20223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
20323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy        if (oldBounds == ZERO_BOUNDS_RECT) {
20423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy            oldBounds = mBounds = new Rect();
20523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy        }
20623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (oldBounds.left != left || oldBounds.top != top ||
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                oldBounds.right != right || oldBounds.bottom != bottom) {
20916f1d81d47beb1e04504a76de66e2919dde08c33Alan Viverette            if (!oldBounds.isEmpty()) {
21016f1d81d47beb1e04504a76de66e2919dde08c33Alan Viverette                // first invalidate the previous bounds
21116f1d81d47beb1e04504a76de66e2919dde08c33Alan Viverette                invalidateSelf();
212633326e29f008d2b86e523cfeedcbb2a0883181fChet Haase            }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBounds.set(left, top, right, bottom);
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onBoundsChange(mBounds);
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specify a bounding rectangle for the Drawable. This is where the drawable
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will draw when its draw() method is called.
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
222b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public void setBounds(@NonNull Rect bounds) {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setBounds(bounds.left, bounds.top, bounds.right, bounds.bottom);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return a copy of the drawable's bounds in the specified Rect (allocated
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by the caller). The bounds specify where this will draw when its draw()
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method is called.
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param bounds Rect to receive the drawable's bounds (allocated by the
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               caller).
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
234b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public final void copyBounds(@NonNull Rect bounds) {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bounds.set(mBounds);
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return a copy of the drawable's bounds in a new Rect. This returns the
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * same values as getBounds(), but the returned object is guaranteed to not
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be changed later by the drawable (i.e. it retains no reference to this
24223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     * rect). If the caller already has a Rect allocated, call copyBounds(rect).
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A copy of the drawable's bounds
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
246b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    @NonNull
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Rect copyBounds() {
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new Rect(mBounds);
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the drawable's bounds Rect. Note: for efficiency, the returned
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * object may be the same object stored in the drawable (though this is not
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * guaranteed), so if a persistent copy of the bounds is needed, call
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * copyBounds(rect) instead.
25623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     * You should also not change the object returned by this method as it may
25723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     * be the same object stored in the drawable.
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The bounds of the drawable (which may change later, so caller
26023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *         beware). DO NOT ALTER the returned object as it may change the
26123bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *         stored bounds of this drawable.
26223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
26323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     * @see #copyBounds()
264e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     * @see #copyBounds(android.graphics.Rect)
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
266b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    @NonNull
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Rect getBounds() {
26823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy        if (mBounds == ZERO_BOUNDS_RECT) {
26923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy            mBounds = new Rect();
27023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy        }
27123bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mBounds;
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
276d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     * Return the drawable's dirty bounds Rect. Note: for efficiency, the
277d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     * returned object may be the same object stored in the drawable (though
278d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     * this is not guaranteed).
279d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     * <p>
280d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     * By default, this returns the full drawable bounds. Custom drawables may
281d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     * override this method to perform more precise invalidation.
282d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     *
283e7772d313b88e9fd3366670a9c8d1b145edef344Alan Viverette     * @return The dirty bounds of this drawable
284d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     */
285b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    @NonNull
286d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette    public Rect getDirtyBounds() {
287d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette        return getBounds();
288d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette    }
289d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette
290d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette    /**
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set a mask of the configuration parameters for which this drawable
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * may change, requiring that it be re-created.
29323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param configs A mask of the changing configuration parameters, as
2958e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette     * defined by {@link android.content.pm.ActivityInfo}.
29623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
2978e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette     * @see android.content.pm.ActivityInfo
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
299ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette    public void setChangingConfigurations(@Config int configs) {
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mChangingConfigurations = configs;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return a mask of the configuration parameters for which this drawable
30569ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick     * may change, requiring that it be re-created.  The default implementation
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns whatever was provided through
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setChangingConfigurations(int)} or 0 by default.  Subclasses
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * may extend this to or in the changing configurations of any other
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * drawables they hold.
31023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a mask of the changing configuration parameters, as
3128e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette     * defined by {@link android.content.pm.ActivityInfo}.
31323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
3148e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette     * @see android.content.pm.ActivityInfo
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
316ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette    public @Config int getChangingConfigurations() {
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mChangingConfigurations;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32181e7dbddf10ecae99f65641d8774ca6b1aceac30Alan Viverette     * Set to true to have the drawable dither its colors when drawn to a
32281e7dbddf10ecae99f65641d8774ca6b1aceac30Alan Viverette     * device with fewer than 8-bits per color component.
323c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik     *
324c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik     * @see android.graphics.Paint#setDither(boolean);
32581e7dbddf10ecae99f65641d8774ca6b1aceac30Alan Viverette     * @deprecated This property is ignored.
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32781e7dbddf10ecae99f65641d8774ca6b1aceac30Alan Viverette    @Deprecated
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDither(boolean dither) {}
32923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
331c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik     * Set to true to have the drawable filter its bitmaps with bilinear
332c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik     * sampling when they are scaled or rotated.
333c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik     *
334c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik     * <p>This can improve appearance when bitmaps are rotated. If the drawable
335c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik     * does not use bitmaps, this call is ignored.</p>
336c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik     *
337c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik     * @see #isFilterBitmap()
338c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik     * @see android.graphics.Paint#setFilterBitmap(boolean);
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setFilterBitmap(boolean filter) {}
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
343c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik     * @return whether this drawable filters its bitmaps
344f4c068b72e2dee2e6944488ef00b64c93217d7e8Alan Viverette     * @see #setFilterBitmap(boolean)
345f4c068b72e2dee2e6944488ef00b64c93217d7e8Alan Viverette     */
346dfa4646eca54511a28f2c61e1f4b9c697e05a913Alan Viverette    public boolean isFilterBitmap() {
347f4c068b72e2dee2e6944488ef00b64c93217d7e8Alan Viverette        return false;
348f4c068b72e2dee2e6944488ef00b64c93217d7e8Alan Viverette    }
349f4c068b72e2dee2e6944488ef00b64c93217d7e8Alan Viverette
350f4c068b72e2dee2e6944488ef00b64c93217d7e8Alan Viverette    /**
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Implement this interface if you want to create an animated drawable that
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * extends {@link android.graphics.drawable.Drawable Drawable}.
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Upon retrieving a drawable, use
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Drawable#setCallback(android.graphics.drawable.Drawable.Callback)}
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to supply your implementation of the interface to the drawable; it uses
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this interface to schedule and execute animation changes.
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
358f6d87ec193f17e8dad82c9994ba7a58e975d364bAlan Viverette    public interface Callback {
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when the drawable needs to be redrawn.  A view at this point
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * should invalidate itself (or at least the part of itself where the
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * drawable appears).
36323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy         *
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param who The drawable that is requesting the update.
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
366f6d87ec193f17e8dad82c9994ba7a58e975d364bAlan Viverette        void invalidateDrawable(@NonNull Drawable who);
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * A Drawable can call this to schedule the next frame of its
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * animation.  An implementation can generally simply call
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@link android.os.Handler#postAtTime(Runnable, Object, long)} with
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the parameters <var>(what, who, when)</var> to perform the
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * scheduling.
37423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy         *
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param who The drawable being scheduled.
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param what The action to execute.
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param when The time (in milliseconds) to run.  The timebase is
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *             {@link android.os.SystemClock#uptimeMillis}
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
380f6d87ec193f17e8dad82c9994ba7a58e975d364bAlan Viverette        void scheduleDrawable(@NonNull Drawable who, @NonNull Runnable what, long when);
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * A Drawable can call this to unschedule an action previously
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * scheduled with {@link #scheduleDrawable}.  An implementation can
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * generally simply call
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@link android.os.Handler#removeCallbacks(Runnable, Object)} with
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the parameters <var>(what, who)</var> to unschedule the drawable.
38823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy         *
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param who The drawable being unscheduled.
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param what The action being unscheduled.
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
392f6d87ec193f17e8dad82c9994ba7a58e975d364bAlan Viverette        void unscheduleDrawable(@NonNull Drawable who, @NonNull Runnable what);
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Bind a {@link Callback} object to this Drawable.  Required for clients
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that want to support animated drawables.
39823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cb The client's Callback implementation.
400e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     *
401e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     * @see #getCallback()
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
403b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public final void setCallback(@Nullable Callback cb) {
404b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette        mCallback = cb != null ? new WeakReference<>(cb) : null;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
408f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy     * Return the current {@link Callback} implementation attached to this
409f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy     * Drawable.
410e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     *
411f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy     * @return A {@link Callback} instance or null if no callback was set.
412e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     *
413e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     * @see #setCallback(android.graphics.drawable.Drawable.Callback)
414f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy     */
415b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    @Nullable
416f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy    public Callback getCallback() {
417b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette        return mCallback != null ? mCallback.get() : null;
418f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy    }
419e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
420f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy    /**
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use the current {@link Callback} implementation to have this Drawable
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * redrawn.  Does nothing if there is no Callback attached to the
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Drawable.
42423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Callback#invalidateDrawable
426e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     * @see #getCallback()
427e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui     * @see #setCallback(android.graphics.drawable.Drawable.Callback)
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
429f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy    public void invalidateSelf() {
430f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        final Callback callback = getCallback();
431f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        if (callback != null) {
432f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy            callback.invalidateDrawable(this);
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use the current {@link Callback} implementation to have this Drawable
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scheduled.  Does nothing if there is no Callback attached to the
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Drawable.
44023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param what The action being scheduled.
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param when The time (in milliseconds) to run.
44323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Callback#scheduleDrawable
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
446b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public void scheduleSelf(@NonNull Runnable what, long when) {
447f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        final Callback callback = getCallback();
448f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        if (callback != null) {
449f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy            callback.scheduleDrawable(this, what, when);
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use the current {@link Callback} implementation to have this Drawable
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * unscheduled.  Does nothing if there is no Callback attached to the
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Drawable.
45723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param what The runnable that you no longer want called.
45923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Callback#unscheduleDrawable
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
462b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public void unscheduleSelf(@NonNull Runnable what) {
463f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        final Callback callback = getCallback();
464f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy        if (callback != null) {
465f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy            callback.unscheduleDrawable(this, what);
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
470b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio     * Returns the resolved layout direction for this Drawable.
471b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio     *
472c5daf84f6647d3280c59554cd6ec9c2a4f119bfcFabrice Di Meglio     * @return One of {@link android.view.View#LAYOUT_DIRECTION_LTR},
473a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     *         {@link android.view.View#LAYOUT_DIRECTION_RTL}
474a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * @see #setLayoutDirection(int)
475c1da65187a4b9de8f72bd617ef937030187c0a92Fabrice Di Meglio     */
476b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public @View.ResolvedLayoutDir int getLayoutDirection() {
477b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio        return mLayoutDirection;
478b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio    }
479b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio
480b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio    /**
481a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * Set the layout direction for this drawable. Should be a resolved
482a6c51149c59b2921507f6903e490bd00702972d1Doris Liu     * layout direction, as the Drawable has no capacity to do the resolution on
483a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * its own.
484b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio     *
485a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * @param layoutDirection the resolved layout direction for the drawable,
486a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     *                        either {@link android.view.View#LAYOUT_DIRECTION_LTR}
487a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     *                        or {@link android.view.View#LAYOUT_DIRECTION_RTL}
48878e561ce541e5c72780c68b5b14eb50c08bb97acAlan Viverette     * @return {@code true} if the layout direction change has caused the
48978e561ce541e5c72780c68b5b14eb50c08bb97acAlan Viverette     *         appearance of the drawable to change such that it needs to be
49078e561ce541e5c72780c68b5b14eb50c08bb97acAlan Viverette     *         re-drawn, {@code false} otherwise
491a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * @see #getLayoutDirection()
492b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio     */
493a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette    public final boolean setLayoutDirection(@View.ResolvedLayoutDir int layoutDirection) {
494a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette        if (mLayoutDirection != layoutDirection) {
495b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio            mLayoutDirection = layoutDirection;
496dfa4646eca54511a28f2c61e1f4b9c697e05a913Alan Viverette            return onLayoutDirectionChanged(layoutDirection);
4976a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio        }
498a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette        return false;
499a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette    }
500a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette
501a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette    /**
502a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * Called when the drawable's resolved layout direction changes.
503a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     *
504a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * @param layoutDirection the new resolved layout direction
50578e561ce541e5c72780c68b5b14eb50c08bb97acAlan Viverette     * @return {@code true} if the layout direction change has caused the
50678e561ce541e5c72780c68b5b14eb50c08bb97acAlan Viverette     *         appearance of the drawable to change such that it needs to be
50778e561ce541e5c72780c68b5b14eb50c08bb97acAlan Viverette     *         re-drawn, {@code false} otherwise
508a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * @see #setLayoutDirection(int)
509a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     */
510dfa4646eca54511a28f2c61e1f4b9c697e05a913Alan Viverette    public boolean onLayoutDirectionChanged(@View.ResolvedLayoutDir int layoutDirection) {
511a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette        return false;
5126a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio    }
5136a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio
5146a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio    /**
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specify an alpha value for the drawable. 0 means fully transparent, and
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * 255 means fully opaque.
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
518b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public abstract void setAlpha(@IntRange(from=0,to=255) int alpha);
51923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
521b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase     * Gets the current alpha value for the drawable. 0 means fully transparent,
522b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase     * 255 means fully opaque. This method is implemented by
523b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase     * Drawable subclasses and the value returned is specific to how that class treats alpha.
524b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase     * The default return value is 255 if the class does not override this method to return a value
525b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase     * specific to its use of alpha.
526b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase     */
527b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    @IntRange(from=0,to=255)
528b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase    public int getAlpha() {
529b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase        return 0xFF;
530b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase    }
531b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase
532b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase    /**
533bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * @hide
534bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     *
535bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * Internal-only method for setting xfermode on certain supported drawables.
536bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     *
537bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * Should not be made public since the layers and drawing area with which
538bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * Drawables draw is private implementation detail, and not something apps
539bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * should rely upon.
54031049d76c55b18a6d9993f0d9687598740b16014Adam Powell     */
541b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public void setXfermode(@Nullable Xfermode mode) {
54231049d76c55b18a6d9993f0d9687598740b16014Adam Powell        // Base implementation drops it on the floor for compatibility. Whee!
54331049d76c55b18a6d9993f0d9687598740b16014Adam Powell    }
54431049d76c55b18a6d9993f0d9687598740b16014Adam Powell
54531049d76c55b18a6d9993f0d9687598740b16014Adam Powell    /**
546bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * Specify an optional color filter for the drawable.
547bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * <p>
548bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * If a Drawable has a ColorFilter, each output pixel of the Drawable's
549bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * drawing contents will be modified by the color filter before it is
550bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * blended onto the render target of a Canvas.
551bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * </p>
552bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * <p>
553bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * Pass {@code null} to remove any existing color filter.
554bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * </p>
555bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * <p class="note"><strong>Note:</strong> Setting a non-{@code null} color
556bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * filter disables {@link #setTintList(ColorStateList) tint}.
557bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * </p>
558813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette     *
559bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * @param colorFilter The color filter to apply, or {@code null} to remove the
560813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette     *            existing color filter
561813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette     */
562bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik    public abstract void setColorFilter(@Nullable ColorFilter colorFilter);
563813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette
564813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette    /**
565d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette     * Specify a color and Porter-Duff mode to be the color filter for this
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * drawable.
567bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * <p>
568bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * Convenience for {@link #setColorFilter(ColorFilter)} which constructs a
569bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * {@link PorterDuffColorFilter}.
570bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * </p>
571bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * <p class="note"><strong>Note:</strong> Setting a color filter disables
572bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * {@link #setTintList(ColorStateList) tint}.
573bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * </p>
574bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     */
575417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye    public void setColorFilter(@ColorInt int color, @NonNull PorterDuff.Mode mode) {
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setColorFilter(new PorterDuffColorFilter(color, mode));
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
57823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
579d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette    /**
580bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * Specifies tint color for this drawable.
581bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * <p>
582bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * A Drawable's drawing content will be blended together with its tint
583bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * before it is drawn to the screen. This functions similarly to
584bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * {@link #setColorFilter(int, PorterDuff.Mode)}.
585bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * </p>
586a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * <p>
587bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * To clear the tint, pass {@code null} to
588bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * {@link #setTintList(ColorStateList)}.
589bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * </p>
590bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * <p class="note"><strong>Note:</strong> Setting a color filter via
591bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * {@link #setColorFilter(ColorFilter)} or
592bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * {@link #setColorFilter(int, PorterDuff.Mode)} overrides tint.
593bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * </p>
594a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     *
595bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * @param tintColor Color to use for tinting this drawable
596bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * @see #setTintList(ColorStateList)
597a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * @see #setTintMode(PorterDuff.Mode)
598a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     */
59980756e38882720860db52f1fcc21fa1505a02abfTor Norbye    public void setTint(@ColorInt int tintColor) {
600bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik        setTintList(ColorStateList.valueOf(tintColor));
601a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    }
602a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette
603a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    /**
604bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * Specifies tint color for this drawable as a color state list.
605a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * <p>
606bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * A Drawable's drawing content will be blended together with its tint
607bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * before it is drawn to the screen. This functions similarly to
608bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * {@link #setColorFilter(int, PorterDuff.Mode)}.
609bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * </p>
610bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * <p class="note"><strong>Note:</strong> Setting a color filter via
611bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * {@link #setColorFilter(ColorFilter)} or
612bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * {@link #setColorFilter(int, PorterDuff.Mode)} overrides tint.
613bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * </p>
614a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     *
615bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * @param tint Color state list to use for tinting this drawable, or
616bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     *            {@code null} to clear the tint
617bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * @see #setTint(int)
618a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * @see #setTintMode(PorterDuff.Mode)
619a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     */
620bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik    public void setTintList(@Nullable ColorStateList tint) {}
621a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette
622a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    /**
623a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * Specifies a tint blending mode for this drawable.
624a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * <p>
625bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * Defines how this drawable's tint color should be blended into the drawable
62678bf1d329a4c0210394f846be1fd1390314aefc0Alan Viverette     * before it is drawn to screen. Default tint mode is {@link PorterDuff.Mode#SRC_IN}.
627bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * </p>
628bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * <p class="note"><strong>Note:</strong> Setting a color filter via
629bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * {@link #setColorFilter(ColorFilter)} or
630bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * {@link #setColorFilter(int, PorterDuff.Mode)} overrides tint.
631bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * </p>
632a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     *
633a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     * @param tintMode A Porter-Duff blending mode
634bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * @see #setTint(int)
635bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik     * @see #setTintList(ColorStateList)
636a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette     */
637bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik    public void setTintMode(@NonNull PorterDuff.Mode tintMode) {}
638a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette
639a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette    /**
640813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette     * Returns the current color filter, or {@code null} if none set.
641813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette     *
642813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette     * @return the current color filter, or {@code null} if none set
643813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette     */
644b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public @Nullable ColorFilter getColorFilter() {
645813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette        return null;
646813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette    }
647813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette
648813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette    /**
649d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette     * Removes the color filter for this drawable.
650d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette     */
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearColorFilter() {
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setColorFilter(null);
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
656c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette     * Specifies the hotspot's location within the drawable.
657223622a50db319d634616311ff74267cf49679e7Alan Viverette     *
658860126b78aa4d6e8db5208c7f96764a8556cf95fAlan Viverette     * @param x The X coordinate of the center of the hotspot
659860126b78aa4d6e8db5208c7f96764a8556cf95fAlan Viverette     * @param y The Y coordinate of the center of the hotspot
660223622a50db319d634616311ff74267cf49679e7Alan Viverette     */
661c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette    public void setHotspot(float x, float y) {}
662223622a50db319d634616311ff74267cf49679e7Alan Viverette
663223622a50db319d634616311ff74267cf49679e7Alan Viverette    /**
664c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette     * Sets the bounds to which the hotspot is constrained, if they should be
665c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette     * different from the drawable bounds.
66653a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette     *
667a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * @param left position in pixels of the left bound
668a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * @param top position in pixels of the top bound
669a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * @param right position in pixels of the right bound
670a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * @param bottom position in pixels of the bottom bound
671a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * @see #getHotspotBounds(android.graphics.Rect)
67261956606818918194a38e045a8e35e7108480e5eAlan Viverette     */
67361956606818918194a38e045a8e35e7108480e5eAlan Viverette    public void setHotspotBounds(int left, int top, int right, int bottom) {}
674223622a50db319d634616311ff74267cf49679e7Alan Viverette
675a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette    /**
676a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * Populates {@code outRect} with the hotspot bounds.
677a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     *
678a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * @param outRect the rect to populate with the hotspot bounds
679a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     * @see #setHotspotBounds(int, int, int, int)
680a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette     */
681b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public void getHotspotBounds(@NonNull Rect outRect) {
6827068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette        outRect.set(getBounds());
6837068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette    }
6847068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette
685223622a50db319d634616311ff74267cf49679e7Alan Viverette    /**
686d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     * Whether this drawable requests projection.
687d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     *
688c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette     * @hide magic!
689d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette     */
690d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette    public boolean isProjected() {
691d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette        return false;
692d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette    }
693d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette
694d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette    /**
6953b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette     * Indicates whether this drawable will change its appearance based on
6963b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette     * state. Clients can use this to determine whether it is necessary to
6973b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette     * calculate their state and call setState.
69823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
6993b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette     * @return True if this drawable changes its appearance based on state,
7003b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette     *         false otherwise.
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setState(int[])
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isStateful() {
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
70623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specify a set of states for the drawable. These are use-case specific,
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so see the relevant documentation. As an example, the background for
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * widgets like Button understand the following states:
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * [{@link android.R.attr#state_focused},
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  {@link android.R.attr#state_pressed}].
71323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If the new state you are supplying causes the appearance of the
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Drawable to change, then it is responsible for calling
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #invalidateSelf} in order to have itself redrawn, <em>and</em>
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * true will be returned from this function.
71823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note: The Drawable holds a reference on to <var>stateSet</var>
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * until a new state array is given to it, so you must not modify this
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * array during that time.</p>
72223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param stateSet The new set of states to be displayed.
72423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if this change in state has caused the appearance
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the Drawable to change (hence requiring an invalidate), otherwise
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns false.
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
729b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public boolean setState(@NonNull final int[] stateSet) {
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!Arrays.equals(mStateSet, stateSet)) {
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStateSet = stateSet;
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return onStateChange(stateSet);
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Describes the current state, as a union of primitve states, such as
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#state_focused},
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.R.attr#state_selected}, etc.
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Some drawables may modify their imagery based on the selected state.
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return An array of resource Ids describing the current state.
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
744b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public @NonNull int[] getState() {
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStateSet;
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
74723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
749079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn     * If this Drawable does transition animations between states, ask that
750079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn     * it immediately jump to the current state and skip any active animations.
751079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn     */
752079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    public void jumpToCurrentState() {
753079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    }
754079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn
755079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn    /**
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The current drawable that will be used by this drawable. For simple drawables, this
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         is just the drawable itself. For drawables that change state like
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link StateListDrawable} and {@link LevelListDrawable} this will be the child drawable
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         currently in use.
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
761b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public @NonNull Drawable getCurrent() {
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return this;
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7660b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     * Specify the level for the drawable.  This allows a drawable to vary its
7670b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     * imagery based on a continuous controller, for example to show progress
7680b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     * or volume level.
76923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
7700b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     * <p>If the new level you are supplying causes the appearance of the
7710b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     * Drawable to change, then it is responsible for calling
7720b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     * {@link #invalidateSelf} in order to have itself redrawn, <em>and</em>
7730b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     * true will be returned from this function.
7740b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     *
7750b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     * @param level The new level, from 0 (minimum) to 10000 (maximum).
7763da32b768899e7dabe3a16333edf5eca2b9ebe93Alan Viverette     *
7770b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     * @return Returns true if this change in level has caused the appearance
7780b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     * of the Drawable to change (hence requiring an invalidate), otherwise
7790b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     * returns false.
7803da32b768899e7dabe3a16333edf5eca2b9ebe93Alan Viverette     */
781b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public final boolean setLevel(@IntRange(from=0,to=10000) int level) {
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mLevel != level) {
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLevel = level;
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return onLevelChange(level);
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7900b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     * Retrieve the current level.
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7920b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     * @return int Current level, from 0 (minimum) to 10000 (maximum).
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
794b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public final @IntRange(from=0,to=10000) int getLevel() {
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLevel;
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set whether this Drawable is visible.  This generally does not impact
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the Drawable's behavior, but is a hint that can be used by some
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Drawables, for example, to decide whether run animations.
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param visible Set to true if visible, false if not.
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param restart You can supply true here to force the drawable to behave
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                as if it has just become visible, even if it had last
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                been set visible.  Used for example to force animations
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                to restart.
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean Returns true if the new visibility is different than
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         its previous state.
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean setVisible(boolean visible, boolean restart) {
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean changed = mVisible != visible;
8149891e1fce5f29d0421d34aa481037417bd70853dChet Haase        if (changed) {
8159891e1fce5f29d0421d34aa481037417bd70853dChet Haase            mVisible = visible;
8169891e1fce5f29d0421d34aa481037417bd70853dChet Haase            invalidateSelf();
8179891e1fce5f29d0421d34aa481037417bd70853dChet Haase        }
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return changed;
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isVisible() {
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mVisible;
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8263f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     * Set whether this Drawable is automatically mirrored when its layout direction is RTL
8273f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     * (right-to left). See {@link android.util.LayoutDirection}.
8283f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     *
8293f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     * @param mirrored Set to true if the Drawable should be mirrored, false if not.
8303f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     */
8313f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    public void setAutoMirrored(boolean mirrored) {
8323f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    }
8333f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio
8343f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    /**
8353f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     * Tells if this Drawable will be automatically mirrored  when its layout direction is RTL
8363f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     * right-to-left. See {@link android.util.LayoutDirection}.
8373f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     *
8383f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     * @return boolean Returns true if this Drawable will be automatically mirrored.
8393f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio     */
8403f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    public boolean isAutoMirrored() {
8413f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio        return false;
8423f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    }
8433f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio
8443f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio    /**
84552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * Applies the specified theme to this Drawable and its children.
8467e3ede288926bdfb79b1571fed74cad614935821Alan Viverette     *
8477e3ede288926bdfb79b1571fed74cad614935821Alan Viverette     * @param t the theme to apply
84852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     */
8497e3ede288926bdfb79b1571fed74cad614935821Alan Viverette    public void applyTheme(@NonNull @SuppressWarnings("unused") Theme t) {
85052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
85152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
85252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    public boolean canApplyTheme() {
85352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        return false;
85452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
85552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
85652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    /**
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the opacity/transparency of this Drawable.  The returned value is
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * one of the abstract format constants in
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.graphics.PixelFormat}:
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.graphics.PixelFormat#UNKNOWN},
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.graphics.PixelFormat#TRANSLUCENT},
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.graphics.PixelFormat#TRANSPARENT}, or
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.graphics.PixelFormat#OPAQUE}.
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
86596a443b58d9c9849c846750657f959e3743bc5edChet Haase     * <p>An OPAQUE drawable is one that draws all all content within its bounds, completely
86696a443b58d9c9849c846750657f959e3743bc5edChet Haase     * covering anything behind the drawable. A TRANSPARENT drawable is one that draws nothing
86796a443b58d9c9849c846750657f959e3743bc5edChet Haase     * within its bounds, allowing everything behind it to show through. A TRANSLUCENT drawable
86896a443b58d9c9849c846750657f959e3743bc5edChet Haase     * is a drawable in any other state, where the drawable will draw some, but not all,
86996a443b58d9c9849c846750657f959e3743bc5edChet Haase     * of the content within its bounds and at least some content behind the drawable will
87096a443b58d9c9849c846750657f959e3743bc5edChet Haase     * be visible. If the visibility of the drawable's contents cannot be determined, the
87196a443b58d9c9849c846750657f959e3743bc5edChet Haase     * safest/best return value is TRANSLUCENT.
87296a443b58d9c9849c846750657f959e3743bc5edChet Haase     *
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Generally a Drawable should be as conservative as possible with the
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value it returns.  For example, if it contains multiple child drawables
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and only shows one of them at a time, if only one of the children is
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TRANSLUCENT and the others are OPAQUE then TRANSLUCENT should be
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned.  You can use the method {@link #resolveOpacity} to perform a
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * standard reduction of two opacities to the appropriate single output.
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
880ffb73620a24062c4c021f04254c3d4e8448b3dd3Chet Haase     * <p>Note that the returned value does not necessarily take into account a
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * custom alpha or color filter that has been applied by the client through
882ffb73620a24062c4c021f04254c3d4e8448b3dd3Chet Haase     * the {@link #setAlpha} or {@link #setColorFilter} methods. Some subclasses,
883ffb73620a24062c4c021f04254c3d4e8448b3dd3Chet Haase     * such as {@link BitmapDrawable}, {@link ColorDrawable}, and {@link GradientDrawable},
884ffb73620a24062c4c021f04254c3d4e8448b3dd3Chet Haase     * do account for the value of {@link #setAlpha}, but the general behavior is dependent
885ffb73620a24062c4c021f04254c3d4e8448b3dd3Chet Haase     * upon the implementation of the subclass.
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return int The opacity class of the Drawable.
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.graphics.PixelFormat
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
891b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public abstract @PixelFormat.Opacity int getOpacity();
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the appropriate opacity value for two source opacities.  If
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * either is UNKNOWN, that is returned; else, if either is TRANSLUCENT,
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that is returned; else, if either is TRANSPARENT, that is returned;
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * else, OPAQUE is returned.
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This is to help in implementing {@link #getOpacity}.
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param op1 One opacity value.
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param op2 Another opacity value.
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return int The combined opacity value.
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getOpacity
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
908b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public static @PixelFormat.Opacity int resolveOpacity(@PixelFormat.Opacity int op1,
909b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette            @PixelFormat.Opacity int op2) {
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (op1 == op2) {
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return op1;
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (op1 == PixelFormat.UNKNOWN || op2 == PixelFormat.UNKNOWN) {
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PixelFormat.UNKNOWN;
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (op1 == PixelFormat.TRANSLUCENT || op2 == PixelFormat.TRANSLUCENT) {
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PixelFormat.TRANSLUCENT;
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (op1 == PixelFormat.TRANSPARENT || op2 == PixelFormat.TRANSPARENT) {
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return PixelFormat.TRANSPARENT;
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return PixelFormat.OPAQUE;
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a Region representing the part of the Drawable that is completely
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * transparent.  This can be used to perform drawing operations, identifying
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which parts of the target will not change when rendering the Drawable.
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The default implementation returns null, indicating no transparent
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * region; subclasses can optionally override this to return an actual
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Region if they want to supply this optimization information, but it is
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not required that they do so.
93323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns null if the Drawables has no transparent region to
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * report, else a Region holding the parts of the Drawable's bounds that
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * are transparent.
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
938b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public @Nullable Region getTransparentRegion() {
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
94123bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Override this in your subclass to change appearance if you recognize the
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * specified state.
94523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the state change has caused the appearance of
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the Drawable to change (that is, it needs to be drawn), else false
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if it looks the same and there is no need to redraw it since its
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * last state.
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
951b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    protected boolean onStateChange(int[] state) {
952b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette        return false;
953b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    }
954b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette
9550b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette    /** Override this in your subclass to change appearance if you vary based
9560b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     *  on level.
9570b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     * @return Returns true if the level change has caused the appearance of
9580b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     * the Drawable to change (that is, it needs to be drawn), else false
9590b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     * if it looks the same and there is no need to redraw it since its
9600b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette     * last level.
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
962b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    protected boolean onLevelChange(int level) {
963b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette        return false;
964b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    }
965b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
967c502744f2ddcc80a34f5197b5d2c0d701c7d6e71Newton Allen     * Override this in your subclass to change appearance if you vary based on
968c502744f2ddcc80a34f5197b5d2c0d701c7d6e71Newton Allen     * the bounds.
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
970b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    protected void onBoundsChange(Rect bounds) {
971b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette        // Stub method.
972b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    }
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
97576165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette     * Returns the drawable's intrinsic width.
97676165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette     * <p>
97776165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette     * Intrinsic width is the width at which the drawable would like to be laid
97876165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette     * out, including any inherent padding. If the drawable has no intrinsic
97976165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette     * width, such as a solid color, this method returns -1.
98076165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette     *
98176165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette     * @return the intrinsic width, or -1 if no intrinsic width
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getIntrinsicWidth() {
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
98876165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette     * Returns the drawable's intrinsic height.
98976165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette     * <p>
99076165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette     * Intrinsic height is the height at which the drawable would like to be
99176165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette     * laid out, including any inherent padding. If the drawable has no
99276165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette     * intrinsic height, such as a solid color, this method returns -1.
99376165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette     *
99476165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette     * @return the intrinsic height, or -1 if no intrinsic height
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getIntrinsicHeight() {
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
99923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the minimum width suggested by this Drawable. If a View uses this
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Drawable as a background, it is suggested that the View use at least this
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value for its width. (There will be some scenarios where this will not be
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * possible.) This value should INCLUDE any padding.
100523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The minimum width suggested by this Drawable. If this Drawable
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         doesn't have a suggested minimum width, 0 is returned.
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getMinimumWidth() {
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int intrinsicWidth = getIntrinsicWidth();
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return intrinsicWidth > 0 ? intrinsicWidth : 0;
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the minimum height suggested by this Drawable. If a View uses this
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Drawable as a background, it is suggested that the View use at least this
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value for its height. (There will be some scenarios where this will not be
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * possible.) This value should INCLUDE any padding.
101923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy     *
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The minimum height suggested by this Drawable. If this Drawable
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         doesn't have a suggested minimum height, 0 is returned.
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getMinimumHeight() {
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int intrinsicHeight = getIntrinsicHeight();
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return intrinsicHeight > 0 ? intrinsicHeight : 0;
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
102723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return in padding the insets suggested by this Drawable for placing
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * content inside the drawable's bounds. Positive values move toward the
10317dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik     * center of the Drawable (set Rect.inset).
10327dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik     *
10337dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik     * @return true if this drawable actually has a padding, else false. When false is returned,
10347dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik     * the padding is always set to 0.
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10367dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik    public boolean getPadding(@NonNull Rect padding) {
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        padding.set(0, 0, 0, 0);
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10421557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne     * Return in insets the layout insets suggested by this Drawable for use with alignment
1043bbd51f1e360b22eece1d74bd65c7e6a0b59dee59Philip Milne     * operations during layout.
10441557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne     *
10451557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne     * @hide
10461557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne     */
1047b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public @NonNull Insets getOpticalInsets() {
1048bbd51f1e360b22eece1d74bd65c7e6a0b59dee59Philip Milne        return Insets.NONE;
10491557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne    }
10501557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne
10511557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne    /**
10529a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik     * Called to get the drawable to populate the Outline that defines its drawing area.
1053b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik     * <p>
10549a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik     * This method is called by the default {@link android.view.ViewOutlineProvider} to define
10559a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik     * the outline of the View.
10567dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik     * <p>
105777b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik     * The default behavior defines the outline to be the bounding rectangle of 0 alpha.
105877b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik     * Subclasses that wish to convey a different shape or alpha value must override this method.
10597dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik     *
10609a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik     * @see android.view.View#setOutlineProvider(android.view.ViewOutlineProvider)
1061b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik     */
106231ba192dd201df2cad96a8c503f730130ab0d80fChris Craik    public void getOutline(@NonNull Outline outline) {
1063e6a39b12656ab8d5c77d8366b24aa6410fd42e11Chris Craik        outline.setRect(getBounds());
10643f873d86441c30f5d45640a9f70b3b7331985c90Chris Craik        outline.setAlpha(0);
1065e6a39b12656ab8d5c77d8366b24aa6410fd42e11Chris Craik    }
1066b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
1067b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    /**
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Make this drawable mutable. This operation cannot be reversed. A mutable
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * drawable is guaranteed to not share its state with any other drawable.
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is especially useful when you need to modify properties of drawables
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * loaded from resources. By default, all drawables instances loaded from
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the same resource share a common state; if you modify the state of one
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance, all the other instances will receive the same modification.
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calling this method on a mutable Drawable will have no effect.
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return This drawable.
10781e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * @see ConstantState
10791e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * @see #getConstantState()
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1081b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public @NonNull Drawable mutate() {
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return this;
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1086727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     * Clears the mutated state, allowing this drawable to be cached and
1087727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     * mutated again.
1088727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     * <p>
1089727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     * This is hidden because only framework drawables can be cached, so
1090727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     * custom drawables don't need to support constant state, mutate(), or
1091727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     * clearMutated().
1092727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     *
1093727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     * @hide
1094727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette     */
1095727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette    public void clearMutated() {
1096727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette        // Default implementation is no-op.
1097727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette    }
1098727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette
1099727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette    /**
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a drawable from an inputstream
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Drawable createFromStream(InputStream is, String srcName) {
11030acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, srcName != null ? srcName : "Unknown drawable");
11040acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        try {
11056dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette            return createFromResourceStream(null, null, is, srcName);
11060acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        } finally {
11070acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn            Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
11080acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        }
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
111211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn     * Create a drawable from an inputstream, using the given resources and
111311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn     * value to determine density information.
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Drawable createFromResourceStream(Resources res, TypedValue value,
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputStream is, String srcName) {
11170acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, srcName != null ? srcName : "Unknown drawable");
11180acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        try {
1119910a0b4d02d0be3e164a32825785fa3d02fe55a2Alan Viverette            return createFromResourceStream(res, value, is, srcName, null);
11200acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        } finally {
11210acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn            Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
11220acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        }
11237341d7a104b47996445d069a695e155a07184606Dianne Hackborn    }
11247341d7a104b47996445d069a695e155a07184606Dianne Hackborn
11257341d7a104b47996445d069a695e155a07184606Dianne Hackborn    /**
11267341d7a104b47996445d069a695e155a07184606Dianne Hackborn     * Create a drawable from an inputstream, using the given resources and
11277341d7a104b47996445d069a695e155a07184606Dianne Hackborn     * value to determine density information.
11287341d7a104b47996445d069a695e155a07184606Dianne Hackborn     */
11297341d7a104b47996445d069a695e155a07184606Dianne Hackborn    public static Drawable createFromResourceStream(Resources res, TypedValue value,
11307341d7a104b47996445d069a695e155a07184606Dianne Hackborn            InputStream is, String srcName, BitmapFactory.Options opts) {
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (is == null) {
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*  ugh. The decodeStream contract is that we have already allocated
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            the pad rect, but if the bitmap does not had a ninepatch chunk,
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            then the pad will be ignored. If we could change this to lazily
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            alloc/assign the rect, we could avoid the GC churn of making new
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Rects only to drop them on the floor.
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        */
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Rect pad = new Rect();
1142e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
114311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        // Special stuff for compatibility mode: if the target density is not
114411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        // the same as the display density, but the resource -is- the same as
114511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        // the display density, then don't scale it down to the target density.
114611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        // This allows us to load the system's density-correct resources into
114711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        // an application in compatibility mode, without scaling those down
114811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        // to the compatibility density only to have them scaled back up when
114911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        // drawn to the screen.
11507341d7a104b47996445d069a695e155a07184606Dianne Hackborn        if (opts == null) opts = new BitmapFactory.Options();
1151ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette        opts.inScreenDensity = Drawable.resolveDensity(res, 0);
115211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        Bitmap  bm = BitmapFactory.decodeResourceStream(res, value, is, pad, opts);
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (bm != null) {
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] np = bm.getNinePatchChunk();
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (np == null || !NinePatch.isNinePatchChunk(np)) {
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                np = null;
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pad = null;
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1159c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette
1160c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette            final Rect opticalInsets = new Rect();
1161c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette            bm.getOpticalInsets(opticalInsets);
1162c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette            return drawableFromBitmap(res, bm, np, pad, opticalInsets, srcName);
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a drawable from an XML document. For more information on how to
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * create resources in XML, see
1170dfe5c204403bc56c29bb36410574eab8b1950417Scott Main     * <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Drawable createFromXml(Resources r, XmlPullParser parser)
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
11746dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette        return createFromXml(r, parser, null);
117552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
117652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
117752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    /**
11786dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette     * Create a drawable from an XML document using an optional {@link Theme}.
11796dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette     * For more information on how to create resources in XML, see
118052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.
118152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     */
11826dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette    public static Drawable createFromXml(Resources r, XmlPullParser parser, Theme theme)
118352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            throws XmlPullParserException, IOException {
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttributeSet attrs = Xml.asAttributeSet(parser);
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
1187b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette        //noinspection StatementWithEmptyBody
1188b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette        while ((type=parser.next()) != XmlPullParser.START_TAG
1189b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette                && type != XmlPullParser.END_DOCUMENT) {
1190b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette            // Empty loop.
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type != XmlPullParser.START_TAG) {
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new XmlPullParserException("No start tag found");
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11976dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette        Drawable drawable = createFromXmlInner(r, parser, attrs, theme);
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (drawable == null) {
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Unknown initial tag: " + parser.getName());
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return drawable;
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create from inside an XML document.  Called on a parser positioned at
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a tag in an XML document, tries to create a Drawable from that tag.
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns null if the tag is not a valid drawable.
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs)
121252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            throws XmlPullParserException, IOException {
12136dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette        return createFromXmlInner(r, parser, attrs, null);
121452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1216e5b082d6eb0489e7dbe3159338f8c94c0af61deeAlan Viverette    /**
12176dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette     * Create a drawable from inside an XML document using an optional
12186dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette     * {@link Theme}. Called on a parser positioned at a tag in an XML
12196dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette     * document, tries to create a Drawable from that tag. Returns {@code null}
12206dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette     * if the tag is not a valid drawable.
1221e5b082d6eb0489e7dbe3159338f8c94c0af61deeAlan Viverette     */
12226dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette    public static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs,
12236dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette            Theme theme) throws XmlPullParserException, IOException {
122402fc5fef36357467eba22a0ee250a96734daf791Alan Viverette        return r.getDrawableInflater().inflateFromXml(parser.getName(), parser, attrs, theme);
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a drawable from file path name.
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Drawable createFromPath(String pathName) {
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pathName == null) {
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12350acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, pathName);
12360acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        try {
12370acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn            Bitmap bm = BitmapFactory.decodeFile(pathName);
12380acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn            if (bm != null) {
12390acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn                return drawableFromBitmap(null, bm, null, null, null, pathName);
12400acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn            }
12410acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn        } finally {
12420acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn            Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12481e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne    /**
124952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * Inflate this Drawable from an XML resource. Does not apply a theme.
125052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     *
125152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * @see #inflate(Resources, XmlPullParser, AttributeSet, Theme)
12521e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     */
12537e3ede288926bdfb79b1571fed74cad614935821Alan Viverette    public void inflate(@NonNull Resources r, @NonNull XmlPullParser parser,
12547e3ede288926bdfb79b1571fed74cad614935821Alan Viverette            @NonNull AttributeSet attrs) throws XmlPullParserException, IOException {
125552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        inflate(r, parser, attrs, null);
125652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
125752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
125852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    /**
125952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * Inflate this Drawable from an XML resource optionally styled by a theme.
12604eab3850ec1a6cd3ec86f0c648497ee51c3ac609Teng-Hui Zhu     * This can't be called more than once for each Drawable. Note that framework may have called
12614eab3850ec1a6cd3ec86f0c648497ee51c3ac609Teng-Hui Zhu     * this once to create the Drawable instance from XML resource.
126252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     *
126352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * @param r Resources used to resolve attribute values
126452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * @param parser XML parser from which to inflate this Drawable
126552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * @param attrs Base set of attribute values
126652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * @param theme Theme to apply, may be null
126752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * @throws XmlPullParserException
126852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * @throws IOException
126952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     */
12707e3ede288926bdfb79b1571fed74cad614935821Alan Viverette    public void inflate(@NonNull Resources r, @NonNull XmlPullParser parser,
12717e3ede288926bdfb79b1571fed74cad614935821Alan Viverette            @NonNull AttributeSet attrs, @Nullable Theme theme)
127252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            throws XmlPullParserException, IOException {
12737e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.Drawable);
12747e3ede288926bdfb79b1571fed74cad614935821Alan Viverette        mVisible = a.getBoolean(R.styleable.Drawable_visible, mVisible);
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12781e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne    /**
12791e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * Inflate a Drawable from an XML resource.
12801e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     *
12811e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * @throws XmlPullParserException
12821e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * @throws IOException
12831e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     */
1284b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    void inflateWithAttributes(@NonNull @SuppressWarnings("unused") Resources r,
1285b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette            @NonNull @SuppressWarnings("unused") XmlPullParser parser, @NonNull TypedArray attrs,
1286b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette            @AttrRes int visibleAttr) throws XmlPullParserException, IOException {
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mVisible = attrs.getBoolean(visibleAttr, mVisible);
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12901e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne    /**
12911e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * This abstract class is used by {@link Drawable}s to store shared constant state and data
12921e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * between Drawables. {@link BitmapDrawable}s created from the same resource will for instance
12931e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * share a unique bitmap stored in their ConstantState.
12941e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     *
12951e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * <p>
12961e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * {@link #newDrawable(Resources)} can be used as a factory to create new Drawable instances
12971e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * from this ConstantState.
12981e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * </p>
12991e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     *
13001e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * Use {@link Drawable#getConstantState()} to retrieve the ConstantState of a Drawable. Calling
13011e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * {@link Drawable#mutate()} on a Drawable should typically create a new ConstantState for that
13021e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * Drawable.
13031e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     */
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static abstract class ConstantState {
1305c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        /**
1306477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * Creates a new Drawable instance from its constant state.
1307477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * <p>
1308477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * <strong>Note:</strong> Using this method means density-dependent
1309477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * properties, such as pixel dimensions or bitmap images, will not be
1310477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * updated to match the density of the target display. To ensure
1311477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * correct scaling, use {@link #newDrawable(Resources)} instead to
1312477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * provide an appropriate Resources object.
1313477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         *
1314477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * @return a new drawable object based on this constant state
1315477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * @see {@link #newDrawable(Resources)}
1316c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn         */
1317b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette        public abstract @NonNull Drawable newDrawable();
131852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
1319c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        /**
1320477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * Creates a new Drawable instance from its constant state using the
1321477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * specified resources. This method should be implemented for drawables
1322477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * that have density-dependent properties.
1323477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * <p>
1324477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * The default implementation for this method calls through to
1325477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * {@link #newDrawable()}.
1326477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         *
1327477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * @param res the resources of the context in which the drawable will
1328477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         *            be displayed
1329477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * @return a new drawable object based on this constant state
1330c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn         */
1331b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette        public @NonNull Drawable newDrawable(@Nullable Resources res) {
1332c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn            return newDrawable();
1333c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        }
133452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
133552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        /**
1336477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * Creates a new Drawable instance from its constant state using the
1337477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * specified resources and theme. This method should be implemented for
1338477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * drawables that have theme-dependent properties.
1339477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * <p>
1340477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * The default implementation for this method calls through to
1341477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * {@link #newDrawable(Resources)}.
1342477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         *
1343477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * @param res the resources of the context in which the drawable will
1344477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         *            be displayed
1345477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * @param theme the theme of the context in which the drawable will be
1346477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         *              displayed
1347477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette         * @return a new drawable object based on this constant state
134852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette         */
1349b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette        public @NonNull Drawable newDrawable(@Nullable Resources res,
1350b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette                @Nullable @SuppressWarnings("unused") Theme theme) {
1351477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette            return newDrawable(res);
135252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
135352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
1354c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn        /**
1355c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn         * Return a bit mask of configuration changes that will impact
1356c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn         * this drawable (and thus require completely reloading it).
1357c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn         */
1358ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette        public abstract @Config int getChangingConfigurations();
13593b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
13603b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        /**
1361dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck         * @return Total pixel count
13623b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy         * @hide
13633b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy         */
1364b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette        public int addAtlasableBitmaps(@NonNull Collection<Bitmap> atlasList) {
1365dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck            return 0;
1366dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck        }
1367dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck
1368dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck        /** @hide */
1369b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette        protected final boolean isAtlasable(@Nullable Bitmap bitmap) {
1370dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck            return bitmap != null && bitmap.getConfig() == Bitmap.Config.ARGB_8888;
13713b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        }
137252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
137352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        /**
137452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette         * Return whether this constant state can have a theme applied.
137552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette         */
137652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        public boolean canApplyTheme() {
137752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            return false;
137852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13811e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne    /**
13821e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * Return a {@link ConstantState} instance that holds the shared state of this Drawable.
1383d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette     *
13841e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * @return The ConstantState associated to that Drawable.
13851e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * @see ConstantState
13861e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     * @see Drawable#mutate()
13871e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne     */
1388b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public @Nullable ConstantState getConstantState() {
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static Drawable drawableFromBitmap(Resources res, Bitmap bm, byte[] np,
1393ec4a50428d5f26a22df3edaf7e5b08f41d5cb54bAmith Yamasani            Rect pad, Rect layoutBounds, String srcName) {
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (np != null) {
13961557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne            return new NinePatchDrawable(res, bm, np, pad, layoutBounds, srcName);
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
139911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        return new BitmapDrawable(res, bm);
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1401d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette
1402d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette    /**
1403b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette     * Ensures the tint filter is consistent with the current tint color and
1404b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette     * mode.
1405b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette     */
1406b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    @Nullable PorterDuffColorFilter updateTintFilter(@Nullable PorterDuffColorFilter tintFilter,
1407b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette            @Nullable ColorStateList tint, @Nullable PorterDuff.Mode tintMode) {
1408b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        if (tint == null || tintMode == null) {
1409b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            return null;
1410b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        }
1411b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
1412b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        final int color = tint.getColorForState(getState(), Color.TRANSPARENT);
1413b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        if (tintFilter == null) {
1414b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette            return new PorterDuffColorFilter(color, tintMode);
1415b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        }
1416b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
1417b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        tintFilter.setColor(color);
1418b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        tintFilter.setMode(tintMode);
1419b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette        return tintFilter;
1420b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    }
1421b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette
1422b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette    /**
142352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * Obtains styled attributes from the theme, if available, or unstyled
142452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     * resources if the theme is null.
142552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette     */
1426b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    static @NonNull TypedArray obtainAttributes(@NonNull Resources res, @Nullable Theme theme,
1427b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette            @NonNull AttributeSet set, @NonNull int[] attrs) {
142852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        if (theme == null) {
142952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette            return res.obtainAttributes(set, attrs);
143052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        }
143152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette        return theme.obtainStyledAttributes(set, attrs, 0, 0);
143252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    }
143352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette
143452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette    /**
1435ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * Scales a floating-point pixel value from the source density to the
1436ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * target density.
1437ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     *
1438ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * @param pixels the pixel value for use in source density
1439ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * @param sourceDensity the source density
1440ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * @param targetDensity the target density
1441ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * @return the scaled pixel value for use in target density
1442ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     */
1443ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette    static float scaleFromDensity(float pixels, int sourceDensity, int targetDensity) {
1444ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette        return pixels * targetDensity / sourceDensity;
1445ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette    }
1446ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette
1447ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette    /**
1448ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * Scales a pixel value from the source density to the target density,
1449ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * optionally handling the resulting pixel value as a size rather than an
1450ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * offset.
1451ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * <p>
1452ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * A size conversion involves rounding the base value and ensuring that
1453ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * a non-zero base value is at least one pixel in size.
1454ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * <p>
1455ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * An offset conversion involves simply truncating the base value to an
1456ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * integer.
1457ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     *
1458ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * @param pixels the pixel value for use in source density
1459ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * @param sourceDensity the source density
1460ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * @param targetDensity the target density
1461ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * @param isSize {@code true} to handle the resulting scaled value as a
1462ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     *               size, or {@code false} to handle it as an offset
1463ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     * @return the scaled pixel value for use in target density
1464ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette     */
1465ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette    static int scaleFromDensity(
1466ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette            int pixels, int sourceDensity, int targetDensity, boolean isSize) {
1467ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette        if (pixels == 0 || sourceDensity == targetDensity) {
1468ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette            return pixels;
1469ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette        }
1470ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette
1471ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette        final float result = pixels * targetDensity / (float) sourceDensity;
1472ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette        if (!isSize) {
1473ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette            return (int) result;
1474ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette        }
1475ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette
1476ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette        final int rounded = Math.round(result);
1477ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette        if (rounded != 0) {
1478ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette            return rounded;
1479ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette        } else if (pixels > 0) {
1480ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette            return 1;
1481ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette        } else {
1482ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette            return -1;
1483ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette        }
1484ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette    }
1485ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette
1486d633ca417d3925521ab15fba1c0cdac172efb184Alan Viverette    static int resolveDensity(@Nullable Resources r, int parentDensity) {
1487ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette        final int densityDpi = r == null ? parentDensity : r.getDisplayMetrics().densityDpi;
1488ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette        return densityDpi == 0 ? DisplayMetrics.DENSITY_DEFAULT : densityDpi;
1489ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette    }
1490ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette
1491ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette    /**
1492c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette     * Re-throws an exception as a {@link RuntimeException} with an empty stack
1493c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette     * trace to avoid cluttering the log. The original exception's stack trace
1494c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette     * will still be included.
1495c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette     *
1496c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette     * @param cause the exception to re-throw
1497c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette     * @throws RuntimeException
1498c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette     */
1499b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    static void rethrowAsRuntimeException(@NonNull Exception cause) throws RuntimeException {
1500c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette        final RuntimeException e = new RuntimeException(cause);
1501c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette        e.setStackTrace(new StackTraceElement[0]);
1502c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette        throw e;
1503c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette    }
1504c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette
1505c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette    /**
150612b97f5d2b15194ed6673c9838b13c8312157709Alan Viverette     * Parses a {@link android.graphics.PorterDuff.Mode} from a tintMode
1507d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette     * attribute's enum value.
1508911743652b597057a1bd7ef8a921e9ff8dce0f4aAlan Viverette     *
1509911743652b597057a1bd7ef8a921e9ff8dce0f4aAlan Viverette     * @hide
1510d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette     */
1511911743652b597057a1bd7ef8a921e9ff8dce0f4aAlan Viverette    public static PorterDuff.Mode parseTintMode(int value, Mode defaultMode) {
151212b97f5d2b15194ed6673c9838b13c8312157709Alan Viverette        switch (value) {
15132f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette            case 3: return Mode.SRC_OVER;
15142f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette            case 5: return Mode.SRC_IN;
15152f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette            case 9: return Mode.SRC_ATOP;
15162f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette            case 14: return Mode.MULTIPLY;
15172f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette            case 15: return Mode.SCREEN;
15182f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette            case 16: return Mode.ADD;
15192f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette            default: return defaultMode;
1520d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette        }
1521d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette    }
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1524