134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen/* 234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * Copyright (C) 2006 The Android Open Source Project 334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * 434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * Licensed under the Apache License, Version 2.0 (the "License"); 534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * you may not use this file except in compliance with the License. 634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * You may obtain a copy of the License at 734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * 834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * http://www.apache.org/licenses/LICENSE-2.0 934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * 1034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * Unless required by applicable law or agreed to in writing, software 1134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * distributed under the License is distributed on an "AS IS" BASIS, 1234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * See the License for the specific language governing permissions and 1434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * limitations under the License. 1534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen */ 1634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 1734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenpackage com.android.phone; 1834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 1934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport android.app.ProgressDialog; 2034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport android.content.Context; 2134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport android.content.DialogInterface; 2234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport android.os.AsyncResult; 2334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport android.os.Handler; 2434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport android.os.Message; 25833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chenimport android.os.Parcel; 26833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chenimport android.os.Parcelable; 2734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport android.os.RemoteException; 2834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport android.preference.ListPreference; 2934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport android.preference.Preference; 3034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport android.telephony.SubscriptionManager; 3134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport android.telephony.TelephonyManager; 3234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport android.text.BidiFormatter; 3334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport android.text.TextDirectionHeuristics; 3434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport android.text.TextUtils; 3534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport android.util.AttributeSet; 3634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport android.util.Log; 3734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 3834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport com.android.internal.telephony.OperatorInfo; 3934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport com.android.internal.telephony.Phone; 4034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport com.android.internal.telephony.PhoneFactory; 4134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 4234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenimport java.util.List; 4334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 4434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 4534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen/** 4634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * "Networks" preference in "Mobile network" settings UI for the Phone app. 4734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * It's used to manually search and choose mobile network. Enabled only when 4834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * autoSelect preference is turned off. 4934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen */ 5034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chenpublic class NetworkSelectListPreference extends ListPreference 5134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen implements DialogInterface.OnCancelListener, 5234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen Preference.OnPreferenceChangeListener{ 5334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 5434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private static final String LOG_TAG = "networkSelect"; 5534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private static final boolean DBG = true; 5634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 5734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private static final int EVENT_NETWORK_SCAN_COMPLETED = 100; 5834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private static final int EVENT_NETWORK_SELECTION_DONE = 200; 5934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 6034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen //dialog ids 6134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private static final int DIALOG_NETWORK_SELECTION = 100; 6234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private static final int DIALOG_NETWORK_LIST_LOAD = 200; 6334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 6434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private int mPhoneId = SubscriptionManager.INVALID_PHONE_INDEX; 6534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private List<OperatorInfo> mOperatorInfoList; 66833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen private OperatorInfo mOperatorInfo; 6734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 6834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private int mSubId; 6934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private NetworkOperators mNetworkOperators; 7034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 7134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private ProgressDialog mProgressDialog; 7234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen public NetworkSelectListPreference(Context context, AttributeSet attrs) { 7334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen super(context, attrs); 7434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 7534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 7634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen public NetworkSelectListPreference(Context context, AttributeSet attrs, int defStyleAttr, 7734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen int defStyleRes) { 7834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen super(context, attrs, defStyleAttr, defStyleRes); 7934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 8034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 8134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen @Override 8234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen protected void onClick() { 8334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen loadNetworksList(); 8434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 8534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 8634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private final Handler mHandler = new Handler() { 8734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen @Override 8834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen public void handleMessage(Message msg) { 8934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen AsyncResult ar; 9034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen switch (msg.what) { 9134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen case EVENT_NETWORK_SCAN_COMPLETED: 9234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen networksListLoaded((List<OperatorInfo>) msg.obj, msg.arg1); 9334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen break; 9434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 9534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen case EVENT_NETWORK_SELECTION_DONE: 9634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (DBG) logd("hideProgressPanel"); 9734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen try { 9834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen dismissProgressBar(); 9934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } catch (IllegalArgumentException e) { 10034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 10134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen setEnabled(true); 10234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 10334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen ar = (AsyncResult) msg.obj; 10434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (ar.exception != null) { 10534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (DBG) logd("manual network selection: failed!"); 10634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mNetworkOperators.displayNetworkSelectionFailed(ar.exception); 10734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } else { 10834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (DBG) { 10934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen logd("manual network selection: succeeded!" 11034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen + getNetworkTitle(mOperatorInfo)); 11134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 11234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mNetworkOperators.displayNetworkSelectionSucceeded(); 11334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 11434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mNetworkOperators.getNetworkSelectionMode(); 11534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen break; 11634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 11734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 11834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen return; 11934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 12034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen }; 12134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 12234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen INetworkQueryService mNetworkQueryService = null; 12334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen /** 12434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * This implementation of INetworkQueryServiceCallback is used to receive 12534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * callback notifications from the network query service. 12634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen */ 12734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private final INetworkQueryServiceCallback mCallback = new INetworkQueryServiceCallback.Stub() { 12834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 12934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen /** place the message on the looper queue upon query completion. */ 13034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen public void onQueryComplete(List<OperatorInfo> networkInfoArray, int status) { 13134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (DBG) logd("notifying message loop of query completion."); 13234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED, 13334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen status, 0, networkInfoArray); 13434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen msg.sendToTarget(); 13534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 13634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen }; 13734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 13834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen @Override 13934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen //implemented for DialogInterface.OnCancelListener 14034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen public void onCancel(DialogInterface dialog) { 14134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // request that the service stop the query with this callback object. 14234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen try { 14334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (mNetworkQueryService != null) { 14434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mNetworkQueryService.stopNetworkQuery(mCallback); 14534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 14634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // If cancelled, we query NetworkSelectMode and update states of AutoSelect button. 14734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mNetworkOperators.getNetworkSelectionMode(); 14834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } catch (RemoteException e) { 14934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen loge("onCancel: exception from stopNetworkQuery " + e); 15034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 15134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 15234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 15334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen @Override 15434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen protected void onDialogClosed(boolean positiveResult) { 15534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen super.onDialogClosed(positiveResult); 15634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 15734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // If dismissed, we query NetworkSelectMode and update states of AutoSelect button. 15834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (!positiveResult) { 15934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mNetworkOperators.getNetworkSelectionMode(); 16034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 16134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 16234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 16334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen /** 16434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * Return normalized carrier name given network info. 16534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * 16634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * @param ni is network information in OperatorInfo type. 16734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen */ 16834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen public String getNormalizedCarrierName(OperatorInfo ni) { 16934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (ni != null) { 17034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen return ni.getOperatorAlphaLong() + " (" + ni.getOperatorNumeric() + ")"; 17134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 17234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen return null; 17334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 17434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 17534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // This method is provided besides initialize() because bind to network query service 17634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // may be binded after initialize(). In that case this method needs to be called explicitly 17734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // to set mNetworkQueryService. Otherwise mNetworkQueryService will remain null. 17834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen public void setNetworkQueryService(INetworkQueryService queryService) { 17934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mNetworkQueryService = queryService; 18034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 18134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 18234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // This initialize method needs to be called for this preference to work properly. 18334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen protected void initialize(int subId, INetworkQueryService queryService, 184833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen NetworkOperators networkOperators, ProgressDialog progressDialog) { 18534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mSubId = subId; 18634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mNetworkQueryService = queryService; 18734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mNetworkOperators = networkOperators; 188833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen // This preference should share the same progressDialog with networkOperators category. 189833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen mProgressDialog = progressDialog; 19034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 19134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (SubscriptionManager.isValidSubscriptionId(mSubId)) { 19234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mPhoneId = SubscriptionManager.getPhoneId(mSubId); 19334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 19434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 19534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen TelephonyManager telephonyManager = (TelephonyManager) 19634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen getContext().getSystemService(Context.TELEPHONY_SERVICE); 19734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 19834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen setSummary(telephonyManager.getNetworkOperatorName()); 19934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 20034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen setOnPreferenceChangeListener(this); 20134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 20234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 20334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen @Override 20434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen protected void onPrepareForRemoval() { 20534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen destroy(); 20634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen super.onPrepareForRemoval(); 20734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 20834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 20934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private void destroy() { 21034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen try { 21134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen dismissProgressBar(); 21234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } catch (IllegalArgumentException e) { 21334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen loge("onDestroy: exception from dismissProgressBar " + e); 21434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 21534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 21634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen try { 21734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (mNetworkQueryService != null) { 21834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // used to un-register callback 21934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mNetworkQueryService.unregisterCallback(mCallback); 22034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 22134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } catch (RemoteException e) { 22234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen loge("onDestroy: exception from unregisterCallback " + e); 22334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 22434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 22534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 22634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private void displayEmptyNetworkList() { 22734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen String status = getContext().getResources().getString(R.string.empty_networks_list); 22834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 22934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen final PhoneGlobals app = PhoneGlobals.getInstance(); 23034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen app.notificationMgr.postTransientNotification( 23134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status); 23234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 23334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 234833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen private void displayNetworkSelectionInProgress() { 23534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen showProgressBar(DIALOG_NETWORK_SELECTION); 23634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 23734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 23834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private void displayNetworkQueryFailed(int error) { 23934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen String status = getContext().getResources().getString(R.string.network_query_error); 24034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 24134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen try { 24234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen dismissProgressBar(); 24334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } catch (IllegalArgumentException e1) { 24434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // do nothing 24534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 24634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 24734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen final PhoneGlobals app = PhoneGlobals.getInstance(); 24834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen app.notificationMgr.postTransientNotification( 24934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status); 25034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 25134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 25234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private void loadNetworksList() { 25334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (DBG) logd("load networks list..."); 25434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 25534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen showProgressBar(DIALOG_NETWORK_LIST_LOAD); 25634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 25734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // delegate query request to the service. 25834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen try { 25934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (mNetworkQueryService != null) { 26034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mNetworkQueryService.startNetworkQuery(mCallback, mPhoneId); 26134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } else { 26234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen displayNetworkQueryFailed(NetworkQueryService.QUERY_EXCEPTION); 26334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 26434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } catch (RemoteException e) { 26534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen loge("loadNetworksList: exception from startNetworkQuery " + e); 26634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen displayNetworkQueryFailed(NetworkQueryService.QUERY_EXCEPTION); 26734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 26834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 26934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 27034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen /** 27134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * networksListLoaded has been rewritten to take an array of 27234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * OperatorInfo objects and a status field, instead of an 27334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * AsyncResult. Otherwise, the functionality which takes the 27434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * OperatorInfo array and creates a list of preferences from it, 27534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * remains unchanged. 27634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen */ 27734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private void networksListLoaded(List<OperatorInfo> result, int status) { 27834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (DBG) logd("networks list loaded"); 27934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 28034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // used to un-register callback 28134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen try { 28234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (mNetworkQueryService != null) { 28334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mNetworkQueryService.unregisterCallback(mCallback); 28434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 28534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } catch (RemoteException e) { 28634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen loge("networksListLoaded: exception from unregisterCallback " + e); 28734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 28834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 28934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // update the state of the preferences. 29034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (DBG) logd("hideProgressPanel"); 29134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 29234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // Always try to dismiss the dialog because activity may 29334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // be moved to background after dialog is shown. 29434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen try { 29534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen dismissProgressBar(); 29634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } catch (IllegalArgumentException e) { 29734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // It's not a error in following scenario, we just ignore it. 29834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // "Load list" dialog will not show, if NetworkQueryService is 29934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // connected after this activity is moved to background. 30034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen loge("Fail to dismiss network load list dialog " + e); 30134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 30234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 30334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen setEnabled(true); 30434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen clearList(); 30534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 30634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (status != NetworkQueryService.QUERY_OK) { 30734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (DBG) logd("error while querying available networks"); 30834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen displayNetworkQueryFailed(status); 30934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } else { 31034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (result != null) { 31134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // create a preference for each item in the list. 31234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // just use the operator name instead of the mildly 31334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen // confusing mcc/mnc. 31434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mOperatorInfoList = result; 31534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen CharSequence[] networkEntries = new CharSequence[result.size()]; 31634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen CharSequence[] networkEntryValues = new CharSequence[result.size()]; 31734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen for (int i = 0; i < mOperatorInfoList.size(); i++) { 318602d4475c6f774ce9a691d87c45deb00761f26eaMalcolm Chen if (mOperatorInfoList.get(i).getState() == OperatorInfo.State.FORBIDDEN) { 319602d4475c6f774ce9a691d87c45deb00761f26eaMalcolm Chen networkEntries[i] = getNetworkTitle(mOperatorInfoList.get(i)) 320602d4475c6f774ce9a691d87c45deb00761f26eaMalcolm Chen + " " 321602d4475c6f774ce9a691d87c45deb00761f26eaMalcolm Chen + getContext().getResources().getString(R.string.forbidden_network); 322602d4475c6f774ce9a691d87c45deb00761f26eaMalcolm Chen } else { 323602d4475c6f774ce9a691d87c45deb00761f26eaMalcolm Chen networkEntries[i] = getNetworkTitle(mOperatorInfoList.get(i)); 324602d4475c6f774ce9a691d87c45deb00761f26eaMalcolm Chen } 32534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen networkEntryValues[i] = Integer.toString(i + 2); 32634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 32734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 32834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen setEntries(networkEntries); 32934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen setEntryValues(networkEntryValues); 33034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 33134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen super.onClick(); 33234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } else { 33334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen displayEmptyNetworkList(); 33434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 33534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 33634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 33734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 33834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen /** 33934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * Returns the title of the network obtained in the manual search. 34034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * 34134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * @param ni contains the information of the network. 34234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * 34334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * @return Long Name if not null/empty, otherwise Short Name if not null/empty, 34434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * else MCCMNC string. 34534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen */ 34634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private String getNetworkTitle(OperatorInfo ni) { 34734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (!TextUtils.isEmpty(ni.getOperatorAlphaLong())) { 34834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen return ni.getOperatorAlphaLong(); 34934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } else if (!TextUtils.isEmpty(ni.getOperatorAlphaShort())) { 35034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen return ni.getOperatorAlphaShort(); 35134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } else { 35234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen BidiFormatter bidiFormatter = BidiFormatter.getInstance(); 35334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen return bidiFormatter.unicodeWrap(ni.getOperatorNumeric(), TextDirectionHeuristics.LTR); 35434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 35534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 35634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 35734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private void clearList() { 35834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (mOperatorInfoList != null) { 35934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mOperatorInfoList.clear(); 36034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 36134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 36234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 36334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private void dismissProgressBar() { 36434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (mProgressDialog != null && mProgressDialog.isShowing()) { 36534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mProgressDialog.dismiss(); 36634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 36734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 36834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 36934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private void showProgressBar(int id) { 370833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen if (mProgressDialog == null) { 37134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mProgressDialog = new ProgressDialog(getContext()); 372833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen } else { 373833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen // Dismiss progress bar if it's showing now. 374833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen dismissProgressBar(); 375833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen } 376833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen 377833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen if ((id == DIALOG_NETWORK_SELECTION) || (id == DIALOG_NETWORK_LIST_LOAD)) { 37834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen switch (id) { 37934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen case DIALOG_NETWORK_SELECTION: 38034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen final String networkSelectMsg = getContext().getResources() 38134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen .getString(R.string.register_on_network, 38234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen getNetworkTitle(mOperatorInfo)); 38334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mProgressDialog.setMessage(networkSelectMsg); 384833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen mProgressDialog.setCanceledOnTouchOutside(false); 38534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mProgressDialog.setCancelable(false); 38634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mProgressDialog.setIndeterminate(true); 38734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen break; 38834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen case DIALOG_NETWORK_LIST_LOAD: 38934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mProgressDialog.setMessage( 39034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen getContext().getResources().getString(R.string.load_networks_progress)); 39134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mProgressDialog.setCanceledOnTouchOutside(false); 392833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen mProgressDialog.setCancelable(true); 393833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen mProgressDialog.setIndeterminate(false); 39434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mProgressDialog.setOnCancelListener(this); 39534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen break; 39634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen default: 39734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 39834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mProgressDialog.show(); 39934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 40034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 40134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 40234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen /** 40334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * Implemented to support onPreferenceChangeListener to look for preference 40434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * changes specifically on this button. 40534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * 40634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * @param preference is the preference to be changed, should be network select button. 40734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen * @param newValue should be the value of the selection as index of operators. 40834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen */ 40934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen public boolean onPreferenceChange(Preference preference, Object newValue) { 41034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen int operatorIndex = findIndexOfValue((String) newValue); 41134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen mOperatorInfo = mOperatorInfoList.get(operatorIndex); 41234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 41334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (DBG) logd("selected network: " + getNetworkTitle(mOperatorInfo)); 41434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 41534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen Message msg = mHandler.obtainMessage(EVENT_NETWORK_SELECTION_DONE); 41634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen Phone phone = PhoneFactory.getPhone(mPhoneId); 41734d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen if (phone != null) { 41834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen phone.selectNetworkManually(mOperatorInfo, true, msg); 419833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen displayNetworkSelectionInProgress(); 42034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } else { 42134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen loge("Error selecting network. phone is null."); 42234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 42334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 42434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen return true; 42534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 42634d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 427833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen @Override 428833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen protected Parcelable onSaveInstanceState() { 429833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen final Parcelable superState = super.onSaveInstanceState(); 430833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen if (isPersistent()) { 431833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen // No need to save instance state since it's persistent 432833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen return superState; 433833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen } 434833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen 435833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen final SavedState myState = new SavedState(superState); 436833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen myState.mDialogListEntries = getEntries(); 437833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen myState.mDialogListEntryValues = getEntryValues(); 438833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen myState.mOperatorInfoList = mOperatorInfoList; 439833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen return myState; 440833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen } 441833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen 442833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen @Override 443833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen protected void onRestoreInstanceState(Parcelable state) { 444833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen if (state == null || !state.getClass().equals(SavedState.class)) { 445833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen // Didn't save state for us in onSaveInstanceState 446833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen super.onRestoreInstanceState(state); 447833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen return; 448833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen } 449833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen 450833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen SavedState myState = (SavedState) state; 451833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen 452833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen if (getEntries() == null && myState.mDialogListEntries != null) { 453833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen setEntries(myState.mDialogListEntries); 454833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen } 455833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen if (getEntryValues() == null && myState.mDialogListEntryValues != null) { 456833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen setEntryValues(myState.mDialogListEntryValues); 457833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen } 458833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen if (mOperatorInfoList == null && myState.mOperatorInfoList != null) { 459833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen mOperatorInfoList = myState.mOperatorInfoList; 460833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen } 461833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen 462833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen super.onRestoreInstanceState(myState.getSuperState()); 463833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen } 464833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen 465833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen /** 466833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen * We save entries, entryValues and operatorInfoList into bundle. 467833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen * At onCreate of fragment, dialog will be restored if it was open. In this case, 468833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen * we need to restore entries, entryValues and operatorInfoList. Without those information, 469833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen * onPreferenceChange will fail if user select network from the dialog. 470833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen */ 471833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen private static class SavedState extends BaseSavedState { 472833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen CharSequence[] mDialogListEntries; 473833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen CharSequence[] mDialogListEntryValues; 474833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen List<OperatorInfo> mOperatorInfoList; 475833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen 476833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen SavedState(Parcel source) { 477833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen super(source); 478833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen final ClassLoader boot = Object.class.getClassLoader(); 479833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen mDialogListEntries = source.readCharSequenceArray(); 480833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen mDialogListEntryValues = source.readCharSequenceArray(); 481833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen mOperatorInfoList = source.readParcelableList(mOperatorInfoList, boot); 482833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen } 483833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen 484833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen @Override 485833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen public void writeToParcel(Parcel dest, int flags) { 486833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen super.writeToParcel(dest, flags); 487833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen dest.writeCharSequenceArray(mDialogListEntries); 488833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen dest.writeCharSequenceArray(mDialogListEntryValues); 489833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen dest.writeParcelableList(mOperatorInfoList, flags); 490833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen } 491833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen 492833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen SavedState(Parcelable superState) { 493833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen super(superState); 494833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen } 495833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen 496833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen public static final Parcelable.Creator<SavedState> CREATOR = 497833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen new Parcelable.Creator<SavedState>() { 498833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen public SavedState createFromParcel(Parcel in) { 499833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen return new SavedState(in); 500833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen } 501833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen 502833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen public SavedState[] newArray(int size) { 503833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen return new SavedState[size]; 504833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen } 505833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen }; 506833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen } 507833d4accbf1c0889b3974a8f34116e423960dd4fMalcolm Chen 50834d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private void logd(String msg) { 50934d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen Log.d(LOG_TAG, "[NetworksList] " + msg); 51034d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 51134d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen 51234d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen private void loge(String msg) { 51334d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen Log.e(LOG_TAG, "[NetworksList] " + msg); 51434d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen } 51534d4fa5e9fa19feb70da552dfa765b1a90a5c0ddMalcolm Chen} 516