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