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.widget; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.BitmapShader; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 25b25ffffc3157c4c471c326147be750f4ebec456aSteve Howardimport android.graphics.Shader; 26b25ffffc3157c4c471c326147be750f4ebec456aSteve Howardimport android.graphics.drawable.Animatable; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.AnimationDrawable; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.BitmapDrawable; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.ClipDrawable; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.LayerDrawable; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.ShapeDrawable; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.StateListDrawable; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.shapes.RoundRectShape; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.shapes.Shape; 36b25ffffc3157c4c471c326147be750f4ebec456aSteve Howardimport android.os.Parcel; 37b25ffffc3157c4c471c326147be750f4ebec456aSteve Howardimport android.os.Parcelable; 38b25ffffc3157c4c471c326147be750f4ebec456aSteve Howardimport android.os.SystemClock; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity; 41b25ffffc3157c4c471c326147be750f4ebec456aSteve Howardimport android.view.RemotableViewMethod; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 437a36788f4a69b3ddaf8fb8e250e1a13bee7238faSteve Zeiglerimport android.view.ViewDebug; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.AlphaAnimation; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Animation; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.AnimationUtils; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Interpolator; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.LinearInterpolator; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Transformation; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.RemoteViews.RemoteView; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.R; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Visual indicator of progress in some operation. Displays a bar to the user 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * representing how far the operation has progressed; the application can 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * change the amount of progress (modifying the length of the bar) as it moves 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * forward. There is also a secondary progress displayable on a progress bar 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which is useful for displaying intermediate progress, such as the buffer 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * level during a streaming playback progress bar. 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A progress bar can also be made indeterminate. In indeterminate mode, the 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress bar shows a cyclic animation. This mode is used by applications 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when the length of the task is unknown. 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The following code example shows how a progress bar can be used from 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a worker thread to update the user interface to notify the user of progress: 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class MyActivity extends Activity { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private static final int PROGRESS = 0x1; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private ProgressBar mProgress; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private int mProgressStatus = 0; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private Handler mHandler = new Handler(); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * protected void onCreate(Bundle icicle) { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * super.onCreate(icicle); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setContentView(R.layout.progressbar_activity); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mProgress = (ProgressBar) findViewById(R.id.progress_bar); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // Start lengthy operation in a background thread 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * new Thread(new Runnable() { 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public void run() { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * while (mProgressStatus < 100) { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mProgressStatus = doWork(); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // Update the progress bar 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mHandler.post(new Runnable() { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public void run() { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mProgress.setProgress(mProgressStatus); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }).start(); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre> 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>XML attributes</b></strong> 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link android.R.styleable#ProgressBar ProgressBar Attributes}, 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#View View Attributes} 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>Styles</b></strong> 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Theme_progressBarStyle 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Theme_progressBarStyleSmall 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Theme_progressBarStyleLarge 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Theme_progressBarStyleHorizontal 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@RemoteView 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ProgressBar extends View { 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MAX_LEVEL = 10000; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int ANIMATION_RESOLUTION = 200; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mMinWidth; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mMaxWidth; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mMinHeight; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mMaxHeight; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mProgress; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mSecondaryProgress; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mMax; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mBehavior; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDuration; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mIndeterminate; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mOnlyIndeterminate; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Transformation mTransformation; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AlphaAnimation mAnimation; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mIndeterminateDrawable; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mProgressDrawable; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mCurrentDrawable; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap mSampleTile; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mNoInvalidate; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Interpolator mInterpolator; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private RefreshProgressRunnable mRefreshProgressRunnable; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mUiThreadId; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mShouldStartAnimationDrawable; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mLastDrawTime; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mInDrawing; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new progress bar with range 0...100 and initial progress of 0. 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context the application environment 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ProgressBar(Context context) { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, null); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ProgressBar(Context context, AttributeSet attrs) { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, attrs, com.android.internal.R.attr.progressBarStyle); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ProgressBar(Context context, AttributeSet attrs, int defStyle) { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUiThreadId = Thread.currentThread().getId(); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initProgressBar(); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context.obtainStyledAttributes(attrs, R.styleable.ProgressBar, defStyle, 0); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoInvalidate = true; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable drawable = a.getDrawable(R.styleable.ProgressBar_progressDrawable); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable != null) { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable = tileify(drawable, false); 1828d21bdb90573ec48491c44eca312c162e262298dRomain Guy // Calling this method can set mMaxHeight, make sure the corresponding 1838d21bdb90573ec48491c44eca312c162e262298dRomain Guy // XML attribute for mMaxHeight is read after calling this method 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgressDrawable(drawable); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDuration = a.getInt(R.styleable.ProgressBar_indeterminateDuration, mDuration); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinWidth = a.getDimensionPixelSize(R.styleable.ProgressBar_minWidth, mMinWidth); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMaxWidth = a.getDimensionPixelSize(R.styleable.ProgressBar_maxWidth, mMaxWidth); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinHeight = a.getDimensionPixelSize(R.styleable.ProgressBar_minHeight, mMinHeight); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMaxHeight = a.getDimensionPixelSize(R.styleable.ProgressBar_maxHeight, mMaxHeight); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBehavior = a.getInt(R.styleable.ProgressBar_indeterminateBehavior, mBehavior); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19772b1f379d5c97c8ff31d2201e78215af777d6bdaJean-Baptiste Queru final int resID = a.getResourceId( 19872b1f379d5c97c8ff31d2201e78215af777d6bdaJean-Baptiste Queru com.android.internal.R.styleable.ProgressBar_interpolator, 19972b1f379d5c97c8ff31d2201e78215af777d6bdaJean-Baptiste Queru android.R.anim.linear_interpolator); // default to linear interpolator 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resID > 0) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInterpolator(context, resID); 20272b1f379d5c97c8ff31d2201e78215af777d6bdaJean-Baptiste Queru } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMax(a.getInt(R.styleable.ProgressBar_max, mMax)); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgress(a.getInt(R.styleable.ProgressBar_progress, mProgress)); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setSecondaryProgress( 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.getInt(R.styleable.ProgressBar_secondaryProgress, mSecondaryProgress)); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable = a.getDrawable(R.styleable.ProgressBar_indeterminateDrawable); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable != null) { 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable = tileifyIndeterminate(drawable); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setIndeterminateDrawable(drawable); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnlyIndeterminate = a.getBoolean( 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.ProgressBar_indeterminateOnly, mOnlyIndeterminate); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoInvalidate = false; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setIndeterminate(mOnlyIndeterminate || a.getBoolean( 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.ProgressBar_indeterminate, mIndeterminate)); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Converts a drawable to a tiled version of itself. It will recursively 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * traverse layer and state list drawables. 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable tileify(Drawable drawable, boolean clip) { 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable instanceof LayerDrawable) { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerDrawable background = (LayerDrawable) drawable; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = background.getNumberOfLayers(); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable[] outDrawables = new Drawable[N]; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int id = background.getId(i); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outDrawables[i] = tileify(background.getDrawable(i), 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (id == R.id.progress || id == R.id.secondaryProgress)); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerDrawable newBg = new LayerDrawable(outDrawables); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newBg.setId(i, background.getId(i)); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return newBg; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (drawable instanceof StateListDrawable) { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StateListDrawable in = (StateListDrawable) drawable; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StateListDrawable out = new StateListDrawable(); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numStates = in.getStateCount(); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numStates; i++) { 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.addState(in.getStateSet(i), tileify(in.getStateDrawable(i), clip)); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return out; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (drawable instanceof BitmapDrawable) { 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Bitmap tileBitmap = ((BitmapDrawable) drawable).getBitmap(); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSampleTile == null) { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSampleTile = tileBitmap; 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ShapeDrawable shapeDrawable = new ShapeDrawable(getDrawableShape()); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final BitmapShader bitmapShader = new BitmapShader(tileBitmap, 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Shader.TileMode.REPEAT, Shader.TileMode.CLAMP); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project shapeDrawable.getPaint().setShader(bitmapShader); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (clip) ? new ClipDrawable(shapeDrawable, Gravity.LEFT, 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClipDrawable.HORIZONTAL) : shapeDrawable; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return drawable; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Shape getDrawableShape() { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 }; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RoundRectShape(roundedCorners, null, null); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convert a AnimationDrawable for use as a barberpole animation. 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Each frame of the animation is wrapped in a ClipDrawable and 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given a tiling BitmapShader. 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable tileifyIndeterminate(Drawable drawable) { 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable instanceof AnimationDrawable) { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AnimationDrawable background = (AnimationDrawable) drawable; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = background.getNumberOfFrames(); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AnimationDrawable newBg = new AnimationDrawable(); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newBg.setOneShot(background.isOneShot()); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable frame = tileify(background.getFrame(i), true); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project frame.setLevel(10000); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newBg.addFrame(frame, background.getDuration(i)); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newBg.setLevel(10000); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable = newBg; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return drawable; 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Initialize the progress bar's default values: 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>progress = 0</li> 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>max = 100</li> 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>animation duration = 4000 ms</li> 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>indeterminate = false</li> 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>behavior = repeat</li> 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void initProgressBar() { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMax = 100; 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = 0; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSecondaryProgress = 0; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminate = false; 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnlyIndeterminate = false; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDuration = 4000; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBehavior = AlphaAnimation.RESTART; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinWidth = 24; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMaxWidth = 48; 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinHeight = 24; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMaxHeight = 48; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Indicate whether this progress bar is in indeterminate mode.</p> 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the progress bar is in indeterminate mode 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 340bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "progress") 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized boolean isIndeterminate() { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndeterminate; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Change the indeterminate mode for this progress bar. In indeterminate 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mode, the progress is ignored and the progress bar shows an infinite 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * animation instead.</p> 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this progress bar's style only supports indeterminate mode (such as the circular 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress bars), then this will be ignored. 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param indeterminate true to enable the indeterminate mode 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setIndeterminate(boolean indeterminate) { 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((!mOnlyIndeterminate || !mIndeterminate) && indeterminate != mIndeterminate) { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminate = indeterminate; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (indeterminate) { 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // swap between indeterminate and regular backgrounds 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentDrawable = mIndeterminateDrawable; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startAnimation(); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentDrawable = mProgressDrawable; 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopAnimation(); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Get the drawable used to draw the progress bar in 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * indeterminate mode.</p> 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a {@link android.graphics.drawable.Drawable} instance 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminateDrawable(android.graphics.drawable.Drawable) 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getIndeterminateDrawable() { 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndeterminateDrawable; 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Define the drawable used to draw the progress bar in 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * indeterminate mode.</p> 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param d the new drawable 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getIndeterminateDrawable() 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setIndeterminateDrawable(Drawable d) { 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setCallback(this); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminateDrawable = d; 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminate) { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentDrawable = d; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postInvalidate(); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Get the drawable used to draw the progress bar in 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress mode.</p> 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a {@link android.graphics.drawable.Drawable} instance 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setProgressDrawable(android.graphics.drawable.Drawable) 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getProgressDrawable() { 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mProgressDrawable; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Define the drawable used to draw the progress bar in 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress mode.</p> 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param d the new drawable 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getProgressDrawable() 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setProgressDrawable(Drawable d) { 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setCallback(this); 429a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora 4308d21bdb90573ec48491c44eca312c162e262298dRomain Guy // Make sure the ProgressBar is always tall enough 4318d21bdb90573ec48491c44eca312c162e262298dRomain Guy int drawableHeight = d.getMinimumHeight(); 432a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora if (mMaxHeight < drawableHeight) { 433a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora mMaxHeight = drawableHeight; 434a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora requestLayout(); 435a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgressDrawable = d; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mIndeterminate) { 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentDrawable = d; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postInvalidate(); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The drawable currently used to draw the progress bar 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable getCurrentDrawable() { 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentDrawable; 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean verifyDrawable(Drawable who) { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return who == mProgressDrawable || who == mIndeterminateDrawable 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || super.verifyDrawable(who); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void postInvalidate() { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mNoInvalidate) { 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.postInvalidate(); 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class RefreshProgressRunnable implements Runnable { 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mId; 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mProgress; 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mFromUser; 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RefreshProgressRunnable(int id, int progress, boolean fromUser) { 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mId = id; 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = progress; 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFromUser = fromUser; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doRefreshProgress(mId, mProgress, mFromUser); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Put ourselves back in the cache when we are done 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefreshProgressRunnable = this; 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setup(int id, int progress, boolean fromUser) { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mId = id; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = progress; 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFromUser = fromUser; 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private synchronized void doRefreshProgress(int id, int progress, boolean fromUser) { 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float scale = mMax > 0 ? (float) progress / (float) mMax : 0; 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Drawable d = mCurrentDrawable; 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable progressDrawable = null; 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d instanceof LayerDrawable) { 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project progressDrawable = ((LayerDrawable) d).findDrawableByLayerId(id); 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int level = (int) (scale * MAX_LEVEL); 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (progressDrawable != null ? progressDrawable : d).setLevel(level); 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(); 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id == R.id.progress) { 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onProgressRefresh(scale, fromUser); 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onProgressRefresh(float scale, boolean fromUser) { 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private synchronized void refreshProgress(int id, int progress, boolean fromUser) { 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mUiThreadId == Thread.currentThread().getId()) { 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doRefreshProgress(id, progress, fromUser); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RefreshProgressRunnable r; 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefreshProgressRunnable != null) { 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Use cached RefreshProgressRunnable if available 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r = mRefreshProgressRunnable; 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Uncache it 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefreshProgressRunnable = null; 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.setup(id, progress, fromUser); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make a new one 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r = new RefreshProgressRunnable(id, progress, fromUser); 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project post(r); 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Set the current progress to the specified value. Does not do anything 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if the progress bar is in indeterminate mode.</p> 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param progress the new progress, between 0 and {@link #getMax()} 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isIndeterminate() 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getProgress() 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #incrementProgressBy(int) 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setProgress(int progress) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgress(progress, false); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized void setProgress(int progress, boolean fromUser) { 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminate) { 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (progress < 0) { 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project progress = 0; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (progress > mMax) { 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project progress = mMax; 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (progress != mProgress) { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = progress; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshProgress(R.id.progress, mProgress, fromUser); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the current secondary progress to the specified value. Does not do 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * anything if the progress bar is in indeterminate mode. 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param secondaryProgress the new secondary progress, between 0 and {@link #getMax()} 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isIndeterminate() 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getSecondaryProgress() 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #incrementSecondaryProgressBy(int) 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setSecondaryProgress(int secondaryProgress) { 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminate) { 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (secondaryProgress < 0) { 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project secondaryProgress = 0; 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (secondaryProgress > mMax) { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project secondaryProgress = mMax; 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (secondaryProgress != mSecondaryProgress) { 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSecondaryProgress = secondaryProgress; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshProgress(R.id.secondaryProgress, mSecondaryProgress, false); 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Get the progress bar's current level of progress. Return 0 when the 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress bar is in indeterminate mode.</p> 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current progress, between 0 and {@link #getMax()} 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isIndeterminate() 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setProgress(int) 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setMax(int) 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getMax() 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 613bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "progress") 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized int getProgress() { 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndeterminate ? 0 : mProgress; 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Get the progress bar's current level of secondary progress. Return 0 when the 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress bar is in indeterminate mode.</p> 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current secondary progress, between 0 and {@link #getMax()} 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isIndeterminate() 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setSecondaryProgress(int) 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setMax(int) 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getMax() 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 630bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "progress") 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized int getSecondaryProgress() { 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndeterminate ? 0 : mSecondaryProgress; 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Return the upper limit of this progress bar's range.</p> 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a positive integer 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setMax(int) 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getProgress() 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getSecondaryProgress() 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 644bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "progress") 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized int getMax() { 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMax; 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Set the range of the progress bar to 0...<tt>max</tt>.</p> 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param max the upper range of this progress bar 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getMax() 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setProgress(int) 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setSecondaryProgress(int) 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setMax(int max) { 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (max < 0) { 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project max = 0; 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (max != mMax) { 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMax = max; 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postInvalidate(); 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mProgress > max) { 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = max; 6699db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru refreshProgress(R.id.progress, mProgress, false); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Increase the progress bar's progress by the specified amount.</p> 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param diff the amount by which the progress must be increased 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setProgress(int) 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized final void incrementProgressBy(int diff) { 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgress(mProgress + diff); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Increase the progress bar's secondary progress by the specified amount.</p> 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param diff the amount by which the secondary progress must be increased 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setSecondaryProgress(int) 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized final void incrementSecondaryProgressBy(int diff) { 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setSecondaryProgress(mSecondaryProgress + diff); 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Start the indeterminate progress animation.</p> 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void startAnimation() { 700a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy if (getVisibility() != VISIBLE) { 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 704cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru if (mIndeterminateDrawable instanceof Animatable) { 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShouldStartAnimationDrawable = true; 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation = null; 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInterpolator == null) { 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInterpolator = new LinearInterpolator(); 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransformation = new Transformation(); 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation = new AlphaAnimation(0.0f, 1.0f); 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setRepeatMode(mBehavior); 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setRepeatCount(Animation.INFINITE); 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setDuration(mDuration); 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setInterpolator(mInterpolator); 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setStartTime(Animation.START_ON_FIRST_FRAME); 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postInvalidate(); 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Stop the indeterminate progress animation.</p> 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void stopAnimation() { 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation = null; 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransformation = null; 729cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru if (mIndeterminateDrawable instanceof Animatable) { 730cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru ((Animatable) mIndeterminateDrawable).stop(); 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShouldStartAnimationDrawable = false; 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the acceleration curve for the indeterminate animation. 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The interpolator is loaded as a resource from the specified context. 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The application environment 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resID The resource identifier of the interpolator to load 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInterpolator(Context context, int resID) { 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInterpolator(AnimationUtils.loadInterpolator(context, resID)); 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the acceleration curve for the indeterminate animation. 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Defaults to a linear interpolation. 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param interpolator The interpolator which defines the acceleration curve 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInterpolator(Interpolator interpolator) { 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInterpolator = interpolator; 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the acceleration curve type for the indeterminate animation. 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the {@link Interpolator} associated to this animation 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Interpolator getInterpolator() { 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInterpolator; 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 766b25ffffc3157c4c471c326147be750f4ebec456aSteve Howard @RemotableViewMethod 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setVisibility(int v) { 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getVisibility() != v) { 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setVisibility(v); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminate) { 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // let's be nice with the UI thread 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == GONE || v == INVISIBLE) { 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopAnimation(); 775a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } else { 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startAnimation(); 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 783a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy protected void onVisibilityChanged(View changedView, int visibility) { 784a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy super.onVisibilityChanged(changedView, visibility); 785a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy 786a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy if (mIndeterminate) { 787a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy // let's be nice with the UI thread 788a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy if (visibility == GONE || visibility == INVISIBLE) { 789a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy stopAnimation(); 790a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } else { 791a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy startAnimation(); 792a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } 793a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } 794a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } 795a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy 796a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy @Override 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void invalidateDrawable(Drawable dr) { 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mInDrawing) { 799ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (verifyDrawable(dr)) { 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect dirty = dr.getBounds(); 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int scrollX = mScrollX + mPaddingLeft; 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int scrollY = mScrollY + mPaddingTop; 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(dirty.left + scrollX, dirty.top + scrollY, 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dirty.right + scrollX, dirty.bottom + scrollY); 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.invalidateDrawable(dr); 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onSizeChanged(int w, int h, int oldw, int oldh) { 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // onDraw will translate the canvas so we draw starting at 0,0 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int right = w - mPaddingRight - mPaddingLeft; 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int bottom = h - mPaddingBottom - mPaddingTop; 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminateDrawable != null) { 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminateDrawable.setBounds(0, 0, right, bottom); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mProgressDrawable != null) { 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgressDrawable.setBounds(0, 0, right, bottom); 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected synchronized void onDraw(Canvas canvas) { 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onDraw(canvas); 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable d = mCurrentDrawable; 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Translate canvas so a indeterminate circular progress bar with padding 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // rotates properly in its animation 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.save(); 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.translate(mPaddingLeft, mPaddingTop); 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getDrawingTime(); 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAnimation != null) { 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.getTransformation(time, mTransformation); 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float scale = mTransformation.getAlpha(); 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInDrawing = true; 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setLevel((int) (scale * MAX_LEVEL)); 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInDrawing = false; 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SystemClock.uptimeMillis() - mLastDrawTime >= ANIMATION_RESOLUTION) { 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastDrawTime = SystemClock.uptimeMillis(); 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postInvalidateDelayed(ANIMATION_RESOLUTION); 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.draw(canvas); 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.restore(); 854cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru if (mShouldStartAnimationDrawable && d instanceof Animatable) { 855cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru ((Animatable) d).start(); 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShouldStartAnimationDrawable = false; 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable d = mCurrentDrawable; 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dw = 0; 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dh = 0; 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dw = Math.max(mMinWidth, Math.min(mMaxWidth, d.getIntrinsicWidth())); 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dh = Math.max(mMinHeight, Math.min(mMaxHeight, d.getIntrinsicHeight())); 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dw += mPaddingLeft + mPaddingRight; 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dh += mPaddingTop + mPaddingBottom; 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMeasuredDimension(resolveSize(dw, widthMeasureSpec), 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resolveSize(dh, heightMeasureSpec)); 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void drawableStateChanged() { 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.drawableStateChanged(); 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] state = getDrawableState(); 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mProgressDrawable != null && mProgressDrawable.isStateful()) { 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgressDrawable.setState(state); 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminateDrawable != null && mIndeterminateDrawable.isStateful()) { 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminateDrawable.setState(state); 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class SavedState extends BaseSavedState { 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int progress; 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int secondaryProgress; 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor called from {@link ProgressBar#onSaveInstanceState()} 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState(Parcelable superState) { 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(superState); 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor called from {@link #CREATOR} 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SavedState(Parcel in) { 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(in); 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project progress = in.readInt(); 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project secondaryProgress = in.readInt(); 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.writeToParcel(out, flags); 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(progress); 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(secondaryProgress); 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<SavedState> CREATOR 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new Parcelable.Creator<SavedState>() { 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState createFromParcel(Parcel in) { 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState(in); 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState[] newArray(int size) { 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState[size]; 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Parcelable onSaveInstanceState() { 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Force our ancestor class to save its state 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcelable superState = super.onSaveInstanceState(); 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState ss = new SavedState(superState); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ss.progress = mProgress; 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ss.secondaryProgress = mSecondaryProgress; 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ss; 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onRestoreInstanceState(Parcelable state) { 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState ss = (SavedState) state; 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onRestoreInstanceState(ss.getSuperState()); 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgress(ss.progress); 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setSecondaryProgress(ss.secondaryProgress); 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 95252a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques 95352a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques @Override 95452a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques protected void onAttachedToWindow() { 95552a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques super.onAttachedToWindow(); 95652a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques if (mIndeterminate) { 95752a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques startAnimation(); 95852a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques } 95952a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques } 96052a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques 96152a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques @Override 96252a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques protected void onDetachedFromWindow() { 96352a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques super.onDetachedFromWindow(); 96452a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques if (mIndeterminate) { 96552a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques stopAnimation(); 96652a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques } 96752a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques } 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 969