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