• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
onCreate(Bundle icicle)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 
BandListItem(int bm)116         public BandListItem(int bm) {
117             mBandMode = bm;
118         }
119 
getBand()120         public int getBand() {
121             return mBandMode;
122         }
123 
toString()124         public String toString() {
125             if (mBandMode >= BAND_NAMES.length) return "Band mode " + mBandMode;
126             return BAND_NAMES[mBandMode];
127         }
128     }
129 
loadBandList()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 
bandListLoaded(AsyncResult result)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 
displayBandSelectionResult(Throwable ex)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 
clearList()207     private void clearList() {
208         while(mBandListAdapter.getCount() > 0) {
209             mBandListAdapter.remove(
210                     mBandListAdapter.getItem(0));
211         }
212     }
213 
log(String msg)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 }
245