ProgressBar.java revision 736c2756bf3c14ae9fef7255c119057f7a2be1ed
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 196518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganovimport com.android.internal.R; 206518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.BitmapShader; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 27b25ffffc3157c4c471c326147be750f4ebec456aSteve Howardimport android.graphics.Shader; 28b25ffffc3157c4c471c326147be750f4ebec456aSteve Howardimport android.graphics.drawable.Animatable; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.AnimationDrawable; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.BitmapDrawable; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.ClipDrawable; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.LayerDrawable; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.ShapeDrawable; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.StateListDrawable; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.shapes.RoundRectShape; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.shapes.Shape; 38b25ffffc3157c4c471c326147be750f4ebec456aSteve Howardimport android.os.Parcel; 39b25ffffc3157c4c471c326147be750f4ebec456aSteve Howardimport android.os.Parcelable; 40b25ffffc3157c4c471c326147be750f4ebec456aSteve Howardimport android.os.SystemClock; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity; 43b25ffffc3157c4c471c326147be750f4ebec456aSteve Howardimport android.view.RemotableViewMethod; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 457a36788f4a69b3ddaf8fb8e250e1a13bee7238faSteve Zeiglerimport android.view.ViewDebug; 466518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent; 476518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganovimport android.view.accessibility.AccessibilityManager; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.AlphaAnimation; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Animation; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.AnimationUtils; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Interpolator; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.LinearInterpolator; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Transformation; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.RemoteViews.RemoteView; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Visual indicator of progress in some operation. Displays a bar to the user 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * representing how far the operation has progressed; the application can 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * change the amount of progress (modifying the length of the bar) as it moves 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * forward. There is also a secondary progress displayable on a progress bar 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which is useful for displaying intermediate progress, such as the buffer 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * level during a streaming playback progress bar. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A progress bar can also be made indeterminate. In indeterminate mode, the 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress bar shows a cyclic animation. This mode is used by applications 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when the length of the task is unknown. 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The following code example shows how a progress bar can be used from 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a worker thread to update the user interface to notify the user of progress: 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class MyActivity extends Activity { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private static final int PROGRESS = 0x1; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private ProgressBar mProgress; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private int mProgressStatus = 0; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private Handler mHandler = new Handler(); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * protected void onCreate(Bundle icicle) { 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * super.onCreate(icicle); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setContentView(R.layout.progressbar_activity); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mProgress = (ProgressBar) findViewById(R.id.progress_bar); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // Start lengthy operation in a background thread 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * new Thread(new Runnable() { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public void run() { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * while (mProgressStatus < 100) { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mProgressStatus = doWork(); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // Update the progress bar 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mHandler.post(new Runnable() { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public void run() { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mProgress.setProgress(mProgressStatus); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }).start(); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre> 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>XML attributes</b></strong> 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link android.R.styleable#ProgressBar ProgressBar Attributes}, 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#View View Attributes} 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>Styles</b></strong> 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Theme_progressBarStyle 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Theme_progressBarStyleSmall 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Theme_progressBarStyleLarge 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#Theme_progressBarStyleHorizontal 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@RemoteView 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ProgressBar extends View { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MAX_LEVEL = 10000; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int ANIMATION_RESOLUTION = 200; 1306518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov private static final int TIMEOUT_SEND_ACCESSIBILITY_EVENT = 200; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mMinWidth; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mMaxWidth; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mMinHeight; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mMaxHeight; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mProgress; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mSecondaryProgress; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mMax; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mBehavior; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDuration; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mIndeterminate; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mOnlyIndeterminate; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Transformation mTransformation; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AlphaAnimation mAnimation; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mIndeterminateDrawable; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mProgressDrawable; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mCurrentDrawable; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap mSampleTile; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mNoInvalidate; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Interpolator mInterpolator; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private RefreshProgressRunnable mRefreshProgressRunnable; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mUiThreadId; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mShouldStartAnimationDrawable; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mLastDrawTime; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mInDrawing; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1606af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell private int mAnimationResolution; 1616af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell 1626518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov private AccessibilityEventSender mAccessibilityEventSender; 1636518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new progress bar with range 0...100 and initial progress of 0. 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context the application environment 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ProgressBar(Context context) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, null); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ProgressBar(Context context, AttributeSet attrs) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, attrs, com.android.internal.R.attr.progressBarStyle); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ProgressBar(Context context, AttributeSet attrs, int defStyle) { 1776af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell this(context, attrs, defStyle, 0); 1786af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell } 1796af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell 1806af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell /** 1816af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell * @hide 1826af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell */ 1836af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell public ProgressBar(Context context, AttributeSet attrs, int defStyle, int styleRes) { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUiThreadId = Thread.currentThread().getId(); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initProgressBar(); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = 1896af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell context.obtainStyledAttributes(attrs, R.styleable.ProgressBar, defStyle, styleRes); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoInvalidate = true; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable drawable = a.getDrawable(R.styleable.ProgressBar_progressDrawable); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable != null) { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable = tileify(drawable, false); 1968d21bdb90573ec48491c44eca312c162e262298dRomain Guy // Calling this method can set mMaxHeight, make sure the corresponding 1978d21bdb90573ec48491c44eca312c162e262298dRomain Guy // XML attribute for mMaxHeight is read after calling this method 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgressDrawable(drawable); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDuration = a.getInt(R.styleable.ProgressBar_indeterminateDuration, mDuration); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinWidth = a.getDimensionPixelSize(R.styleable.ProgressBar_minWidth, mMinWidth); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMaxWidth = a.getDimensionPixelSize(R.styleable.ProgressBar_maxWidth, mMaxWidth); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinHeight = a.getDimensionPixelSize(R.styleable.ProgressBar_minHeight, mMinHeight); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMaxHeight = a.getDimensionPixelSize(R.styleable.ProgressBar_maxHeight, mMaxHeight); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBehavior = a.getInt(R.styleable.ProgressBar_indeterminateBehavior, mBehavior); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21172b1f379d5c97c8ff31d2201e78215af777d6bdaJean-Baptiste Queru final int resID = a.getResourceId( 21272b1f379d5c97c8ff31d2201e78215af777d6bdaJean-Baptiste Queru com.android.internal.R.styleable.ProgressBar_interpolator, 21372b1f379d5c97c8ff31d2201e78215af777d6bdaJean-Baptiste Queru android.R.anim.linear_interpolator); // default to linear interpolator 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resID > 0) { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInterpolator(context, resID); 21672b1f379d5c97c8ff31d2201e78215af777d6bdaJean-Baptiste Queru } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMax(a.getInt(R.styleable.ProgressBar_max, mMax)); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgress(a.getInt(R.styleable.ProgressBar_progress, mProgress)); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setSecondaryProgress( 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.getInt(R.styleable.ProgressBar_secondaryProgress, mSecondaryProgress)); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable = a.getDrawable(R.styleable.ProgressBar_indeterminateDrawable); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable != null) { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable = tileifyIndeterminate(drawable); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setIndeterminateDrawable(drawable); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnlyIndeterminate = a.getBoolean( 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.ProgressBar_indeterminateOnly, mOnlyIndeterminate); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoInvalidate = false; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setIndeterminate(mOnlyIndeterminate || a.getBoolean( 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.ProgressBar_indeterminate, mIndeterminate)); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2396af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell mAnimationResolution = a.getInteger(R.styleable.ProgressBar_animationResolution, 2406af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell ANIMATION_RESOLUTION); 2416af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Converts a drawable to a tiled version of itself. It will recursively 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * traverse layer and state list drawables. 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable tileify(Drawable drawable, boolean clip) { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable instanceof LayerDrawable) { 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerDrawable background = (LayerDrawable) drawable; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = background.getNumberOfLayers(); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable[] outDrawables = new Drawable[N]; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int id = background.getId(i); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outDrawables[i] = tileify(background.getDrawable(i), 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (id == R.id.progress || id == R.id.secondaryProgress)); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerDrawable newBg = new LayerDrawable(outDrawables); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newBg.setId(i, background.getId(i)); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return newBg; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (drawable instanceof StateListDrawable) { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StateListDrawable in = (StateListDrawable) drawable; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StateListDrawable out = new StateListDrawable(); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numStates = in.getStateCount(); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numStates; i++) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.addState(in.getStateSet(i), tileify(in.getStateDrawable(i), clip)); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return out; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (drawable instanceof BitmapDrawable) { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Bitmap tileBitmap = ((BitmapDrawable) drawable).getBitmap(); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSampleTile == null) { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSampleTile = tileBitmap; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ShapeDrawable shapeDrawable = new ShapeDrawable(getDrawableShape()); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final BitmapShader bitmapShader = new BitmapShader(tileBitmap, 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Shader.TileMode.REPEAT, Shader.TileMode.CLAMP); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project shapeDrawable.getPaint().setShader(bitmapShader); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (clip) ? new ClipDrawable(shapeDrawable, Gravity.LEFT, 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClipDrawable.HORIZONTAL) : shapeDrawable; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return drawable; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Shape getDrawableShape() { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 }; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RoundRectShape(roundedCorners, null, null); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convert a AnimationDrawable for use as a barberpole animation. 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Each frame of the animation is wrapped in a ClipDrawable and 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given a tiling BitmapShader. 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable tileifyIndeterminate(Drawable drawable) { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable instanceof AnimationDrawable) { 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AnimationDrawable background = (AnimationDrawable) drawable; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = background.getNumberOfFrames(); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AnimationDrawable newBg = new AnimationDrawable(); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newBg.setOneShot(background.isOneShot()); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable frame = tileify(background.getFrame(i), true); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project frame.setLevel(10000); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newBg.addFrame(frame, background.getDuration(i)); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newBg.setLevel(10000); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable = newBg; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return drawable; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Initialize the progress bar's default values: 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>progress = 0</li> 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>max = 100</li> 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>animation duration = 4000 ms</li> 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>indeterminate = false</li> 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>behavior = repeat</li> 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void initProgressBar() { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMax = 100; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = 0; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSecondaryProgress = 0; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminate = false; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnlyIndeterminate = false; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDuration = 4000; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBehavior = AlphaAnimation.RESTART; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinWidth = 24; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMaxWidth = 48; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinHeight = 24; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMaxHeight = 48; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Indicate whether this progress bar is in indeterminate mode.</p> 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the progress bar is in indeterminate mode 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 357bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "progress") 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized boolean isIndeterminate() { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndeterminate; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Change the indeterminate mode for this progress bar. In indeterminate 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mode, the progress is ignored and the progress bar shows an infinite 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * animation instead.</p> 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this progress bar's style only supports indeterminate mode (such as the circular 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress bars), then this will be ignored. 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param indeterminate true to enable the indeterminate mode 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setIndeterminate(boolean indeterminate) { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((!mOnlyIndeterminate || !mIndeterminate) && indeterminate != mIndeterminate) { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminate = indeterminate; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (indeterminate) { 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // swap between indeterminate and regular backgrounds 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentDrawable = mIndeterminateDrawable; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startAnimation(); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentDrawable = mProgressDrawable; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopAnimation(); 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Get the drawable used to draw the progress bar in 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * indeterminate mode.</p> 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a {@link android.graphics.drawable.Drawable} instance 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminateDrawable(android.graphics.drawable.Drawable) 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getIndeterminateDrawable() { 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndeterminateDrawable; 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Define the drawable used to draw the progress bar in 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * indeterminate mode.</p> 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param d the new drawable 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getIndeterminateDrawable() 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setIndeterminateDrawable(Drawable d) { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setCallback(this); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminateDrawable = d; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminate) { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentDrawable = d; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postInvalidate(); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Get the drawable used to draw the progress bar in 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress mode.</p> 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a {@link android.graphics.drawable.Drawable} instance 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setProgressDrawable(android.graphics.drawable.Drawable) 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getProgressDrawable() { 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mProgressDrawable; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Define the drawable used to draw the progress bar in 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress mode.</p> 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param d the new drawable 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getProgressDrawable() 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setProgressDrawable(Drawable d) { 444aa072634630c9515e44890dc302307fa969bbb85Joe Onorato boolean needUpdate; 445aa072634630c9515e44890dc302307fa969bbb85Joe Onorato if (mProgressDrawable != null && d != mProgressDrawable) { 446aa072634630c9515e44890dc302307fa969bbb85Joe Onorato mProgressDrawable.setCallback(null); 447aa072634630c9515e44890dc302307fa969bbb85Joe Onorato needUpdate = true; 448aa072634630c9515e44890dc302307fa969bbb85Joe Onorato } else { 449aa072634630c9515e44890dc302307fa969bbb85Joe Onorato needUpdate = false; 450aa072634630c9515e44890dc302307fa969bbb85Joe Onorato } 451aa072634630c9515e44890dc302307fa969bbb85Joe Onorato 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setCallback(this); 454a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora 4558d21bdb90573ec48491c44eca312c162e262298dRomain Guy // Make sure the ProgressBar is always tall enough 4568d21bdb90573ec48491c44eca312c162e262298dRomain Guy int drawableHeight = d.getMinimumHeight(); 457a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora if (mMaxHeight < drawableHeight) { 458a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora mMaxHeight = drawableHeight; 459a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora requestLayout(); 460a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora } 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgressDrawable = d; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mIndeterminate) { 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentDrawable = d; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postInvalidate(); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 467aa072634630c9515e44890dc302307fa969bbb85Joe Onorato 468aa072634630c9515e44890dc302307fa969bbb85Joe Onorato if (needUpdate) { 469aa072634630c9515e44890dc302307fa969bbb85Joe Onorato updateDrawableBounds(getWidth(), getHeight()); 470aa072634630c9515e44890dc302307fa969bbb85Joe Onorato updateDrawableState(); 471aa072634630c9515e44890dc302307fa969bbb85Joe Onorato doRefreshProgress(R.id.progress, mProgress, false, false); 472aa072634630c9515e44890dc302307fa969bbb85Joe Onorato doRefreshProgress(R.id.secondaryProgress, mSecondaryProgress, false, false); 473aa072634630c9515e44890dc302307fa969bbb85Joe Onorato } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The drawable currently used to draw the progress bar 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable getCurrentDrawable() { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentDrawable; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean verifyDrawable(Drawable who) { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return who == mProgressDrawable || who == mIndeterminateDrawable 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || super.verifyDrawable(who); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 490e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn public void jumpDrawablesToCurrentState() { 491e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn super.jumpDrawablesToCurrentState(); 492e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn if (mProgressDrawable != null) mProgressDrawable.jumpToCurrentState(); 493e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn if (mIndeterminateDrawable != null) mIndeterminateDrawable.jumpToCurrentState(); 494e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn } 495e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn 496e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn @Override 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void postInvalidate() { 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mNoInvalidate) { 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.postInvalidate(); 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class RefreshProgressRunnable implements Runnable { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mId; 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mProgress; 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mFromUser; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RefreshProgressRunnable(int id, int progress, boolean fromUser) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mId = id; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = progress; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFromUser = fromUser; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 516aa072634630c9515e44890dc302307fa969bbb85Joe Onorato doRefreshProgress(mId, mProgress, mFromUser, true); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Put ourselves back in the cache when we are done 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefreshProgressRunnable = this; 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setup(int id, int progress, boolean fromUser) { 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mId = id; 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = progress; 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFromUser = fromUser; 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529aa072634630c9515e44890dc302307fa969bbb85Joe Onorato private synchronized void doRefreshProgress(int id, int progress, boolean fromUser, 530aa072634630c9515e44890dc302307fa969bbb85Joe Onorato boolean callBackToApp) { 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float scale = mMax > 0 ? (float) progress / (float) mMax : 0; 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Drawable d = mCurrentDrawable; 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable progressDrawable = null; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d instanceof LayerDrawable) { 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project progressDrawable = ((LayerDrawable) d).findDrawableByLayerId(id); 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int level = (int) (scale * MAX_LEVEL); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (progressDrawable != null ? progressDrawable : d).setLevel(level); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 546aa072634630c9515e44890dc302307fa969bbb85Joe Onorato if (callBackToApp && id == R.id.progress) { 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onProgressRefresh(scale, fromUser); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5506518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov 5516518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov void onProgressRefresh(float scale, boolean fromUser) { 5526518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov if (AccessibilityManager.getInstance(mContext).isEnabled()) { 5536518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov scheduleAccessibilityEventSender(); 5546518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private synchronized void refreshProgress(int id, int progress, boolean fromUser) { 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mUiThreadId == Thread.currentThread().getId()) { 559aa072634630c9515e44890dc302307fa969bbb85Joe Onorato doRefreshProgress(id, progress, fromUser, true); 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RefreshProgressRunnable r; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefreshProgressRunnable != null) { 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Use cached RefreshProgressRunnable if available 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r = mRefreshProgressRunnable; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Uncache it 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefreshProgressRunnable = null; 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.setup(id, progress, fromUser); 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make a new one 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r = new RefreshProgressRunnable(id, progress, fromUser); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project post(r); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Set the current progress to the specified value. Does not do anything 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if the progress bar is in indeterminate mode.</p> 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param progress the new progress, between 0 and {@link #getMax()} 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isIndeterminate() 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getProgress() 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #incrementProgressBy(int) 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setProgress(int progress) { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgress(progress, false); 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized void setProgress(int progress, boolean fromUser) { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminate) { 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (progress < 0) { 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project progress = 0; 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (progress > mMax) { 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project progress = mMax; 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (progress != mProgress) { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = progress; 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshProgress(R.id.progress, mProgress, fromUser); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the current secondary progress to the specified value. Does not do 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * anything if the progress bar is in indeterminate mode. 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param secondaryProgress the new secondary progress, between 0 and {@link #getMax()} 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isIndeterminate() 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getSecondaryProgress() 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #incrementSecondaryProgressBy(int) 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setSecondaryProgress(int secondaryProgress) { 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminate) { 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (secondaryProgress < 0) { 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project secondaryProgress = 0; 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (secondaryProgress > mMax) { 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project secondaryProgress = mMax; 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (secondaryProgress != mSecondaryProgress) { 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSecondaryProgress = secondaryProgress; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshProgress(R.id.secondaryProgress, mSecondaryProgress, false); 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Get the progress bar's current level of progress. Return 0 when the 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress bar is in indeterminate mode.</p> 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current progress, between 0 and {@link #getMax()} 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isIndeterminate() 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setProgress(int) 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setMax(int) 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getMax() 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 656bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "progress") 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized int getProgress() { 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndeterminate ? 0 : mProgress; 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Get the progress bar's current level of secondary progress. Return 0 when the 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress bar is in indeterminate mode.</p> 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current secondary progress, between 0 and {@link #getMax()} 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isIndeterminate() 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setSecondaryProgress(int) 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setMax(int) 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getMax() 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 673bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "progress") 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized int getSecondaryProgress() { 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndeterminate ? 0 : mSecondaryProgress; 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Return the upper limit of this progress bar's range.</p> 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a positive integer 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setMax(int) 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getProgress() 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getSecondaryProgress() 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 687bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "progress") 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized int getMax() { 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMax; 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Set the range of the progress bar to 0...<tt>max</tt>.</p> 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param max the upper range of this progress bar 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getMax() 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setProgress(int) 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setSecondaryProgress(int) 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setMax(int max) { 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (max < 0) { 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project max = 0; 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (max != mMax) { 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMax = max; 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postInvalidate(); 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mProgress > max) { 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = max; 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71358e3822b5973e766f79046e8964457d9ef26df55Michael Krehan refreshProgress(R.id.progress, mProgress, false); 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Increase the progress bar's progress by the specified amount.</p> 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param diff the amount by which the progress must be increased 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setProgress(int) 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized final void incrementProgressBy(int diff) { 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgress(mProgress + diff); 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Increase the progress bar's secondary progress by the specified amount.</p> 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param diff the amount by which the secondary progress must be increased 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setSecondaryProgress(int) 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized final void incrementSecondaryProgressBy(int diff) { 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setSecondaryProgress(mSecondaryProgress + diff); 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Start the indeterminate progress animation.</p> 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void startAnimation() { 743a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy if (getVisibility() != VISIBLE) { 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 747cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru if (mIndeterminateDrawable instanceof Animatable) { 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShouldStartAnimationDrawable = true; 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation = null; 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInterpolator == null) { 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInterpolator = new LinearInterpolator(); 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransformation = new Transformation(); 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation = new AlphaAnimation(0.0f, 1.0f); 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setRepeatMode(mBehavior); 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setRepeatCount(Animation.INFINITE); 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setDuration(mDuration); 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setInterpolator(mInterpolator); 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setStartTime(Animation.START_ON_FIRST_FRAME); 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 76308e1473ca30ef1756c6694cc1ed0aff27f11807dEvan Charlton postInvalidate(); 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Stop the indeterminate progress animation.</p> 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void stopAnimation() { 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation = null; 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransformation = null; 772cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru if (mIndeterminateDrawable instanceof Animatable) { 773cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru ((Animatable) mIndeterminateDrawable).stop(); 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShouldStartAnimationDrawable = false; 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 77608e1473ca30ef1756c6694cc1ed0aff27f11807dEvan Charlton postInvalidate(); 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the acceleration curve for the indeterminate animation. 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The interpolator is loaded as a resource from the specified context. 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The application environment 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resID The resource identifier of the interpolator to load 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInterpolator(Context context, int resID) { 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInterpolator(AnimationUtils.loadInterpolator(context, resID)); 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the acceleration curve for the indeterminate animation. 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Defaults to a linear interpolation. 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param interpolator The interpolator which defines the acceleration curve 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInterpolator(Interpolator interpolator) { 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInterpolator = interpolator; 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the acceleration curve type for the indeterminate animation. 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the {@link Interpolator} associated to this animation 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Interpolator getInterpolator() { 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInterpolator; 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 810b25ffffc3157c4c471c326147be750f4ebec456aSteve Howard @RemotableViewMethod 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setVisibility(int v) { 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getVisibility() != v) { 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setVisibility(v); 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminate) { 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // let's be nice with the UI thread 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == GONE || v == INVISIBLE) { 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopAnimation(); 819a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } else { 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startAnimation(); 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 827a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy protected void onVisibilityChanged(View changedView, int visibility) { 828a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy super.onVisibilityChanged(changedView, visibility); 829a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy 830a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy if (mIndeterminate) { 831a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy // let's be nice with the UI thread 832a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy if (visibility == GONE || visibility == INVISIBLE) { 833a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy stopAnimation(); 834a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } else { 835a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy startAnimation(); 836a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } 837a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } 838a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } 839a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy 840a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy @Override 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void invalidateDrawable(Drawable dr) { 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mInDrawing) { 843ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (verifyDrawable(dr)) { 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect dirty = dr.getBounds(); 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int scrollX = mScrollX + mPaddingLeft; 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int scrollY = mScrollY + mPaddingTop; 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(dirty.left + scrollX, dirty.top + scrollY, 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dirty.right + scrollX, dirty.bottom + scrollY); 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.invalidateDrawable(dr); 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onSizeChanged(int w, int h, int oldw, int oldh) { 858aa072634630c9515e44890dc302307fa969bbb85Joe Onorato updateDrawableBounds(w, h); 859aa072634630c9515e44890dc302307fa969bbb85Joe Onorato } 860aa072634630c9515e44890dc302307fa969bbb85Joe Onorato 861aa072634630c9515e44890dc302307fa969bbb85Joe Onorato private void updateDrawableBounds(int w, int h) { 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // onDraw will translate the canvas so we draw starting at 0,0 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int right = w - mPaddingRight - mPaddingLeft; 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int bottom = h - mPaddingBottom - mPaddingTop; 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminateDrawable != null) { 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminateDrawable.setBounds(0, 0, right, bottom); 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mProgressDrawable != null) { 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgressDrawable.setBounds(0, 0, right, bottom); 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected synchronized void onDraw(Canvas canvas) { 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onDraw(canvas); 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable d = mCurrentDrawable; 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Translate canvas so a indeterminate circular progress bar with padding 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // rotates properly in its animation 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.save(); 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.translate(mPaddingLeft, mPaddingTop); 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getDrawingTime(); 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAnimation != null) { 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.getTransformation(time, mTransformation); 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float scale = mTransformation.getAlpha(); 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInDrawing = true; 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setLevel((int) (scale * MAX_LEVEL)); 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInDrawing = false; 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8956af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell if (SystemClock.uptimeMillis() - mLastDrawTime >= mAnimationResolution) { 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastDrawTime = SystemClock.uptimeMillis(); 8976af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell postInvalidateDelayed(mAnimationResolution); 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.draw(canvas); 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.restore(); 902cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru if (mShouldStartAnimationDrawable && d instanceof Animatable) { 903cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru ((Animatable) d).start(); 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShouldStartAnimationDrawable = false; 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable d = mCurrentDrawable; 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dw = 0; 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dh = 0; 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dw = Math.max(mMinWidth, Math.min(mMaxWidth, d.getIntrinsicWidth())); 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dh = Math.max(mMinHeight, Math.min(mMaxHeight, d.getIntrinsicHeight())); 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 919aa072634630c9515e44890dc302307fa969bbb85Joe Onorato updateDrawableState(); 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dw += mPaddingLeft + mPaddingRight; 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dh += mPaddingTop + mPaddingBottom; 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 923189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn setMeasuredDimension(resolveSizeAndState(dw, widthMeasureSpec, 0), 924189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn resolveSizeAndState(dh, heightMeasureSpec, 0)); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void drawableStateChanged() { 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.drawableStateChanged(); 930aa072634630c9515e44890dc302307fa969bbb85Joe Onorato updateDrawableState(); 931aa072634630c9515e44890dc302307fa969bbb85Joe Onorato } 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 933aa072634630c9515e44890dc302307fa969bbb85Joe Onorato private void updateDrawableState() { 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] state = getDrawableState(); 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mProgressDrawable != null && mProgressDrawable.isStateful()) { 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgressDrawable.setState(state); 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminateDrawable != null && mIndeterminateDrawable.isStateful()) { 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminateDrawable.setState(state); 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class SavedState extends BaseSavedState { 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int progress; 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int secondaryProgress; 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor called from {@link ProgressBar#onSaveInstanceState()} 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState(Parcelable superState) { 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(superState); 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor called from {@link #CREATOR} 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SavedState(Parcel in) { 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(in); 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project progress = in.readInt(); 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project secondaryProgress = in.readInt(); 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.writeToParcel(out, flags); 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(progress); 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(secondaryProgress); 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<SavedState> CREATOR 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new Parcelable.Creator<SavedState>() { 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState createFromParcel(Parcel in) { 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState(in); 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState[] newArray(int size) { 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState[size]; 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Parcelable onSaveInstanceState() { 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Force our ancestor class to save its state 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcelable superState = super.onSaveInstanceState(); 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState ss = new SavedState(superState); 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ss.progress = mProgress; 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ss.secondaryProgress = mSecondaryProgress; 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ss; 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onRestoreInstanceState(Parcelable state) { 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState ss = (SavedState) state; 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onRestoreInstanceState(ss.getSuperState()); 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgress(ss.progress); 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setSecondaryProgress(ss.secondaryProgress); 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 100452a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques 100552a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques @Override 100652a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques protected void onAttachedToWindow() { 100752a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques super.onAttachedToWindow(); 100852a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques if (mIndeterminate) { 100952a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques startAnimation(); 101052a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques } 101152a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques } 101252a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques 101352a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques @Override 101452a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques protected void onDetachedFromWindow() { 101552a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques if (mIndeterminate) { 101652a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques stopAnimation(); 101752a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques } 10186518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov if(mRefreshProgressRunnable != null) { 10196518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov removeCallbacks(mRefreshProgressRunnable); 10206518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } 10216518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov if (mAccessibilityEventSender != null) { 10226518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov removeCallbacks(mAccessibilityEventSender); 10236518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } 1024ec84c3a189e4aa70aa6ea8ba712e5a4f260a153bPatrick Dubroy // This should come after stopAnimation(), otherwise an invalidate message remains in the 1025ec84c3a189e4aa70aa6ea8ba712e5a4f260a153bPatrick Dubroy // queue, which can prevent the entire view hierarchy from being GC'ed during a rotation 1026ec84c3a189e4aa70aa6ea8ba712e5a4f260a153bPatrick Dubroy super.onDetachedFromWindow(); 102752a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques } 10286518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov 10296518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov @Override 1030736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov public void onPopulateAccessibilityEvent(AccessibilityEvent event) { 1031736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov super.onPopulateAccessibilityEvent(event); 1032736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov event.setItemCount(mMax); 1033736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov event.setCurrentItemIndex(mProgress); 10346518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } 10356518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov 10366518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov /** 10376518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov * Schedule a command for sending an accessibility event. 10386518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov * </br> 10396518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov * Note: A command is used to ensure that accessibility events 10406518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov * are sent at most one in a given time frame to save 10416518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov * system resources while the progress changes quickly. 10426518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov */ 10436518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov private void scheduleAccessibilityEventSender() { 10446518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov if (mAccessibilityEventSender == null) { 10456518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov mAccessibilityEventSender = new AccessibilityEventSender(); 10466518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } else { 10476518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov removeCallbacks(mAccessibilityEventSender); 10486518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } 10496518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov postDelayed(mAccessibilityEventSender, TIMEOUT_SEND_ACCESSIBILITY_EVENT); 10506518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } 10516518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov 10526518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov /** 10536518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov * Command for sending an accessibility event. 10546518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov */ 10556518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov private class AccessibilityEventSender implements Runnable { 10566518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov public void run() { 10576518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); 10586518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } 10596518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1061