19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 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.app;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19ba3c377ba428bcf1c9b5a5cdf697fec0ed4fade7Adam Powellimport com.android.internal.R;
20ba3c377ba428bcf1c9b5a5cdf697fec0ed4fade7Adam Powell
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
22ba3c377ba428bcf1c9b5a5cdf697fec0ed4fade7Adam Powellimport android.content.res.TypedArray;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
27eb3e3e368a5093768b44b415a85a3d0bcce92583Daisuke Miyakawaimport android.text.Spannable;
28eb3e3e368a5093768b44b415a85a3d0bcce92583Daisuke Miyakawaimport android.text.SpannableString;
29eb3e3e368a5093768b44b415a85a3d0bcce92583Daisuke Miyakawaimport android.text.style.StyleSpan;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ProgressBar;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.TextView;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.text.NumberFormat;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A dialog showing a progress indicator and an optional text message or view.
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Only a text message or a view can be used at the same time.</p>
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The dialog can be made cancelable on back key press.</p>
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The progress range is 0..10000.</p>
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ProgressDialog extends AlertDialog {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
456af97e1c20df4d7010fafd7059c95d9b4113e4a6Adam Powell    /** Creates a ProgressDialog with a circular, spinning progress
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * bar. This is the default.
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STYLE_SPINNER = 0;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Creates a ProgressDialog with a horizontal progress bar.
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int STYLE_HORIZONTAL = 1;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ProgressBar mProgress;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private TextView mMessageView;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mProgressStyle = STYLE_SPINNER;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private TextView mProgressNumber;
59eb3e3e368a5093768b44b415a85a3d0bcce92583Daisuke Miyakawa    private String mProgressNumberFormat;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private TextView mProgressPercent;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private NumberFormat mProgressPercentFormat;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mMax;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mProgressVal;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mSecondaryProgressVal;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mIncrementBy;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mIncrementSecondaryBy;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Drawable mProgressDrawable;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Drawable mIndeterminateDrawable;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CharSequence mMessage;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mIndeterminate;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mHasStarted;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Handler mViewUpdateHandler;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ProgressDialog(Context context) {
77548f76f135f8636ce9cf56fe41f072fd49aa4e39Adam Powell        super(context);
784389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn        initFormats();
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ProgressDialog(Context context, int theme) {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context, theme);
834389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn        initFormats();
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
864389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn    private void initFormats() {
874389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn        mProgressNumberFormat = "%1d/%2d";
884389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn        mProgressPercentFormat = NumberFormat.getPercentInstance();
894389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn        mProgressPercentFormat.setMaximumFractionDigits(0);
904389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn    }
914389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static ProgressDialog show(Context context, CharSequence title,
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence message) {
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return show(context, title, message, false);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static ProgressDialog show(Context context, CharSequence title,
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence message, boolean indeterminate) {
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return show(context, title, message, indeterminate, false, null);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static ProgressDialog show(Context context, CharSequence title,
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence message, boolean indeterminate, boolean cancelable) {
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return show(context, title, message, indeterminate, cancelable, null);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static ProgressDialog show(Context context, CharSequence title,
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence message, boolean indeterminate,
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean cancelable, OnCancelListener cancelListener) {
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ProgressDialog dialog = new ProgressDialog(context);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dialog.setTitle(title);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dialog.setMessage(message);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dialog.setIndeterminate(indeterminate);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dialog.setCancelable(cancelable);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dialog.setOnCancelListener(cancelListener);
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dialog.show();
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return dialog;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onCreate(Bundle savedInstanceState) {
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LayoutInflater inflater = LayoutInflater.from(mContext);
123ba3c377ba428bcf1c9b5a5cdf697fec0ed4fade7Adam Powell        TypedArray a = mContext.obtainStyledAttributes(null,
124ba3c377ba428bcf1c9b5a5cdf697fec0ed4fade7Adam Powell                com.android.internal.R.styleable.AlertDialog,
125ba3c377ba428bcf1c9b5a5cdf697fec0ed4fade7Adam Powell                com.android.internal.R.attr.alertDialogStyle, 0);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProgressStyle == STYLE_HORIZONTAL) {
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /* Use a separate handler to update the text views as they
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * must be updated on the same thread that created them.
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mViewUpdateHandler = new Handler() {
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void handleMessage(Message msg) {
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    super.handleMessage(msg);
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    /* Update the number and percent */
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int progress = mProgress.getProgress();
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int max = mProgress.getMax();
1394389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn                    if (mProgressNumberFormat != null) {
1404389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn                        String format = mProgressNumberFormat;
1414389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn                        mProgressNumber.setText(String.format(format, progress, max));
1424389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn                    } else {
1434389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn                        mProgressNumber.setText("");
1444389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn                    }
1454389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn                    if (mProgressPercentFormat != null) {
1464389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn                        double percent = (double) progress / (double) max;
1474389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn                        SpannableString tmp = new SpannableString(mProgressPercentFormat.format(percent));
1484389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn                        tmp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD),
1494389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn                                0, tmp.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
1504389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn                        mProgressPercent.setText(tmp);
1514389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn                    } else {
1524389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn                        mProgressPercent.setText("");
1534389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn                    }
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
156ba3c377ba428bcf1c9b5a5cdf697fec0ed4fade7Adam Powell            View view = inflater.inflate(a.getResourceId(
157ba3c377ba428bcf1c9b5a5cdf697fec0ed4fade7Adam Powell                    com.android.internal.R.styleable.AlertDialog_horizontalProgressLayout,
158ba3c377ba428bcf1c9b5a5cdf697fec0ed4fade7Adam Powell                    R.layout.alert_dialog_progress), null);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProgress = (ProgressBar) view.findViewById(R.id.progress);
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProgressNumber = (TextView) view.findViewById(R.id.progress_number);
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProgressPercent = (TextView) view.findViewById(R.id.progress_percent);
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setView(view);
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
164ba3c377ba428bcf1c9b5a5cdf697fec0ed4fade7Adam Powell            View view = inflater.inflate(a.getResourceId(
165ba3c377ba428bcf1c9b5a5cdf697fec0ed4fade7Adam Powell                    com.android.internal.R.styleable.AlertDialog_progressLayout,
166ba3c377ba428bcf1c9b5a5cdf697fec0ed4fade7Adam Powell                    R.layout.progress_dialog), null);
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProgress = (ProgressBar) view.findViewById(R.id.progress);
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMessageView = (TextView) view.findViewById(R.id.message);
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setView(view);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
171ba3c377ba428bcf1c9b5a5cdf697fec0ed4fade7Adam Powell        a.recycle();
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mMax > 0) {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setMax(mMax);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProgressVal > 0) {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setProgress(mProgressVal);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSecondaryProgressVal > 0) {
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setSecondaryProgress(mSecondaryProgressVal);
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mIncrementBy > 0) {
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            incrementProgressBy(mIncrementBy);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mIncrementSecondaryBy > 0) {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            incrementSecondaryProgressBy(mIncrementSecondaryBy);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProgressDrawable != null) {
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setProgressDrawable(mProgressDrawable);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mIndeterminateDrawable != null) {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setIndeterminateDrawable(mIndeterminateDrawable);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mMessage != null) {
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setMessage(mMessage);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setIndeterminate(mIndeterminate);
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onProgressChanged();
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onCreate(savedInstanceState);
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onStart() {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onStart();
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHasStarted = true;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onStop() {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onStop();
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHasStarted = false;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setProgress(int value) {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mHasStarted) {
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProgress.setProgress(value);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onProgressChanged();
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProgressVal = value;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSecondaryProgress(int secondaryProgress) {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProgress != null) {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProgress.setSecondaryProgress(secondaryProgress);
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onProgressChanged();
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSecondaryProgressVal = secondaryProgress;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getProgress() {
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProgress != null) {
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mProgress.getProgress();
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mProgressVal;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getSecondaryProgress() {
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProgress != null) {
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mProgress.getSecondaryProgress();
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSecondaryProgressVal;
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getMax() {
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProgress != null) {
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mProgress.getMax();
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMax;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setMax(int max) {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProgress != null) {
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProgress.setMax(max);
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onProgressChanged();
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMax = max;
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void incrementProgressBy(int diff) {
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProgress != null) {
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProgress.incrementProgressBy(diff);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onProgressChanged();
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIncrementBy += diff;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void incrementSecondaryProgressBy(int diff) {
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProgress != null) {
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProgress.incrementSecondaryProgressBy(diff);
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onProgressChanged();
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIncrementSecondaryBy += diff;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setProgressDrawable(Drawable d) {
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProgress != null) {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProgress.setProgressDrawable(d);
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProgressDrawable = d;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setIndeterminateDrawable(Drawable d) {
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProgress != null) {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProgress.setIndeterminateDrawable(d);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIndeterminateDrawable = d;
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setIndeterminate(boolean indeterminate) {
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProgress != null) {
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProgress.setIndeterminate(indeterminate);
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIndeterminate = indeterminate;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isIndeterminate() {
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProgress != null) {
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mProgress.isIndeterminate();
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mIndeterminate;
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setMessage(CharSequence message) {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProgress != null) {
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mProgressStyle == STYLE_HORIZONTAL) {
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                super.setMessage(message);
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMessageView.setText(message);
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMessage = message;
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setProgressStyle(int style) {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mProgressStyle = style;
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
327eb3e3e368a5093768b44b415a85a3d0bcce92583Daisuke Miyakawa    /**
3284389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn     * Change the format of the small text showing current and maximum units
3294389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn     * of progress.  The default is "%1d/%2d".
330eb3e3e368a5093768b44b415a85a3d0bcce92583Daisuke Miyakawa     * Should not be called during the number is progressing.
3314389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn     * @param format A string passed to {@link String#format String.format()};
3324389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn     * use "%1d" for the current number and "%2d" for the maximum.  If null,
3334389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn     * nothing will be shown.
334eb3e3e368a5093768b44b415a85a3d0bcce92583Daisuke Miyakawa     */
335eb3e3e368a5093768b44b415a85a3d0bcce92583Daisuke Miyakawa    public void setProgressNumberFormat(String format) {
336eb3e3e368a5093768b44b415a85a3d0bcce92583Daisuke Miyakawa        mProgressNumberFormat = format;
3374389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn        onProgressChanged();
3384389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn    }
3394389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn
3404389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn    /**
3414389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn     * Change the format of the small text showing the percentage of progress.
3424389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn     * The default is
3434389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn     * {@link NumberFormat#getPercentInstance() NumberFormat.getPercentageInstnace().}
3444389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn     * Should not be called during the number is progressing.
3454389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn     * @param format An instance of a {@link NumberFormat} to generate the
3464389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn     * percentage text.  If null, nothing will be shown.
3474389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn     */
3484389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn    public void setProgressPercentFormat(NumberFormat format) {
3494389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn        mProgressPercentFormat = format;
3504389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn        onProgressChanged();
351eb3e3e368a5093768b44b415a85a3d0bcce92583Daisuke Miyakawa    }
352eb3e3e368a5093768b44b415a85a3d0bcce92583Daisuke Miyakawa
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void onProgressChanged() {
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mProgressStyle == STYLE_HORIZONTAL) {
3555d4faa91f7e3135d62f9cef730cbe876074937eeAdam Powell            if (mViewUpdateHandler != null && !mViewUpdateHandler.hasMessages(0)) {
3564389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn                mViewUpdateHandler.sendEmptyMessage(0);
3574389434c1d685b5b71de74b0c7718b8ed5b9dcb5Dianne Hackborn            }
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
361