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.Message;
2231ae682ff511ddde4073c3f94eff15da2f7fade6Wink Savilleimport android.telephony.PhoneNumberUtils;
23a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hambyimport android.telephony.SmsMessage;
242bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapatiimport android.text.TextUtils;
2599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog;
266e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seoimport android.content.res.Resources;
27c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
28c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.CommandsInterface;
29c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.MccTable;
30a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hambyimport com.android.internal.telephony.SmsConstants;
31b9adaa1c4a12df8c8bd44b4803d452662b53e0d8Tom Taylorimport com.android.internal.telephony.SubscriptionController;
32d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.gsm.SimTlv;
33230e46bdd850306dcc54ab6038d4d3132f5032abnfjbimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState;
34230e46bdd850306dcc54ab6038d4d3132f5032abnfjbimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType;
35c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
3605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.FileDescriptor;
3705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.PrintWriter;
38c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.ArrayList;
3905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.util.Arrays;
40c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
41c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/**
42c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide}
43c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */
44c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic class SIMRecords extends IccRecords {
45cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final String LOG_TAG = "SIMRecords";
46c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final boolean CRASH_RIL = false;
48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
49c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Instance Variables
50c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
51c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    VoiceMailConstants mVmConfig;
52c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
54c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    SpnOverride mSpnOverride;
55c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Cached SIM State; cleared on channel close
57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
58eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan    private int mCallForwardingStatus;
59c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
60c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
61c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
62c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * States only used by getSpnFsm FSM
63c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
6422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private GetSpnFsmState mSpnState;
65c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
66c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /** CPHS service information (See CPHS 4.2 B.3.1.1)
67c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *  It will be set in onSimReady if reading GET_CPHS_INFO successfully
68c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *  mCphsInfo[0] is CPHS Phase
69c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *  mCphsInfo[1] and mCphsInfo[2] is CPHS Service Table
70c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private byte[] mCphsInfo = null;
72c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    boolean mCspPlmnEnabled = true;
73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
7422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    byte[] mEfMWIS = null;
7522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    byte[] mEfCPHS_MWI =null;
76c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    byte[] mEfCff = null;
77c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    byte[] mEfCfis = null;
78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
79230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    byte[] mEfLi = null;
80230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    byte[] mEfPl = null;
81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
8222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    int mSpnDisplayCondition;
83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // Numeric network codes listed in TS 51.011 EF[SPDI]
8422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    ArrayList<String> mSpdiNetworks = null;
85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
8622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    String mPnnHomeName = null;
87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    UsimServiceTable mUsimServiceTable;
89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
90f92cb4bd5519427a0db673709d94683a8baf203aWink Saville    @Override
91f92cb4bd5519427a0db673709d94683a8baf203aWink Saville    public String toString() {
92f92cb4bd5519427a0db673709d94683a8baf203aWink Saville        return "SimRecords: " + super.toString()
93f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mVmConfig" + mVmConfig
94f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mSpnOverride=" + "mSpnOverride"
95eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan                + " callForwardingEnabled=" + mCallForwardingStatus
9622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " spnState=" + mSpnState
97f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mCphsInfo=" + mCphsInfo
98f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mCspPlmnEnabled=" + mCspPlmnEnabled
9922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " efMWIS=" + mEfMWIS
10022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " efCPHS_MWI=" + mEfCPHS_MWI
101f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mEfCff=" + mEfCff
102f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mEfCfis=" + mEfCfis
103f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " getOperatorNumeric=" + getOperatorNumeric();
104f92cb4bd5519427a0db673709d94683a8baf203aWink Saville    }
105f92cb4bd5519427a0db673709d94683a8baf203aWink Saville
106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Constants
107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // From TS 51.011 EF[SPDI] section
109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int TAG_SPDI = 0xA3;
110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int TAG_SPDI_PLMN_LIST = 0x80;
111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // Full Name IEI from TS 24.008
113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int TAG_FULL_NETWORK_NAME = 0x43;
114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // Short Name IEI from TS 24.008
116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int TAG_SHORT_NETWORK_NAME = 0x45;
117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // active CFF from CPHS 4.2 B.4.5
119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int CFF_UNCONDITIONAL_ACTIVE = 0x0a;
120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int CFF_UNCONDITIONAL_DEACTIVE = 0x05;
121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int CFF_LINE1_MASK = 0x0f;
122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int CFF_LINE1_RESET = 0xf0;
123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // CPHS Service Table (See CPHS 4.2 B.3.1)
125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int CPHS_SST_MBN_MASK = 0x30;
126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int CPHS_SST_MBN_ENABLED = 0x30;
127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
12831ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    // EF_CFIS related constants
12931ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    // Spec reference TS 51.011 section 10.3.46.
13031ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    private static final int CFIS_BCD_NUMBER_LENGTH_OFFSET = 2;
13131ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    private static final int CFIS_TON_NPI_OFFSET = 3;
13231ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    private static final int CFIS_ADN_CAPABILITY_ID_OFFSET = 14;
13331ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    private static final int CFIS_ADN_EXTENSION_ID_OFFSET = 15;
13431ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville
135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Event Constants
136e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_GET_IMSI_DONE = 3;
137e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_GET_ICCID_DONE = 4;
138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_MBI_DONE = 5;
139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_MBDN_DONE = 6;
140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_MWIS_DONE = 7;
141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE = 8;
142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected static final int EVENT_GET_AD_DONE = 9; // Admin data on SIM
143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected static final int EVENT_GET_MSISDN_DONE = 10;
144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_CPHS_MAILBOX_DONE = 11;
145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_SPN_DONE = 12;
146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_SPDI_DONE = 13;
147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_UPDATE_DONE = 14;
148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_PNN_DONE = 15;
149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected static final int EVENT_GET_SST_DONE = 17;
150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_ALL_SMS_DONE = 18;
151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_MARK_SMS_READ_DONE = 19;
152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_SET_MBDN_DONE = 20;
153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_SMS_ON_SIM = 21;
154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_SMS_DONE = 22;
155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_CFF_DONE = 24;
156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_SET_CPHS_MAILBOX_DONE = 25;
157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_INFO_CPHS_DONE = 26;
158cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // private static final int EVENT_SET_MSISDN_DONE = 30; Defined in IccRecords as 30
159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_SIM_REFRESH = 31;
160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_CFIS_DONE = 32;
161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_CSP_CPHS_DONE = 33;
1622f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim    private static final int EVENT_GET_GID1_DONE = 34;
163230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private static final int EVENT_APP_LOCKED = 35;
1647234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu    private static final int EVENT_GET_GID2_DONE = 36;
165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // Lookup table for carriers known to produce SIMs which incorrectly indicate MNC length.
167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final String[] MCCMNC_CODES_HAVING_3DIGITS_MNC = {
1690530f592d89c1eceea7ee5bccb2359061a04f968duho.ro        "302370", "302720", "310260",
170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405025", "405026", "405027", "405028", "405029", "405030", "405031", "405032",
171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405033", "405034", "405035", "405036", "405037", "405038", "405039", "405040",
172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405041", "405042", "405043", "405044", "405045", "405046", "405047", "405750",
173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405751", "405752", "405753", "405754", "405755", "405756", "405799", "405800",
174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405801", "405802", "405803", "405804", "405805", "405806", "405807", "405808",
175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405809", "405810", "405811", "405812", "405813", "405814", "405815", "405816",
176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405817", "405818", "405819", "405820", "405821", "405822", "405823", "405824",
177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405825", "405826", "405827", "405828", "405829", "405830", "405831", "405832",
178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405833", "405834", "405835", "405836", "405837", "405838", "405839", "405840",
179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405841", "405842", "405843", "405844", "405845", "405846", "405847", "405848",
180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405849", "405850", "405851", "405852", "405853", "405875", "405876", "405877",
181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405878", "405879", "405880", "405881", "405882", "405883", "405884", "405885",
182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405886", "405908", "405909", "405910", "405911", "405912", "405913", "405914",
183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405915", "405916", "405917", "405918", "405919", "405920", "405921", "405922",
184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405923", "405924", "405925", "405926", "405927", "405928", "405929", "405930",
1850530f592d89c1eceea7ee5bccb2359061a04f968duho.ro        "405931", "405932", "502142", "502143", "502145", "502146", "502147", "502148"
186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    };
187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Constructor
189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
190e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public SIMRecords(UiccCardApplication app, Context c, CommandsInterface ci) {
191e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        super(app, c, ci);
192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
19322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mAdnCache = new AdnRecordCache(mFh);
194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mVmConfig = new VoiceMailConstants();
196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mSpnOverride = new SpnOverride();
197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
19822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsRequested = false;  // No load request is made till SIM ready
199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // recordsToLoad is set to 0 because no requests are made yet
20122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad = 0;
202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCi.setOnSmsOnSim(this, EVENT_SMS_ON_SIM, null);
204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCi.registerForIccRefresh(this, EVENT_SIM_REFRESH, null);
205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Start off by setting empty state
207e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        resetRecords();
208e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mParentApp.registerForReady(this, EVENT_APP_READY, null);
209230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        mParentApp.registerForLocked(this, EVENT_APP_LOCKED, null);
210f92cb4bd5519427a0db673709d94683a8baf203aWink Saville        if (DBG) log("SIMRecords X ctor this=" + this);
211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void dispose() {
215f92cb4bd5519427a0db673709d94683a8baf203aWink Saville        if (DBG) log("Disposing SIMRecords this=" + this);
216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        //Unregister for all events
217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCi.unregisterForIccRefresh(this);
218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCi.unSetOnSmsOnSim(this);
219e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mParentApp.unregisterForReady(this);
220230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        mParentApp.unregisterForLocked(this);
221e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        resetRecords();
222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        super.dispose();
223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
225cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void finalize() {
227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if(DBG) log("finalized");
228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
230e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    protected void resetRecords() {
231e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mImsi = null;
23222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mMsisdn = null;
23322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mVoiceMailNum = null;
23422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mMncLength = UNINITIALIZED;
235a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        log("setting0 mMncLength" + mMncLength);
236b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville        mIccId = null;
237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // -1 means no EF_SPN found; treat accordingly.
23822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mSpnDisplayCondition = -1;
23922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mEfMWIS = null;
24022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mEfCPHS_MWI = null;
24122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mSpdiNetworks = null;
24222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPnnHomeName = null;
243620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt        mGid1 = null;
2447234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu        mGid2 = null;
245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
24622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mAdnCache.reset();
247c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        log("SIMRecords: onRadioOffOrNotAvailable set 'gsm.sim.operator.numeric' to operator=null");
249a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        log("update icc_operator_numeric=" + null);
250e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu        mTelephonyManager.setSimOperatorNumericForPhone(mParentApp.getPhoneId(), "");
251e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu        mTelephonyManager.setSimOperatorNameForPhone(mParentApp.getPhoneId(), "");
252e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu        mTelephonyManager.setSimCountryIsoForPhone(mParentApp.getPhoneId(), "");
253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // recordsRequested is set to false indicating that the SIM
255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // read requests made so far are not valid. This is set to
256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // true only when fresh set of read requests are made.
25722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsRequested = false;
258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    //***** Public Methods
262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * {@inheritDoc}
265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getIMSI() {
268e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        return mImsi;
269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
271cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getMsisdnNumber() {
27322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mMsisdn;
274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
2772f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim    public String getGid1() {
278620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt        return mGid1;
2792f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim    }
2802f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim
2812f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim    @Override
2827234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu    public String getGid2() {
2837234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu        return mGid2;
2847234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu    }
2857234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu
2867234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu    @Override
287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public UsimServiceTable getUsimServiceTable() {
288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return mUsimServiceTable;
289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
291b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja    private int getExtFromEf(int ef) {
292b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja        int ext;
293b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja        switch (ef) {
294b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja            case EF_MSISDN:
295b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja                /* For USIM apps use EXT5. (TS 31.102 Section 4.2.37) */
296b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja                if (mParentApp.getType() == AppType.APPTYPE_USIM) {
297b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja                    ext = EF_EXT5;
298b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja                } else {
299b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja                    ext = EF_EXT1;
300b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja                }
301b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja                break;
302b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja            default:
303b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja                ext = EF_EXT1;
304b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja        }
305b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja        return ext;
306b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja    }
307b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja
308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Set subscriber number to SIM record
310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * The subscriber number is stored in EF_MSISDN (TS 51.011)
312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * When the operation is complete, onComplete will be sent to its handler
314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param alphaTag alpha-tagging of the dailing nubmer (up to 10 characters)
316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param number dailing nubmer (up to 20 digits)
317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        if the number starts with '+', then set to international TOA
318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param onComplete
319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        onComplete.obj will be an AsyncResult
320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ((AsyncResult)onComplete.obj).exception == null on success
321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ((AsyncResult)onComplete.obj).exception != null on fail
322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
323cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void setMsisdnNumber(String alphaTag, String number,
325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            Message onComplete) {
326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
3276bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        // If the SIM card is locked by PIN, we will set EF_MSISDN fail.
3286bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        // In that case, msisdn and msisdnTag should not be update.
3296bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        mNewMsisdn = number;
3306bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        mNewMsisdnTag = alphaTag;
331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
3326bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        if(DBG) log("Set MSISDN: " + mNewMsisdnTag + " " + /*mNewMsisdn*/ "xxxxxxx");
333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
3346bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        AdnRecord adn = new AdnRecord(mNewMsisdnTag, mNewMsisdn);
335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
336b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja        new AdnRecordLoader(mFh).updateEF(adn, EF_MSISDN, getExtFromEf(EF_MSISDN), 1, null,
337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                obtainMessage(EVENT_SET_MSISDN_DONE, onComplete));
338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
340cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getMsisdnAlphaTag() {
34222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mMsisdnTag;
343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
345cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getVoiceMailNumber() {
34722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mVoiceMailNum;
348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Set voice mail number to SIM record
352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * The voice mail number can be stored either in EF_MBDN (TS 51.011) or
354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * EF_MAILBOX_CPHS (CPHS 4.2)
355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * If EF_MBDN is available, store the voice mail number to EF_MBDN
357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * If EF_MAILBOX_CPHS is enabled, store the voice mail number to EF_CHPS
359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * So the voice mail number will be stored in both EFs if both are available
361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Return error only if both EF_MBDN and EF_MAILBOX_CPHS fail.
363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * When the operation is complete, onComplete will be sent to its handler
365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param alphaTag alpha-tagging of the dailing nubmer (upto 10 characters)
367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param voiceNumber dailing nubmer (upto 20 digits)
368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        if the number is start with '+', then set to international TOA
369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param onComplete
370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        onComplete.obj will be an AsyncResult
371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ((AsyncResult)onComplete.obj).exception == null on success
372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ((AsyncResult)onComplete.obj).exception != null on fail
373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
374cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void setVoiceMailNumber(String alphaTag, String voiceNumber,
376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            Message onComplete) {
37722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mIsVoiceMailFixed) {
378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            AsyncResult.forMessage((onComplete)).exception =
379c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new IccVmFixedException("Voicemail number is fixed by operator");
380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            onComplete.sendToTarget();
381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
38422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mNewVoiceMailNum = voiceNumber;
38522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mNewVoiceMailTag = alphaTag;
386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
38722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        AdnRecord adn = new AdnRecord(mNewVoiceMailTag, mNewVoiceMailNum);
388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
38922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mMailboxIndex != 0 && mMailboxIndex != 0xff) {
390c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            new AdnRecordLoader(mFh).updateEF(adn, EF_MBDN, EF_EXT6,
39222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mMailboxIndex, null,
393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    obtainMessage(EVENT_SET_MBDN_DONE, onComplete));
394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else if (isCphsMailboxEnabled()) {
396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            new AdnRecordLoader(mFh).updateEF(adn, EF_MAILBOX_CPHS,
398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    EF_EXT1, 1, null,
399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    obtainMessage(EVENT_SET_CPHS_MAILBOX_DONE, onComplete));
400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            AsyncResult.forMessage((onComplete)).exception =
403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new IccVmNotSupportedException("Update SIM voice mailbox error");
404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            onComplete.sendToTarget();
405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
408cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getVoiceMailAlphaTag()
410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    {
41122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mVoiceMailTag;
412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
413c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Sets the SIM voice message waiting indicator records
416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param line GSM Subscriber Profile Number, one-based. Only '1' is supported
417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param countWaiting The number of messages waiting, if known. Use
418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *                     -1 to indicate that an unknown number of
419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *                      messages are waiting
420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
421cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
422c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void
423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    setVoiceMessageWaiting(int line, int countWaiting) {
424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (line != 1) {
425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // only profile 1 is supported
426c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
427c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        try {
43022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (mEfMWIS != null) {
431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // TS 51.011 10.3.45
432c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // lsb of byte 0 is 'voicemail' status
43422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mEfMWIS[0] = (byte)((mEfMWIS[0] & 0xfe)
43526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                                    | (countWaiting == 0 ? 0 : 1));
436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // byte 1 is the number of voice messages waiting
438c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (countWaiting < 0) {
439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // The spec does not define what this should be
440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // if we don't know the count
44122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mEfMWIS[1] = 0;
442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
44322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mEfMWIS[1] = (byte) countWaiting;
444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
446c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.updateEFLinearFixed(
44722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    EF_MWIS, 1, mEfMWIS, null,
44826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                    obtainMessage (EVENT_UPDATE_DONE, EF_MWIS, 0));
449c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
450c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
45122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (mEfCPHS_MWI != null) {
452c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Refer CPHS4_2.WW6 B4.2.3
45322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mEfCPHS_MWI[0] = (byte)((mEfCPHS_MWI[0] & 0xf0)
45426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                            | (countWaiting == 0 ? 0x5 : 0xa));
455c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.updateEFTransparent(
45622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    EF_VOICE_MAIL_INDICATOR_CPHS, mEfCPHS_MWI,
457c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    obtainMessage (EVENT_UPDATE_DONE, EF_VOICE_MAIL_INDICATOR_CPHS));
458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
459c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } catch (ArrayIndexOutOfBoundsException ex) {
460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            logw("Error saving voice mail state to SIM. Probably malformed SIM record", ex);
461c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
462c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
463c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
464a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville    // Validate data is !null and the MSP (Multiple Subscriber Profile)
465a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville    // byte is between 1 and 4. See ETSI TS 131 102 v11.3.0 section 4.2.64.
466a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville    private boolean validEfCfis(byte[] data) {
467a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville        return ((data != null) && (data[0] >= 1) && (data[0] <= 4));
468a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville    }
469a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville
47026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa    public int getVoiceMessageCount() {
47126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        boolean voiceMailWaiting = false;
472481a66b57a62b669a4ff3b173f3e96aabec65592Amit Mahajan        int countVoiceMessages = 0;
47326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        if (mEfMWIS != null) {
47426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            // Use this data if the EF[MWIS] exists and
47526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            // has been loaded
47626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            // Refer TS 51.011 Section 10.3.45 for the content description
47726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            voiceMailWaiting = ((mEfMWIS[0] & 0x01) != 0);
47826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            countVoiceMessages = mEfMWIS[1] & 0xff;
47926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa
48026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            if (voiceMailWaiting && countVoiceMessages == 0) {
48126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                // Unknown count = -1
48226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                countVoiceMessages = -1;
48326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            }
48426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            if(DBG) log(" VoiceMessageCount from SIM MWIS = " + countVoiceMessages);
48526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        } else if (mEfCPHS_MWI != null) {
48626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            // use voice mail count from CPHS
48726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            int indicator = (int) (mEfCPHS_MWI[0] & 0xf);
48826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa
48926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            // Refer CPHS4_2.WW6 B4.2.3
49026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            if (indicator == 0xA) {
49126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                // Unknown count = -1
49226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                countVoiceMessages = -1;
49326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            } else if (indicator == 0x5) {
49426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                countVoiceMessages = 0;
49526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            }
49626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            if(DBG) log(" VoiceMessageCount from SIM CPHS = " + countVoiceMessages);
49726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        }
49826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        return countVoiceMessages;
49926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa    }
50026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa
501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * {@inheritDoc}
503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
505eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan    public int getVoiceCallForwardingFlag() {
506eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan        return mCallForwardingStatus;
507c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
508c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
509c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
510c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * {@inheritDoc}
511c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
512c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
51331ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    public void setVoiceCallForwardingFlag(int line, boolean enable, String dialNumber) {
514c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
515c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (line != 1) return; // only line 1 is supported
516c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
517eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan        mCallForwardingStatus = enable ? CALL_FORWARDING_STATUS_ENABLED :
518eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan                CALL_FORWARDING_STATUS_DISABLED;
519c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
520c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mRecordsEventsRegistrants.notifyResult(EVENT_CFI);
521c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
522c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        try {
523a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville            if (validEfCfis(mEfCfis)) {
524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // lsb is of byte 1 is voice status
525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (enable) {
526c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mEfCfis[1] |= 1;
527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
528c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mEfCfis[1] &= 0xfe;
529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
530c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
531a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                log("setVoiceCallForwardingFlag: enable=" + enable
532a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                        + " mEfCfis=" + IccUtils.bytesToHexString(mEfCfis));
533a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville
53431ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                // Update dialNumber if not empty and CFU is enabled.
53531ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                // Spec reference for EF_CFIS contents, TS 51.011 section 10.3.46.
53631ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                if (enable && !TextUtils.isEmpty(dialNumber)) {
53731ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    log("EF_CFIS: updating cf number, " + dialNumber);
53831ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    byte[] bcdNumber = PhoneNumberUtils.numberToCalledPartyBCD(dialNumber);
53931ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville
54031ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    System.arraycopy(bcdNumber, 0, mEfCfis, CFIS_TON_NPI_OFFSET, bcdNumber.length);
54131ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville
54231ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    mEfCfis[CFIS_BCD_NUMBER_LENGTH_OFFSET] = (byte) (bcdNumber.length);
54331ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    mEfCfis[CFIS_ADN_CAPABILITY_ID_OFFSET] = (byte) 0xFF;
54431ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    mEfCfis[CFIS_ADN_EXTENSION_ID_OFFSET] = (byte) 0xFF;
54531ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                }
546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
547c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.updateEFLinearFixed(
548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        EF_CFIS, 1, mEfCfis, null,
549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        obtainMessage (EVENT_UPDATE_DONE, EF_CFIS));
550a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville            } else {
551a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                log("setVoiceCallForwardingFlag: ignoring enable=" + enable
552a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                        + " invalid mEfCfis=" + IccUtils.bytesToHexString(mEfCfis));
553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
555c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (mEfCff != null) {
556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (enable) {
557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mEfCff[0] = (byte) ((mEfCff[0] & CFF_LINE1_RESET)
558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            | CFF_UNCONDITIONAL_ACTIVE);
559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
560c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mEfCff[0] = (byte) ((mEfCff[0] & CFF_LINE1_RESET)
561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            | CFF_UNCONDITIONAL_DEACTIVE);
562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.updateEFTransparent(
565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        EF_CFF_CPHS, mEfCff,
566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        obtainMessage (EVENT_UPDATE_DONE, EF_CFF_CPHS));
567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } catch (ArrayIndexOutOfBoundsException ex) {
569e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby            logw("Error saving call forwarding flag to SIM. "
570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            + "Probably malformed SIM record", ex);
571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
576c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Called by STK Service when REFRESH is received.
577c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param fileChanged indicates whether any files changed
578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param fileList if non-null, a list of EF files that changed
579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
580cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void onRefresh(boolean fileChanged, int[] fileList) {
582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (fileChanged) {
583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // A future optimization would be to inspect fileList and
584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // only reload those files that we care about.  For now,
585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // just re-fetch all SIM records that we cache.
586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            fetchSimRecords();
587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * {@inheritDoc}
592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getOperatorNumeric() {
595e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mImsi == null) {
596c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("getOperatorNumeric: IMSI == null");
597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return null;
598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
59922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mMncLength == UNINITIALIZED || mMncLength == UNKNOWN) {
600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("getSIMOperatorNumeric: bad mncLength");
601c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return null;
602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Length = length of MCC + length of MNC
605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // length of mcc = 3 (TS 23.003 Section 2.2)
60622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mImsi.substring(0, 3 + mMncLength);
607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Overridden from Handler
610cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void handleMessage(Message msg) {
612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        AsyncResult ar;
613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        AdnRecord adn;
614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        byte data[];
616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean isRecordLoadResponse = false;
618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
619bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        if (mDestroyed.get()) {
620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            loge("Received message " + msg + "[" + msg.what + "] " +
621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    " while being destroyed. Ignoring.");
622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        try { switch (msg.what) {
626e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case EVENT_APP_READY:
627e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                onReady();
628e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
630230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            case EVENT_APP_LOCKED:
631230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                onLocked();
632230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                break;
633230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            /* IO events */
635c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_IMSI_DONE:
636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
641c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("Exception querying IMSI, Exception:" + ar.exception);
642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
645e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mImsi = (String) ar.result;
646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // IMSI (MCC+MNC+MSIN) is at least 6 digits, but not more
648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // than 15 (and usually 15).
649e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (mImsi != null && (mImsi.length() < 6 || mImsi.length() > 15)) {
650e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    loge("invalid IMSI " + mImsi);
651e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mImsi = null;
652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
654a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                log("IMSI: mMncLength=" + mMncLength);
655a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                log("IMSI: " + mImsi.substring(0, 6) + "xxxxxxx");
656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
65722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (((mMncLength == UNKNOWN) || (mMncLength == 2)) &&
658e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        ((mImsi != null) && (mImsi.length() >= 6))) {
659e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    String mccmncCode = mImsi.substring(0, 6);
660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    for (String mccmnc : MCCMNC_CODES_HAVING_3DIGITS_MNC) {
661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        if (mccmnc.equals(mccmncCode)) {
66222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            mMncLength = 3;
663a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                            log("IMSI: setting1 mMncLength=" + mMncLength);
664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            break;
665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        }
666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
66922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mMncLength == UNKNOWN) {
670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // the SIM has told us all it knows, but it didn't know the mnc length.
671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // guess using the mcc
672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    try {
673e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        int mcc = Integer.parseInt(mImsi.substring(0,3));
67422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mMncLength = MccTable.smallestDigitsMccForMnc(mcc);
675a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        log("setting2 mMncLength=" + mMncLength);
676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    } catch (NumberFormatException e) {
67722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mMncLength = UNKNOWN;
678a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        loge("Corrupt IMSI! setting3 mMncLength=" + mMncLength);
679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
68222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mMncLength != UNKNOWN && mMncLength != UNINITIALIZED) {
683a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    log("update mccmnc=" + mImsi.substring(0, 3 + mMncLength));
684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // finally have both the imsi and the mncLength and can parse the imsi properly
685b0b637dbf2a67c0e7eee917c0809f1cc54983986Robert Greenwalt                    MccTable.updateMccMncConfiguration(mContext,
686b0b637dbf2a67c0e7eee917c0809f1cc54983986Robert Greenwalt                            mImsi.substring(0, 3 + mMncLength), false);
687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
688e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mImsiReadyRegistrants.notifyRegistrants();
689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_MBI_DONE:
692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                boolean isValidMbdn;
693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[]) ar.result;
697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isValidMbdn = false;
699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception == null) {
700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Refer TS 51.011 Section 10.3.44 for content details
701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("EF_MBI: " + IccUtils.bytesToHexString(data));
702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Voice mail record number stored first
70422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mMailboxIndex = data[0] & 0xff;
705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // check if dailing numbe id valid
70722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (mMailboxIndex != 0 && mMailboxIndex != 0xff) {
708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        log("Got valid mailbox number for MBDN");
709c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        isValidMbdn = true;
710c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // one more record to load
71422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mRecordsToLoad += 1;
715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (isValidMbdn) {
717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Note: MBDN was not included in NUM_OF_SIM_RECORDS_LOADED
718c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new AdnRecordLoader(mFh).loadFromEF(EF_MBDN, EF_EXT6,
71922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            mMailboxIndex, obtainMessage(EVENT_GET_MBDN_DONE));
720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // If this EF not present, try mailbox as in CPHS standard
722c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // CPHS (CPHS4_2.WW6) is a european standard.
723c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new AdnRecordLoader(mFh).loadFromEF(EF_MAILBOX_CPHS,
724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            EF_EXT1, 1,
725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE));
726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
727c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
728c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
729c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_CPHS_MAILBOX_DONE:
730c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_MBDN_DONE:
731c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                //Resetting the voice mail number and voice mail tag to null
732c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                //as these should be updated from the data read from EF_MBDN.
733c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                //If they are not reset, incase of invalid data/exception these
734c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                //variables are retaining their previous values and are
735c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                //causing invalid voice mailbox info display to user.
73622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mVoiceMailNum = null;
73722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mVoiceMailTag = null;
738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
740c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
741c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
742c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
743c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("Invalid or missing EF"
745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        + ((msg.what == EVENT_GET_CPHS_MAILBOX_DONE) ? "[MAILBOX]" : "[MBDN]"));
746c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
747c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Bug #645770 fall back to CPHS
748c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // FIXME should use SST to decide
749c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
750c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (msg.what == EVENT_GET_MBDN_DONE) {
751c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        //load CPHS on fail...
752c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        // FIXME right now, only load line1's CPHS voice mail entry
753c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
75422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mRecordsToLoad += 1;
755c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        new AdnRecordLoader(mFh).loadFromEF(
756c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                EF_MAILBOX_CPHS, EF_EXT1, 1,
757c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE));
758c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
759c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
760c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
761c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
762c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                adn = (AdnRecord)ar.result;
763c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
764c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("VM: " + adn +
765c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        ((msg.what == EVENT_GET_CPHS_MAILBOX_DONE) ? " EF[MAILBOX]" : " EF[MBDN]"));
766c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
767c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (adn.isEmpty() && msg.what == EVENT_GET_MBDN_DONE) {
768c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Bug #645770 fall back to CPHS
769c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // FIXME should use SST to decide
770c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // FIXME right now, only load line1's CPHS voice mail entry
77122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mRecordsToLoad += 1;
772c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new AdnRecordLoader(mFh).loadFromEF(
773c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            EF_MAILBOX_CPHS, EF_EXT1, 1,
774c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE));
775c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
776c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
777c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
778c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
77922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mVoiceMailNum = adn.getNumber();
78022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mVoiceMailTag = adn.getAlphaTag();
781c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
782c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
783c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_MSISDN_DONE:
784c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
785c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
786c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
787c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
788c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
789c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("Invalid or missing EF[MSISDN]");
790c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
791c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
792c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
793c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                adn = (AdnRecord)ar.result;
794c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
79522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mMsisdn = adn.getNumber();
79622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mMsisdnTag = adn.getAlphaTag();
797c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
79822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                log("MSISDN: " + /*mMsisdn*/ "xxxxxxx");
799c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
800c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
801c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_SET_MSISDN_DONE:
802c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
803c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
804c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
8056bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville                if (ar.exception == null) {
8066bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville                    mMsisdn = mNewMsisdn;
8076bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville                    mMsisdnTag = mNewMsisdnTag;
8086bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville                    log("Success to update EF[MSISDN]");
8096bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville                }
8106bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville
811c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.userObj != null) {
812c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    AsyncResult.forMessage(((Message) ar.userObj)).exception
813c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            = ar.exception;
814c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    ((Message) ar.userObj).sendToTarget();
815c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
816c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
817c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
818c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_MWIS_DONE:
819c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
820c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
821c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
822c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
823c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
82426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                if(DBG) log("EF_MWIS : " + IccUtils.bytesToHexString(data));
82526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa
826c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
82726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                    if(DBG) log("EVENT_GET_MWIS_DONE exception = "
82826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                            + ar.exception);
829c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
830c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
831c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
832c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if ((data[0] & 0xff) == 0xff) {
83326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                    if(DBG) log("SIMRecords: Uninitialized record MWIS");
834c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
835c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
836c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
83726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                mEfMWIS = data;
83826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                break;
839c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
840c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE:
841c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
842c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
843c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
844c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
845c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
84626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                if(DBG) log("EF_CPHS_MWI: " + IccUtils.bytesToHexString(data));
84726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa
848c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
84926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                    if(DBG) log("EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE exception = "
85026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                            + ar.exception);
851c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
852c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
853c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
85422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mEfCPHS_MWI = data;
85526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                break;
856c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
857c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_ICCID_DONE:
858c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
859c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
860c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
861c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
862c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
863c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
864c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
865c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
866c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
867b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville                mIccId = IccUtils.bcdToString(data, 0, data.length);
868c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
869b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville                log("iccid: " + mIccId);
870c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
871c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
872c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
873c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
874c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_AD_DONE:
875c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                try {
876c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    isRecordLoadResponse = true;
877c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
878c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    ar = (AsyncResult)msg.obj;
879c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    data = (byte[])ar.result;
880c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
881c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (ar.exception != null) {
882c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        break;
883c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
884c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
885c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("EF_AD: " + IccUtils.bytesToHexString(data));
886c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
887c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (data.length < 3) {
888c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        log("Corrupt AD data on SIM");
889c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        break;
890c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
891c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
892c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (data.length == 3) {
893c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        log("MNC length not present in EF_AD");
894c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        break;
895c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
896c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
89722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mMncLength = data[3] & 0xf;
898a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    log("setting4 mMncLength=" + mMncLength);
899c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
90022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (mMncLength == 0xf) {
90122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mMncLength = UNKNOWN;
902a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        log("setting5 mMncLength=" + mMncLength);
903200014f52acfbff467ab92910247f81e369da7e6Amit Mahajan                    } else if (mMncLength != 2 && mMncLength != 3) {
904200014f52acfbff467ab92910247f81e369da7e6Amit Mahajan                        mMncLength = UNINITIALIZED;
905200014f52acfbff467ab92910247f81e369da7e6Amit Mahajan                        log("setting5 mMncLength=" + mMncLength);
906c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
907c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } finally {
90822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (((mMncLength == UNINITIALIZED) || (mMncLength == UNKNOWN) ||
90922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            (mMncLength == 2)) && ((mImsi != null) && (mImsi.length() >= 6))) {
910e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        String mccmncCode = mImsi.substring(0, 6);
911a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        log("mccmncCode=" + mccmncCode);
912c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        for (String mccmnc : MCCMNC_CODES_HAVING_3DIGITS_MNC) {
913c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            if (mccmnc.equals(mccmncCode)) {
91422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                                mMncLength = 3;
915a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                                log("setting6 mMncLength=" + mMncLength);
916c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                break;
917c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            }
918c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        }
919c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
920c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
92122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (mMncLength == UNKNOWN || mMncLength == UNINITIALIZED) {
922e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        if (mImsi != null) {
923c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            try {
924e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                                int mcc = Integer.parseInt(mImsi.substring(0,3));
925c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
92622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                                mMncLength = MccTable.smallestDigitsMccForMnc(mcc);
927a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                                log("setting7 mMncLength=" + mMncLength);
928c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            } catch (NumberFormatException e) {
92922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                                mMncLength = UNKNOWN;
930a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                                loge("Corrupt IMSI! setting8 mMncLength=" + mMncLength);
931c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            }
932c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        } else {
933c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            // Indicate we got this info, but it didn't contain the length.
93422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            mMncLength = UNKNOWN;
935a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                            log("MNC length not present in EF_AD setting9 mMncLength=" + mMncLength);
936c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        }
937c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
93822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (mImsi != null && mMncLength != UNKNOWN) {
939c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        // finally have both imsi and the length of the mnc and can parse
940c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        // the imsi properly
941a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        log("update mccmnc=" + mImsi.substring(0, 3 + mMncLength));
942c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        MccTable.updateMccMncConfiguration(mContext,
943b0b637dbf2a67c0e7eee917c0809f1cc54983986Robert Greenwalt                                mImsi.substring(0, 3 + mMncLength), false);
944c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
945c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
946c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
947c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
948c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_SPN_DONE:
949c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
950c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult) msg.obj;
951c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                getSpnFsm(false, ar);
952c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
953c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
954c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_CFF_DONE:
955c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
956c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
957c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult) msg.obj;
958c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[]) ar.result;
959c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
960c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
961eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan                    mEfCff = null;
962a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                } else {
963eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan                    log("EF_CFF_CPHS: " + IccUtils.bytesToHexString(data));
964eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan                    mEfCff = data;
965c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
966eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan
967c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
968c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
969c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_SPDI_DONE:
970c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
971c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
972c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
973c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
974c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
975c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
976c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
977c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
978c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
979c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                parseEfSpdi(data);
980c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
981c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
982c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_UPDATE_DONE:
983c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
984c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
985c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    logw("update failed. ", ar.exception);
986c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
987c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
988c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
989c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_PNN_DONE:
990c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
991c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
992c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
993c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
994c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
995c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
996c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
997c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
998c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
999c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                SimTlv tlv = new SimTlv(data, 0, data.length);
1000c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1001c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                for ( ; tlv.isValidObject() ; tlv.nextObject()) {
1002c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (tlv.getTag() == TAG_FULL_NETWORK_NAME) {
100322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mPnnHomeName
1004c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            = IccUtils.networkNameToString(
1005c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                tlv.getData(), 0, tlv.getData().length);
1006c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        break;
1007c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
1008c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1009c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
1010c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1011c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_ALL_SMS_DONE:
1012c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
1013c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1014c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1015c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null)
1016c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
1017c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1018cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                handleSmses((ArrayList<byte []>) ar.result);
1019c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1020c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1021c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_MARK_SMS_READ_DONE:
102299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.i("ENF", "marked read: sms " + msg.arg1);
1023c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1024c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1025c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1026c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_SMS_ON_SIM:
1027c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
1028c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1029c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1030c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1031c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                int[] index = (int[])ar.result;
1032c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1033c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null || index.length != 1) {
1034c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("Error on SMS_ON_SIM with exp "
1035c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            + ar.exception + " length " + index.length);
1036c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1037c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("READ EF_SMS RECORD index=" + index[0]);
1038c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mFh.loadEFLinearFixed(EF_SMS,index[0],
1039c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_GET_SMS_DONE));
1040c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1041c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1042c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1043c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_SMS_DONE:
1044c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
1045c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1046c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception == null) {
1047c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    handleSms((byte[])ar.result);
1048c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1049c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("Error on GET_SMS with exp " + ar.exception);
1050c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1051c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1052c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_SST_DONE:
1053c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
1054c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1055c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1056c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
1057c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1058c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
1059c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
1060c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1061c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1062c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mUsimServiceTable = new UsimServiceTable(data);
1063c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("SST: " + mUsimServiceTable);
1064c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1065c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1066c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_INFO_CPHS_DONE:
1067c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
1068c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1069c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1070c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1071c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
1072c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
1073c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1074c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1075c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mCphsInfo = (byte[])ar.result;
1076c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1077c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("iCPHS: " + IccUtils.bytesToHexString(mCphsInfo));
1078c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
1079c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1080c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_SET_MBDN_DONE:
1081c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
1082c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1083c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
10846e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                if (DBG) log("EVENT_SET_MBDN_DONE ex:" + ar.exception);
1085c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception == null) {
108622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mVoiceMailNum = mNewVoiceMailNum;
108722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mVoiceMailTag = mNewVoiceMailTag;
1088c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1089c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1090c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (isCphsMailboxEnabled()) {
109122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    adn = new AdnRecord(mVoiceMailTag, mVoiceMailNum);
1092c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    Message onCphsCompleted = (Message) ar.userObj;
1093c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1094c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    /* write to cphs mailbox whenever it is available but
1095c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    * we only need notify caller once if both updating are
1096c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    * successful.
1097c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    *
1098c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    * so if set_mbdn successful, notify caller here and set
1099c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    * onCphsCompleted to null
1100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    */
1101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (ar.exception == null && ar.userObj != null) {
1102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        AsyncResult.forMessage(((Message) ar.userObj)).exception
1103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                = null;
1104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        ((Message) ar.userObj).sendToTarget();
1105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        if (DBG) log("Callback with MBDN successful.");
1107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        onCphsCompleted = null;
1109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
1110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new AdnRecordLoader(mFh).
1112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            updateEF(adn, EF_MAILBOX_CPHS, EF_EXT1, 1, null,
1113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_SET_CPHS_MAILBOX_DONE,
1114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                    onCphsCompleted));
1115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (ar.userObj != null) {
11176e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                        Resources resource = Resources.getSystem();
11186e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                        if (ar.exception != null && resource.getBoolean(com.android.internal.
11196e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                                    R.bool.editable_voicemailnumber)) {
11206e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                            // GSMPhone will store vm number on device
11216e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                            // when IccVmNotSupportedException occurred
11226e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                            AsyncResult.forMessage(((Message) ar.userObj)).exception
11236e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                                = new IccVmNotSupportedException(
11246e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                                        "Update SIM voice mailbox error");
11256e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                        } else {
11266e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                            AsyncResult.forMessage(((Message) ar.userObj)).exception
1127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                = ar.exception;
11286e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                        }
1129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        ((Message) ar.userObj).sendToTarget();
1130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
1131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_SET_CPHS_MAILBOX_DONE:
1134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
1135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if(ar.exception == null) {
113722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mVoiceMailNum = mNewVoiceMailNum;
113822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mVoiceMailTag = mNewVoiceMailTag;
1139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) log("Set CPHS MailBox with exception: "
1141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            + ar.exception);
1142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.userObj != null) {
1144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) log("Callback with CPHS MB successful.");
1145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    AsyncResult.forMessage(((Message) ar.userObj)).exception
1146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            = ar.exception;
1147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    ((Message) ar.userObj).sendToTarget();
1148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_SIM_REFRESH:
1151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
1152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("Sim REFRESH with exception: " + ar.exception);
1154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception == null) {
1155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    handleSimRefresh((IccRefreshResponse)ar.result);
1156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_CFIS_DONE:
1159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
1160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
1163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
1165eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan                    mEfCfis = null;
1166a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                } else {
1167eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan                    log("EF_CFIS: " + IccUtils.bytesToHexString(data));
1168eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan                    mEfCfis = data;
1169a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                }
1170eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan
1171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_CSP_CPHS_DONE:
1174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
1175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
1179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("Exception in fetching EF_CSP data " + ar.exception);
1180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
1181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
1184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("EF_CSP: " + IccUtils.bytesToHexString(data));
1186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                handleEfCspData(data);
1187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
11892f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim            case EVENT_GET_GID1_DONE:
11902f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                isRecordLoadResponse = true;
11912f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim
11922f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                ar = (AsyncResult)msg.obj;
11932f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                data =(byte[])ar.result;
11942f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim
11952f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                if (ar.exception != null) {
11962f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                    loge("Exception in get GID1 " + ar.exception);
1197620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt                    mGid1 = null;
11982f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                    break;
11992f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                }
1200620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt                mGid1 = IccUtils.bytesToHexString(data);
1201620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt                log("GID1: " + mGid1);
12022f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim
12032f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                break;
12042f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim
12057234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu            case EVENT_GET_GID2_DONE:
12067234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu                isRecordLoadResponse = true;
12077234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu
12087234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu                ar = (AsyncResult)msg.obj;
12097234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu                data =(byte[])ar.result;
12107234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu
12117234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu                if (ar.exception != null) {
12127234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu                    loge("Exception in get GID2 " + ar.exception);
12137234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu                    mGid2 = null;
12147234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu                    break;
12157234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu                }
12167234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu                mGid2 = IccUtils.bytesToHexString(data);
12177234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu                log("GID2: " + mGid2);
12187234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu
12197234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu                break;
12207234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu
1221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            default:
1222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                super.handleMessage(msg);   // IccRecords handles generic record load responses
1223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }}catch (RuntimeException exc) {
1225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // I don't want these exceptions to be fatal
1226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            logw("Exception parsing SIM record", exc);
1227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } finally {
1228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Count up record load responses even if they are fails
1229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (isRecordLoadResponse) {
1230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                onRecordLoaded();
1231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1235230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private class EfPlLoaded implements IccRecordLoaded {
1236230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        public String getEfName() {
1237230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            return "EF_PL";
1238230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1239230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1240230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        public void onRecordLoaded(AsyncResult ar) {
1241230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mEfPl = (byte[]) ar.result;
1242230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            if (DBG) log("EF_PL=" + IccUtils.bytesToHexString(mEfPl));
1243230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1244230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    }
1245230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1246230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private class EfUsimLiLoaded implements IccRecordLoaded {
1247230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        public String getEfName() {
1248230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            return "EF_LI";
1249230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1250230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1251230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        public void onRecordLoaded(AsyncResult ar) {
1252230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mEfLi = (byte[]) ar.result;
1253230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            if (DBG) log("EF_LI=" + IccUtils.bytesToHexString(mEfLi));
1254230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1255230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    }
1256230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void handleFileUpdate(int efid) {
1258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        switch(efid) {
1259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EF_MBDN:
126022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mRecordsToLoad++;
1261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                new AdnRecordLoader(mFh).loadFromEF(EF_MBDN, EF_EXT6,
126222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mMailboxIndex, obtainMessage(EVENT_GET_MBDN_DONE));
1263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EF_MAILBOX_CPHS:
126522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mRecordsToLoad++;
1266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                new AdnRecordLoader(mFh).loadFromEF(EF_MAILBOX_CPHS, EF_EXT1,
1267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        1, obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE));
1268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EF_CSP_CPHS:
127022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mRecordsToLoad++;
1271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("[CSP] SIM Refresh for EF_CSP_CPHS");
1272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.loadEFTransparent(EF_CSP_CPHS,
1273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        obtainMessage(EVENT_GET_CSP_CPHS_DONE));
1274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
127567aacea4e6b0199579a71b3a6a2f5d6778b8a002Kevin Li            case EF_FDN:
127667aacea4e6b0199579a71b3a6a2f5d6778b8a002Kevin Li                if (DBG) log("SIM Refresh called for EF_FDN");
127767aacea4e6b0199579a71b3a6a2f5d6778b8a002Kevin Li                mParentApp.queryFdn();
127867aacea4e6b0199579a71b3a6a2f5d6778b8a002Kevin Li                break;
1279fcc95e67fce873f3f303cc2dee284ce437295783Preeti Ahuja            case EF_MSISDN:
1280fcc95e67fce873f3f303cc2dee284ce437295783Preeti Ahuja                mRecordsToLoad++;
1281fcc95e67fce873f3f303cc2dee284ce437295783Preeti Ahuja                log("SIM Refresh called for EF_MSISDN");
1282fcc95e67fce873f3f303cc2dee284ce437295783Preeti Ahuja                new AdnRecordLoader(mFh).loadFromEF(EF_MSISDN, getExtFromEf(EF_MSISDN), 1,
1283fcc95e67fce873f3f303cc2dee284ce437295783Preeti Ahuja                        obtainMessage(EVENT_GET_MSISDN_DONE));
1284fcc95e67fce873f3f303cc2dee284ce437295783Preeti Ahuja                break;
1285fcc95e67fce873f3f303cc2dee284ce437295783Preeti Ahuja            case EF_CFIS:
1286fcc95e67fce873f3f303cc2dee284ce437295783Preeti Ahuja            case EF_CFF_CPHS:
1287eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan                log("SIM Refresh called for EF_CFIS or EF_CFF_CPHS");
1288eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan                loadCallForwardingRecords();
1289fcc95e67fce873f3f303cc2dee284ce437295783Preeti Ahuja                break;
1290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            default:
1291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // For now, fetch all records if this is not a
1292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // voicemail number.
1293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // TODO: Handle other cases, instead of fetching all.
129422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mAdnCache.reset();
1295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                fetchSimRecords();
1296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void handleSimRefresh(IccRefreshResponse refreshResponse){
1301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (refreshResponse == null) {
1302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) log("handleSimRefresh received without input");
1303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
1304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (refreshResponse.aid != null &&
1307e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                !refreshResponse.aid.equals(mParentApp.getAid())) {
1308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // This is for different app. Ignore.
1309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
1310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        switch (refreshResponse.refreshResult) {
1313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case IccRefreshResponse.REFRESH_RESULT_FILE_UPDATE:
1314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("handleSimRefresh with SIM_FILE_UPDATED");
1315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                handleFileUpdate(refreshResponse.efId);
1316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case IccRefreshResponse.REFRESH_RESULT_INIT:
1318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("handleSimRefresh with SIM_REFRESH_INIT");
1319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // need to reload all files (that we care about)
132064bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka                onIccRefreshInit();
1321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case IccRefreshResponse.REFRESH_RESULT_RESET:
132362648296ee1514d871d7d779d6f33da5e55babcaShishir Agrawal                // Refresh reset is handled by the UiccCard object.
1324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("handleSimRefresh with SIM_REFRESH_RESET");
1325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            default:
1327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // unknown refresh operation
1328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("handleSimRefresh with unknown operation");
1329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1334e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby     * Dispatch 3GPP format message to registrant ({@code GSMPhone} or {@code CDMALTEPhone})
1335e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby     * to pass to the 3GPP SMS dispatcher for delivery.
1336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1337a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hamby    private int dispatchGsmMessage(SmsMessage message) {
1338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mNewSmsRegistrants.notifyResult(message);
1339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return 0;
1340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void handleSms(byte[] ba) {
1343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (ba[0] != 0)
134499c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville            Rlog.d("ENF", "status : " + ba[0]);
1345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // 3GPP TS 51.011 v5.0.0 (20011-12)  10.5.3
1347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // 3 == "received by MS from network; message to be read"
1348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (ba[0] == 3) {
1349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int n = ba.length;
1350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Note: Data may include trailing FF's.  That's OK; message
1352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // should still parse correctly.
1353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            byte[] pdu = new byte[n - 1];
1354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            System.arraycopy(ba, 1, pdu, 0, n - 1);
1355a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hamby            SmsMessage message = SmsMessage.createFromPdu(pdu, SmsConstants.FORMAT_3GPP);
1356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            dispatchGsmMessage(message);
1358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1362cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private void handleSmses(ArrayList<byte[]> messages) {
1363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int count = messages.size();
1364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for (int i = 0; i < count; i++) {
1366cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            byte[] ba = messages.get(i);
1367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (ba[0] != 0)
136999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.i("ENF", "status " + i + ": " + ba[0]);
1370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // 3GPP TS 51.011 v5.0.0 (20011-12)  10.5.3
1372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // 3 == "received by MS from network; message to be read"
1373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (ba[0] == 3) {
1375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                int n = ba.length;
1376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // Note: Data may include trailing FF's.  That's OK; message
1378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // should still parse correctly.
1379c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                byte[] pdu = new byte[n - 1];
1380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                System.arraycopy(ba, 1, pdu, 0, n - 1);
1381a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hamby                SmsMessage message = SmsMessage.createFromPdu(pdu, SmsConstants.FORMAT_3GPP);
1382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                dispatchGsmMessage(message);
1384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // 3GPP TS 51.011 v5.0.0 (20011-12)  10.5.3
1386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // 1 == "received by MS from network; message read"
1387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ba[0] = 1;
1389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1390cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (false) { // FIXME: writing seems to crash RdoServD
1391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mFh.updateEFLinearFixed(EF_SMS,
1392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            i, ba, null, obtainMessage(EVENT_MARK_SMS_READ_DONE, i));
1393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1398cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onRecordLoaded() {
1400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // One record loaded successfully or failed, In either case
1401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // we need to update the recordsToLoad count
140222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad -= 1;
140322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (DBG) log("onRecordLoaded " + mRecordsToLoad + " requested: " + mRecordsRequested);
1404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
140522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mRecordsToLoad == 0 && mRecordsRequested == true) {
1406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            onAllRecordsLoaded();
140722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (mRecordsToLoad < 0) {
1408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            loge("recordsToLoad <0, programmer error suspected");
140922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mRecordsToLoad = 0;
1410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1413eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan    private void setVoiceCallForwardingFlagFromSimRecords() {
1414eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan        if (validEfCfis(mEfCfis)) {
1415eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan            // Refer TS 51.011 Section 10.3.46 for the content description
1416eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan            mCallForwardingStatus = (mEfCfis[1] & 0x01);
1417eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan            log("EF_CFIS: callForwardingEnabled=" + mCallForwardingStatus);
1418eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan        } else if (mEfCff != null) {
1419eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan            mCallForwardingStatus =
1420eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan                    ((mEfCff[0] & CFF_LINE1_MASK) == CFF_UNCONDITIONAL_ACTIVE) ?
1421eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan                            CALL_FORWARDING_STATUS_ENABLED : CALL_FORWARDING_STATUS_DISABLED;
1422eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan            log("EF_CFF: callForwardingEnabled=" + mCallForwardingStatus);
1423eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan        } else {
1424eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan            mCallForwardingStatus = CALL_FORWARDING_STATUS_UNKNOWN;
1425eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan            log("EF_CFIS and EF_CFF not valid. callForwardingEnabled=" + mCallForwardingStatus);
1426eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan        }
1427eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan    }
1428eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan
1429cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1430c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onAllRecordsLoaded() {
1431e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        if (DBG) log("record load complete");
1432c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1433c9a55d1e545ab7bc92e14c2ca1123ac71b18f7feAmit Mahajan        Resources resource = Resources.getSystem();
1434c9a55d1e545ab7bc92e14c2ca1123ac71b18f7feAmit Mahajan        if (resource.getBoolean(com.android.internal.R.bool.config_use_sim_language_file)) {
1435c9a55d1e545ab7bc92e14c2ca1123ac71b18f7feAmit Mahajan            setSimLanguage(mEfLi, mEfPl);
1436c9a55d1e545ab7bc92e14c2ca1123ac71b18f7feAmit Mahajan        } else {
1437c9a55d1e545ab7bc92e14c2ca1123ac71b18f7feAmit Mahajan            if (DBG) log ("Not using EF LI/EF PL");
1438c9a55d1e545ab7bc92e14c2ca1123ac71b18f7feAmit Mahajan        }
1439230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1440eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan        setVoiceCallForwardingFlagFromSimRecords();
1441eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan
1442230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        if (mParentApp.getState() == AppState.APPSTATE_PIN ||
1443230e46bdd850306dcc54ab6038d4d3132f5032abnfjb               mParentApp.getState() == AppState.APPSTATE_PUK) {
1444230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            // reset recordsRequested, since sim is not loaded really
1445230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mRecordsRequested = false;
1446230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            // lock state, only update language
1447230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            return ;
1448230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1449230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1450c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Some fields require more than one SIM record to set
1451c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1452e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        String operator = getOperatorNumeric();
1453e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        if (!TextUtils.isEmpty(operator)) {
1454e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville            log("onAllRecordsLoaded set 'gsm.sim.operator.numeric' to operator='" +
1455e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville                    operator + "'");
1456a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            log("update icc_operator_numeric=" + operator);
1457e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu            mTelephonyManager.setSimOperatorNumericForPhone(
1458e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                    mParentApp.getPhoneId(), operator);
1459b9adaa1c4a12df8c8bd44b4803d452662b53e0d8Tom Taylor            final SubscriptionController subController = SubscriptionController.getInstance();
1460b9adaa1c4a12df8c8bd44b4803d452662b53e0d8Tom Taylor            subController.setMccMnc(operator, subController.getDefaultSmsSubId());
1461e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        } else {
1462e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville            log("onAllRecordsLoaded empty 'gsm.sim.operator.numeric' skipping");
1463e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        }
1464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1465e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        if (!TextUtils.isEmpty(mImsi)) {
1466a1421a82e8d4f711ba13a86d40889868ead492d4Amit Mahajan            log("onAllRecordsLoaded set mcc imsi" + (VDBG ? ("=" + mImsi) : ""));
1467e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu            mTelephonyManager.setSimCountryIsoForPhone(
1468e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                    mParentApp.getPhoneId(), MccTable.countryCodeForMcc(
1469e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                    Integer.parseInt(mImsi.substring(0,3))));
1470e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        } else {
1471e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville            log("onAllRecordsLoaded empty imsi skipping setting mcc");
1472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1474c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        setVoiceMailByCountry(operator);
1475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        setSpnFromConfig(operator);
1476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1477b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville        mRecordsLoadedRegistrants.notifyRegistrants(
1478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            new AsyncResult(null, null, null));
1479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    //***** Private methods
1482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void setSpnFromConfig(String carrier) {
1484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mSpnOverride.containsCarrier(carrier)) {
1485b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal            setServiceProviderName(mSpnOverride.getSpn(carrier));
1486e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu            mTelephonyManager.setSimOperatorNameForPhone(
1487e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                    mParentApp.getPhoneId(), getServiceProviderName());
1488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void setVoiceMailByCountry (String spn) {
1493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mVmConfig.containsCarrier(spn)) {
149422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mIsVoiceMailFixed = true;
149522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mVoiceMailNum = mVmConfig.getVoiceMailNumber(spn);
149622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mVoiceMailTag = mVmConfig.getVoiceMailTag(spn);
1497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1498c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
1501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void onReady() {
1502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        fetchSimRecords();
1503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1505230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private void onLocked() {
1506230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        if (DBG) log("only fetch EF_LI and EF_PL in lock state");
1507230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        loadEfLiAndEfPl();
1508230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    }
1509230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1510230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private void loadEfLiAndEfPl() {
1511230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        if (mParentApp.getType() == AppType.APPTYPE_USIM) {
1512ab55739495b38cf403e7c4514e00f4661034c838Amit Mahajan            mRecordsRequested = true;
1513230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mFh.loadEFTransparent(EF_LI,
1514230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                    obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfUsimLiLoaded()));
1515230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mRecordsToLoad++;
1516230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1517230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mFh.loadEFTransparent(EF_PL,
1518230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                    obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfPlLoaded()));
1519230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mRecordsToLoad++;
1520230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1521230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    }
1522230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1523eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan    private void loadCallForwardingRecords() {
1524eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan        mRecordsRequested = true;
1525eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan        mFh.loadEFLinearFixed(EF_CFIS, 1, obtainMessage(EVENT_GET_CFIS_DONE));
1526eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan        mRecordsToLoad++;
1527eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan        mFh.loadEFTransparent(EF_CFF_CPHS, obtainMessage(EVENT_GET_CFF_DONE));
1528eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan        mRecordsToLoad++;
1529eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan    }
1530eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan
1531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void fetchSimRecords() {
153222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsRequested = true;
1533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
153422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (DBG) log("fetchSimRecords " + mRecordsToLoad);
1535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1536e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mCi.getIMSIForApp(mParentApp.getAid(), obtainMessage(EVENT_GET_IMSI_DONE));
153722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_ICCID, obtainMessage(EVENT_GET_ICCID_DONE));
154022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // FIXME should examine EF[MSISDN]'s capability configuration
1543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // to determine which is the voice/data/fax line
1544b66ae5f6334393d39becc860840ab42a90c9a926Preeti Ahuja        new AdnRecordLoader(mFh).loadFromEF(EF_MSISDN, getExtFromEf(EF_MSISDN), 1,
1545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    obtainMessage(EVENT_GET_MSISDN_DONE));
154622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1547c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Record number is subscriber profile
1549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFLinearFixed(EF_MBI, 1, obtainMessage(EVENT_GET_MBI_DONE));
155022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_AD, obtainMessage(EVENT_GET_AD_DONE));
155322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1555c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Record number is subscriber profile
1556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFLinearFixed(EF_MWIS, 1, obtainMessage(EVENT_GET_MWIS_DONE));
155722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1560c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Also load CPHS-style voice mail indicator, which stores
1561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // the same info as EF[MWIS]. If both exist, both are updated
1562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // but the EF[MWIS] data is preferred
1563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Please note this must be loaded after EF[MWIS]
1564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(
1565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                EF_VOICE_MAIL_INDICATOR_CPHS,
1566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                obtainMessage(EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE));
156722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Same goes for Call Forward Status indicator: fetch both
1570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // EF[CFIS] and CPHS-EF, with EF[CFIS] preferred.
1571eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan        loadCallForwardingRecords();
1572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        getSpnFsm(true, null);
1574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_SPDI, obtainMessage(EVENT_GET_SPDI_DONE));
157622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1577c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFLinearFixed(EF_PNN, 1, obtainMessage(EVENT_GET_PNN_DONE));
157922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1580c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_SST, obtainMessage(EVENT_GET_SST_DONE));
158222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_INFO_CPHS, obtainMessage(EVENT_GET_INFO_CPHS_DONE));
158522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_CSP_CPHS,obtainMessage(EVENT_GET_CSP_CPHS_DONE));
158822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
15902f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim        mFh.loadEFTransparent(EF_GID1, obtainMessage(EVENT_GET_GID1_DONE));
1591620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt        mRecordsToLoad++;
1592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
15937234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu        mFh.loadEFTransparent(EF_GID2, obtainMessage(EVENT_GET_GID2_DONE));
15947234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu        mRecordsToLoad++;
15957234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu
1596230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        loadEfLiAndEfPl();
1597230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // XXX should seek instead of examining them all
1599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (false) { // XXX
1600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mFh.loadEFLinearFixedAll(EF_SMS, obtainMessage(EVENT_GET_ALL_SMS_DONE));
160122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mRecordsToLoad++;
1602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (CRASH_RIL) {
1605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            String sms = "0107912160130310f20404d0110041007030208054832b0120"
1606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                         + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
1607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                         + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
1608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                         + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
1609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                         + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
1610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                         + "ffffffffffffffffffffffffffffff";
1611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            byte[] ba = IccUtils.hexStringToBytes(sms);
1612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mFh.updateEFLinearFixed(EF_SMS, 1, ba, null,
1614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_MARK_SMS_READ_DONE, 1));
1615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
161622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (DBG) log("fetchSimRecords " + mRecordsToLoad + " requested: " + mRecordsRequested);
1617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Returns the SpnDisplayRule based on settings on the SIM and the
1621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * specified plmn (currently-registered PLMN).  See TS 22.101 Annex A
1622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * and TS 51.011 10.3.11 for details.
1623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
16242bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapati     * If the SPN is not found on the SIM or is empty, the rule is
16252bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapati     * always PLMN_ONLY.
1626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1627c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
1628c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public int getDisplayRule(String plmn) {
1629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int rule;
1630be6c87905a15d1e36e87189ad7df5d5a72a52f69Shishir Agrawal
163162d026a3882d133aa81995f8dfd2c1d25b1b0649Shishir Agrawal        if (mParentApp != null && mParentApp.getUiccCard() != null &&
163268515b655255005f653aec29e9f152412514982aShishir Agrawal            mParentApp.getUiccCard().getOperatorBrandOverride() != null) {
1633be6c87905a15d1e36e87189ad7df5d5a72a52f69Shishir Agrawal        // If the operator has been overridden, treat it as the SPN file on the SIM did not exist.
1634be6c87905a15d1e36e87189ad7df5d5a72a52f69Shishir Agrawal            rule = SPN_RULE_SHOW_PLMN;
1635be6c87905a15d1e36e87189ad7df5d5a72a52f69Shishir Agrawal        } else if (TextUtils.isEmpty(getServiceProviderName()) || mSpnDisplayCondition == -1) {
16362bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapati            // No EF_SPN content was found on the SIM, or not yet loaded.  Just show ONS.
1637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            rule = SPN_RULE_SHOW_PLMN;
1638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else if (isOnMatchingPlmn(plmn)) {
1639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            rule = SPN_RULE_SHOW_SPN;
164022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if ((mSpnDisplayCondition & 0x01) == 0x01) {
1641c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // ONS required when registered to HPLMN or PLMN in EF_SPDI
1642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                rule |= SPN_RULE_SHOW_PLMN;
1643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
1645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            rule = SPN_RULE_SHOW_PLMN;
164622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if ((mSpnDisplayCondition & 0x02) == 0x00) {
1647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // SPN required if not registered to HPLMN or PLMN in EF_SPDI
1648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                rule |= SPN_RULE_SHOW_SPN;
1649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return rule;
1652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Checks if plmn is HPLMN or on the spdiNetworks list.
1656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean isOnMatchingPlmn(String plmn) {
1658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (plmn == null) return false;
1659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (plmn.equals(getOperatorNumeric())) {
1661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return true;
1662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
166422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mSpdiNetworks != null) {
166522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            for (String spdiNet : mSpdiNetworks) {
1666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (plmn.equals(spdiNet)) {
1667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    return true;
1668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return false;
1672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * States of Get SPN Finite State Machine which only used by getSpnFsm()
1676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
167722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private enum GetSpnFsmState {
1678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        IDLE,               // No initialized
1679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        INIT,               // Start FSM
1680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        READ_SPN_3GPP,      // Load EF_SPN firstly
1681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        READ_SPN_CPHS,      // Load EF_SPN_CPHS secondly
1682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        READ_SPN_SHORT_CPHS // Load EF_SPN_SHORT_CPHS last
1683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Finite State Machine to load Service Provider Name , which can be stored
1687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * in either EF_SPN (3GPP), EF_SPN_CPHS, or EF_SPN_SHORT_CPHS (CPHS4.2)
1688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
1689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * After starting, FSM will search SPN EFs in order and stop after finding
1690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * the first valid SPN
1691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
1692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * If the FSM gets restart while waiting for one of
1693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * SPN EFs results (i.e. a SIM refresh occurs after issuing
1694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * read EF_CPHS_SPN), it will re-initialize only after
1695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * receiving and discarding the unfinished SPN EF result.
1696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
1697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param start set true only for initialize loading
1698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param ar the AsyncResult from loadEFTransparent
1699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ar.exception holds exception in error
1700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ar.result is byte[] for data in success
1701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void getSpnFsm(boolean start, AsyncResult ar) {
1703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        byte[] data;
1704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (start) {
1706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Check previous state to see if there is outstanding
1707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // SPN read
170822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if(mSpnState == GetSpnFsmState.READ_SPN_3GPP ||
170922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville               mSpnState == GetSpnFsmState.READ_SPN_CPHS ||
171022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville               mSpnState == GetSpnFsmState.READ_SPN_SHORT_CPHS ||
171122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville               mSpnState == GetSpnFsmState.INIT) {
1712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // Set INIT then return so the INIT code
1713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // will run when the outstanding read done.
171422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpnState = GetSpnFsmState.INIT;
1715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                return;
1716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } else {
171722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpnState = GetSpnFsmState.INIT;
1718c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
172122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        switch(mSpnState){
1722c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case INIT:
1723b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                setServiceProviderName(null);
1724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.loadEFTransparent(EF_SPN,
1726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        obtainMessage(EVENT_GET_SPN_DONE));
172722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mRecordsToLoad++;
1728c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
172922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpnState = GetSpnFsmState.READ_SPN_3GPP;
1730c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1731c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case READ_SPN_3GPP:
1732c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar != null && ar.exception == null) {
1733c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    data = (byte[]) ar.result;
173422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSpnDisplayCondition = 0xff & data[0];
1735b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    setServiceProviderName(IccUtils.adnStringFieldToString(
1736b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                            data, 1, data.length - 1));
1737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1738b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    if (DBG) log("Load EF_SPN: " + getServiceProviderName()
173922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            + " spnDisplayCondition: " + mSpnDisplayCondition);
1740e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                    mTelephonyManager.setSimOperatorNameForPhone(
1741e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                            mParentApp.getPhoneId(), getServiceProviderName());
1742c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
174322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSpnState = GetSpnFsmState.IDLE;
1744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mFh.loadEFTransparent( EF_SPN_CPHS,
1746c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_GET_SPN_DONE));
174722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mRecordsToLoad++;
1748c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
174922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSpnState = GetSpnFsmState.READ_SPN_CPHS;
1750c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1751c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // See TS 51.011 10.3.11.  Basically, default to
1752c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // show PLMN always, and SPN also if roaming.
175322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSpnDisplayCondition = -1;
1754c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1755c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1756c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case READ_SPN_CPHS:
1757c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar != null && ar.exception == null) {
1758c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    data = (byte[]) ar.result;
1759b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    setServiceProviderName(IccUtils.adnStringFieldToString(data, 0, data.length));
1760c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1761b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    if (DBG) log("Load EF_SPN_CPHS: " + getServiceProviderName());
1762e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                    mTelephonyManager.setSimOperatorNameForPhone(
1763e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                            mParentApp.getPhoneId(), getServiceProviderName());
1764c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
176522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSpnState = GetSpnFsmState.IDLE;
1766c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1767c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mFh.loadEFTransparent(
1768c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            EF_SPN_SHORT_CPHS, obtainMessage(EVENT_GET_SPN_DONE));
176922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mRecordsToLoad++;
1770c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
177122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSpnState = GetSpnFsmState.READ_SPN_SHORT_CPHS;
1772c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1773c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1774c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case READ_SPN_SHORT_CPHS:
1775c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar != null && ar.exception == null) {
1776c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    data = (byte[]) ar.result;
1777b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    setServiceProviderName(IccUtils.adnStringFieldToString(data, 0, data.length));
1778c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1779b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    if (DBG) log("Load EF_SPN_SHORT_CPHS: " + getServiceProviderName());
1780e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                    mTelephonyManager.setSimOperatorNameForPhone(
1781e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                            mParentApp.getPhoneId(), getServiceProviderName());
1782c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }else {
1783c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) log("No SPN loaded in either CHPS or 3GPP");
1784c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1785c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
178622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpnState = GetSpnFsmState.IDLE;
1787c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1788c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            default:
178922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpnState = GetSpnFsmState.IDLE;
1790c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1791c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1792c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1793c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1794c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Parse TS 51.011 EF[SPDI] record
1795c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * This record contains the list of numeric network IDs that
1796c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * are treated specially when determining SPN display
1797c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1798c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void
1799c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    parseEfSpdi(byte[] data) {
1800c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        SimTlv tlv = new SimTlv(data, 0, data.length);
1801c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1802c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        byte[] plmnEntries = null;
1803c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1804c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for ( ; tlv.isValidObject() ; tlv.nextObject()) {
1805c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Skip SPDI tag, if existant
1806c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (tlv.getTag() == TAG_SPDI) {
1807c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville              tlv = new SimTlv(tlv.getData(), 0, tlv.getData().length);
1808c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1809c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // There should only be one TAG_SPDI_PLMN_LIST
1810c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (tlv.getTag() == TAG_SPDI_PLMN_LIST) {
1811c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                plmnEntries = tlv.getData();
1812c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1813c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1814c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1815c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1816c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (plmnEntries == null) {
1817c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
1818c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1819c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
182022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mSpdiNetworks = new ArrayList<String>(plmnEntries.length / 3);
1821c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1822c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for (int i = 0 ; i + 2 < plmnEntries.length ; i += 3) {
1823c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            String plmnCode;
1824c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            plmnCode = IccUtils.bcdToString(plmnEntries, i, 3);
1825c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1826c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Valid operator codes are 5 or 6 digits
1827c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (plmnCode.length() >= 5) {
1828c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("EF_SPDI network: " + plmnCode);
182922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpdiNetworks.add(plmnCode);
1830c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1831c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1832c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1833c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1834c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1835c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * check to see if Mailbox Number is allocated and activated in CPHS SST
1836c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1837c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean isCphsMailboxEnabled() {
1838c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mCphsInfo == null)  return false;
1839c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return ((mCphsInfo[1] & CPHS_SST_MBN_MASK) == CPHS_SST_MBN_ENABLED );
1840c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1841c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1842cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1843c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void log(String s) {
184499c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.d(LOG_TAG, "[SIMRecords] " + s);
1845c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1846c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1847cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1848c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void loge(String s) {
184999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "[SIMRecords] " + s);
1850c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1851c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1852c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void logw(String s, Throwable tr) {
185399c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.w(LOG_TAG, "[SIMRecords] " + s, tr);
1854c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1855c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1856c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void logv(String s) {
185799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.v(LOG_TAG, "[SIMRecords] " + s);
1858c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1859c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1860c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1861c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Return true if "Restriction of menu options for manual PLMN selection"
1862c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * bit is set or EF_CSP data is unavailable, return false otherwise.
1863c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1864cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1865c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public boolean isCspPlmnEnabled() {
1866c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return mCspPlmnEnabled;
1867c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1868c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1869c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1870c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Parse EF_CSP data and check if
1871c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * "Restriction of menu options for manual PLMN selection" is
1872c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Enabled/Disabled
1873c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
1874c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param data EF_CSP hex data.
1875c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1876c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void handleEfCspData(byte[] data) {
1877c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // As per spec CPHS4_2.WW6, CPHS B.4.7.1, EF_CSP contains CPHS defined
1878c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // 18 bytes (i.e 9 service groups info) and additional data specific to
1879c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // operator. The valueAddedServicesGroup is not part of standard
1880c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // services. This is operator specific and can be programmed any where.
1881c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Normally this is programmed as 10th service after the standard
1882c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // services.
1883c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int usedCspGroups = data.length / 2;
1884e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby        // This is the "Service Group Number" of "Value Added Services Group".
1885c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        byte valueAddedServicesGroup = (byte)0xC0;
1886c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1887c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCspPlmnEnabled = true;
1888c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for (int i = 0; i < usedCspGroups; i++) {
1889c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             if (data[2 * i] == valueAddedServicesGroup) {
1890c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 log("[CSP] found ValueAddedServicesGroup, value " + data[(2 * i) + 1]);
1891c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 if ((data[(2 * i) + 1] & 0x80) == 0x80) {
1892c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     // Bit 8 is for
1893c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     // "Restriction of menu options for manual PLMN selection".
1894c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     // Operator Selection menu should be enabled.
1895c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     mCspPlmnEnabled = true;
1896c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 } else {
1897c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     mCspPlmnEnabled = false;
1898c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     // Operator Selection menu should be disabled.
1899c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     // Operator Selection Mode should be set to Automatic.
1900c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     log("[CSP] Set Automatic Network Selection");
1901c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     mNetworkSelectionModeAutomaticRegistrants.notifyRegistrants();
1902c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 }
1903c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 return;
1904c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             }
1905c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1906c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1907c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        log("[CSP] Value Added Service Group (0xC0), not found!");
1908c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
190905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka
191005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka    @Override
191105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
191205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println("SIMRecords: " + this);
191305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" extends:");
191405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        super.dump(fd, pw, args);
191505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mVmConfig=" + mVmConfig);
191605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mSpnOverride=" + mSpnOverride);
1917eadee84166d397b6425cfd56f89fa1569f6a93f5Amit Mahajan        pw.println(" mCallForwardingStatus=" + mCallForwardingStatus);
191822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mSpnState=" + mSpnState);
191905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mCphsInfo=" + mCphsInfo);
192005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mCspPlmnEnabled=" + mCspPlmnEnabled);
192122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mEfMWIS[]=" + Arrays.toString(mEfMWIS));
192222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mEfCPHS_MWI[]=" + Arrays.toString(mEfCPHS_MWI));
192305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mEfCff[]=" + Arrays.toString(mEfCff));
192405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mEfCfis[]=" + Arrays.toString(mEfCfis));
192522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mSpnDisplayCondition=" + mSpnDisplayCondition);
192622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mSpdiNetworks[]=" + mSpdiNetworks);
192722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mPnnHomeName=" + mPnnHomeName);
192805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mUsimServiceTable=" + mUsimServiceTable);
1929620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt        pw.println(" mGid1=" + mGid1);
19307234bd8664dbec97858f3f635eaa01c77d2f2881Junda Liu        pw.println(" mGid2=" + mGid2);
193105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.flush();
193205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka    }
1933c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville}
1934