| package com.android.settings; | |
| import android.app.Activity; | |
| import android.app.AlertDialog; | |
| import android.content.DialogInterface; | |
| import android.os.AsyncResult; | |
| import android.os.Bundle; | |
| import android.os.Handler; | |
| import android.os.Message; | |
| import android.util.Log; | |
| import android.view.View; | |
| import android.view.Window; | |
| import android.view.WindowManager; | |
| import android.widget.AdapterView; | |
| import android.widget.ArrayAdapter; | |
| import android.widget.ListView; | |
| import com.android.internal.telephony.Phone; | |
| import com.android.internal.telephony.PhoneFactory; | |
| /** | |
| * Radio Band Mode Selection Class | |
| * | |
| * It will query baseband about all available band modes and display them | |
| * in screen. It will display all six band modes if the query failed. | |
| * | |
| * After user select one band, it will send the selection to baseband. | |
| * | |
| * It will alter user the result of select operation and exit, no matter success | |
| * or not. | |
| * | |
| */ | |
| public class BandMode extends Activity { | |
| private static final String LOG_TAG = "phone"; | |
| private static final boolean DBG = false; | |
| private static final int EVENT_BAND_SCAN_COMPLETED = 100; | |
| private static final int EVENT_BAND_SELECTION_DONE = 200; | |
| //Directly maps to RIL_RadioBandMode from ril.h | |
| private static final String[] BAND_NAMES = new String[] { | |
| "Automatic", | |
| "Europe", | |
| "United States", | |
| "Japan", | |
| "Australia", | |
| "Australia 2", | |
| "Cellular 800", | |
| "PCS", | |
| "Class 3 (JTACS)", | |
| "Class 4 (Korea-PCS)", | |
| "Class 5", | |
| "Class 6 (IMT2000)", | |
| "Class 7 (700Mhz-Upper)", | |
| "Class 8 (1800Mhz-Upper)", | |
| "Class 9 (900Mhz)", | |
| "Class 10 (800Mhz-Secondary)", | |
| "Class 11 (Europe PAMR 400Mhz)", | |
| "Class 15 (US-AWS)", | |
| "Class 16 (US-2500Mhz)" | |
| }; | |
| private ListView mBandList; | |
| private ArrayAdapter mBandListAdapter; | |
| private BandListItem mTargetBand = null; | |
| private DialogInterface mProgressPanel; | |
| private Phone mPhone = null; | |
| @Override | |
| protected void onCreate(Bundle icicle) { | |
| super.onCreate(icicle); | |
| requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); | |
| setContentView(R.layout.band_mode); | |
| setTitle(getString(R.string.band_mode_title)); | |
| getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, | |
| WindowManager.LayoutParams.WRAP_CONTENT); | |
| mPhone = PhoneFactory.getDefaultPhone(); | |
| mBandList = (ListView) findViewById(R.id.band); | |
| mBandListAdapter = new ArrayAdapter<BandListItem>(this, | |
| android.R.layout.simple_list_item_1); | |
| mBandList.setAdapter(mBandListAdapter); | |
| mBandList.setOnItemClickListener(mBandSelectionHandler); | |
| loadBandList(); | |
| } | |
| private AdapterView.OnItemClickListener mBandSelectionHandler = | |
| new AdapterView.OnItemClickListener () { | |
| public void onItemClick(AdapterView parent, View v, | |
| int position, long id) { | |
| getWindow().setFeatureInt( | |
| Window.FEATURE_INDETERMINATE_PROGRESS, | |
| Window.PROGRESS_VISIBILITY_ON); | |
| mTargetBand = (BandListItem) parent.getAdapter().getItem(position); | |
| if (DBG) log("Select band : " + mTargetBand.toString()); | |
| Message msg = | |
| mHandler.obtainMessage(EVENT_BAND_SELECTION_DONE); | |
| mPhone.setBandMode(mTargetBand.getBand(), msg); | |
| } | |
| }; | |
| static private class BandListItem { | |
| private int mBandMode = Phone.BM_UNSPECIFIED; | |
| public BandListItem(int bm) { | |
| mBandMode = bm; | |
| } | |
| public int getBand() { | |
| return mBandMode; | |
| } | |
| public String toString() { | |
| if (mBandMode >= BAND_NAMES.length) return "Band mode " + mBandMode; | |
| return BAND_NAMES[mBandMode]; | |
| } | |
| } | |
| private void loadBandList() { | |
| String str = getString(R.string.band_mode_loading); | |
| if (DBG) log(str); | |
| //ProgressDialog.show(this, null, str, true, true, null); | |
| mProgressPanel = new AlertDialog.Builder(this) | |
| .setMessage(str) | |
| .show(); | |
| Message msg = mHandler.obtainMessage(EVENT_BAND_SCAN_COMPLETED); | |
| mPhone.queryAvailableBandMode(msg); | |
| } | |
| private void bandListLoaded(AsyncResult result) { | |
| if (DBG) log("network list loaded"); | |
| if (mProgressPanel != null) mProgressPanel.dismiss(); | |
| clearList(); | |
| boolean addBandSuccess = false; | |
| BandListItem item; | |
| if (result.result != null) { | |
| int bands[] = (int[])result.result; | |
| if(bands.length == 0) { | |
| Log.wtf(LOG_TAG, "No Supported Band Modes"); | |
| return; | |
| } | |
| int size = bands[0]; | |
| if (size > 0) { | |
| for (int i=1; i<=size; i++) { | |
| item = new BandListItem(bands[i]); | |
| mBandListAdapter.add(item); | |
| if (DBG) log("Add " + item.toString()); | |
| } | |
| addBandSuccess = true; | |
| } | |
| } | |
| if (addBandSuccess == false) { | |
| if (DBG) log("Error in query, add default list"); | |
| for (int i=0; i<Phone.BM_NUM_BAND_MODES; i++) { | |
| item = new BandListItem(i); | |
| mBandListAdapter.add(item); | |
| if (DBG) log("Add default " + item.toString()); | |
| } | |
| } | |
| mBandList.requestFocus(); | |
| } | |
| private void displayBandSelectionResult(Throwable ex) { | |
| String status = getString(R.string.band_mode_set) | |
| +" [" + mTargetBand.toString() + "] "; | |
| if (ex != null) { | |
| status = status + getString(R.string.band_mode_failed); | |
| } else { | |
| status = status + getString(R.string.band_mode_succeeded); | |
| } | |
| mProgressPanel = new AlertDialog.Builder(this) | |
| .setMessage(status) | |
| .setPositiveButton(android.R.string.ok, null).show(); | |
| } | |
| private void clearList() { | |
| while(mBandListAdapter.getCount() > 0) { | |
| mBandListAdapter.remove( | |
| mBandListAdapter.getItem(0)); | |
| } | |
| } | |
| private void log(String msg) { | |
| Log.d(LOG_TAG, "[BandsList] " + msg); | |
| } | |
| private Handler mHandler = new Handler() { | |
| public void handleMessage(Message msg) { | |
| AsyncResult ar; | |
| switch (msg.what) { | |
| case EVENT_BAND_SCAN_COMPLETED: | |
| ar = (AsyncResult) msg.obj; | |
| bandListLoaded(ar); | |
| break; | |
| case EVENT_BAND_SELECTION_DONE: | |
| ar = (AsyncResult) msg.obj; | |
| getWindow().setFeatureInt( | |
| Window.FEATURE_INDETERMINATE_PROGRESS, | |
| Window.PROGRESS_VISIBILITY_OFF); | |
| if (!isFinishing()) { | |
| displayBandSelectionResult(ar.exception); | |
| } | |
| break; | |
| } | |
| } | |
| }; | |
| } |