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 17e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkapackage com.android.internal.telephony; 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; 25e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.util.Log; 26e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 27e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.IccCardApplicationStatus.AppState; 28e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.IccCardApplicationStatus.AppType; 29e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.IccCardApplicationStatus.PersoSubState; 30e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.IccCardStatus.PinState; 31e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.cdma.RuimFileHandler; 32e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.cdma.RuimRecords; 33e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.gsm.SIMFileHandler; 34e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.gsm.SIMRecords; 35e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.ims.IsimFileHandler; 36e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.ims.IsimUiccRecords; 37e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 38e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka/** 39e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * {@hide} 40e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 41e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkapublic class UiccCardApplication { 42e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final String LOG_TAG = "RIL_UiccCardApplication"; 43e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final boolean DBG = true; 44e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 45e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_QUERY_FACILITY_FDN_DONE = 1; 46e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_CHANGE_FACILITY_FDN_DONE = 2; 47e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_QUERY_FACILITY_LOCK_DONE = 3; 48e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_CHANGE_FACILITY_LOCK_DONE = 4; 49e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 50e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private final Object mLock = new Object(); 51e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private UiccCard mUiccCard; //parent 52e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private AppState mAppState; 53e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private AppType mAppType; 54e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private PersoSubState mPersoSubState; 55e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private String mAid; 56e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private String mAppLabel; 57e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private boolean mPin1Replaced; 58e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private PinState mPin1State; 59e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private PinState mPin2State; 60e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private boolean mIccFdnEnabled; 61e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private boolean mDesiredFdnEnabled; 62e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private boolean mIccLockEnabled; 63e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private boolean mDesiredPinLocked; 64e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 65e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private CommandsInterface mCi; 66e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private Context mContext; 67e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private IccRecords mIccRecords; 68e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private IccFileHandler mIccFh; 69e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 70e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private boolean mDestroyed;//set to true once this App is commanded to be disposed of. 71e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 72e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private RegistrantList mReadyRegistrants = new RegistrantList(); 73e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private RegistrantList mPinLockedRegistrants = new RegistrantList(); 74e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private RegistrantList mNetworkLockedRegistrants = new RegistrantList(); 75e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 76e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka UiccCardApplication(UiccCard uiccCard, 77e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka IccCardApplicationStatus as, 78e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Context c, 79e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface ci) { 80e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Creating UiccApp: " + as); 81e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccCard = uiccCard; 82e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAppState = as.app_state; 83e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAppType = as.app_type; 84e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPersoSubState = as.perso_substate; 85e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAid = as.aid; 86e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAppLabel = as.app_label; 87e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin1Replaced = (as.pin1_replaced != 0); 88e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin1State = as.pin1; 89e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin2State = as.pin2; 90e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 91e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mContext = c; 92e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi = ci; 93e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 94e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccFh = createIccFileHandler(as.app_type); 95e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccRecords = createIccRecords(as.app_type, mContext, mCi); 96e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mAppState == AppState.APPSTATE_READY) { 97e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka queryFdn(); 98e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka queryPin1State(); 99e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 100e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 101e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 102e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka void update (IccCardApplicationStatus as, Context c, CommandsInterface ci) { 103e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 104e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mDestroyed) { 105e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Application updated after destroyed! Fix me!"); 106e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 107e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 108e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 109e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log(mAppType + " update. New " + as); 110e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mContext = c; 111e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi = ci; 112e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AppType oldAppType = mAppType; 113e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AppState oldAppState = mAppState; 114e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka PersoSubState oldPersoSubState = mPersoSubState; 115e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAppType = as.app_type; 116e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAppState = as.app_state; 117e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPersoSubState = as.perso_substate; 118e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAid = as.aid; 119e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAppLabel = as.app_label; 120e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin1Replaced = (as.pin1_replaced != 0); 121e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin1State = as.pin1; 122e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin2State = as.pin2; 123e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 124e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mAppType != oldAppType) { 125f48d70f5336408e7910c4868b8ede5db8354727aAlex Yakavenka if (mIccFh != null) { mIccFh.dispose();} 126f48d70f5336408e7910c4868b8ede5db8354727aAlex Yakavenka if (mIccRecords != null) { mIccRecords.dispose();} 127e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccFh = createIccFileHandler(as.app_type); 128e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccRecords = createIccRecords(as.app_type, c, ci); 129e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 130e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 131e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mPersoSubState != oldPersoSubState && 132e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPersoSubState == PersoSubState.PERSOSUBSTATE_SIM_NETWORK) { 133e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka notifyNetworkLockedRegistrantsIfNeeded(null); 134e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 135e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 136e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mAppState != oldAppState) { 137e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log(oldAppType + " changed state: " + oldAppState + " -> " + mAppState); 138e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // If the app state turns to APPSTATE_READY, then query FDN status, 139e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka //as it might have failed in earlier attempt. 140e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mAppState == AppState.APPSTATE_READY) { 141e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka queryFdn(); 142e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka queryPin1State(); 143e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 144e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka notifyPinLockedRegistrantsIfNeeded(null); 145e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka notifyReadyRegistrantsIfNeeded(null); 146e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 147e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 148e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 149e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 150e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka void dispose() { 151e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 152e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log(mAppType + " being Disposed"); 153e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mDestroyed = true; 154e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mIccRecords != null) { mIccRecords.dispose();} 155e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mIccFh != null) { mIccFh.dispose();} 156e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccRecords = null; 157e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccFh = null; 158e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 159e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 160e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 161e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private IccRecords createIccRecords(AppType type, Context c, CommandsInterface ci) { 162e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (type == AppType.APPTYPE_USIM || type == AppType.APPTYPE_SIM) { 163e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return new SIMRecords(this, c, ci); 164e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (type == AppType.APPTYPE_RUIM || type == AppType.APPTYPE_CSIM){ 165e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return new RuimRecords(this, c, ci); 166e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (type == AppType.APPTYPE_ISIM) { 167e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return new IsimUiccRecords(this, c, ci); 168e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 169e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Unknown app type (maybe detection is still in progress) 170e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return null; 171e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 172e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 173e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 174e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private IccFileHandler createIccFileHandler(AppType type) { 175e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka switch (type) { 176e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case APPTYPE_SIM: 177e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return new SIMFileHandler(this, mAid, mCi); 178e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case APPTYPE_RUIM: 179e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return new RuimFileHandler(this, mAid, mCi); 180e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case APPTYPE_USIM: 181e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return new UsimFileHandler(this, mAid, mCi); 182e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case APPTYPE_CSIM: 183e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return new CsimFileHandler(this, mAid, mCi); 184e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case APPTYPE_ISIM: 185e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return new IsimFileHandler(this, mAid, mCi); 186e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka default: 187e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return null; 188e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 189e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 190e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 191e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** Assumes mLock is held. */ 192e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void queryFdn() { 193e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka //This shouldn't change run-time. So needs to be called only once. 194e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int serviceClassX; 195e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 196e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka serviceClassX = CommandsInterface.SERVICE_CLASS_VOICE + 197e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_DATA + 198e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_FAX; 199e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.queryFacilityLockForApp ( 200e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.CB_FACILITY_BA_FD, "", serviceClassX, 201e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAid, mHandler.obtainMessage(EVENT_QUERY_FACILITY_FDN_DONE)); 202e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 203e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 204e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Interpret EVENT_QUERY_FACILITY_LOCK_DONE 205e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param ar is asyncResult of Query_Facility_Locked 206e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 207e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void onQueryFdnEnabled(AsyncResult ar) { 208e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 209e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (ar.exception != null) { 210e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Error in querying facility lock:" + ar.exception); 211e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 212e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 213e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 214e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int[] ints = (int[])ar.result; 215e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if(ints.length != 0) { 216e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccFdnEnabled = (0!=ints[0]); 217e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Query facility lock : " + mIccFdnEnabled); 218e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 219e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Bogus facility lock response"); 220e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 221e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 222e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 223e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 224e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void onChangeFdnDone(AsyncResult ar) { 225e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 226e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (ar.exception == null) { 227e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccFdnEnabled = mDesiredFdnEnabled; 228e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("EVENT_CHANGE_FACILITY_FDN_DONE: " + 229e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka "mIccFdnEnabled=" + mIccFdnEnabled); 230e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 231e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Error change facility fdn with exception " + ar.exception); 232e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 233e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Message response = (Message)ar.userObj; 234e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AsyncResult.forMessage(response).exception = ar.exception; 235e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka response.sendToTarget(); 236e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 237e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 238e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 239e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** REMOVE when mIccLockEnabled is not needed, assumes mLock is held */ 240e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void queryPin1State() { 241e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int serviceClassX = CommandsInterface.SERVICE_CLASS_VOICE + 242e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_DATA + 243e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_FAX; 244e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.queryFacilityLockForApp ( 245e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.CB_FACILITY_BA_SIM, "", serviceClassX, 246e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAid, mHandler.obtainMessage(EVENT_QUERY_FACILITY_LOCK_DONE)); 247e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 248e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 249e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** REMOVE when mIccLockEnabled is not needed*/ 250e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void onQueryFacilityLock(AsyncResult ar) { 251e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 252e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if(ar.exception != null) { 253e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Error in querying facility lock:" + ar.exception); 254e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 255e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 256e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 257e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int[] ints = (int[])ar.result; 258e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if(ints.length != 0) { 259e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Query facility lock : " + ints[0]); 260e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 261e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccLockEnabled = (ints[0] != 0); 262e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 263e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mIccLockEnabled) { 264e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPinLockedRegistrants.notifyRegistrants(); 265e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 266e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 267e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Sanity check: we expect mPin1State to match mIccLockEnabled. 268e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // When mPin1State is DISABLED mIccLockEanbled should be false. 269e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // When mPin1State is ENABLED mIccLockEnabled should be true. 270e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // 271e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Here we validate these assumptions to assist in identifying which ril/radio's 272e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // have not correctly implemented GET_SIM_STATUS 273e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka switch (mPin1State) { 274e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case PINSTATE_DISABLED: 275e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mIccLockEnabled) { 276e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("QUERY_FACILITY_LOCK:enabled GET_SIM_STATUS.Pin1:disabled." 277e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka + " Fixme"); 278e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 279e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 280e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case PINSTATE_ENABLED_NOT_VERIFIED: 281e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case PINSTATE_ENABLED_VERIFIED: 282e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case PINSTATE_ENABLED_BLOCKED: 283e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case PINSTATE_ENABLED_PERM_BLOCKED: 284e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (!mIccLockEnabled) { 285e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("QUERY_FACILITY_LOCK:disabled GET_SIM_STATUS.Pin1:enabled." 286e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka + " Fixme"); 287e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 288e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 289e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 290e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Bogus facility lock response"); 291e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 292e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 293e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 294e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 295e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** REMOVE when mIccLockEnabled is not needed */ 296e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void onChangeFacilityLock(AsyncResult ar) { 297e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 298e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (ar.exception == null) { 299e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccLockEnabled = mDesiredPinLocked; 300e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log( "EVENT_CHANGE_FACILITY_LOCK_DONE: mIccLockEnabled= " 301e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka + mIccLockEnabled); 302e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 303e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Error change facility lock with exception " + ar.exception); 304e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 305e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AsyncResult.forMessage(((Message)ar.userObj)).exception = ar.exception; 306e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ((Message)ar.userObj).sendToTarget(); 307e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 308e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 309e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 310e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private Handler mHandler = new Handler() { 311e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 312e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void handleMessage(Message msg){ 313e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka AsyncResult ar; 314e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 315e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mDestroyed) { 316e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Received message " + msg + "[" + msg.what 317e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka + "] while being destroyed. Ignoring."); 318e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 319e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 320e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 321e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka switch (msg.what) { 322e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_QUERY_FACILITY_FDN_DONE: 323e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ar = (AsyncResult)msg.obj; 324e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onQueryFdnEnabled(ar); 325e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 326e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_CHANGE_FACILITY_FDN_DONE: 327e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ar = (AsyncResult)msg.obj; 328e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onChangeFdnDone(ar); 329e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 330e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_QUERY_FACILITY_LOCK_DONE: 331e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ar = (AsyncResult)msg.obj; 332e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onQueryFacilityLock(ar); 333e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 334e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_CHANGE_FACILITY_LOCK_DONE: 335e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ar = (AsyncResult)msg.obj; 336e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onChangeFacilityLock(ar); 337e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 338e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka default: 339e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Unknown Event " + msg.what); 340e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 341e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 342e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka }; 343e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 344e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void registerForReady(Handler h, int what, Object obj) { 345e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 346e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Registrant r = new Registrant (h, what, obj); 347e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mReadyRegistrants.add(r); 348e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka notifyReadyRegistrantsIfNeeded(r); 349e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 350e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 351e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 352e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void unregisterForReady(Handler h) { 353e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 354e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mReadyRegistrants.remove(h); 355e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 356e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 357e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 358e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 359e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Notifies handler of any transition into State.isPinLocked() 360e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 361e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void registerForLocked(Handler h, int what, Object obj) { 362e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 363e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Registrant r = new Registrant (h, what, obj); 364e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPinLockedRegistrants.add(r); 365e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka notifyPinLockedRegistrantsIfNeeded(r); 366e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 367e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 368e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 369e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void unregisterForLocked(Handler h) { 370e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 371e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPinLockedRegistrants.remove(h); 372e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 373e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 374e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 375e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 376e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Notifies handler of any transition into State.NETWORK_LOCKED 377e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 378e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void registerForNetworkLocked(Handler h, int what, Object obj) { 379e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 380e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Registrant r = new Registrant (h, what, obj); 381e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mNetworkLockedRegistrants.add(r); 382e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka notifyNetworkLockedRegistrantsIfNeeded(r); 383e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 384e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 385e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 386e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void unregisterForNetworkLocked(Handler h) { 387e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 388e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mNetworkLockedRegistrants.remove(h); 389e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 390e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 391e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 392e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 393e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Notifies specified registrant, assume mLock is held. 394e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 395e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param r Registrant to be notified. If null - all registrants will be notified 396e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 397e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void notifyReadyRegistrantsIfNeeded(Registrant r) { 398e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mDestroyed) { 399e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 400e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 401e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mAppState == AppState.APPSTATE_READY) { 402e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mPin1State == PinState.PINSTATE_ENABLED_NOT_VERIFIED || 403e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin1State == PinState.PINSTATE_ENABLED_BLOCKED || 404e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin1State == PinState.PINSTATE_ENABLED_PERM_BLOCKED) { 405e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Sanity check failed! APPSTATE is ready while PIN1 is not verified!!!"); 406e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Don't notify if application is in insane state 407e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 408e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 409e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (r == null) { 410e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Notifying registrants: READY"); 411e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mReadyRegistrants.notifyRegistrants(); 412e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 413e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Notifying 1 registrant: READY"); 414e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka r.notifyRegistrant(new AsyncResult(null, null, null)); 415e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 416e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 417e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 418e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 419e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 420e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Notifies specified registrant, assume mLock is held. 421e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 422e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param r Registrant to be notified. If null - all registrants will be notified 423e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 424e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void notifyPinLockedRegistrantsIfNeeded(Registrant r) { 425e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mDestroyed) { 426e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 427e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 428e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 429e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mAppState == AppState.APPSTATE_PIN || 430e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mAppState == AppState.APPSTATE_PUK) { 431e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mPin1State == PinState.PINSTATE_ENABLED_VERIFIED || 432e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPin1State == PinState.PINSTATE_DISABLED) { 433e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("Sanity check failed! APPSTATE is locked while PIN1 is not!!!"); 434e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka //Don't notify if application is in insane state 435e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 436e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 437e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (r == null) { 438e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Notifying registrants: LOCKED"); 439e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPinLockedRegistrants.notifyRegistrants(); 440e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 441e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Notifying 1 registrant: LOCKED"); 442e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka r.notifyRegistrant(new AsyncResult(null, null, null)); 443e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 444e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 445e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 446e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 447e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 448e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Notifies specified registrant, assume mLock is held. 449e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 450e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param r Registrant to be notified. If null - all registrants will be notified 451e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 452e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void notifyNetworkLockedRegistrantsIfNeeded(Registrant r) { 453e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mDestroyed) { 454e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 455e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 456e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 457e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mAppState == AppState.APPSTATE_SUBSCRIPTION_PERSO && 458e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPersoSubState == PersoSubState.PERSOSUBSTATE_SIM_NETWORK) { 459e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (r == null) { 460e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Notifying registrants: NETWORK_LOCKED"); 461e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mNetworkLockedRegistrants.notifyRegistrants(); 462e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 463e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("Notifying 1 registrant: NETWORK_LOCED"); 464e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka r.notifyRegistrant(new AsyncResult(null, null, null)); 465e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 466e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 467e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 468e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 469e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public AppState getState() { 470e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 471e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mAppState; 472e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 473e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 474e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 475e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public AppType getType() { 476e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 477e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mAppType; 478e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 479e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 480e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 481e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public PersoSubState getPersoSubState() { 482e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 483e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mPersoSubState; 484e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 485e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 486e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 487e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public String getAid() { 488e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 489e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mAid; 490e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 491e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 492e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 493e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public PinState getPin1State() { 494e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 495e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mPin1Replaced) { 496e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mUiccCard.getUniversalPinState(); 497e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 498e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mPin1State; 499e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 500e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 501e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 502e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public IccFileHandler getIccFileHandler() { 503e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 504e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mIccFh; 505e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 506e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 507e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 508e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public IccRecords getIccRecords() { 509e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 510e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mIccRecords; 511e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 512e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 513e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 514e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 515e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Supply the ICC PIN to the ICC 516e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 517e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * When the operation is complete, onComplete will be sent to its 518e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Handler. 519e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 520e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * onComplete.obj will be an AsyncResult 521e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 522e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception == null on success 523e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception != null on fail 524e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 525e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * If the supplied PIN is incorrect: 526e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception != null 527e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * && ((AsyncResult)onComplete.obj).exception 528e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * instanceof com.android.internal.telephony.gsm.CommandException) 529e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * && ((CommandException)(((AsyncResult)onComplete.obj).exception)) 530e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * .getCommandError() == CommandException.Error.PASSWORD_INCORRECT 531e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 532e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 533e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 534e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void supplyPin (String pin, Message onComplete) { 535e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 536e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.supplyIccPin(pin, onComplete); 537e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 538e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 539e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 540e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void supplyPuk (String puk, String newPin, Message onComplete) { 541e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 542e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.supplyIccPuk(puk, newPin, onComplete); 543e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 544e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 545e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 546e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void supplyPin2 (String pin2, Message onComplete) { 547e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 548e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.supplyIccPin2(pin2, onComplete); 549e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 550e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 551e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 552e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void supplyPuk2 (String puk2, String newPin2, Message onComplete) { 553e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 554e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.supplyIccPuk2(puk2, newPin2, onComplete); 555e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 556e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 557e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 558e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void supplyNetworkDepersonalization (String pin, Message onComplete) { 559e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 560e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("supplyNetworkDepersonalization"); 561e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.supplyNetworkDepersonalization(pin, onComplete); 562e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 563e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 564e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 565e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 566e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Check whether ICC pin lock is enabled 567e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * This is a sync call which returns the cached pin enabled state 568e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 569e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @return true for ICC locked enabled 570e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * false for ICC locked disabled 571e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 572e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public boolean getIccLockEnabled() { 573e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mIccLockEnabled; 574e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /* STOPSHIP: Remove line above and all code associated with setting 575e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccLockEanbled once all RIL correctly sends the pin1 state. 576e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Use getPin1State to take into account pin1Replaced flag 577e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka PinState pinState = getPin1State(); 578e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return pinState == PinState.PINSTATE_ENABLED_NOT_VERIFIED || 579e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka pinState == PinState.PINSTATE_ENABLED_VERIFIED || 580e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka pinState == PinState.PINSTATE_ENABLED_BLOCKED || 581e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka pinState == PinState.PINSTATE_ENABLED_PERM_BLOCKED;*/ 582e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 583e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 584e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 585e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Check whether ICC fdn (fixed dialing number) is enabled 586e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * This is a sync call which returns the cached pin enabled state 587e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 588e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @return true for ICC fdn enabled 589e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * false for ICC fdn disabled 590e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 591e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public boolean getIccFdnEnabled() { 592e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 593e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mIccFdnEnabled; 594e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 595e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 596e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 597e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 598e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Set the ICC pin lock enabled or disabled 599e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * When the operation is complete, onComplete will be sent to its handler 600e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 601e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param enabled "true" for locked "false" for unlocked. 602e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param password needed to change the ICC pin state, aka. Pin1 603e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param onComplete 604e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * onComplete.obj will be an AsyncResult 605e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception == null on success 606e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception != null on fail 607e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 608e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void setIccLockEnabled (boolean enabled, 609e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka String password, Message onComplete) { 610e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 611e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int serviceClassX; 612e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka serviceClassX = CommandsInterface.SERVICE_CLASS_VOICE + 613e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_DATA + 614e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_FAX; 615e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 616e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mDesiredPinLocked = enabled; 617e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 618e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.setFacilityLockForApp(CommandsInterface.CB_FACILITY_BA_SIM, 619e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka enabled, password, serviceClassX, mAid, 620e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mHandler.obtainMessage(EVENT_CHANGE_FACILITY_LOCK_DONE, onComplete)); 621e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 622e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 623e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 624e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 625e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Set the ICC fdn enabled or disabled 626e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * When the operation is complete, onComplete will be sent to its handler 627e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 628e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param enabled "true" for locked "false" for unlocked. 629e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param password needed to change the ICC fdn enable, aka Pin2 630e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param onComplete 631e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * onComplete.obj will be an AsyncResult 632e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception == null on success 633e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception != null on fail 634e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 635e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void setIccFdnEnabled (boolean enabled, 636e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka String password, Message onComplete) { 637e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 638e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int serviceClassX; 639e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka serviceClassX = CommandsInterface.SERVICE_CLASS_VOICE + 640e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_DATA + 641e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_FAX + 642e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka CommandsInterface.SERVICE_CLASS_SMS; 643e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 644e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mDesiredFdnEnabled = enabled; 645e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 646e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.setFacilityLockForApp(CommandsInterface.CB_FACILITY_BA_FD, 647e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka enabled, password, serviceClassX, mAid, 648e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mHandler.obtainMessage(EVENT_CHANGE_FACILITY_FDN_DONE, onComplete)); 649e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 650e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 651e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 652e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 653e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Change the ICC password used in ICC pin lock 654e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * When the operation is complete, onComplete will be sent to its handler 655e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 656e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param oldPassword is the old password 657e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param newPassword is the new password 658e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param onComplete 659e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * onComplete.obj will be an AsyncResult 660e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception == null on success 661e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception != null on fail 662e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 663e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void changeIccLockPassword(String oldPassword, String newPassword, 664e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Message onComplete) { 665e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 666e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("changeIccLockPassword"); 667e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.changeIccPinForApp(oldPassword, newPassword, mAid, 668e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onComplete); 669e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 670e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 671e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 672e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 673e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Change the ICC password used in ICC fdn enable 674e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * When the operation is complete, onComplete will be sent to its handler 675e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * 676e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param oldPassword is the old password 677e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param newPassword is the new password 678e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param onComplete 679e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * onComplete.obj will be an AsyncResult 680e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception == null on success 681e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * ((AsyncResult)onComplete.obj).exception != null on fail 682e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 683e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void changeIccFdnPassword(String oldPassword, String newPassword, 684e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Message onComplete) { 685e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka synchronized (mLock) { 686e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("changeIccFdnPassword"); 687e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.changeIccPin2ForApp(oldPassword, newPassword, mAid, 688e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onComplete); 689e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 690e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 691e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 692e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void log(String msg) { 693e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Log.d(LOG_TAG, msg); 694e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 695e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 696e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void loge(String msg) { 697e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Log.e(LOG_TAG, msg); 698e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 699e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka} 700