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
26d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.CommandsInterface;
2764bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState;
28c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
2905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.FileDescriptor;
3005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.PrintWriter;
31bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenkaimport java.util.concurrent.atomic.AtomicBoolean;
32bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka
33c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/**
34c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide}
35c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */
36c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic abstract class IccRecords extends Handler implements IccConstants {
37c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected static final boolean DBG = true;
38cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Instance Variables
40bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    protected AtomicBoolean mDestroyed = new AtomicBoolean(false);
41c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected Context mContext;
42c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected CommandsInterface mCi;
43c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected IccFileHandler mFh;
44e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    protected UiccCardApplication mParentApp;
45c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
46b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville    protected RegistrantList mRecordsLoadedRegistrants = new RegistrantList();
47e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    protected RegistrantList mImsiReadyRegistrants = new RegistrantList();
48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected RegistrantList mRecordsEventsRegistrants = new RegistrantList();
49c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected RegistrantList mNewSmsRegistrants = new RegistrantList();
50c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected RegistrantList mNetworkSelectionModeAutomaticRegistrants = new RegistrantList();
51c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
5222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected int mRecordsToLoad;  // number of pending load requests
53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
5422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected AdnRecordCache mAdnCache;
55c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Cached SIM State; cleared on channel close
57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
5822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected boolean mRecordsRequested = false; // true if we've made requests for the sim records
5922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville
60b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville    protected String mIccId;
6122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected String mMsisdn = null;  // My mobile number
6222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected String mMsisdnTag = null;
6322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected String mVoiceMailNum = null;
6422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected String mVoiceMailTag = null;
6522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected String mNewVoiceMailNum = null;
6622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected String mNewVoiceMailTag = null;
6722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected boolean mIsVoiceMailFixed = false;
6822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected int mCountVoiceMessages = 0;
69e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    protected String mImsi;
70c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
7122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected int mMncLength = UNINITIALIZED;
7222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected int mMailboxIndex = 0; // 0 is no mailbox dailing number associated
73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
7422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected String mSpn;
75c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
76620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt    protected String mGid1;
772f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim
78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Constants
79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // Markers for mncLength
81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected static final int UNINITIALIZED = -1;
82c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected static final int UNKNOWN = 0;
83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // Bitmasks for SPN display rules.
85cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public static final int SPN_RULE_SHOW_SPN  = 0x01;
86cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public static final int SPN_RULE_SHOW_PLMN = 0x02;
87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Event Constants
89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected static final int EVENT_SET_MSISDN_DONE = 30;
90bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    public static final int EVENT_MWI = 0; // Message Waiting indication
91bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    public static final int EVENT_CFI = 1; // Call Forwarding indication
92bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka    public static final int EVENT_SPN = 2; // Service Provider Name
93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public static final int EVENT_GET_ICC_RECORD_DONE = 100;
9564bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka    protected static final int EVENT_APP_READY = 1;
96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
97f92cb4bd5519427a0db673709d94683a8baf203aWink Saville    @Override
98f92cb4bd5519427a0db673709d94683a8baf203aWink Saville    public String toString() {
99f92cb4bd5519427a0db673709d94683a8baf203aWink Saville        return "mDestroyed=" + mDestroyed
100f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mContext=" + mContext
101f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mCi=" + mCi
102f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mFh=" + mFh
103f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mParentApp=" + mParentApp
104b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville                + " recordsLoadedRegistrants=" + mRecordsLoadedRegistrants
105f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mImsiReadyRegistrants=" + mImsiReadyRegistrants
106f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mRecordsEventsRegistrants=" + mRecordsEventsRegistrants
107f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mNewSmsRegistrants=" + mNewSmsRegistrants
108f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mNetworkSelectionModeAutomaticRegistrants="
109f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        + mNetworkSelectionModeAutomaticRegistrants
11022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " recordsToLoad=" + mRecordsToLoad
11122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " adnCache=" + mAdnCache
11222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " recordsRequested=" + mRecordsRequested
113b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville                + " iccid=" + mIccId
11422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " msisdn=" + mMsisdn
11522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " msisdnTag=" + mMsisdnTag
11622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " voiceMailNum=" + mVoiceMailNum
11722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " voiceMailTag=" + mVoiceMailTag
11822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " newVoiceMailNum=" + mNewVoiceMailNum
11922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " newVoiceMailTag=" + mNewVoiceMailTag
12022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " isVoiceMailFixed=" + mIsVoiceMailFixed
12122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " countVoiceMessages=" + mCountVoiceMessages
122f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mImsi=" + mImsi
12322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " mncLength=" + mMncLength
12422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " mailboxIndex=" + mMailboxIndex
12522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " spn=" + mSpn;
126f92cb4bd5519427a0db673709d94683a8baf203aWink Saville
127f92cb4bd5519427a0db673709d94683a8baf203aWink Saville    }
128f92cb4bd5519427a0db673709d94683a8baf203aWink Saville
129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Generic ICC record loaded callback. Subclasses can call EF load methods on
131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * {@link IccFileHandler} passing a Message for onLoaded with the what field set to
132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * {@link #EVENT_GET_ICC_RECORD_DONE} and the obj field set to an instance
133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * of this interface. The {@link #handleMessage} method in this class will print a
13422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville     * log message using {@link #getEfName()} and decrement {@link #mRecordsToLoad}.
135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * If the record load was successful, {@link #onRecordLoaded} will be called with the result.
137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Otherwise, an error log message will be output by {@link #handleMessage} and
138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * {@link #onRecordLoaded} will not be called.
139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public interface IccRecordLoaded {
141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        String getEfName();
142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        void onRecordLoaded(AsyncResult ar);
143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Constructor
146e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public IccRecords(UiccCardApplication app, Context c, CommandsInterface ci) {
147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mContext = c;
148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCi = ci;
149e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mFh = app.getIccFileHandler();
150e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mParentApp = app;
151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Call when the IccRecords object is no longer going to be used.
155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void dispose() {
157bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        mDestroyed.set(true);
158e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mParentApp = null;
159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh = null;
160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCi = null;
161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mContext = null;
162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public abstract void onReady();
165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    //***** Public Methods
167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public AdnRecordCache getAdnCache() {
16822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mAdnCache;
169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
171b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville    public String getIccId() {
172b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville        return mIccId;
173b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville    }
174b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville
175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void registerForRecordsLoaded(Handler h, int what, Object obj) {
176bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        if (mDestroyed.get()) {
177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Registrant r = new Registrant(h, what, obj);
181b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville        mRecordsLoadedRegistrants.add(r);
182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
18322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mRecordsToLoad == 0 && mRecordsRequested == true) {
184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            r.notifyRegistrant(new AsyncResult(null, null, null));
185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void unregisterForRecordsLoaded(Handler h) {
188b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville        mRecordsLoadedRegistrants.remove(h);
189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
191e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void registerForImsiReady(Handler h, int what, Object obj) {
192e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mDestroyed.get()) {
193e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            return;
194e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
195e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
196e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        Registrant r = new Registrant(h, what, obj);
197e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mImsiReadyRegistrants.add(r);
198e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
199e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mImsi != null) {
200e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            r.notifyRegistrant(new AsyncResult(null, null, null));
201e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        }
202e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
203e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void unregisterForImsiReady(Handler h) {
204e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mImsiReadyRegistrants.remove(h);
205e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
206e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void registerForRecordsEvents(Handler h, int what, Object obj) {
208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Registrant r = new Registrant (h, what, obj);
209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mRecordsEventsRegistrants.add(r);
210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void unregisterForRecordsEvents(Handler h) {
212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mRecordsEventsRegistrants.remove(h);
213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void registerForNewSms(Handler h, int what, Object obj) {
216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Registrant r = new Registrant (h, what, obj);
217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mNewSmsRegistrants.add(r);
218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void unregisterForNewSms(Handler h) {
220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mNewSmsRegistrants.remove(h);
221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void registerForNetworkSelectionModeAutomatic(
224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            Handler h, int what, Object obj) {
225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        Registrant r = new Registrant (h, what, obj);
226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mNetworkSelectionModeAutomaticRegistrants.add(r);
227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void unregisterForNetworkSelectionModeAutomatic(Handler h) {
229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mNetworkSelectionModeAutomaticRegistrants.remove(h);
230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Get the International Mobile Subscriber ID (IMSI) on a SIM
234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * for GSM, UMTS and like networks. Default is null if IMSI is
235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * not supported or unavailable.
236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @return null if SIM is not yet ready or unavailable
238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getIMSI() {
240c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return null;
241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
243e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    /**
244e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * Imsi could be set by ServiceStateTrackers in case of cdma
245e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     * @param imsi
246e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka     */
247e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public void setImsi(String imsi) {
24822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mImsi = imsi;
249e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mImsiReadyRegistrants.notifyRegistrants();
250e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    }
251e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka
252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getMsisdnNumber() {
25322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mMsisdn;
254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
2572f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim     * Get the Group Identifier Level 1 (GID1) on a SIM for GSM.
2582f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim     * @return null if SIM is not yet ready
2592f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim     */
2602f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim    public String getGid1() {
2612f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim        return null;
2622f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim    }
2632f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim
2642f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim    /**
265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Set subscriber number to SIM record
266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * The subscriber number is stored in EF_MSISDN (TS 51.011)
268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * When the operation is complete, onComplete will be sent to its handler
270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param alphaTag alpha-tagging of the dailing nubmer (up to 10 characters)
272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param number dailing nubmer (up to 20 digits)
273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        if the number starts with '+', then set to international TOA
274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param onComplete
275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        onComplete.obj will be an AsyncResult
276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ((AsyncResult)onComplete.obj).exception == null on success
277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ((AsyncResult)onComplete.obj).exception != null on fail
278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void setMsisdnNumber(String alphaTag, String number,
280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            Message onComplete) {
281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
28222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mMsisdn = number;
28322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mMsisdnTag = alphaTag;
284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
28522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (DBG) log("Set MSISDN: " + mMsisdnTag +" " + mMsisdn);
286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
28822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        AdnRecord adn = new AdnRecord(mMsisdnTag, mMsisdn);
289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        new AdnRecordLoader(mFh).updateEF(adn, EF_MSISDN, EF_EXT1, 1, null,
291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                obtainMessage(EVENT_SET_MSISDN_DONE, onComplete));
292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getMsisdnAlphaTag() {
29522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mMsisdnTag;
296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getVoiceMailNumber() {
29922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mVoiceMailNum;
300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Return Service Provider Name stored in SIM (EF_SPN=0x6F46) or in RUIM (EF_RUIM_SPN=0x6F41)
304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @return null if SIM is not yet ready or no RUIM entry
305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getServiceProviderName() {
30722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mSpn;
308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Set voice mail number to SIM record
312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * The voice mail number can be stored either in EF_MBDN (TS 51.011) or
314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * EF_MAILBOX_CPHS (CPHS 4.2)
315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * If EF_MBDN is available, store the voice mail number to EF_MBDN
317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * If EF_MAILBOX_CPHS is enabled, store the voice mail number to EF_CHPS
319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * So the voice mail number will be stored in both EFs if both are available
321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Return error only if both EF_MBDN and EF_MAILBOX_CPHS fail.
323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * When the operation is complete, onComplete will be sent to its handler
325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param alphaTag alpha-tagging of the dailing nubmer (upto 10 characters)
327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param voiceNumber dailing nubmer (upto 20 digits)
328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        if the number is start with '+', then set to international TOA
329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param onComplete
330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        onComplete.obj will be an AsyncResult
331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ((AsyncResult)onComplete.obj).exception == null on success
332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ((AsyncResult)onComplete.obj).exception != null on fail
333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public abstract void setVoiceMailNumber(String alphaTag, String voiceNumber,
335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            Message onComplete);
336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getVoiceMailAlphaTag() {
33822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mVoiceMailTag;
339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Sets the SIM voice message waiting indicator records
343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param line GSM Subscriber Profile Number, one-based. Only '1' is supported
344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param countWaiting The number of messages waiting, if known. Use
345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *                     -1 to indicate that an unknown number of
346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *                      messages are waiting
347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public abstract void setVoiceMessageWaiting(int line, int countWaiting);
349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /** @return  true if there are messages waiting, false otherwise. */
351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public boolean getVoiceMessageWaiting() {
35222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mCountVoiceMessages != 0;
353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Returns number of voice messages waiting, if available
357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * If not available (eg, on an older CPHS SIM) -1 is returned if
358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * getVoiceMessageWaiting() is true
359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public int getVoiceMessageCount() {
36122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mCountVoiceMessages;
362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Called by STK Service when REFRESH is received.
366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param fileChanged indicates whether any files changed
367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param fileList if non-null, a list of EF files that changed
368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public abstract void onRefresh(boolean fileChanged, int[] fileList);
370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
37164bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka    /**
37264bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka     * Called by subclasses (SimRecords and RuimRecords) whenever
37364bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka     * IccRefreshResponse.REFRESH_RESULT_INIT event received
37464bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka     */
37564bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka    protected void onIccRefreshInit() {
376652fe674a597e221274a3746118f15cf40c7dbb9Wink Saville        mAdnCache.reset();
37764bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka        if (mParentApp.getState() == AppState.APPSTATE_READY) {
37864bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka            // This will cause files to be reread
37964bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka            sendMessage(obtainMessage(EVENT_APP_READY));
38064bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka        }
38164bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka    }
382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public boolean getRecordsLoaded() {
38422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mRecordsToLoad == 0 && mRecordsRequested == true) {
385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return true;
386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return false;
388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
390c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    //***** Overridden from Handler
392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void handleMessage(Message msg) {
394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        switch (msg.what) {
395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_ICC_RECORD_DONE:
396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                try {
397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    AsyncResult ar = (AsyncResult) msg.obj;
398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    IccRecordLoaded recordLoaded = (IccRecordLoaded) ar.userObj;
399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) log(recordLoaded.getEfName() + " LOADED");
400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (ar.exception != null) {
402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        loge("Record Load Exception: " + ar.exception);
403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    } else {
404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        recordLoaded.onRecordLoaded(ar);
405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }catch (RuntimeException exc) {
407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // I don't want these exceptions to be fatal
408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("Exception parsing SIM record: " + exc);
409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } finally {
410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Count up record load responses even if they are fails
411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    onRecordLoaded();
412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
413c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            default:
416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                super.handleMessage(msg);
417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected abstract void onRecordLoaded();
421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
422c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected abstract void onAllRecordsLoaded();
423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Returns the SpnDisplayRule based on settings on the SIM and the
426c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * specified plmn (currently-registered PLMN).  See TS 22.101 Annex A
427c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * and TS 51.011 10.3.11 for details.
428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * If the SPN is not found on the SIM, the rule is always PLMN_ONLY.
430c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Generally used for GSM/UMTS and the like SIMs.
431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
432c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public abstract int getDisplayRule(String plmn);
433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
435c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Return true if "Restriction of menu options for manual PLMN selection"
436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * bit is set or EF_CSP data is unavailable, return false otherwise.
437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Generally used for GSM/UMTS and the like SIMs.
438c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public boolean isCspPlmnEnabled() {
440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return false;
441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
443c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Returns the 5 or 6 digit MCC/MNC of the operator that
445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * provided the SIM card. Returns null of SIM is not yet ready
446c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * or is not valid for the type of IccCard. Generally used for
447c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * GSM/UMTS and the like SIMS
448c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
449c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getOperatorNumeric() {
450c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return null;
451c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
452c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
453c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
454c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Get the current Voice call forwarding flag for GSM/UMTS and the like SIMs
455c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
456c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @return true if enabled
457c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public boolean getVoiceCallForwardingFlag() {
459c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return false;
460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
461c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
462c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
463c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Set the voice call forwarding flag for GSM/UMTS and the like SIMs
464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
465c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param line to enable/disable
466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param enable
467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void setVoiceCallForwardingFlag(int line, boolean enable) {
469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
471c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Indicates wether SIM is in provisioned state or not.
473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Overridden only if SIM can be dynamically provisioned via OTA.
474c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @return true if provisioned
476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public boolean isProvisioned () {
478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return true;
479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Write string to log file
483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param s is the string to write
485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected abstract void log(String s);
487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Write error string to log file.
490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param s is the string to write
492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected abstract void loge(String s);
494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
495c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
496c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Return an interface to retrieve the ISIM records for IMS, if available.
497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @return the interface to retrieve the ISIM records, or null if not supported
498c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public IsimRecords getIsimRecords() {
500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return null;
501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public UsimServiceTable getUsimServiceTable() {
504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return null;
505c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
50605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka
50705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
50805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println("IccRecords: " + this);
50905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mDestroyed=" + mDestroyed);
51005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mCi=" + mCi);
51105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mFh=" + mFh);
51205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mParentApp=" + mParentApp);
513b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville        pw.println(" recordsLoadedRegistrants: size=" + mRecordsLoadedRegistrants.size());
514b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville        for (int i = 0; i < mRecordsLoadedRegistrants.size(); i++) {
51505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka            pw.println("  recordsLoadedRegistrants[" + i + "]="
516b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville                    + ((Registrant)mRecordsLoadedRegistrants.get(i)).getHandler());
51705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        }
51805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mImsiReadyRegistrants: size=" + mImsiReadyRegistrants.size());
51905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        for (int i = 0; i < mImsiReadyRegistrants.size(); i++) {
52005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka            pw.println("  mImsiReadyRegistrants[" + i + "]="
52105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka                    + ((Registrant)mImsiReadyRegistrants.get(i)).getHandler());
52205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        }
52305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mRecordsEventsRegistrants: size=" + mRecordsEventsRegistrants.size());
52405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        for (int i = 0; i < mRecordsEventsRegistrants.size(); i++) {
52505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka            pw.println("  mRecordsEventsRegistrants[" + i + "]="
52605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka                    + ((Registrant)mRecordsEventsRegistrants.get(i)).getHandler());
52705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        }
52805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mNewSmsRegistrants: size=" + mNewSmsRegistrants.size());
52905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        for (int i = 0; i < mNewSmsRegistrants.size(); i++) {
53005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka            pw.println("  mNewSmsRegistrants[" + i + "]="
53105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka                    + ((Registrant)mNewSmsRegistrants.get(i)).getHandler());
53205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        }
53305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mNetworkSelectionModeAutomaticRegistrants: size="
53405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka                + mNetworkSelectionModeAutomaticRegistrants.size());
53505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        for (int i = 0; i < mNetworkSelectionModeAutomaticRegistrants.size(); i++) {
53605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka            pw.println("  mNetworkSelectionModeAutomaticRegistrants[" + i + "]="
53705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka                    + ((Registrant)mNetworkSelectionModeAutomaticRegistrants.get(i)).getHandler());
53805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        }
53922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mRecordsRequested=" + mRecordsRequested);
54022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mRecordsToLoad=" + mRecordsToLoad);
54122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mRdnCache=" + mAdnCache);
542b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville        pw.println(" iccid=" + mIccId);
54322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mMsisdn=" + mMsisdn);
54422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mMsisdnTag=" + mMsisdnTag);
54522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mVoiceMailNum=" + mVoiceMailNum);
54622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mVoiceMailTag=" + mVoiceMailTag);
54722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mNewVoiceMailNum=" + mNewVoiceMailNum);
54822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mNewVoiceMailTag=" + mNewVoiceMailTag);
54922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mIsVoiceMailFixed=" + mIsVoiceMailFixed);
55022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mCountVoiceMessages=" + mCountVoiceMessages);
55105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mImsi=" + mImsi);
55222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mMncLength=" + mMncLength);
55322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mMailboxIndex=" + mMailboxIndex);
55422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mSpn=" + mSpn);
55505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.flush();
55605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka    }
557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville}
558