1c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/*
2c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Copyright (C) 2006 The Android Open Source Project
3c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *
4c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Licensed under the Apache License, Version 2.0 (the "License");
5c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * you may not use this file except in compliance with the License.
6c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * You may obtain a copy of the License at
7c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *
8c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *      http://www.apache.org/licenses/LICENSE-2.0
9c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville *
10c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Unless required by applicable law or agreed to in writing, software
11c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * distributed under the License is distributed on an "AS IS" BASIS,
12c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See the License for the specific language governing permissions and
14c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * limitations under the License.
15c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */
16c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
17d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkapackage com.android.internal.telephony.uicc;
18c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
19c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.Context;
20c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.AsyncResult;
21c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Message;
22c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.SystemProperties;
23a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.TelephonyManager;
2431ae682ff511ddde4073c3f94eff15da2f7fade6Wink Savilleimport android.telephony.PhoneNumberUtils;
25a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hambyimport android.telephony.SmsMessage;
262bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapatiimport android.text.TextUtils;
2799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog;
286e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seoimport android.content.res.Resources;
29c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
30c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.CommandsInterface;
31c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.MccTable;
32a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hambyimport com.android.internal.telephony.SmsConstants;
33b9adaa1c4a12df8c8bd44b4803d452662b53e0d8Tom Taylorimport com.android.internal.telephony.SubscriptionController;
34d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.gsm.SimTlv;
35230e46bdd850306dcc54ab6038d4d3132f5032abnfjbimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState;
36230e46bdd850306dcc54ab6038d4d3132f5032abnfjbimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType;
37c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
3805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.FileDescriptor;
3905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.PrintWriter;
40c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.ArrayList;
4105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.util.Arrays;
42c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
43c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/**
44c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide}
45c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */
46c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic class SIMRecords extends IccRecords {
47cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    protected static final String LOG_TAG = "SIMRecords";
48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
49c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final boolean CRASH_RIL = false;
50c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
51c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Instance Variables
52c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    VoiceMailConstants mVmConfig;
54c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
55c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    SpnOverride mSpnOverride;
57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
58c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Cached SIM State; cleared on channel close
59c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
6022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private boolean mCallForwardingEnabled;
61c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
62c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
63c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
64c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * States only used by getSpnFsm FSM
65c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
6622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private GetSpnFsmState mSpnState;
67c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
68c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /** CPHS service information (See CPHS 4.2 B.3.1.1)
69c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *  It will be set in onSimReady if reading GET_CPHS_INFO successfully
70c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *  mCphsInfo[0] is CPHS Phase
71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *  mCphsInfo[1] and mCphsInfo[2] is CPHS Service Table
72c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private byte[] mCphsInfo = null;
74c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    boolean mCspPlmnEnabled = true;
75c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
7622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    byte[] mEfMWIS = null;
7722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    byte[] mEfCPHS_MWI =null;
78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    byte[] mEfCff = null;
79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    byte[] mEfCfis = null;
80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
81230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    byte[] mEfLi = null;
82230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    byte[] mEfPl = null;
83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
8422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    int mSpnDisplayCondition;
85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // Numeric network codes listed in TS 51.011 EF[SPDI]
8622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    ArrayList<String> mSpdiNetworks = null;
87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
8822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    String mPnnHomeName = null;
89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    UsimServiceTable mUsimServiceTable;
91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
92f92cb4bd5519427a0db673709d94683a8baf203aWink Saville    @Override
93f92cb4bd5519427a0db673709d94683a8baf203aWink Saville    public String toString() {
94f92cb4bd5519427a0db673709d94683a8baf203aWink Saville        return "SimRecords: " + super.toString()
95f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mVmConfig" + mVmConfig
96f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mSpnOverride=" + "mSpnOverride"
9722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " callForwardingEnabled=" + mCallForwardingEnabled
9822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " spnState=" + mSpnState
99f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mCphsInfo=" + mCphsInfo
100f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mCspPlmnEnabled=" + mCspPlmnEnabled
10122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " efMWIS=" + mEfMWIS
10222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                + " efCPHS_MWI=" + mEfCPHS_MWI
103f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mEfCff=" + mEfCff
104f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " mEfCfis=" + mEfCfis
105f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                + " getOperatorNumeric=" + getOperatorNumeric();
106f92cb4bd5519427a0db673709d94683a8baf203aWink Saville    }
107f92cb4bd5519427a0db673709d94683a8baf203aWink Saville
108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Constants
109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // From TS 51.011 EF[SPDI] section
111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int TAG_SPDI = 0xA3;
112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int TAG_SPDI_PLMN_LIST = 0x80;
113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // Full Name IEI from TS 24.008
115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int TAG_FULL_NETWORK_NAME = 0x43;
116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // Short Name IEI from TS 24.008
118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int TAG_SHORT_NETWORK_NAME = 0x45;
119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // active CFF from CPHS 4.2 B.4.5
121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int CFF_UNCONDITIONAL_ACTIVE = 0x0a;
122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int CFF_UNCONDITIONAL_DEACTIVE = 0x05;
123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int CFF_LINE1_MASK = 0x0f;
124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    static final int CFF_LINE1_RESET = 0xf0;
125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // CPHS Service Table (See CPHS 4.2 B.3.1)
127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int CPHS_SST_MBN_MASK = 0x30;
128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int CPHS_SST_MBN_ENABLED = 0x30;
129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
13031ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    // EF_CFIS related constants
13131ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    // Spec reference TS 51.011 section 10.3.46.
13231ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    private static final int CFIS_BCD_NUMBER_LENGTH_OFFSET = 2;
13331ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    private static final int CFIS_TON_NPI_OFFSET = 3;
13431ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    private static final int CFIS_ADN_CAPABILITY_ID_OFFSET = 14;
13531ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    private static final int CFIS_ADN_EXTENSION_ID_OFFSET = 15;
13631ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville
137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Event Constants
138e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_GET_IMSI_DONE = 3;
139e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    private static final int EVENT_GET_ICCID_DONE = 4;
140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_MBI_DONE = 5;
141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_MBDN_DONE = 6;
142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_MWIS_DONE = 7;
143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE = 8;
144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected static final int EVENT_GET_AD_DONE = 9; // Admin data on SIM
145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected static final int EVENT_GET_MSISDN_DONE = 10;
146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_CPHS_MAILBOX_DONE = 11;
147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_SPN_DONE = 12;
148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_SPDI_DONE = 13;
149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_UPDATE_DONE = 14;
150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_PNN_DONE = 15;
151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected static final int EVENT_GET_SST_DONE = 17;
152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_ALL_SMS_DONE = 18;
153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_MARK_SMS_READ_DONE = 19;
154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_SET_MBDN_DONE = 20;
155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_SMS_ON_SIM = 21;
156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_SMS_DONE = 22;
157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_CFF_DONE = 24;
158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_SET_CPHS_MAILBOX_DONE = 25;
159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_INFO_CPHS_DONE = 26;
160cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    // private static final int EVENT_SET_MSISDN_DONE = 30; Defined in IccRecords as 30
161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_SIM_REFRESH = 31;
162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_CFIS_DONE = 32;
163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final int EVENT_GET_CSP_CPHS_DONE = 33;
1642f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim    private static final int EVENT_GET_GID1_DONE = 34;
165230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private static final int EVENT_APP_LOCKED = 35;
166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // Lookup table for carriers known to produce SIMs which incorrectly indicate MNC length.
168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private static final String[] MCCMNC_CODES_HAVING_3DIGITS_MNC = {
1700530f592d89c1eceea7ee5bccb2359061a04f968duho.ro        "302370", "302720", "310260",
171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405025", "405026", "405027", "405028", "405029", "405030", "405031", "405032",
172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405033", "405034", "405035", "405036", "405037", "405038", "405039", "405040",
173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405041", "405042", "405043", "405044", "405045", "405046", "405047", "405750",
174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405751", "405752", "405753", "405754", "405755", "405756", "405799", "405800",
175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405801", "405802", "405803", "405804", "405805", "405806", "405807", "405808",
176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405809", "405810", "405811", "405812", "405813", "405814", "405815", "405816",
177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405817", "405818", "405819", "405820", "405821", "405822", "405823", "405824",
178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405825", "405826", "405827", "405828", "405829", "405830", "405831", "405832",
179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405833", "405834", "405835", "405836", "405837", "405838", "405839", "405840",
180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405841", "405842", "405843", "405844", "405845", "405846", "405847", "405848",
181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405849", "405850", "405851", "405852", "405853", "405875", "405876", "405877",
182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405878", "405879", "405880", "405881", "405882", "405883", "405884", "405885",
183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405886", "405908", "405909", "405910", "405911", "405912", "405913", "405914",
184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405915", "405916", "405917", "405918", "405919", "405920", "405921", "405922",
185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        "405923", "405924", "405925", "405926", "405927", "405928", "405929", "405930",
1860530f592d89c1eceea7ee5bccb2359061a04f968duho.ro        "405931", "405932", "502142", "502143", "502145", "502146", "502147", "502148"
187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    };
188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Constructor
190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
191e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    public SIMRecords(UiccCardApplication app, Context c, CommandsInterface ci) {
192e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        super(app, c, ci);
193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
19422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mAdnCache = new AdnRecordCache(mFh);
195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mVmConfig = new VoiceMailConstants();
197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mSpnOverride = new SpnOverride();
198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
19922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsRequested = false;  // No load request is made till SIM ready
200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // recordsToLoad is set to 0 because no requests are made yet
20222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad = 0;
203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCi.setOnSmsOnSim(this, EVENT_SMS_ON_SIM, null);
205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCi.registerForIccRefresh(this, EVENT_SIM_REFRESH, null);
206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Start off by setting empty state
208e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        resetRecords();
209e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mParentApp.registerForReady(this, EVENT_APP_READY, null);
210230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        mParentApp.registerForLocked(this, EVENT_APP_LOCKED, null);
211f92cb4bd5519427a0db673709d94683a8baf203aWink Saville        if (DBG) log("SIMRecords X ctor this=" + this);
212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void dispose() {
216f92cb4bd5519427a0db673709d94683a8baf203aWink Saville        if (DBG) log("Disposing SIMRecords this=" + this);
217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        //Unregister for all events
218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCi.unregisterForIccRefresh(this);
219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCi.unSetOnSmsOnSim(this);
220e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mParentApp.unregisterForReady(this);
221230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        mParentApp.unregisterForLocked(this);
222e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        resetRecords();
223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        super.dispose();
224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
226cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void finalize() {
228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if(DBG) log("finalized");
229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
231e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    protected void resetRecords() {
232e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mImsi = null;
23322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mMsisdn = null;
23422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mVoiceMailNum = null;
23522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mMncLength = UNINITIALIZED;
236a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        log("setting0 mMncLength" + mMncLength);
237b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville        mIccId = null;
238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // -1 means no EF_SPN found; treat accordingly.
23922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mSpnDisplayCondition = -1;
24022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mEfMWIS = null;
24122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mEfCPHS_MWI = null;
24222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mSpdiNetworks = null;
24322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPnnHomeName = null;
244620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt        mGid1 = null;
245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
24622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mAdnCache.reset();
247c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        log("SIMRecords: onRadioOffOrNotAvailable set 'gsm.sim.operator.numeric' to operator=null");
249a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        log("update icc_operator_numeric=" + null);
250e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu        mTelephonyManager.setSimOperatorNumericForPhone(mParentApp.getPhoneId(), "");
251e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu        mTelephonyManager.setSimOperatorNameForPhone(mParentApp.getPhoneId(), "");
252e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu        mTelephonyManager.setSimCountryIsoForPhone(mParentApp.getPhoneId(), "");
253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // recordsRequested is set to false indicating that the SIM
255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // read requests made so far are not valid. This is set to
256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // true only when fresh set of read requests are made.
25722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsRequested = false;
258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    //***** Public Methods
262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * {@inheritDoc}
265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getIMSI() {
268e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        return mImsi;
269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
271cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getMsisdnNumber() {
27322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mMsisdn;
274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
2772f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim    public String getGid1() {
278620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt        return mGid1;
2792f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim    }
2802f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim
2812f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim    @Override
282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public UsimServiceTable getUsimServiceTable() {
283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return mUsimServiceTable;
284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Set subscriber number to SIM record
288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * The subscriber number is stored in EF_MSISDN (TS 51.011)
290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * When the operation is complete, onComplete will be sent to its handler
292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param alphaTag alpha-tagging of the dailing nubmer (up to 10 characters)
294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param number dailing nubmer (up to 20 digits)
295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        if the number starts with '+', then set to international TOA
296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param onComplete
297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        onComplete.obj will be an AsyncResult
298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ((AsyncResult)onComplete.obj).exception == null on success
299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ((AsyncResult)onComplete.obj).exception != null on fail
300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
301cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void setMsisdnNumber(String alphaTag, String number,
303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            Message onComplete) {
304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
3056bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        // If the SIM card is locked by PIN, we will set EF_MSISDN fail.
3066bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        // In that case, msisdn and msisdnTag should not be update.
3076bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        mNewMsisdn = number;
3086bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        mNewMsisdnTag = alphaTag;
309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
3106bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        if(DBG) log("Set MSISDN: " + mNewMsisdnTag + " " + /*mNewMsisdn*/ "xxxxxxx");
311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
3136bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        AdnRecord adn = new AdnRecord(mNewMsisdnTag, mNewMsisdn);
314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        new AdnRecordLoader(mFh).updateEF(adn, EF_MSISDN, EF_EXT1, 1, null,
316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                obtainMessage(EVENT_SET_MSISDN_DONE, onComplete));
317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
319cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getMsisdnAlphaTag() {
32122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mMsisdnTag;
322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
324cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getVoiceMailNumber() {
32622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mVoiceMailNum;
327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Set voice mail number to SIM record
331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * The voice mail number can be stored either in EF_MBDN (TS 51.011) or
333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * EF_MAILBOX_CPHS (CPHS 4.2)
334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * If EF_MBDN is available, store the voice mail number to EF_MBDN
336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * If EF_MAILBOX_CPHS is enabled, store the voice mail number to EF_CHPS
338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * So the voice mail number will be stored in both EFs if both are available
340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Return error only if both EF_MBDN and EF_MAILBOX_CPHS fail.
342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * When the operation is complete, onComplete will be sent to its handler
344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param alphaTag alpha-tagging of the dailing nubmer (upto 10 characters)
346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param voiceNumber dailing nubmer (upto 20 digits)
347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        if the number is start with '+', then set to international TOA
348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param onComplete
349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        onComplete.obj will be an AsyncResult
350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ((AsyncResult)onComplete.obj).exception == null on success
351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ((AsyncResult)onComplete.obj).exception != null on fail
352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
353cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void setVoiceMailNumber(String alphaTag, String voiceNumber,
355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            Message onComplete) {
35622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mIsVoiceMailFixed) {
357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            AsyncResult.forMessage((onComplete)).exception =
358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new IccVmFixedException("Voicemail number is fixed by operator");
359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            onComplete.sendToTarget();
360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
36322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mNewVoiceMailNum = voiceNumber;
36422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mNewVoiceMailTag = alphaTag;
365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
36622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        AdnRecord adn = new AdnRecord(mNewVoiceMailTag, mNewVoiceMailNum);
367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
36822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mMailboxIndex != 0 && mMailboxIndex != 0xff) {
369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            new AdnRecordLoader(mFh).updateEF(adn, EF_MBDN, EF_EXT6,
37122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mMailboxIndex, null,
372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    obtainMessage(EVENT_SET_MBDN_DONE, onComplete));
373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else if (isCphsMailboxEnabled()) {
375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            new AdnRecordLoader(mFh).updateEF(adn, EF_MAILBOX_CPHS,
377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    EF_EXT1, 1, null,
378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    obtainMessage(EVENT_SET_CPHS_MAILBOX_DONE, onComplete));
379c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            AsyncResult.forMessage((onComplete)).exception =
382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new IccVmNotSupportedException("Update SIM voice mailbox error");
383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            onComplete.sendToTarget();
384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
387cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getVoiceMailAlphaTag()
389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    {
39022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mVoiceMailTag;
391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Sets the SIM voice message waiting indicator records
395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param line GSM Subscriber Profile Number, one-based. Only '1' is supported
396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param countWaiting The number of messages waiting, if known. Use
397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *                     -1 to indicate that an unknown number of
398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *                      messages are waiting
399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
400cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void
402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    setVoiceMessageWaiting(int line, int countWaiting) {
403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (line != 1) {
404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // only profile 1 is supported
405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        try {
40922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (mEfMWIS != null) {
410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // TS 51.011 10.3.45
411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // lsb of byte 0 is 'voicemail' status
41322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mEfMWIS[0] = (byte)((mEfMWIS[0] & 0xfe)
41426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                                    | (countWaiting == 0 ? 0 : 1));
415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // byte 1 is the number of voice messages waiting
417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (countWaiting < 0) {
418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // The spec does not define what this should be
419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // if we don't know the count
42022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mEfMWIS[1] = 0;
421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
42222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mEfMWIS[1] = (byte) countWaiting;
423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.updateEFLinearFixed(
42622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    EF_MWIS, 1, mEfMWIS, null,
42726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                    obtainMessage (EVENT_UPDATE_DONE, EF_MWIS, 0));
428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
43022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (mEfCPHS_MWI != null) {
431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Refer CPHS4_2.WW6 B4.2.3
43222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mEfCPHS_MWI[0] = (byte)((mEfCPHS_MWI[0] & 0xf0)
43326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                            | (countWaiting == 0 ? 0x5 : 0xa));
434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.updateEFTransparent(
43522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    EF_VOICE_MAIL_INDICATOR_CPHS, mEfCPHS_MWI,
436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    obtainMessage (EVENT_UPDATE_DONE, EF_VOICE_MAIL_INDICATOR_CPHS));
437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
438c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } catch (ArrayIndexOutOfBoundsException ex) {
439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            logw("Error saving voice mail state to SIM. Probably malformed SIM record", ex);
440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
443a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville    // Validate data is !null and the MSP (Multiple Subscriber Profile)
444a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville    // byte is between 1 and 4. See ETSI TS 131 102 v11.3.0 section 4.2.64.
445a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville    private boolean validEfCfis(byte[] data) {
446a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville        return ((data != null) && (data[0] >= 1) && (data[0] <= 4));
447a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville    }
448a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville
44926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa    public int getVoiceMessageCount() {
45026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        boolean voiceMailWaiting = false;
451481a66b57a62b669a4ff3b173f3e96aabec65592Amit Mahajan        int countVoiceMessages = 0;
45226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        if (mEfMWIS != null) {
45326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            // Use this data if the EF[MWIS] exists and
45426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            // has been loaded
45526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            // Refer TS 51.011 Section 10.3.45 for the content description
45626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            voiceMailWaiting = ((mEfMWIS[0] & 0x01) != 0);
45726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            countVoiceMessages = mEfMWIS[1] & 0xff;
45826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa
45926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            if (voiceMailWaiting && countVoiceMessages == 0) {
46026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                // Unknown count = -1
46126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                countVoiceMessages = -1;
46226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            }
46326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            if(DBG) log(" VoiceMessageCount from SIM MWIS = " + countVoiceMessages);
46426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        } else if (mEfCPHS_MWI != null) {
46526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            // use voice mail count from CPHS
46626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            int indicator = (int) (mEfCPHS_MWI[0] & 0xf);
46726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa
46826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            // Refer CPHS4_2.WW6 B4.2.3
46926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            if (indicator == 0xA) {
47026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                // Unknown count = -1
47126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                countVoiceMessages = -1;
47226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            } else if (indicator == 0x5) {
47326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                countVoiceMessages = 0;
47426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            }
47526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            if(DBG) log(" VoiceMessageCount from SIM CPHS = " + countVoiceMessages);
47626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        }
47726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        return countVoiceMessages;
47826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa    }
47926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa
480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * {@inheritDoc}
482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public boolean getVoiceCallForwardingFlag() {
48522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mCallForwardingEnabled;
486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * {@inheritDoc}
490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
49231ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville    public void setVoiceCallForwardingFlag(int line, boolean enable, String dialNumber) {
493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (line != 1) return; // only line 1 is supported
495c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
49622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCallForwardingEnabled = enable;
497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
498c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mRecordsEventsRegistrants.notifyResult(EVENT_CFI);
499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        try {
501a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville            if (validEfCfis(mEfCfis)) {
502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // lsb is of byte 1 is voice status
503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (enable) {
504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mEfCfis[1] |= 1;
505c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
506c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mEfCfis[1] &= 0xfe;
507c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
508c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
509a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                log("setVoiceCallForwardingFlag: enable=" + enable
510a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                        + " mEfCfis=" + IccUtils.bytesToHexString(mEfCfis));
511a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville
51231ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                // Update dialNumber if not empty and CFU is enabled.
51331ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                // Spec reference for EF_CFIS contents, TS 51.011 section 10.3.46.
51431ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                if (enable && !TextUtils.isEmpty(dialNumber)) {
51531ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    log("EF_CFIS: updating cf number, " + dialNumber);
51631ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    byte[] bcdNumber = PhoneNumberUtils.numberToCalledPartyBCD(dialNumber);
51731ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville
51831ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    System.arraycopy(bcdNumber, 0, mEfCfis, CFIS_TON_NPI_OFFSET, bcdNumber.length);
51931ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville
52031ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    mEfCfis[CFIS_BCD_NUMBER_LENGTH_OFFSET] = (byte) (bcdNumber.length);
52131ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    mEfCfis[CFIS_ADN_CAPABILITY_ID_OFFSET] = (byte) 0xFF;
52231ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                    mEfCfis[CFIS_ADN_EXTENSION_ID_OFFSET] = (byte) 0xFF;
52331ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville                }
524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.updateEFLinearFixed(
526c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        EF_CFIS, 1, mEfCfis, null,
527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        obtainMessage (EVENT_UPDATE_DONE, EF_CFIS));
528a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville            } else {
529a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                log("setVoiceCallForwardingFlag: ignoring enable=" + enable
530a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                        + " invalid mEfCfis=" + IccUtils.bytesToHexString(mEfCfis));
531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (mEfCff != null) {
534c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (enable) {
535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mEfCff[0] = (byte) ((mEfCff[0] & CFF_LINE1_RESET)
536c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            | CFF_UNCONDITIONAL_ACTIVE);
537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mEfCff[0] = (byte) ((mEfCff[0] & CFF_LINE1_RESET)
539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            | CFF_UNCONDITIONAL_DEACTIVE);
540c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.updateEFTransparent(
543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        EF_CFF_CPHS, mEfCff,
544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        obtainMessage (EVENT_UPDATE_DONE, EF_CFF_CPHS));
545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } catch (ArrayIndexOutOfBoundsException ex) {
547e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby            logw("Error saving call forwarding flag to SIM. "
548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            + "Probably malformed SIM record", ex);
549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Called by STK Service when REFRESH is received.
555c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param fileChanged indicates whether any files changed
556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param fileList if non-null, a list of EF files that changed
557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
558cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void onRefresh(boolean fileChanged, int[] fileList) {
560c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (fileChanged) {
561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // A future optimization would be to inspect fileList and
562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // only reload those files that we care about.  For now,
563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // just re-fetch all SIM records that we cache.
564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            fetchSimRecords();
565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * {@inheritDoc}
570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public String getOperatorNumeric() {
573e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mImsi == null) {
574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("getOperatorNumeric: IMSI == null");
575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return null;
576c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
57722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mMncLength == UNINITIALIZED || mMncLength == UNKNOWN) {
578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            log("getSIMOperatorNumeric: bad mncLength");
579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return null;
580c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Length = length of MCC + length of MNC
583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // length of mcc = 3 (TS 23.003 Section 2.2)
58422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mImsi.substring(0, 3 + mMncLength);
585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    // ***** Overridden from Handler
588cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void handleMessage(Message msg) {
590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        AsyncResult ar;
591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        AdnRecord adn;
592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        byte data[];
594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
595c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        boolean isRecordLoadResponse = false;
596c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
597bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka        if (mDestroyed.get()) {
598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            loge("Received message " + msg + "[" + msg.what + "] " +
599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    " while being destroyed. Ignoring.");
600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
601c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        try { switch (msg.what) {
604e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            case EVENT_APP_READY:
605e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                onReady();
606e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                break;
607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
608230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            case EVENT_APP_LOCKED:
609230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                onLocked();
610230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                break;
611230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            /* IO events */
613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_IMSI_DONE:
614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("Exception querying IMSI, Exception:" + ar.exception);
620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
623e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mImsi = (String) ar.result;
624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // IMSI (MCC+MNC+MSIN) is at least 6 digits, but not more
626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // than 15 (and usually 15).
627e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (mImsi != null && (mImsi.length() < 6 || mImsi.length() > 15)) {
628e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    loge("invalid IMSI " + mImsi);
629e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mImsi = null;
630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
632a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                log("IMSI: mMncLength=" + mMncLength);
633a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                log("IMSI: " + mImsi.substring(0, 6) + "xxxxxxx");
634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
63522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (((mMncLength == UNKNOWN) || (mMncLength == 2)) &&
636e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        ((mImsi != null) && (mImsi.length() >= 6))) {
637e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    String mccmncCode = mImsi.substring(0, 6);
638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    for (String mccmnc : MCCMNC_CODES_HAVING_3DIGITS_MNC) {
639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        if (mccmnc.equals(mccmncCode)) {
64022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            mMncLength = 3;
641a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                            log("IMSI: setting1 mMncLength=" + mMncLength);
642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            break;
643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        }
644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
64722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mMncLength == UNKNOWN) {
648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // the SIM has told us all it knows, but it didn't know the mnc length.
649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // guess using the mcc
650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    try {
651e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        int mcc = Integer.parseInt(mImsi.substring(0,3));
65222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mMncLength = MccTable.smallestDigitsMccForMnc(mcc);
653a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        log("setting2 mMncLength=" + mMncLength);
654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    } catch (NumberFormatException e) {
65522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mMncLength = UNKNOWN;
656a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        loge("Corrupt IMSI! setting3 mMncLength=" + mMncLength);
657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
66022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mMncLength != UNKNOWN && mMncLength != UNINITIALIZED) {
661a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    log("update mccmnc=" + mImsi.substring(0, 3 + mMncLength));
662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // finally have both the imsi and the mncLength and can parse the imsi properly
663b0b637dbf2a67c0e7eee917c0809f1cc54983986Robert Greenwalt                    MccTable.updateMccMncConfiguration(mContext,
664b0b637dbf2a67c0e7eee917c0809f1cc54983986Robert Greenwalt                            mImsi.substring(0, 3 + mMncLength), false);
665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
666e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mImsiReadyRegistrants.notifyRegistrants();
667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_MBI_DONE:
670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                boolean isValidMbdn;
671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[]) ar.result;
675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isValidMbdn = false;
677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception == null) {
678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Refer TS 51.011 Section 10.3.44 for content details
679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("EF_MBI: " + IccUtils.bytesToHexString(data));
680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Voice mail record number stored first
68222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mMailboxIndex = data[0] & 0xff;
683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // check if dailing numbe id valid
68522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (mMailboxIndex != 0 && mMailboxIndex != 0xff) {
686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        log("Got valid mailbox number for MBDN");
687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        isValidMbdn = true;
688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // one more record to load
69222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mRecordsToLoad += 1;
693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (isValidMbdn) {
695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Note: MBDN was not included in NUM_OF_SIM_RECORDS_LOADED
696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new AdnRecordLoader(mFh).loadFromEF(EF_MBDN, EF_EXT6,
69722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            mMailboxIndex, obtainMessage(EVENT_GET_MBDN_DONE));
698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // If this EF not present, try mailbox as in CPHS standard
700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // CPHS (CPHS4_2.WW6) is a european standard.
701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new AdnRecordLoader(mFh).loadFromEF(EF_MAILBOX_CPHS,
702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            EF_EXT1, 1,
703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE));
704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_CPHS_MAILBOX_DONE:
708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_MBDN_DONE:
709c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                //Resetting the voice mail number and voice mail tag to null
710c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                //as these should be updated from the data read from EF_MBDN.
711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                //If they are not reset, incase of invalid data/exception these
712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                //variables are retaining their previous values and are
713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                //causing invalid voice mailbox info display to user.
71422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mVoiceMailNum = null;
71522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mVoiceMailTag = null;
716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
718c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
722c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("Invalid or missing EF"
723c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        + ((msg.what == EVENT_GET_CPHS_MAILBOX_DONE) ? "[MAILBOX]" : "[MBDN]"));
724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Bug #645770 fall back to CPHS
726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // FIXME should use SST to decide
727c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
728c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (msg.what == EVENT_GET_MBDN_DONE) {
729c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        //load CPHS on fail...
730c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        // FIXME right now, only load line1's CPHS voice mail entry
731c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
73222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mRecordsToLoad += 1;
733c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        new AdnRecordLoader(mFh).loadFromEF(
734c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                EF_MAILBOX_CPHS, EF_EXT1, 1,
735c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE));
736c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
740c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                adn = (AdnRecord)ar.result;
741c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
742c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("VM: " + adn +
743c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        ((msg.what == EVENT_GET_CPHS_MAILBOX_DONE) ? " EF[MAILBOX]" : " EF[MBDN]"));
744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (adn.isEmpty() && msg.what == EVENT_GET_MBDN_DONE) {
746c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // Bug #645770 fall back to CPHS
747c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // FIXME should use SST to decide
748c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // FIXME right now, only load line1's CPHS voice mail entry
74922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mRecordsToLoad += 1;
750c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new AdnRecordLoader(mFh).loadFromEF(
751c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            EF_MAILBOX_CPHS, EF_EXT1, 1,
752c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE));
753c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
754c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
755c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
756c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
75722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mVoiceMailNum = adn.getNumber();
75822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mVoiceMailTag = adn.getAlphaTag();
759c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
760c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
761c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_MSISDN_DONE:
762c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
763c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
764c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
765c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
766c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
767c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("Invalid or missing EF[MSISDN]");
768c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
769c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
770c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
771c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                adn = (AdnRecord)ar.result;
772c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
77322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mMsisdn = adn.getNumber();
77422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mMsisdnTag = adn.getAlphaTag();
775c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
77622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                log("MSISDN: " + /*mMsisdn*/ "xxxxxxx");
777c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
778c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
779c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_SET_MSISDN_DONE:
780c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
781c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
782c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
7836bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville                if (ar.exception == null) {
7846bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville                    mMsisdn = mNewMsisdn;
7856bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville                    mMsisdnTag = mNewMsisdnTag;
7866bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville                    log("Success to update EF[MSISDN]");
7876bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville                }
7886bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville
789c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.userObj != null) {
790c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    AsyncResult.forMessage(((Message) ar.userObj)).exception
791c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            = ar.exception;
792c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    ((Message) ar.userObj).sendToTarget();
793c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
794c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
795c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
796c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_MWIS_DONE:
797c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
798c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
799c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
800c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
801c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
80226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                if(DBG) log("EF_MWIS : " + IccUtils.bytesToHexString(data));
80326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa
804c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
80526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                    if(DBG) log("EVENT_GET_MWIS_DONE exception = "
80626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                            + ar.exception);
807c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
808c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
809c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
810c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if ((data[0] & 0xff) == 0xff) {
81126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                    if(DBG) log("SIMRecords: Uninitialized record MWIS");
812c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
813c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
814c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
81526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                mEfMWIS = data;
81626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                break;
817c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
818c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE:
819c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
820c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
821c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
822c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
823c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
82426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                if(DBG) log("EF_CPHS_MWI: " + IccUtils.bytesToHexString(data));
82526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa
826c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
82726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                    if(DBG) log("EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE exception = "
82826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                            + ar.exception);
829c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
830c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
831c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
83222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mEfCPHS_MWI = data;
83326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                break;
834c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
835c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_ICCID_DONE:
836c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
837c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
838c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
839c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
840c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
841c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
842c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
843c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
844c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
845b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville                mIccId = IccUtils.bcdToString(data, 0, data.length);
846c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
847b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville                log("iccid: " + mIccId);
848c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
849c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
850c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
851c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
852c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_AD_DONE:
853c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                try {
854c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    isRecordLoadResponse = true;
855c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
856c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    ar = (AsyncResult)msg.obj;
857c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    data = (byte[])ar.result;
858c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
859c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (ar.exception != null) {
860c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        break;
861c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
862c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
863c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("EF_AD: " + IccUtils.bytesToHexString(data));
864c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
865c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (data.length < 3) {
866c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        log("Corrupt AD data on SIM");
867c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        break;
868c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
869c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
870c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (data.length == 3) {
871c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        log("MNC length not present in EF_AD");
872c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        break;
873c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
874c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
87522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mMncLength = data[3] & 0xf;
876a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    log("setting4 mMncLength=" + mMncLength);
877c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
87822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (mMncLength == 0xf) {
87922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mMncLength = UNKNOWN;
880a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        log("setting5 mMncLength=" + mMncLength);
881c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
882c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } finally {
88322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (((mMncLength == UNINITIALIZED) || (mMncLength == UNKNOWN) ||
88422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            (mMncLength == 2)) && ((mImsi != null) && (mImsi.length() >= 6))) {
885e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        String mccmncCode = mImsi.substring(0, 6);
886a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        log("mccmncCode=" + mccmncCode);
887c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        for (String mccmnc : MCCMNC_CODES_HAVING_3DIGITS_MNC) {
888c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            if (mccmnc.equals(mccmncCode)) {
88922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                                mMncLength = 3;
890a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                                log("setting6 mMncLength=" + mMncLength);
891c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                break;
892c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            }
893c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        }
894c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
895c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
89622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (mMncLength == UNKNOWN || mMncLength == UNINITIALIZED) {
897e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        if (mImsi != null) {
898c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            try {
899e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                                int mcc = Integer.parseInt(mImsi.substring(0,3));
900c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
90122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                                mMncLength = MccTable.smallestDigitsMccForMnc(mcc);
902a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                                log("setting7 mMncLength=" + mMncLength);
903c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            } catch (NumberFormatException e) {
90422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                                mMncLength = UNKNOWN;
905a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                                loge("Corrupt IMSI! setting8 mMncLength=" + mMncLength);
906c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            }
907c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        } else {
908c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            // Indicate we got this info, but it didn't contain the length.
90922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            mMncLength = UNKNOWN;
910a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                            log("MNC length not present in EF_AD setting9 mMncLength=" + mMncLength);
911c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        }
912c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
91322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (mImsi != null && mMncLength != UNKNOWN) {
914c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        // finally have both imsi and the length of the mnc and can parse
915c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        // the imsi properly
916a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        log("update mccmnc=" + mImsi.substring(0, 3 + mMncLength));
917c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        MccTable.updateMccMncConfiguration(mContext,
918b0b637dbf2a67c0e7eee917c0809f1cc54983986Robert Greenwalt                                mImsi.substring(0, 3 + mMncLength), false);
919c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
920c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
921c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
922c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
923c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_SPN_DONE:
924c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
925c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult) msg.obj;
926c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                getSpnFsm(false, ar);
927c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
928c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
929c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_CFF_DONE:
930c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
931c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
932c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult) msg.obj;
933c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[]) ar.result;
934c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
935c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
936c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
937c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
938c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
939c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("EF_CFF_CPHS: " + IccUtils.bytesToHexString(data));
940c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mEfCff = data;
941c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
942e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby                // if EF_CFIS is valid, prefer it to EF_CFF_CPHS
943e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby                if (!validEfCfis(mEfCfis)) {
94422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mCallForwardingEnabled =
945c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        ((data[0] & CFF_LINE1_MASK) == CFF_UNCONDITIONAL_ACTIVE);
946c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
947c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mRecordsEventsRegistrants.notifyResult(EVENT_CFI);
948a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                } else {
949e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby                    log("EVENT_GET_CFF_DONE: EF_CFIS is valid, ignoring EF_CFF_CPHS");
950c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
951c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
952c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
953c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_SPDI_DONE:
954c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
955c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
956c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
957c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
958c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
959c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
960c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
961c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
962c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
963c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                parseEfSpdi(data);
964c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
965c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
966c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_UPDATE_DONE:
967c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
968c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
969c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    logw("update failed. ", ar.exception);
970c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
971c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
972c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
973c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_PNN_DONE:
974c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
975c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
976c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
977c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
978c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
979c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
980c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
981c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
982c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
983c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                SimTlv tlv = new SimTlv(data, 0, data.length);
984c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
985c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                for ( ; tlv.isValidObject() ; tlv.nextObject()) {
986c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (tlv.getTag() == TAG_FULL_NETWORK_NAME) {
98722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mPnnHomeName
988c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            = IccUtils.networkNameToString(
989c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                tlv.getData(), 0, tlv.getData().length);
990c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        break;
991c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
992c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
993c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
994c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
995c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_ALL_SMS_DONE:
996c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
997c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
998c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
999c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null)
1000c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
1001c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1002cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                handleSmses((ArrayList<byte []>) ar.result);
1003c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1004c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1005c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_MARK_SMS_READ_DONE:
100699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.i("ENF", "marked read: sms " + msg.arg1);
1007c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1008c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1009c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1010c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_SMS_ON_SIM:
1011c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
1012c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1013c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1014c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1015c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                int[] index = (int[])ar.result;
1016c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1017c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null || index.length != 1) {
1018c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("Error on SMS_ON_SIM with exp "
1019c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            + ar.exception + " length " + index.length);
1020c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1021c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    log("READ EF_SMS RECORD index=" + index[0]);
1022c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mFh.loadEFLinearFixed(EF_SMS,index[0],
1023c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_GET_SMS_DONE));
1024c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1025c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1026c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1027c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_SMS_DONE:
1028c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
1029c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1030c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception == null) {
1031c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    handleSms((byte[])ar.result);
1032c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1033c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("Error on GET_SMS with exp " + ar.exception);
1034c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1035c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1036c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_SST_DONE:
1037c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
1038c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1039c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1040c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
1041c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1042c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
1043c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
1044c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1045c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1046c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mUsimServiceTable = new UsimServiceTable(data);
1047c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("SST: " + mUsimServiceTable);
1048c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1049c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1050c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_INFO_CPHS_DONE:
1051c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
1052c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1053c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1054c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1055c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
1056c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
1057c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1058c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1059c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mCphsInfo = (byte[])ar.result;
1060c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1061c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("iCPHS: " + IccUtils.bytesToHexString(mCphsInfo));
1062c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            break;
1063c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1064c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_SET_MBDN_DONE:
1065c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
1066c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1067c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
10686e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                if (DBG) log("EVENT_SET_MBDN_DONE ex:" + ar.exception);
1069c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception == null) {
107022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mVoiceMailNum = mNewVoiceMailNum;
107122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mVoiceMailTag = mNewVoiceMailTag;
1072c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1073c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1074c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (isCphsMailboxEnabled()) {
107522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    adn = new AdnRecord(mVoiceMailTag, mVoiceMailNum);
1076c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    Message onCphsCompleted = (Message) ar.userObj;
1077c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1078c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    /* write to cphs mailbox whenever it is available but
1079c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    * we only need notify caller once if both updating are
1080c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    * successful.
1081c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    *
1082c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    * so if set_mbdn successful, notify caller here and set
1083c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    * onCphsCompleted to null
1084c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    */
1085c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (ar.exception == null && ar.userObj != null) {
1086c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        AsyncResult.forMessage(((Message) ar.userObj)).exception
1087c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                = null;
1088c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        ((Message) ar.userObj).sendToTarget();
1089c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1090c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        if (DBG) log("Callback with MBDN successful.");
1091c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1092c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        onCphsCompleted = null;
1093c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
1094c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1095c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    new AdnRecordLoader(mFh).
1096c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            updateEF(adn, EF_MAILBOX_CPHS, EF_EXT1, 1, null,
1097c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_SET_CPHS_MAILBOX_DONE,
1098c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                    onCphsCompleted));
1099c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (ar.userObj != null) {
11016e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                        Resources resource = Resources.getSystem();
11026e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                        if (ar.exception != null && resource.getBoolean(com.android.internal.
11036e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                                    R.bool.editable_voicemailnumber)) {
11046e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                            // GSMPhone will store vm number on device
11056e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                            // when IccVmNotSupportedException occurred
11066e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                            AsyncResult.forMessage(((Message) ar.userObj)).exception
11076e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                                = new IccVmNotSupportedException(
11086e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                                        "Update SIM voice mailbox error");
11096e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                        } else {
11106e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                            AsyncResult.forMessage(((Message) ar.userObj)).exception
1111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                                = ar.exception;
11126e8a220a642aa479d2f430ff810f4140e80cc2e4giseok.seo                        }
1113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        ((Message) ar.userObj).sendToTarget();
1114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    }
1115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_SET_CPHS_MAILBOX_DONE:
1118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
1119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if(ar.exception == null) {
112122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mVoiceMailNum = mNewVoiceMailNum;
112222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mVoiceMailTag = mNewVoiceMailTag;
1123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) log("Set CPHS MailBox with exception: "
1125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            + ar.exception);
1126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.userObj != null) {
1128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) log("Callback with CPHS MB successful.");
1129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    AsyncResult.forMessage(((Message) ar.userObj)).exception
1130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            = ar.exception;
1131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    ((Message) ar.userObj).sendToTarget();
1132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_SIM_REFRESH:
1135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = false;
1136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("Sim REFRESH with exception: " + ar.exception);
1138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception == null) {
1139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    handleSimRefresh((IccRefreshResponse)ar.result);
1140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_CFIS_DONE:
1143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
1144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
1147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
1149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
1150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("EF_CFIS: " + IccUtils.bytesToHexString(data));
1153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1154a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                if (validEfCfis(data)) {
1155a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                    mEfCfis = data;
1156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1157a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                    // Refer TS 51.011 Section 10.3.46 for the content description
115822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mCallForwardingEnabled = ((data[1] & 0x01) != 0);
1159e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby                    log("EF_CFIS: callForwardingEnabled=" + mCallForwardingEnabled);
1160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1161a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                    mRecordsEventsRegistrants.notifyResult(EVENT_CFI);
1162a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                } else {
1163a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                    log("EF_CFIS: invalid data=" + IccUtils.bytesToHexString(data));
1164a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville                }
1165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EVENT_GET_CSP_CPHS_DONE:
1168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                isRecordLoadResponse = true;
1169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ar = (AsyncResult)msg.obj;
1171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar.exception != null) {
1173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    loge("Exception in fetching EF_CSP data " + ar.exception);
1174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    break;
1175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                data = (byte[])ar.result;
1178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("EF_CSP: " + IccUtils.bytesToHexString(data));
1180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                handleEfCspData(data);
1181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
11832f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim            case EVENT_GET_GID1_DONE:
11842f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                isRecordLoadResponse = true;
11852f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim
11862f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                ar = (AsyncResult)msg.obj;
11872f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                data =(byte[])ar.result;
11882f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim
11892f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                if (ar.exception != null) {
11902f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                    loge("Exception in get GID1 " + ar.exception);
1191620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt                    mGid1 = null;
11922f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                    break;
11932f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                }
1194620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt                mGid1 = IccUtils.bytesToHexString(data);
1195620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt                log("GID1: " + mGid1);
11962f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim
11972f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim                break;
11982f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim
1199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            default:
1200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                super.handleMessage(msg);   // IccRecords handles generic record load responses
1201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }}catch (RuntimeException exc) {
1203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // I don't want these exceptions to be fatal
1204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            logw("Exception parsing SIM record", exc);
1205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } finally {
1206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Count up record load responses even if they are fails
1207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (isRecordLoadResponse) {
1208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                onRecordLoaded();
1209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1213230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private class EfPlLoaded implements IccRecordLoaded {
1214230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        public String getEfName() {
1215230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            return "EF_PL";
1216230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1217230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1218230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        public void onRecordLoaded(AsyncResult ar) {
1219230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mEfPl = (byte[]) ar.result;
1220230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            if (DBG) log("EF_PL=" + IccUtils.bytesToHexString(mEfPl));
1221230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1222230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    }
1223230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1224230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private class EfUsimLiLoaded implements IccRecordLoaded {
1225230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        public String getEfName() {
1226230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            return "EF_LI";
1227230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1228230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1229230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        public void onRecordLoaded(AsyncResult ar) {
1230230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mEfLi = (byte[]) ar.result;
1231230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            if (DBG) log("EF_LI=" + IccUtils.bytesToHexString(mEfLi));
1232230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1233230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    }
1234230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void handleFileUpdate(int efid) {
1236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        switch(efid) {
1237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EF_MBDN:
123822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mRecordsToLoad++;
1239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                new AdnRecordLoader(mFh).loadFromEF(EF_MBDN, EF_EXT6,
124022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mMailboxIndex, obtainMessage(EVENT_GET_MBDN_DONE));
1241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EF_MAILBOX_CPHS:
124322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mRecordsToLoad++;
1244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                new AdnRecordLoader(mFh).loadFromEF(EF_MAILBOX_CPHS, EF_EXT1,
1245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        1, obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE));
1246c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1247c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case EF_CSP_CPHS:
124822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mRecordsToLoad++;
1249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("[CSP] SIM Refresh for EF_CSP_CPHS");
1250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.loadEFTransparent(EF_CSP_CPHS,
1251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        obtainMessage(EVENT_GET_CSP_CPHS_DONE));
1252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
125367aacea4e6b0199579a71b3a6a2f5d6778b8a002Kevin Li            case EF_FDN:
125467aacea4e6b0199579a71b3a6a2f5d6778b8a002Kevin Li                if (DBG) log("SIM Refresh called for EF_FDN");
125567aacea4e6b0199579a71b3a6a2f5d6778b8a002Kevin Li                mParentApp.queryFdn();
125667aacea4e6b0199579a71b3a6a2f5d6778b8a002Kevin Li                break;
1257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            default:
1258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // For now, fetch all records if this is not a
1259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // voicemail number.
1260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // TODO: Handle other cases, instead of fetching all.
126122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mAdnCache.reset();
1262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                fetchSimRecords();
1263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void handleSimRefresh(IccRefreshResponse refreshResponse){
1268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (refreshResponse == null) {
1269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (DBG) log("handleSimRefresh received without input");
1270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
1271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (refreshResponse.aid != null &&
1274e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                !refreshResponse.aid.equals(mParentApp.getAid())) {
1275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // This is for different app. Ignore.
1276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
1277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        switch (refreshResponse.refreshResult) {
1280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case IccRefreshResponse.REFRESH_RESULT_FILE_UPDATE:
1281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("handleSimRefresh with SIM_FILE_UPDATED");
1282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                handleFileUpdate(refreshResponse.efId);
1283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case IccRefreshResponse.REFRESH_RESULT_INIT:
1285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("handleSimRefresh with SIM_REFRESH_INIT");
1286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // need to reload all files (that we care about)
128764bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka                onIccRefreshInit();
1288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case IccRefreshResponse.REFRESH_RESULT_RESET:
129062648296ee1514d871d7d779d6f33da5e55babcaShishir Agrawal                // Refresh reset is handled by the UiccCard object.
1291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("handleSimRefresh with SIM_REFRESH_RESET");
1292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            default:
1294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // unknown refresh operation
1295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (DBG) log("handleSimRefresh with unknown operation");
1296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1301e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby     * Dispatch 3GPP format message to registrant ({@code GSMPhone} or {@code CDMALTEPhone})
1302e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby     * to pass to the 3GPP SMS dispatcher for delivery.
1303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1304a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hamby    private int dispatchGsmMessage(SmsMessage message) {
1305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mNewSmsRegistrants.notifyResult(message);
1306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return 0;
1307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void handleSms(byte[] ba) {
1310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (ba[0] != 0)
131199c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville            Rlog.d("ENF", "status : " + ba[0]);
1312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // 3GPP TS 51.011 v5.0.0 (20011-12)  10.5.3
1314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // 3 == "received by MS from network; message to be read"
1315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (ba[0] == 3) {
1316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            int n = ba.length;
1317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Note: Data may include trailing FF's.  That's OK; message
1319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // should still parse correctly.
1320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            byte[] pdu = new byte[n - 1];
1321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            System.arraycopy(ba, 1, pdu, 0, n - 1);
1322a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hamby            SmsMessage message = SmsMessage.createFromPdu(pdu, SmsConstants.FORMAT_3GPP);
1323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            dispatchGsmMessage(message);
1325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1329cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private void handleSmses(ArrayList<byte[]> messages) {
1330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int count = messages.size();
1331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for (int i = 0; i < count; i++) {
1333cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            byte[] ba = messages.get(i);
1334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (ba[0] != 0)
133699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.i("ENF", "status " + i + ": " + ba[0]);
1337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // 3GPP TS 51.011 v5.0.0 (20011-12)  10.5.3
1339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // 3 == "received by MS from network; message to be read"
1340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (ba[0] == 3) {
1342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                int n = ba.length;
1343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // Note: Data may include trailing FF's.  That's OK; message
1345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // should still parse correctly.
1346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                byte[] pdu = new byte[n - 1];
1347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                System.arraycopy(ba, 1, pdu, 0, n - 1);
1348a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hamby                SmsMessage message = SmsMessage.createFromPdu(pdu, SmsConstants.FORMAT_3GPP);
1349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                dispatchGsmMessage(message);
1351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // 3GPP TS 51.011 v5.0.0 (20011-12)  10.5.3
1353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // 1 == "received by MS from network; message read"
1354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                ba[0] = 1;
1356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1357cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                if (false) { // FIXME: writing seems to crash RdoServD
1358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mFh.updateEFLinearFixed(EF_SMS,
1359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            i, ba, null, obtainMessage(EVENT_MARK_SMS_READ_DONE, i));
1360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1365230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private String findBestLanguage(byte[] languages) {
1366230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        String bestMatch = null;
1367230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        String[] locales = mContext.getAssets().getLocales();
1368230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1369230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        if ((languages == null) || (locales == null)) return null;
1370230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1371230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        // Each 2-bytes consists of one language
1372230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        for (int i = 0; (i + 1) < languages.length; i += 2) {
1373230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            try {
1374230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                String lang = new String(languages, i, 2, "ISO-8859-1");
1375230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                if (DBG) log ("languages from sim = " + lang);
1376230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                for (int j = 0; j < locales.length; j++) {
1377230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                    if (locales[j] != null && locales[j].length() >= 2 &&
1378230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                            locales[j].substring(0, 2).equalsIgnoreCase(lang)) {
1379230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                        return lang;
1380230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                    }
1381230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                }
1382230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                if (bestMatch != null) break;
1383230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            } catch(java.io.UnsupportedEncodingException e) {
1384230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                log ("Failed to parse USIM language records" + e);
1385230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            }
1386230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1387230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        // no match found. return null
1388230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        return null;
1389230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    }
1390230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1391230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private void setLocaleFromUsim() {
1392230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        String prefLang = null;
1393230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        // check EFli then EFpl
1394230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        prefLang = findBestLanguage(mEfLi);
1395230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1396230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        if (prefLang == null) {
1397230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            prefLang = findBestLanguage(mEfPl);
1398230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1399230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1400230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        if (prefLang != null) {
1401230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            // check country code from SIM
1402230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            String imsi = getIMSI();
1403230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            String country = null;
1404230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            if (imsi != null) {
1405230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                country = MccTable.countryCodeForMcc(
1406230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                                    Integer.parseInt(imsi.substring(0,3)));
1407230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            }
1408230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            if (DBG) log("Setting locale to " + prefLang + "_" + country);
1409230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            MccTable.setSystemLocale(mContext, prefLang, country);
1410230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        } else {
1411230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            if (DBG) log ("No suitable USIM selected locale");
1412230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1413230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    }
1414230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1415cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onRecordLoaded() {
1417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // One record loaded successfully or failed, In either case
1418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // we need to update the recordsToLoad count
141922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad -= 1;
142022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (DBG) log("onRecordLoaded " + mRecordsToLoad + " requested: " + mRecordsRequested);
1421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
142222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mRecordsToLoad == 0 && mRecordsRequested == true) {
1423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            onAllRecordsLoaded();
142422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (mRecordsToLoad < 0) {
1425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            loge("recordsToLoad <0, programmer error suspected");
142622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mRecordsToLoad = 0;
1427c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1430cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void onAllRecordsLoaded() {
1432e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        if (DBG) log("record load complete");
1433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1434230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        setLocaleFromUsim();
1435230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1436230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        if (mParentApp.getState() == AppState.APPSTATE_PIN ||
1437230e46bdd850306dcc54ab6038d4d3132f5032abnfjb               mParentApp.getState() == AppState.APPSTATE_PUK) {
1438230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            // reset recordsRequested, since sim is not loaded really
1439230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mRecordsRequested = false;
1440230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            // lock state, only update language
1441230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            return ;
1442230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1443230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Some fields require more than one SIM record to set
1445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1446e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        String operator = getOperatorNumeric();
1447e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        if (!TextUtils.isEmpty(operator)) {
1448e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville            log("onAllRecordsLoaded set 'gsm.sim.operator.numeric' to operator='" +
1449e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville                    operator + "'");
1450a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            log("update icc_operator_numeric=" + operator);
1451e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu            mTelephonyManager.setSimOperatorNumericForPhone(
1452e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                    mParentApp.getPhoneId(), operator);
1453b9adaa1c4a12df8c8bd44b4803d452662b53e0d8Tom Taylor            final SubscriptionController subController = SubscriptionController.getInstance();
1454b9adaa1c4a12df8c8bd44b4803d452662b53e0d8Tom Taylor            subController.setMccMnc(operator, subController.getDefaultSmsSubId());
1455e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        } else {
1456e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville            log("onAllRecordsLoaded empty 'gsm.sim.operator.numeric' skipping");
1457e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        }
1458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1459e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        if (!TextUtils.isEmpty(mImsi)) {
1460e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville            log("onAllRecordsLoaded set mcc imsi=" + mImsi);
1461e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu            mTelephonyManager.setSimCountryIsoForPhone(
1462e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                    mParentApp.getPhoneId(), MccTable.countryCodeForMcc(
1463e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                    Integer.parseInt(mImsi.substring(0,3))));
1464e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville        } else {
1465e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville            log("onAllRecordsLoaded empty imsi skipping setting mcc");
1466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        setVoiceMailByCountry(operator);
1469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        setSpnFromConfig(operator);
1470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1471b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville        mRecordsLoadedRegistrants.notifyRegistrants(
1472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            new AsyncResult(null, null, null));
1473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1474c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    //***** Private methods
1476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void setSpnFromConfig(String carrier) {
1478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mSpnOverride.containsCarrier(carrier)) {
1479b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal            setServiceProviderName(mSpnOverride.getSpn(carrier));
1480e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu            mTelephonyManager.setSimOperatorNameForPhone(
1481e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                    mParentApp.getPhoneId(), getServiceProviderName());
1482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void setVoiceMailByCountry (String spn) {
1487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mVmConfig.containsCarrier(spn)) {
148822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mIsVoiceMailFixed = true;
148922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mVoiceMailNum = mVmConfig.getVoiceMailNumber(spn);
149022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mVoiceMailTag = mVmConfig.getVoiceMailTag(spn);
1491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
1495c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public void onReady() {
1496c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        fetchSimRecords();
1497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1498c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1499230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private void onLocked() {
1500230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        if (DBG) log("only fetch EF_LI and EF_PL in lock state");
1501230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        loadEfLiAndEfPl();
1502230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    }
1503230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1504230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    private void loadEfLiAndEfPl() {
1505e409b02a691d5bb0515aab41cfa597c725eb9174duho.ro        Resources resource = Resources.getSystem();
1506e409b02a691d5bb0515aab41cfa597c725eb9174duho.ro        if (!resource.getBoolean(com.android.internal.R.bool.config_use_sim_language_file)) {
1507e409b02a691d5bb0515aab41cfa597c725eb9174duho.ro            if (DBG) log ("Not using EF LI/EF PL");
1508e409b02a691d5bb0515aab41cfa597c725eb9174duho.ro            return;
1509e409b02a691d5bb0515aab41cfa597c725eb9174duho.ro        }
1510e409b02a691d5bb0515aab41cfa597c725eb9174duho.ro
1511230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        if (mParentApp.getType() == AppType.APPTYPE_USIM) {
1512ab55739495b38cf403e7c4514e00f4661034c838Amit Mahajan            mRecordsRequested = true;
1513230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mFh.loadEFTransparent(EF_LI,
1514230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                    obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfUsimLiLoaded()));
1515230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mRecordsToLoad++;
1516230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1517230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mFh.loadEFTransparent(EF_PL,
1518230e46bdd850306dcc54ab6038d4d3132f5032abnfjb                    obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfPlLoaded()));
1519230e46bdd850306dcc54ab6038d4d3132f5032abnfjb            mRecordsToLoad++;
1520230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        }
1521230e46bdd850306dcc54ab6038d4d3132f5032abnfjb    }
1522230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1523c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void fetchSimRecords() {
152422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsRequested = true;
1525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
152622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (DBG) log("fetchSimRecords " + mRecordsToLoad);
1527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1528e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mCi.getIMSIForApp(mParentApp.getAid(), obtainMessage(EVENT_GET_IMSI_DONE));
152922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1530c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_ICCID, obtainMessage(EVENT_GET_ICCID_DONE));
153222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1534c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // FIXME should examine EF[MSISDN]'s capability configuration
1535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // to determine which is the voice/data/fax line
1536c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        new AdnRecordLoader(mFh).loadFromEF(EF_MSISDN, EF_EXT1, 1,
1537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    obtainMessage(EVENT_GET_MSISDN_DONE));
153822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1540c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Record number is subscriber profile
1541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFLinearFixed(EF_MBI, 1, obtainMessage(EVENT_GET_MBI_DONE));
154222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_AD, obtainMessage(EVENT_GET_AD_DONE));
154522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1547c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Record number is subscriber profile
1548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFLinearFixed(EF_MWIS, 1, obtainMessage(EVENT_GET_MWIS_DONE));
154922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Also load CPHS-style voice mail indicator, which stores
1553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // the same info as EF[MWIS]. If both exist, both are updated
1554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // but the EF[MWIS] data is preferred
1555c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Please note this must be loaded after EF[MWIS]
1556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(
1557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                EF_VOICE_MAIL_INDICATOR_CPHS,
1558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                obtainMessage(EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE));
155922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1560c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Same goes for Call Forward Status indicator: fetch both
1562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // EF[CFIS] and CPHS-EF, with EF[CFIS] preferred.
1563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFLinearFixed(EF_CFIS, 1, obtainMessage(EVENT_GET_CFIS_DONE));
156422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_CFF_CPHS, obtainMessage(EVENT_GET_CFF_DONE));
156622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        getSpnFsm(true, null);
1570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_SPDI, obtainMessage(EVENT_GET_SPDI_DONE));
157222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFLinearFixed(EF_PNN, 1, obtainMessage(EVENT_GET_PNN_DONE));
157522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1576c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1577c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_SST, obtainMessage(EVENT_GET_SST_DONE));
157822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1580c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_INFO_CPHS, obtainMessage(EVENT_GET_INFO_CPHS_DONE));
158122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mFh.loadEFTransparent(EF_CSP_CPHS,obtainMessage(EVENT_GET_CSP_CPHS_DONE));
158422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRecordsToLoad++;
1585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
15862f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim        mFh.loadEFTransparent(EF_GID1, obtainMessage(EVENT_GET_GID1_DONE));
1587620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt        mRecordsToLoad++;
1588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1589230e46bdd850306dcc54ab6038d4d3132f5032abnfjb        loadEfLiAndEfPl();
1590230e46bdd850306dcc54ab6038d4d3132f5032abnfjb
1591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // XXX should seek instead of examining them all
1592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (false) { // XXX
1593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mFh.loadEFLinearFixedAll(EF_SMS, obtainMessage(EVENT_GET_ALL_SMS_DONE));
159422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mRecordsToLoad++;
1595c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1596c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (CRASH_RIL) {
1598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            String sms = "0107912160130310f20404d0110041007030208054832b0120"
1599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                         + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
1600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                         + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
1601c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                         + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
1602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                         + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
1603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                         + "ffffffffffffffffffffffffffffff";
1604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            byte[] ba = IccUtils.hexStringToBytes(sms);
1605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            mFh.updateEFLinearFixed(EF_SMS, 1, ba, null,
1607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_MARK_SMS_READ_DONE, 1));
1608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
160922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (DBG) log("fetchSimRecords " + mRecordsToLoad + " requested: " + mRecordsRequested);
1610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Returns the SpnDisplayRule based on settings on the SIM and the
1614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * specified plmn (currently-registered PLMN).  See TS 22.101 Annex A
1615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * and TS 51.011 10.3.11 for details.
1616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
16172bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapati     * If the SPN is not found on the SIM or is empty, the rule is
16182bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapati     * always PLMN_ONLY.
1619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    @Override
1621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public int getDisplayRule(String plmn) {
1622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int rule;
1623be6c87905a15d1e36e87189ad7df5d5a72a52f69Shishir Agrawal
162462d026a3882d133aa81995f8dfd2c1d25b1b0649Shishir Agrawal        if (mParentApp != null && mParentApp.getUiccCard() != null &&
162568515b655255005f653aec29e9f152412514982aShishir Agrawal            mParentApp.getUiccCard().getOperatorBrandOverride() != null) {
1626be6c87905a15d1e36e87189ad7df5d5a72a52f69Shishir Agrawal        // If the operator has been overridden, treat it as the SPN file on the SIM did not exist.
1627be6c87905a15d1e36e87189ad7df5d5a72a52f69Shishir Agrawal            rule = SPN_RULE_SHOW_PLMN;
1628be6c87905a15d1e36e87189ad7df5d5a72a52f69Shishir Agrawal        } else if (TextUtils.isEmpty(getServiceProviderName()) || mSpnDisplayCondition == -1) {
16292bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapati            // No EF_SPN content was found on the SIM, or not yet loaded.  Just show ONS.
1630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            rule = SPN_RULE_SHOW_PLMN;
1631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else if (isOnMatchingPlmn(plmn)) {
1632c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            rule = SPN_RULE_SHOW_SPN;
163322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if ((mSpnDisplayCondition & 0x01) == 0x01) {
1634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // ONS required when registered to HPLMN or PLMN in EF_SPDI
1635c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                rule |= SPN_RULE_SHOW_PLMN;
1636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        } else {
1638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            rule = SPN_RULE_SHOW_PLMN;
163922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if ((mSpnDisplayCondition & 0x02) == 0x00) {
1640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // SPN required if not registered to HPLMN or PLMN in EF_SPDI
1641c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                rule |= SPN_RULE_SHOW_SPN;
1642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return rule;
1645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Checks if plmn is HPLMN or on the spdiNetworks list.
1649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean isOnMatchingPlmn(String plmn) {
1651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (plmn == null) return false;
1652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (plmn.equals(getOperatorNumeric())) {
1654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return true;
1655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
165722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mSpdiNetworks != null) {
165822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            for (String spdiNet : mSpdiNetworks) {
1659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (plmn.equals(spdiNet)) {
1660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    return true;
1661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return false;
1665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * States of Get SPN Finite State Machine which only used by getSpnFsm()
1669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
167022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private enum GetSpnFsmState {
1671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        IDLE,               // No initialized
1672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        INIT,               // Start FSM
1673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        READ_SPN_3GPP,      // Load EF_SPN firstly
1674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        READ_SPN_CPHS,      // Load EF_SPN_CPHS secondly
1675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        READ_SPN_SHORT_CPHS // Load EF_SPN_SHORT_CPHS last
1676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Finite State Machine to load Service Provider Name , which can be stored
1680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * in either EF_SPN (3GPP), EF_SPN_CPHS, or EF_SPN_SHORT_CPHS (CPHS4.2)
1681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
1682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * After starting, FSM will search SPN EFs in order and stop after finding
1683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * the first valid SPN
1684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
1685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * If the FSM gets restart while waiting for one of
1686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * SPN EFs results (i.e. a SIM refresh occurs after issuing
1687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * read EF_CPHS_SPN), it will re-initialize only after
1688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * receiving and discarding the unfinished SPN EF result.
1689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
1690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param start set true only for initialize loading
1691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param ar the AsyncResult from loadEFTransparent
1692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ar.exception holds exception in error
1693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *        ar.result is byte[] for data in success
1694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void getSpnFsm(boolean start, AsyncResult ar) {
1696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        byte[] data;
1697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (start) {
1699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Check previous state to see if there is outstanding
1700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // SPN read
170122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if(mSpnState == GetSpnFsmState.READ_SPN_3GPP ||
170222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville               mSpnState == GetSpnFsmState.READ_SPN_CPHS ||
170322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville               mSpnState == GetSpnFsmState.READ_SPN_SHORT_CPHS ||
170422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville               mSpnState == GetSpnFsmState.INIT) {
1705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // Set INIT then return so the INIT code
1706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                // will run when the outstanding read done.
170722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpnState = GetSpnFsmState.INIT;
1708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                return;
1709c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            } else {
171022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpnState = GetSpnFsmState.INIT;
1711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
171422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        switch(mSpnState){
1715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case INIT:
1716b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                setServiceProviderName(null);
1717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1718c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                mFh.loadEFTransparent(EF_SPN,
1719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                        obtainMessage(EVENT_GET_SPN_DONE));
172022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mRecordsToLoad++;
1721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
172222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpnState = GetSpnFsmState.READ_SPN_3GPP;
1723c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case READ_SPN_3GPP:
1725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar != null && ar.exception == null) {
1726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    data = (byte[]) ar.result;
172722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSpnDisplayCondition = 0xff & data[0];
1728b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    setServiceProviderName(IccUtils.adnStringFieldToString(
1729b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                            data, 1, data.length - 1));
1730c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1731b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    if (DBG) log("Load EF_SPN: " + getServiceProviderName()
173222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            + " spnDisplayCondition: " + mSpnDisplayCondition);
1733e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                    mTelephonyManager.setSimOperatorNameForPhone(
1734e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                            mParentApp.getPhoneId(), getServiceProviderName());
1735c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
173622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSpnState = GetSpnFsmState.IDLE;
1737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                } else {
1738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    mFh.loadEFTransparent( EF_SPN_CPHS,
1739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                            obtainMessage(EVENT_GET_SPN_DONE));
174022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mRecordsToLoad++;
1741c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
174222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSpnState = GetSpnFsmState.READ_SPN_CPHS;
1743c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // See TS 51.011 10.3.11.  Basically, default to
1745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    // show PLMN always, and SPN also if roaming.
174622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSpnDisplayCondition = -1;
1747c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1748c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1749c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            case READ_SPN_CPHS:
1750c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                if (ar != null && ar.exception == null) {
1751c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    data = (byte[]) ar.result;
1752b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    setServiceProviderName(IccUtils.adnStringFieldToString(data, 0, data.length));
1753c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1754b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal                    if (DBG) log("Load EF_SPN_CPHS: " + getServiceProviderName());
1755e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                    mTelephonyManager.setSimOperatorNameForPhone(
1756e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                            mParentApp.getPhoneId(), 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());
1773e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                    mTelephonyManager.setSimOperatorNameForPhone(
1774e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                            mParentApp.getPhoneId(), getServiceProviderName());
1775c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }else {
1776c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                    if (DBG) log("No SPN loaded in either CHPS or 3GPP");
1777c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                }
1778c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
177922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpnState = GetSpnFsmState.IDLE;
1780c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1781c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            default:
178222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpnState = GetSpnFsmState.IDLE;
1783c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1784c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1785c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1786c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1787c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Parse TS 51.011 EF[SPDI] record
1788c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * This record contains the list of numeric network IDs that
1789c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * are treated specially when determining SPN display
1790c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1791c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void
1792c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    parseEfSpdi(byte[] data) {
1793c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        SimTlv tlv = new SimTlv(data, 0, data.length);
1794c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1795c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        byte[] plmnEntries = null;
1796c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1797c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for ( ; tlv.isValidObject() ; tlv.nextObject()) {
1798c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Skip SPDI tag, if existant
1799c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (tlv.getTag() == TAG_SPDI) {
1800c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville              tlv = new SimTlv(tlv.getData(), 0, tlv.getData().length);
1801c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1802c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // There should only be one TAG_SPDI_PLMN_LIST
1803c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (tlv.getTag() == TAG_SPDI_PLMN_LIST) {
1804c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                plmnEntries = tlv.getData();
1805c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                break;
1806c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1807c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1808c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1809c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (plmnEntries == null) {
1810c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            return;
1811c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1812c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
181322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mSpdiNetworks = new ArrayList<String>(plmnEntries.length / 3);
1814c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1815c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for (int i = 0 ; i + 2 < plmnEntries.length ; i += 3) {
1816c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            String plmnCode;
1817c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            plmnCode = IccUtils.bcdToString(plmnEntries, i, 3);
1818c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1819c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            // Valid operator codes are 5 or 6 digits
1820c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            if (plmnCode.length() >= 5) {
1821c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                log("EF_SPDI network: " + plmnCode);
182222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSpdiNetworks.add(plmnCode);
1823c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville            }
1824c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1825c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1826c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1827c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1828c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * check to see if Mailbox Number is allocated and activated in CPHS SST
1829c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1830c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private boolean isCphsMailboxEnabled() {
1831c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        if (mCphsInfo == null)  return false;
1832c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return ((mCphsInfo[1] & CPHS_SST_MBN_MASK) == CPHS_SST_MBN_ENABLED );
1833c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1834c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1835cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1836c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void log(String s) {
183799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.d(LOG_TAG, "[SIMRecords] " + s);
1838c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1839c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1840cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1841c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void loge(String s) {
184299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "[SIMRecords] " + s);
1843c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1844c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1845c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void logw(String s, Throwable tr) {
184699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.w(LOG_TAG, "[SIMRecords] " + s, tr);
1847c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1848c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1849c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void logv(String s) {
185099c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.v(LOG_TAG, "[SIMRecords] " + s);
1851c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1852c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1853c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1854c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Return true if "Restriction of menu options for manual PLMN selection"
1855c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * bit is set or EF_CSP data is unavailable, return false otherwise.
1856c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1857cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1858c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    public boolean isCspPlmnEnabled() {
1859c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        return mCspPlmnEnabled;
1860c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
1861c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1862c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    /**
1863c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Parse EF_CSP data and check if
1864c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * "Restriction of menu options for manual PLMN selection" is
1865c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * Enabled/Disabled
1866c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     *
1867c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     * @param data EF_CSP hex data.
1868c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville     */
1869c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    private void handleEfCspData(byte[] data) {
1870c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // As per spec CPHS4_2.WW6, CPHS B.4.7.1, EF_CSP contains CPHS defined
1871c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // 18 bytes (i.e 9 service groups info) and additional data specific to
1872c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // operator. The valueAddedServicesGroup is not part of standard
1873c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // services. This is operator specific and can be programmed any where.
1874c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // Normally this is programmed as 10th service after the standard
1875c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        // services.
1876c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        int usedCspGroups = data.length / 2;
1877e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby        // This is the "Service Group Number" of "Value Added Services Group".
1878c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        byte valueAddedServicesGroup = (byte)0xC0;
1879c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1880c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        mCspPlmnEnabled = true;
1881c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        for (int i = 0; i < usedCspGroups; i++) {
1882c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             if (data[2 * i] == valueAddedServicesGroup) {
1883c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 log("[CSP] found ValueAddedServicesGroup, value " + data[(2 * i) + 1]);
1884c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 if ((data[(2 * i) + 1] & 0x80) == 0x80) {
1885c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     // Bit 8 is for
1886c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     // "Restriction of menu options for manual PLMN selection".
1887c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     // Operator Selection menu should be enabled.
1888c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     mCspPlmnEnabled = true;
1889c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 } else {
1890c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     mCspPlmnEnabled = false;
1891c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     // Operator Selection menu should be disabled.
1892c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     // Operator Selection Mode should be set to Automatic.
1893c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     log("[CSP] Set Automatic Network Selection");
1894c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                     mNetworkSelectionModeAutomaticRegistrants.notifyRegistrants();
1895c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 }
1896c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville                 return;
1897c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville             }
1898c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        }
1899c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville
1900c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville        log("[CSP] Value Added Service Group (0xC0), not found!");
1901c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    }
190205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka
190305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka    @Override
190405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
190505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println("SIMRecords: " + this);
190605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" extends:");
190705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        super.dump(fd, pw, args);
190805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mVmConfig=" + mVmConfig);
190905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mSpnOverride=" + mSpnOverride);
191022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mCallForwardingEnabled=" + mCallForwardingEnabled);
191122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mSpnState=" + mSpnState);
191205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mCphsInfo=" + mCphsInfo);
191305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mCspPlmnEnabled=" + mCspPlmnEnabled);
191422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mEfMWIS[]=" + Arrays.toString(mEfMWIS));
191522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mEfCPHS_MWI[]=" + Arrays.toString(mEfCPHS_MWI));
191605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mEfCff[]=" + Arrays.toString(mEfCff));
191705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mEfCfis[]=" + Arrays.toString(mEfCfis));
191822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mSpnDisplayCondition=" + mSpnDisplayCondition);
191922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mSpdiNetworks[]=" + mSpdiNetworks);
192022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mPnnHomeName=" + mPnnHomeName);
192105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println(" mUsimServiceTable=" + mUsimServiceTable);
1922620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt        pw.println(" mGid1=" + mGid1);
192305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.flush();
192405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka    }
1925c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville}
1926