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