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; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 41a050663feb6309c63867abd746cdf97388e289a4Adam Powellimport android.util.Pool; 42a050663feb6309c63867abd746cdf97388e289a4Adam Powellimport android.util.Poolable; 43a050663feb6309c63867abd746cdf97388e289a4Adam Powellimport android.util.PoolableManager; 44a050663feb6309c63867abd746cdf97388e289a4Adam Powellimport android.util.Pools; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity; 46b25ffffc3157c4c471c326147be750f4ebec456aSteve Howardimport android.view.RemotableViewMethod; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 487a36788f4a69b3ddaf8fb8e250e1a13bee7238faSteve Zeiglerimport android.view.ViewDebug; 496518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent; 506518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganovimport android.view.accessibility.AccessibilityManager; 518a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganovimport android.view.accessibility.AccessibilityNodeInfo; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.AlphaAnimation; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Animation; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.AnimationUtils; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Interpolator; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.LinearInterpolator; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Transformation; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.RemoteViews.RemoteView; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 60a050663feb6309c63867abd746cdf97388e289a4Adam Powellimport java.util.ArrayList; 61a050663feb6309c63867abd746cdf97388e289a4Adam Powell 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Visual indicator of progress in some operation. Displays a bar to the user 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * representing how far the operation has progressed; the application can 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * change the amount of progress (modifying the length of the bar) as it moves 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * forward. There is also a secondary progress displayable on a progress bar 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which is useful for displaying intermediate progress, such as the buffer 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * level during a streaming playback progress bar. 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A progress bar can also be made indeterminate. In indeterminate mode, the 7542f139c0696e2988adb24048fab998695e95fba3Scott Main * progress bar shows a cyclic animation without an indication of progress. This mode is used by 7642f139c0696e2988adb24048fab998695e95fba3Scott Main * applications when the length of the task is unknown. The indeterminate progress bar can be either 7742f139c0696e2988adb24048fab998695e95fba3Scott Main * a spinning wheel or a horizontal bar. 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The following code example shows how a progress bar can be used from 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a worker thread to update the user interface to notify the user of progress: 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8442f139c0696e2988adb24048fab998695e95fba3Scott Main * <pre> 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class MyActivity extends Activity { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private static final int PROGRESS = 0x1; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private ProgressBar mProgress; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private int mProgressStatus = 0; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private Handler mHandler = new Handler(); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * protected void onCreate(Bundle icicle) { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * super.onCreate(icicle); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setContentView(R.layout.progressbar_activity); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mProgress = (ProgressBar) findViewById(R.id.progress_bar); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // Start lengthy operation in a background thread 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * new Thread(new Runnable() { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public void run() { 10342f139c0696e2988adb24048fab998695e95fba3Scott Main * while (mProgressStatus < 100) { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mProgressStatus = doWork(); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * // Update the progress bar 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mHandler.post(new Runnable() { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public void run() { 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mProgress.setProgress(mProgressStatus); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }).start(); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 11642f139c0696e2988adb24048fab998695e95fba3Scott Main * }</pre> 11742f139c0696e2988adb24048fab998695e95fba3Scott Main * 11842f139c0696e2988adb24048fab998695e95fba3Scott Main * <p>To add a progress bar to a layout file, you can use the {@code <ProgressBar>} element. 11942f139c0696e2988adb24048fab998695e95fba3Scott Main * By default, the progress bar is a spinning wheel (an indeterminate indicator). To change to a 12042f139c0696e2988adb24048fab998695e95fba3Scott Main * horizontal progress bar, apply the {@link android.R.style#Widget_ProgressBar_Horizontal 12142f139c0696e2988adb24048fab998695e95fba3Scott Main * Widget.ProgressBar.Horizontal} style, like so:</p> 12242f139c0696e2988adb24048fab998695e95fba3Scott Main * 12342f139c0696e2988adb24048fab998695e95fba3Scott Main * <pre> 12442f139c0696e2988adb24048fab998695e95fba3Scott Main * <ProgressBar 12542f139c0696e2988adb24048fab998695e95fba3Scott Main * style="@android:style/Widget.ProgressBar.Horizontal" 12642f139c0696e2988adb24048fab998695e95fba3Scott Main * ... /></pre> 12742f139c0696e2988adb24048fab998695e95fba3Scott Main * 12842f139c0696e2988adb24048fab998695e95fba3Scott Main * <p>If you will use the progress bar to show real progress, you must use the horizontal bar. You 12942f139c0696e2988adb24048fab998695e95fba3Scott Main * can then increment the progress with {@link #incrementProgressBy incrementProgressBy()} or 13042f139c0696e2988adb24048fab998695e95fba3Scott Main * {@link #setProgress setProgress()}. By default, the progress bar is full when it reaches 100. If 13142f139c0696e2988adb24048fab998695e95fba3Scott Main * necessary, you can adjust the maximum value (the value for a full bar) using the {@link 13242f139c0696e2988adb24048fab998695e95fba3Scott Main * android.R.styleable#ProgressBar_max android:max} attribute. Other attributes available are listed 13342f139c0696e2988adb24048fab998695e95fba3Scott Main * below.</p> 13442f139c0696e2988adb24048fab998695e95fba3Scott Main * 13542f139c0696e2988adb24048fab998695e95fba3Scott Main * <p>Another common style to apply to the progress bar is {@link 13642f139c0696e2988adb24048fab998695e95fba3Scott Main * android.R.style#Widget_ProgressBar_Small Widget.ProgressBar.Small}, which shows a smaller 13742f139c0696e2988adb24048fab998695e95fba3Scott Main * version of the spinning wheel—useful when waiting for content to load. 13842f139c0696e2988adb24048fab998695e95fba3Scott Main * For example, you can insert this kind of progress bar into your default layout for 13942f139c0696e2988adb24048fab998695e95fba3Scott Main * a view that will be populated by some content fetched from the Internet—the spinning wheel 14042f139c0696e2988adb24048fab998695e95fba3Scott Main * appears immediately and when your application receives the content, it replaces the progress bar 14142f139c0696e2988adb24048fab998695e95fba3Scott Main * with the loaded content. For example:</p> 14242f139c0696e2988adb24048fab998695e95fba3Scott Main * 14342f139c0696e2988adb24048fab998695e95fba3Scott Main * <pre> 14442f139c0696e2988adb24048fab998695e95fba3Scott Main * <LinearLayout 14542f139c0696e2988adb24048fab998695e95fba3Scott Main * android:orientation="horizontal" 14642f139c0696e2988adb24048fab998695e95fba3Scott Main * ... > 14742f139c0696e2988adb24048fab998695e95fba3Scott Main * <ProgressBar 14842f139c0696e2988adb24048fab998695e95fba3Scott Main * android:layout_width="wrap_content" 14942f139c0696e2988adb24048fab998695e95fba3Scott Main * android:layout_height="wrap_content" 15042f139c0696e2988adb24048fab998695e95fba3Scott Main * style="@android:style/Widget.ProgressBar.Small" 15142f139c0696e2988adb24048fab998695e95fba3Scott Main * android:layout_marginRight="5dp" /> 15242f139c0696e2988adb24048fab998695e95fba3Scott Main * <TextView 15342f139c0696e2988adb24048fab998695e95fba3Scott Main * android:layout_width="wrap_content" 15442f139c0696e2988adb24048fab998695e95fba3Scott Main * android:layout_height="wrap_content" 15542f139c0696e2988adb24048fab998695e95fba3Scott Main * android:text="@string/loading" /> 15642f139c0696e2988adb24048fab998695e95fba3Scott Main * </LinearLayout></pre> 15742f139c0696e2988adb24048fab998695e95fba3Scott Main * 15842f139c0696e2988adb24048fab998695e95fba3Scott Main * <p>Other progress bar styles provided by the system include:</p> 15942f139c0696e2988adb24048fab998695e95fba3Scott Main * <ul> 16042f139c0696e2988adb24048fab998695e95fba3Scott Main * <li>{@link android.R.style#Widget_ProgressBar_Horizontal Widget.ProgressBar.Horizontal}</li> 16142f139c0696e2988adb24048fab998695e95fba3Scott Main * <li>{@link android.R.style#Widget_ProgressBar_Small Widget.ProgressBar.Small}</li> 16242f139c0696e2988adb24048fab998695e95fba3Scott Main * <li>{@link android.R.style#Widget_ProgressBar_Large Widget.ProgressBar.Large}</li> 16342f139c0696e2988adb24048fab998695e95fba3Scott Main * <li>{@link android.R.style#Widget_ProgressBar_Inverse Widget.ProgressBar.Inverse}</li> 16442f139c0696e2988adb24048fab998695e95fba3Scott Main * <li>{@link android.R.style#Widget_ProgressBar_Small_Inverse 16542f139c0696e2988adb24048fab998695e95fba3Scott Main * Widget.ProgressBar.Small.Inverse}</li> 16642f139c0696e2988adb24048fab998695e95fba3Scott Main * <li>{@link android.R.style#Widget_ProgressBar_Large_Inverse 16742f139c0696e2988adb24048fab998695e95fba3Scott Main * Widget.ProgressBar.Large.Inverse}</li> 16842f139c0696e2988adb24048fab998695e95fba3Scott Main * </ul> 16942f139c0696e2988adb24048fab998695e95fba3Scott Main * <p>The "inverse" styles provide an inverse color scheme for the spinner, which may be necessary 17042f139c0696e2988adb24048fab998695e95fba3Scott Main * if your application uses a light colored theme (a white background).</p> 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>XML attributes</b></strong> 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link android.R.styleable#ProgressBar ProgressBar Attributes}, 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#View View Attributes} 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17842f139c0696e2988adb24048fab998695e95fba3Scott Main * @attr ref android.R.styleable#ProgressBar_animationResolution 17942f139c0696e2988adb24048fab998695e95fba3Scott Main * @attr ref android.R.styleable#ProgressBar_indeterminate 18042f139c0696e2988adb24048fab998695e95fba3Scott Main * @attr ref android.R.styleable#ProgressBar_indeterminateBehavior 18142f139c0696e2988adb24048fab998695e95fba3Scott Main * @attr ref android.R.styleable#ProgressBar_indeterminateDrawable 18242f139c0696e2988adb24048fab998695e95fba3Scott Main * @attr ref android.R.styleable#ProgressBar_indeterminateDuration 18342f139c0696e2988adb24048fab998695e95fba3Scott Main * @attr ref android.R.styleable#ProgressBar_indeterminateOnly 18442f139c0696e2988adb24048fab998695e95fba3Scott Main * @attr ref android.R.styleable#ProgressBar_interpolator 18542f139c0696e2988adb24048fab998695e95fba3Scott Main * @attr ref android.R.styleable#ProgressBar_max 18642f139c0696e2988adb24048fab998695e95fba3Scott Main * @attr ref android.R.styleable#ProgressBar_maxHeight 18742f139c0696e2988adb24048fab998695e95fba3Scott Main * @attr ref android.R.styleable#ProgressBar_maxWidth 18842f139c0696e2988adb24048fab998695e95fba3Scott Main * @attr ref android.R.styleable#ProgressBar_minHeight 18942f139c0696e2988adb24048fab998695e95fba3Scott Main * @attr ref android.R.styleable#ProgressBar_minWidth 19042f139c0696e2988adb24048fab998695e95fba3Scott Main * @attr ref android.R.styleable#ProgressBar_progress 19142f139c0696e2988adb24048fab998695e95fba3Scott Main * @attr ref android.R.styleable#ProgressBar_progressDrawable 19242f139c0696e2988adb24048fab998695e95fba3Scott Main * @attr ref android.R.styleable#ProgressBar_secondaryProgress 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@RemoteView 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ProgressBar extends View { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MAX_LEVEL = 10000; 1976518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov private static final int TIMEOUT_SEND_ACCESSIBILITY_EVENT = 200; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mMinWidth; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mMaxWidth; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mMinHeight; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mMaxHeight; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mProgress; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mSecondaryProgress; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mMax; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mBehavior; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDuration; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mIndeterminate; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mOnlyIndeterminate; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Transformation mTransformation; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AlphaAnimation mAnimation; 214ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy private boolean mHasAnimation; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mIndeterminateDrawable; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mProgressDrawable; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mCurrentDrawable; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap mSampleTile; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mNoInvalidate; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Interpolator mInterpolator; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private RefreshProgressRunnable mRefreshProgressRunnable; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mUiThreadId; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mShouldStartAnimationDrawable; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mInDrawing; 226a050663feb6309c63867abd746cdf97388e289a4Adam Powell private boolean mAttached; 227a050663feb6309c63867abd746cdf97388e289a4Adam Powell private boolean mRefreshIsPosted; 228a050663feb6309c63867abd746cdf97388e289a4Adam Powell 229a050663feb6309c63867abd746cdf97388e289a4Adam Powell private final ArrayList<RefreshData> mRefreshData = new ArrayList<RefreshData>(); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2316518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov private AccessibilityEventSender mAccessibilityEventSender; 2326518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new progress bar with range 0...100 and initial progress of 0. 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context the application environment 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ProgressBar(Context context) { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, null); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ProgressBar(Context context, AttributeSet attrs) { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, attrs, com.android.internal.R.attr.progressBarStyle); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ProgressBar(Context context, AttributeSet attrs, int defStyle) { 2466af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell this(context, attrs, defStyle, 0); 2476af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell } 2486af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell 2496af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell /** 2506af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell * @hide 2516af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell */ 2526af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell public ProgressBar(Context context, AttributeSet attrs, int defStyle, int styleRes) { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUiThreadId = Thread.currentThread().getId(); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initProgressBar(); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = 2586af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell context.obtainStyledAttributes(attrs, R.styleable.ProgressBar, defStyle, styleRes); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoInvalidate = true; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable drawable = a.getDrawable(R.styleable.ProgressBar_progressDrawable); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable != null) { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable = tileify(drawable, false); 2658d21bdb90573ec48491c44eca312c162e262298dRomain Guy // Calling this method can set mMaxHeight, make sure the corresponding 2668d21bdb90573ec48491c44eca312c162e262298dRomain Guy // XML attribute for mMaxHeight is read after calling this method 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgressDrawable(drawable); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDuration = a.getInt(R.styleable.ProgressBar_indeterminateDuration, mDuration); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinWidth = a.getDimensionPixelSize(R.styleable.ProgressBar_minWidth, mMinWidth); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMaxWidth = a.getDimensionPixelSize(R.styleable.ProgressBar_maxWidth, mMaxWidth); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinHeight = a.getDimensionPixelSize(R.styleable.ProgressBar_minHeight, mMinHeight); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMaxHeight = a.getDimensionPixelSize(R.styleable.ProgressBar_maxHeight, mMaxHeight); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBehavior = a.getInt(R.styleable.ProgressBar_indeterminateBehavior, mBehavior); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28072b1f379d5c97c8ff31d2201e78215af777d6bdaJean-Baptiste Queru final int resID = a.getResourceId( 28172b1f379d5c97c8ff31d2201e78215af777d6bdaJean-Baptiste Queru com.android.internal.R.styleable.ProgressBar_interpolator, 28272b1f379d5c97c8ff31d2201e78215af777d6bdaJean-Baptiste Queru android.R.anim.linear_interpolator); // default to linear interpolator 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resID > 0) { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInterpolator(context, resID); 28572b1f379d5c97c8ff31d2201e78215af777d6bdaJean-Baptiste Queru } 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMax(a.getInt(R.styleable.ProgressBar_max, mMax)); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgress(a.getInt(R.styleable.ProgressBar_progress, mProgress)); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setSecondaryProgress( 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.getInt(R.styleable.ProgressBar_secondaryProgress, mSecondaryProgress)); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable = a.getDrawable(R.styleable.ProgressBar_indeterminateDrawable); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable != null) { 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable = tileifyIndeterminate(drawable); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setIndeterminateDrawable(drawable); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnlyIndeterminate = a.getBoolean( 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.ProgressBar_indeterminateOnly, mOnlyIndeterminate); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNoInvalidate = false; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setIndeterminate(mOnlyIndeterminate || a.getBoolean( 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.ProgressBar_indeterminate, mIndeterminate)); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Converts a drawable to a tiled version of itself. It will recursively 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * traverse layer and state list drawables. 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable tileify(Drawable drawable, boolean clip) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable instanceof LayerDrawable) { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerDrawable background = (LayerDrawable) drawable; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = background.getNumberOfLayers(); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable[] outDrawables = new Drawable[N]; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int id = background.getId(i); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outDrawables[i] = tileify(background.getDrawable(i), 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (id == R.id.progress || id == R.id.secondaryProgress)); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayerDrawable newBg = new LayerDrawable(outDrawables); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newBg.setId(i, background.getId(i)); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return newBg; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (drawable instanceof StateListDrawable) { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StateListDrawable in = (StateListDrawable) drawable; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StateListDrawable out = new StateListDrawable(); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numStates = in.getStateCount(); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numStates; i++) { 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.addState(in.getStateSet(i), tileify(in.getStateDrawable(i), clip)); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return out; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (drawable instanceof BitmapDrawable) { 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Bitmap tileBitmap = ((BitmapDrawable) drawable).getBitmap(); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSampleTile == null) { 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSampleTile = tileBitmap; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ShapeDrawable shapeDrawable = new ShapeDrawable(getDrawableShape()); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final BitmapShader bitmapShader = new BitmapShader(tileBitmap, 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Shader.TileMode.REPEAT, Shader.TileMode.CLAMP); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project shapeDrawable.getPaint().setShader(bitmapShader); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3577fb98b34492012aad10d1c5bcaaa4064c7a79760Fabrice Di Meglio return (clip) ? new ClipDrawable(shapeDrawable, Gravity.LEFT, 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClipDrawable.HORIZONTAL) : shapeDrawable; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return drawable; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Shape getDrawableShape() { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 }; 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RoundRectShape(roundedCorners, null, null); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convert a AnimationDrawable for use as a barberpole animation. 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Each frame of the animation is wrapped in a ClipDrawable and 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given a tiling BitmapShader. 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable tileifyIndeterminate(Drawable drawable) { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable instanceof AnimationDrawable) { 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AnimationDrawable background = (AnimationDrawable) drawable; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = background.getNumberOfFrames(); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AnimationDrawable newBg = new AnimationDrawable(); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newBg.setOneShot(background.isOneShot()); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable frame = tileify(background.getFrame(i), true); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project frame.setLevel(10000); 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newBg.addFrame(frame, background.getDuration(i)); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newBg.setLevel(10000); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable = newBg; 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return drawable; 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Initialize the progress bar's default values: 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>progress = 0</li> 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>max = 100</li> 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>animation duration = 4000 ms</li> 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>indeterminate = false</li> 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>behavior = repeat</li> 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void initProgressBar() { 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMax = 100; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = 0; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSecondaryProgress = 0; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminate = false; 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnlyIndeterminate = false; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDuration = 4000; 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBehavior = AlphaAnimation.RESTART; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinWidth = 24; 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMaxWidth = 48; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinHeight = 24; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMaxHeight = 48; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Indicate whether this progress bar is in indeterminate mode.</p> 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the progress bar is in indeterminate mode 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 423bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "progress") 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized boolean isIndeterminate() { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndeterminate; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Change the indeterminate mode for this progress bar. In indeterminate 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mode, the progress is ignored and the progress bar shows an infinite 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * animation instead.</p> 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this progress bar's style only supports indeterminate mode (such as the circular 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress bars), then this will be ignored. 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param indeterminate true to enable the indeterminate mode 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setIndeterminate(boolean indeterminate) { 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((!mOnlyIndeterminate || !mIndeterminate) && indeterminate != mIndeterminate) { 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminate = indeterminate; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (indeterminate) { 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // swap between indeterminate and regular backgrounds 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentDrawable = mIndeterminateDrawable; 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startAnimation(); 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentDrawable = mProgressDrawable; 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopAnimation(); 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Get the drawable used to draw the progress bar in 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * indeterminate mode.</p> 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a {@link android.graphics.drawable.Drawable} instance 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminateDrawable(android.graphics.drawable.Drawable) 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getIndeterminateDrawable() { 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndeterminateDrawable; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Define the drawable used to draw the progress bar in 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * indeterminate mode.</p> 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param d the new drawable 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getIndeterminateDrawable() 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setIndeterminateDrawable(Drawable d) { 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setCallback(this); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminateDrawable = d; 4810af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio if (mIndeterminateDrawable != null && canResolveLayoutDirection()) { 482e56ffdc7b31b0937628609cc3bbaa15879023569Fabrice Di Meglio mIndeterminateDrawable.setLayoutDirection(getLayoutDirection()); 483b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio } 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminate) { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentDrawable = d; 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postInvalidate(); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Get the drawable used to draw the progress bar in 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress mode.</p> 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a {@link android.graphics.drawable.Drawable} instance 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setProgressDrawable(android.graphics.drawable.Drawable) 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getProgressDrawable() { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mProgressDrawable; 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Define the drawable used to draw the progress bar in 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress mode.</p> 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param d the new drawable 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getProgressDrawable() 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setProgressDrawable(Drawable d) { 513aa072634630c9515e44890dc302307fa969bbb85Joe Onorato boolean needUpdate; 514aa072634630c9515e44890dc302307fa969bbb85Joe Onorato if (mProgressDrawable != null && d != mProgressDrawable) { 515aa072634630c9515e44890dc302307fa969bbb85Joe Onorato mProgressDrawable.setCallback(null); 516aa072634630c9515e44890dc302307fa969bbb85Joe Onorato needUpdate = true; 517aa072634630c9515e44890dc302307fa969bbb85Joe Onorato } else { 518aa072634630c9515e44890dc302307fa969bbb85Joe Onorato needUpdate = false; 519aa072634630c9515e44890dc302307fa969bbb85Joe Onorato } 520aa072634630c9515e44890dc302307fa969bbb85Joe Onorato 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setCallback(this); 5230af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio if (canResolveLayoutDirection()) { 524e56ffdc7b31b0937628609cc3bbaa15879023569Fabrice Di Meglio d.setLayoutDirection(getLayoutDirection()); 5250af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio } 526a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora 5278d21bdb90573ec48491c44eca312c162e262298dRomain Guy // Make sure the ProgressBar is always tall enough 5288d21bdb90573ec48491c44eca312c162e262298dRomain Guy int drawableHeight = d.getMinimumHeight(); 529a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora if (mMaxHeight < drawableHeight) { 530a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora mMaxHeight = drawableHeight; 531a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora requestLayout(); 532a7f7e2ac9270e58f8c45006a239a1c3c0cdc0309NoraBora } 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgressDrawable = d; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mIndeterminate) { 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentDrawable = d; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postInvalidate(); 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 539aa072634630c9515e44890dc302307fa969bbb85Joe Onorato 540aa072634630c9515e44890dc302307fa969bbb85Joe Onorato if (needUpdate) { 541aa072634630c9515e44890dc302307fa969bbb85Joe Onorato updateDrawableBounds(getWidth(), getHeight()); 542aa072634630c9515e44890dc302307fa969bbb85Joe Onorato updateDrawableState(); 543aa072634630c9515e44890dc302307fa969bbb85Joe Onorato doRefreshProgress(R.id.progress, mProgress, false, false); 544aa072634630c9515e44890dc302307fa969bbb85Joe Onorato doRefreshProgress(R.id.secondaryProgress, mSecondaryProgress, false, false); 545aa072634630c9515e44890dc302307fa969bbb85Joe Onorato } 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The drawable currently used to draw the progress bar 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable getCurrentDrawable() { 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentDrawable; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean verifyDrawable(Drawable who) { 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return who == mProgressDrawable || who == mIndeterminateDrawable 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || super.verifyDrawable(who); 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 562e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn public void jumpDrawablesToCurrentState() { 563e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn super.jumpDrawablesToCurrentState(); 564e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn if (mProgressDrawable != null) mProgressDrawable.jumpToCurrentState(); 565e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn if (mIndeterminateDrawable != null) mIndeterminateDrawable.jumpToCurrentState(); 566e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn } 567e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn 5684457e85a7090ad51726d50a4daf981d917cceeddFabrice Di Meglio /** 5694457e85a7090ad51726d50a4daf981d917cceeddFabrice Di Meglio * @hide 5704457e85a7090ad51726d50a4daf981d917cceeddFabrice Di Meglio */ 571e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn @Override 5720af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio public void onResolveDrawables(int layoutDirection) { 5730af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio final Drawable d = mCurrentDrawable; 5740af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio if (d != null) { 5750af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio d.setLayoutDirection(layoutDirection); 5760af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio } 5770af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio if (mIndeterminateDrawable != null) { 5780af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio mIndeterminateDrawable.setLayoutDirection(layoutDirection); 5790af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio } 5800af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio if (mProgressDrawable != null) { 5810af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio mProgressDrawable.setLayoutDirection(layoutDirection); 5820af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio } 5830af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio } 5840af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio 5850af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio @Override 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void postInvalidate() { 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mNoInvalidate) { 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.postInvalidate(); 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class RefreshProgressRunnable implements Runnable { 593a050663feb6309c63867abd746cdf97388e289a4Adam Powell public void run() { 594a050663feb6309c63867abd746cdf97388e289a4Adam Powell synchronized (ProgressBar.this) { 595a050663feb6309c63867abd746cdf97388e289a4Adam Powell final int count = mRefreshData.size(); 596a050663feb6309c63867abd746cdf97388e289a4Adam Powell for (int i = 0; i < count; i++) { 597a050663feb6309c63867abd746cdf97388e289a4Adam Powell final RefreshData rd = mRefreshData.get(i); 598a050663feb6309c63867abd746cdf97388e289a4Adam Powell doRefreshProgress(rd.id, rd.progress, rd.fromUser, true); 599a050663feb6309c63867abd746cdf97388e289a4Adam Powell rd.recycle(); 600a050663feb6309c63867abd746cdf97388e289a4Adam Powell } 601a050663feb6309c63867abd746cdf97388e289a4Adam Powell mRefreshData.clear(); 602a050663feb6309c63867abd746cdf97388e289a4Adam Powell mRefreshIsPosted = false; 603a050663feb6309c63867abd746cdf97388e289a4Adam Powell } 604a050663feb6309c63867abd746cdf97388e289a4Adam Powell } 605a050663feb6309c63867abd746cdf97388e289a4Adam Powell } 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 607a050663feb6309c63867abd746cdf97388e289a4Adam Powell private static class RefreshData implements Poolable<RefreshData> { 608a050663feb6309c63867abd746cdf97388e289a4Adam Powell public int id; 609a050663feb6309c63867abd746cdf97388e289a4Adam Powell public int progress; 610a050663feb6309c63867abd746cdf97388e289a4Adam Powell public boolean fromUser; 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 612a050663feb6309c63867abd746cdf97388e289a4Adam Powell private RefreshData mNext; 613a050663feb6309c63867abd746cdf97388e289a4Adam Powell private boolean mIsPooled; 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 615a050663feb6309c63867abd746cdf97388e289a4Adam Powell private static final int POOL_MAX = 24; 616a050663feb6309c63867abd746cdf97388e289a4Adam Powell private static final Pool<RefreshData> sPool = Pools.synchronizedPool( 617a050663feb6309c63867abd746cdf97388e289a4Adam Powell Pools.finitePool(new PoolableManager<RefreshData>() { 618a050663feb6309c63867abd746cdf97388e289a4Adam Powell @Override 619a050663feb6309c63867abd746cdf97388e289a4Adam Powell public RefreshData newInstance() { 620a050663feb6309c63867abd746cdf97388e289a4Adam Powell return new RefreshData(); 621a050663feb6309c63867abd746cdf97388e289a4Adam Powell } 622a050663feb6309c63867abd746cdf97388e289a4Adam Powell 623a050663feb6309c63867abd746cdf97388e289a4Adam Powell @Override 624a050663feb6309c63867abd746cdf97388e289a4Adam Powell public void onAcquired(RefreshData element) { 625a050663feb6309c63867abd746cdf97388e289a4Adam Powell } 626a050663feb6309c63867abd746cdf97388e289a4Adam Powell 627a050663feb6309c63867abd746cdf97388e289a4Adam Powell @Override 628a050663feb6309c63867abd746cdf97388e289a4Adam Powell public void onReleased(RefreshData element) { 629a050663feb6309c63867abd746cdf97388e289a4Adam Powell } 630a050663feb6309c63867abd746cdf97388e289a4Adam Powell }, POOL_MAX)); 631a050663feb6309c63867abd746cdf97388e289a4Adam Powell 632a050663feb6309c63867abd746cdf97388e289a4Adam Powell public static RefreshData obtain(int id, int progress, boolean fromUser) { 633a050663feb6309c63867abd746cdf97388e289a4Adam Powell RefreshData rd = sPool.acquire(); 634a050663feb6309c63867abd746cdf97388e289a4Adam Powell rd.id = id; 635a050663feb6309c63867abd746cdf97388e289a4Adam Powell rd.progress = progress; 636a050663feb6309c63867abd746cdf97388e289a4Adam Powell rd.fromUser = fromUser; 637a050663feb6309c63867abd746cdf97388e289a4Adam Powell return rd; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 640a050663feb6309c63867abd746cdf97388e289a4Adam Powell public void recycle() { 641a050663feb6309c63867abd746cdf97388e289a4Adam Powell sPool.release(this); 642a050663feb6309c63867abd746cdf97388e289a4Adam Powell } 643a050663feb6309c63867abd746cdf97388e289a4Adam Powell 644a050663feb6309c63867abd746cdf97388e289a4Adam Powell @Override 645a050663feb6309c63867abd746cdf97388e289a4Adam Powell public void setNextPoolable(RefreshData element) { 646a050663feb6309c63867abd746cdf97388e289a4Adam Powell mNext = element; 647a050663feb6309c63867abd746cdf97388e289a4Adam Powell } 648a050663feb6309c63867abd746cdf97388e289a4Adam Powell 649a050663feb6309c63867abd746cdf97388e289a4Adam Powell @Override 650a050663feb6309c63867abd746cdf97388e289a4Adam Powell public RefreshData getNextPoolable() { 651a050663feb6309c63867abd746cdf97388e289a4Adam Powell return mNext; 652a050663feb6309c63867abd746cdf97388e289a4Adam Powell } 653a050663feb6309c63867abd746cdf97388e289a4Adam Powell 654a050663feb6309c63867abd746cdf97388e289a4Adam Powell @Override 655a050663feb6309c63867abd746cdf97388e289a4Adam Powell public boolean isPooled() { 656a050663feb6309c63867abd746cdf97388e289a4Adam Powell return mIsPooled; 657a050663feb6309c63867abd746cdf97388e289a4Adam Powell } 658a050663feb6309c63867abd746cdf97388e289a4Adam Powell 659a050663feb6309c63867abd746cdf97388e289a4Adam Powell @Override 660a050663feb6309c63867abd746cdf97388e289a4Adam Powell public void setPooled(boolean isPooled) { 661a050663feb6309c63867abd746cdf97388e289a4Adam Powell mIsPooled = isPooled; 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 665aa072634630c9515e44890dc302307fa969bbb85Joe Onorato private synchronized void doRefreshProgress(int id, int progress, boolean fromUser, 666aa072634630c9515e44890dc302307fa969bbb85Joe Onorato boolean callBackToApp) { 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float scale = mMax > 0 ? (float) progress / (float) mMax : 0; 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Drawable d = mCurrentDrawable; 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable progressDrawable = null; 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d instanceof LayerDrawable) { 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project progressDrawable = ((LayerDrawable) d).findDrawableByLayerId(id); 6740af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio if (progressDrawable != null && canResolveLayoutDirection()) { 675e56ffdc7b31b0937628609cc3bbaa15879023569Fabrice Di Meglio progressDrawable.setLayoutDirection(getLayoutDirection()); 6760af4b8b0c8b038bca9b4f60eb81f71e186f471ceFabrice Di Meglio } 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int level = (int) (scale * MAX_LEVEL); 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (progressDrawable != null ? progressDrawable : d).setLevel(level); 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 685aa072634630c9515e44890dc302307fa969bbb85Joe Onorato if (callBackToApp && id == R.id.progress) { 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onProgressRefresh(scale, fromUser); 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6896518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov 6906518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov void onProgressRefresh(float scale, boolean fromUser) { 6916518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov if (AccessibilityManager.getInstance(mContext).isEnabled()) { 6926518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov scheduleAccessibilityEventSender(); 6936518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private synchronized void refreshProgress(int id, int progress, boolean fromUser) { 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mUiThreadId == Thread.currentThread().getId()) { 698aa072634630c9515e44890dc302307fa969bbb85Joe Onorato doRefreshProgress(id, progress, fromUser, true); 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 700ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy if (mRefreshProgressRunnable == null) { 701ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy mRefreshProgressRunnable = new RefreshProgressRunnable(); 702a050663feb6309c63867abd746cdf97388e289a4Adam Powell } 703ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy 704a050663feb6309c63867abd746cdf97388e289a4Adam Powell final RefreshData rd = RefreshData.obtain(id, progress, fromUser); 705a050663feb6309c63867abd746cdf97388e289a4Adam Powell mRefreshData.add(rd); 706a050663feb6309c63867abd746cdf97388e289a4Adam Powell if (mAttached && !mRefreshIsPosted) { 707ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy post(mRefreshProgressRunnable); 708a050663feb6309c63867abd746cdf97388e289a4Adam Powell mRefreshIsPosted = true; 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Set the current progress to the specified value. Does not do anything 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if the progress bar is in indeterminate mode.</p> 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param progress the new progress, between 0 and {@link #getMax()} 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isIndeterminate() 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getProgress() 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #incrementProgressBy(int) 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setProgress(int progress) { 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgress(progress, false); 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized void setProgress(int progress, boolean fromUser) { 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminate) { 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (progress < 0) { 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project progress = 0; 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (progress > mMax) { 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project progress = mMax; 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (progress != mProgress) { 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = progress; 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshProgress(R.id.progress, mProgress, fromUser); 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the current secondary progress to the specified value. Does not do 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * anything if the progress bar is in indeterminate mode. 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param secondaryProgress the new secondary progress, between 0 and {@link #getMax()} 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isIndeterminate() 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getSecondaryProgress() 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #incrementSecondaryProgressBy(int) 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setSecondaryProgress(int secondaryProgress) { 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminate) { 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (secondaryProgress < 0) { 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project secondaryProgress = 0; 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (secondaryProgress > mMax) { 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project secondaryProgress = mMax; 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (secondaryProgress != mSecondaryProgress) { 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSecondaryProgress = secondaryProgress; 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshProgress(R.id.secondaryProgress, mSecondaryProgress, false); 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Get the progress bar's current level of progress. Return 0 when the 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress bar is in indeterminate mode.</p> 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current progress, between 0 and {@link #getMax()} 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isIndeterminate() 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setProgress(int) 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setMax(int) 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getMax() 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 793bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "progress") 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized int getProgress() { 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndeterminate ? 0 : mProgress; 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Get the progress bar's current level of secondary progress. Return 0 when the 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * progress bar is in indeterminate mode.</p> 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current secondary progress, between 0 and {@link #getMax()} 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndeterminate(boolean) 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isIndeterminate() 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setSecondaryProgress(int) 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setMax(int) 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getMax() 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 810bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "progress") 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized int getSecondaryProgress() { 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIndeterminate ? 0 : mSecondaryProgress; 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Return the upper limit of this progress bar's range.</p> 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a positive integer 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setMax(int) 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getProgress() 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getSecondaryProgress() 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 824bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "progress") 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized int getMax() { 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMax; 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Set the range of the progress bar to 0...<tt>max</tt>.</p> 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param max the upper range of this progress bar 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getMax() 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setProgress(int) 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setSecondaryProgress(int) 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized void setMax(int max) { 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (max < 0) { 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project max = 0; 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (max != mMax) { 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMax = max; 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postInvalidate(); 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mProgress > max) { 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgress = max; 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 85058e3822b5973e766f79046e8964457d9ef26df55Michael Krehan refreshProgress(R.id.progress, mProgress, false); 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Increase the progress bar's progress by the specified amount.</p> 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param diff the amount by which the progress must be increased 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setProgress(int) 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized final void incrementProgressBy(int diff) { 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgress(mProgress + diff); 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Increase the progress bar's secondary progress by the specified amount.</p> 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param diff the amount by which the secondary progress must be increased 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setSecondaryProgress(int) 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public synchronized final void incrementSecondaryProgressBy(int diff) { 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setSecondaryProgress(mSecondaryProgress + diff); 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Start the indeterminate progress animation.</p> 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void startAnimation() { 880a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy if (getVisibility() != VISIBLE) { 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 884cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru if (mIndeterminateDrawable instanceof Animatable) { 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShouldStartAnimationDrawable = true; 886ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy mHasAnimation = false; 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 888ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy mHasAnimation = true; 889ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInterpolator == null) { 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInterpolator = new LinearInterpolator(); 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 894ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy if (mTransformation == null) { 895ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy mTransformation = new Transformation(); 896ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy } else { 897ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy mTransformation.clear(); 898ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy } 899ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy 900ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy if (mAnimation == null) { 901ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy mAnimation = new AlphaAnimation(0.0f, 1.0f); 902ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy } else { 903ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy mAnimation.reset(); 904ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy } 905ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setRepeatMode(mBehavior); 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setRepeatCount(Animation.INFINITE); 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setDuration(mDuration); 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setInterpolator(mInterpolator); 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.setStartTime(Animation.START_ON_FIRST_FRAME); 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 91208e1473ca30ef1756c6694cc1ed0aff27f11807dEvan Charlton postInvalidate(); 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Stop the indeterminate progress animation.</p> 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void stopAnimation() { 919ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy mHasAnimation = false; 920cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru if (mIndeterminateDrawable instanceof Animatable) { 921cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru ((Animatable) mIndeterminateDrawable).stop(); 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShouldStartAnimationDrawable = false; 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 92408e1473ca30ef1756c6694cc1ed0aff27f11807dEvan Charlton postInvalidate(); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the acceleration curve for the indeterminate animation. 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The interpolator is loaded as a resource from the specified context. 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The application environment 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resID The resource identifier of the interpolator to load 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInterpolator(Context context, int resID) { 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInterpolator(AnimationUtils.loadInterpolator(context, resID)); 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the acceleration curve for the indeterminate animation. 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Defaults to a linear interpolation. 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param interpolator The interpolator which defines the acceleration curve 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInterpolator(Interpolator interpolator) { 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInterpolator = interpolator; 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the acceleration curve type for the indeterminate animation. 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the {@link Interpolator} associated to this animation 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Interpolator getInterpolator() { 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInterpolator; 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 958b25ffffc3157c4c471c326147be750f4ebec456aSteve Howard @RemotableViewMethod 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setVisibility(int v) { 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getVisibility() != v) { 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setVisibility(v); 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminate) { 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // let's be nice with the UI thread 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == GONE || v == INVISIBLE) { 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopAnimation(); 967a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } else { 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startAnimation(); 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 975a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy protected void onVisibilityChanged(View changedView, int visibility) { 976a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy super.onVisibilityChanged(changedView, visibility); 977a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy 978a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy if (mIndeterminate) { 979a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy // let's be nice with the UI thread 980a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy if (visibility == GONE || visibility == INVISIBLE) { 981a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy stopAnimation(); 982a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } else { 983a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy startAnimation(); 984a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } 985a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } 986a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy } 987a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy 988a05e8a5869ad2117485938cd52d4b891672a1873Romain Guy @Override 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void invalidateDrawable(Drawable dr) { 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mInDrawing) { 991ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (verifyDrawable(dr)) { 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect dirty = dr.getBounds(); 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int scrollX = mScrollX + mPaddingLeft; 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int scrollY = mScrollY + mPaddingTop; 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(dirty.left + scrollX, dirty.top + scrollY, 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dirty.right + scrollX, dirty.bottom + scrollY); 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.invalidateDrawable(dr); 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onSizeChanged(int w, int h, int oldw, int oldh) { 1006aa072634630c9515e44890dc302307fa969bbb85Joe Onorato updateDrawableBounds(w, h); 1007aa072634630c9515e44890dc302307fa969bbb85Joe Onorato } 1008aa072634630c9515e44890dc302307fa969bbb85Joe Onorato 1009aa072634630c9515e44890dc302307fa969bbb85Joe Onorato private void updateDrawableBounds(int w, int h) { 10106322af54cfb74be22386e4b7d17350cebf2da58fAdam Powell // onDraw will translate the canvas so we draw starting at 0,0. 10116322af54cfb74be22386e4b7d17350cebf2da58fAdam Powell // Subtract out padding for the purposes of the calculations below. 10126322af54cfb74be22386e4b7d17350cebf2da58fAdam Powell w -= mPaddingRight + mPaddingLeft; 10136322af54cfb74be22386e4b7d17350cebf2da58fAdam Powell h -= mPaddingTop + mPaddingBottom; 10146322af54cfb74be22386e4b7d17350cebf2da58fAdam Powell 10156322af54cfb74be22386e4b7d17350cebf2da58fAdam Powell int right = w; 10166322af54cfb74be22386e4b7d17350cebf2da58fAdam Powell int bottom = h; 1017a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell int top = 0; 1018a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell int left = 0; 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminateDrawable != null) { 1021a79803c0924836053a6f97cc0e73f7ad56f763bdChet Haase // Aspect ratio logic does not apply to AnimationDrawables 1022a79803c0924836053a6f97cc0e73f7ad56f763bdChet Haase if (mOnlyIndeterminate && !(mIndeterminateDrawable instanceof AnimationDrawable)) { 1023a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell // Maintain aspect ratio. Certain kinds of animated drawables 1024a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell // get very confused otherwise. 1025a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell final int intrinsicWidth = mIndeterminateDrawable.getIntrinsicWidth(); 1026a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell final int intrinsicHeight = mIndeterminateDrawable.getIntrinsicHeight(); 1027a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell final float intrinsicAspect = (float) intrinsicWidth / intrinsicHeight; 1028a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell final float boundAspect = (float) w / h; 1029a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell if (intrinsicAspect != boundAspect) { 1030a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell if (boundAspect > intrinsicAspect) { 1031a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell // New width is larger. Make it smaller to match height. 1032a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell final int width = (int) (h * intrinsicAspect); 1033a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell left = (w - width) / 2; 1034a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell right = left + width; 1035a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell } else { 1036a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell // New height is larger. Make it smaller to match width. 1037a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell final int height = (int) (w * (1 / intrinsicAspect)); 1038a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell top = (h - height) / 2; 1039a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell bottom = top + height; 1040a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell } 1041a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell } 1042a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell } 10437fb98b34492012aad10d1c5bcaaa4064c7a79760Fabrice Di Meglio if (isLayoutRtl()) { 10447fb98b34492012aad10d1c5bcaaa4064c7a79760Fabrice Di Meglio int tempLeft = left; 10457fb98b34492012aad10d1c5bcaaa4064c7a79760Fabrice Di Meglio left = w - right; 10467fb98b34492012aad10d1c5bcaaa4064c7a79760Fabrice Di Meglio right = w - tempLeft; 10477fb98b34492012aad10d1c5bcaaa4064c7a79760Fabrice Di Meglio } 1048a1b92c5e8b750d8f5b2dc5ca7e8b4edc97de5575Adam Powell mIndeterminateDrawable.setBounds(left, top, right, bottom); 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mProgressDrawable != null) { 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgressDrawable.setBounds(0, 0, right, bottom); 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected synchronized void onDraw(Canvas canvas) { 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onDraw(canvas); 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable d = mCurrentDrawable; 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Translate canvas so a indeterminate circular progress bar with padding 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // rotates properly in its animation 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.save(); 10657fb98b34492012aad10d1c5bcaaa4064c7a79760Fabrice Di Meglio if(isLayoutRtl()) { 10667fb98b34492012aad10d1c5bcaaa4064c7a79760Fabrice Di Meglio canvas.translate(getWidth() - mPaddingRight, mPaddingTop); 10677fb98b34492012aad10d1c5bcaaa4064c7a79760Fabrice Di Meglio canvas.scale(-1.0f, 1.0f); 10687fb98b34492012aad10d1c5bcaaa4064c7a79760Fabrice Di Meglio } else { 10697fb98b34492012aad10d1c5bcaaa4064c7a79760Fabrice Di Meglio canvas.translate(mPaddingLeft, mPaddingTop); 10707fb98b34492012aad10d1c5bcaaa4064c7a79760Fabrice Di Meglio } 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getDrawingTime(); 1072ab4c4f4ff73e66b7767640dbe6d4115237c48242Romain Guy if (mHasAnimation) { 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimation.getTransformation(time, mTransformation); 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float scale = mTransformation.getAlpha(); 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInDrawing = true; 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setLevel((int) (scale * MAX_LEVEL)); 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInDrawing = false; 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10816cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown postInvalidateOnAnimation(); 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.draw(canvas); 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.restore(); 1085cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru if (mShouldStartAnimationDrawable && d instanceof Animatable) { 1086cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru ((Animatable) d).start(); 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShouldStartAnimationDrawable = false; 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable d = mCurrentDrawable; 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dw = 0; 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dh = 0; 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dw = Math.max(mMinWidth, Math.min(mMaxWidth, d.getIntrinsicWidth())); 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dh = Math.max(mMinHeight, Math.min(mMaxHeight, d.getIntrinsicHeight())); 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1102aa072634630c9515e44890dc302307fa969bbb85Joe Onorato updateDrawableState(); 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dw += mPaddingLeft + mPaddingRight; 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dh += mPaddingTop + mPaddingBottom; 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1106189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn setMeasuredDimension(resolveSizeAndState(dw, widthMeasureSpec, 0), 1107189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn resolveSizeAndState(dh, heightMeasureSpec, 0)); 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void drawableStateChanged() { 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.drawableStateChanged(); 1113aa072634630c9515e44890dc302307fa969bbb85Joe Onorato updateDrawableState(); 1114aa072634630c9515e44890dc302307fa969bbb85Joe Onorato } 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1116aa072634630c9515e44890dc302307fa969bbb85Joe Onorato private void updateDrawableState() { 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] state = getDrawableState(); 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mProgressDrawable != null && mProgressDrawable.isStateful()) { 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProgressDrawable.setState(state); 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIndeterminateDrawable != null && mIndeterminateDrawable.isStateful()) { 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndeterminateDrawable.setState(state); 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class SavedState extends BaseSavedState { 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int progress; 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int secondaryProgress; 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor called from {@link ProgressBar#onSaveInstanceState()} 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState(Parcelable superState) { 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(superState); 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor called from {@link #CREATOR} 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SavedState(Parcel in) { 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(in); 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project progress = in.readInt(); 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project secondaryProgress = in.readInt(); 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.writeToParcel(out, flags); 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(progress); 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(secondaryProgress); 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<SavedState> CREATOR 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new Parcelable.Creator<SavedState>() { 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState createFromParcel(Parcel in) { 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState(in); 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState[] newArray(int size) { 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState[size]; 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Parcelable onSaveInstanceState() { 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Force our ancestor class to save its state 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcelable superState = super.onSaveInstanceState(); 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState ss = new SavedState(superState); 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ss.progress = mProgress; 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ss.secondaryProgress = mSecondaryProgress; 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ss; 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onRestoreInstanceState(Parcelable state) { 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState ss = (SavedState) state; 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onRestoreInstanceState(ss.getSuperState()); 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setProgress(ss.progress); 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setSecondaryProgress(ss.secondaryProgress); 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 118752a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques 118852a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques @Override 118952a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques protected void onAttachedToWindow() { 119052a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques super.onAttachedToWindow(); 119152a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques if (mIndeterminate) { 119252a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques startAnimation(); 119352a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques } 1194a050663feb6309c63867abd746cdf97388e289a4Adam Powell if (mRefreshData != null) { 1195a050663feb6309c63867abd746cdf97388e289a4Adam Powell synchronized (this) { 1196a050663feb6309c63867abd746cdf97388e289a4Adam Powell final int count = mRefreshData.size(); 1197a050663feb6309c63867abd746cdf97388e289a4Adam Powell for (int i = 0; i < count; i++) { 1198a050663feb6309c63867abd746cdf97388e289a4Adam Powell final RefreshData rd = mRefreshData.get(i); 1199a050663feb6309c63867abd746cdf97388e289a4Adam Powell doRefreshProgress(rd.id, rd.progress, rd.fromUser, true); 1200a050663feb6309c63867abd746cdf97388e289a4Adam Powell rd.recycle(); 1201a050663feb6309c63867abd746cdf97388e289a4Adam Powell } 1202a050663feb6309c63867abd746cdf97388e289a4Adam Powell mRefreshData.clear(); 1203a050663feb6309c63867abd746cdf97388e289a4Adam Powell } 1204a050663feb6309c63867abd746cdf97388e289a4Adam Powell } 1205a050663feb6309c63867abd746cdf97388e289a4Adam Powell mAttached = true; 120652a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques } 120752a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques 120852a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques @Override 120952a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques protected void onDetachedFromWindow() { 121052a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques if (mIndeterminate) { 121152a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques stopAnimation(); 121252a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques } 1213a050663feb6309c63867abd746cdf97388e289a4Adam Powell if (mRefreshProgressRunnable != null) { 1214a050663feb6309c63867abd746cdf97388e289a4Adam Powell removeCallbacks(mRefreshProgressRunnable); 1215a050663feb6309c63867abd746cdf97388e289a4Adam Powell } 1216a050663feb6309c63867abd746cdf97388e289a4Adam Powell if (mRefreshProgressRunnable != null && mRefreshIsPosted) { 12176518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov removeCallbacks(mRefreshProgressRunnable); 12186518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } 12196518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov if (mAccessibilityEventSender != null) { 12206518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov removeCallbacks(mAccessibilityEventSender); 12216518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } 1222ec84c3a189e4aa70aa6ea8ba712e5a4f260a153bPatrick Dubroy // This should come after stopAnimation(), otherwise an invalidate message remains in the 1223ec84c3a189e4aa70aa6ea8ba712e5a4f260a153bPatrick Dubroy // queue, which can prevent the entire view hierarchy from being GC'ed during a rotation 1224ec84c3a189e4aa70aa6ea8ba712e5a4f260a153bPatrick Dubroy super.onDetachedFromWindow(); 1225a050663feb6309c63867abd746cdf97388e289a4Adam Powell mAttached = false; 122652a35433cfdd2c177e3c642ae8a35998f1ace1e9David Sobreira Marques } 12276518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov 12286518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov @Override 122930401328c1026389171d454c934c15875c3f7ff0Svetoslav Ganov public void onInitializeAccessibilityEvent(AccessibilityEvent event) { 123030401328c1026389171d454c934c15875c3f7ff0Svetoslav Ganov super.onInitializeAccessibilityEvent(event); 12318a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov event.setClassName(ProgressBar.class.getName()); 1232736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov event.setItemCount(mMax); 1233736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov event.setCurrentItemIndex(mProgress); 12346518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } 12356518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov 12368a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov @Override 12378a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { 12388a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov super.onInitializeAccessibilityNodeInfo(info); 12398a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov info.setClassName(ProgressBar.class.getName()); 12408a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov } 12418a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov 12426518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov /** 12436518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov * Schedule a command for sending an accessibility event. 12446518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov * </br> 12456518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov * Note: A command is used to ensure that accessibility events 12466518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov * are sent at most one in a given time frame to save 12476518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov * system resources while the progress changes quickly. 12486518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov */ 12496518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov private void scheduleAccessibilityEventSender() { 12506518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov if (mAccessibilityEventSender == null) { 12516518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov mAccessibilityEventSender = new AccessibilityEventSender(); 12526518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } else { 12536518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov removeCallbacks(mAccessibilityEventSender); 12546518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } 12556518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov postDelayed(mAccessibilityEventSender, TIMEOUT_SEND_ACCESSIBILITY_EVENT); 12566518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } 12576518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov 12586518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov /** 12596518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov * Command for sending an accessibility event. 12606518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov */ 12616518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov private class AccessibilityEventSender implements Runnable { 12626518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov public void run() { 12636518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); 12646518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } 12656518ad760f98a0aa5db8c49ce1564bf5907a2c15Svetoslav Ganov } 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1267