ProgressDialog.java revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
1/* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package android.app; 18 19import android.content.Context; 20import android.graphics.drawable.Drawable; 21import android.os.Bundle; 22import android.os.Handler; 23import android.os.Message; 24import android.view.LayoutInflater; 25import android.view.View; 26import android.widget.ProgressBar; 27import android.widget.TextView; 28 29import com.android.internal.R; 30 31import java.text.NumberFormat; 32 33/** 34 * <p>A dialog showing a progress indicator and an optional text message or view. 35 * Only a text message or a view can be used at the same time.</p> 36 * <p>The dialog can be made cancelable on back key press.</p> 37 * <p>The progress range is 0..10000.</p> 38 */ 39public class ProgressDialog extends AlertDialog { 40 41 /** Creates a ProgressDialog with a ciruclar, spinning progress 42 * bar. This is the default. 43 */ 44 public static final int STYLE_SPINNER = 0; 45 46 /** Creates a ProgressDialog with a horizontal progress bar. 47 */ 48 public static final int STYLE_HORIZONTAL = 1; 49 50 private ProgressBar mProgress; 51 private TextView mMessageView; 52 53 private int mProgressStyle = STYLE_SPINNER; 54 private TextView mProgressNumber; 55 private TextView mProgressPercent; 56 private NumberFormat mProgressPercentFormat; 57 58 private int mMax; 59 private int mProgressVal; 60 private int mSecondaryProgressVal; 61 private int mIncrementBy; 62 private int mIncrementSecondaryBy; 63 private Drawable mProgressDrawable; 64 private Drawable mIndeterminateDrawable; 65 private CharSequence mMessage; 66 private boolean mIndeterminate; 67 68 private boolean mHasStarted; 69 private Handler mViewUpdateHandler; 70 71 public ProgressDialog(Context context) { 72 this(context, com.android.internal.R.style.Theme_Dialog_Alert); 73 } 74 75 public ProgressDialog(Context context, int theme) { 76 super(context, theme); 77 } 78 79 public static ProgressDialog show(Context context, CharSequence title, 80 CharSequence message) { 81 return show(context, title, message, false); 82 } 83 84 public static ProgressDialog show(Context context, CharSequence title, 85 CharSequence message, boolean indeterminate) { 86 return show(context, title, message, indeterminate, false, null); 87 } 88 89 public static ProgressDialog show(Context context, CharSequence title, 90 CharSequence message, boolean indeterminate, boolean cancelable) { 91 return show(context, title, message, indeterminate, cancelable, null); 92 } 93 94 public static ProgressDialog show(Context context, CharSequence title, 95 CharSequence message, boolean indeterminate, 96 boolean cancelable, OnCancelListener cancelListener) { 97 ProgressDialog dialog = new ProgressDialog(context); 98 dialog.setTitle(title); 99 dialog.setMessage(message); 100 dialog.setIndeterminate(indeterminate); 101 dialog.setCancelable(cancelable); 102 dialog.setOnCancelListener(cancelListener); 103 dialog.show(); 104 return dialog; 105 } 106 107 @Override 108 protected void onCreate(Bundle savedInstanceState) { 109 LayoutInflater inflater = LayoutInflater.from(mContext); 110 if (mProgressStyle == STYLE_HORIZONTAL) { 111 112 /* Use a separate handler to update the text views as they 113 * must be updated on the same thread that created them. 114 */ 115 mViewUpdateHandler = new Handler() { 116 @Override 117 public void handleMessage(Message msg) { 118 super.handleMessage(msg); 119 120 /* Update the number and percent */ 121 int progress = mProgress.getProgress(); 122 int max = mProgress.getMax(); 123 double percent = (double) progress / (double) max; 124 mProgressNumber.setText(progress + "/" + max); 125 mProgressPercent.setText(mProgressPercentFormat.format(percent)); 126 } 127 }; 128 View view = inflater.inflate(R.layout.alert_dialog_progress, null); 129 mProgress = (ProgressBar) view.findViewById(R.id.progress); 130 mProgressNumber = (TextView) view.findViewById(R.id.progress_number); 131 mProgressPercent = (TextView) view.findViewById(R.id.progress_percent); 132 mProgressPercentFormat = NumberFormat.getPercentInstance(); 133 mProgressPercentFormat.setMaximumFractionDigits(0); 134 setView(view); 135 } else { 136 View view = inflater.inflate(R.layout.progress_dialog, null); 137 mProgress = (ProgressBar) view.findViewById(R.id.progress); 138 mMessageView = (TextView) view.findViewById(R.id.message); 139 setView(view); 140 } 141 if (mMax > 0) { 142 setMax(mMax); 143 } 144 if (mProgressVal > 0) { 145 setProgress(mProgressVal); 146 } 147 if (mSecondaryProgressVal > 0) { 148 setSecondaryProgress(mSecondaryProgressVal); 149 } 150 if (mIncrementBy > 0) { 151 incrementProgressBy(mIncrementBy); 152 } 153 if (mIncrementSecondaryBy > 0) { 154 incrementSecondaryProgressBy(mIncrementSecondaryBy); 155 } 156 if (mProgressDrawable != null) { 157 setProgressDrawable(mProgressDrawable); 158 } 159 if (mIndeterminateDrawable != null) { 160 setIndeterminateDrawable(mIndeterminateDrawable); 161 } 162 if (mMessage != null) { 163 setMessage(mMessage); 164 } 165 setIndeterminate(mIndeterminate); 166 onProgressChanged(); 167 super.onCreate(savedInstanceState); 168 } 169 170 @Override 171 public void onStart() { 172 super.onStart(); 173 mHasStarted = true; 174 } 175 176 @Override 177 protected void onStop() { 178 super.onStop(); 179 mHasStarted = false; 180 } 181 182 public void setProgress(int value) { 183 if (mHasStarted) { 184 mProgress.setProgress(value); 185 onProgressChanged(); 186 } else { 187 mProgressVal = value; 188 } 189 } 190 191 public void setSecondaryProgress(int secondaryProgress) { 192 if (mProgress != null) { 193 mProgress.setSecondaryProgress(secondaryProgress); 194 onProgressChanged(); 195 } else { 196 mSecondaryProgressVal = secondaryProgress; 197 } 198 } 199 200 public int getProgress() { 201 if (mProgress != null) { 202 return mProgress.getProgress(); 203 } 204 return mProgressVal; 205 } 206 207 public int getSecondaryProgress() { 208 if (mProgress != null) { 209 return mProgress.getSecondaryProgress(); 210 } 211 return mSecondaryProgressVal; 212 } 213 214 public int getMax() { 215 if (mProgress != null) { 216 return mProgress.getMax(); 217 } 218 return mMax; 219 } 220 221 public void setMax(int max) { 222 if (mProgress != null) { 223 mProgress.setMax(max); 224 onProgressChanged(); 225 } else { 226 mMax = max; 227 } 228 } 229 230 public void incrementProgressBy(int diff) { 231 if (mProgress != null) { 232 mProgress.incrementProgressBy(diff); 233 onProgressChanged(); 234 } else { 235 mIncrementBy += diff; 236 } 237 } 238 239 public void incrementSecondaryProgressBy(int diff) { 240 if (mProgress != null) { 241 mProgress.incrementSecondaryProgressBy(diff); 242 onProgressChanged(); 243 } else { 244 mIncrementSecondaryBy += diff; 245 } 246 } 247 248 public void setProgressDrawable(Drawable d) { 249 if (mProgress != null) { 250 mProgress.setProgressDrawable(d); 251 } else { 252 mProgressDrawable = d; 253 } 254 } 255 256 public void setIndeterminateDrawable(Drawable d) { 257 if (mProgress != null) { 258 mProgress.setIndeterminateDrawable(d); 259 } else { 260 mIndeterminateDrawable = d; 261 } 262 } 263 264 public void setIndeterminate(boolean indeterminate) { 265 if (mProgress != null) { 266 mProgress.setIndeterminate(indeterminate); 267 } else { 268 mIndeterminate = indeterminate; 269 } 270 } 271 272 public boolean isIndeterminate() { 273 if (mProgress != null) { 274 return mProgress.isIndeterminate(); 275 } 276 return mIndeterminate; 277 } 278 279 @Override 280 public void setMessage(CharSequence message) { 281 if (mProgress != null) { 282 if (mProgressStyle == STYLE_HORIZONTAL) { 283 super.setMessage(message); 284 } else { 285 mMessageView.setText(message); 286 } 287 } else { 288 mMessage = message; 289 } 290 } 291 292 public void setProgressStyle(int style) { 293 mProgressStyle = style; 294 } 295 296 private void onProgressChanged() { 297 if (mProgressStyle == STYLE_HORIZONTAL) { 298 mViewUpdateHandler.sendEmptyMessage(0); 299 } 300 } 301} 302