134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh/* 234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * Copyright (C) 2009 The Android Open Source Project 334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * 434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * Licensed under the Apache License, Version 2.0 (the "License"); 534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * you may not use this file except in compliance with the License. 634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * You may obtain a copy of the License at 734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * 834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * http://www.apache.org/licenses/LICENSE-2.0 934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * 1034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * Unless required by applicable law or agreed to in writing, software 1134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * distributed under the License is distributed on an "AS IS" BASIS, 1234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * See the License for the specific language governing permissions and 1434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * limitations under the License. 1534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh */ 1634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 1734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshpackage com.android.internal.telephony.gsm; 1834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 1934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport android.os.AsyncResult; 2034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport android.os.Handler; 2134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport android.os.Message; 2234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport android.util.Log; 2334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 2434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport com.android.internal.telephony.AdnRecord; 2534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport com.android.internal.telephony.AdnRecordCache; 2634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport com.android.internal.telephony.IccConstants; 2734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport com.android.internal.telephony.IccUtils; 2834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport com.android.internal.telephony.PhoneBase; 2934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 3034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport org.apache.harmony.luni.lang.reflect.ListOfTypes; 3134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 3234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport java.util.ArrayList; 3334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport java.util.HashMap; 3434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshimport java.util.Map; 3534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 3634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh/** 3734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * This class implements reading and parsing USIM records. 3834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * Refer to Spec 3GPP TS 31.102 for more details. 3934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * 4034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh * {@hide} 4134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh */ 4234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganeshpublic class UsimPhoneBookManager extends Handler implements IccConstants { 4334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final String LOG_TAG = "GSM"; 4434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final boolean DBG = true; 4534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private PbrFile mPbrFile; 4634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private Boolean mIsPbrPresent; 4734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private PhoneBase mPhone; 4834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private AdnRecordCache mAdnCache; 4934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private Object mLock = new Object(); 5034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private ArrayList<AdnRecord> mPhoneBookRecords; 5134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private boolean mEmailPresentInIap = false; 5234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private int mEmailTagNumberInIap = 0; 5334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private ArrayList<byte[]> mIapFileRecord; 5434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private ArrayList<byte[]> mEmailFileRecord; 5534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private Map<Integer, ArrayList<String>> mEmailsForAdnRec; 5634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 5734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int EVENT_PBR_LOAD_DONE = 1; 5834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int EVENT_USIM_ADN_LOAD_DONE = 2; 5934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int EVENT_IAP_LOAD_DONE = 3; 6034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int EVENT_EMAIL_LOAD_DONE = 4; 6134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 6234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int USIM_TYPE1_TAG = 0xA8; 6334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int USIM_TYPE2_TAG = 0xA9; 6434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int USIM_TYPE3_TAG = 0xAA; 6534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int USIM_EFADN_TAG = 0xC0; 6634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int USIM_EFIAP_TAG = 0xC1; 6734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int USIM_EFEXT1_TAG = 0xC2; 6834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int USIM_EFSNE_TAG = 0xC3; 6934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int USIM_EFANR_TAG = 0xC4; 7034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int USIM_EFPBC_TAG = 0xC5; 7134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int USIM_EFGRP_TAG = 0xC6; 7234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int USIM_EFAAS_TAG = 0xC7; 7334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int USIM_EFGSD_TAG = 0xC8; 7434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int USIM_EFUID_TAG = 0xC9; 7534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int USIM_EFEMAIL_TAG = 0xCA; 7634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private static final int USIM_EFCCP1_TAG = 0xCB; 7734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 7834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh public UsimPhoneBookManager(PhoneBase phone, AdnRecordCache cache) { 7934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mPhone = phone; 8034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mPhoneBookRecords = new ArrayList<AdnRecord>(); 8134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mPbrFile = null; 8234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // We assume its present, after the first read this is updated. 8334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // So we don't have to read from UICC if its not present on subsequent reads. 8434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mIsPbrPresent = true; 8534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mAdnCache = cache; 8634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 8734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 8834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh public void reset() { 8934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mPhoneBookRecords.clear(); 9034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mIapFileRecord = null; 9134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mEmailFileRecord = null; 9234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mPbrFile = null; 9334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mIsPbrPresent = true; 9434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 9534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 9634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh public ArrayList<AdnRecord> loadEfFilesFromUsim() { 9734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh synchronized (mLock) { 9834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (!mPhoneBookRecords.isEmpty()) return mPhoneBookRecords; 9934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (!mIsPbrPresent) return null; 10034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 10134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // Check if the PBR file is present in the cache, if not read it 10234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // from the USIM. 10334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (mPbrFile == null) { 10434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh readPbrFileAndWait(); 10534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 10634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 10734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (mPbrFile == null) return null; 10834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 10934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh int numRecs = mPbrFile.mFileIds.size(); 11034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh for (int i = 0; i < numRecs; i++) { 11134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh readAdnFileAndWait(i); 11234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh readEmailFileAndWait(i); 11334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 11434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // All EF files are loaded, post the response. 11534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 11634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh return mPhoneBookRecords; 11734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 11834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 11934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private void readPbrFileAndWait() { 12034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mPhone.getIccFileHandler().loadEFLinearFixedAll(EF_PBR, obtainMessage(EVENT_PBR_LOAD_DONE)); 12134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh try { 12234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mLock.wait(); 12334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } catch (InterruptedException e) { 12434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh Log.e(LOG_TAG, "Interrupted Exception in readAdnFileAndWait"); 12534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 12634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 12734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 12834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private void readEmailFileAndWait(int recNum) { 12934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh Map <Integer,Integer> fileIds; 13034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh fileIds = mPbrFile.mFileIds.get(recNum); 13134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (fileIds == null) return; 13234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 13334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (fileIds.containsKey(USIM_EFEMAIL_TAG)) { 13434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh int efid = fileIds.get(USIM_EFEMAIL_TAG); 13534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // Check if the EFEmail is a Type 1 file or a type 2 file. 13634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // If mEmailPresentInIap is true, its a type 2 file. 13734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // So we read the IAP file and then read the email records. 13834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // instead of reading directly. 13934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (mEmailPresentInIap) { 14034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh readIapFileAndWait(fileIds.get(USIM_EFIAP_TAG)); 14134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (mIapFileRecord == null) { 14234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh Log.e(LOG_TAG, "Error: IAP file is empty"); 14334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh return; 14434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 14534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 14634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // Read the EFEmail file. 14734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mPhone.getIccFileHandler().loadEFLinearFixedAll(fileIds.get(USIM_EFEMAIL_TAG), 14834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh obtainMessage(EVENT_EMAIL_LOAD_DONE)); 14934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh try { 15034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mLock.wait(); 15134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } catch (InterruptedException e) { 15234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh Log.e(LOG_TAG, "Interrupted Exception in readEmailFileAndWait"); 15334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 15434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 15534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (mEmailFileRecord == null) { 15634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh Log.e(LOG_TAG, "Error: Email file is empty"); 15734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh return; 15834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 15934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh updatePhoneAdnRecord(); 16034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 16134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 16234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 16334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 16434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private void readIapFileAndWait(int efid) { 16534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mPhone.getIccFileHandler().loadEFLinearFixedAll(efid, obtainMessage(EVENT_IAP_LOAD_DONE)); 16634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh try { 16734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mLock.wait(); 16834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } catch (InterruptedException e) { 16934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh Log.e(LOG_TAG, "Interrupted Exception in readIapFileAndWait"); 17034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 17134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 17234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 17334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private void updatePhoneAdnRecord() { 17434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (mEmailFileRecord == null) return; 17534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh int numAdnRecs = mPhoneBookRecords.size(); 17634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (mIapFileRecord != null) { 17734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // The number of records in the IAP file is same as the number of records in ADN file. 17834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // The order of the pointers in an EFIAP shall be the same as the order of file IDs 17934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // that appear in the TLV object indicated by Tag 'A9' in the reference file record. 18034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // i.e value of mEmailTagNumberInIap 18134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 18234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh for (int i = 0; i < numAdnRecs; i++) { 18334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh byte[] record = null; 18434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh try { 18534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh record = mIapFileRecord.get(i); 18634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } catch (IndexOutOfBoundsException e) { 18734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh Log.e(LOG_TAG, "Error: Improper ICC card: No IAP record for ADN, continuing"); 18834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh break; 18934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 19034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh int recNum = record[mEmailTagNumberInIap]; 19134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 19234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (recNum != -1) { 19334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh String[] emails = new String[1]; 19434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // SIM record numbers are 1 based 19534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh emails[0] = readEmailRecord(recNum - 1); 19634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh AdnRecord rec = mPhoneBookRecords.get(i); 19734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (rec != null) { 19834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh rec.setEmails(emails); 19934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } else { 20034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // might be a record with only email 20134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh rec = new AdnRecord("", "", emails); 20234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 20334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mPhoneBookRecords.set(i, rec); 20434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 20534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 20634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 20734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 20834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // ICC cards can be made such that they have an IAP file but all 20934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // records are empty. So we read both type 1 and type 2 file 21034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // email records, just to be sure. 21134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 21234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh int len = mPhoneBookRecords.size(); 21334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // Type 1 file, the number of records is the same as the number of 21434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // records in the ADN file. 21534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (mEmailsForAdnRec == null) { 21634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh parseType1EmailFile(len); 21734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 21834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh for (int i = 0; i < numAdnRecs; i++) { 21934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh ArrayList<String> emailList = null; 22034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh try { 22134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh emailList = mEmailsForAdnRec.get(i); 22234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } catch (IndexOutOfBoundsException e) { 22334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh break; 22434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 22534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (emailList == null) continue; 22634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 22734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh AdnRecord rec = mPhoneBookRecords.get(i); 22834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 22934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh String[] emails = new String[emailList.size()]; 23034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh System.arraycopy(emailList.toArray(), 0, emails, 0, emailList.size()); 23134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh rec.setEmails(emails); 23234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mPhoneBookRecords.set(i, rec); 23334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 23434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 23534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 23634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh void parseType1EmailFile(int numRecs) { 23734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mEmailsForAdnRec = new HashMap<Integer, ArrayList<String>>(); 23834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh byte[] emailRec = null; 23934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh for (int i = 0; i < numRecs; i++) { 24034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh try { 24134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh emailRec = mEmailFileRecord.get(i); 24234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } catch (IndexOutOfBoundsException e) { 24334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh Log.e(LOG_TAG, "Error: Improper ICC card: No email record for ADN, continuing"); 24434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh break; 24534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 24634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh int adnRecNum = emailRec[emailRec.length - 1]; 24734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 24834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (adnRecNum == -1) { 24934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh continue; 25034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 25134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 25234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh String email = readEmailRecord(i); 25334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 25434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (email == null || email.equals("")) { 25534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh continue; 25634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 25734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 25834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // SIM record numbers are 1 based. 25934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh ArrayList<String> val = mEmailsForAdnRec.get(adnRecNum - 1); 26034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (val == null) { 26134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh val = new ArrayList<String>(); 26234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 26334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh val.add(email); 26434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // SIM record numbers are 1 based. 26534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mEmailsForAdnRec.put(adnRecNum - 1, val); 26634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 26734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 26834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 26934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private String readEmailRecord(int recNum) { 27034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh byte[] emailRec = null; 27134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh try { 27234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh emailRec = mEmailFileRecord.get(recNum); 27334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } catch (IndexOutOfBoundsException e) { 27434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh return null; 27534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 27634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 27734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // The length of the record is X+2 byte, where X bytes is the email address 27834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh String email = IccUtils.adnStringFieldToString(emailRec, 0, emailRec.length - 2); 27934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh return email; 28034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 28134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 28234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private void readAdnFileAndWait(int recNum) { 28334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh Map <Integer,Integer> fileIds; 28434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh fileIds = mPbrFile.mFileIds.get(recNum); 285036e21083d9936425687d7de29e95b2c458a7e4ajsh if (fileIds == null || fileIds.isEmpty()) return; 28634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 287c2cbc730fcb051c1a12897ec29fbe0280a536f53John Wang 288c2cbc730fcb051c1a12897ec29fbe0280a536f53John Wang int extEf = 0; 289c2cbc730fcb051c1a12897ec29fbe0280a536f53John Wang // Only call fileIds.get while EFEXT1_TAG is available 290c2cbc730fcb051c1a12897ec29fbe0280a536f53John Wang if (fileIds.containsKey(USIM_EFEXT1_TAG)) { 291c2cbc730fcb051c1a12897ec29fbe0280a536f53John Wang extEf = fileIds.get(USIM_EFEXT1_TAG); 292c2cbc730fcb051c1a12897ec29fbe0280a536f53John Wang } 293c2cbc730fcb051c1a12897ec29fbe0280a536f53John Wang 29434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mAdnCache.requestLoadAllAdnLike(fileIds.get(USIM_EFADN_TAG), 295c2cbc730fcb051c1a12897ec29fbe0280a536f53John Wang extEf, obtainMessage(EVENT_USIM_ADN_LOAD_DONE)); 29634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh try { 29734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mLock.wait(); 29834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } catch (InterruptedException e) { 29934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh Log.e(LOG_TAG, "Interrupted Exception in readAdnFileAndWait"); 30034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 30134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 30234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 30334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private void createPbrFile(ArrayList<byte[]> records) { 30434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (records == null) { 30534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mPbrFile = null; 30634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mIsPbrPresent = false; 30734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh return; 30834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 30934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mPbrFile = new PbrFile(records); 31034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 31134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 31234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh @Override 31334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh public void handleMessage(Message msg) { 31434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh AsyncResult ar; 31534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 31634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh switch(msg.what) { 31734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case EVENT_PBR_LOAD_DONE: 31834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh ar = (AsyncResult) msg.obj; 31934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (ar.exception == null) { 32034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh createPbrFile((ArrayList<byte[]>)ar.result); 32134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 32234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh synchronized (mLock) { 32334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mLock.notify(); 32434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 32534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh break; 32634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case EVENT_USIM_ADN_LOAD_DONE: 32734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh log("Loading USIM ADN records done"); 32834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh ar = (AsyncResult) msg.obj; 32934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (ar.exception == null) { 33034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mPhoneBookRecords.addAll((ArrayList<AdnRecord>)ar.result); 33134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 33234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh synchronized (mLock) { 33334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mLock.notify(); 33434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 33534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh break; 33634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case EVENT_IAP_LOAD_DONE: 33734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh log("Loading USIM IAP records done"); 33834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh ar = (AsyncResult) msg.obj; 33934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (ar.exception == null) { 34034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mIapFileRecord = ((ArrayList<byte[]>)ar.result); 34134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 34234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh synchronized (mLock) { 34334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mLock.notify(); 34434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 34534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh break; 34634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case EVENT_EMAIL_LOAD_DONE: 34734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh log("Loading USIM Email records done"); 34834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh ar = (AsyncResult) msg.obj; 34934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (ar.exception == null) { 35034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mEmailFileRecord = ((ArrayList<byte[]>)ar.result); 35134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 35234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 35334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh synchronized (mLock) { 35434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mLock.notify(); 35534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 35634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh break; 35734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 35834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 35934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 36034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private class PbrFile { 36134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh // RecNum <EF Tag, efid> 36234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh HashMap<Integer,Map<Integer,Integer>> mFileIds; 36334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 36434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh PbrFile(ArrayList<byte[]> records) { 36534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mFileIds = new HashMap<Integer, Map<Integer, Integer>>(); 36634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh SimTlv recTlv; 36734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh int recNum = 0; 36834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh for (byte[] record: records) { 36934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh recTlv = new SimTlv(record, 0, record.length); 37034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh parseTag(recTlv, recNum); 37134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh recNum ++; 37234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 37334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 37434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 37534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh void parseTag(SimTlv tlv, int recNum) { 37634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh SimTlv tlvEf; 37734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh int tag; 37834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh byte[] data; 37934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh Map<Integer, Integer> val = new HashMap<Integer, Integer>(); 38034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh do { 38134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh tag = tlv.getTag(); 38234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh switch(tag) { 38334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case USIM_TYPE1_TAG: // A8 38434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case USIM_TYPE3_TAG: // AA 38534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case USIM_TYPE2_TAG: // A9 38634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh data = tlv.getData(); 38734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh tlvEf = new SimTlv(data, 0, data.length); 38834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh parseEf(tlvEf, val, tag); 38934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh break; 39034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 39134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } while (tlv.nextObject()); 39234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mFileIds.put(recNum, val); 39334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 39434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 39534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh void parseEf(SimTlv tlv, Map<Integer, Integer> val, int parentTag) { 39634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh int tag; 39734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh byte[] data; 39834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh int tagNumberWithinParentTag = 0; 39934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh do { 40034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh tag = tlv.getTag(); 40134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if (parentTag == USIM_TYPE2_TAG && tag == USIM_EFEMAIL_TAG) { 40234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mEmailPresentInIap = true; 40334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh mEmailTagNumberInIap = tagNumberWithinParentTag; 40434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 40534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh switch(tag) { 40634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case USIM_EFEMAIL_TAG: 40734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case USIM_EFADN_TAG: 40834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case USIM_EFEXT1_TAG: 40934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case USIM_EFANR_TAG: 41034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case USIM_EFPBC_TAG: 41134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case USIM_EFGRP_TAG: 41234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case USIM_EFAAS_TAG: 41334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case USIM_EFGSD_TAG: 41434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case USIM_EFUID_TAG: 41534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case USIM_EFCCP1_TAG: 41634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case USIM_EFIAP_TAG: 41734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh case USIM_EFSNE_TAG: 41834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh data = tlv.getData(); 419a409128a7238b7b7a2b38f8b3732ca8905b89c71Kenny Root int efid = ((data[0] & 0xFF) << 8) | (data[1] & 0xFF); 42034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh val.put(tag, efid); 42134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh break; 42234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 42334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh tagNumberWithinParentTag ++; 42434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } while(tlv.nextObject()); 42534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 42634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 42734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh 42834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh private void log(String msg) { 42934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh if(DBG) Log.d(LOG_TAG, msg); 43034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh } 43134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh} 432