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