1e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka/* 2e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Copyright (C) 2012 The Android Open Source Project 3e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 4e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Licensed under the Apache License, Version 2.0 (the "License"); 5e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * you may not use this file except in compliance with the License. 6e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * You may obtain a copy of the License at 7e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 8e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * http://www.apache.org/licenses/LICENSE-2.0 9e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 10e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Unless required by applicable law or agreed to in writing, software 11e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * distributed under the License is distributed on an "AS IS" BASIS, 12e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * See the License for the specific language governing permissions and 14e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * limitations under the License. 15e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 16e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 17d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkapackage com.android.internal.telephony.uicc; 18e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 19e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport static android.Manifest.permission.READ_PHONE_STATE; 20ab57aa5d465ef3a6dc0895b2408276617a2f6fa0Tom Taylor 21e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.app.ActivityManagerNative; 22e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.content.Context; 23e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.content.Intent; 24e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.AsyncResult; 25e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.Handler; 26e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.Message; 27e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.Registrant; 28e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.RegistrantList; 29e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.SystemProperties; 30565013a713156a0ddcc46dc3a0077e4c268ce272Wink Savilleimport android.os.UserHandle; 31ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog; 32e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.telephony.ServiceState; 33a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.SubscriptionManager; 34e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.telephony.TelephonyManager; 35e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 36d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.CommandsInterface; 37d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.IccCard; 38d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.IccCardConstants; 39d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.PhoneConstants; 40a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.MccTable; 41cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savilleimport com.android.internal.telephony.RILConstants; 42d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.TelephonyIntents; 43e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.IccCardConstants.State; 44e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager; 45be3dc4b04cd65e576d250cf68f310d47637167ffWink Savilleimport com.android.internal.telephony.Phone; 46a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.SubscriptionController; 47d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState; 48d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState; 49d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardStatus.CardState; 50d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardStatus.PinState; 51d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.UiccController; 52e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 5305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.FileDescriptor; 5405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.PrintWriter; 5505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka 56e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka/** 57e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @Deprecated use {@link UiccController}.getUiccCard instead. 58e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 59e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * The Phone App assumes that there is only one icc card, and one icc application 60e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * available at a time. Moreover, it assumes such object (represented with IccCard) 61cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * is available all the time (whether {@link RILConstants#RIL_REQUEST_GET_SIM_STATUS} returned 62e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * or not, whether card has desired application or not, whether there really is a card in the 63e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * slot or not). 64e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 65e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * UiccController, however, can handle multiple instances of icc objects (multiple 66e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * {@link UiccCardApplication}, multiple {@link IccFileHandler}, multiple {@link IccRecords}) 67e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * created and destroyed dynamically during phone operation. 68e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 69e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * This class implements the IccCard interface that is always available (right after default 70e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * phone object is constructed) to expose the current (based on voice radio technology) 71e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * application on the uicc card, so that external apps won't break. 72e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 73e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 74e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkapublic class IccCardProxy extends Handler implements IccCard { 75e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final boolean DBG = true; 76cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private static final String LOG_TAG = "IccCardProxy"; 77e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 78e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_RADIO_OFF_OR_UNAVAILABLE = 1; 79e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_RADIO_ON = 2; 80e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_ICC_CHANGED = 3; 81e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_ICC_ABSENT = 4; 82e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_ICC_LOCKED = 5; 83e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_APP_READY = 6; 84e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_RECORDS_LOADED = 7; 85e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_IMSI_READY = 8; 86e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_NETWORK_LOCKED = 9; 87e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED = 11; 88e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 89a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int EVENT_ICC_RECORD_EVENTS = 500; 90a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int EVENT_SUBSCRIPTION_ACTIVATED = 501; 91a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int EVENT_SUBSCRIPTION_DEACTIVATED = 502; 92c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal private static final int EVENT_CARRIER_PRIVILIGES_LOADED = 503; 93a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 94062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal private Integer mPhoneId = null; 95a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 96e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private final Object mLock = new Object(); 97e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private Context mContext; 98e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private CommandsInterface mCi; 99e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu private TelephonyManager mTelephonyManager; 100e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 101e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private RegistrantList mAbsentRegistrants = new RegistrantList(); 102e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private RegistrantList mPinLockedRegistrants = new RegistrantList(); 103e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private RegistrantList mNetworkLockedRegistrants = new RegistrantList(); 104e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 105e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private int mCurrentAppType = UiccController.APP_FAM_3GPP; //default to 3gpp? 106e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private UiccController mUiccController = null; 107e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private UiccCard mUiccCard = null; 108e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private UiccCardApplication mUiccApplication = null; 109e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private IccRecords mIccRecords = null; 110e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private CdmaSubscriptionSourceManager mCdmaSSM = null; 111e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private boolean mRadioOn = false; 112e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private boolean mQuietMode = false; // when set to true IccCardProxy will not broadcast 113e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // ACTION_SIM_STATE_CHANGED intents 114e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private boolean mInitialized = false; 115e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private State mExternalState = State.UNKNOWN; 116e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 117cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal public static final String ACTION_INTERNAL_SIM_STATE_CHANGED = "android.intent.action.internal_sim_state_changed"; 118cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal 119062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal public IccCardProxy(Context context, CommandsInterface ci, int phoneId) { 120062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal if (DBG) log("ctor: ci=" + ci + " phoneId=" + phoneId); 12122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mContext = context; 12222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi = ci; 123062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal mPhoneId = phoneId; 124e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu mTelephonyManager = (TelephonyManager) mContext.getSystemService( 125e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu Context.TELEPHONY_SERVICE); 126e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCdmaSSM = CdmaSubscriptionSourceManager.getInstance(context, 127e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ci, this, EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED, null); 128e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccController = UiccController.getInstance(); 129e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccController.registerForIccChanged(this, EVENT_ICC_CHANGED, null); 130e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ci.registerForOn(this,EVENT_RADIO_ON, null); 131e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ci.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_UNAVAILABLE, null); 132a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 133a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville resetProperties(); 134a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setExternalState(State.NOT_READY, false); 135a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 136a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 137e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void dispose() { 138e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 139e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka log("Disposing"); 140e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka //Cleanup icc references 141e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccController.unregisterForIccChanged(this); 142e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccController = null; 143e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.unregisterForOn(this); 144e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.unregisterForOffOrNotAvailable(this); 145e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCdmaSSM.dispose(this); 146e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 147e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 148e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 149e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /* 150e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * The card application that the external world sees will be based on the 151e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * voice radio technology only! 152e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 153e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void setVoiceRadioTech(int radioTech) { 154e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 155e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) { 156e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka log("Setting radio tech " + ServiceState.rilRadioTechnologyToString(radioTech)); 157e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 158e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (ServiceState.isGsm(radioTech)) { 159e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCurrentAppType = UiccController.APP_FAM_3GPP; 160e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 161e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCurrentAppType = UiccController.APP_FAM_3GPP2; 162e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 163e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka updateQuietMode(); 164e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 165e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 166e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 167e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 168e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * In case of 3gpp2 we need to find out if subscription used is coming from 169be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville * NV in which case we shouldn't broadcast any sim states changes. 170e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 171e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void updateQuietMode() { 172e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 173e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka boolean newQuietMode; 174be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville int cdmaSource = Phone.CDMA_SUBSCRIPTION_UNKNOWN; 175e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mCurrentAppType == UiccController.APP_FAM_3GPP) { 176e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka newQuietMode = false; 177be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville if (DBG) log("updateQuietMode: 3GPP subscription -> newQuietMode=" + newQuietMode); 178e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 179be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville cdmaSource = mCdmaSSM != null ? 180be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville mCdmaSSM.getCdmaSubscriptionSource() : Phone.CDMA_SUBSCRIPTION_UNKNOWN; 181be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville 182be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville newQuietMode = (cdmaSource == Phone.CDMA_SUBSCRIPTION_NV) 183a635fd92e8022f103fde2e8728b312b2cb8fa0c6Preeti Ahuja && (mCurrentAppType == UiccController.APP_FAM_3GPP2); 184e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 185e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 186e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mQuietMode == false && newQuietMode == true) { 187e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Last thing to do before switching to quiet mode is 188e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // broadcast ICC_READY 189e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka log("Switching to QuietMode."); 190e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka setExternalState(State.READY); 191e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mQuietMode = newQuietMode; 192e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (mQuietMode == true && newQuietMode == false) { 193be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville if (DBG) { 194be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville log("updateQuietMode: Switching out from QuietMode." 195be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville + " Force broadcast of current state=" + mExternalState); 196be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville } 197e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mQuietMode = newQuietMode; 198e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka setExternalState(mExternalState, true); 1994fae501dc021c215c1f291a244466610bc3f7120Wink Saville } else { 2004fae501dc021c215c1f291a244466610bc3f7120Wink Saville if (DBG) log("updateQuietMode: no changes don't setExternalState"); 201e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 202be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville if (DBG) { 203be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville log("updateQuietMode: QuietMode is " + mQuietMode + " (app_type=" 204a635fd92e8022f103fde2e8728b312b2cb8fa0c6Preeti Ahuja + mCurrentAppType + " cdmaSource=" + cdmaSource + ")"); 205be3dc4b04cd65e576d250cf68f310d47637167ffWink Saville } 206e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mInitialized = true; 207e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka sendMessage(obtainMessage(EVENT_ICC_CHANGED)); 208e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 209e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 210e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 211cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 212e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void handleMessage(Message msg) { 213e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka switch (msg.what) { 214e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_RADIO_OFF_OR_UNAVAILABLE: 215e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mRadioOn = false; 2165d8e4457b03d166aa249989916b66a85df898516Steven Liu if (CommandsInterface.RadioState.RADIO_UNAVAILABLE == mCi.getRadioState()) { 2175d8e4457b03d166aa249989916b66a85df898516Steven Liu setExternalState(State.NOT_READY); 2185d8e4457b03d166aa249989916b66a85df898516Steven Liu } 219e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 220e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_RADIO_ON: 221e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mRadioOn = true; 222e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (!mInitialized) { 223e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka updateQuietMode(); 224e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 225e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 226e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_ICC_CHANGED: 227e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mInitialized) { 228e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka updateIccAvailability(); 229e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 230e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 231e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_ICC_ABSENT: 232e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAbsentRegistrants.notifyRegistrants(); 233e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka setExternalState(State.ABSENT); 234e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 235e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_ICC_LOCKED: 236e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka processLockedState(); 237e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 238e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_APP_READY: 239e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka setExternalState(State.READY); 240e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 241e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_RECORDS_LOADED: 242062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal // Update the MCC/MNC. 243a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mIccRecords != null) { 244a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String operator = mIccRecords.getOperatorNumeric(); 245062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal log("operator=" + operator + " mPhoneId=" + mPhoneId); 246062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal 247062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal if (operator != null) { 248e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu mTelephonyManager.setSimOperatorNumericForPhone(mPhoneId, operator); 249062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal String countryCode = operator.substring(0,3); 250062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal if (countryCode != null) { 251e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu mTelephonyManager.setSimCountryIsoForPhone(mPhoneId, 252062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal MccTable.countryCodeForMcc(Integer.parseInt(countryCode))); 2534b09dff383ae7dfca595aeeea886a594a1947340Wink Saville } else { 254062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal loge("EVENT_RECORDS_LOADED Country code is null"); 255a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 256a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 257a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("EVENT_RECORDS_LOADED Operator name is null"); 258a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 259a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 26056070d81b56a950a027d5adf87890221548ca666Shishir Agrawal if (mUiccCard != null && !mUiccCard.areCarrierPriviligeRulesLoaded()) { 26156070d81b56a950a027d5adf87890221548ca666Shishir Agrawal mUiccCard.registerForCarrierPrivilegeRulesLoaded( 26256070d81b56a950a027d5adf87890221548ca666Shishir Agrawal this, EVENT_CARRIER_PRIVILIGES_LOADED, null); 26356070d81b56a950a027d5adf87890221548ca666Shishir Agrawal } else { 26456070d81b56a950a027d5adf87890221548ca666Shishir Agrawal onRecordsLoaded(); 26556070d81b56a950a027d5adf87890221548ca666Shishir Agrawal } 266e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 267e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_IMSI_READY: 268e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka broadcastIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_IMSI, null); 269e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 270e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_NETWORK_LOCKED: 271e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mNetworkLockedRegistrants.notifyRegistrants(); 272e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka setExternalState(State.NETWORK_LOCKED); 273e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 274e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED: 275e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka updateQuietMode(); 276e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 277a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_SUBSCRIPTION_ACTIVATED: 278a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("EVENT_SUBSCRIPTION_ACTIVATED"); 279a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onSubscriptionActivated(); 280a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 281a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 282a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_SUBSCRIPTION_DEACTIVATED: 283a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("EVENT_SUBSCRIPTION_DEACTIVATED"); 284a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville onSubscriptionDeactivated(); 285a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 286a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 287a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_ICC_RECORD_EVENTS: 288a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ((mCurrentAppType == UiccController.APP_FAM_3GPP) && (mIccRecords != null)) { 289a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville AsyncResult ar = (AsyncResult)msg.obj; 290a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int eventCode = (Integer) ar.result; 291a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (eventCode == SIMRecords.EVENT_SPN) { 292e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu mTelephonyManager.setSimOperatorNameForPhone( 293e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu mPhoneId, mIccRecords.getServiceProviderName()); 294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 296a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 297a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 298c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal case EVENT_CARRIER_PRIVILIGES_LOADED: 299c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal log("EVENT_CARRIER_PRIVILEGES_LOADED"); 30056070d81b56a950a027d5adf87890221548ca666Shishir Agrawal if (mUiccCard != null) { 30156070d81b56a950a027d5adf87890221548ca666Shishir Agrawal mUiccCard.unregisterForCarrierPrivilegeRulesLoaded(this); 30256070d81b56a950a027d5adf87890221548ca666Shishir Agrawal } 303c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal onRecordsLoaded(); 304c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal break; 305c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal 306e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka default: 307e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Unhandled message with number: " + msg.what); 308e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 309e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 310e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 311e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void onSubscriptionActivated() { 313a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville updateIccAvailability(); 314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville updateStateProperty(); 315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 317a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void onSubscriptionDeactivated() { 318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville resetProperties(); 319a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville updateIccAvailability(); 320a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville updateStateProperty(); 321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 322a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 323c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal private void onRecordsLoaded() { 324cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal broadcastInternalIccStateChangedIntent(IccCardConstants.INTENT_VALUE_ICC_LOADED, null); 325c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal } 326a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 327e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void updateIccAvailability() { 328e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 329062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal UiccCard newCard = mUiccController.getUiccCard(mPhoneId); 330e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CardState state = CardState.CARDSTATE_ABSENT; 331e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka UiccCardApplication newApp = null; 332e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka IccRecords newRecords = null; 333e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (newCard != null) { 334e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka state = newCard.getCardState(); 335e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka newApp = newCard.getApplication(mCurrentAppType); 336e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (newApp != null) { 337e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka newRecords = newApp.getIccRecords(); 338e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 339e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 340e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 341e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mIccRecords != newRecords || mUiccApplication != newApp || mUiccCard != newCard) { 342e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Icc changed. Reregestering."); 343e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka unregisterUiccCardEvents(); 344e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccCard = newCard; 345e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccApplication = newApp; 346e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccRecords = newRecords; 347e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka registerUiccCardEvents(); 348e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 349e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka updateExternalState(); 350e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 351e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 352e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 353a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville void resetProperties() { 354a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mCurrentAppType == UiccController.APP_FAM_3GPP) { 355a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("update icc_operator_numeric=" + ""); 356e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu mTelephonyManager.setSimOperatorNumericForPhone(mPhoneId, ""); 357e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu mTelephonyManager.setSimCountryIsoForPhone(mPhoneId, ""); 358e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu mTelephonyManager.setSimOperatorNameForPhone(mPhoneId, ""); 359a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 360a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 361a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 362a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void HandleDetectedState() { 363a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // CAF_MSIM SAND 364a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville// setExternalState(State.DETECTED, false); 365a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 366a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 367e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void updateExternalState() { 36832e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja 36932e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja // mUiccCard could be null at bootup, before valid card states have 37032e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja // been received from UiccController. 37132e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja if (mUiccCard == null) { 37232e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja setExternalState(State.NOT_READY); 37332e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja return; 37432e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja } 37532e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja 37632e813e3e202d17b02f25e6fce0d4e88b8eb20faPreeti Ahuja if (mUiccCard.getCardState() == CardState.CARDSTATE_ABSENT) { 377e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mRadioOn) { 378e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka setExternalState(State.ABSENT); 379e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 380e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka setExternalState(State.NOT_READY); 381e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 382e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 383e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 384e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 385e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta if (mUiccCard.getCardState() == CardState.CARDSTATE_ERROR) { 386e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta setExternalState(State.CARD_IO_ERROR); 387e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta return; 388e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta } 389e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta 390aebb070ebfc2c858a5185b299654c6a85e33088cJunda Liu if (mUiccCard.getCardState() == CardState.CARDSTATE_RESTRICTED) { 391aebb070ebfc2c858a5185b299654c6a85e33088cJunda Liu setExternalState(State.CARD_RESTRICTED); 392aebb070ebfc2c858a5185b299654c6a85e33088cJunda Liu return; 393aebb070ebfc2c858a5185b299654c6a85e33088cJunda Liu } 394aebb070ebfc2c858a5185b299654c6a85e33088cJunda Liu 395e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta if (mUiccApplication == null) { 396e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta setExternalState(State.NOT_READY); 397775f100b20a5c978bc07f621a4087f79b1f73e3fWink Saville return; 398e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 399e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 400e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka switch (mUiccApplication.getState()) { 401e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case APPSTATE_UNKNOWN: 402e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka setExternalState(State.UNKNOWN); 403e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 404a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case APPSTATE_DETECTED: 405a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville HandleDetectedState(); 406a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 407e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case APPSTATE_PIN: 408e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka setExternalState(State.PIN_REQUIRED); 409e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 410e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case APPSTATE_PUK: 411e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka setExternalState(State.PUK_REQUIRED); 412e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 413e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case APPSTATE_SUBSCRIPTION_PERSO: 414a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mUiccApplication.getPersoSubState() == 415a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville PersoSubState.PERSOSUBSTATE_SIM_NETWORK) { 416e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka setExternalState(State.NETWORK_LOCKED); 417e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 418e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka setExternalState(State.UNKNOWN); 419e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 420e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 421e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case APPSTATE_READY: 422e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka setExternalState(State.READY); 423e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 424e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 425e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 426e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 427e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void registerUiccCardEvents() { 428c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal if (mUiccCard != null) { 429c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal mUiccCard.registerForAbsent(this, EVENT_ICC_ABSENT, null); 430c9877fe39ad8f3641d16fd980404916da7f6ce70Shishir Agrawal } 431e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccApplication != null) { 432e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccApplication.registerForReady(this, EVENT_APP_READY, null); 433e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccApplication.registerForLocked(this, EVENT_ICC_LOCKED, null); 434e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccApplication.registerForNetworkLocked(this, EVENT_NETWORK_LOCKED, null); 435e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 436e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mIccRecords != null) { 437e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccRecords.registerForImsiReady(this, EVENT_IMSI_READY, null); 438e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccRecords.registerForRecordsLoaded(this, EVENT_RECORDS_LOADED, null); 439a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mIccRecords.registerForRecordsEvents(this, EVENT_ICC_RECORD_EVENTS, null); 440a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 441e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 442e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 443e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void unregisterUiccCardEvents() { 444e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccCard != null) mUiccCard.unregisterForAbsent(this); 445e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccApplication != null) mUiccApplication.unregisterForReady(this); 446e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccApplication != null) mUiccApplication.unregisterForLocked(this); 447e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccApplication != null) mUiccApplication.unregisterForNetworkLocked(this); 448e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mIccRecords != null) mIccRecords.unregisterForImsiReady(this); 449e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mIccRecords != null) mIccRecords.unregisterForRecordsLoaded(this); 450a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mIccRecords != null) mIccRecords.unregisterForRecordsEvents(this); 451a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 452a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 453a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void updateStateProperty() { 454e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu mTelephonyManager.setSimStateForPhone(mPhoneId, getState().toString()); 455e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 456e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 457e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void broadcastIccStateChangedIntent(String value, String reason) { 458e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 459062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal if (mPhoneId == null || !SubscriptionManager.isValidSlotId(mPhoneId)) { 460062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal loge("broadcastIccStateChangedIntent: mPhoneId=" + mPhoneId 4614fae501dc021c215c1f291a244466610bc3f7120Wink Saville + " is invalid; Return!!"); 462a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return; 463a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 464a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 465e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mQuietMode) { 4664fae501dc021c215c1f291a244466610bc3f7120Wink Saville log("broadcastIccStateChangedIntent: QuietMode" 4674fae501dc021c215c1f291a244466610bc3f7120Wink Saville + " NOT Broadcasting intent ACTION_SIM_STATE_CHANGED " 4684fae501dc021c215c1f291a244466610bc3f7120Wink Saville + " value=" + value + " reason=" + reason); 469e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 470e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 471e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 472e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Intent intent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED); 473875357f84bde43d1b774123579a16afe689b4182Robert Greenwalt // TODO - we'd like this intent to have a single snapshot of all sim state, 474875357f84bde43d1b774123579a16afe689b4182Robert Greenwalt // but until then this should not use REPLACE_PENDING or we may lose 475875357f84bde43d1b774123579a16afe689b4182Robert Greenwalt // information 476875357f84bde43d1b774123579a16afe689b4182Robert Greenwalt // intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING 477875357f84bde43d1b774123579a16afe689b4182Robert Greenwalt intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 478e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka intent.putExtra(PhoneConstants.PHONE_NAME_KEY, "Phone"); 479e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka intent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, value); 480e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka intent.putExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON, reason); 481062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal SubscriptionManager.putPhoneIdAndSubIdExtra(intent, mPhoneId); 4824fae501dc021c215c1f291a244466610bc3f7120Wink Saville log("broadcastIccStateChangedIntent intent ACTION_SIM_STATE_CHANGED value=" + value 483062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal + " reason=" + reason + " for mPhoneId=" + mPhoneId); 484565013a713156a0ddcc46dc3a0077e4c268ce272Wink Saville ActivityManagerNative.broadcastStickyIntent(intent, READ_PHONE_STATE, 485565013a713156a0ddcc46dc3a0077e4c268ce272Wink Saville UserHandle.USER_ALL); 486e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 487e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 488e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 489cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal private void broadcastInternalIccStateChangedIntent(String value, String reason) { 490cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal synchronized (mLock) { 491062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal if (mPhoneId == null) { 492cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal loge("broadcastInternalIccStateChangedIntent: Card Index is not set; Return!!"); 493cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal return; 494cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal } 495cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal 496cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal Intent intent = new Intent(ACTION_INTERNAL_SIM_STATE_CHANGED); 497262aceca11c9cfeb910bc95765a17a801134d102Christopher Tate intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING 498262aceca11c9cfeb910bc95765a17a801134d102Christopher Tate | Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 499cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal intent.putExtra(PhoneConstants.PHONE_NAME_KEY, "Phone"); 500cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal intent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, value); 501cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal intent.putExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON, reason); 502062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal intent.putExtra(PhoneConstants.PHONE_KEY, mPhoneId); // SubId may not be valid. 503062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal log("Sending intent ACTION_INTERNAL_SIM_STATE_CHANGED" + " for mPhoneId : " + mPhoneId); 504cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal ActivityManagerNative.broadcastStickyIntent(intent, null, UserHandle.USER_ALL); 505cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal } 506cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal } 507cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal 508a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private void setExternalState(State newState, boolean override) { 509a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 510062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal if (mPhoneId == null || !SubscriptionManager.isValidSlotId(mPhoneId)) { 511062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal loge("setExternalState: mPhoneId=" + mPhoneId + " is invalid; Return!!"); 512a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return; 513a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 514a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 515a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!override && newState == mExternalState) { 5164fae501dc021c215c1f291a244466610bc3f7120Wink Saville loge("setExternalState: !override and newstate unchanged from " + newState); 517a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return; 518a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 519a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mExternalState = newState; 520062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal loge("setExternalState: set mPhoneId=" + mPhoneId + " mExternalState=" + mExternalState); 521e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu mTelephonyManager.setSimStateForPhone(mPhoneId, getState().toString()); 522cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal 523cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal // For locked states, we should be sending internal broadcast. 524cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal if (IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals(getIccStateIntentString(mExternalState))) { 525cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal broadcastInternalIccStateChangedIntent(getIccStateIntentString(mExternalState), 526cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal getIccStateReason(mExternalState)); 527cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal } else { 528cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal broadcastIccStateChangedIntent(getIccStateIntentString(mExternalState), 529cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal getIccStateReason(mExternalState)); 530cf53a4abdf13d04542be44e181d8a7f2983aeb7bShishir Agrawal } 531a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // TODO: Need to notify registrants for other states as well. 532a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if ( State.ABSENT == mExternalState) { 533a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mAbsentRegistrants.notifyRegistrants(); 534a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 535a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 536a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 537a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 538e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void processLockedState() { 539e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 540e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccApplication == null) { 541e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka //Don't need to do anything if non-existent application is locked 542e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 543e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 544e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka PinState pin1State = mUiccApplication.getPin1State(); 545e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (pin1State == PinState.PINSTATE_ENABLED_PERM_BLOCKED) { 546e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka setExternalState(State.PERM_DISABLED); 547e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 548e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 549e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 550e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AppState appState = mUiccApplication.getState(); 551e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka switch (appState) { 552e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case APPSTATE_PIN: 553e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPinLockedRegistrants.notifyRegistrants(); 554e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka setExternalState(State.PIN_REQUIRED); 555e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 556e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case APPSTATE_PUK: 557e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka setExternalState(State.PUK_REQUIRED); 558e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 559cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case APPSTATE_DETECTED: 560cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case APPSTATE_READY: 561cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case APPSTATE_SUBSCRIPTION_PERSO: 562cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case APPSTATE_UNKNOWN: 563cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // Neither required 564cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville break; 565e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 566e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 567e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 568e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 569e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void setExternalState(State newState) { 570e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka setExternalState(newState, false); 571e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 572e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 573e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public boolean getIccRecordsLoaded() { 574e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 575e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mIccRecords != null) { 576e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mIccRecords.getRecordsLoaded(); 577e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 578e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return false; 579e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 580e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 581e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 582e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private String getIccStateIntentString(State state) { 583e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka switch (state) { 584e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case ABSENT: return IccCardConstants.INTENT_VALUE_ICC_ABSENT; 585e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case PIN_REQUIRED: return IccCardConstants.INTENT_VALUE_ICC_LOCKED; 586e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case PUK_REQUIRED: return IccCardConstants.INTENT_VALUE_ICC_LOCKED; 587e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case NETWORK_LOCKED: return IccCardConstants.INTENT_VALUE_ICC_LOCKED; 588e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case READY: return IccCardConstants.INTENT_VALUE_ICC_READY; 589e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case NOT_READY: return IccCardConstants.INTENT_VALUE_ICC_NOT_READY; 590e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case PERM_DISABLED: return IccCardConstants.INTENT_VALUE_ICC_LOCKED; 591d4c858abee72a9c4935855b62418d2b306ceda4bAmit Mahajan case CARD_IO_ERROR: return IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR; 592aebb070ebfc2c858a5185b299654c6a85e33088cJunda Liu case CARD_RESTRICTED: return IccCardConstants.INTENT_VALUE_ICC_CARD_RESTRICTED; 593e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka default: return IccCardConstants.INTENT_VALUE_ICC_UNKNOWN; 594e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 595e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 596e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 597e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 598e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta * Locked state have a reason (PIN, PUK, NETWORK, PERM_DISABLED, CARD_IO_ERROR) 599e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @return reason 600e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 601e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private String getIccStateReason(State state) { 602e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka switch (state) { 603e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case PIN_REQUIRED: return IccCardConstants.INTENT_VALUE_LOCKED_ON_PIN; 604e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case PUK_REQUIRED: return IccCardConstants.INTENT_VALUE_LOCKED_ON_PUK; 605e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case NETWORK_LOCKED: return IccCardConstants.INTENT_VALUE_LOCKED_NETWORK; 606e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case PERM_DISABLED: return IccCardConstants.INTENT_VALUE_ABSENT_ON_PERM_DISABLED; 607e16ec244df35cec3ce69b513ee48e0906edf1999Sandeep Kunta case CARD_IO_ERROR: return IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR; 608aebb070ebfc2c858a5185b299654c6a85e33088cJunda Liu case CARD_RESTRICTED: return IccCardConstants.INTENT_VALUE_ICC_CARD_RESTRICTED; 609e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka default: return null; 610e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 611e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 612e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 613e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /* IccCard interface implementation */ 614e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 615e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public State getState() { 616e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 617e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mExternalState; 618e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 619e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 620e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 621e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 622e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public IccRecords getIccRecords() { 623e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 624e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mIccRecords; 625e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 626e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 627e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 628e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 629e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public IccFileHandler getIccFileHandler() { 630e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 631e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccApplication != null) { 632e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mUiccApplication.getIccFileHandler(); 633e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 634e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return null; 635e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 636e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 637e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 638e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 639e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Notifies handler of any transition into State.ABSENT 640e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 641e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 642e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void registerForAbsent(Handler h, int what, Object obj) { 643e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 644e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Registrant r = new Registrant (h, what, obj); 645e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 646e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAbsentRegistrants.add(r); 647e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 648e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (getState() == State.ABSENT) { 649e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka r.notifyRegistrant(); 650e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 651e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 652e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 653e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 654e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 655e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void unregisterForAbsent(Handler h) { 656e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 657e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAbsentRegistrants.remove(h); 658e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 659e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 660e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 661e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 662e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Notifies handler of any transition into State.NETWORK_LOCKED 663e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 664e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 665e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void registerForNetworkLocked(Handler h, int what, Object obj) { 666e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 667e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Registrant r = new Registrant (h, what, obj); 668e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 669e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mNetworkLockedRegistrants.add(r); 670e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 671e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (getState() == State.NETWORK_LOCKED) { 672e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka r.notifyRegistrant(); 673e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 674e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 675e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 676e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 677e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 678e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void unregisterForNetworkLocked(Handler h) { 679e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 680e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mNetworkLockedRegistrants.remove(h); 681e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 682e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 683e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 684e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 685e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Notifies handler of any transition into State.isPinLocked() 686e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 687e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 688e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void registerForLocked(Handler h, int what, Object obj) { 689e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 690e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Registrant r = new Registrant (h, what, obj); 691e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 692e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPinLockedRegistrants.add(r); 693e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 694e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (getState().isPinLocked()) { 695e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka r.notifyRegistrant(); 696e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 697e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 698e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 699e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 700e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 701e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void unregisterForLocked(Handler h) { 702e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 703e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPinLockedRegistrants.remove(h); 704e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 705e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 706e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 707e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 708e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void supplyPin(String pin, Message onComplete) { 709e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 710e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccApplication != null) { 711e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccApplication.supplyPin(pin, onComplete); 712e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (onComplete != null) { 713e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Exception e = new RuntimeException("ICC card is absent."); 714e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AsyncResult.forMessage(onComplete).exception = e; 715e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onComplete.sendToTarget(); 716e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 717e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 718e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 719e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 720e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 721e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 722e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void supplyPuk(String puk, String newPin, Message onComplete) { 723e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 724e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccApplication != null) { 725e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccApplication.supplyPuk(puk, newPin, onComplete); 726e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (onComplete != null) { 727e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Exception e = new RuntimeException("ICC card is absent."); 728e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AsyncResult.forMessage(onComplete).exception = e; 729e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onComplete.sendToTarget(); 730e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 731e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 732e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 733e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 734e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 735e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 736e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void supplyPin2(String pin2, Message onComplete) { 737e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 738e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccApplication != null) { 739e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccApplication.supplyPin2(pin2, onComplete); 740e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (onComplete != null) { 741e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Exception e = new RuntimeException("ICC card is absent."); 742e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AsyncResult.forMessage(onComplete).exception = e; 743e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onComplete.sendToTarget(); 744e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 745e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 746e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 747e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 748e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 749e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 750e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void supplyPuk2(String puk2, String newPin2, Message onComplete) { 751e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 752e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccApplication != null) { 753e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccApplication.supplyPuk2(puk2, newPin2, onComplete); 754e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (onComplete != null) { 755e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Exception e = new RuntimeException("ICC card is absent."); 756e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AsyncResult.forMessage(onComplete).exception = e; 757e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onComplete.sendToTarget(); 758e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 759e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 760e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 761e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 762e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 763e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 764e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void supplyNetworkDepersonalization(String pin, Message onComplete) { 765e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 766e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccApplication != null) { 767e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccApplication.supplyNetworkDepersonalization(pin, onComplete); 768e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (onComplete != null) { 769e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Exception e = new RuntimeException("CommandsInterface is not set."); 770e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AsyncResult.forMessage(onComplete).exception = e; 771e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onComplete.sendToTarget(); 772e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 773e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 774e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 775e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 776e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 777e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 778e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public boolean getIccLockEnabled() { 779e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 7803522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville /* defaults to false, if ICC is absent/deactivated */ 7813522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville Boolean retValue = mUiccApplication != null ? 7823522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville mUiccApplication.getIccLockEnabled() : false; 783e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return retValue; 784e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 785e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 786e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 787e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 788e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public boolean getIccFdnEnabled() { 789e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 7903522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville Boolean retValue = mUiccApplication != null ? 7913522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville mUiccApplication.getIccFdnEnabled() : false; 792e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return retValue; 793e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 794e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 795e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 7963522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville public boolean getIccFdnAvailable() { 7973522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville boolean retValue = mUiccApplication != null ? mUiccApplication.getIccFdnAvailable() : false; 7983522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville return retValue; 7993522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville } 8003522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville 8013522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville public boolean getIccPin2Blocked() { 8023522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville /* defaults to disabled */ 8033522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville Boolean retValue = mUiccApplication != null ? mUiccApplication.getIccPin2Blocked() : false; 8043522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville return retValue; 8053522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville } 8063522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville 8073522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville public boolean getIccPuk2Blocked() { 8083522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville /* defaults to disabled */ 8093522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville Boolean retValue = mUiccApplication != null ? mUiccApplication.getIccPuk2Blocked() : false; 8103522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville return retValue; 8113522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville } 8123522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville 813e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 814e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void setIccLockEnabled(boolean enabled, String password, Message onComplete) { 815e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 816e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccApplication != null) { 817e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccApplication.setIccLockEnabled(enabled, password, onComplete); 818e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (onComplete != null) { 819e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Exception e = new RuntimeException("ICC card is absent."); 820e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AsyncResult.forMessage(onComplete).exception = e; 821e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onComplete.sendToTarget(); 822e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 823e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 824e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 825e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 826e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 827e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 828e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void setIccFdnEnabled(boolean enabled, String password, Message onComplete) { 829e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 830e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccApplication != null) { 831e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccApplication.setIccFdnEnabled(enabled, password, onComplete); 832e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (onComplete != null) { 833e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Exception e = new RuntimeException("ICC card is absent."); 834e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AsyncResult.forMessage(onComplete).exception = e; 835e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onComplete.sendToTarget(); 836e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 837e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 838e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 839e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 840e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 841e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 842e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void changeIccLockPassword(String oldPassword, String newPassword, Message onComplete) { 843e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 844e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccApplication != null) { 845e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccApplication.changeIccLockPassword(oldPassword, newPassword, onComplete); 846e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (onComplete != null) { 847e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Exception e = new RuntimeException("ICC card is absent."); 848e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AsyncResult.forMessage(onComplete).exception = e; 849e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onComplete.sendToTarget(); 850e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 851e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 852e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 853e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 854e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 855e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 856e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void changeIccFdnPassword(String oldPassword, String newPassword, Message onComplete) { 857e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 858e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccApplication != null) { 859e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccApplication.changeIccFdnPassword(oldPassword, newPassword, onComplete); 860e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (onComplete != null) { 861e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Exception e = new RuntimeException("ICC card is absent."); 862e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AsyncResult.forMessage(onComplete).exception = e; 863e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onComplete.sendToTarget(); 864e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 865e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 866e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 867e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 868e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 869e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 870e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public String getServiceProviderName() { 871e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 872e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mIccRecords != null) { 873e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mIccRecords.getServiceProviderName(); 874e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 875e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return null; 876e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 877e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 878e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 879e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 880e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public boolean isApplicationOnIcc(IccCardApplicationStatus.AppType type) { 881e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 882e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Boolean retValue = mUiccCard != null ? mUiccCard.isApplicationOnIcc(type) : false; 883e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return retValue; 884e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 885e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 886e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 887e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 888e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public boolean hasIccCard() { 889e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 890e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccCard != null && mUiccCard.getCardState() != CardState.CARDSTATE_ABSENT) { 891e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return true; 892e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 893e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return false; 894e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 895e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 896e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 897062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal private void setSystemProperty(String property, String value) { 898062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal TelephonyManager.setTelephonyProperty(mPhoneId, property, value); 899a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 900a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 90156dbbcf63e9991ee83945fd10661190d917f700axinhe public IccRecords getIccRecord() { 90256dbbcf63e9991ee83945fd10661190d917f700axinhe return mIccRecords; 90356dbbcf63e9991ee83945fd10661190d917f700axinhe } 904e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void log(String s) { 905ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, s); 906e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 907e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 908e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void loge(String msg) { 909ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.e(LOG_TAG, msg); 910e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 91105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka 91205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 91305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println("IccCardProxy: " + this); 91405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mContext=" + mContext); 91505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mCi=" + mCi); 91605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mAbsentRegistrants: size=" + mAbsentRegistrants.size()); 91705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka for (int i = 0; i < mAbsentRegistrants.size(); i++) { 91805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mAbsentRegistrants[" + i + "]=" 91905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka + ((Registrant)mAbsentRegistrants.get(i)).getHandler()); 92005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 92105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mPinLockedRegistrants: size=" + mPinLockedRegistrants.size()); 92205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka for (int i = 0; i < mPinLockedRegistrants.size(); i++) { 92305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mPinLockedRegistrants[" + i + "]=" 92405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka + ((Registrant)mPinLockedRegistrants.get(i)).getHandler()); 92505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 92605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mNetworkLockedRegistrants: size=" + mNetworkLockedRegistrants.size()); 92705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka for (int i = 0; i < mNetworkLockedRegistrants.size(); i++) { 92805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mNetworkLockedRegistrants[" + i + "]=" 92905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka + ((Registrant)mNetworkLockedRegistrants.get(i)).getHandler()); 93005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 93105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mCurrentAppType=" + mCurrentAppType); 93205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mUiccController=" + mUiccController); 93305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mUiccCard=" + mUiccCard); 93405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mUiccApplication=" + mUiccApplication); 93505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mIccRecords=" + mIccRecords); 93605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mCdmaSSM=" + mCdmaSSM); 93705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mRadioOn=" + mRadioOn); 93805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mQuietMode=" + mQuietMode); 93905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mInitialized=" + mInitialized); 94005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mExternalState=" + mExternalState); 94105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka 94205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.flush(); 94305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 944e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka} 945