OSDN Git Service

Merge changes from topic "am-e8b13d24-dee0-4f84-89d4-8a7d110f6ec1" into oc-dev am...
[android-x86/packages-apps-Settings.git] / src / com / android / settings / BandMode.java
1 package com.android.settings;
2
3 import android.app.Activity;
4 import android.app.AlertDialog;
5 import android.content.DialogInterface;
6 import android.os.AsyncResult;
7 import android.os.Bundle;
8 import android.os.Handler;
9 import android.os.Message;
10 import android.util.Log;
11 import android.view.View;
12 import android.view.Window;
13 import android.view.WindowManager;
14 import android.widget.AdapterView;
15 import android.widget.ArrayAdapter;
16 import android.widget.ListView;
17
18 import com.android.internal.telephony.Phone;
19 import com.android.internal.telephony.PhoneFactory;
20
21
22 /**
23  * Radio Band Mode Selection Class
24  *
25  * It will query baseband about all available band modes and display them
26  * in screen. It will display all six band modes if the query failed.
27  *
28  * After user select one band, it will send the selection to baseband.
29  *
30  * It will alter user the result of select operation and exit, no matter success
31  * or not.
32  *
33  */
34 public class BandMode extends Activity {
35     private static final String LOG_TAG = "phone";
36     private static final boolean DBG = false;
37
38     private static final int EVENT_BAND_SCAN_COMPLETED = 100;
39     private static final int EVENT_BAND_SELECTION_DONE = 200;
40
41     //Directly maps to RIL_RadioBandMode from ril.h
42     private static final String[] BAND_NAMES = new String[] {
43             "Automatic",
44             "Europe",
45             "United States",
46             "Japan",
47             "Australia",
48             "Australia 2",
49             "Cellular 800",
50             "PCS",
51             "Class 3 (JTACS)",
52             "Class 4 (Korea-PCS)",
53             "Class 5",
54             "Class 6 (IMT2000)",
55             "Class 7 (700Mhz-Upper)",
56             "Class 8 (1800Mhz-Upper)",
57             "Class 9 (900Mhz)",
58             "Class 10 (800Mhz-Secondary)",
59             "Class 11 (Europe PAMR 400Mhz)",
60             "Class 15 (US-AWS)",
61             "Class 16 (US-2500Mhz)"
62     };
63
64     private ListView mBandList;
65     private ArrayAdapter mBandListAdapter;
66     private BandListItem mTargetBand = null;
67     private DialogInterface mProgressPanel;
68
69     private Phone mPhone = null;
70
71     @Override
72     protected void onCreate(Bundle icicle) {
73         super.onCreate(icicle);
74
75         requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
76
77         setContentView(R.layout.band_mode);
78
79         setTitle(getString(R.string.band_mode_title));
80         getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT,
81                                     WindowManager.LayoutParams.WRAP_CONTENT);
82
83         mPhone = PhoneFactory.getDefaultPhone();
84
85         mBandList = (ListView) findViewById(R.id.band);
86         mBandListAdapter = new ArrayAdapter<BandListItem>(this,
87                 android.R.layout.simple_list_item_1);
88         mBandList.setAdapter(mBandListAdapter);
89         mBandList.setOnItemClickListener(mBandSelectionHandler);
90
91         loadBandList();
92     }
93
94     private AdapterView.OnItemClickListener mBandSelectionHandler =
95             new AdapterView.OnItemClickListener () {
96                 public void onItemClick(AdapterView parent, View v,
97                         int position, long id) {
98
99                     getWindow().setFeatureInt(
100                             Window.FEATURE_INDETERMINATE_PROGRESS,
101                             Window.PROGRESS_VISIBILITY_ON);
102
103                     mTargetBand = (BandListItem) parent.getAdapter().getItem(position);
104
105                     if (DBG) log("Select band : " + mTargetBand.toString());
106
107                     Message msg =
108                             mHandler.obtainMessage(EVENT_BAND_SELECTION_DONE);
109                     mPhone.setBandMode(mTargetBand.getBand(), msg);
110                 }
111             };
112
113     static private class BandListItem {
114         private int mBandMode = Phone.BM_UNSPECIFIED;
115
116         public BandListItem(int bm) {
117             mBandMode = bm;
118         }
119
120         public int getBand() {
121             return mBandMode;
122         }
123
124         public String toString() {
125             if (mBandMode >= BAND_NAMES.length) return "Band mode " + mBandMode;
126             return BAND_NAMES[mBandMode];
127         }
128     }
129
130     private void loadBandList() {
131         String str = getString(R.string.band_mode_loading);
132
133         if (DBG) log(str);
134
135
136         //ProgressDialog.show(this, null, str, true, true, null);
137         mProgressPanel = new AlertDialog.Builder(this)
138             .setMessage(str)
139             .show();
140
141         Message msg = mHandler.obtainMessage(EVENT_BAND_SCAN_COMPLETED);
142         mPhone.queryAvailableBandMode(msg);
143
144     }
145
146     private void bandListLoaded(AsyncResult result) {
147         if (DBG) log("network list loaded");
148
149         if (mProgressPanel != null) mProgressPanel.dismiss();
150
151         clearList();
152
153         boolean addBandSuccess = false;
154         BandListItem item;
155
156         if (result.result != null) {
157             int bands[] = (int[])result.result;
158
159             if(bands.length == 0) {
160                 Log.wtf(LOG_TAG, "No Supported Band Modes");
161                 return;
162             }
163
164             int size = bands[0];
165
166             if (size > 0) {
167                 mBandListAdapter.add(
168                         new BandListItem(Phone.BM_UNSPECIFIED)); //Always include AUTOMATIC
169                 for (int i=1; i<=size; i++) {
170                     if (bands[i] == Phone.BM_UNSPECIFIED) {
171                         continue;
172                     }
173                     item = new BandListItem(bands[i]);
174                     mBandListAdapter.add(item);
175                     if (DBG) log("Add " + item.toString());
176                 }
177                 addBandSuccess = true;
178             }
179         }
180
181         if (addBandSuccess == false) {
182             if (DBG) log("Error in query, add default list");
183             for (int i=0; i<Phone.BM_NUM_BAND_MODES; i++) {
184                 item = new BandListItem(i);
185                 mBandListAdapter.add(item);
186                 if (DBG) log("Add default " + item.toString());
187             }
188         }
189         mBandList.requestFocus();
190     }
191
192     private void displayBandSelectionResult(Throwable ex) {
193         String status = getString(R.string.band_mode_set)
194                 +" [" + mTargetBand.toString() + "] ";
195
196         if (ex != null) {
197             status = status + getString(R.string.band_mode_failed);
198         } else {
199             status = status + getString(R.string.band_mode_succeeded);
200         }
201
202         mProgressPanel = new AlertDialog.Builder(this)
203             .setMessage(status)
204             .setPositiveButton(android.R.string.ok, null).show();
205     }
206
207     private void clearList() {
208         while(mBandListAdapter.getCount() > 0) {
209             mBandListAdapter.remove(
210                     mBandListAdapter.getItem(0));
211         }
212     }
213
214     private void log(String msg) {
215         Log.d(LOG_TAG, "[BandsList] " + msg);
216     }
217
218     private Handler mHandler = new Handler() {
219         public void handleMessage(Message msg) {
220             AsyncResult ar;
221             switch (msg.what) {
222                 case EVENT_BAND_SCAN_COMPLETED:
223                     ar = (AsyncResult) msg.obj;
224
225                     bandListLoaded(ar);
226                     break;
227
228                 case EVENT_BAND_SELECTION_DONE:
229                     ar = (AsyncResult) msg.obj;
230
231                     getWindow().setFeatureInt(
232                             Window.FEATURE_INDETERMINATE_PROGRESS,
233                             Window.PROGRESS_VISIBILITY_OFF);
234
235                     if (!isFinishing()) {
236                         displayBandSelectionResult(ar.exception);
237                     }
238                     break;
239             }
240         }
241     };
242
243
244 }