TimeConsumingPreferenceActivity.java revision 4574f625d802c2defa0554a08f136810856c130a
1package com.android.phone;
2
3import android.app.AlertDialog;
4import android.app.Dialog;
5import android.app.ProgressDialog;
6import android.content.DialogInterface;
7import android.preference.Preference;
8import android.preference.PreferenceActivity;
9import android.util.Log;
10import android.view.WindowManager;
11
12import java.util.ArrayList;
13
14interface  TimeConsumingPreferenceListener {
15    public void onStarted(Preference preference, boolean reading);
16    public void onFinished(Preference preference, boolean reading);
17    public void onError(Preference preference, int error);
18}
19
20public class TimeConsumingPreferenceActivity extends PreferenceActivity
21                        implements TimeConsumingPreferenceListener, DialogInterface.OnClickListener,
22                        DialogInterface.OnCancelListener {
23    private static final String LOG_TAG = "TimeConsumingPreferenceActivity";
24    private final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
25
26    private static final int BUSY_READING_DIALOG = 100;
27    private static final int BUSY_SAVING_DIALOG = 200;
28
29    static final int EXCEPTION_ERROR = 300;
30    static final int RESPONSE_ERROR = 400;
31    static final int RADIO_OFF_ERROR = 500;
32
33    private final ArrayList<String> mBusyList=new ArrayList<String> ();
34
35    protected boolean mIsForeground = false;
36
37    @Override
38    protected Dialog onCreateDialog(int id) {
39        if (id == BUSY_READING_DIALOG || id == BUSY_SAVING_DIALOG) {
40            ProgressDialog dialog = new ProgressDialog(this);
41            dialog.setTitle(getText(R.string.updating_title));
42            dialog.setIndeterminate(true);
43
44            switch(id) {
45                case BUSY_READING_DIALOG:
46                    dialog.setCancelable(true);
47                    dialog.setOnCancelListener(this);
48                    dialog.setMessage(getText(R.string.reading_settings));
49                    return dialog;
50                case BUSY_SAVING_DIALOG:
51                    dialog.setCancelable(false);
52                    dialog.setMessage(getText(R.string.updating_settings));
53                    return dialog;
54            }
55            return null;
56        }
57
58        if (id == RESPONSE_ERROR || id == RADIO_OFF_ERROR || id == EXCEPTION_ERROR) {
59            AlertDialog.Builder b = new AlertDialog.Builder(this);
60
61            int msgId;
62            int titleId = R.string.error_updating_title;
63
64            switch (id) {
65                case RESPONSE_ERROR:
66                    msgId = R.string.response_error;
67                    // Set Button 2, tells the activity that the error is
68                    // recoverable on dialog exit.
69                    b.setNegativeButton(R.string.close_dialog, this);
70                    break;
71                case RADIO_OFF_ERROR:
72                    msgId = R.string.radio_off_error;
73                    // Set Button 3
74                    b.setNeutralButton(R.string.close_dialog, this);
75                    break;
76                case EXCEPTION_ERROR:
77                default:
78                    msgId = R.string.exception_error;
79                    // Set Button 3, tells the activity that the error is
80                    // not recoverable on dialog exit.
81                    b.setNeutralButton(R.string.close_dialog, this);
82                    break;
83            }
84
85            b.setTitle(getText(titleId));
86            b.setMessage(getText(msgId));
87            b.setCancelable(false);
88            AlertDialog dialog = b.create();
89
90            // make the dialog more obvious by blurring the background.
91            dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
92
93            return dialog;
94        }
95        return null;
96    }
97
98    @Override
99    public void onResume() {
100        super.onResume();
101        mIsForeground = true;
102    }
103
104    @Override
105    public void onPause() {
106        super.onPause();
107        mIsForeground = false;
108    }
109
110    public void onClick(DialogInterface dialog, int which) {
111        dialog.dismiss();
112    }
113
114    public void onStarted(Preference preference, boolean reading) {
115        if (DBG) dumpState();
116        if (DBG) Log.d(LOG_TAG, "onStarted, preference=" + preference.getKey()
117                + ", reading=" + reading);
118        mBusyList.add(preference.getKey());
119
120        if (mIsForeground) {
121              if (reading) {
122                  showDialog(BUSY_READING_DIALOG);
123              } else {
124                  showDialog(BUSY_SAVING_DIALOG);
125              }
126        }
127
128    }
129
130    public void onFinished(Preference preference, boolean reading) {
131        if (DBG) dumpState();
132        if (DBG) Log.d(LOG_TAG, "onFinished, preference=" + preference.getKey()
133                + ", reading=" + reading);
134        mBusyList.remove(preference.getKey());
135
136        if (mBusyList.isEmpty() && mIsForeground) {
137            if (reading) {
138                dismissDialog(BUSY_READING_DIALOG);
139            } else {
140                dismissDialog(BUSY_SAVING_DIALOG);
141            }
142        }
143    }
144
145    public void onError(Preference preference, int error) {
146        if (DBG) dumpState();
147        if (DBG) Log.d(LOG_TAG, "onError, preference=" + preference.getKey() + ", error=" + error);
148
149        if (mIsForeground) {
150            showDialog(error);
151        }
152    }
153
154    public void onCancel(DialogInterface dialog) {
155        if (DBG) dumpState();
156        finish();
157    }
158
159    void dumpState() {
160        Log.d(LOG_TAG, "dumpState begin");
161        for (String key : mBusyList) {
162            Log.d(LOG_TAG, "mBusyList: key=" + key);
163        }
164        Log.d(LOG_TAG, "dumpState end");
165    }
166}
167