1c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/* 2c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Copyright (C) 2011 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 19e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.content.Context; 20c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.AsyncResult; 21c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Handler; 22e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport android.os.Message; 2399c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog; 24c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 25e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.CommandsInterface; 26c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.gsm.SimTlv; 27e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka//import com.android.internal.telephony.gsm.VoiceMailConstants; 28c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.FileDescriptor; 3005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.PrintWriter; 31c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.nio.charset.Charset; 32c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.ArrayList; 3305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.util.Arrays; 34c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 35d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport static com.android.internal.telephony.uicc.IccConstants.EF_DOMAIN; 36d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport static com.android.internal.telephony.uicc.IccConstants.EF_IMPI; 37d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport static com.android.internal.telephony.uicc.IccConstants.EF_IMPU; 38c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/** 40c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide} 41c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 42e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkapublic final class IsimUiccRecords extends IccRecords implements IsimRecords { 43cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protected static final String LOG_TAG = "IsimUiccRecords"; 44c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 45c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final boolean DBG = true; 46c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final boolean DUMP_RECORDS = false; // Note: PII is logged when this is true 47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 48e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_APP_READY = 1; 49e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 50c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ISIM EF records (see 3GPP TS 31.103) 51c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private String mIsimImpi; // IMS private user identity 52c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private String mIsimDomain; // IMS home network domain name 53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private String[] mIsimImpu; // IMS public user identity(s) 54c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 55c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int TAG_ISIM_VALUE = 0x80; // From 3GPP TS 31.103 56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 57f92cb4bd5519427a0db673709d94683a8baf203aWink Saville @Override 58f92cb4bd5519427a0db673709d94683a8baf203aWink Saville public String toString() { 59f92cb4bd5519427a0db673709d94683a8baf203aWink Saville return "IsimUiccRecords: " + super.toString() 60f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mIsimImpi=" + mIsimImpi 61f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mIsimDomain=" + mIsimDomain 62f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mIsimImpu=" + mIsimImpu; 63f92cb4bd5519427a0db673709d94683a8baf203aWink Saville } 64f92cb4bd5519427a0db673709d94683a8baf203aWink Saville 65e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public IsimUiccRecords(UiccCardApplication app, Context c, CommandsInterface ci) { 66e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka super(app, c, ci); 67e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 6822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsRequested = false; // No load request is made till SIM ready 69e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 70e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // recordsToLoad is set to 0 because no requests are made yet 7122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad = 0; 72e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 73e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mParentApp.registerForReady(this, EVENT_APP_READY, null); 74f92cb4bd5519427a0db673709d94683a8baf203aWink Saville if (DBG) log("IsimUiccRecords X ctor this=" + this); 75e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 76e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 77e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 78e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void dispose() { 79e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka log("Disposing " + this); 80e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka //Unregister for all events 81e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mParentApp.unregisterForReady(this); 82e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka resetRecords(); 83e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka super.dispose(); 84e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 85e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 86e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // ***** Overridden from Handler 87e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void handleMessage(Message msg) { 88e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mDestroyed.get()) { 8999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.e(LOG_TAG, "Received message " + msg + 90e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka "[" + msg.what + "] while being destroyed. Ignoring."); 91e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 92e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 93e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 94e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka try { 95e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka switch (msg.what) { 96e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_APP_READY: 97e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onReady(); 98e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 99e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 100e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka default: 101e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka super.handleMessage(msg); // IccRecords handles generic record load responses 102e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 103e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 104e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } catch (RuntimeException exc) { 105e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // I don't want these exceptions to be fatal 10699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.w(LOG_TAG, "Exception parsing SIM record", exc); 107e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 108e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 109e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 110e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka protected void fetchIsimRecords() { 11122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsRequested = true; 112e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 113e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mFh.loadEFTransparent(EF_IMPI, obtainMessage( 114e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka IccRecords.EVENT_GET_ICC_RECORD_DONE, new EfIsimImpiLoaded())); 11522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 116e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 117e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mFh.loadEFLinearFixedAll(EF_IMPU, obtainMessage( 118e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka IccRecords.EVENT_GET_ICC_RECORD_DONE, new EfIsimImpuLoaded())); 11922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 120e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 121e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mFh.loadEFTransparent(EF_DOMAIN, obtainMessage( 122e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka IccRecords.EVENT_GET_ICC_RECORD_DONE, new EfIsimDomainLoaded())); 12322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 124e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 12522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville log("fetchIsimRecords " + mRecordsToLoad); 126e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 127e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 128e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka protected void resetRecords() { 129e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // recordsRequested is set to false indicating that the SIM 130e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // read requests made so far are not valid. This is set to 131e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // true only when fresh set of read requests are made. 13222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsRequested = false; 133e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 134e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private class EfIsimImpiLoaded implements IccRecords.IccRecordLoaded { 136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getEfName() { 137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return "EF_ISIM_IMPI"; 138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void onRecordLoaded(AsyncResult ar) { 140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] data = (byte[]) ar.result; 141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mIsimImpi = isimTlvToString(data); 142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DUMP_RECORDS) log("EF_IMPI=" + mIsimImpi); 143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private class EfIsimImpuLoaded implements IccRecords.IccRecordLoaded { 147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getEfName() { 148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return "EF_ISIM_IMPU"; 149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void onRecordLoaded(AsyncResult ar) { 151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ArrayList<byte[]> impuList = (ArrayList<byte[]>) ar.result; 152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("EF_IMPU record count: " + impuList.size()); 153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mIsimImpu = new String[impuList.size()]; 154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int i = 0; 155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (byte[] identity : impuList) { 156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String impu = isimTlvToString(identity); 157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DUMP_RECORDS) log("EF_IMPU[" + i + "]=" + impu); 158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mIsimImpu[i++] = impu; 159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private class EfIsimDomainLoaded implements IccRecords.IccRecordLoaded { 164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getEfName() { 165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return "EF_ISIM_DOMAIN"; 166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void onRecordLoaded(AsyncResult ar) { 168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] data = (byte[]) ar.result; 169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mIsimDomain = isimTlvToString(data); 170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DUMP_RECORDS) log("EF_DOMAIN=" + mIsimDomain); 171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ISIM records for IMS are stored inside a Tag-Length-Value record as a UTF-8 string 176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * with tag value 0x80. 177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param record the byte array containing the IMS data string 178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @return the decoded String value, or null if the record can't be decoded 179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static String isimTlvToString(byte[] record) { 181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SimTlv tlv = new SimTlv(record, 0, record.length); 182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville do { 183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (tlv.getTag() == TAG_ISIM_VALUE) { 184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return new String(tlv.getData(), Charset.forName("UTF-8")); 185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } while (tlv.nextObject()); 187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 18899c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.e(LOG_TAG, "[ISIM] can't find TLV tag in ISIM record, returning null"); 189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return null; 190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 192e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 193e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka protected void onRecordLoaded() { 194e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // One record loaded successfully or failed, In either case 195e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // we need to update the recordsToLoad count 19622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad -= 1; 197e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 19822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mRecordsToLoad == 0 && mRecordsRequested == true) { 199e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onAllRecordsLoaded(); 20022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville } else if (mRecordsToLoad < 0) { 201e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("recordsToLoad <0, programmer error suspected"); 20222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad = 0; 203e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 206e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 207e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka protected void onAllRecordsLoaded() { 208b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville mRecordsLoadedRegistrants.notifyRegistrants( 209e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka new AsyncResult(null, null, null)); 210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Return the IMS private user identity (IMPI). 214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Returns null if the IMPI hasn't been loaded or isn't present on the ISIM. 215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @return the IMS private user identity string, or null if not available 216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 217e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getIsimImpi() { 219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return mIsimImpi; 220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Return the IMS home network domain name. 224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Returns null if the IMS domain hasn't been loaded or isn't present on the ISIM. 225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @return the IMS home network domain name, or null if not available 226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 227e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getIsimDomain() { 229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return mIsimDomain; 230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Return an array of IMS public user identities (IMPU). 234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Returns null if the IMPU hasn't been loaded or isn't present on the ISIM. 235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @return an array of IMS public user identity strings, or null if not available 236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 237e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String[] getIsimImpu() { 239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return (mIsimImpu != null) ? mIsimImpu.clone() : null; 240c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 241e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 242e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 243e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public int getDisplayRule(String plmn) { 244e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Not applicable to Isim 245e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return 0; 246e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 247e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 248e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 249e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void onReady() { 250e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka fetchIsimRecords(); 251e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 252e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 253e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 254e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void onRefresh(boolean fileChanged, int[] fileList) { 255e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // We do not handle it in Isim 256e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 257e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 258e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 259e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void setVoiceMailNumber(String alphaTag, String voiceNumber, 260e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka Message onComplete) { 261e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Not applicable to Isim 262e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 263e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 264e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 265e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void setVoiceMessageWaiting(int line, int countWaiting) { 266e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Not applicable to Isim 267e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 268e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 269e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 270e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka protected void log(String s) { 27199c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (DBG) Rlog.d(LOG_TAG, "[ISIM] " + s); 272e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 273e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 274e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 275e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka protected void loge(String s) { 27699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (DBG) Rlog.e(LOG_TAG, "[ISIM] " + s); 277e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 27805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka 27905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka @Override 28005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 28105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println("IsimRecords: " + this); 28205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" extends:"); 28305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka super.dump(fd, pw, args); 28405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mIsimImpi=" + mIsimImpi); 28505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mIsimDomain=" + mIsimDomain); 28605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mIsimImpu[]=" + Arrays.toString(mIsimImpu)); 28705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.flush(); 28805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville} 290