1c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/* 2c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Copyright (C) 2006 The Android Open Source Project 3c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 4c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * you may not use this file except in compliance with the License. 6c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * You may obtain a copy of the License at 7c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 8c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * http://www.apache.org/licenses/LICENSE-2.0 9c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 10c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Unless required by applicable law or agreed to in writing, software 11c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See the License for the specific language governing permissions and 14c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * limitations under the License. 15c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 16c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 17d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkapackage com.android.internal.telephony.uicc; 18c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 19c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.Context; 20c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.AsyncResult; 21c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Handler; 22c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Message; 23c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Registrant; 24c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.RegistrantList; 25c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 266bc4098827f3070a44b5e51508b455d7c7be9c07Wink Savilleimport android.telephony.TelephonyManager; 27228824f603b310707829fdd92bf8e16d8f421b58Anthony Leeimport android.text.TextUtils; 286d7e8df9269a2f05db250145532fd4ce9de6bbadSanket Padaweimport android.telephony.SubscriptionInfo; 29228824f603b310707829fdd92bf8e16d8f421b58Anthony Lee 30d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.CommandsInterface; 3164bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState; 32c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 3305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.FileDescriptor; 3405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.PrintWriter; 35a727251af66b94f38e269321bb153ca98d21c944Narayan Kamathimport java.io.UnsupportedEncodingException; 36a727251af66b94f38e269321bb153ca98d21c944Narayan Kamathimport java.util.Arrays; 37bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenkaimport java.util.concurrent.atomic.AtomicBoolean; 38bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka 39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/** 40c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide} 41c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 42c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic abstract class IccRecords extends Handler implements IccConstants { 43c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected static final boolean DBG = true; 44a1421a82e8d4f711ba13a86d40889868ead492d4Amit Mahajan protected static final boolean VDBG = false; // STOPSHIP if true 45cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 46c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Instance Variables 47bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka protected AtomicBoolean mDestroyed = new AtomicBoolean(false); 48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected Context mContext; 49c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected CommandsInterface mCi; 50c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected IccFileHandler mFh; 51e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka protected UiccCardApplication mParentApp; 52e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu protected TelephonyManager mTelephonyManager; 53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 54b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville protected RegistrantList mRecordsLoadedRegistrants = new RegistrantList(); 55e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka protected RegistrantList mImsiReadyRegistrants = new RegistrantList(); 56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected RegistrantList mRecordsEventsRegistrants = new RegistrantList(); 57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected RegistrantList mNewSmsRegistrants = new RegistrantList(); 58c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected RegistrantList mNetworkSelectionModeAutomaticRegistrants = new RegistrantList(); 59c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 6022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville protected int mRecordsToLoad; // number of pending load requests 61c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 6222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville protected AdnRecordCache mAdnCache; 63c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 64c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Cached SIM State; cleared on channel close 65c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 6622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville protected boolean mRecordsRequested = false; // true if we've made requests for the sim records 6722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville 68a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan protected String mIccId; // Includes only decimals (no hex) 69a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan protected String mFullIccId; // Includes hex characters in ICCID 7022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville protected String mMsisdn = null; // My mobile number 7122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville protected String mMsisdnTag = null; 726bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville protected String mNewMsisdn = null; 736bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville protected String mNewMsisdnTag = null; 7422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville protected String mVoiceMailNum = null; 7522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville protected String mVoiceMailTag = null; 7622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville protected String mNewVoiceMailNum = null; 7722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville protected String mNewVoiceMailTag = null; 7822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville protected boolean mIsVoiceMailFixed = false; 79e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka protected String mImsi; 80ce083ae9d277bea9fbc1c143766adf1013f4a50eAmit Mahajan private IccIoResult auth_rsp; 81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville protected int mMncLength = UNINITIALIZED; 8322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville protected int mMailboxIndex = 0; // 0 is no mailbox dailing number associated 84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 85b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal private String mSpn; 86c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 87620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt protected String mGid1; 887234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu protected String mGid2; 89a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath protected String mPrefLang; 902f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim 91a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private final Object mLock = new Object(); 92a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Constants 94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Markers for mncLength 96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected static final int UNINITIALIZED = -1; 97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected static final int UNKNOWN = 0; 98c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Bitmasks for SPN display rules. 100cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public static final int SPN_RULE_SHOW_SPN = 0x01; 101cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public static final int SPN_RULE_SHOW_PLMN = 0x02; 102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Event Constants 104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected static final int EVENT_SET_MSISDN_DONE = 30; 105bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka public static final int EVENT_MWI = 0; // Message Waiting indication 106bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka public static final int EVENT_CFI = 1; // Call Forwarding indication 107bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka public static final int EVENT_SPN = 2; // Service Provider Name 108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public static final int EVENT_GET_ICC_RECORD_DONE = 100; 11064bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka protected static final int EVENT_APP_READY = 1; 111a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private static final int EVENT_AKA_AUTHENTICATE_DONE = 90; 112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 113eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan public static final int CALL_FORWARDING_STATUS_DISABLED = 0; 114eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan public static final int CALL_FORWARDING_STATUS_ENABLED = 1; 115eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan public static final int CALL_FORWARDING_STATUS_UNKNOWN = -1; 116eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan 117f92cb4bd5519427a0db673709d94683a8baf203aWink Saville @Override 118f92cb4bd5519427a0db673709d94683a8baf203aWink Saville public String toString() { 119a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan String iccIdToPrint = SubscriptionInfo.givePrintableIccid(mFullIccId); 120f92cb4bd5519427a0db673709d94683a8baf203aWink Saville return "mDestroyed=" + mDestroyed 121f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mContext=" + mContext 122f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mCi=" + mCi 123f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mFh=" + mFh 124f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mParentApp=" + mParentApp 125b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville + " recordsLoadedRegistrants=" + mRecordsLoadedRegistrants 126f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mImsiReadyRegistrants=" + mImsiReadyRegistrants 127f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mRecordsEventsRegistrants=" + mRecordsEventsRegistrants 128f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mNewSmsRegistrants=" + mNewSmsRegistrants 129f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mNetworkSelectionModeAutomaticRegistrants=" 130f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + mNetworkSelectionModeAutomaticRegistrants 13122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " recordsToLoad=" + mRecordsToLoad 13222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " adnCache=" + mAdnCache 13322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " recordsRequested=" + mRecordsRequested 134497d54c0f337bd71165122d2e2c54ec826f4fb17Sanket Padawe + " iccid=" + iccIdToPrint 13522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " msisdnTag=" + mMsisdnTag 13622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " voiceMailNum=" + mVoiceMailNum 13722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " voiceMailTag=" + mVoiceMailTag 13822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " newVoiceMailNum=" + mNewVoiceMailNum 13922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " newVoiceMailTag=" + mNewVoiceMailTag 14022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " isVoiceMailFixed=" + mIsVoiceMailFixed 141a1421a82e8d4f711ba13a86d40889868ead492d4Amit Mahajan + (VDBG ? (" mImsi=" + mImsi) : "") 14222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " mncLength=" + mMncLength 14322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " mailboxIndex=" + mMailboxIndex 14422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " spn=" + mSpn; 145f92cb4bd5519427a0db673709d94683a8baf203aWink Saville 146f92cb4bd5519427a0db673709d94683a8baf203aWink Saville } 147f92cb4bd5519427a0db673709d94683a8baf203aWink Saville 148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Generic ICC record loaded callback. Subclasses can call EF load methods on 150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@link IccFileHandler} passing a Message for onLoaded with the what field set to 151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@link #EVENT_GET_ICC_RECORD_DONE} and the obj field set to an instance 152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * of this interface. The {@link #handleMessage} method in this class will print a 15322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville * log message using {@link #getEfName()} and decrement {@link #mRecordsToLoad}. 154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * If the record load was successful, {@link #onRecordLoaded} will be called with the result. 156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Otherwise, an error log message will be output by {@link #handleMessage} and 157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@link #onRecordLoaded} will not be called. 158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public interface IccRecordLoaded { 160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String getEfName(); 161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void onRecordLoaded(AsyncResult ar); 162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Constructor 165e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public IccRecords(UiccCardApplication app, Context c, CommandsInterface ci) { 166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mContext = c; 167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi = ci; 168e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mFh = app.getIccFileHandler(); 169e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mParentApp = app; 170e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu mTelephonyManager = (TelephonyManager) mContext.getSystemService( 171e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu Context.TELEPHONY_SERVICE); 172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Call when the IccRecords object is no longer going to be used. 176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dispose() { 178bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka mDestroyed.set(true); 179e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mParentApp = null; 180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh = null; 181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi = null; 182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mContext = null; 183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public abstract void onReady(); 186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Public Methods 188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public AdnRecordCache getAdnCache() { 18922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mAdnCache; 190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 192a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan /** 193a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan * Returns the ICC ID stripped at the first hex character. Some SIMs have ICC IDs 194a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan * containing hex digits; {@link #getFullIccId()} should be used to get the full ID including 195a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan * hex digits. 196a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan * @return ICC ID without hex digits 197a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan */ 198b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville public String getIccId() { 199b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville return mIccId; 200b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville } 201b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville 202a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan /** 203a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan * Returns the full ICC ID including hex digits. 204a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan * @return full ICC ID including hex digits 205a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan */ 206a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan public String getFullIccId() { 207a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan return mFullIccId; 208a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan } 209a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan 210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void registerForRecordsLoaded(Handler h, int what, Object obj) { 211bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka if (mDestroyed.get()) { 212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Registrant r = new Registrant(h, what, obj); 216b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville mRecordsLoadedRegistrants.add(r); 217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 21822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mRecordsToLoad == 0 && mRecordsRequested == true) { 219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville r.notifyRegistrant(new AsyncResult(null, null, null)); 220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void unregisterForRecordsLoaded(Handler h) { 223b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville mRecordsLoadedRegistrants.remove(h); 224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 226e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void registerForImsiReady(Handler h, int what, Object obj) { 227e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mDestroyed.get()) { 228e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 229e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 230e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 231e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Registrant r = new Registrant(h, what, obj); 232e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mImsiReadyRegistrants.add(r); 233e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 234e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mImsi != null) { 235e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka r.notifyRegistrant(new AsyncResult(null, null, null)); 236e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 237e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 238e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void unregisterForImsiReady(Handler h) { 239e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mImsiReadyRegistrants.remove(h); 240e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 241e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void registerForRecordsEvents(Handler h, int what, Object obj) { 243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Registrant r = new Registrant (h, what, obj); 244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRecordsEventsRegistrants.add(r); 245e43045f54ba97cfb95dd19bc59bb7978239fea22Amit Mahajan 246e43045f54ba97cfb95dd19bc59bb7978239fea22Amit Mahajan /* Notify registrant of all the possible events. This is to make sure registrant is 247e43045f54ba97cfb95dd19bc59bb7978239fea22Amit Mahajan notified even if event occurred in the past. */ 248e43045f54ba97cfb95dd19bc59bb7978239fea22Amit Mahajan r.notifyResult(EVENT_MWI); 249e43045f54ba97cfb95dd19bc59bb7978239fea22Amit Mahajan r.notifyResult(EVENT_CFI); 250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void unregisterForRecordsEvents(Handler h) { 252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRecordsEventsRegistrants.remove(h); 253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void registerForNewSms(Handler h, int what, Object obj) { 256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Registrant r = new Registrant (h, what, obj); 257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mNewSmsRegistrants.add(r); 258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void unregisterForNewSms(Handler h) { 260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mNewSmsRegistrants.remove(h); 261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void registerForNetworkSelectionModeAutomatic( 264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Handler h, int what, Object obj) { 265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Registrant r = new Registrant (h, what, obj); 266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mNetworkSelectionModeAutomaticRegistrants.add(r); 267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void unregisterForNetworkSelectionModeAutomatic(Handler h) { 269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mNetworkSelectionModeAutomaticRegistrants.remove(h); 270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Get the International Mobile Subscriber ID (IMSI) on a SIM 274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * for GSM, UMTS and like networks. Default is null if IMSI is 275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * not supported or unavailable. 276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @return null if SIM is not yet ready or unavailable 278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getIMSI() { 280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return null; 281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 283e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka /** 284e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * Imsi could be set by ServiceStateTrackers in case of cdma 285e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka * @param imsi 286e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka */ 287e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void setImsi(String imsi) { 28822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mImsi = imsi; 289e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mImsiReadyRegistrants.notifyRegistrants(); 290e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 291e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 2922351b17aba5350004fc76707f3b3d2859ce773c8xinhe /** 2932351b17aba5350004fc76707f3b3d2859ce773c8xinhe * Get the Network Access ID (NAI) on a CSIM for CDMA like networks. Default is null if IMSI is 2942351b17aba5350004fc76707f3b3d2859ce773c8xinhe * not supported or unavailable. 2952351b17aba5350004fc76707f3b3d2859ce773c8xinhe * 2962351b17aba5350004fc76707f3b3d2859ce773c8xinhe * @return null if NAI is not yet ready or unavailable 2972351b17aba5350004fc76707f3b3d2859ce773c8xinhe */ 2982351b17aba5350004fc76707f3b3d2859ce773c8xinhe public String getNAI() { 2992351b17aba5350004fc76707f3b3d2859ce773c8xinhe return null; 3002351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 3012351b17aba5350004fc76707f3b3d2859ce773c8xinhe 302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getMsisdnNumber() { 30322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mMsisdn; 304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 3072f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim * Get the Group Identifier Level 1 (GID1) on a SIM for GSM. 3082f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim * @return null if SIM is not yet ready 3092f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim */ 3102f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim public String getGid1() { 3112f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim return null; 3122f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim } 3132f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim 3142f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim /** 3157234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu * Get the Group Identifier Level 2 (GID2) on a SIM. 3167234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu * @return null if SIM is not yet ready 3177234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu */ 3187234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu public String getGid2() { 3197234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu return null; 3207234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu } 3217234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu 3227234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu /** 323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Set subscriber number to SIM record 324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * The subscriber number is stored in EF_MSISDN (TS 51.011) 326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * When the operation is complete, onComplete will be sent to its handler 328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param alphaTag alpha-tagging of the dailing nubmer (up to 10 characters) 330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param number dailing nubmer (up to 20 digits) 331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * if the number starts with '+', then set to international TOA 332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param onComplete 333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * onComplete.obj will be an AsyncResult 334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ((AsyncResult)onComplete.obj).exception == null on success 335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ((AsyncResult)onComplete.obj).exception != null on fail 336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void setMsisdnNumber(String alphaTag, String number, 338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message onComplete) { 339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 34022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMsisdn = number; 34122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMsisdnTag = alphaTag; 342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 34322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (DBG) log("Set MSISDN: " + mMsisdnTag +" " + mMsisdn); 344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 34622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville AdnRecord adn = new AdnRecord(mMsisdnTag, mMsisdn); 347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).updateEF(adn, EF_MSISDN, EF_EXT1, 1, null, 349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_SET_MSISDN_DONE, onComplete)); 350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getMsisdnAlphaTag() { 35322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mMsisdnTag; 354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getVoiceMailNumber() { 35722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mVoiceMailNum; 358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 361b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal * Return Service Provider Name stored in SIM (EF_SPN=0x6F46) or in RUIM (EF_RUIM_SPN=0x6F41). 362b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal * 363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @return null if SIM is not yet ready or no RUIM entry 364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getServiceProviderName() { 366687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville String providerName = mSpn; 367687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville 368687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville // Check for null pointers, mParentApp can be null after dispose, 369687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville // which did occur after removing a SIM. 370687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville UiccCardApplication parentApp = mParentApp; 371687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville if (parentApp != null) { 372687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville UiccCard card = parentApp.getUiccCard(); 373687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville if (card != null) { 374687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville String brandOverride = card.getOperatorBrandOverride(); 375687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville if (brandOverride != null) { 376c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu log("getServiceProviderName: override, providerName=" + providerName); 377687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville providerName = brandOverride; 378687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville } else { 379c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu log("getServiceProviderName: no brandOverride, providerName=" + providerName); 380687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville } 381687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville } else { 382c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu log("getServiceProviderName: card is null, providerName=" + providerName); 383687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville } 384687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville } else { 385c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yu log("getServiceProviderName: mParentApp is null, providerName=" + providerName); 386687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville } 387687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville return providerName; 388b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal } 389b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal 390b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal protected void setServiceProviderName(String spn) { 391b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal mSpn = spn; 392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Set voice mail number to SIM record 396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * The voice mail number can be stored either in EF_MBDN (TS 51.011) or 398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * EF_MAILBOX_CPHS (CPHS 4.2) 399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * If EF_MBDN is available, store the voice mail number to EF_MBDN 401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * If EF_MAILBOX_CPHS is enabled, store the voice mail number to EF_CHPS 403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * So the voice mail number will be stored in both EFs if both are available 405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Return error only if both EF_MBDN and EF_MAILBOX_CPHS fail. 407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * When the operation is complete, onComplete will be sent to its handler 409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param alphaTag alpha-tagging of the dailing nubmer (upto 10 characters) 411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param voiceNumber dailing nubmer (upto 20 digits) 412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * if the number is start with '+', then set to international TOA 413c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param onComplete 414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * onComplete.obj will be an AsyncResult 415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ((AsyncResult)onComplete.obj).exception == null on success 416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ((AsyncResult)onComplete.obj).exception != null on fail 417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public abstract void setVoiceMailNumber(String alphaTag, String voiceNumber, 419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message onComplete); 420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getVoiceMailAlphaTag() { 42222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mVoiceMailTag; 423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 426c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Sets the SIM voice message waiting indicator records 427c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param line GSM Subscriber Profile Number, one-based. Only '1' is supported 428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param countWaiting The number of messages waiting, if known. Use 429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * -1 to indicate that an unknown number of 430c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * messages are waiting 431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 432c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public abstract void setVoiceMessageWaiting(int line, int countWaiting); 433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 4351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Called by GsmCdmaPhone to update VoiceMail count 436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 43726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa public abstract int getVoiceMessageCount(); 438c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called by STK Service when REFRESH is received. 441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param fileChanged indicates whether any files changed 442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param fileList if non-null, a list of EF files that changed 443c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public abstract void onRefresh(boolean fileChanged, int[] fileList); 445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 44664bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka /** 44764bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka * Called by subclasses (SimRecords and RuimRecords) whenever 44864bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka * IccRefreshResponse.REFRESH_RESULT_INIT event received 44964bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka */ 45064bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka protected void onIccRefreshInit() { 451652fe674a597e221274a3746118f15cf40c7dbb9Wink Saville mAdnCache.reset(); 452687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville UiccCardApplication parentApp = mParentApp; 453687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville if ((parentApp != null) && 454687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville (parentApp.getState() == AppState.APPSTATE_READY)) { 45564bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka // This will cause files to be reread 45664bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka sendMessage(obtainMessage(EVENT_APP_READY)); 45764bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka } 45864bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka } 459c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public boolean getRecordsLoaded() { 46122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mRecordsToLoad == 0 && mRecordsRequested == true) { 462c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 463c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return false; 465c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Overridden from Handler 469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void handleMessage(Message msg) { 471a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville AsyncResult ar; 472a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (msg.what) { 474c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_ICC_RECORD_DONE: 475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 476a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ar = (AsyncResult) msg.obj; 477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville IccRecordLoaded recordLoaded = (IccRecordLoaded) ar.userObj; 478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log(recordLoaded.getEfName() + " LOADED"); 479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("Record Load Exception: " + ar.exception); 482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordLoaded.onRecordLoaded(ar); 484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville }catch (RuntimeException exc) { 486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // I don't want these exceptions to be fatal 487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("Exception parsing SIM record: " + exc); 488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } finally { 489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Count up record load responses even if they are fails 490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onRecordLoaded(); 491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 494a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville case EVENT_AKA_AUTHENTICATE_DONE: 495a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ar = (AsyncResult)msg.obj; 496a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville auth_rsp = null; 497a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) log("EVENT_AKA_AUTHENTICATE_DONE"); 498a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (ar.exception != null) { 499a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("Exception ICC SIM AKA: " + ar.exception); 500a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 501a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 502ce083ae9d277bea9fbc1c143766adf1013f4a50eAmit Mahajan auth_rsp = (IccIoResult)ar.result; 503a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (DBG) log("ICC SIM AKA: auth_rsp = " + auth_rsp); 504a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } catch (Exception e) { 505a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("Failed to parse ICC SIM AKA contents: " + e); 506a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 507a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 508a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized (mLock) { 509a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mLock.notifyAll(); 510a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 511a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 512a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville break; 513a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 514c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 515c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville super.handleMessage(msg); 516c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 517c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 518c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 519a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath /** 520a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath * Returns the SIM language derived from the EF-LI and EF-PL sim records. 521a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath */ 522a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath public String getSimLanguage() { 523a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath return mPrefLang; 524a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath } 525a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath 526a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath protected void setSimLanguage(byte[] efLi, byte[] efPl) { 527a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath String[] locales = mContext.getAssets().getLocales(); 528a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath try { 529a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath mPrefLang = findBestLanguage(efLi, locales); 530a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath } catch (UnsupportedEncodingException uee) { 531a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath log("Unable to parse EF-LI: " + Arrays.toString(efLi)); 532a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath } 533a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath 534a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath if (mPrefLang == null) { 535a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath try { 536a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath mPrefLang = findBestLanguage(efPl, locales); 537a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath } catch (UnsupportedEncodingException uee) { 538a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath log("Unable to parse EF-PL: " + Arrays.toString(efLi)); 539a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath } 540a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath } 541a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath } 542a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath 543a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath protected static String findBestLanguage(byte[] languages, String[] locales) 544a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath throws UnsupportedEncodingException { 545a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath if ((languages == null) || (locales == null)) return null; 546a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath 547a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath // Each 2-bytes consists of one language 548a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath for (int i = 0; (i + 1) < languages.length; i += 2) { 549a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath String lang = new String(languages, i, 2, "ISO-8859-1"); 550a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath for (int j = 0; j < locales.length; j++) { 551a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath if (locales[j] != null && locales[j].length() >= 2 && 552a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath locales[j].substring(0, 2).equalsIgnoreCase(lang)) { 553a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath return lang; 554a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath } 555a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath } 556a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath } 557a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath 558a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath // no match found. return null 559a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath return null; 560a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath } 561a727251af66b94f38e269321bb153ca98d21c944Narayan Kamath 562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected abstract void onRecordLoaded(); 563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected abstract void onAllRecordsLoaded(); 565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Returns the SpnDisplayRule based on settings on the SIM and the 568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * specified plmn (currently-registered PLMN). See TS 22.101 Annex A 569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and TS 51.011 10.3.11 for details. 570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * If the SPN is not found on the SIM, the rule is always PLMN_ONLY. 572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Generally used for GSM/UMTS and the like SIMs. 573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public abstract int getDisplayRule(String plmn); 575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 576c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 577c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Return true if "Restriction of menu options for manual PLMN selection" 578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * bit is set or EF_CSP data is unavailable, return false otherwise. 579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Generally used for GSM/UMTS and the like SIMs. 580c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public boolean isCspPlmnEnabled() { 582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return false; 583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Returns the 5 or 6 digit MCC/MNC of the operator that 587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * provided the SIM card. Returns null of SIM is not yet ready 588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * or is not valid for the type of IccCard. Generally used for 589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * GSM/UMTS and the like SIMS 590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getOperatorNumeric() { 592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return null; 593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 595c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 596c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Get the current Voice call forwarding flag for GSM/UMTS and the like SIMs 597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 598eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan * @return CALL_FORWARDING_STATUS_XXX (DISABLED/ENABLED/UNKNOWN) 599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 600eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan public int getVoiceCallForwardingFlag() { 601eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan return CALL_FORWARDING_STATUS_UNKNOWN; 602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Set the voice call forwarding flag for GSM/UMTS and the like SIMs 606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param line to enable/disable 608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param enable 60931ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville * @param number to which CFU is enabled 610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 61131ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville public void setVoiceCallForwardingFlag(int line, boolean enable, String number) { 612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Indicates wether SIM is in provisioned state or not. 616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Overridden only if SIM can be dynamically provisioned via OTA. 617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @return true if provisioned 619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public boolean isProvisioned () { 621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Write string to log file 626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 627c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param s is the string to write 628c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected abstract void log(String s); 630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 632c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Write error string to log file. 633c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param s is the string to write 635c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected abstract void loge(String s); 637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Return an interface to retrieve the ISIM records for IMS, if available. 640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @return the interface to retrieve the ISIM records, or null if not supported 641c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public IsimRecords getIsimRecords() { 643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return null; 644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public UsimServiceTable getUsimServiceTable() { 647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return null; 648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 64905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka 6506bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville protected void setSystemProperty(String key, String val) { 6516bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville TelephonyManager.getDefault().setTelephonyProperty(mParentApp.getPhoneId(), key, val); 6526bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville 6536bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville log("[key, value]=" + key + ", " + val); 6546bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 6556bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville 656a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 657a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Returns the response of the SIM application on the UICC to authentication 658a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * challenge/response algorithm. The data string and challenge response are 659a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Base64 encoded Strings. 660a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * Can support EAP-SIM, EAP-AKA with results encoded per 3GPP TS 31.102. 661a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * 662ce083ae9d277bea9fbc1c143766adf1013f4a50eAmit Mahajan * @param authContext parameter P2 that specifies the authentication context per 3GPP TS 31.102 (Section 7.1.2) 663a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @param data authentication challenge data 664a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return challenge response 665a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 666ce083ae9d277bea9fbc1c143766adf1013f4a50eAmit Mahajan public String getIccSimChallengeResponse(int authContext, String data) { 667687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville if (DBG) log("getIccSimChallengeResponse:"); 668a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 669a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 670a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville synchronized(mLock) { 671687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville CommandsInterface ci = mCi; 672687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville UiccCardApplication parentApp = mParentApp; 673687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville if (ci != null && parentApp != null) { 674687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville ci.requestIccSimAuthentication(authContext, data, 675687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville parentApp.getAid(), 676687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville obtainMessage(EVENT_AKA_AUTHENTICATE_DONE)); 677687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville try { 678687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville mLock.wait(); 679687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville } catch (InterruptedException e) { 680687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville loge("getIccSimChallengeResponse: Fail, interrupted" 681687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville + " while trying to request Icc Sim Auth"); 682687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville return null; 683687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville } 684687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville } else { 685687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville loge( "getIccSimChallengeResponse: " 686687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville + "Fail, ci or parentApp is null"); 687687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville return null; 688a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 689a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 690a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } catch(Exception e) { 691687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville loge( "getIccSimChallengeResponse: " 692687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville + "Fail while trying to request Icc Sim Auth"); 693a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 694a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 695a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 696687d9ff95671d3b4a62ddd6fed3e43eebdbbe3cbWink Saville if (DBG) log("getIccSimChallengeResponse: return auth_rsp"); 697a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 698cf916cfb2b4d8282def13e4553abff2ea73aca2bVinit Deshpande return android.util.Base64.encodeToString(auth_rsp.payload, android.util.Base64.NO_WRAP); 699a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 700a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 70105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 70205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println("IccRecords: " + this); 70305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mDestroyed=" + mDestroyed); 70405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mCi=" + mCi); 70505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mFh=" + mFh); 70605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mParentApp=" + mParentApp); 707b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville pw.println(" recordsLoadedRegistrants: size=" + mRecordsLoadedRegistrants.size()); 708b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville for (int i = 0; i < mRecordsLoadedRegistrants.size(); i++) { 70905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" recordsLoadedRegistrants[" + i + "]=" 710b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville + ((Registrant)mRecordsLoadedRegistrants.get(i)).getHandler()); 71105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 71205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mImsiReadyRegistrants: size=" + mImsiReadyRegistrants.size()); 71305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka for (int i = 0; i < mImsiReadyRegistrants.size(); i++) { 71405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mImsiReadyRegistrants[" + i + "]=" 71505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka + ((Registrant)mImsiReadyRegistrants.get(i)).getHandler()); 71605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 71705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mRecordsEventsRegistrants: size=" + mRecordsEventsRegistrants.size()); 71805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka for (int i = 0; i < mRecordsEventsRegistrants.size(); i++) { 71905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mRecordsEventsRegistrants[" + i + "]=" 72005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka + ((Registrant)mRecordsEventsRegistrants.get(i)).getHandler()); 72105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 72205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mNewSmsRegistrants: size=" + mNewSmsRegistrants.size()); 72305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka for (int i = 0; i < mNewSmsRegistrants.size(); i++) { 72405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mNewSmsRegistrants[" + i + "]=" 72505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka + ((Registrant)mNewSmsRegistrants.get(i)).getHandler()); 72605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 72705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mNetworkSelectionModeAutomaticRegistrants: size=" 72805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka + mNetworkSelectionModeAutomaticRegistrants.size()); 72905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka for (int i = 0; i < mNetworkSelectionModeAutomaticRegistrants.size(); i++) { 73005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mNetworkSelectionModeAutomaticRegistrants[" + i + "]=" 73105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka + ((Registrant)mNetworkSelectionModeAutomaticRegistrants.get(i)).getHandler()); 73205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 73322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mRecordsRequested=" + mRecordsRequested); 73422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mRecordsToLoad=" + mRecordsToLoad); 73522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mRdnCache=" + mAdnCache); 7366d7e8df9269a2f05db250145532fd4ce9de6bbadSanket Padawe 737a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan String iccIdToPrint = SubscriptionInfo.givePrintableIccid(mFullIccId); 738497d54c0f337bd71165122d2e2c54ec826f4fb17Sanket Padawe pw.println(" iccid=" + iccIdToPrint); 739a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan 740228824f603b310707829fdd92bf8e16d8f421b58Anthony Lee if (TextUtils.isEmpty(mMsisdn)) { 741228824f603b310707829fdd92bf8e16d8f421b58Anthony Lee pw.println(" mMsisdn=null"); 742228824f603b310707829fdd92bf8e16d8f421b58Anthony Lee } else { 743228824f603b310707829fdd92bf8e16d8f421b58Anthony Lee pw.println(" mMsisdn=" + (VDBG ? mMsisdn : "XXX")); 744228824f603b310707829fdd92bf8e16d8f421b58Anthony Lee } 74522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mMsisdnTag=" + mMsisdnTag); 74622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mVoiceMailNum=" + mVoiceMailNum); 74722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mVoiceMailTag=" + mVoiceMailTag); 74822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mNewVoiceMailNum=" + mNewVoiceMailNum); 74922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mNewVoiceMailTag=" + mNewVoiceMailTag); 75022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mIsVoiceMailFixed=" + mIsVoiceMailFixed); 751a1421a82e8d4f711ba13a86d40889868ead492d4Amit Mahajan if (VDBG) pw.println(" mImsi=" + mImsi); 75222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mMncLength=" + mMncLength); 75322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mMailboxIndex=" + mMailboxIndex); 75422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mSpn=" + mSpn); 75505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.flush(); 75605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 757c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville} 758