CDMALTEPhone.java revision 0d4bcdf379842af4b6304809156971e926f374f0
1c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/*
2c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Copyright (C) 2011 The Android Open Source Project
3c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *
4c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Licensed under the Apache License, Version 2.0 (the "License");
5c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * you may not use this file except in compliance with the License.
6c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * You may obtain a copy of the License at
7c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *
8c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *      http://www.apache.org/licenses/LICENSE-2.0
9c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *
10c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Unless required by applicable law or agreed to in writing, software
11c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * distributed under the License is distributed on an "AS IS" BASIS,
12c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See the License for the specific language governing permissions and
14c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * limitations under the License.
15c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */
16c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
17c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepackage com.android.internal.telephony.cdma;
18c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
19c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.ContentValues;
20c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.Context;
21c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.SharedPreferences;
22c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.database.SQLException;
23c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.net.Uri;
24c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.AsyncResult;
25c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Message;
26c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.preference.PreferenceManager;
27c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.provider.Telephony;
28ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog;
29c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
30c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.CommandsInterface;
310d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport com.android.internal.telephony.InboundSmsHandler;
32c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.OperatorInfo;
33c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.PhoneConstants;
34c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.PhoneNotifier;
35c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.PhoneProxy;
36c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.SMSDispatcher;
370d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport com.android.internal.telephony.SmsBroadcastUndelivered;
380d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport com.android.internal.telephony.gsm.GsmInboundSmsHandler;
39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.gsm.GsmSMSDispatcher;
40c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.gsm.SmsMessage;
41d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IsimRecords;
42d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IsimUiccRecords;
43d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.SIMRecords;
44d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.UiccCardApplication;
45c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.uicc.UiccController;
46c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.io.FileDescriptor;
48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.io.PrintWriter;
49c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
50c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic class CDMALTEPhone extends CDMAPhone {
51cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    static final String LOG_LTE_TAG = "CDMALTEPhone";
52c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final boolean DBG = true;
53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
54c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /** Secondary SMSDispatcher for 3GPP format messages. */
55c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    SMSDispatcher m3gppSMS;
56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
57e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /** CdmaLtePhone in addition to RuimRecords available from
58e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * PhoneBase needs access to SIMRecords and IsimUiccRecords
59e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
60e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private SIMRecords mSimRecords;
61e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private IsimUiccRecords mIsimUiccRecords;
62e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
630d4bcdf379842af4b6304809156971e926f374f0Jake Hamby    private GsmInboundSmsHandler mGsmInboundSmsHandler;
640d4bcdf379842af4b6304809156971e926f374f0Jake Hamby
65c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
66c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Small container class used to hold information relevant to
67c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * the carrier selection process. operatorNumeric can be ""
68c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * if we are looking for automatic selection. operatorAlphaLong is the
69c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * corresponding operator name.
70c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static class NetworkSelectMessage {
72c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        public Message message;
73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        public String operatorNumeric;
74c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        public String operatorAlphaLong;
75c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
76c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
77c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // Constructors
78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public CDMALTEPhone(Context context, CommandsInterface ci, PhoneNotifier notifier) {
79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        super(context, ci, notifier, false);
80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
82c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void handleMessage (Message msg) {
84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        switch (msg.what) {
85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // handle the select network completion callbacks.
86c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_SET_NETWORK_MANUAL_COMPLETE:
87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                handleSetSelectNetwork((AsyncResult) msg.obj);
88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
890d4bcdf379842af4b6304809156971e926f374f0Jake Hamby
90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_NEW_ICC_SMS:
910d4bcdf379842af4b6304809156971e926f374f0Jake Hamby                // pass to InboundSmsHandler to process
920d4bcdf379842af4b6304809156971e926f374f0Jake Hamby                mGsmInboundSmsHandler.sendMessage(InboundSmsHandler.EVENT_NEW_SMS, msg.obj);
93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
940d4bcdf379842af4b6304809156971e926f374f0Jake Hamby
95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            default:
96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                super.handleMessage(msg);
97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
98c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void initSstIcc() {
102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mSST = new CdmaLteServiceStateTracker(this);
103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1050d4bcdf379842af4b6304809156971e926f374f0Jake Hamby    /**
1060d4bcdf379842af4b6304809156971e926f374f0Jake Hamby     * Create SMSDispatcher and InboundSmsHandler for 3GPP format messages.
1070d4bcdf379842af4b6304809156971e926f374f0Jake Hamby     * @return the new GsmInboundSmsHandler (to pass to {@link SmsBroadcastUndelivered})
1080d4bcdf379842af4b6304809156971e926f374f0Jake Hamby     */
1090d4bcdf379842af4b6304809156971e926f374f0Jake Hamby    @Override
1100d4bcdf379842af4b6304809156971e926f374f0Jake Hamby    protected GsmInboundSmsHandler initGsmSmsDispatcher() {
1110d4bcdf379842af4b6304809156971e926f374f0Jake Hamby        // Create 3GPP SMS dispatcher for outgoing messages.
1120d4bcdf379842af4b6304809156971e926f374f0Jake Hamby        m3gppSMS = new GsmSMSDispatcher(this, mSmsUsageMonitor);
1130d4bcdf379842af4b6304809156971e926f374f0Jake Hamby
1140d4bcdf379842af4b6304809156971e926f374f0Jake Hamby        // Create 3GPP inbound SMS handler.
1150d4bcdf379842af4b6304809156971e926f374f0Jake Hamby        mGsmInboundSmsHandler = GsmInboundSmsHandler.makeInboundSmsHandler(mContext,
1160d4bcdf379842af4b6304809156971e926f374f0Jake Hamby                mSmsStorageMonitor, this);
1170d4bcdf379842af4b6304809156971e926f374f0Jake Hamby
1180d4bcdf379842af4b6304809156971e926f374f0Jake Hamby        return mGsmInboundSmsHandler;
1190d4bcdf379842af4b6304809156971e926f374f0Jake Hamby    }
1200d4bcdf379842af4b6304809156971e926f374f0Jake Hamby
121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void dispose() {
123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        synchronized(PhoneProxy.lockForRadioTechnologyChange) {
124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            super.dispose();
125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            m3gppSMS.dispose();
1260d4bcdf379842af4b6304809156971e926f374f0Jake Hamby            mGsmInboundSmsHandler.dispose();
127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void removeReferences() {
132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        super.removeReferences();
133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        m3gppSMS = null;
134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public PhoneConstants.DataState getDataConnectionState(String apnType) {
138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        PhoneConstants.DataState ret = PhoneConstants.DataState.DISCONNECTED;
139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mSST == null) {
141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Radio Technology Change is ongoing, dispose() and
142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // removeReferences() have already been called
143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            ret = PhoneConstants.DataState.DISCONNECTED;
145454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville        } else if (mDcTracker.isApnTypeEnabled(apnType) == false) {
146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            ret = PhoneConstants.DataState.DISCONNECTED;
147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
148454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville            switch (mDcTracker.getState(apnType)) {
149c6bbea82bf74ebb492508199b6f3e172b7ce860aWink Saville                case RETRYING:
150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                case FAILED:
151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                case IDLE:
152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    ret = PhoneConstants.DataState.DISCONNECTED;
153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                case CONNECTED:
156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                case DISCONNECTING:
15722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (mCT.mState != PhoneConstants.State.IDLE &&
158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            !mSST.isConcurrentVoiceAndDataAllowed()) {
159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        ret = PhoneConstants.DataState.SUSPENDED;
160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    } else {
161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        ret = PhoneConstants.DataState.CONNECTED;
162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                case CONNECTING:
166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                case SCANNING:
167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    ret = PhoneConstants.DataState.CONNECTING;
168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        log("getDataConnectionState apnType=" + apnType + " ret=" + ret);
173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return ret;
174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void
178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    selectNetworkManually(OperatorInfo network,
179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            Message response) {
180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // wrap the response message in our own message along with
181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // the operator's id.
182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        NetworkSelectMessage nsm = new NetworkSelectMessage();
183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        nsm.message = response;
184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        nsm.operatorNumeric = network.getOperatorNumeric();
185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        nsm.operatorAlphaLong = network.getOperatorAlphaLong();
186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // get the message
188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Message msg = obtainMessage(EVENT_SET_NETWORK_MANUAL_COMPLETE, nsm);
189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
19022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.setNetworkSelectionModeManual(network.getOperatorNumeric(), msg);
191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Used to track the settings upon completion of the network change.
195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void handleSetSelectNetwork(AsyncResult ar) {
197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // look for our wrapper within the asyncresult, skip the rest if it
198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // is null.
199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (!(ar.userObj instanceof NetworkSelectMessage)) {
200cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            loge("unexpected result from user object.");
201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        NetworkSelectMessage nsm = (NetworkSelectMessage) ar.userObj;
205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // found the object, now we send off the message we had originally
207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // attached to the request.
208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (nsm.message != null) {
209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) log("sending original message to recipient");
210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            AsyncResult.forMessage(nsm.message, ar.result, ar.exception);
211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            nsm.message.sendToTarget();
212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // open the shared preferences editor, and write the value.
215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // nsm.operatorNumeric is "" if we're in automatic.selection.
216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        SharedPreferences.Editor editor = sp.edit();
218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        editor.putString(NETWORK_SELECTION_KEY, nsm.operatorNumeric);
219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        editor.putString(NETWORK_SELECTION_NAME_KEY, nsm.operatorAlphaLong);
220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // commit and log the result.
222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (! editor.commit()) {
223cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            loge("failed to commit network selection preference");
224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public boolean updateCurrentCarrierInProvider() {
230e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mSimRecords != null) {
231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            try {
232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current");
233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ContentValues map = new ContentValues();
234e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                String operatorNumeric = mSimRecords.getOperatorNumeric();
235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                map.put(Telephony.Carriers.NUMERIC, operatorNumeric);
236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("updateCurrentCarrierInProvider from UICC: numeric=" +
237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        operatorNumeric);
238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mContext.getContentResolver().insert(uri, map);
239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                return true;
240c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } catch (SQLException e) {
241cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                loge("Can't store current operator ret false", e);
242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) log("updateCurrentCarrierInProvider mIccRecords == null ret false");
245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
246c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return false;
247c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // return IMSI from USIM as subscriber ID.
250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getSubscriberId() {
252e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        return (mSimRecords != null) ? mSimRecords.getIMSI() : "";
253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
2550e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi    // return GID1 from USIM
2560e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi    @Override
2570e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi    public String getGroupIdLevel1() {
2580e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi        return (mSimRecords != null) ? mSimRecords.getGid1() : "";
2590e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi    }
2600e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi
261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getImei() {
263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return mImei;
264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getDeviceSvn() {
268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return mImeiSv;
269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public IsimRecords getIsimRecords() {
273e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        return mIsimUiccRecords;
274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getMsisdn() {
278e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        return (mSimRecords != null) ? mSimRecords.getMsisdnNumber() : null;
279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void getAvailableNetworks(Message response) {
28322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.getAvailableNetworks(response);
284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void requestIsimAuthentication(String nonce, Message result) {
28822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.requestIsimAuthentication(nonce, result);
289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
292e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    protected void onUpdateIccAvailability() {
293e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mUiccController == null ) {
294bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka            return;
295bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        }
296bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka
297e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        // Update IsimRecords
298e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        UiccCardApplication newUiccApplication =
299e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccController.getUiccCardApplication(UiccController.APP_FAM_IMS);
300e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        IsimUiccRecords newIsimUiccRecords = null;
301e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
302e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (newUiccApplication != null) {
303e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            newIsimUiccRecords = (IsimUiccRecords)newUiccApplication.getIccRecords();
304bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        }
305e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mIsimUiccRecords = newIsimUiccRecords;
306e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
307e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        // Update UsimRecords
308e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        newUiccApplication = mUiccController.getUiccCardApplication(UiccController.APP_FAM_3GPP);
309e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        SIMRecords newSimRecords = null;
310e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (newUiccApplication != null) {
311e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            newSimRecords = (SIMRecords)newUiccApplication.getIccRecords();
312e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
313e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mSimRecords != newSimRecords) {
314e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mSimRecords != null) {
315e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                log("Removing stale SIMRecords object.");
316e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mSimRecords.unregisterForNewSms(this);
317e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mSimRecords = null;
318e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
319e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (newSimRecords != null) {
320e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                log("New SIMRecords found");
321e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mSimRecords = newSimRecords;
322e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mSimRecords.registerForNewSms(this, EVENT_NEW_ICC_SMS, null);
323e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            }
324e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
325e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
326e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        super.onUpdateIccAvailability();
327bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    }
328bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka
329bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    @Override
330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void log(String s) {
331cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            Rlog.d(LOG_LTE_TAG, s);
332cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
333cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
334cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void loge(String s) {
335cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            Rlog.e(LOG_LTE_TAG, s);
336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
338cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected void loge(String s, Throwable e) {
339cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville        Rlog.e(LOG_LTE_TAG, s, e);
340cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville}
341cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println("CDMALTEPhone extends:");
345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        super.dump(fd, pw, args);
346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        pw.println(" m3gppSMS=" + m3gppSMS);
347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville}
349