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