11260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa/* 2ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa * 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; 311260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa 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; 38c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.gsm.GsmSMSDispatcher; 39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.gsm.SmsMessage; 40d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IsimRecords; 41d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IsimUiccRecords; 42d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.SIMRecords; 43d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.UiccCardApplication; 44c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.uicc.UiccController; 45c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 46c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.io.FileDescriptor; 47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.io.PrintWriter; 48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 49c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic class CDMALTEPhone extends CDMAPhone { 50cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville static final String LOG_LTE_TAG = "CDMALTEPhone"; 51c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final boolean DBG = true; 52c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 53e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** CdmaLtePhone in addition to RuimRecords available from 54e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * PhoneBase needs access to SIMRecords and IsimUiccRecords 55e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 56e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private SIMRecords mSimRecords; 57e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private IsimUiccRecords mIsimUiccRecords; 58e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 59c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 60c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Small container class used to hold information relevant to 61c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * the carrier selection process. operatorNumeric can be "" 62c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * if we are looking for automatic selection. operatorAlphaLong is the 63c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * corresponding operator name. 64c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 65c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static class NetworkSelectMessage { 66c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public Message message; 67c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String operatorNumeric; 68c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String operatorAlphaLong; 69c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 70c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Constructors 72c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public CDMALTEPhone(Context context, CommandsInterface ci, PhoneNotifier notifier) { 73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville super(context, ci, notifier, false); 74c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 75c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 76c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 77c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void handleMessage (Message msg) { 78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (msg.what) { 79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // handle the select network completion callbacks. 80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_SET_NETWORK_MANUAL_COMPLETE: 81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleSetSelectNetwork((AsyncResult) msg.obj); 82c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 830d4bcdf379842af4b6304809156971e926f374f0Jake Hamby 84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville super.handleMessage(msg); 86c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void initSstIcc() { 91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mSST = new CdmaLteServiceStateTracker(this); 92c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dispose() { 96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville synchronized(PhoneProxy.lockForRadioTechnologyChange) { 97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville super.dispose(); 98c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void removeReferences() { 103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville super.removeReferences(); 104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public PhoneConstants.DataState getDataConnectionState(String apnType) { 108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville PhoneConstants.DataState ret = PhoneConstants.DataState.DISCONNECTED; 109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mSST == null) { 111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Radio Technology Change is ongoing, dispose() and 112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // removeReferences() have already been called 113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ret = PhoneConstants.DataState.DISCONNECTED; 115454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville } else if (mDcTracker.isApnTypeEnabled(apnType) == false) { 116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ret = PhoneConstants.DataState.DISCONNECTED; 117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 118454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville switch (mDcTracker.getState(apnType)) { 119c6bbea82bf74ebb492508199b6f3e172b7ce860aWink Saville case RETRYING: 120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case FAILED: 121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case IDLE: 122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ret = PhoneConstants.DataState.DISCONNECTED; 123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CONNECTED: 126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case DISCONNECTING: 12722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mCT.mState != PhoneConstants.State.IDLE && 128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville !mSST.isConcurrentVoiceAndDataAllowed()) { 129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ret = PhoneConstants.DataState.SUSPENDED; 130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ret = PhoneConstants.DataState.CONNECTED; 132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CONNECTING: 136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case SCANNING: 137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ret = PhoneConstants.DataState.CONNECTING; 138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("getDataConnectionState apnType=" + apnType + " ret=" + ret); 143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return ret; 144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void 148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville selectNetworkManually(OperatorInfo network, 149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message response) { 150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // wrap the response message in our own message along with 151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // the operator's id. 152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville NetworkSelectMessage nsm = new NetworkSelectMessage(); 153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville nsm.message = response; 154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville nsm.operatorNumeric = network.getOperatorNumeric(); 155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville nsm.operatorAlphaLong = network.getOperatorAlphaLong(); 156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // get the message 158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message msg = obtainMessage(EVENT_SET_NETWORK_MANUAL_COMPLETE, nsm); 159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 16022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.setNetworkSelectionModeManual(network.getOperatorNumeric(), msg); 161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Used to track the settings upon completion of the network change. 165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void handleSetSelectNetwork(AsyncResult ar) { 167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // look for our wrapper within the asyncresult, skip the rest if it 168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // is null. 169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!(ar.userObj instanceof NetworkSelectMessage)) { 170cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville loge("unexpected result from user object."); 171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville NetworkSelectMessage nsm = (NetworkSelectMessage) ar.userObj; 175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // found the object, now we send off the message we had originally 177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // attached to the request. 178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (nsm.message != null) { 179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("sending original message to recipient"); 180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult.forMessage(nsm.message, ar.result, ar.exception); 181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville nsm.message.sendToTarget(); 182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // open the shared preferences editor, and write the value. 185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // nsm.operatorNumeric is "" if we're in automatic.selection. 186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); 187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SharedPreferences.Editor editor = sp.edit(); 188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville editor.putString(NETWORK_SELECTION_KEY, nsm.operatorNumeric); 189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville editor.putString(NETWORK_SELECTION_NAME_KEY, nsm.operatorAlphaLong); 190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // commit and log the result. 192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (! editor.commit()) { 193cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville loge("failed to commit network selection preference"); 194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 198ce06370fc58f59abda3cb072326e9425da3d755dWink Saville 199ce06370fc58f59abda3cb072326e9425da3d755dWink Saville /** 200ce06370fc58f59abda3cb072326e9425da3d755dWink Saville * Sets the "current" field in the telephony provider according to the 201ce06370fc58f59abda3cb072326e9425da3d755dWink Saville * build-time operator numeric property 202ce06370fc58f59abda3cb072326e9425da3d755dWink Saville * 203ce06370fc58f59abda3cb072326e9425da3d755dWink Saville * @return true for success; false otherwise. 204ce06370fc58f59abda3cb072326e9425da3d755dWink Saville */ 205ce06370fc58f59abda3cb072326e9425da3d755dWink Saville @Override 206ce06370fc58f59abda3cb072326e9425da3d755dWink Saville boolean updateCurrentCarrierInProvider(String operatorNumeric) { 207ce06370fc58f59abda3cb072326e9425da3d755dWink Saville boolean retVal; 208ce06370fc58f59abda3cb072326e9425da3d755dWink Saville if (mUiccController.getUiccCardApplication(UiccController.APP_FAM_3GPP) == null) { 209ce06370fc58f59abda3cb072326e9425da3d755dWink Saville if (DBG) log("updateCurrentCarrierInProvider APP_FAM_3GPP == null"); 210ce06370fc58f59abda3cb072326e9425da3d755dWink Saville retVal = super.updateCurrentCarrierInProvider(operatorNumeric); 211ce06370fc58f59abda3cb072326e9425da3d755dWink Saville } else { 212ce06370fc58f59abda3cb072326e9425da3d755dWink Saville if (DBG) log("updateCurrentCarrierInProvider not updated"); 213ce06370fc58f59abda3cb072326e9425da3d755dWink Saville retVal = true; 214ce06370fc58f59abda3cb072326e9425da3d755dWink Saville } 215ce06370fc58f59abda3cb072326e9425da3d755dWink Saville if (DBG) log("updateCurrentCarrierInProvider X retVal=" + retVal); 216ce06370fc58f59abda3cb072326e9425da3d755dWink Saville return retVal; 217ce06370fc58f59abda3cb072326e9425da3d755dWink Saville } 218ce06370fc58f59abda3cb072326e9425da3d755dWink Saville 219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public boolean updateCurrentCarrierInProvider() { 221e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mSimRecords != null) { 222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current"); 224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ContentValues map = new ContentValues(); 225e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka String operatorNumeric = mSimRecords.getOperatorNumeric(); 226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville map.put(Telephony.Carriers.NUMERIC, operatorNumeric); 227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("updateCurrentCarrierInProvider from UICC: numeric=" + 228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville operatorNumeric); 229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mContext.getContentResolver().insert(uri, map); 230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (SQLException e) { 232cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville loge("Can't store current operator ret false", e); 233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("updateCurrentCarrierInProvider mIccRecords == null ret false"); 236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return false; 238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 240c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // return IMSI from USIM as subscriber ID. 241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getSubscriberId() { 243e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return (mSimRecords != null) ? mSimRecords.getIMSI() : ""; 244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2460e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi // return GID1 from USIM 2470e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi @Override 2480e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi public String getGroupIdLevel1() { 2490e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi return (mSimRecords != null) ? mSimRecords.getGid1() : ""; 2500e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi } 2510e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi 252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getImei() { 254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return mImei; 255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getDeviceSvn() { 259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return mImeiSv; 260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public IsimRecords getIsimRecords() { 264e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mIsimUiccRecords; 265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getMsisdn() { 269e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return (mSimRecords != null) ? mSimRecords.getMsisdnNumber() : null; 270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void getAvailableNetworks(Message response) { 27422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.getAvailableNetworks(response); 275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void requestIsimAuthentication(String nonce, Message result) { 27922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.requestIsimAuthentication(nonce, result); 280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 283e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka protected void onUpdateIccAvailability() { 284e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccController == null ) { 285bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka return; 286bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka } 287bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka 288e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Update IsimRecords 289e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka UiccCardApplication newUiccApplication = 290e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccController.getUiccCardApplication(UiccController.APP_FAM_IMS); 291e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka IsimUiccRecords newIsimUiccRecords = null; 292e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 293e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (newUiccApplication != null) { 294e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka newIsimUiccRecords = (IsimUiccRecords)newUiccApplication.getIccRecords(); 295bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka } 296e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIsimUiccRecords = newIsimUiccRecords; 297e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 298e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Update UsimRecords 299e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka newUiccApplication = mUiccController.getUiccCardApplication(UiccController.APP_FAM_3GPP); 300e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka SIMRecords newSimRecords = null; 301e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (newUiccApplication != null) { 302e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka newSimRecords = (SIMRecords)newUiccApplication.getIccRecords(); 303e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 304e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mSimRecords != newSimRecords) { 305e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mSimRecords != null) { 306e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka log("Removing stale SIMRecords object."); 307e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mSimRecords = null; 308e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 309e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (newSimRecords != null) { 310e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka log("New SIMRecords found"); 311e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mSimRecords = newSimRecords; 312e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 313e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 314e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 315e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka super.onUpdateIccAvailability(); 316bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka } 317bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka 318bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka @Override 319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void log(String s) { 320cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Rlog.d(LOG_LTE_TAG, s); 321cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville } 322cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 323cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protected void loge(String s) { 324cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Rlog.e(LOG_LTE_TAG, s); 325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 327cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protected void loge(String s, Throwable e) { 328cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville Rlog.e(LOG_LTE_TAG, s, e); 329cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville} 330cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println("CDMALTEPhone extends:"); 334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville super.dump(fd, pw, args); 335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville} 337