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