ProgressBar.java revision 6af97e1c20df4d7010fafd7059c95d9b4113e4a6
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 1576af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell private int mAnimationResolution; 1586af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new progress bar with range 0...100 and initial progress of 0. 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context the application environment 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ProgressBar(Context context) { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, null); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ProgressBar(Context context, AttributeSet attrs) { 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, attrs, com.android.internal.R.attr.progressBarStyle); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ProgressBar(Context context, AttributeSet attrs, int defStyle) { 1726af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell this(context, attrs, defStyle, 0); 1736af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell } 1746af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell 1756af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell /** 1766af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell * @hide 1776af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell */ 1786af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell public ProgressBar(Context context, AttributeSet attrs, int defStyle, int styleRes) { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUiThreadId = Thread.currentThread().getId(); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initProgressBar(); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = 1846af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell context.obtainStyledAttributes(attrs, R.styleable.ProgressBar, defStyle, styleRes); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoInvalidate = true; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable drawable = a.getDrawable(R.styleable.ProgressBar_progressDrawable); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable != null) { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable = tileify(drawable, false); 1918d21bdb90573ec48491c44eca312c162e262298dRomain Guy // Calling this method can set mMaxHeight, make sure the corresponding 1928d21bdb90573ec48491c44eca312c162e262298dRomain Guy // XML attribute for mMaxHeight is read after calling this method 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgressDrawable(drawable); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDuration = a.getInt(R.styleable.ProgressBar_indeterminateDuration, mDuration); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinWidth = a.getDimensionPixelSize(R.styleable.ProgressBar_minWidth, mMinWidth); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMaxWidth = a.getDimensionPixelSize(R.styleable.ProgressBar_maxWidth, mMaxWidth); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinHeight = a.getDimensionPixelSize(R.styleable.ProgressBar_minHeight, mMinHeight); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMaxHeight = a.getDimensionPixelSize(R.styleable.ProgressBar_maxHeight, mMaxHeight); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBehavior = a.getInt(R.styleable.ProgressBar_indeterminateBehavior, mBehavior); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20672b1f379d5c97c8ff31d2201e78215af777d6bdaJean-Baptiste Queru final int resID = a.getResourceId( 20772b1f379d5c97c8ff31d2201e78215af777d6bdaJean-Baptiste Queru com.android.internal.R.styleable.ProgressBar_interpolator, 20872b1f379d5c97c8ff31d2201e78215af777d6bdaJean-Baptiste Queru android.R.anim.linear_interpolator); // default to linear interpolator 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resID > 0) { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInterpolator(context, resID); 21172b1f379d5c97c8ff31d2201e78215af777d6bdaJean-Baptiste Queru } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMax(a.getInt(R.styleable.ProgressBar_max, mMax)); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgress(a.getInt(R.styleable.ProgressBar_progress, mProgress)); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setSecondaryProgress( 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.getInt(R.styleable.ProgressBar_secondaryProgress, mSecondaryProgress)); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable = a.getDrawable(R.styleable.ProgressBar_indeterminateDrawable); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable != null) { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable = tileifyIndeterminate(drawable); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setIndeterminateDrawable(drawable); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnlyIndeterminate = a.getBoolean( 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.ProgressBar_indeterminateOnly, mOnlyIndeterminate); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoInvalidate = false; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setIndeterminate(mOnlyIndeterminate || a.getBoolean( 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.ProgressBar_indeterminate, mIndeterminate)); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2346af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell mAnimationResolution = a.getInteger(R.styleable.ProgressBar_animationResolution, 2356af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell ANIMATION_RESOLUTION); 2366af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Converts a drawable to a tiled version of itself. It will recursively 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * traverse layer and state list drawables. 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable tileify(Drawable drawable, boolean clip) { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable instanceof LayerDrawable) { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerDrawable background = (LayerDrawable) drawable; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = background.getNumberOfLayers(); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable[] outDrawables = new Drawable[N]; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int id = background.getId(i); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outDrawables[i] = tileify(background.getDrawable(i), 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (id == R.id.progress || id == R.id.secondaryProgress)); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerDrawable newBg = new LayerDrawable(outDrawables); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newBg.setId(i, background.getId(i)); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return newBg; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (drawable instanceof StateListDrawable) { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StateListDrawable in = (StateListDrawable) drawable; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StateListDrawable out = new StateListDrawable(); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numStates = in.getStateCount(); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numStates; i++) { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.addState(in.getStateSet(i), tileify(in.getStateDrawable(i), clip)); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return out; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (drawable instanceof BitmapDrawable) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Bitmap tileBitmap = ((BitmapDrawable) drawable).getBitmap(); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSampleTile == null) { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSampleTile = tileBitmap; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ShapeDrawable shapeDrawable = new ShapeDrawable(getDrawableShape()); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final BitmapShader bitmapShader = new BitmapShader(tileBitmap, 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Shader.TileMode.REPEAT, Shader.TileMode.CLAMP); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project shapeDrawable.getPaint().setShader(bitmapShader); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (clip) ? new ClipDrawable(shapeDrawable, Gravity.LEFT, 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClipDrawable.HORIZONTAL) : shapeDrawable; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return drawable; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Shape getDrawableShape() { 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 }; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RoundRectShape(roundedCorners, null, null); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convert a AnimationDrawable for use as a barberpole animation. 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Each frame of the animation is wrapped in a ClipDrawable and 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given a tiling BitmapShader. 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable tileifyIndeterminate(Drawable drawable) { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable instanceof AnimationDrawable) { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AnimationDrawable background = (AnimationDrawable) drawable; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = background.getNumberOfFrames(); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AnimationDrawable newBg = new AnimationDrawable(); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newBg.setOneShot(background.isOneShot()); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable frame = tileify(background.getFrame(i), true); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project frame.setLevel(10000); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newBg.addFrame(frame, background.getDuration(i)); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newBg.setLevel(10000); 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable = newBg; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return drawable; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Initialize the progress bar's default values: 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>progress = 0</li> 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>max = 100</li> 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>animation duration = 4000 ms</li> 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>indeterminate = false</li> 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>behavior = repeat</li> 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void initProgressBar() { 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMax = 100; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = 0; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSecondaryProgress = 0; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminate = false; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnlyIndeterminate = false; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDuration = 4000; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBehavior = AlphaAnimation.RESTART; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinWidth = 24; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMaxWidth = 48; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinHeight = 24; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMaxHeight = 48; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Indicate whether this progress bar is in indeterminate mode.</p> 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the progress bar is in indeterminate mode 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 352bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "progress") 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized boolean isIndeterminate() { 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndeterminate; 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Change the indeterminate mode for this progress bar. In indeterminate 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mode, the progress is ignored and the progress bar shows an infinite 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * animation instead.</p> 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this progress bar's style only supports indeterminate mode (such as the circular 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress bars), then this will be ignored. 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param indeterminate true to enable the indeterminate mode 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setIndeterminate(boolean indeterminate) { 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((!mOnlyIndeterminate || !mIndeterminate) && indeterminate != mIndeterminate) { 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminate = indeterminate; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (indeterminate) { 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // swap between indeterminate and regular backgrounds 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentDrawable = mIndeterminateDrawable; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startAnimation(); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentDrawable = mProgressDrawable; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopAnimation(); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Get the drawable used to draw the progress bar in 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * indeterminate mode.</p> 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a {@link android.graphics.drawable.Drawable} instance 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminateDrawable(android.graphics.drawable.Drawable) 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getIndeterminateDrawable() { 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndeterminateDrawable; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Define the drawable used to draw the progress bar in 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * indeterminate mode.</p> 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param d the new drawable 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getIndeterminateDrawable() 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setIndeterminateDrawable(Drawable d) { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setCallback(this); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminateDrawable = d; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminate) { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentDrawable = d; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postInvalidate(); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Get the drawable used to draw the progress bar in 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress mode.</p> 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a {@link android.graphics.drawable.Drawable} instance 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setProgressDrawable(android.graphics.drawable.Drawable) 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getProgressDrawable() { 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mProgressDrawable; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Define the drawable used to draw the progress bar in 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress mode.</p> 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param d the new drawable 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getProgressDrawable() 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setProgressDrawable(Drawable d) { 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setCallback(this); 441a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora 4428d21bdb90573ec48491c44eca312c162e262298dRomain Guy // Make sure the ProgressBar is always tall enough 4438d21bdb90573ec48491c44eca312c162e262298dRomain Guy int drawableHeight = d.getMinimumHeight(); 444a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora if (mMaxHeight < drawableHeight) { 445a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora mMaxHeight = drawableHeight; 446a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora requestLayout(); 447a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora } 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgressDrawable = d; 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mIndeterminate) { 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentDrawable = d; 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postInvalidate(); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The drawable currently used to draw the progress bar 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable getCurrentDrawable() { 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentDrawable; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean verifyDrawable(Drawable who) { 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return who == mProgressDrawable || who == mIndeterminateDrawable 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || super.verifyDrawable(who); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 470e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn public void jumpDrawablesToCurrentState() { 471e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn super.jumpDrawablesToCurrentState(); 472e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn if (mProgressDrawable != null) mProgressDrawable.jumpToCurrentState(); 473e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn if (mIndeterminateDrawable != null) mIndeterminateDrawable.jumpToCurrentState(); 474e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn } 475e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn 476e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn @Override 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void postInvalidate() { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mNoInvalidate) { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.postInvalidate(); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class RefreshProgressRunnable implements Runnable { 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mId; 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mProgress; 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mFromUser; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RefreshProgressRunnable(int id, int progress, boolean fromUser) { 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mId = id; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = progress; 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFromUser = fromUser; 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doRefreshProgress(mId, mProgress, mFromUser); 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Put ourselves back in the cache when we are done 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefreshProgressRunnable = this; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setup(int id, int progress, boolean fromUser) { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mId = id; 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = progress; 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFromUser = fromUser; 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private synchronized void doRefreshProgress(int id, int progress, boolean fromUser) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float scale = mMax > 0 ? (float) progress / (float) mMax : 0; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Drawable d = mCurrentDrawable; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable progressDrawable = null; 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d instanceof LayerDrawable) { 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project progressDrawable = ((LayerDrawable) d).findDrawableByLayerId(id); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int level = (int) (scale * MAX_LEVEL); 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (progressDrawable != null ? progressDrawable : d).setLevel(level); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(); 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id == R.id.progress) { 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onProgressRefresh(scale, fromUser); 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onProgressRefresh(float scale, boolean fromUser) { 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private synchronized void refreshProgress(int id, int progress, boolean fromUser) { 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mUiThreadId == Thread.currentThread().getId()) { 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doRefreshProgress(id, progress, fromUser); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RefreshProgressRunnable r; 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefreshProgressRunnable != null) { 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Use cached RefreshProgressRunnable if available 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r = mRefreshProgressRunnable; 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Uncache it 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefreshProgressRunnable = null; 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.setup(id, progress, fromUser); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make a new one 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r = new RefreshProgressRunnable(id, progress, fromUser); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project post(r); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Set the current progress to the specified value. Does not do anything 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if the progress bar is in indeterminate mode.</p> 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param progress the new progress, between 0 and {@link #getMax()} 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isIndeterminate() 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getProgress() 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #incrementProgressBy(int) 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setProgress(int progress) { 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgress(progress, false); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized void setProgress(int progress, boolean fromUser) { 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminate) { 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (progress < 0) { 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project progress = 0; 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (progress > mMax) { 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project progress = mMax; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (progress != mProgress) { 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = progress; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshProgress(R.id.progress, mProgress, fromUser); 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the current secondary progress to the specified value. Does not do 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * anything if the progress bar is in indeterminate mode. 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param secondaryProgress the new secondary progress, between 0 and {@link #getMax()} 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isIndeterminate() 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getSecondaryProgress() 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #incrementSecondaryProgressBy(int) 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setSecondaryProgress(int secondaryProgress) { 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminate) { 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (secondaryProgress < 0) { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project secondaryProgress = 0; 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (secondaryProgress > mMax) { 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project secondaryProgress = mMax; 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (secondaryProgress != mSecondaryProgress) { 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSecondaryProgress = secondaryProgress; 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshProgress(R.id.secondaryProgress, mSecondaryProgress, false); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Get the progress bar's current level of progress. Return 0 when the 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress bar is in indeterminate mode.</p> 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current progress, between 0 and {@link #getMax()} 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isIndeterminate() 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setProgress(int) 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setMax(int) 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getMax() 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 632bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "progress") 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized int getProgress() { 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndeterminate ? 0 : mProgress; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Get the progress bar's current level of secondary progress. Return 0 when the 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress bar is in indeterminate mode.</p> 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current secondary progress, between 0 and {@link #getMax()} 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isIndeterminate() 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setSecondaryProgress(int) 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setMax(int) 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getMax() 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 649bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "progress") 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized int getSecondaryProgress() { 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndeterminate ? 0 : mSecondaryProgress; 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Return the upper limit of this progress bar's range.</p> 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a positive integer 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setMax(int) 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getProgress() 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getSecondaryProgress() 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 663bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "progress") 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized int getMax() { 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMax; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Set the range of the progress bar to 0...<tt>max</tt>.</p> 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param max the upper range of this progress bar 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getMax() 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setProgress(int) 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setSecondaryProgress(int) 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setMax(int max) { 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (max < 0) { 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project max = 0; 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (max != mMax) { 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMax = max; 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postInvalidate(); 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mProgress > max) { 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = max; 6889db3d07b9620b4269ab33f78604a36327e536ce1Jean-Baptiste Queru refreshProgress(R.id.progress, mProgress, false); 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Increase the progress bar's progress by the specified amount.</p> 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param diff the amount by which the progress must be increased 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setProgress(int) 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized final void incrementProgressBy(int diff) { 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgress(mProgress + diff); 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Increase the progress bar's secondary progress by the specified amount.</p> 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param diff the amount by which the secondary progress must be increased 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setSecondaryProgress(int) 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized final void incrementSecondaryProgressBy(int diff) { 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setSecondaryProgress(mSecondaryProgress + diff); 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Start the indeterminate progress animation.</p> 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void startAnimation() { 719a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy if (getVisibility() != VISIBLE) { 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 723cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru if (mIndeterminateDrawable instanceof Animatable) { 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShouldStartAnimationDrawable = true; 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation = null; 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInterpolator == null) { 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInterpolator = new LinearInterpolator(); 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransformation = new Transformation(); 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation = new AlphaAnimation(0.0f, 1.0f); 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setRepeatMode(mBehavior); 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setRepeatCount(Animation.INFINITE); 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setDuration(mDuration); 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setInterpolator(mInterpolator); 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setStartTime(Animation.START_ON_FIRST_FRAME); 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 73908e1473ca30ef1756c6694cc1ed0aff27f11807dEvan Charlton postInvalidate(); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Stop the indeterminate progress animation.</p> 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void stopAnimation() { 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation = null; 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransformation = null; 748cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru if (mIndeterminateDrawable instanceof Animatable) { 749cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru ((Animatable) mIndeterminateDrawable).stop(); 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShouldStartAnimationDrawable = false; 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 75208e1473ca30ef1756c6694cc1ed0aff27f11807dEvan Charlton postInvalidate(); 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the acceleration curve for the indeterminate animation. 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The interpolator is loaded as a resource from the specified context. 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The application environment 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resID The resource identifier of the interpolator to load 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInterpolator(Context context, int resID) { 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInterpolator(AnimationUtils.loadInterpolator(context, resID)); 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the acceleration curve for the indeterminate animation. 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Defaults to a linear interpolation. 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param interpolator The interpolator which defines the acceleration curve 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInterpolator(Interpolator interpolator) { 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInterpolator = interpolator; 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the acceleration curve type for the indeterminate animation. 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the {@link Interpolator} associated to this animation 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Interpolator getInterpolator() { 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInterpolator; 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 786b25ffffc3157c4c471c326147be750f4ebec456aSteve Howard @RemotableViewMethod 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setVisibility(int v) { 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getVisibility() != v) { 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setVisibility(v); 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminate) { 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // let's be nice with the UI thread 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == GONE || v == INVISIBLE) { 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopAnimation(); 795a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } else { 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startAnimation(); 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 803a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy protected void onVisibilityChanged(View changedView, int visibility) { 804a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy super.onVisibilityChanged(changedView, visibility); 805a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy 806a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy if (mIndeterminate) { 807a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy // let's be nice with the UI thread 808a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy if (visibility == GONE || visibility == INVISIBLE) { 809a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy stopAnimation(); 810a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } else { 811a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy startAnimation(); 812a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } 813a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } 814a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } 815a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy 816a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy @Override 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void invalidateDrawable(Drawable dr) { 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mInDrawing) { 819ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (verifyDrawable(dr)) { 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect dirty = dr.getBounds(); 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int scrollX = mScrollX + mPaddingLeft; 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int scrollY = mScrollY + mPaddingTop; 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(dirty.left + scrollX, dirty.top + scrollY, 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dirty.right + scrollX, dirty.bottom + scrollY); 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.invalidateDrawable(dr); 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onSizeChanged(int w, int h, int oldw, int oldh) { 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // onDraw will translate the canvas so we draw starting at 0,0 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int right = w - mPaddingRight - mPaddingLeft; 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int bottom = h - mPaddingBottom - mPaddingTop; 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminateDrawable != null) { 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminateDrawable.setBounds(0, 0, right, bottom); 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mProgressDrawable != null) { 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgressDrawable.setBounds(0, 0, right, bottom); 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected synchronized void onDraw(Canvas canvas) { 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onDraw(canvas); 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable d = mCurrentDrawable; 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Translate canvas so a indeterminate circular progress bar with padding 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // rotates properly in its animation 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.save(); 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.translate(mPaddingLeft, mPaddingTop); 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getDrawingTime(); 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAnimation != null) { 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.getTransformation(time, mTransformation); 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float scale = mTransformation.getAlpha(); 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInDrawing = true; 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setLevel((int) (scale * MAX_LEVEL)); 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInDrawing = false; 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8676af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell if (SystemClock.uptimeMillis() - mLastDrawTime >= mAnimationResolution) { 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastDrawTime = SystemClock.uptimeMillis(); 8696af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell postInvalidateDelayed(mAnimationResolution); 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.draw(canvas); 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.restore(); 874cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru if (mShouldStartAnimationDrawable && d instanceof Animatable) { 875cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru ((Animatable) d).start(); 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShouldStartAnimationDrawable = false; 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable d = mCurrentDrawable; 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dw = 0; 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dh = 0; 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dw = Math.max(mMinWidth, Math.min(mMaxWidth, d.getIntrinsicWidth())); 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dh = Math.max(mMinHeight, Math.min(mMaxHeight, d.getIntrinsicHeight())); 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dw += mPaddingLeft + mPaddingRight; 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dh += mPaddingTop + mPaddingBottom; 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMeasuredDimension(resolveSize(dw, widthMeasureSpec), 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resolveSize(dh, heightMeasureSpec)); 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void drawableStateChanged() { 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.drawableStateChanged(); 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] state = getDrawableState(); 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mProgressDrawable != null && mProgressDrawable.isStateful()) { 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgressDrawable.setState(state); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminateDrawable != null && mIndeterminateDrawable.isStateful()) { 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminateDrawable.setState(state); 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class SavedState extends BaseSavedState { 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int progress; 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int secondaryProgress; 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor called from {@link ProgressBar#onSaveInstanceState()} 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState(Parcelable superState) { 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(superState); 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor called from {@link #CREATOR} 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SavedState(Parcel in) { 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(in); 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project progress = in.readInt(); 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project secondaryProgress = in.readInt(); 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.writeToParcel(out, flags); 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(progress); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(secondaryProgress); 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<SavedState> CREATOR 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new Parcelable.Creator<SavedState>() { 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState createFromParcel(Parcel in) { 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState(in); 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState[] newArray(int size) { 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState[size]; 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Parcelable onSaveInstanceState() { 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Force our ancestor class to save its state 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcelable superState = super.onSaveInstanceState(); 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState ss = new SavedState(superState); 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ss.progress = mProgress; 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ss.secondaryProgress = mSecondaryProgress; 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ss; 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onRestoreInstanceState(Parcelable state) { 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState ss = (SavedState) state; 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onRestoreInstanceState(ss.getSuperState()); 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgress(ss.progress); 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setSecondaryProgress(ss.secondaryProgress); 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 97252a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques 97352a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques @Override 97452a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques protected void onAttachedToWindow() { 97552a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques super.onAttachedToWindow(); 97652a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques if (mIndeterminate) { 97752a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques startAnimation(); 97852a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques } 97952a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques } 98052a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques 98152a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques @Override 98252a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques protected void onDetachedFromWindow() { 98352a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques super.onDetachedFromWindow(); 98452a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques if (mIndeterminate) { 98552a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques stopAnimation(); 98652a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques } 98752a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques } 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 989