SIMRecords.java revision 230e46bdd850306dcc54ab6038d4d3132f5032ab
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 static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA;
20c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY;
21c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC;
22b9adaa1c4a12df8c8bd44b4803d452662b53e0d8Tom Taylor
23c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.Context;
24c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.AsyncResult;
25c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Message;
26c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.SystemProperties;
27a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.TelephonyManager;
2831ae682ff511ddde4073c3f94eff15da2f7fade6Wink Savilleimport android.telephony.PhoneNumberUtils;
29a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hambyimport android.telephony.SmsMessage;
302bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapatiimport android.text.TextUtils;
3199c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog;
326e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seoimport android.content.res.Resources;
33c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
34c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.CommandsInterface;
35c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.MccTable;
36a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hambyimport com.android.internal.telephony.SmsConstants;
37b9adaa1c4a12df8c8bd44b4803d452662b53e0d8Tom Taylorimport com.android.internal.telephony.SubscriptionController;
38d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.gsm.SimTlv;
39230e46bdd850306dcc54ab6038d4d3132f5032abnfjbimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState;
40230e46bdd850306dcc54ab6038d4d3132f5032abnfjbimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType;
41c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
4205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.FileDescriptor;
4305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.PrintWriter;
44c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.ArrayList;
4505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.util.Arrays;
46c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/**
48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide}
49c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */
50c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic class SIMRecords extends IccRecords {
51cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final String LOG_TAG = "SIMRecords";
52c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final boolean CRASH_RIL = false;
54c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
55c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Instance Variables
56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    VoiceMailConstants mVmConfig;
58c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
59c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
60c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    SpnOverride mSpnOverride;
61c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
62c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Cached SIM State; cleared on channel close
63c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
6422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private boolean mCallForwardingEnabled;
65c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
66c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
67c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
68c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * States only used by getSpnFsm FSM
69c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
7022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private GetSpnFsmState mSpnState;
71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
72c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /** CPHS service information (See CPHS 4.2 B.3.1.1)
73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *  It will be set in onSimReady if reading GET_CPHS_INFO successfully
74c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *  mCphsInfo[0] is CPHS Phase
75c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *  mCphsInfo[1] and mCphsInfo[2] is CPHS Service Table
76c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
77c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private byte[] mCphsInfo = null;
78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    boolean mCspPlmnEnabled = true;
79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
8022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    byte[] mEfMWIS = null;
8122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    byte[] mEfCPHS_MWI =null;
82c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    byte[] mEfCff = null;
83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    byte[] mEfCfis = null;
84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
85230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    byte[] mEfLi = null;
86230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    byte[] mEfPl = null;
87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
8822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    int mSpnDisplayCondition;
89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // Numeric network codes listed in TS 51.011 EF[SPDI]
9022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    ArrayList<String> mSpdiNetworks = null;
91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
9222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    String mPnnHomeName = null;
93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    UsimServiceTable mUsimServiceTable;
95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
96f92cb4bd5519427a0db673709d94683a8baf203aWink Saville    @Override
97f92cb4bd5519427a0db673709d94683a8baf203aWink Saville    public String toString() {
98f92cb4bd5519427a0db673709d94683a8baf203aWink Saville        return "SimRecords: " + super.toString()
99f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mVmConfig" + mVmConfig
100f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mSpnOverride=" + "mSpnOverride"
10122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " callForwardingEnabled=" + mCallForwardingEnabled
10222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " spnState=" + mSpnState
103f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mCphsInfo=" + mCphsInfo
104f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mCspPlmnEnabled=" + mCspPlmnEnabled
10522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " efMWIS=" + mEfMWIS
10622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " efCPHS_MWI=" + mEfCPHS_MWI
107f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mEfCff=" + mEfCff
108f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mEfCfis=" + mEfCfis
109f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " getOperatorNumeric=" + getOperatorNumeric();
110f92cb4bd5519427a0db673709d94683a8baf203aWink Saville    }
111f92cb4bd5519427a0db673709d94683a8baf203aWink Saville
112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Constants
113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // From TS 51.011 EF[SPDI] section
115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int TAG_SPDI = 0xA3;
116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int TAG_SPDI_PLMN_LIST = 0x80;
117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // Full Name IEI from TS 24.008
119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int TAG_FULL_NETWORK_NAME = 0x43;
120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // Short Name IEI from TS 24.008
122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int TAG_SHORT_NETWORK_NAME = 0x45;
123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // active CFF from CPHS 4.2 B.4.5
125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int CFF_UNCONDITIONAL_ACTIVE = 0x0a;
126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int CFF_UNCONDITIONAL_DEACTIVE = 0x05;
127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int CFF_LINE1_MASK = 0x0f;
128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int CFF_LINE1_RESET = 0xf0;
129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // CPHS Service Table (See CPHS 4.2 B.3.1)
131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int CPHS_SST_MBN_MASK = 0x30;
132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int CPHS_SST_MBN_ENABLED = 0x30;
133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
13431ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    // EF_CFIS related constants
13531ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    // Spec reference TS 51.011 section 10.3.46.
13631ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    private static final int CFIS_BCD_NUMBER_LENGTH_OFFSET = 2;
13731ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    private static final int CFIS_TON_NPI_OFFSET = 3;
13831ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    private static final int CFIS_ADN_CAPABILITY_ID_OFFSET = 14;
13931ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    private static final int CFIS_ADN_EXTENSION_ID_OFFSET = 15;
14031ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville
141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Event Constants
142e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_GET_IMSI_DONE = 3;
143e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_GET_ICCID_DONE = 4;
144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_MBI_DONE = 5;
145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_MBDN_DONE = 6;
146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_MWIS_DONE = 7;
147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE = 8;
148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected static final int EVENT_GET_AD_DONE = 9; // Admin data on SIM
149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected static final int EVENT_GET_MSISDN_DONE = 10;
150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_CPHS_MAILBOX_DONE = 11;
151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_SPN_DONE = 12;
152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_SPDI_DONE = 13;
153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_UPDATE_DONE = 14;
154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_PNN_DONE = 15;
155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected static final int EVENT_GET_SST_DONE = 17;
156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_ALL_SMS_DONE = 18;
157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_MARK_SMS_READ_DONE = 19;
158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_SET_MBDN_DONE = 20;
159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_SMS_ON_SIM = 21;
160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_SMS_DONE = 22;
161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_CFF_DONE = 24;
162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_SET_CPHS_MAILBOX_DONE = 25;
163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_INFO_CPHS_DONE = 26;
164cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // private static final int EVENT_SET_MSISDN_DONE = 30; Defined in IccRecords as 30
165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_SIM_REFRESH = 31;
166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_CFIS_DONE = 32;
167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_CSP_CPHS_DONE = 33;
1682f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim    private static final int EVENT_GET_GID1_DONE = 34;
169230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private static final int EVENT_APP_LOCKED = 35;
170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // Lookup table for carriers known to produce SIMs which incorrectly indicate MNC length.
172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final String[] MCCMNC_CODES_HAVING_3DIGITS_MNC = {
1740530f592d89c1eceea7ee5bccb2359061a04f968duho.ro        "302370", "302720", "310260",
175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405025", "405026", "405027", "405028", "405029", "405030", "405031", "405032",
176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405033", "405034", "405035", "405036", "405037", "405038", "405039", "405040",
177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405041", "405042", "405043", "405044", "405045", "405046", "405047", "405750",
178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405751", "405752", "405753", "405754", "405755", "405756", "405799", "405800",
179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405801", "405802", "405803", "405804", "405805", "405806", "405807", "405808",
180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405809", "405810", "405811", "405812", "405813", "405814", "405815", "405816",
181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405817", "405818", "405819", "405820", "405821", "405822", "405823", "405824",
182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405825", "405826", "405827", "405828", "405829", "405830", "405831", "405832",
183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405833", "405834", "405835", "405836", "405837", "405838", "405839", "405840",
184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405841", "405842", "405843", "405844", "405845", "405846", "405847", "405848",
185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405849", "405850", "405851", "405852", "405853", "405875", "405876", "405877",
186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405878", "405879", "405880", "405881", "405882", "405883", "405884", "405885",
187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405886", "405908", "405909", "405910", "405911", "405912", "405913", "405914",
188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405915", "405916", "405917", "405918", "405919", "405920", "405921", "405922",
189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405923", "405924", "405925", "405926", "405927", "405928", "405929", "405930",
1900530f592d89c1eceea7ee5bccb2359061a04f968duho.ro        "405931", "405932", "502142", "502143", "502145", "502146", "502147", "502148"
191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    };
192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Constructor
194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
195e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public SIMRecords(UiccCardApplication app, Context c, CommandsInterface ci) {
196e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        super(app, c, ci);
197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
19822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mAdnCache = new AdnRecordCache(mFh);
199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mVmConfig = new VoiceMailConstants();
201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mSpnOverride = new SpnOverride();
202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
20322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsRequested = false;  // No load request is made till SIM ready
204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // recordsToLoad is set to 0 because no requests are made yet
20622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad = 0;
207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCi.setOnSmsOnSim(this, EVENT_SMS_ON_SIM, null);
209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCi.registerForIccRefresh(this, EVENT_SIM_REFRESH, null);
210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Start off by setting empty state
212e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        resetRecords();
213e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mParentApp.registerForReady(this, EVENT_APP_READY, null);
214230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        mParentApp.registerForLocked(this, EVENT_APP_LOCKED, null);
215f92cb4bd5519427a0db673709d94683a8baf203aWink Saville        if (DBG) log("SIMRecords X ctor this=" + this);
216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void dispose() {
220f92cb4bd5519427a0db673709d94683a8baf203aWink Saville        if (DBG) log("Disposing SIMRecords this=" + this);
221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        //Unregister for all events
222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCi.unregisterForIccRefresh(this);
223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCi.unSetOnSmsOnSim(this);
224e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mParentApp.unregisterForReady(this);
225230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        mParentApp.unregisterForLocked(this);
226e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        resetRecords();
227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        super.dispose();
228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
230cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void finalize() {
232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if(DBG) log("finalized");
233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
235e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    protected void resetRecords() {
236e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mImsi = null;
23722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mMsisdn = null;
23822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mVoiceMailNum = null;
23922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCountVoiceMessages = 0;
24022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mMncLength = UNINITIALIZED;
241a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        log("setting0 mMncLength" + mMncLength);
242b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville        mIccId = null;
243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // -1 means no EF_SPN found; treat accordingly.
24422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mSpnDisplayCondition = -1;
24522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mEfMWIS = null;
24622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mEfCPHS_MWI = null;
24722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mSpdiNetworks = null;
24822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPnnHomeName = null;
249620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt        mGid1 = null;
250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
25122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mAdnCache.reset();
252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        log("SIMRecords: onRadioOffOrNotAvailable set 'gsm.sim.operator.numeric' to operator=null");
254a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        log("update icc_operator_numeric=" + null);
255a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        setSystemProperty(PROPERTY_ICC_OPERATOR_NUMERIC, null);
256a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, null);
257a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, null);
258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // recordsRequested is set to false indicating that the SIM
260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // read requests made so far are not valid. This is set to
261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // true only when fresh set of read requests are made.
26222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsRequested = false;
263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    //***** Public Methods
267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * {@inheritDoc}
270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getIMSI() {
273e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        return mImsi;
274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
276cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getMsisdnNumber() {
27822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mMsisdn;
279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
2822f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim    public String getGid1() {
283620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt        return mGid1;
2842f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim    }
2852f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim
2862f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim    @Override
287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public UsimServiceTable getUsimServiceTable() {
288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return mUsimServiceTable;
289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Set subscriber number to SIM record
293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * The subscriber number is stored in EF_MSISDN (TS 51.011)
295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * When the operation is complete, onComplete will be sent to its handler
297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param alphaTag alpha-tagging of the dailing nubmer (up to 10 characters)
299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param number dailing nubmer (up to 20 digits)
300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        if the number starts with '+', then set to international TOA
301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param onComplete
302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        onComplete.obj will be an AsyncResult
303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ((AsyncResult)onComplete.obj).exception == null on success
304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ((AsyncResult)onComplete.obj).exception != null on fail
305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
306cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void setMsisdnNumber(String alphaTag, String number,
308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            Message onComplete) {
309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
31022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mMsisdn = number;
31122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mMsisdnTag = alphaTag;
312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
31322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if(DBG) log("Set MSISDN: " + mMsisdnTag + " " + /*mMsisdn*/ "xxxxxxx");
314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
31622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        AdnRecord adn = new AdnRecord(mMsisdnTag, mMsisdn);
317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        new AdnRecordLoader(mFh).updateEF(adn, EF_MSISDN, EF_EXT1, 1, null,
319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                obtainMessage(EVENT_SET_MSISDN_DONE, onComplete));
320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
322cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getMsisdnAlphaTag() {
32422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mMsisdnTag;
325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
327cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getVoiceMailNumber() {
32922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mVoiceMailNum;
330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Set voice mail number to SIM record
334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * The voice mail number can be stored either in EF_MBDN (TS 51.011) or
336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * EF_MAILBOX_CPHS (CPHS 4.2)
337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * If EF_MBDN is available, store the voice mail number to EF_MBDN
339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * If EF_MAILBOX_CPHS is enabled, store the voice mail number to EF_CHPS
341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * So the voice mail number will be stored in both EFs if both are available
343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Return error only if both EF_MBDN and EF_MAILBOX_CPHS fail.
345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * When the operation is complete, onComplete will be sent to its handler
347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param alphaTag alpha-tagging of the dailing nubmer (upto 10 characters)
349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param voiceNumber dailing nubmer (upto 20 digits)
350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        if the number is start with '+', then set to international TOA
351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param onComplete
352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        onComplete.obj will be an AsyncResult
353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ((AsyncResult)onComplete.obj).exception == null on success
354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ((AsyncResult)onComplete.obj).exception != null on fail
355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
356cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void setVoiceMailNumber(String alphaTag, String voiceNumber,
358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            Message onComplete) {
35922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mIsVoiceMailFixed) {
360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            AsyncResult.forMessage((onComplete)).exception =
361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new IccVmFixedException("Voicemail number is fixed by operator");
362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            onComplete.sendToTarget();
363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
36622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mNewVoiceMailNum = voiceNumber;
36722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mNewVoiceMailTag = alphaTag;
368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
36922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        AdnRecord adn = new AdnRecord(mNewVoiceMailTag, mNewVoiceMailNum);
370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
37122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mMailboxIndex != 0 && mMailboxIndex != 0xff) {
372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            new AdnRecordLoader(mFh).updateEF(adn, EF_MBDN, EF_EXT6,
37422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mMailboxIndex, null,
375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    obtainMessage(EVENT_SET_MBDN_DONE, onComplete));
376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else if (isCphsMailboxEnabled()) {
378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
379c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            new AdnRecordLoader(mFh).updateEF(adn, EF_MAILBOX_CPHS,
380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    EF_EXT1, 1, null,
381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    obtainMessage(EVENT_SET_CPHS_MAILBOX_DONE, onComplete));
382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            AsyncResult.forMessage((onComplete)).exception =
385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new IccVmNotSupportedException("Update SIM voice mailbox error");
386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            onComplete.sendToTarget();
387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
390cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getVoiceMailAlphaTag()
392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    {
39322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mVoiceMailTag;
394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Sets the SIM voice message waiting indicator records
398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param line GSM Subscriber Profile Number, one-based. Only '1' is supported
399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param countWaiting The number of messages waiting, if known. Use
400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *                     -1 to indicate that an unknown number of
401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *                      messages are waiting
402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
403cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void
405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    setVoiceMessageWaiting(int line, int countWaiting) {
406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (line != 1) {
407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // only profile 1 is supported
408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // range check
412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (countWaiting < 0) {
413c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            countWaiting = -1;
414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else if (countWaiting > 0xff) {
415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // TS 23.040 9.2.3.24.2
416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // "The value 255 shall be taken to mean 255 or greater"
417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            countWaiting = 0xff;
418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
42022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCountVoiceMessages = countWaiting;
421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
422c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mRecordsEventsRegistrants.notifyResult(EVENT_MWI);
423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        try {
42522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (mEfMWIS != null) {
426c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // TS 51.011 10.3.45
427c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // lsb of byte 0 is 'voicemail' status
42922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mEfMWIS[0] = (byte)((mEfMWIS[0] & 0xfe)
43022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                                    | (mCountVoiceMessages == 0 ? 0 : 1));
431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
432c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // byte 1 is the number of voice messages waiting
433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (countWaiting < 0) {
434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // The spec does not define what this should be
435c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // if we don't know the count
43622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mEfMWIS[1] = 0;
437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
43822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mEfMWIS[1] = (byte) countWaiting;
439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.updateEFLinearFixed(
44222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    EF_MWIS, 1, mEfMWIS, null,
443c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    obtainMessage (EVENT_UPDATE_DONE, EF_MWIS));
444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
44622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (mEfCPHS_MWI != null) {
447c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Refer CPHS4_2.WW6 B4.2.3
44822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mEfCPHS_MWI[0] = (byte)((mEfCPHS_MWI[0] & 0xf0)
44922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            | (mCountVoiceMessages == 0 ? 0x5 : 0xa));
450c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
451c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.updateEFTransparent(
45222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    EF_VOICE_MAIL_INDICATOR_CPHS, mEfCPHS_MWI,
453c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    obtainMessage (EVENT_UPDATE_DONE, EF_VOICE_MAIL_INDICATOR_CPHS));
454c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
455c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } catch (ArrayIndexOutOfBoundsException ex) {
456c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            logw("Error saving voice mail state to SIM. Probably malformed SIM record", ex);
457c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
459c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
460a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville    // Validate data is !null and the MSP (Multiple Subscriber Profile)
461a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville    // byte is between 1 and 4. See ETSI TS 131 102 v11.3.0 section 4.2.64.
462a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville    private boolean validEfCfis(byte[] data) {
463a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville        return ((data != null) && (data[0] >= 1) && (data[0] <= 4));
464a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville    }
465a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville
466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * {@inheritDoc}
468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public boolean getVoiceCallForwardingFlag() {
47122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mCallForwardingEnabled;
472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
474c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * {@inheritDoc}
476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
47831ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    public void setVoiceCallForwardingFlag(int line, boolean enable, String dialNumber) {
479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (line != 1) return; // only line 1 is supported
481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
48222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCallForwardingEnabled = enable;
483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mRecordsEventsRegistrants.notifyResult(EVENT_CFI);
485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        try {
487a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville            if (validEfCfis(mEfCfis)) {
488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // lsb is of byte 1 is voice status
489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (enable) {
490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mEfCfis[1] |= 1;
491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mEfCfis[1] &= 0xfe;
493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
495a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                log("setVoiceCallForwardingFlag: enable=" + enable
496a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                        + " mEfCfis=" + IccUtils.bytesToHexString(mEfCfis));
497a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville
49831ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                // Update dialNumber if not empty and CFU is enabled.
49931ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                // Spec reference for EF_CFIS contents, TS 51.011 section 10.3.46.
50031ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                if (enable && !TextUtils.isEmpty(dialNumber)) {
50131ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    log("EF_CFIS: updating cf number, " + dialNumber);
50231ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    byte[] bcdNumber = PhoneNumberUtils.numberToCalledPartyBCD(dialNumber);
50331ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville
50431ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    System.arraycopy(bcdNumber, 0, mEfCfis, CFIS_TON_NPI_OFFSET, bcdNumber.length);
50531ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville
50631ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    mEfCfis[CFIS_BCD_NUMBER_LENGTH_OFFSET] = (byte) (bcdNumber.length);
50731ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    mEfCfis[CFIS_ADN_CAPABILITY_ID_OFFSET] = (byte) 0xFF;
50831ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    mEfCfis[CFIS_ADN_EXTENSION_ID_OFFSET] = (byte) 0xFF;
50931ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                }
510c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
511c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.updateEFLinearFixed(
512c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        EF_CFIS, 1, mEfCfis, null,
513c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        obtainMessage (EVENT_UPDATE_DONE, EF_CFIS));
514a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville            } else {
515a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                log("setVoiceCallForwardingFlag: ignoring enable=" + enable
516a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                        + " invalid mEfCfis=" + IccUtils.bytesToHexString(mEfCfis));
517c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
518c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
519c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (mEfCff != null) {
520c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (enable) {
521c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mEfCff[0] = (byte) ((mEfCff[0] & CFF_LINE1_RESET)
522c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            | CFF_UNCONDITIONAL_ACTIVE);
523c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mEfCff[0] = (byte) ((mEfCff[0] & CFF_LINE1_RESET)
525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            | CFF_UNCONDITIONAL_DEACTIVE);
526c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
528c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.updateEFTransparent(
529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        EF_CFF_CPHS, mEfCff,
530c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        obtainMessage (EVENT_UPDATE_DONE, EF_CFF_CPHS));
531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } catch (ArrayIndexOutOfBoundsException ex) {
533e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby            logw("Error saving call forwarding flag to SIM. "
534c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            + "Probably malformed SIM record", ex);
535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
536c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
540c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Called by STK Service when REFRESH is received.
541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param fileChanged indicates whether any files changed
542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param fileList if non-null, a list of EF files that changed
543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
544cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void onRefresh(boolean fileChanged, int[] fileList) {
546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (fileChanged) {
547c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // A future optimization would be to inspect fileList and
548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // only reload those files that we care about.  For now,
549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // just re-fetch all SIM records that we cache.
550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            fetchSimRecords();
551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
555c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * {@inheritDoc}
556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getOperatorNumeric() {
559e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mImsi == null) {
560c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("getOperatorNumeric: IMSI == null");
561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return null;
562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
56322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mMncLength == UNINITIALIZED || mMncLength == UNKNOWN) {
564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("getSIMOperatorNumeric: bad mncLength");
565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return null;
566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Length = length of MCC + length of MNC
569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // length of mcc = 3 (TS 23.003 Section 2.2)
57022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mImsi.substring(0, 3 + mMncLength);
571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Overridden from Handler
574cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void handleMessage(Message msg) {
576c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        AsyncResult ar;
577c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        AdnRecord adn;
578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        byte data[];
580c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean isRecordLoadResponse = false;
582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
583bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        if (mDestroyed.get()) {
584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            loge("Received message " + msg + "[" + msg.what + "] " +
585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    " while being destroyed. Ignoring.");
586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        try { switch (msg.what) {
590e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case EVENT_APP_READY:
591e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                onReady();
592e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
594230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            case EVENT_APP_LOCKED:
595230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                onLocked();
596230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                break;
597230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            /* IO events */
599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_IMSI_DONE:
600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
601c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("Exception querying IMSI, Exception:" + ar.exception);
606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
609e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mImsi = (String) ar.result;
610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // IMSI (MCC+MNC+MSIN) is at least 6 digits, but not more
612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // than 15 (and usually 15).
613e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (mImsi != null && (mImsi.length() < 6 || mImsi.length() > 15)) {
614e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    loge("invalid IMSI " + mImsi);
615e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mImsi = null;
616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
618a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                log("IMSI: mMncLength=" + mMncLength);
619a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                log("IMSI: " + mImsi.substring(0, 6) + "xxxxxxx");
620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
62122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (((mMncLength == UNKNOWN) || (mMncLength == 2)) &&
622e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        ((mImsi != null) && (mImsi.length() >= 6))) {
623e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    String mccmncCode = mImsi.substring(0, 6);
624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    for (String mccmnc : MCCMNC_CODES_HAVING_3DIGITS_MNC) {
625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        if (mccmnc.equals(mccmncCode)) {
62622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            mMncLength = 3;
627a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                            log("IMSI: setting1 mMncLength=" + mMncLength);
628c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            break;
629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        }
630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
632c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
63322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mMncLength == UNKNOWN) {
634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // the SIM has told us all it knows, but it didn't know the mnc length.
635c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // guess using the mcc
636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    try {
637e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        int mcc = Integer.parseInt(mImsi.substring(0,3));
63822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mMncLength = MccTable.smallestDigitsMccForMnc(mcc);
639a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        log("setting2 mMncLength=" + mMncLength);
640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    } catch (NumberFormatException e) {
64122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mMncLength = UNKNOWN;
642a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        loge("Corrupt IMSI! setting3 mMncLength=" + mMncLength);
643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
64622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mMncLength != UNKNOWN && mMncLength != UNINITIALIZED) {
647a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    log("update mccmnc=" + mImsi.substring(0, 3 + mMncLength));
648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // finally have both the imsi and the mncLength and can parse the imsi properly
649b0b637dbf2a67c0e7eee917c0809f1cc54983986Robert Greenwalt                    MccTable.updateMccMncConfiguration(mContext,
650b0b637dbf2a67c0e7eee917c0809f1cc54983986Robert Greenwalt                            mImsi.substring(0, 3 + mMncLength), false);
651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
652e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mImsiReadyRegistrants.notifyRegistrants();
653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_MBI_DONE:
656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                boolean isValidMbdn;
657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[]) ar.result;
661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isValidMbdn = false;
663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception == null) {
664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Refer TS 51.011 Section 10.3.44 for content details
665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("EF_MBI: " + IccUtils.bytesToHexString(data));
666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Voice mail record number stored first
66822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mMailboxIndex = data[0] & 0xff;
669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // check if dailing numbe id valid
67122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (mMailboxIndex != 0 && mMailboxIndex != 0xff) {
672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        log("Got valid mailbox number for MBDN");
673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        isValidMbdn = true;
674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // one more record to load
67822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mRecordsToLoad += 1;
679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (isValidMbdn) {
681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Note: MBDN was not included in NUM_OF_SIM_RECORDS_LOADED
682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new AdnRecordLoader(mFh).loadFromEF(EF_MBDN, EF_EXT6,
68322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            mMailboxIndex, obtainMessage(EVENT_GET_MBDN_DONE));
684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // If this EF not present, try mailbox as in CPHS standard
686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // CPHS (CPHS4_2.WW6) is a european standard.
687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new AdnRecordLoader(mFh).loadFromEF(EF_MAILBOX_CPHS,
688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            EF_EXT1, 1,
689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE));
690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_CPHS_MAILBOX_DONE:
694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_MBDN_DONE:
695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                //Resetting the voice mail number and voice mail tag to null
696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                //as these should be updated from the data read from EF_MBDN.
697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                //If they are not reset, incase of invalid data/exception these
698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                //variables are retaining their previous values and are
699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                //causing invalid voice mailbox info display to user.
70022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mVoiceMailNum = null;
70122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mVoiceMailTag = null;
702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("Invalid or missing EF"
709c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        + ((msg.what == EVENT_GET_CPHS_MAILBOX_DONE) ? "[MAILBOX]" : "[MBDN]"));
710c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Bug #645770 fall back to CPHS
712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // FIXME should use SST to decide
713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
714c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (msg.what == EVENT_GET_MBDN_DONE) {
715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        //load CPHS on fail...
716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        // FIXME right now, only load line1's CPHS voice mail entry
717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
71822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mRecordsToLoad += 1;
719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        new AdnRecordLoader(mFh).loadFromEF(
720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                EF_MAILBOX_CPHS, EF_EXT1, 1,
721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE));
722c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
723c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                adn = (AdnRecord)ar.result;
727c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
728c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("VM: " + adn +
729c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        ((msg.what == EVENT_GET_CPHS_MAILBOX_DONE) ? " EF[MAILBOX]" : " EF[MBDN]"));
730c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
731c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (adn.isEmpty() && msg.what == EVENT_GET_MBDN_DONE) {
732c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Bug #645770 fall back to CPHS
733c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // FIXME should use SST to decide
734c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // FIXME right now, only load line1's CPHS voice mail entry
73522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mRecordsToLoad += 1;
736c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new AdnRecordLoader(mFh).loadFromEF(
737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            EF_MAILBOX_CPHS, EF_EXT1, 1,
738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE));
739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
740c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
741c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
742c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
74322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mVoiceMailNum = adn.getNumber();
74422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mVoiceMailTag = adn.getAlphaTag();
745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
746c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
747c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_MSISDN_DONE:
748c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
749c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
750c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
751c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
752c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
753c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("Invalid or missing EF[MSISDN]");
754c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
755c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
756c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
757c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                adn = (AdnRecord)ar.result;
758c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
75922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mMsisdn = adn.getNumber();
76022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mMsisdnTag = adn.getAlphaTag();
761c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
76222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                log("MSISDN: " + /*mMsisdn*/ "xxxxxxx");
763c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
764c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
765c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_SET_MSISDN_DONE:
766c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
767c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
768c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
769c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.userObj != null) {
770c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    AsyncResult.forMessage(((Message) ar.userObj)).exception
771c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            = ar.exception;
772c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    ((Message) ar.userObj).sendToTarget();
773c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
774c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
775c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
776c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_MWIS_DONE:
777c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
778c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
779c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
780c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
781c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
782c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
783c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
784c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
785c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
786c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("EF_MWIS: " + IccUtils.bytesToHexString(data));
787c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
78822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mEfMWIS = data;
789c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
790c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if ((data[0] & 0xff) == 0xff) {
791c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("Uninitialized record MWIS");
792c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
793c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
794c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
795c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // Refer TS 51.011 Section 10.3.45 for the content description
796c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                boolean voiceMailWaiting = ((data[0] & 0x01) != 0);
79722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mCountVoiceMessages = data[1] & 0xff;
798c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
79922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (voiceMailWaiting && mCountVoiceMessages == 0) {
800c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Unknown count = -1
80122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mCountVoiceMessages = -1;
802c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
803c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
804c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mRecordsEventsRegistrants.notifyResult(EVENT_MWI);
805c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
806c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
807c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE:
808c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
809c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
810c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
811c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
812c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
813c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
814c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
815c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
816c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
81722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mEfCPHS_MWI = data;
818c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
819c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // Use this data if the EF[MWIS] exists and
820c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // has been loaded
821c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
82222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mEfMWIS == null) {
823cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    int indicator = data[0] & 0xf;
824c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
825c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Refer CPHS4_2.WW6 B4.2.3
826c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (indicator == 0xA) {
827c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        // Unknown count = -1
82822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mCountVoiceMessages = -1;
829c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    } else if (indicator == 0x5) {
83022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mCountVoiceMessages = 0;
831c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
832c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
833c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mRecordsEventsRegistrants.notifyResult(EVENT_MWI);
834c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
835c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
836c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
837c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_ICCID_DONE:
838c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
839c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
840c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
841c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
842c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
843c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
844c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
845c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
846c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
847b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville                mIccId = IccUtils.bcdToString(data, 0, data.length);
848c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
849b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville                log("iccid: " + mIccId);
850c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
851c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
852c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
853c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
854c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_AD_DONE:
855c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                try {
856c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    isRecordLoadResponse = true;
857c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
858c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    ar = (AsyncResult)msg.obj;
859c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    data = (byte[])ar.result;
860c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
861c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (ar.exception != null) {
862c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        break;
863c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
864c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
865c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("EF_AD: " + IccUtils.bytesToHexString(data));
866c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
867c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (data.length < 3) {
868c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        log("Corrupt AD data on SIM");
869c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        break;
870c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
871c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
872c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (data.length == 3) {
873c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        log("MNC length not present in EF_AD");
874c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        break;
875c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
876c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
87722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mMncLength = data[3] & 0xf;
878a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    log("setting4 mMncLength=" + mMncLength);
879c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
88022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (mMncLength == 0xf) {
88122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mMncLength = UNKNOWN;
882a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        log("setting5 mMncLength=" + mMncLength);
883c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
884c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } finally {
88522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (((mMncLength == UNINITIALIZED) || (mMncLength == UNKNOWN) ||
88622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            (mMncLength == 2)) && ((mImsi != null) && (mImsi.length() >= 6))) {
887e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        String mccmncCode = mImsi.substring(0, 6);
888a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        log("mccmncCode=" + mccmncCode);
889c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        for (String mccmnc : MCCMNC_CODES_HAVING_3DIGITS_MNC) {
890c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            if (mccmnc.equals(mccmncCode)) {
89122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                                mMncLength = 3;
892a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                                log("setting6 mMncLength=" + mMncLength);
893c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                break;
894c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            }
895c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        }
896c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
897c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
89822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (mMncLength == UNKNOWN || mMncLength == UNINITIALIZED) {
899e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        if (mImsi != null) {
900c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            try {
901e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                                int mcc = Integer.parseInt(mImsi.substring(0,3));
902c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
90322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                                mMncLength = MccTable.smallestDigitsMccForMnc(mcc);
904a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                                log("setting7 mMncLength=" + mMncLength);
905c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            } catch (NumberFormatException e) {
90622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                                mMncLength = UNKNOWN;
907a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                                loge("Corrupt IMSI! setting8 mMncLength=" + mMncLength);
908c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            }
909c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        } else {
910c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            // Indicate we got this info, but it didn't contain the length.
91122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            mMncLength = UNKNOWN;
912a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                            log("MNC length not present in EF_AD setting9 mMncLength=" + mMncLength);
913c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        }
914c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
91522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (mImsi != null && mMncLength != UNKNOWN) {
916c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        // finally have both imsi and the length of the mnc and can parse
917c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        // the imsi properly
918a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        log("update mccmnc=" + mImsi.substring(0, 3 + mMncLength));
919c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        MccTable.updateMccMncConfiguration(mContext,
920b0b637dbf2a67c0e7eee917c0809f1cc54983986Robert Greenwalt                                mImsi.substring(0, 3 + mMncLength), false);
921c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
922c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
923c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
924c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
925c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_SPN_DONE:
926c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
927c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult) msg.obj;
928c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                getSpnFsm(false, ar);
929c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
930c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
931c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_CFF_DONE:
932c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
933c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
934c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult) msg.obj;
935c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[]) ar.result;
936c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
937c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
938c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
939c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
940c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
941c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("EF_CFF_CPHS: " + IccUtils.bytesToHexString(data));
942c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mEfCff = data;
943c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
944e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby                // if EF_CFIS is valid, prefer it to EF_CFF_CPHS
945e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby                if (!validEfCfis(mEfCfis)) {
94622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mCallForwardingEnabled =
947c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        ((data[0] & CFF_LINE1_MASK) == CFF_UNCONDITIONAL_ACTIVE);
948c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
949c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mRecordsEventsRegistrants.notifyResult(EVENT_CFI);
950a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                } else {
951e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby                    log("EVENT_GET_CFF_DONE: EF_CFIS is valid, ignoring EF_CFF_CPHS");
952c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
953c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
954c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
955c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_SPDI_DONE:
956c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
957c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
958c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
959c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
960c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
961c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
962c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
963c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
964c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
965c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                parseEfSpdi(data);
966c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
967c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
968c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_UPDATE_DONE:
969c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
970c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
971c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    logw("update failed. ", ar.exception);
972c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
973c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
974c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
975c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_PNN_DONE:
976c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
977c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
978c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
979c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
980c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
981c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
982c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
983c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
984c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
985c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                SimTlv tlv = new SimTlv(data, 0, data.length);
986c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
987c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                for ( ; tlv.isValidObject() ; tlv.nextObject()) {
988c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (tlv.getTag() == TAG_FULL_NETWORK_NAME) {
98922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mPnnHomeName
990c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            = IccUtils.networkNameToString(
991c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                tlv.getData(), 0, tlv.getData().length);
992c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        break;
993c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
994c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
995c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
996c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
997c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_ALL_SMS_DONE:
998c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
999c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1000c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1001c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null)
1002c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
1003c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1004cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                handleSmses((ArrayList<byte []>) ar.result);
1005c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1006c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1007c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_MARK_SMS_READ_DONE:
100899c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.i("ENF", "marked read: sms " + msg.arg1);
1009c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1010c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1011c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1012c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_SMS_ON_SIM:
1013c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
1014c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1015c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1016c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1017c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                int[] index = (int[])ar.result;
1018c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1019c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null || index.length != 1) {
1020c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("Error on SMS_ON_SIM with exp "
1021c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            + ar.exception + " length " + index.length);
1022c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1023c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("READ EF_SMS RECORD index=" + index[0]);
1024c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mFh.loadEFLinearFixed(EF_SMS,index[0],
1025c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_GET_SMS_DONE));
1026c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1027c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1028c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1029c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_SMS_DONE:
1030c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
1031c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1032c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception == null) {
1033c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    handleSms((byte[])ar.result);
1034c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1035c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("Error on GET_SMS with exp " + ar.exception);
1036c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1037c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1038c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_SST_DONE:
1039c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
1040c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1041c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1042c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
1043c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1044c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
1045c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
1046c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1047c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1048c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mUsimServiceTable = new UsimServiceTable(data);
1049c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("SST: " + mUsimServiceTable);
1050c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1051c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1052c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_INFO_CPHS_DONE:
1053c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
1054c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1055c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1056c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1057c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
1058c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
1059c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1060c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1061c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mCphsInfo = (byte[])ar.result;
1062c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1063c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("iCPHS: " + IccUtils.bytesToHexString(mCphsInfo));
1064c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
1065c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1066c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_SET_MBDN_DONE:
1067c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
1068c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1069c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
10706e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                if (DBG) log("EVENT_SET_MBDN_DONE ex:" + ar.exception);
1071c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception == null) {
107222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mVoiceMailNum = mNewVoiceMailNum;
107322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mVoiceMailTag = mNewVoiceMailTag;
1074c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1075c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1076c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (isCphsMailboxEnabled()) {
107722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    adn = new AdnRecord(mVoiceMailTag, mVoiceMailNum);
1078c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    Message onCphsCompleted = (Message) ar.userObj;
1079c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1080c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    /* write to cphs mailbox whenever it is available but
1081c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    * we only need notify caller once if both updating are
1082c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    * successful.
1083c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    *
1084c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    * so if set_mbdn successful, notify caller here and set
1085c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    * onCphsCompleted to null
1086c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    */
1087c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (ar.exception == null && ar.userObj != null) {
1088c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        AsyncResult.forMessage(((Message) ar.userObj)).exception
1089c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                = null;
1090c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        ((Message) ar.userObj).sendToTarget();
1091c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1092c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        if (DBG) log("Callback with MBDN successful.");
1093c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1094c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        onCphsCompleted = null;
1095c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
1096c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1097c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new AdnRecordLoader(mFh).
1098c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            updateEF(adn, EF_MAILBOX_CPHS, EF_EXT1, 1, null,
1099c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_SET_CPHS_MAILBOX_DONE,
1100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                    onCphsCompleted));
1101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (ar.userObj != null) {
11036e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                        Resources resource = Resources.getSystem();
11046e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                        if (ar.exception != null && resource.getBoolean(com.android.internal.
11056e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                                    R.bool.editable_voicemailnumber)) {
11066e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                            // GSMPhone will store vm number on device
11076e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                            // when IccVmNotSupportedException occurred
11086e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                            AsyncResult.forMessage(((Message) ar.userObj)).exception
11096e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                                = new IccVmNotSupportedException(
11106e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                                        "Update SIM voice mailbox error");
11116e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                        } else {
11126e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                            AsyncResult.forMessage(((Message) ar.userObj)).exception
1113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                = ar.exception;
11146e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                        }
1115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        ((Message) ar.userObj).sendToTarget();
1116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
1117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_SET_CPHS_MAILBOX_DONE:
1120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
1121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if(ar.exception == null) {
112322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mVoiceMailNum = mNewVoiceMailNum;
112422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mVoiceMailTag = mNewVoiceMailTag;
1125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) log("Set CPHS MailBox with exception: "
1127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            + ar.exception);
1128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.userObj != null) {
1130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) log("Callback with CPHS MB successful.");
1131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    AsyncResult.forMessage(((Message) ar.userObj)).exception
1132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            = ar.exception;
1133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    ((Message) ar.userObj).sendToTarget();
1134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_SIM_REFRESH:
1137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
1138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("Sim REFRESH with exception: " + ar.exception);
1140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception == null) {
1141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    handleSimRefresh((IccRefreshResponse)ar.result);
1142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_CFIS_DONE:
1145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
1146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
1149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
1151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
1152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("EF_CFIS: " + IccUtils.bytesToHexString(data));
1155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1156a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                if (validEfCfis(data)) {
1157a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                    mEfCfis = data;
1158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1159a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                    // Refer TS 51.011 Section 10.3.46 for the content description
116022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mCallForwardingEnabled = ((data[1] & 0x01) != 0);
1161e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby                    log("EF_CFIS: callForwardingEnabled=" + mCallForwardingEnabled);
1162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1163a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                    mRecordsEventsRegistrants.notifyResult(EVENT_CFI);
1164a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                } else {
1165a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                    log("EF_CFIS: invalid data=" + IccUtils.bytesToHexString(data));
1166a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                }
1167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_CSP_CPHS_DONE:
1170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
1171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
1175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("Exception in fetching EF_CSP data " + ar.exception);
1176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
1177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
1180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("EF_CSP: " + IccUtils.bytesToHexString(data));
1182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                handleEfCspData(data);
1183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
11852f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim            case EVENT_GET_GID1_DONE:
11862f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                isRecordLoadResponse = true;
11872f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim
11882f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                ar = (AsyncResult)msg.obj;
11892f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                data =(byte[])ar.result;
11902f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim
11912f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                if (ar.exception != null) {
11922f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                    loge("Exception in get GID1 " + ar.exception);
1193620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt                    mGid1 = null;
11942f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                    break;
11952f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                }
1196620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt                mGid1 = IccUtils.bytesToHexString(data);
1197620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt                log("GID1: " + mGid1);
11982f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim
11992f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                break;
12002f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim
1201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            default:
1202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                super.handleMessage(msg);   // IccRecords handles generic record load responses
1203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }}catch (RuntimeException exc) {
1205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // I don't want these exceptions to be fatal
1206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            logw("Exception parsing SIM record", exc);
1207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } finally {
1208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Count up record load responses even if they are fails
1209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (isRecordLoadResponse) {
1210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                onRecordLoaded();
1211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1215230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private class EfPlLoaded implements IccRecordLoaded {
1216230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        public String getEfName() {
1217230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            return "EF_PL";
1218230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1219230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1220230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        public void onRecordLoaded(AsyncResult ar) {
1221230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mEfPl = (byte[]) ar.result;
1222230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            if (DBG) log("EF_PL=" + IccUtils.bytesToHexString(mEfPl));
1223230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1224230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    }
1225230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1226230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private class EfUsimLiLoaded implements IccRecordLoaded {
1227230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        public String getEfName() {
1228230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            return "EF_LI";
1229230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1230230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1231230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        public void onRecordLoaded(AsyncResult ar) {
1232230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mEfLi = (byte[]) ar.result;
1233230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            if (DBG) log("EF_LI=" + IccUtils.bytesToHexString(mEfLi));
1234230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1235230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    }
1236230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void handleFileUpdate(int efid) {
1238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        switch(efid) {
1239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EF_MBDN:
124022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mRecordsToLoad++;
1241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                new AdnRecordLoader(mFh).loadFromEF(EF_MBDN, EF_EXT6,
124222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mMailboxIndex, obtainMessage(EVENT_GET_MBDN_DONE));
1243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EF_MAILBOX_CPHS:
124522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mRecordsToLoad++;
1246c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                new AdnRecordLoader(mFh).loadFromEF(EF_MAILBOX_CPHS, EF_EXT1,
1247c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        1, obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE));
1248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EF_CSP_CPHS:
125022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mRecordsToLoad++;
1251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("[CSP] SIM Refresh for EF_CSP_CPHS");
1252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.loadEFTransparent(EF_CSP_CPHS,
1253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        obtainMessage(EVENT_GET_CSP_CPHS_DONE));
1254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
125567aacea4e6b0199579a71b3a6a2f5d6778b8a002Kevin Li            case EF_FDN:
125667aacea4e6b0199579a71b3a6a2f5d6778b8a002Kevin Li                if (DBG) log("SIM Refresh called for EF_FDN");
125767aacea4e6b0199579a71b3a6a2f5d6778b8a002Kevin Li                mParentApp.queryFdn();
125867aacea4e6b0199579a71b3a6a2f5d6778b8a002Kevin Li                break;
1259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            default:
1260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // For now, fetch all records if this is not a
1261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // voicemail number.
1262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // TODO: Handle other cases, instead of fetching all.
126322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mAdnCache.reset();
1264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                fetchSimRecords();
1265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void handleSimRefresh(IccRefreshResponse refreshResponse){
1270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (refreshResponse == null) {
1271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) log("handleSimRefresh received without input");
1272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
1273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (refreshResponse.aid != null &&
1276e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                !refreshResponse.aid.equals(mParentApp.getAid())) {
1277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // This is for different app. Ignore.
1278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
1279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        switch (refreshResponse.refreshResult) {
1282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case IccRefreshResponse.REFRESH_RESULT_FILE_UPDATE:
1283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("handleSimRefresh with SIM_FILE_UPDATED");
1284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                handleFileUpdate(refreshResponse.efId);
1285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case IccRefreshResponse.REFRESH_RESULT_INIT:
1287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("handleSimRefresh with SIM_REFRESH_INIT");
1288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // need to reload all files (that we care about)
128964bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka                onIccRefreshInit();
1290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case IccRefreshResponse.REFRESH_RESULT_RESET:
1292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("handleSimRefresh with SIM_REFRESH_RESET");
1293c3e37a01b74d28ebf10572bb0811c8a01916d941Shishir Agrawal                if (requirePowerOffOnSimRefreshReset()) {
1294c3e37a01b74d28ebf10572bb0811c8a01916d941Shishir Agrawal                    mCi.setRadioPower(false, null);
1295c3e37a01b74d28ebf10572bb0811c8a01916d941Shishir Agrawal                    /* Note: no need to call setRadioPower(true).  Assuming the desired
1296c3e37a01b74d28ebf10572bb0811c8a01916d941Shishir Agrawal                    * radio power state is still ON (as tracked by ServiceStateTracker),
1297c3e37a01b74d28ebf10572bb0811c8a01916d941Shishir Agrawal                    * ServiceStateTracker will call setRadioPower when it receives the
1298c3e37a01b74d28ebf10572bb0811c8a01916d941Shishir Agrawal                    * RADIO_STATE_CHANGED notification for the power off.  And if the
1299c3e37a01b74d28ebf10572bb0811c8a01916d941Shishir Agrawal                    * desired power state has changed in the interim, we don't want to
1300c3e37a01b74d28ebf10572bb0811c8a01916d941Shishir Agrawal                    * override it with an unconditional power on.
1301c3e37a01b74d28ebf10572bb0811c8a01916d941Shishir Agrawal                    */
1302c3e37a01b74d28ebf10572bb0811c8a01916d941Shishir Agrawal                }
13037af882af5b1195e03881a61f177adf86e44ab76fduho.ro                mAdnCache.reset();
1304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            default:
1306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // unknown refresh operation
1307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("handleSimRefresh with unknown operation");
1308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1313e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby     * Dispatch 3GPP format message to registrant ({@code GSMPhone} or {@code CDMALTEPhone})
1314e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby     * to pass to the 3GPP SMS dispatcher for delivery.
1315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1316a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hamby    private int dispatchGsmMessage(SmsMessage message) {
1317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mNewSmsRegistrants.notifyResult(message);
1318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return 0;
1319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void handleSms(byte[] ba) {
1322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (ba[0] != 0)
132399c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville            Rlog.d("ENF", "status : " + ba[0]);
1324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // 3GPP TS 51.011 v5.0.0 (20011-12)  10.5.3
1326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // 3 == "received by MS from network; message to be read"
1327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (ba[0] == 3) {
1328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int n = ba.length;
1329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Note: Data may include trailing FF's.  That's OK; message
1331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // should still parse correctly.
1332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            byte[] pdu = new byte[n - 1];
1333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            System.arraycopy(ba, 1, pdu, 0, n - 1);
1334a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hamby            SmsMessage message = SmsMessage.createFromPdu(pdu, SmsConstants.FORMAT_3GPP);
1335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            dispatchGsmMessage(message);
1337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1341cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private void handleSmses(ArrayList<byte[]> messages) {
1342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int count = messages.size();
1343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for (int i = 0; i < count; i++) {
1345cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            byte[] ba = messages.get(i);
1346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (ba[0] != 0)
134899c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.i("ENF", "status " + i + ": " + ba[0]);
1349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // 3GPP TS 51.011 v5.0.0 (20011-12)  10.5.3
1351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // 3 == "received by MS from network; message to be read"
1352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (ba[0] == 3) {
1354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                int n = ba.length;
1355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // Note: Data may include trailing FF's.  That's OK; message
1357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // should still parse correctly.
1358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                byte[] pdu = new byte[n - 1];
1359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                System.arraycopy(ba, 1, pdu, 0, n - 1);
1360a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hamby                SmsMessage message = SmsMessage.createFromPdu(pdu, SmsConstants.FORMAT_3GPP);
1361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                dispatchGsmMessage(message);
1363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // 3GPP TS 51.011 v5.0.0 (20011-12)  10.5.3
1365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // 1 == "received by MS from network; message read"
1366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ba[0] = 1;
1368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1369cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (false) { // FIXME: writing seems to crash RdoServD
1370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mFh.updateEFLinearFixed(EF_SMS,
1371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            i, ba, null, obtainMessage(EVENT_MARK_SMS_READ_DONE, i));
1372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1377230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private String findBestLanguage(byte[] languages) {
1378230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        String bestMatch = null;
1379230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        String[] locales = mContext.getAssets().getLocales();
1380230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1381230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        if ((languages == null) || (locales == null)) return null;
1382230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1383230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        // Each 2-bytes consists of one language
1384230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        for (int i = 0; (i + 1) < languages.length; i += 2) {
1385230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            try {
1386230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                String lang = new String(languages, i, 2, "ISO-8859-1");
1387230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                if (DBG) log ("languages from sim = " + lang);
1388230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                for (int j = 0; j < locales.length; j++) {
1389230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                    if (locales[j] != null && locales[j].length() >= 2 &&
1390230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                            locales[j].substring(0, 2).equalsIgnoreCase(lang)) {
1391230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                        return lang;
1392230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                    }
1393230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                }
1394230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                if (bestMatch != null) break;
1395230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            } catch(java.io.UnsupportedEncodingException e) {
1396230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                log ("Failed to parse USIM language records" + e);
1397230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            }
1398230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1399230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        // no match found. return null
1400230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        return null;
1401230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    }
1402230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1403230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private void setLocaleFromUsim() {
1404230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        String prefLang = null;
1405230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        // check EFli then EFpl
1406230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        prefLang = findBestLanguage(mEfLi);
1407230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1408230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        if (prefLang == null) {
1409230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            prefLang = findBestLanguage(mEfPl);
1410230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1411230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1412230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        if (prefLang != null) {
1413230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            // check country code from SIM
1414230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            String imsi = getIMSI();
1415230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            String country = null;
1416230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            if (imsi != null) {
1417230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                country = MccTable.countryCodeForMcc(
1418230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                                    Integer.parseInt(imsi.substring(0,3)));
1419230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            }
1420230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            if (DBG) log("Setting locale to " + prefLang + "_" + country);
1421230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            MccTable.setSystemLocale(mContext, prefLang, country);
1422230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        } else {
1423230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            if (DBG) log ("No suitable USIM selected locale");
1424230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1425230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    }
1426230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1427cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onRecordLoaded() {
1429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // One record loaded successfully or failed, In either case
1430c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // we need to update the recordsToLoad count
143122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad -= 1;
143222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (DBG) log("onRecordLoaded " + mRecordsToLoad + " requested: " + mRecordsRequested);
1433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
143422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mRecordsToLoad == 0 && mRecordsRequested == true) {
1435c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            onAllRecordsLoaded();
143622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (mRecordsToLoad < 0) {
1437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            loge("recordsToLoad <0, programmer error suspected");
143822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mRecordsToLoad = 0;
1439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1442cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1443c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onAllRecordsLoaded() {
1444e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        if (DBG) log("record load complete");
1445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1446230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        setLocaleFromUsim();
1447230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1448230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        if (mParentApp.getState() == AppState.APPSTATE_PIN ||
1449230e46bdd850306dcc54ab6038d4d3132f5032abnfjb               mParentApp.getState() == AppState.APPSTATE_PUK) {
1450230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            // reset recordsRequested, since sim is not loaded really
1451230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mRecordsRequested = false;
1452230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            // lock state, only update language
1453230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            return ;
1454230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1455230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1456c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Some fields require more than one SIM record to set
1457c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1458e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        String operator = getOperatorNumeric();
1459e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        if (!TextUtils.isEmpty(operator)) {
1460e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville            log("onAllRecordsLoaded set 'gsm.sim.operator.numeric' to operator='" +
1461e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville                    operator + "'");
1462a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            log("update icc_operator_numeric=" + operator);
1463a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            setSystemProperty(PROPERTY_ICC_OPERATOR_NUMERIC, operator);
1464b9adaa1c4a12df8c8bd44b4803d452662b53e0d8Tom Taylor            final SubscriptionController subController = SubscriptionController.getInstance();
1465b9adaa1c4a12df8c8bd44b4803d452662b53e0d8Tom Taylor            subController.setMccMnc(operator, subController.getDefaultSmsSubId());
1466e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        } else {
1467e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville            log("onAllRecordsLoaded empty 'gsm.sim.operator.numeric' skipping");
1468e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        }
1469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1470e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        if (!TextUtils.isEmpty(mImsi)) {
1471e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville            log("onAllRecordsLoaded set mcc imsi=" + mImsi);
1472a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY,
1473e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    MccTable.countryCodeForMcc(Integer.parseInt(mImsi.substring(0,3))));
1474e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        } else {
1475e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville            log("onAllRecordsLoaded empty imsi skipping setting mcc");
1476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        setVoiceMailByCountry(operator);
1479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        setSpnFromConfig(operator);
1480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1481b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville        mRecordsLoadedRegistrants.notifyRegistrants(
1482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            new AsyncResult(null, null, null));
1483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    //***** Private methods
1486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void setSpnFromConfig(String carrier) {
1488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mSpnOverride.containsCarrier(carrier)) {
1489b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal            setServiceProviderName(mSpnOverride.getSpn(carrier));
1490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void setVoiceMailByCountry (String spn) {
1495c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mVmConfig.containsCarrier(spn)) {
149622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mIsVoiceMailFixed = true;
149722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mVoiceMailNum = mVmConfig.getVoiceMailNumber(spn);
149822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mVoiceMailTag = mVmConfig.getVoiceMailTag(spn);
1499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
1503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void onReady() {
1504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        fetchSimRecords();
1505c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1506c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1507230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private void onLocked() {
1508230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        mRecordsRequested = true;
1509230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        if (DBG) log("only fetch EF_LI and EF_PL in lock state");
1510230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        loadEfLiAndEfPl();
1511230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    }
1512230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1513230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private void loadEfLiAndEfPl() {
1514230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        if (mParentApp.getType() == AppType.APPTYPE_USIM) {
1515230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mFh.loadEFTransparent(EF_LI,
1516230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                    obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfUsimLiLoaded()));
1517230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mRecordsToLoad++;
1518230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1519230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mFh.loadEFTransparent(EF_PL,
1520230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                    obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfPlLoaded()));
1521230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mRecordsToLoad++;
1522230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1523230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    }
1524230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void fetchSimRecords() {
152622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsRequested = true;
1527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
152822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (DBG) log("fetchSimRecords " + mRecordsToLoad);
1529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1530e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mCi.getIMSIForApp(mParentApp.getAid(), obtainMessage(EVENT_GET_IMSI_DONE));
153122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_ICCID, obtainMessage(EVENT_GET_ICCID_DONE));
153422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1536c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // FIXME should examine EF[MSISDN]'s capability configuration
1537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // to determine which is the voice/data/fax line
1538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        new AdnRecordLoader(mFh).loadFromEF(EF_MSISDN, EF_EXT1, 1,
1539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    obtainMessage(EVENT_GET_MSISDN_DONE));
154022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Record number is subscriber profile
1543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFLinearFixed(EF_MBI, 1, obtainMessage(EVENT_GET_MBI_DONE));
154422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_AD, obtainMessage(EVENT_GET_AD_DONE));
154722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Record number is subscriber profile
1550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFLinearFixed(EF_MWIS, 1, obtainMessage(EVENT_GET_MWIS_DONE));
155122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Also load CPHS-style voice mail indicator, which stores
1555c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // the same info as EF[MWIS]. If both exist, both are updated
1556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // but the EF[MWIS] data is preferred
1557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Please note this must be loaded after EF[MWIS]
1558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(
1559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                EF_VOICE_MAIL_INDICATOR_CPHS,
1560c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                obtainMessage(EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE));
156122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Same goes for Call Forward Status indicator: fetch both
1564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // EF[CFIS] and CPHS-EF, with EF[CFIS] preferred.
1565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFLinearFixed(EF_CFIS, 1, obtainMessage(EVENT_GET_CFIS_DONE));
156622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_CFF_CPHS, obtainMessage(EVENT_GET_CFF_DONE));
156822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        getSpnFsm(true, null);
1572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_SPDI, obtainMessage(EVENT_GET_SPDI_DONE));
157422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1576c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFLinearFixed(EF_PNN, 1, obtainMessage(EVENT_GET_PNN_DONE));
157722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_SST, obtainMessage(EVENT_GET_SST_DONE));
158022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_INFO_CPHS, obtainMessage(EVENT_GET_INFO_CPHS_DONE));
158322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_CSP_CPHS,obtainMessage(EVENT_GET_CSP_CPHS_DONE));
158622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
15882f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim        mFh.loadEFTransparent(EF_GID1, obtainMessage(EVENT_GET_GID1_DONE));
1589620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt        mRecordsToLoad++;
1590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1591230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        loadEfLiAndEfPl();
1592230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // XXX should seek instead of examining them all
1594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (false) { // XXX
1595c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mFh.loadEFLinearFixedAll(EF_SMS, obtainMessage(EVENT_GET_ALL_SMS_DONE));
159622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mRecordsToLoad++;
1597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (CRASH_RIL) {
1600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            String sms = "0107912160130310f20404d0110041007030208054832b0120"
1601c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                         + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
1602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                         + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
1603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                         + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
1604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                         + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
1605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                         + "ffffffffffffffffffffffffffffff";
1606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            byte[] ba = IccUtils.hexStringToBytes(sms);
1607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mFh.updateEFLinearFixed(EF_SMS, 1, ba, null,
1609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_MARK_SMS_READ_DONE, 1));
1610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
161122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (DBG) log("fetchSimRecords " + mRecordsToLoad + " requested: " + mRecordsRequested);
1612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Returns the SpnDisplayRule based on settings on the SIM and the
1616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * specified plmn (currently-registered PLMN).  See TS 22.101 Annex A
1617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * and TS 51.011 10.3.11 for details.
1618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
16192bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapati     * If the SPN is not found on the SIM or is empty, the rule is
16202bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapati     * always PLMN_ONLY.
1621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
1623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public int getDisplayRule(String plmn) {
1624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int rule;
1625be6c87905a15d1e36e87189ad7df5d5a72a52f69Shishir Agrawal
162662d026a3882d133aa81995f8dfd2c1d25b1b0649Shishir Agrawal        if (mParentApp != null && mParentApp.getUiccCard() != null &&
162768515b655255005f653aec29e9f152412514982aShishir Agrawal            mParentApp.getUiccCard().getOperatorBrandOverride() != null) {
1628be6c87905a15d1e36e87189ad7df5d5a72a52f69Shishir Agrawal        // If the operator has been overridden, treat it as the SPN file on the SIM did not exist.
1629be6c87905a15d1e36e87189ad7df5d5a72a52f69Shishir Agrawal            rule = SPN_RULE_SHOW_PLMN;
1630be6c87905a15d1e36e87189ad7df5d5a72a52f69Shishir Agrawal        } else if (TextUtils.isEmpty(getServiceProviderName()) || mSpnDisplayCondition == -1) {
16312bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapati            // No EF_SPN content was found on the SIM, or not yet loaded.  Just show ONS.
1632c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            rule = SPN_RULE_SHOW_PLMN;
1633c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else if (isOnMatchingPlmn(plmn)) {
1634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            rule = SPN_RULE_SHOW_SPN;
163522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if ((mSpnDisplayCondition & 0x01) == 0x01) {
1636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // ONS required when registered to HPLMN or PLMN in EF_SPDI
1637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                rule |= SPN_RULE_SHOW_PLMN;
1638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
1640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            rule = SPN_RULE_SHOW_PLMN;
164122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if ((mSpnDisplayCondition & 0x02) == 0x00) {
1642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // SPN required if not registered to HPLMN or PLMN in EF_SPDI
1643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                rule |= SPN_RULE_SHOW_SPN;
1644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return rule;
1647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Checks if plmn is HPLMN or on the spdiNetworks list.
1651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean isOnMatchingPlmn(String plmn) {
1653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (plmn == null) return false;
1654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (plmn.equals(getOperatorNumeric())) {
1656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return true;
1657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
165922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mSpdiNetworks != null) {
166022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            for (String spdiNet : mSpdiNetworks) {
1661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (plmn.equals(spdiNet)) {
1662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    return true;
1663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return false;
1667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * States of Get SPN Finite State Machine which only used by getSpnFsm()
1671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
167222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private enum GetSpnFsmState {
1673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        IDLE,               // No initialized
1674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        INIT,               // Start FSM
1675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        READ_SPN_3GPP,      // Load EF_SPN firstly
1676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        READ_SPN_CPHS,      // Load EF_SPN_CPHS secondly
1677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        READ_SPN_SHORT_CPHS // Load EF_SPN_SHORT_CPHS last
1678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Finite State Machine to load Service Provider Name , which can be stored
1682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * in either EF_SPN (3GPP), EF_SPN_CPHS, or EF_SPN_SHORT_CPHS (CPHS4.2)
1683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
1684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * After starting, FSM will search SPN EFs in order and stop after finding
1685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * the first valid SPN
1686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
1687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * If the FSM gets restart while waiting for one of
1688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * SPN EFs results (i.e. a SIM refresh occurs after issuing
1689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * read EF_CPHS_SPN), it will re-initialize only after
1690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * receiving and discarding the unfinished SPN EF result.
1691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
1692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param start set true only for initialize loading
1693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param ar the AsyncResult from loadEFTransparent
1694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ar.exception holds exception in error
1695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ar.result is byte[] for data in success
1696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void getSpnFsm(boolean start, AsyncResult ar) {
1698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        byte[] data;
1699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (start) {
1701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Check previous state to see if there is outstanding
1702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // SPN read
170322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if(mSpnState == GetSpnFsmState.READ_SPN_3GPP ||
170422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville               mSpnState == GetSpnFsmState.READ_SPN_CPHS ||
170522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville               mSpnState == GetSpnFsmState.READ_SPN_SHORT_CPHS ||
170622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville               mSpnState == GetSpnFsmState.INIT) {
1707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // Set INIT then return so the INIT code
1708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // will run when the outstanding read done.
170922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpnState = GetSpnFsmState.INIT;
1710c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                return;
1711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } else {
171222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpnState = GetSpnFsmState.INIT;
1713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1714c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
171622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        switch(mSpnState){
1717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case INIT:
1718b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                setServiceProviderName(null);
1719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.loadEFTransparent(EF_SPN,
1721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        obtainMessage(EVENT_GET_SPN_DONE));
172222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mRecordsToLoad++;
1723c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
172422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpnState = GetSpnFsmState.READ_SPN_3GPP;
1725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case READ_SPN_3GPP:
1727c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar != null && ar.exception == null) {
1728c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    data = (byte[]) ar.result;
172922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSpnDisplayCondition = 0xff & data[0];
1730b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    setServiceProviderName(IccUtils.adnStringFieldToString(
1731b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                            data, 1, data.length - 1));
1732c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1733b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    if (DBG) log("Load EF_SPN: " + getServiceProviderName()
173422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            + " spnDisplayCondition: " + mSpnDisplayCondition);
1735b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, getServiceProviderName());
1736c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
173722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSpnState = GetSpnFsmState.IDLE;
1738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mFh.loadEFTransparent( EF_SPN_CPHS,
1740c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_GET_SPN_DONE));
174122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mRecordsToLoad++;
1742c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
174322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSpnState = GetSpnFsmState.READ_SPN_CPHS;
1744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // See TS 51.011 10.3.11.  Basically, default to
1746c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // show PLMN always, and SPN also if roaming.
174722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSpnDisplayCondition = -1;
1748c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1749c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1750c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case READ_SPN_CPHS:
1751c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar != null && ar.exception == null) {
1752c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    data = (byte[]) ar.result;
1753b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    setServiceProviderName(IccUtils.adnStringFieldToString(data, 0, data.length));
1754c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1755b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    if (DBG) log("Load EF_SPN_CPHS: " + getServiceProviderName());
1756b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, getServiceProviderName());
1757c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
175822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSpnState = GetSpnFsmState.IDLE;
1759c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1760c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mFh.loadEFTransparent(
1761c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            EF_SPN_SHORT_CPHS, obtainMessage(EVENT_GET_SPN_DONE));
176222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mRecordsToLoad++;
1763c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
176422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSpnState = GetSpnFsmState.READ_SPN_SHORT_CPHS;
1765c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1766c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1767c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case READ_SPN_SHORT_CPHS:
1768c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar != null && ar.exception == null) {
1769c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    data = (byte[]) ar.result;
1770b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    setServiceProviderName(IccUtils.adnStringFieldToString(data, 0, data.length));
1771c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1772b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    if (DBG) log("Load EF_SPN_SHORT_CPHS: " + getServiceProviderName());
1773b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, getServiceProviderName());
1774c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }else {
1775c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) log("No SPN loaded in either CHPS or 3GPP");
1776c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1777c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
177822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpnState = GetSpnFsmState.IDLE;
1779c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1780c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            default:
178122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpnState = GetSpnFsmState.IDLE;
1782c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1783c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1784c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1785c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1786c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Parse TS 51.011 EF[SPDI] record
1787c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * This record contains the list of numeric network IDs that
1788c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * are treated specially when determining SPN display
1789c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1790c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void
1791c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    parseEfSpdi(byte[] data) {
1792c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        SimTlv tlv = new SimTlv(data, 0, data.length);
1793c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1794c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        byte[] plmnEntries = null;
1795c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1796c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for ( ; tlv.isValidObject() ; tlv.nextObject()) {
1797c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Skip SPDI tag, if existant
1798c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (tlv.getTag() == TAG_SPDI) {
1799c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville              tlv = new SimTlv(tlv.getData(), 0, tlv.getData().length);
1800c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1801c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // There should only be one TAG_SPDI_PLMN_LIST
1802c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (tlv.getTag() == TAG_SPDI_PLMN_LIST) {
1803c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                plmnEntries = tlv.getData();
1804c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1805c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1806c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1807c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1808c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (plmnEntries == null) {
1809c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
1810c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1811c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
181222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mSpdiNetworks = new ArrayList<String>(plmnEntries.length / 3);
1813c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1814c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for (int i = 0 ; i + 2 < plmnEntries.length ; i += 3) {
1815c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            String plmnCode;
1816c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            plmnCode = IccUtils.bcdToString(plmnEntries, i, 3);
1817c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1818c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Valid operator codes are 5 or 6 digits
1819c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (plmnCode.length() >= 5) {
1820c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("EF_SPDI network: " + plmnCode);
182122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpdiNetworks.add(plmnCode);
1822c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1823c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1824c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1825c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1826c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1827c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * check to see if Mailbox Number is allocated and activated in CPHS SST
1828c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1829c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean isCphsMailboxEnabled() {
1830c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mCphsInfo == null)  return false;
1831c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return ((mCphsInfo[1] & CPHS_SST_MBN_MASK) == CPHS_SST_MBN_ENABLED );
1832c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1833c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1834cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1835c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void log(String s) {
183699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.d(LOG_TAG, "[SIMRecords] " + s);
1837c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1838c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1839cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1840c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void loge(String s) {
184199c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "[SIMRecords] " + s);
1842c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1843c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1844c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void logw(String s, Throwable tr) {
184599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.w(LOG_TAG, "[SIMRecords] " + s, tr);
1846c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1847c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1848c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void logv(String s) {
184999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.v(LOG_TAG, "[SIMRecords] " + s);
1850c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1851c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1852c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1853c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Return true if "Restriction of menu options for manual PLMN selection"
1854c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * bit is set or EF_CSP data is unavailable, return false otherwise.
1855c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1856cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1857c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public boolean isCspPlmnEnabled() {
1858c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return mCspPlmnEnabled;
1859c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1860c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1861c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1862c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Parse EF_CSP data and check if
1863c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * "Restriction of menu options for manual PLMN selection" is
1864c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Enabled/Disabled
1865c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
1866c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param data EF_CSP hex data.
1867c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1868c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void handleEfCspData(byte[] data) {
1869c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // As per spec CPHS4_2.WW6, CPHS B.4.7.1, EF_CSP contains CPHS defined
1870c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // 18 bytes (i.e 9 service groups info) and additional data specific to
1871c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // operator. The valueAddedServicesGroup is not part of standard
1872c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // services. This is operator specific and can be programmed any where.
1873c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Normally this is programmed as 10th service after the standard
1874c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // services.
1875c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int usedCspGroups = data.length / 2;
1876e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby        // This is the "Service Group Number" of "Value Added Services Group".
1877c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        byte valueAddedServicesGroup = (byte)0xC0;
1878c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1879c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCspPlmnEnabled = true;
1880c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for (int i = 0; i < usedCspGroups; i++) {
1881c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             if (data[2 * i] == valueAddedServicesGroup) {
1882c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 log("[CSP] found ValueAddedServicesGroup, value " + data[(2 * i) + 1]);
1883c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 if ((data[(2 * i) + 1] & 0x80) == 0x80) {
1884c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     // Bit 8 is for
1885c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     // "Restriction of menu options for manual PLMN selection".
1886c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     // Operator Selection menu should be enabled.
1887c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     mCspPlmnEnabled = true;
1888c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 } else {
1889c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     mCspPlmnEnabled = false;
1890c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     // Operator Selection menu should be disabled.
1891c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     // Operator Selection Mode should be set to Automatic.
1892c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     log("[CSP] Set Automatic Network Selection");
1893c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     mNetworkSelectionModeAutomaticRegistrants.notifyRegistrants();
1894c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 }
1895c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 return;
1896c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             }
1897c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1898c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1899c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        log("[CSP] Value Added Service Group (0xC0), not found!");
1900c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
190105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka
190205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka    @Override
190305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
190405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println("SIMRecords: " + this);
190505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" extends:");
190605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        super.dump(fd, pw, args);
190705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mVmConfig=" + mVmConfig);
190805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mSpnOverride=" + mSpnOverride);
190922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mCallForwardingEnabled=" + mCallForwardingEnabled);
191022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mSpnState=" + mSpnState);
191105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mCphsInfo=" + mCphsInfo);
191205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mCspPlmnEnabled=" + mCspPlmnEnabled);
191322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mEfMWIS[]=" + Arrays.toString(mEfMWIS));
191422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mEfCPHS_MWI[]=" + Arrays.toString(mEfCPHS_MWI));
191505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mEfCff[]=" + Arrays.toString(mEfCff));
191605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mEfCfis[]=" + Arrays.toString(mEfCfis));
191722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mSpnDisplayCondition=" + mSpnDisplayCondition);
191822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mSpdiNetworks[]=" + mSpdiNetworks);
191922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mPnnHomeName=" + mPnnHomeName);
192005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mUsimServiceTable=" + mUsimServiceTable);
1921620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt        pw.println(" mGid1=" + mGid1);
192205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.flush();
192305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka    }
1924a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
1925a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private void setSystemProperty(String key, String val) {
1926a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        // Update the system properties only in case NON-DSDS.
1927a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        // TODO: Shall have a better approach!
1928a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (!TelephonyManager.getDefault().isMultiSimEnabled()) {
1929a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            SystemProperties.set(key, val);
1930a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
1931a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
1932c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville}
1933