17d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/* 27d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Copyright (C) 2006 The Android Open Source Project 37d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 47d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Licensed under the Apache License, Version 2.0 (the "License"); 57d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * you may not use this file except in compliance with the License. 67d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * You may obtain a copy of the License at 77d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 87d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * http://www.apache.org/licenses/LICENSE-2.0 97d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Unless required by applicable law or agreed to in writing, software 117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * distributed under the License is distributed on an "AS IS" BASIS, 127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * See the License for the specific language governing permissions and 147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * limitations under the License. 157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpackage com.android.phone; 187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.Dialog; 207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.ProgressDialog; 217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.ComponentName; 227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Context; 237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.DialogInterface; 247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Intent; 257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.ServiceConnection; 267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.AsyncResult; 277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Bundle; 287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Handler; 297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.IBinder; 307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Message; 317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.RemoteException; 32a4ca38a6127b9ce87240bffbddf0f095fbec233fJulia Reynoldsimport android.os.UserManager; 337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.Preference; 347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.PreferenceActivity; 357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.PreferenceGroup; 367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.PreferenceScreen; 372b846c78ff3b4102e416c81c4a17b976d327ed38Hall Liuimport android.telephony.ServiceState; 382b846c78ff3b4102e416c81c4a17b976d327ed38Hall Liuimport android.telephony.TelephonyManager; 397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.text.TextUtils; 407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log; 413e1073d1607d41c87e97cf49ff942afde772725bSanket Padaweimport android.telephony.SubscriptionManager; 427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.CommandException; 447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.Phone; 453e1073d1607d41c87e97cf49ff942afde772725bSanket Padaweimport com.android.internal.telephony.PhoneFactory; 467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.OperatorInfo; 477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.HashMap; 497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.List; 503be36906abc0ce84aebec204a85735d37f5a84f7Sanket Padaweimport android.text.BidiFormatter; 513be36906abc0ce84aebec204a85735d37f5a84f7Sanket Padaweimport android.text.TextDirectionHeuristics; 527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/** 547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * "Networks" settings UI for the Phone app. 557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class NetworkSetting extends PreferenceActivity 577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon implements DialogInterface.OnCancelListener { 587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String LOG_TAG = "phone"; 60419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen private static final boolean DBG = true; 617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int EVENT_NETWORK_SCAN_COMPLETED = 100; 637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int EVENT_NETWORK_SELECTION_DONE = 200; 647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int EVENT_AUTO_SELECT_DONE = 300; 657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon //dialog ids 677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int DIALOG_NETWORK_SELECTION = 100; 687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int DIALOG_NETWORK_LIST_LOAD = 200; 697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int DIALOG_NETWORK_AUTO_SELECT = 300; 707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon //String keys for preference lookup 727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String LIST_NETWORKS_KEY = "list_networks_key"; 737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String BUTTON_SRCH_NETWRKS_KEY = "button_srch_netwrks_key"; 747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String BUTTON_AUTO_SELECT_KEY = "button_auto_select_key"; 757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon //map of network controls to the network data. 777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private HashMap<Preference, OperatorInfo> mNetworkMap; 787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 793e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe int mPhoneId = SubscriptionManager.INVALID_PHONE_INDEX; 807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected boolean mIsForeground = false; 817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 82a4ca38a6127b9ce87240bffbddf0f095fbec233fJulia Reynolds private UserManager mUm; 836bfa6ca3a0240453fc4704a591b36585d18ee8e4Julia Reynolds private boolean mUnavailable; 84a4ca38a6127b9ce87240bffbddf0f095fbec233fJulia Reynolds 857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** message for network selection */ 867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String mNetworkSelectMsg; 877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon //preference objects 897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private PreferenceGroup mNetworkList; 907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private Preference mSearchButton; 917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private Preference mAutoSelect; 927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private final Handler mHandler = new Handler() { 947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void handleMessage(Message msg) { 967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon AsyncResult ar; 977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (msg.what) { 987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case EVENT_NETWORK_SCAN_COMPLETED: 997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon networksListLoaded ((List<OperatorInfo>) msg.obj, msg.arg1); 1007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 1017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case EVENT_NETWORK_SELECTION_DONE: 1037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("hideProgressPanel"); 1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon removeDialog(DIALOG_NETWORK_SELECTION); 1057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon getPreferenceScreen().setEnabled(true); 1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ar = (AsyncResult) msg.obj; 1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (ar.exception != null) { 1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("manual network selection: failed!"); 1107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayNetworkSelectionFailed(ar.exception); 1117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("manual network selection: succeeded!"); 1137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayNetworkSelectionSucceeded(); 1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 115419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen 1167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case EVENT_AUTO_SELECT_DONE: 1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("hideProgressPanel"); 1197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Always try to dismiss the dialog because activity may 1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // be moved to background after dialog is shown. 1227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon dismissDialog(DIALOG_NETWORK_AUTO_SELECT); 1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (IllegalArgumentException e) { 1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // "auto select" is always trigged in foreground, so "auto select" dialog 1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // should be shown when "auto select" is trigged. Should NOT get 1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // this exception, and Log it. 128419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen Log.w(LOG_TAG, "[NetworksList] Fail to dismiss auto select dialog ", e); 1297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon getPreferenceScreen().setEnabled(true); 1317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ar = (AsyncResult) msg.obj; 1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (ar.exception != null) { 1347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("automatic network selection: failed!"); 1357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayNetworkSelectionFailed(ar.exception); 1367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("automatic network selection: succeeded!"); 1387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayNetworkSelectionSucceeded(); 1397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 140419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen 1417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 1427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 1457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }; 1477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 1497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Service connection code for the NetworkQueryService. 1507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Handles the work of binding to a local object so that we can make 1517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * the appropriate service calls. 1527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 1537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** Local service interface */ 1557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private INetworkQueryService mNetworkQueryService = null; 1567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** Service connection */ 1587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private final ServiceConnection mNetworkQueryServiceConnection = new ServiceConnection() { 1597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** Handle the task of binding the local object to the service */ 1617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onServiceConnected(ComponentName className, IBinder service) { 1627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("connection created, binding local service."); 1637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mNetworkQueryService = ((NetworkQueryService.LocalBinder) service).getService(); 1647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** Handle the task of cleaning up the local binding */ 1677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onServiceDisconnected(ComponentName className) { 1687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("connection disconnected, cleaning local binding."); 1697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mNetworkQueryService = null; 1707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }; 1727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 1747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * This implementation of INetworkQueryServiceCallback is used to receive 1757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * callback notifications from the network query service. 1767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 1777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private final INetworkQueryServiceCallback mCallback = new INetworkQueryServiceCallback.Stub() { 1787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** place the message on the looper queue upon query completion. */ 1807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onQueryComplete(List<OperatorInfo> networkInfoArray, int status) { 1817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("notifying message loop of query completion."); 1827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED, 1837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon status, 0, networkInfoArray); 1847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon msg.sendToTarget(); 1857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }; 1877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 1897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 1907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon boolean handled = false; 1917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (preference == mSearchButton) { 1937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon loadNetworksList(); 1947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon handled = true; 1957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else if (preference == mAutoSelect) { 1967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon selectNetworkAutomatic(); 1977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon handled = true; 1987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Preference selectedCarrier = preference; 2007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String networkStr = selectedCarrier.getTitle().toString(); 2027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("selected network: " + networkStr); 2037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Message msg = mHandler.obtainMessage(EVENT_NETWORK_SELECTION_DONE); 2053e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe Phone phone = PhoneFactory.getPhone(mPhoneId); 2063e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe if (phone != null) { 20777ba317277863812508869705308373b42364e0aShishir Agrawal phone.selectNetworkManually(mNetworkMap.get(selectedCarrier), true, msg); 2083e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe displayNetworkSeletionInProgress(networkStr); 2093e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe handled = true; 2103e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe } else { 2113e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe log("Error selecting network. phone is null."); 2123e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe } 2137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return handled; 2187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon //implemented for DialogInterface.OnCancelListener 2217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onCancel(DialogInterface dialog) { 2227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // request that the service stop the query with this callback object. 2237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 2247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mNetworkQueryService.stopNetworkQuery(mCallback); 2257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (RemoteException e) { 226419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen log("onCancel: exception from stopNetworkQuery " + e); 2277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon finish(); 2297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public String getNormalizedCarrierName(OperatorInfo ni) { 2327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (ni != null) { 2337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return ni.getOperatorAlphaLong() + " (" + ni.getOperatorNumeric() + ")"; 2347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return null; 2367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onCreate(Bundle icicle) { 2407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onCreate(icicle); 2417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 242a4ca38a6127b9ce87240bffbddf0f095fbec233fJulia Reynolds mUm = (UserManager) getSystemService(Context.USER_SERVICE); 243a4ca38a6127b9ce87240bffbddf0f095fbec233fJulia Reynolds 244a4ca38a6127b9ce87240bffbddf0f095fbec233fJulia Reynolds if (mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) { 245a4ca38a6127b9ce87240bffbddf0f095fbec233fJulia Reynolds setContentView(R.layout.telephony_disallowed_preference_screen); 2466bfa6ca3a0240453fc4704a591b36585d18ee8e4Julia Reynolds mUnavailable = true; 247a4ca38a6127b9ce87240bffbddf0f095fbec233fJulia Reynolds return; 248a4ca38a6127b9ce87240bffbddf0f095fbec233fJulia Reynolds } 249a4ca38a6127b9ce87240bffbddf0f095fbec233fJulia Reynolds 2507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon addPreferencesFromResource(R.xml.carrier_select); 2517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2523e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe int subId; 2533e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe Intent intent = getIntent(); 2543e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe if (intent != null && intent.getExtras() != null) { 2553e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe subId = intent.getExtras().getInt(GsmUmtsOptions.EXTRA_SUB_ID); 2563e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe if (SubscriptionManager.isValidSubscriptionId(subId)) { 2573e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe mPhoneId = SubscriptionManager.getPhoneId(subId); 2583e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe } 2593e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe } 2607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mNetworkList = (PreferenceGroup) getPreferenceScreen().findPreference(LIST_NETWORKS_KEY); 2627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mNetworkMap = new HashMap<Preference, OperatorInfo>(); 2637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSearchButton = getPreferenceScreen().findPreference(BUTTON_SRCH_NETWRKS_KEY); 2657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mAutoSelect = getPreferenceScreen().findPreference(BUTTON_AUTO_SELECT_KEY); 2667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Start the Network Query service, and bind it. 2687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // The OS knows to start he service only once and keep the instance around (so 2697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // long as startService is called) until a stopservice request is made. Since 2707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // we want this service to just stay in the background until it is killed, we 2717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // don't bother stopping it from our end. 2727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon startService (new Intent(this, NetworkQueryService.class)); 27310f9affe772bc3fbe56c9b98d9fe146548d627bdWei Liu bindService (new Intent(this, NetworkQueryService.class).setAction( 27410f9affe772bc3fbe56c9b98d9fe146548d627bdWei Liu NetworkQueryService.ACTION_LOCAL_BINDER), 27510f9affe772bc3fbe56c9b98d9fe146548d627bdWei Liu mNetworkQueryServiceConnection, Context.BIND_AUTO_CREATE); 2767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onResume() { 2807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onResume(); 2817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mIsForeground = true; 2827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onPause() { 2867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onPause(); 2877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mIsForeground = false; 2887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 2917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Override onDestroy() to unbind the query service, avoiding service 2927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * leak exceptions. 2937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 2947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onDestroy() { 296419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen try { 297419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen // used to un-register callback 298419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen mNetworkQueryService.unregisterCallback(mCallback); 299419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen } catch (RemoteException e) { 300419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen log("onDestroy: exception from unregisterCallback " + e); 301419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen } 302419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen 3036bfa6ca3a0240453fc4704a591b36585d18ee8e4Julia Reynolds if (!mUnavailable) { 3046bfa6ca3a0240453fc4704a591b36585d18ee8e4Julia Reynolds // unbind the service. 3056bfa6ca3a0240453fc4704a591b36585d18ee8e4Julia Reynolds unbindService(mNetworkQueryServiceConnection); 3066bfa6ca3a0240453fc4704a591b36585d18ee8e4Julia Reynolds } 3077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onDestroy(); 3087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected Dialog onCreateDialog(int id) { 3127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if ((id == DIALOG_NETWORK_SELECTION) || (id == DIALOG_NETWORK_LIST_LOAD) || 3147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon (id == DIALOG_NETWORK_AUTO_SELECT)) { 3157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ProgressDialog dialog = new ProgressDialog(this); 3167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (id) { 3177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case DIALOG_NETWORK_SELECTION: 3187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // It would be more efficient to reuse this dialog by moving 3197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // this setMessage() into onPreparedDialog() and NOT use 3207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // removeDialog(). However, this is not possible since the 3217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // message is rendered only 2 times in the ProgressDialog - 3227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // after show() and before onCreate. 3237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon dialog.setMessage(mNetworkSelectMsg); 3247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon dialog.setCancelable(false); 3257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon dialog.setIndeterminate(true); 3267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 3277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case DIALOG_NETWORK_AUTO_SELECT: 3287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon dialog.setMessage(getResources().getString(R.string.register_automatically)); 3297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon dialog.setCancelable(false); 3307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon dialog.setIndeterminate(true); 3317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 3327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case DIALOG_NETWORK_LIST_LOAD: 3337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon default: 3347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // reinstate the cancelablity of the dialog. 3357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon dialog.setMessage(getResources().getString(R.string.load_networks_progress)); 3367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon dialog.setCanceledOnTouchOutside(false); 3377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon dialog.setOnCancelListener(this); 3387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 3397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return dialog; 3417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return null; 3437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onPrepareDialog(int id, Dialog dialog) { 3477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if ((id == DIALOG_NETWORK_SELECTION) || (id == DIALOG_NETWORK_LIST_LOAD) || 3487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon (id == DIALOG_NETWORK_AUTO_SELECT)) { 3497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // when the dialogs come up, we'll need to indicate that 3507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // we're in a busy state to dissallow further input. 3517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon getPreferenceScreen().setEnabled(false); 3527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void displayEmptyNetworkList(boolean flag) { 3567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mNetworkList.setTitle(flag ? R.string.empty_networks_list : R.string.label_available); 3577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void displayNetworkSeletionInProgress(String networkStr) { 3607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // TODO: use notification manager? 3617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mNetworkSelectMsg = getResources().getString(R.string.register_on_network, networkStr); 3627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mIsForeground) { 3647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showDialog(DIALOG_NETWORK_SELECTION); 3657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void displayNetworkQueryFailed(int error) { 3697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String status = getResources().getString(R.string.network_query_error); 3707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final PhoneGlobals app = PhoneGlobals.getInstance(); 3727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon app.notificationMgr.postTransientNotification( 3737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status); 3747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void displayNetworkSelectionFailed(Throwable ex) { 3777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String status; 3787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if ((ex != null && ex instanceof CommandException) && 3807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ((CommandException)ex).getCommandError() 3817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon == CommandException.Error.ILLEGAL_SIM_OR_ME) 3827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon { 3837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon status = getResources().getString(R.string.not_allowed); 3847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 3857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon status = getResources().getString(R.string.connect_later); 3867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final PhoneGlobals app = PhoneGlobals.getInstance(); 3897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon app.notificationMgr.postTransientNotification( 3907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status); 3912b846c78ff3b4102e416c81c4a17b976d327ed38Hall Liu 3922b846c78ff3b4102e416c81c4a17b976d327ed38Hall Liu TelephonyManager tm = (TelephonyManager) app.getSystemService(Context.TELEPHONY_SERVICE); 3932b846c78ff3b4102e416c81c4a17b976d327ed38Hall Liu Phone phone = PhoneFactory.getPhone(mPhoneId); 3942b846c78ff3b4102e416c81c4a17b976d327ed38Hall Liu if (phone != null) { 3952b846c78ff3b4102e416c81c4a17b976d327ed38Hall Liu ServiceState ss = tm.getServiceStateForSubscriber(phone.getSubId()); 3962b846c78ff3b4102e416c81c4a17b976d327ed38Hall Liu if (ss != null) { 3972b846c78ff3b4102e416c81c4a17b976d327ed38Hall Liu app.notificationMgr.updateNetworkSelection(ss.getState()); 3982b846c78ff3b4102e416c81c4a17b976d327ed38Hall Liu } 3992b846c78ff3b4102e416c81c4a17b976d327ed38Hall Liu } 4007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void displayNetworkSelectionSucceeded() { 4037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String status = getResources().getString(R.string.registration_done); 4047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final PhoneGlobals app = PhoneGlobals.getInstance(); 4067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon app.notificationMgr.postTransientNotification( 4077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status); 4087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mHandler.postDelayed(new Runnable() { 4107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void run() { 4117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon finish(); 4127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }, 3000); 4147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void loadNetworksList() { 4177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("load networks list..."); 4187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mIsForeground) { 4207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showDialog(DIALOG_NETWORK_LIST_LOAD); 4217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // delegate query request to the service. 4247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 4253e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe mNetworkQueryService.startNetworkQuery(mCallback, mPhoneId); 4267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (RemoteException e) { 427419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen log("loadNetworksList: exception from startNetworkQuery " + e); 428419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen if (mIsForeground) { 429419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen try { 430419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen dismissDialog(DIALOG_NETWORK_LIST_LOAD); 431419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen } catch (IllegalArgumentException e1) { 432419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen // do nothing 433419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen } 434419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen } 4357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayEmptyNetworkList(false); 4387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 4417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * networksListLoaded has been rewritten to take an array of 4427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * OperatorInfo objects and a status field, instead of an 4437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * AsyncResult. Otherwise, the functionality which takes the 4447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * OperatorInfo array and creates a list of preferences from it, 4457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * remains unchanged. 4467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 4477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void networksListLoaded(List<OperatorInfo> result, int status) { 4487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("networks list loaded"); 4497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 450419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen // used to un-register callback 451419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen try { 452419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen mNetworkQueryService.unregisterCallback(mCallback); 453419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen } catch (RemoteException e) { 454419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen log("networksListLoaded: exception from unregisterCallback " + e); 455419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen } 456419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen 4577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // update the state of the preferences. 4587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("hideProgressPanel"); 4597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Always try to dismiss the dialog because activity may 4617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // be moved to background after dialog is shown. 4627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 4637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon dismissDialog(DIALOG_NETWORK_LIST_LOAD); 4647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (IllegalArgumentException e) { 4657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // It's not a error in following scenario, we just ignore it. 4667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // "Load list" dialog will not show, if NetworkQueryService is 4677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // connected after this activity is moved to background. 468419d5064bfb92dcc24d0c7101a4585c307f3e49bEtan Cohen if (DBG) log("Fail to dismiss network load list dialog " + e); 4697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon getPreferenceScreen().setEnabled(true); 4727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon clearList(); 4737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (status != NetworkQueryService.QUERY_OK) { 4757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("error while querying available networks"); 4767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayNetworkQueryFailed(status); 4777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayEmptyNetworkList(true); 4787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 4797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (result != null){ 4807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayEmptyNetworkList(false); 4817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // create a preference for each item in the list. 4837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // just use the operator name instead of the mildly 4847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // confusing mcc/mnc. 4857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon for (OperatorInfo ni : result) { 4867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Preference carrier = new Preference(this, null); 4877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon carrier.setTitle(getNetworkTitle(ni)); 4887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon carrier.setPersistent(false); 4897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mNetworkList.addPreference(carrier); 4907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mNetworkMap.put(carrier, ni); 4917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log(" " + ni); 4937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 4957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayEmptyNetworkList(true); 4967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 5017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Returns the title of the network obtained in the manual search. 5027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 5037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @param OperatorInfo contains the information of the network. 5047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 5057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @return Long Name if not null/empty, otherwise Short Name if not null/empty, 5067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * else MCCMNC string. 5077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 5087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private String getNetworkTitle(OperatorInfo ni) { 5107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!TextUtils.isEmpty(ni.getOperatorAlphaLong())) { 5117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return ni.getOperatorAlphaLong(); 5127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else if (!TextUtils.isEmpty(ni.getOperatorAlphaShort())) { 5137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return ni.getOperatorAlphaShort(); 5147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 5153be36906abc0ce84aebec204a85735d37f5a84f7Sanket Padawe BidiFormatter bidiFormatter = BidiFormatter.getInstance(); 5163be36906abc0ce84aebec204a85735d37f5a84f7Sanket Padawe return bidiFormatter.unicodeWrap(ni.getOperatorNumeric(), TextDirectionHeuristics.LTR); 5177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void clearList() { 5217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon for (Preference p : mNetworkMap.keySet()) { 5227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mNetworkList.removePreference(p); 5237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mNetworkMap.clear(); 5257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void selectNetworkAutomatic() { 5287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("select network automatically..."); 5297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mIsForeground) { 5307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showDialog(DIALOG_NETWORK_AUTO_SELECT); 5317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Message msg = mHandler.obtainMessage(EVENT_AUTO_SELECT_DONE); 5343e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe Phone phone = PhoneFactory.getPhone(mPhoneId); 5353e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe if (phone != null) { 5363e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe phone.setNetworkSelectionModeAutomatic(msg); 5373e1073d1607d41c87e97cf49ff942afde772725bSanket Padawe } 5387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void log(String msg) { 5417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.d(LOG_TAG, "[NetworksList] " + msg); 5427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon} 544