1e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka/* 2e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Copyright (C) 2006, 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 android.content.Context; 20e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.AsyncResult; 21e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.Handler; 22e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.Message; 23e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.Registrant; 24e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.RegistrantList; 25ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog; 26e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 27d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.CommandsInterface; 28d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState; 29d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType; 30d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState; 31d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardStatus.PinState; 32e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 3305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.FileDescriptor; 3405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.PrintWriter; 3505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka 36e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka/** 37e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * {@hide} 38e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 39e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkapublic class UiccCardApplication { 40cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private static final String LOG_TAG = "UiccCardApplication"; 41e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final boolean DBG = true; 42e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 433522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville private static final int EVENT_PIN1_PUK1_DONE = 1; 443522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville private static final int EVENT_CHANGE_PIN1_DONE = 2; 453522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville private static final int EVENT_CHANGE_PIN2_DONE = 3; 463522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville private static final int EVENT_QUERY_FACILITY_FDN_DONE = 4; 473522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville private static final int EVENT_CHANGE_FACILITY_FDN_DONE = 5; 483522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville private static final int EVENT_QUERY_FACILITY_LOCK_DONE = 6; 493522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville private static final int EVENT_CHANGE_FACILITY_LOCK_DONE = 7; 503522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville private static final int EVENT_PIN2_PUK2_DONE = 8; 51e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 52e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private final Object mLock = new Object(); 53e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private UiccCard mUiccCard; //parent 54e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private AppState mAppState; 55e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private AppType mAppType; 56e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private PersoSubState mPersoSubState; 57e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private String mAid; 58e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private String mAppLabel; 59e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private boolean mPin1Replaced; 60e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private PinState mPin1State; 61e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private PinState mPin2State; 62e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private boolean mIccFdnEnabled; 63e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private boolean mDesiredFdnEnabled; 64e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private boolean mIccLockEnabled; 65e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private boolean mDesiredPinLocked; 663522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville private boolean mIccFdnAvailable = true; // Default is enabled. 67e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 68e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private CommandsInterface mCi; 69e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private Context mContext; 70e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private IccRecords mIccRecords; 71e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private IccFileHandler mIccFh; 72e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 73e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private boolean mDestroyed;//set to true once this App is commanded to be disposed of. 74e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 75e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private RegistrantList mReadyRegistrants = new RegistrantList(); 76e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private RegistrantList mPinLockedRegistrants = new RegistrantList(); 77e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private RegistrantList mNetworkLockedRegistrants = new RegistrantList(); 78e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 79e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka UiccCardApplication(UiccCard uiccCard, 80e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka IccCardApplicationStatus as, 81e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Context c, 82e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface ci) { 83e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Creating UiccApp: " + as); 84e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccCard = uiccCard; 85e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAppState = as.app_state; 86e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAppType = as.app_type; 87e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPersoSubState = as.perso_substate; 88e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAid = as.aid; 89e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAppLabel = as.app_label; 90e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin1Replaced = (as.pin1_replaced != 0); 91e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin1State = as.pin1; 92e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin2State = as.pin2; 93e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 94e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mContext = c; 95e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi = ci; 96e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 97e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccFh = createIccFileHandler(as.app_type); 98e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccRecords = createIccRecords(as.app_type, mContext, mCi); 99e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mAppState == AppState.APPSTATE_READY) { 100e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka queryFdn(); 101e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka queryPin1State(); 102e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 103e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 104e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 105e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka void update (IccCardApplicationStatus as, Context c, CommandsInterface ci) { 106e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 107e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mDestroyed) { 108e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Application updated after destroyed! Fix me!"); 109e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 110e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 111e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 112e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log(mAppType + " update. New " + as); 113e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mContext = c; 114e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi = ci; 115e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AppType oldAppType = mAppType; 116e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AppState oldAppState = mAppState; 117e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka PersoSubState oldPersoSubState = mPersoSubState; 118e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAppType = as.app_type; 119e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAppState = as.app_state; 120e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPersoSubState = as.perso_substate; 121e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAid = as.aid; 122e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAppLabel = as.app_label; 123e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin1Replaced = (as.pin1_replaced != 0); 124e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin1State = as.pin1; 125e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin2State = as.pin2; 126e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 127e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mAppType != oldAppType) { 128f48d70f5336408e7910c4868b8ede5db8354727aAlex Yakavenka if (mIccFh != null) { mIccFh.dispose();} 129f48d70f5336408e7910c4868b8ede5db8354727aAlex Yakavenka if (mIccRecords != null) { mIccRecords.dispose();} 130e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccFh = createIccFileHandler(as.app_type); 131e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccRecords = createIccRecords(as.app_type, c, ci); 132e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 133e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 134e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mPersoSubState != oldPersoSubState && 135e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPersoSubState == PersoSubState.PERSOSUBSTATE_SIM_NETWORK) { 136e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka notifyNetworkLockedRegistrantsIfNeeded(null); 137e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 138e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 139e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mAppState != oldAppState) { 140e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log(oldAppType + " changed state: " + oldAppState + " -> " + mAppState); 141e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // If the app state turns to APPSTATE_READY, then query FDN status, 142e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka //as it might have failed in earlier attempt. 143e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mAppState == AppState.APPSTATE_READY) { 144e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka queryFdn(); 145e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka queryPin1State(); 146e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 147e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka notifyPinLockedRegistrantsIfNeeded(null); 148e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka notifyReadyRegistrantsIfNeeded(null); 149e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 150e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 151e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 152e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 153e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka void dispose() { 154e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 155e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log(mAppType + " being Disposed"); 156e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mDestroyed = true; 157e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mIccRecords != null) { mIccRecords.dispose();} 158e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mIccFh != null) { mIccFh.dispose();} 159e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccRecords = null; 160e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccFh = null; 161e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 162e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 163e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 164e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private IccRecords createIccRecords(AppType type, Context c, CommandsInterface ci) { 165e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (type == AppType.APPTYPE_USIM || type == AppType.APPTYPE_SIM) { 166e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return new SIMRecords(this, c, ci); 167e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (type == AppType.APPTYPE_RUIM || type == AppType.APPTYPE_CSIM){ 168e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return new RuimRecords(this, c, ci); 169e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (type == AppType.APPTYPE_ISIM) { 170e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return new IsimUiccRecords(this, c, ci); 171e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 172e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Unknown app type (maybe detection is still in progress) 173e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return null; 174e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 175e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 176e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 177e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private IccFileHandler createIccFileHandler(AppType type) { 178e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka switch (type) { 179e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case APPTYPE_SIM: 180e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return new SIMFileHandler(this, mAid, mCi); 181e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case APPTYPE_RUIM: 182e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return new RuimFileHandler(this, mAid, mCi); 183e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case APPTYPE_USIM: 184e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return new UsimFileHandler(this, mAid, mCi); 185e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case APPTYPE_CSIM: 186e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return new CsimFileHandler(this, mAid, mCi); 187e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case APPTYPE_ISIM: 188e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return new IsimFileHandler(this, mAid, mCi); 189e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka default: 190e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return null; 191e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 192e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 193e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 194e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** Assumes mLock is held. */ 195e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void queryFdn() { 196e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka //This shouldn't change run-time. So needs to be called only once. 197e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int serviceClassX; 198e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 199e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka serviceClassX = CommandsInterface.SERVICE_CLASS_VOICE + 200e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_DATA + 201e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_FAX; 202e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.queryFacilityLockForApp ( 203e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.CB_FACILITY_BA_FD, "", serviceClassX, 204e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAid, mHandler.obtainMessage(EVENT_QUERY_FACILITY_FDN_DONE)); 205e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 206e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 207e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Interpret EVENT_QUERY_FACILITY_LOCK_DONE 208e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param ar is asyncResult of Query_Facility_Locked 209e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 210e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void onQueryFdnEnabled(AsyncResult ar) { 211e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 212e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (ar.exception != null) { 213e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Error in querying facility lock:" + ar.exception); 214e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 215e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 216e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 2173522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville int[] result = (int[])ar.result; 2183522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville if(result.length != 0) { 2193522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville //0 - Available & Disabled, 1-Available & Enabled, 2-Unavailable. 2203522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville if (result[0] == 2) { 2213522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville mIccFdnEnabled = false; 2223522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville mIccFdnAvailable = false; 2233522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville } else { 2243522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville mIccFdnEnabled = (result[0] == 1) ? true : false; 2253522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville mIccFdnAvailable = true; 2263522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville } 2273522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville log("Query facility FDN : FDN service available: "+ mIccFdnAvailable 2283522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville +" enabled: " + mIccFdnEnabled); 229e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 230e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Bogus facility lock response"); 231e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 232e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 233e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 234e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 235e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void onChangeFdnDone(AsyncResult ar) { 236e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 2373522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville int attemptsRemaining = -1; 2383522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville 239e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (ar.exception == null) { 240e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccFdnEnabled = mDesiredFdnEnabled; 241e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("EVENT_CHANGE_FACILITY_FDN_DONE: " + 242e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka "mIccFdnEnabled=" + mIccFdnEnabled); 243e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 2443522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville attemptsRemaining = parsePinPukErrorResult(ar); 245e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Error change facility fdn with exception " + ar.exception); 246e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 247e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Message response = (Message)ar.userObj; 2483522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville response.arg1 = attemptsRemaining; 249e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AsyncResult.forMessage(response).exception = ar.exception; 250e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka response.sendToTarget(); 251e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 252e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 253e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 254e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** REMOVE when mIccLockEnabled is not needed, assumes mLock is held */ 255e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void queryPin1State() { 256e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int serviceClassX = CommandsInterface.SERVICE_CLASS_VOICE + 257e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_DATA + 258e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_FAX; 259e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.queryFacilityLockForApp ( 260e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.CB_FACILITY_BA_SIM, "", serviceClassX, 261e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAid, mHandler.obtainMessage(EVENT_QUERY_FACILITY_LOCK_DONE)); 262e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 263e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 264e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** REMOVE when mIccLockEnabled is not needed*/ 265e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void onQueryFacilityLock(AsyncResult ar) { 266e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 267e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if(ar.exception != null) { 268e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Error in querying facility lock:" + ar.exception); 269e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 270e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 271e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 272e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int[] ints = (int[])ar.result; 273e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if(ints.length != 0) { 274e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Query facility lock : " + ints[0]); 275e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 276e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccLockEnabled = (ints[0] != 0); 277e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 278e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mIccLockEnabled) { 279e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPinLockedRegistrants.notifyRegistrants(); 280e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 281e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 282e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Sanity check: we expect mPin1State to match mIccLockEnabled. 283e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // When mPin1State is DISABLED mIccLockEanbled should be false. 284e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // When mPin1State is ENABLED mIccLockEnabled should be true. 285e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // 286e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Here we validate these assumptions to assist in identifying which ril/radio's 287e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // have not correctly implemented GET_SIM_STATUS 288e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka switch (mPin1State) { 289e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case PINSTATE_DISABLED: 290e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mIccLockEnabled) { 291e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("QUERY_FACILITY_LOCK:enabled GET_SIM_STATUS.Pin1:disabled." 292e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka + " Fixme"); 293e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 294e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 295e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case PINSTATE_ENABLED_NOT_VERIFIED: 296e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case PINSTATE_ENABLED_VERIFIED: 297e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case PINSTATE_ENABLED_BLOCKED: 298e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case PINSTATE_ENABLED_PERM_BLOCKED: 299e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (!mIccLockEnabled) { 300e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("QUERY_FACILITY_LOCK:disabled GET_SIM_STATUS.Pin1:enabled." 301e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka + " Fixme"); 302e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 303cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville case PINSTATE_UNKNOWN: 304cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville default: 305cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) log("Ignoring: pin1state=" + mPin1State); 306cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville break; 307e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 308e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 309e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Bogus facility lock response"); 310e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 311e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 312e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 313e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 314e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** REMOVE when mIccLockEnabled is not needed */ 315e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void onChangeFacilityLock(AsyncResult ar) { 316e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 3173522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville int attemptsRemaining = -1; 3183522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville 319e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (ar.exception == null) { 320e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccLockEnabled = mDesiredPinLocked; 321e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log( "EVENT_CHANGE_FACILITY_LOCK_DONE: mIccLockEnabled= " 322e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka + mIccLockEnabled); 323e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 3243522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville attemptsRemaining = parsePinPukErrorResult(ar); 325e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Error change facility lock with exception " + ar.exception); 326e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 3273522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville Message response = (Message)ar.userObj; 3283522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville AsyncResult.forMessage(response).exception = ar.exception; 3293522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville response.arg1 = attemptsRemaining; 3303522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville response.sendToTarget(); 3313522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville } 3323522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville } 3333522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville 3343522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville /** 3353522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * Parse the error response to obtain number of attempts remaining 3363522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville */ 3373522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville private int parsePinPukErrorResult(AsyncResult ar) { 3383522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville int[] result = (int[]) ar.result; 3393522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville if (result == null) { 3403522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville return -1; 3413522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville } else { 3423522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville int length = result.length; 3433522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville int attemptsRemaining = -1; 3443522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville if (length > 0) { 3453522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville attemptsRemaining = result[0]; 3463522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville } 3473522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville log("parsePinPukErrorResult: attemptsRemaining=" + attemptsRemaining); 3483522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville return attemptsRemaining; 349e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 350e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 351e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 352e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private Handler mHandler = new Handler() { 353e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 354e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void handleMessage(Message msg){ 355e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AsyncResult ar; 356e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 357e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mDestroyed) { 358e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Received message " + msg + "[" + msg.what 359e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka + "] while being destroyed. Ignoring."); 360e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 361e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 362e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 363e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka switch (msg.what) { 3643522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville case EVENT_PIN1_PUK1_DONE: 3653522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville case EVENT_PIN2_PUK2_DONE: 3663522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville case EVENT_CHANGE_PIN1_DONE: 3673522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville case EVENT_CHANGE_PIN2_DONE: 3683522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville // a PIN/PUK/PIN2/PUK2 complete 3693522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville // request has completed. ar.userObj is the response Message 3703522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville int attemptsRemaining = -1; 3713522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville ar = (AsyncResult)msg.obj; 3723522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville if ((ar.exception != null) && (ar.result != null)) { 3733522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville attemptsRemaining = parsePinPukErrorResult(ar); 3743522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville } 3753522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville Message response = (Message)ar.userObj; 3763522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville AsyncResult.forMessage(response).exception = ar.exception; 3773522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville response.arg1 = attemptsRemaining; 3783522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville response.sendToTarget(); 3793522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville break; 380e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_QUERY_FACILITY_FDN_DONE: 381e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ar = (AsyncResult)msg.obj; 382e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onQueryFdnEnabled(ar); 383e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 384e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_CHANGE_FACILITY_FDN_DONE: 385e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ar = (AsyncResult)msg.obj; 386e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onChangeFdnDone(ar); 387e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 388e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_QUERY_FACILITY_LOCK_DONE: 389e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ar = (AsyncResult)msg.obj; 390e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onQueryFacilityLock(ar); 391e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 392e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_CHANGE_FACILITY_LOCK_DONE: 393e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ar = (AsyncResult)msg.obj; 394e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onChangeFacilityLock(ar); 395e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 396e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka default: 397e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Unknown Event " + msg.what); 398e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 399e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 400e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka }; 401e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 402e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void registerForReady(Handler h, int what, Object obj) { 403e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 404e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Registrant r = new Registrant (h, what, obj); 405e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mReadyRegistrants.add(r); 406e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka notifyReadyRegistrantsIfNeeded(r); 407e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 408e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 409e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 410e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void unregisterForReady(Handler h) { 411e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 412e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mReadyRegistrants.remove(h); 413e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 414e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 415e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 416e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 417e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Notifies handler of any transition into State.isPinLocked() 418e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 419e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void registerForLocked(Handler h, int what, Object obj) { 420e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 421e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Registrant r = new Registrant (h, what, obj); 422e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPinLockedRegistrants.add(r); 423e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka notifyPinLockedRegistrantsIfNeeded(r); 424e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 425e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 426e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 427e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void unregisterForLocked(Handler h) { 428e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 429e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPinLockedRegistrants.remove(h); 430e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 431e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 432e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 433e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 434e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Notifies handler of any transition into State.NETWORK_LOCKED 435e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 436e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void registerForNetworkLocked(Handler h, int what, Object obj) { 437e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 438e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Registrant r = new Registrant (h, what, obj); 439e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mNetworkLockedRegistrants.add(r); 440e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka notifyNetworkLockedRegistrantsIfNeeded(r); 441e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 442e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 443e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 444e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void unregisterForNetworkLocked(Handler h) { 445e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 446e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mNetworkLockedRegistrants.remove(h); 447e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 448e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 449e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 450e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 451e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Notifies specified registrant, assume mLock is held. 452e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 453e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param r Registrant to be notified. If null - all registrants will be notified 454e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 455e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void notifyReadyRegistrantsIfNeeded(Registrant r) { 456e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mDestroyed) { 457e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 458e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 459e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mAppState == AppState.APPSTATE_READY) { 460e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mPin1State == PinState.PINSTATE_ENABLED_NOT_VERIFIED || 461e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin1State == PinState.PINSTATE_ENABLED_BLOCKED || 462e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin1State == PinState.PINSTATE_ENABLED_PERM_BLOCKED) { 463e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Sanity check failed! APPSTATE is ready while PIN1 is not verified!!!"); 464e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Don't notify if application is in insane state 465e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 466e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 467e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (r == null) { 468e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Notifying registrants: READY"); 469e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mReadyRegistrants.notifyRegistrants(); 470e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 471e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Notifying 1 registrant: READY"); 472e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka r.notifyRegistrant(new AsyncResult(null, null, null)); 473e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 474e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 475e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 476e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 477e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 478e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Notifies specified registrant, assume mLock is held. 479e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 480e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param r Registrant to be notified. If null - all registrants will be notified 481e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 482e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void notifyPinLockedRegistrantsIfNeeded(Registrant r) { 483e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mDestroyed) { 484e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 485e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 486e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 487e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mAppState == AppState.APPSTATE_PIN || 488e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAppState == AppState.APPSTATE_PUK) { 489e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mPin1State == PinState.PINSTATE_ENABLED_VERIFIED || 490e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin1State == PinState.PINSTATE_DISABLED) { 491e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Sanity check failed! APPSTATE is locked while PIN1 is not!!!"); 492e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka //Don't notify if application is in insane state 493e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 494e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 495e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (r == null) { 496e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Notifying registrants: LOCKED"); 497e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPinLockedRegistrants.notifyRegistrants(); 498e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 499e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Notifying 1 registrant: LOCKED"); 500e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka r.notifyRegistrant(new AsyncResult(null, null, null)); 501e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 502e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 503e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 504e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 505e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 506e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Notifies specified registrant, assume mLock is held. 507e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 508e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param r Registrant to be notified. If null - all registrants will be notified 509e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 510e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void notifyNetworkLockedRegistrantsIfNeeded(Registrant r) { 511e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mDestroyed) { 512e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 513e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 514e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 515e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mAppState == AppState.APPSTATE_SUBSCRIPTION_PERSO && 516e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPersoSubState == PersoSubState.PERSOSUBSTATE_SIM_NETWORK) { 517e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (r == null) { 518e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Notifying registrants: NETWORK_LOCKED"); 519e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mNetworkLockedRegistrants.notifyRegistrants(); 520e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 521e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Notifying 1 registrant: NETWORK_LOCED"); 522e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka r.notifyRegistrant(new AsyncResult(null, null, null)); 523e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 524e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 525e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 526e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 527e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public AppState getState() { 528e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 529e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mAppState; 530e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 531e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 532e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 533e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public AppType getType() { 534e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 535e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mAppType; 536e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 537e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 538e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 539e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public PersoSubState getPersoSubState() { 540e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 541e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mPersoSubState; 542e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 543e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 544e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 545e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public String getAid() { 546e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 547e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mAid; 548e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 549e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 550e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 551e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public PinState getPin1State() { 552e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 553e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mPin1Replaced) { 554e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mUiccCard.getUniversalPinState(); 555e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 556e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mPin1State; 557e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 558e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 559e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 560e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public IccFileHandler getIccFileHandler() { 561e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 562e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mIccFh; 563e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 564e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 565e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 566e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public IccRecords getIccRecords() { 567e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 568e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mIccRecords; 569e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 570e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 571e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 572e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 573e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Supply the ICC PIN to the ICC 574e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 575e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * When the operation is complete, onComplete will be sent to its 576e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Handler. 577e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 578e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * onComplete.obj will be an AsyncResult 5793522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * onComplete.arg1 = remaining attempts before puk locked or -1 if unknown 580e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 581e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception == null on success 582e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception != null on fail 583e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 584e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * If the supplied PIN is incorrect: 585e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception != null 586e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * && ((AsyncResult)onComplete.obj).exception 587e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * instanceof com.android.internal.telephony.gsm.CommandException) 588e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * && ((CommandException)(((AsyncResult)onComplete.obj).exception)) 589e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * .getCommandError() == CommandException.Error.PASSWORD_INCORRECT 590e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 591e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void supplyPin (String pin, Message onComplete) { 592e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 5933522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville mCi.supplyIccPinForApp(pin, mAid, mHandler.obtainMessage(EVENT_PIN1_PUK1_DONE, 5943522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville onComplete)); 595e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 596e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 597e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 5983522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville /** 5993522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * Supply the ICC PUK to the ICC 6003522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * 6013522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * When the operation is complete, onComplete will be sent to its 6023522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * Handler. 6033522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * 6043522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * onComplete.obj will be an AsyncResult 6053522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * onComplete.arg1 = remaining attempts before Icc will be permanently unusable 6063522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * or -1 if unknown 6073522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * 6083522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * ((AsyncResult)onComplete.obj).exception == null on success 6093522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * ((AsyncResult)onComplete.obj).exception != null on fail 6103522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * 6113522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * If the supplied PIN is incorrect: 6123522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * ((AsyncResult)onComplete.obj).exception != null 6133522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * && ((AsyncResult)onComplete.obj).exception 6143522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * instanceof com.android.internal.telephony.gsm.CommandException) 6153522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * && ((CommandException)(((AsyncResult)onComplete.obj).exception)) 6163522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * .getCommandError() == CommandException.Error.PASSWORD_INCORRECT 6173522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * 6183522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * 6193522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville */ 620e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void supplyPuk (String puk, String newPin, Message onComplete) { 621e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 6223522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville mCi.supplyIccPukForApp(puk, newPin, mAid, 6233522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville mHandler.obtainMessage(EVENT_PIN1_PUK1_DONE, onComplete)); 624e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 625e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 626e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 627e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void supplyPin2 (String pin2, Message onComplete) { 628e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 6293522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville mCi.supplyIccPin2ForApp(pin2, mAid, 6303522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville mHandler.obtainMessage(EVENT_PIN2_PUK2_DONE, onComplete)); 631e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 632e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 633e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 634e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void supplyPuk2 (String puk2, String newPin2, Message onComplete) { 635e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 6363522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville mCi.supplyIccPuk2ForApp(puk2, newPin2, mAid, 6373522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville mHandler.obtainMessage(EVENT_PIN2_PUK2_DONE, onComplete)); 638e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 639e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 640e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 641e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void supplyNetworkDepersonalization (String pin, Message onComplete) { 642e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 643e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("supplyNetworkDepersonalization"); 644e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.supplyNetworkDepersonalization(pin, onComplete); 645e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 646e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 647e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 648e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 649e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Check whether ICC pin lock is enabled 650e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * This is a sync call which returns the cached pin enabled state 651e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 652e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @return true for ICC locked enabled 653e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * false for ICC locked disabled 654e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 655e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public boolean getIccLockEnabled() { 656e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mIccLockEnabled; 657e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /* STOPSHIP: Remove line above and all code associated with setting 658e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccLockEanbled once all RIL correctly sends the pin1 state. 659e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Use getPin1State to take into account pin1Replaced flag 660e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka PinState pinState = getPin1State(); 661e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return pinState == PinState.PINSTATE_ENABLED_NOT_VERIFIED || 662e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka pinState == PinState.PINSTATE_ENABLED_VERIFIED || 663e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka pinState == PinState.PINSTATE_ENABLED_BLOCKED || 664e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka pinState == PinState.PINSTATE_ENABLED_PERM_BLOCKED;*/ 665e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 666e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 667e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 668e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Check whether ICC fdn (fixed dialing number) is enabled 669e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * This is a sync call which returns the cached pin enabled state 670e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 671e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @return true for ICC fdn enabled 672e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * false for ICC fdn disabled 673e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 674e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public boolean getIccFdnEnabled() { 675e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 676e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mIccFdnEnabled; 677e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 678e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 679e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 680e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 6813522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * Check whether fdn (fixed dialing number) service is available. 6823522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * @return true if ICC fdn service available 6833522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * false if ICC fdn service not available 6843522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville */ 6853522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville public boolean getIccFdnAvailable() { 6863522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville return mIccFdnAvailable; 6873522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville } 6883522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville 6893522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville /** 690e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Set the ICC pin lock enabled or disabled 691e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * When the operation is complete, onComplete will be sent to its handler 692e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 693e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param enabled "true" for locked "false" for unlocked. 694e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param password needed to change the ICC pin state, aka. Pin1 695e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param onComplete 696e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * onComplete.obj will be an AsyncResult 697e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception == null on success 698e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception != null on fail 699e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 700e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void setIccLockEnabled (boolean enabled, 701e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka String password, Message onComplete) { 702e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 703e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int serviceClassX; 704e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka serviceClassX = CommandsInterface.SERVICE_CLASS_VOICE + 705e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_DATA + 706e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_FAX; 707e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 708e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mDesiredPinLocked = enabled; 709e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 710e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.setFacilityLockForApp(CommandsInterface.CB_FACILITY_BA_SIM, 711e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka enabled, password, serviceClassX, mAid, 712e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mHandler.obtainMessage(EVENT_CHANGE_FACILITY_LOCK_DONE, onComplete)); 713e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 714e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 715e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 716e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 717e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Set the ICC fdn enabled or disabled 718e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * When the operation is complete, onComplete will be sent to its handler 719e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 720e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param enabled "true" for locked "false" for unlocked. 721e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param password needed to change the ICC fdn enable, aka Pin2 722e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param onComplete 723e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * onComplete.obj will be an AsyncResult 724e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception == null on success 725e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception != null on fail 726e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 727e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void setIccFdnEnabled (boolean enabled, 728e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka String password, Message onComplete) { 729e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 730e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int serviceClassX; 731e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka serviceClassX = CommandsInterface.SERVICE_CLASS_VOICE + 732e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_DATA + 733e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_FAX + 734e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_SMS; 735e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 736e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mDesiredFdnEnabled = enabled; 737e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 738e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.setFacilityLockForApp(CommandsInterface.CB_FACILITY_BA_FD, 739e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka enabled, password, serviceClassX, mAid, 740e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mHandler.obtainMessage(EVENT_CHANGE_FACILITY_FDN_DONE, onComplete)); 741e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 742e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 743e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 744e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 745e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Change the ICC password used in ICC pin lock 746e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * When the operation is complete, onComplete will be sent to its handler 747e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 748e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param oldPassword is the old password 749e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param newPassword is the new password 750e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param onComplete 751e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * onComplete.obj will be an AsyncResult 7523522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * onComplete.arg1 = attempts remaining or -1 if unknown 753e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception == null on success 754e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception != null on fail 755e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 756e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void changeIccLockPassword(String oldPassword, String newPassword, 757e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Message onComplete) { 758e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 759e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("changeIccLockPassword"); 760e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.changeIccPinForApp(oldPassword, newPassword, mAid, 7613522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville mHandler.obtainMessage(EVENT_CHANGE_PIN1_DONE, onComplete)); 762e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 763e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 764e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 765e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 766e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Change the ICC password used in ICC fdn enable 767e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * When the operation is complete, onComplete will be sent to its handler 768e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 769e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param oldPassword is the old password 770e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param newPassword is the new password 771e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param onComplete 772e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * onComplete.obj will be an AsyncResult 773e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception == null on success 774e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception != null on fail 775e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 776e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void changeIccFdnPassword(String oldPassword, String newPassword, 777e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Message onComplete) { 778e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 779e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("changeIccFdnPassword"); 780e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.changeIccPin2ForApp(oldPassword, newPassword, mAid, 7813522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville mHandler.obtainMessage(EVENT_CHANGE_PIN2_DONE, onComplete)); 7823522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville } 7833522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville } 7843522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville 7853522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville /** 7863522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * @return true if ICC card is PIN2 blocked 7873522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville */ 7883522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville public boolean getIccPin2Blocked() { 7893522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville synchronized (mLock) { 7903522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville return mPin2State == PinState.PINSTATE_ENABLED_BLOCKED; 7913522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville } 7923522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville } 7933522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville 7943522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville /** 7953522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville * @return true if ICC card is PUK2 blocked 7963522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville */ 7973522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville public boolean getIccPuk2Blocked() { 7983522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville synchronized (mLock) { 7993522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville return mPin2State == PinState.PINSTATE_ENABLED_PERM_BLOCKED; 800e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 801e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 802e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 803e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void log(String msg) { 804ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, msg); 805e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 806e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 807e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void loge(String msg) { 808ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.e(LOG_TAG, msg); 809e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 81005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka 81105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 81205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println("UiccCardApplication: " + this); 81305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mUiccCard=" + mUiccCard); 81405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mAppState=" + mAppState); 81505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mAppType=" + mAppType); 81605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mPersoSubState=" + mPersoSubState); 81705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mAid=" + mAid); 81805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mAppLabel=" + mAppLabel); 81905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mPin1Replaced=" + mPin1Replaced); 82005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mPin1State=" + mPin1State); 82105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mPin2State=" + mPin2State); 82205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mIccFdnEnabled=" + mIccFdnEnabled); 82305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mDesiredFdnEnabled=" + mDesiredFdnEnabled); 82405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mIccLockEnabled=" + mIccLockEnabled); 82505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mDesiredPinLocked=" + mDesiredPinLocked); 82605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mCi=" + mCi); 82705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mIccRecords=" + mIccRecords); 82805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mIccFh=" + mIccFh); 82905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mDestroyed=" + mDestroyed); 83005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mReadyRegistrants: size=" + mReadyRegistrants.size()); 83105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka for (int i = 0; i < mReadyRegistrants.size(); i++) { 83205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mReadyRegistrants[" + i + "]=" 83305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka + ((Registrant)mReadyRegistrants.get(i)).getHandler()); 83405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 83505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mPinLockedRegistrants: size=" + mPinLockedRegistrants.size()); 83605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka for (int i = 0; i < mPinLockedRegistrants.size(); i++) { 83705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mPinLockedRegistrants[" + i + "]=" 83805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka + ((Registrant)mPinLockedRegistrants.get(i)).getHandler()); 83905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 84005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mNetworkLockedRegistrants: size=" + mNetworkLockedRegistrants.size()); 84105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka for (int i = 0; i < mNetworkLockedRegistrants.size(); i++) { 84205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mNetworkLockedRegistrants[" + i + "]=" 84305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka + ((Registrant)mNetworkLockedRegistrants.get(i)).getHandler()); 84405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 84505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.flush(); 84605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 847e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka} 848