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