SIMRecords.java revision 2f837b8058eba0bc59e983c67efbc00cd9a80eee
1c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/* 2c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Copyright (C) 2006 The Android Open Source Project 3c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 4c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * you may not use this file except in compliance with the License. 6c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * You may obtain a copy of the License at 7c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 8c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * http://www.apache.org/licenses/LICENSE-2.0 9c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 10c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Unless required by applicable law or agreed to in writing, software 11c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See the License for the specific language governing permissions and 14c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * limitations under the License. 15c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 16c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 17d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkapackage com.android.internal.telephony.uicc; 18c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 19c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA; 20c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY; 21c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC; 22c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.Context; 23c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.AsyncResult; 24c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Handler; 25c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Message; 26c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.SystemProperties; 272bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapatiimport android.text.TextUtils; 28ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog; 29c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 30c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.BaseCommands; 31c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.CommandsInterface; 32c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.IccCardConstants; 33c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.MccTable; 34c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.Phone; 35c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.PhoneBase; 36c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.SmsMessageBase; 37d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.gsm.SimTlv; 38d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.gsm.SmsMessage; 39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 4005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.FileDescriptor; 4105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.PrintWriter; 42c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.ArrayList; 4305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.util.Arrays; 44c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 45c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 46c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/** 47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide} 48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 49c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic class SIMRecords extends IccRecords { 50c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected static final String LOG_TAG = "GSM"; 51c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 52c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final boolean CRASH_RIL = false; 53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 54c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected static final boolean DBG = true; 55c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Instance Variables 57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 58c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville VoiceMailConstants mVmConfig; 59c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 60c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 61c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SpnOverride mSpnOverride; 62c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 63c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Cached SIM State; cleared on channel close 64c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 65c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean callForwardingEnabled; 66c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 67c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 68c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 69c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * States only used by getSpnFsm FSM 70c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private Get_Spn_Fsm_State spnState; 72c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** CPHS service information (See CPHS 4.2 B.3.1.1) 74c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * It will be set in onSimReady if reading GET_CPHS_INFO successfully 75c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * mCphsInfo[0] is CPHS Phase 76c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * mCphsInfo[1] and mCphsInfo[2] is CPHS Service Table 77c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private byte[] mCphsInfo = null; 79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean mCspPlmnEnabled = true; 80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] efMWIS = null; 82c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] efCPHS_MWI =null; 83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] mEfCff = null; 84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] mEfCfis = null; 85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 86c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int spnDisplayCondition; 88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Numeric network codes listed in TS 51.011 EF[SPDI] 89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ArrayList<String> spdiNetworks = null; 90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String pnnHomeName = null; 92c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville UsimServiceTable mUsimServiceTable; 94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Constants 96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Bitmasks for SPN display rules. 98d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenka public static final int SPN_RULE_SHOW_SPN = 0x01; 99d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenka public static final int SPN_RULE_SHOW_PLMN = 0x02; 100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // From TS 51.011 EF[SPDI] section 102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int TAG_SPDI = 0xA3; 103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int TAG_SPDI_PLMN_LIST = 0x80; 104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Full Name IEI from TS 24.008 106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int TAG_FULL_NETWORK_NAME = 0x43; 107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Short Name IEI from TS 24.008 109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int TAG_SHORT_NETWORK_NAME = 0x45; 110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // active CFF from CPHS 4.2 B.4.5 112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int CFF_UNCONDITIONAL_ACTIVE = 0x0a; 113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int CFF_UNCONDITIONAL_DEACTIVE = 0x05; 114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int CFF_LINE1_MASK = 0x0f; 115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int CFF_LINE1_RESET = 0xf0; 116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // CPHS Service Table (See CPHS 4.2 B.3.1) 118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int CPHS_SST_MBN_MASK = 0x30; 119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int CPHS_SST_MBN_ENABLED = 0x30; 120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Event Constants 122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 123e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_APP_READY = 1; 124e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_GET_IMSI_DONE = 3; 125e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_GET_ICCID_DONE = 4; 126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_MBI_DONE = 5; 127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_MBDN_DONE = 6; 128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_MWIS_DONE = 7; 129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE = 8; 130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected static final int EVENT_GET_AD_DONE = 9; // Admin data on SIM 131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected static final int EVENT_GET_MSISDN_DONE = 10; 132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_CPHS_MAILBOX_DONE = 11; 133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_SPN_DONE = 12; 134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_SPDI_DONE = 13; 135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_UPDATE_DONE = 14; 136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_PNN_DONE = 15; 137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected static final int EVENT_GET_SST_DONE = 17; 138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_ALL_SMS_DONE = 18; 139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_MARK_SMS_READ_DONE = 19; 140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_SET_MBDN_DONE = 20; 141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_SMS_ON_SIM = 21; 142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_SMS_DONE = 22; 143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_CFF_DONE = 24; 144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_SET_CPHS_MAILBOX_DONE = 25; 145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_INFO_CPHS_DONE = 26; 146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_SET_MSISDN_DONE = 30; 147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_SIM_REFRESH = 31; 148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_CFIS_DONE = 32; 149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_CSP_CPHS_DONE = 33; 1502f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim private static final int EVENT_GET_GID1_DONE = 34; 151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Lookup table for carriers known to produce SIMs which incorrectly indicate MNC length. 153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final String[] MCCMNC_CODES_HAVING_3DIGITS_MNC = { 155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405025", "405026", "405027", "405028", "405029", "405030", "405031", "405032", 156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405033", "405034", "405035", "405036", "405037", "405038", "405039", "405040", 157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405041", "405042", "405043", "405044", "405045", "405046", "405047", "405750", 158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405751", "405752", "405753", "405754", "405755", "405756", "405799", "405800", 159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405801", "405802", "405803", "405804", "405805", "405806", "405807", "405808", 160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405809", "405810", "405811", "405812", "405813", "405814", "405815", "405816", 161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405817", "405818", "405819", "405820", "405821", "405822", "405823", "405824", 162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405825", "405826", "405827", "405828", "405829", "405830", "405831", "405832", 163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405833", "405834", "405835", "405836", "405837", "405838", "405839", "405840", 164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405841", "405842", "405843", "405844", "405845", "405846", "405847", "405848", 165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405849", "405850", "405851", "405852", "405853", "405875", "405876", "405877", 166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405878", "405879", "405880", "405881", "405882", "405883", "405884", "405885", 167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405886", "405908", "405909", "405910", "405911", "405912", "405913", "405914", 168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405915", "405916", "405917", "405918", "405919", "405920", "405921", "405922", 169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405923", "405924", "405925", "405926", "405927", "405928", "405929", "405930", 170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405931", "405932" 171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville }; 172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Constructor 174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 175e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public SIMRecords(UiccCardApplication app, Context c, CommandsInterface ci) { 176e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka super(app, c, ci); 177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville adnCache = new AdnRecordCache(mFh); 179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mVmConfig = new VoiceMailConstants(); 181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mSpnOverride = new SpnOverride(); 182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsRequested = false; // No load request is made till SIM ready 184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // recordsToLoad is set to 0 because no requests are made yet 186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad = 0; 187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.setOnSmsOnSim(this, EVENT_SMS_ON_SIM, null); 189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.registerForIccRefresh(this, EVENT_SIM_REFRESH, null); 190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Start off by setting empty state 192e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka resetRecords(); 193e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mParentApp.registerForReady(this, EVENT_APP_READY, null); 194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dispose() { 198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Disposing SIMRecords " + this); 199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //Unregister for all events 200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.unregisterForIccRefresh(this); 201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.unSetOnSmsOnSim(this); 202e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mParentApp.unregisterForReady(this); 203e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka resetRecords(); 204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville super.dispose(); 205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void finalize() { 208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if(DBG) log("finalized"); 209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 211e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka protected void resetRecords() { 212e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mImsi = null; 213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville msisdn = null; 214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville voiceMailNum = null; 215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville countVoiceMessages = 0; 216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mncLength = UNINITIALIZED; 217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville iccid = null; 218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // -1 means no EF_SPN found; treat accordingly. 219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spnDisplayCondition = -1; 220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville efMWIS = null; 221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville efCPHS_MWI = null; 222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spdiNetworks = null; 223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pnnHomeName = null; 2242f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim gid1 = null; 225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville adnCache.reset(); 227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("SIMRecords: onRadioOffOrNotAvailable set 'gsm.sim.operator.numeric' to operator=null"); 229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SystemProperties.set(PROPERTY_ICC_OPERATOR_NUMERIC, null); 230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SystemProperties.set(PROPERTY_ICC_OPERATOR_ALPHA, null); 231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SystemProperties.set(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, null); 232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // recordsRequested is set to false indicating that the SIM 234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // read requests made so far are not valid. This is set to 235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // true only when fresh set of read requests are made. 236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsRequested = false; 237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 240c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Public Methods 241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@inheritDoc} 244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 246c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getIMSI() { 247e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mImsi; 248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getMsisdnNumber() { 251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return msisdn; 252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 2552f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim public String getGid1() { 2562f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim return gid1; 2572f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim } 2582f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim 2592f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim @Override 260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public UsimServiceTable getUsimServiceTable() { 261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return mUsimServiceTable; 262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Set subscriber number to SIM record 266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * The subscriber number is stored in EF_MSISDN (TS 51.011) 268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * When the operation is complete, onComplete will be sent to its handler 270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param alphaTag alpha-tagging of the dailing nubmer (up to 10 characters) 272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param number dailing nubmer (up to 20 digits) 273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * if the number starts with '+', then set to international TOA 274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param onComplete 275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * onComplete.obj will be an AsyncResult 276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ((AsyncResult)onComplete.obj).exception == null on success 277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ((AsyncResult)onComplete.obj).exception != null on fail 278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void setMsisdnNumber(String alphaTag, String number, 280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message onComplete) { 281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville msisdn = number; 283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville msisdnTag = alphaTag; 284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if(DBG) log("Set MSISDN: " + msisdnTag + " " + /*msisdn*/ "xxxxxxx"); 286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AdnRecord adn = new AdnRecord(msisdnTag, msisdn); 289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).updateEF(adn, EF_MSISDN, EF_EXT1, 1, null, 291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_SET_MSISDN_DONE, onComplete)); 292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getMsisdnAlphaTag() { 295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return msisdnTag; 296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getVoiceMailNumber() { 299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return voiceMailNum; 300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Set voice mail number to SIM record 304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * The voice mail number can be stored either in EF_MBDN (TS 51.011) or 306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * EF_MAILBOX_CPHS (CPHS 4.2) 307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * If EF_MBDN is available, store the voice mail number to EF_MBDN 309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * If EF_MAILBOX_CPHS is enabled, store the voice mail number to EF_CHPS 311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * So the voice mail number will be stored in both EFs if both are available 313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Return error only if both EF_MBDN and EF_MAILBOX_CPHS fail. 315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * When the operation is complete, onComplete will be sent to its handler 317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param alphaTag alpha-tagging of the dailing nubmer (upto 10 characters) 319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param voiceNumber dailing nubmer (upto 20 digits) 320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * if the number is start with '+', then set to international TOA 321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param onComplete 322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * onComplete.obj will be an AsyncResult 323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ((AsyncResult)onComplete.obj).exception == null on success 324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ((AsyncResult)onComplete.obj).exception != null on fail 325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void setVoiceMailNumber(String alphaTag, String voiceNumber, 327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message onComplete) { 328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (isVoiceMailFixed) { 329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult.forMessage((onComplete)).exception = 330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new IccVmFixedException("Voicemail number is fixed by operator"); 331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onComplete.sendToTarget(); 332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newVoiceMailNum = voiceNumber; 336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newVoiceMailTag = alphaTag; 337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AdnRecord adn = new AdnRecord(newVoiceMailTag, newVoiceMailNum); 339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mailboxIndex != 0 && mailboxIndex != 0xff) { 341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).updateEF(adn, EF_MBDN, EF_EXT6, 343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mailboxIndex, null, 344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_SET_MBDN_DONE, onComplete)); 345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (isCphsMailboxEnabled()) { 347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).updateEF(adn, EF_MAILBOX_CPHS, 349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_EXT1, 1, null, 350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_SET_CPHS_MAILBOX_DONE, onComplete)); 351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult.forMessage((onComplete)).exception = 354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new IccVmNotSupportedException("Update SIM voice mailbox error"); 355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onComplete.sendToTarget(); 356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getVoiceMailAlphaTag() 360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville { 361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return voiceMailTag; 362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Sets the SIM voice message waiting indicator records 366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param line GSM Subscriber Profile Number, one-based. Only '1' is supported 367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param countWaiting The number of messages waiting, if known. Use 368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * -1 to indicate that an unknown number of 369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * messages are waiting 370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void 372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setVoiceMessageWaiting(int line, int countWaiting) { 373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (line != 1) { 374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // only profile 1 is supported 375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // range check 379c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (countWaiting < 0) { 380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville countWaiting = -1; 381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (countWaiting > 0xff) { 382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // TS 23.040 9.2.3.24.2 383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // "The value 255 shall be taken to mean 255 or greater" 384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville countWaiting = 0xff; 385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville countVoiceMessages = countWaiting; 388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRecordsEventsRegistrants.notifyResult(EVENT_MWI); 390c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (efMWIS != null) { 393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // TS 51.011 10.3.45 394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // lsb of byte 0 is 'voicemail' status 396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville efMWIS[0] = (byte)((efMWIS[0] & 0xfe) 397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville | (countVoiceMessages == 0 ? 0 : 1)); 398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // byte 1 is the number of voice messages waiting 400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (countWaiting < 0) { 401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The spec does not define what this should be 402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // if we don't know the count 403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville efMWIS[1] = 0; 404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville efMWIS[1] = (byte) countWaiting; 406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.updateEFLinearFixed( 409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_MWIS, 1, efMWIS, null, 410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage (EVENT_UPDATE_DONE, EF_MWIS)); 411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 413c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (efCPHS_MWI != null) { 414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Refer CPHS4_2.WW6 B4.2.3 415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville efCPHS_MWI[0] = (byte)((efCPHS_MWI[0] & 0xf0) 416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville | (countVoiceMessages == 0 ? 0x5 : 0xa)); 417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.updateEFTransparent( 419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_VOICE_MAIL_INDICATOR_CPHS, efCPHS_MWI, 420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage (EVENT_UPDATE_DONE, EF_VOICE_MAIL_INDICATOR_CPHS)); 421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 422c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (ArrayIndexOutOfBoundsException ex) { 423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville logw("Error saving voice mail state to SIM. Probably malformed SIM record", ex); 424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 426c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 427a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville // Validate data is !null and the MSP (Multiple Subscriber Profile) 428a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville // byte is between 1 and 4. See ETSI TS 131 102 v11.3.0 section 4.2.64. 429a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville private boolean validEfCfis(byte[] data) { 430a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville return ((data != null) && (data[0] >= 1) && (data[0] <= 4)); 431a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville } 432a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville 433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@inheritDoc} 435c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public boolean getVoiceCallForwardingFlag() { 438c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return callForwardingEnabled; 439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@inheritDoc} 443c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void setVoiceCallForwardingFlag(int line, boolean enable) { 446c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 447c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (line != 1) return; // only line 1 is supported 448c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 449c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville callForwardingEnabled = enable; 450c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 451c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRecordsEventsRegistrants.notifyResult(EVENT_CFI); 452c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 453c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 454a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville if (validEfCfis(mEfCfis)) { 455c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // lsb is of byte 1 is voice status 456c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (enable) { 457c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mEfCfis[1] |= 1; 458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 459c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mEfCfis[1] &= 0xfe; 460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 461c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 462a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville log("setVoiceCallForwardingFlag: enable=" + enable 463a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville + " mEfCfis=" + IccUtils.bytesToHexString(mEfCfis)); 464a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville 465c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // TODO: Should really update other fields in EF_CFIS, eg, 466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // dialing number. We don't read or use it right now. 467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.updateEFLinearFixed( 469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_CFIS, 1, mEfCfis, null, 470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage (EVENT_UPDATE_DONE, EF_CFIS)); 471a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville } else { 472a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville log("setVoiceCallForwardingFlag: ignoring enable=" + enable 473a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville + " invalid mEfCfis=" + IccUtils.bytesToHexString(mEfCfis)); 474c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mEfCff != null) { 477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (enable) { 478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mEfCff[0] = (byte) ((mEfCff[0] & CFF_LINE1_RESET) 479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville | CFF_UNCONDITIONAL_ACTIVE); 480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mEfCff[0] = (byte) ((mEfCff[0] & CFF_LINE1_RESET) 482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville | CFF_UNCONDITIONAL_DEACTIVE); 483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.updateEFTransparent( 486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_CFF_CPHS, mEfCff, 487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage (EVENT_UPDATE_DONE, EF_CFF_CPHS)); 488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (ArrayIndexOutOfBoundsException ex) { 490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville logw("Error saving call fowarding flag to SIM. " 491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "Probably malformed SIM record", ex); 492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 495c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 496c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called by STK Service when REFRESH is received. 498c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param fileChanged indicates whether any files changed 499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param fileList if non-null, a list of EF files that changed 500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void onRefresh(boolean fileChanged, int[] fileList) { 502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (fileChanged) { 503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // A future optimization would be to inspect fileList and 504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // only reload those files that we care about. For now, 505c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // just re-fetch all SIM records that we cache. 506c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fetchSimRecords(); 507c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 508c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 509c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 510c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 511c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@inheritDoc} 512c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 513c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 514c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getOperatorNumeric() { 515e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mImsi == null) { 516c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("getOperatorNumeric: IMSI == null"); 517c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return null; 518c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 519c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mncLength == UNINITIALIZED || mncLength == UNKNOWN) { 520c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("getSIMOperatorNumeric: bad mncLength"); 521c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return null; 522c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 523c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Length = length of MCC + length of MNC 525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // length of mcc = 3 (TS 23.003 Section 2.2) 526e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mImsi.substring(0, 3 + mncLength); 527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 528c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Overridden from Handler 530c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void handleMessage(Message msg) { 531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult ar; 532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AdnRecord adn; 533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 534c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte data[]; 535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 536c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean isRecordLoadResponse = false; 537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 538bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka if (mDestroyed.get()) { 539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("Received message " + msg + "[" + msg.what + "] " + 540c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville " while being destroyed. Ignoring."); 541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { switch (msg.what) { 545e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_APP_READY: 546e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onReady(); 547e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /* IO events */ 550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_IMSI_DONE: 551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 555c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("Exception querying IMSI, Exception:" + ar.exception); 557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 560e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mImsi = (String) ar.result; 561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // IMSI (MCC+MNC+MSIN) is at least 6 digits, but not more 563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // than 15 (and usually 15). 564e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mImsi != null && (mImsi.length() < 6 || mImsi.length() > 15)) { 565e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("invalid IMSI " + mImsi); 566e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mImsi = null; 567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("IMSI: " + /* imsi.substring(0, 6) +*/ "xxxxxxx"); 570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (((mncLength == UNKNOWN) || (mncLength == 2)) && 572e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ((mImsi != null) && (mImsi.length() >= 6))) { 573e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka String mccmncCode = mImsi.substring(0, 6); 574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (String mccmnc : MCCMNC_CODES_HAVING_3DIGITS_MNC) { 575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mccmnc.equals(mccmncCode)) { 576c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mncLength = 3; 577c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 580c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mncLength == UNKNOWN) { 583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // the SIM has told us all it knows, but it didn't know the mnc length. 584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // guess using the mcc 585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 586e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int mcc = Integer.parseInt(mImsi.substring(0,3)); 587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mncLength = MccTable.smallestDigitsMccForMnc(mcc); 588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (NumberFormatException e) { 589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mncLength = UNKNOWN; 590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("Corrupt IMSI!"); 591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mncLength != UNKNOWN && mncLength != UNINITIALIZED) { 595c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // finally have both the imsi and the mncLength and can parse the imsi properly 596e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka MccTable.updateMccMncConfiguration(mContext, mImsi.substring(0, 3 + mncLength)); 597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 598e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mImsiReadyRegistrants.notifyRegistrants(); 599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 601c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_MBI_DONE: 602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean isValidMbdn; 603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[]) ar.result; 607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isValidMbdn = false; 609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception == null) { 610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Refer TS 51.011 Section 10.3.44 for content details 611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("EF_MBI: " + IccUtils.bytesToHexString(data)); 612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Voice mail record number stored first 614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mailboxIndex = (int)data[0] & 0xff; 615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // check if dailing numbe id valid 617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mailboxIndex != 0 && mailboxIndex != 0xff) { 618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("Got valid mailbox number for MBDN"); 619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isValidMbdn = true; 620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // one more record to load 624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad += 1; 625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (isValidMbdn) { 627c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Note: MBDN was not included in NUM_OF_SIM_RECORDS_LOADED 628c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).loadFromEF(EF_MBDN, EF_EXT6, 629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mailboxIndex, obtainMessage(EVENT_GET_MBDN_DONE)); 630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If this EF not present, try mailbox as in CPHS standard 632c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // CPHS (CPHS4_2.WW6) is a european standard. 633c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).loadFromEF(EF_MAILBOX_CPHS, 634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_EXT1, 1, 635c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE)); 636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_CPHS_MAILBOX_DONE: 640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_MBDN_DONE: 641c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //Resetting the voice mail number and voice mail tag to null 642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //as these should be updated from the data read from EF_MBDN. 643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //If they are not reset, incase of invalid data/exception these 644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //variables are retaining their previous values and are 645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //causing invalid voice mailbox info display to user. 646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville voiceMailNum = null; 647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville voiceMailTag = null; 648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("Invalid or missing EF" 655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + ((msg.what == EVENT_GET_CPHS_MAILBOX_DONE) ? "[MAILBOX]" : "[MBDN]")); 656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Bug #645770 fall back to CPHS 658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // FIXME should use SST to decide 659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (msg.what == EVENT_GET_MBDN_DONE) { 661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //load CPHS on fail... 662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // FIXME right now, only load line1's CPHS voice mail entry 663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad += 1; 665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).loadFromEF( 666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_MAILBOX_CPHS, EF_EXT1, 1, 667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE)); 668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville adn = (AdnRecord)ar.result; 673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("VM: " + adn + 675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ((msg.what == EVENT_GET_CPHS_MAILBOX_DONE) ? " EF[MAILBOX]" : " EF[MBDN]")); 676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (adn.isEmpty() && msg.what == EVENT_GET_MBDN_DONE) { 678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Bug #645770 fall back to CPHS 679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // FIXME should use SST to decide 680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // FIXME right now, only load line1's CPHS voice mail entry 681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad += 1; 682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).loadFromEF( 683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_MAILBOX_CPHS, EF_EXT1, 1, 684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE)); 685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville voiceMailNum = adn.getNumber(); 690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville voiceMailTag = adn.getAlphaTag(); 691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_MSISDN_DONE: 694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("Invalid or missing EF[MSISDN]"); 700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville adn = (AdnRecord)ar.result; 704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville msisdn = adn.getNumber(); 706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville msisdnTag = adn.getAlphaTag(); 707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("MSISDN: " + /*msisdn*/ "xxxxxxx"); 709c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 710c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_SET_MSISDN_DONE: 712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = false; 713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 714c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.userObj != null) { 716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult.forMessage(((Message) ar.userObj)).exception 717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville = ar.exception; 718c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ((Message) ar.userObj).sendToTarget(); 719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 722c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_MWIS_DONE: 723c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 727c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 728c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 729c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 730c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 731c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 732c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("EF_MWIS: " + IccUtils.bytesToHexString(data)); 733c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 734c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville efMWIS = data; 735c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 736c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if ((data[0] & 0xff) == 0xff) { 737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("Uninitialized record MWIS"); 738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 740c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 741c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Refer TS 51.011 Section 10.3.45 for the content description 742c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean voiceMailWaiting = ((data[0] & 0x01) != 0); 743c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville countVoiceMessages = data[1] & 0xff; 744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (voiceMailWaiting && countVoiceMessages == 0) { 746c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Unknown count = -1 747c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville countVoiceMessages = -1; 748c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 749c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 750c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRecordsEventsRegistrants.notifyResult(EVENT_MWI); 751c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 752c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 753c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE: 754c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 755c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 756c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 757c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 758c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 759c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 760c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 761c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 762c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 763c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville efCPHS_MWI = data; 764c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 765c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Use this data if the EF[MWIS] exists and 766c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // has been loaded 767c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 768c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (efMWIS == null) { 769c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int indicator = (int)(data[0] & 0xf); 770c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 771c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Refer CPHS4_2.WW6 B4.2.3 772c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (indicator == 0xA) { 773c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Unknown count = -1 774c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville countVoiceMessages = -1; 775c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (indicator == 0x5) { 776c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville countVoiceMessages = 0; 777c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 778c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 779c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRecordsEventsRegistrants.notifyResult(EVENT_MWI); 780c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 781c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 782c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 783c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_ICCID_DONE: 784c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 785c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 786c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 787c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 788c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 789c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 790c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 791c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 792c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 793c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville iccid = IccUtils.bcdToString(data, 0, data.length); 794c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 795c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("iccid: " + iccid); 796c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 797c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 798c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 799c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 800c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_AD_DONE: 801c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 802c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 803c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 804c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 805c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 806c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 807c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 808c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 809c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 810c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 811c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("EF_AD: " + IccUtils.bytesToHexString(data)); 812c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 813c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (data.length < 3) { 814c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("Corrupt AD data on SIM"); 815c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 816c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 817c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 818c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (data.length == 3) { 819c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("MNC length not present in EF_AD"); 820c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 821c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 822c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 823c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mncLength = (int)data[3] & 0xf; 824c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 825c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mncLength == 0xf) { 826c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mncLength = UNKNOWN; 827c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 828c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } finally { 829c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (((mncLength == UNINITIALIZED) || (mncLength == UNKNOWN) || 830e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka (mncLength == 2)) && ((mImsi != null) && (mImsi.length() >= 6))) { 831e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka String mccmncCode = mImsi.substring(0, 6); 832c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (String mccmnc : MCCMNC_CODES_HAVING_3DIGITS_MNC) { 833c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mccmnc.equals(mccmncCode)) { 834c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mncLength = 3; 835c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 836c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 837c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 838c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 839c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 840c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mncLength == UNKNOWN || mncLength == UNINITIALIZED) { 841e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mImsi != null) { 842c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 843e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int mcc = Integer.parseInt(mImsi.substring(0,3)); 844c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 845c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mncLength = MccTable.smallestDigitsMccForMnc(mcc); 846c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (NumberFormatException e) { 847c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mncLength = UNKNOWN; 848c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("Corrupt IMSI!"); 849c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 850c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 851c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Indicate we got this info, but it didn't contain the length. 852c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mncLength = UNKNOWN; 853c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 854c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("MNC length not present in EF_AD"); 855c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 856c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 857e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mImsi != null && mncLength != UNKNOWN) { 858c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // finally have both imsi and the length of the mnc and can parse 859c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // the imsi properly 860c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville MccTable.updateMccMncConfiguration(mContext, 861e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mImsi.substring(0, 3 + mncLength)); 862c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 863c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 864c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 865c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 866c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_SPN_DONE: 867c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 868c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult) msg.obj; 869c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville getSpnFsm(false, ar); 870c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 871c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 872c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_CFF_DONE: 873c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 874c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 875c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult) msg.obj; 876c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[]) ar.result; 877c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 878c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 879c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 880c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 881c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 882c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("EF_CFF_CPHS: " + IccUtils.bytesToHexString(data)); 883c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mEfCff = data; 884c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 885a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville if (validEfCfis(mEfCfis)) { 886c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville callForwardingEnabled = 887c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ((data[0] & CFF_LINE1_MASK) == CFF_UNCONDITIONAL_ACTIVE); 888c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 889c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRecordsEventsRegistrants.notifyResult(EVENT_CFI); 890a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville } else { 891a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville log("EVENT_GET_CFF_DONE: invalid mEfCfis=" 892a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville + IccUtils.bytesToHexString(mEfCfis)); 893c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 894c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 895c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 896c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_SPDI_DONE: 897c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 898c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 899c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 900c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 901c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 902c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 903c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 904c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 905c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 906c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parseEfSpdi(data); 907c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 908c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 909c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_UPDATE_DONE: 910c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 911c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 912c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville logw("update failed. ", ar.exception); 913c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 914c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 915c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 916c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_PNN_DONE: 917c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 918c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 919c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 920c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 921c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 922c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 923c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 924c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 925c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 926c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SimTlv tlv = new SimTlv(data, 0, data.length); 927c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 928c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for ( ; tlv.isValidObject() ; tlv.nextObject()) { 929c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (tlv.getTag() == TAG_FULL_NETWORK_NAME) { 930c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pnnHomeName 931c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville = IccUtils.networkNameToString( 932c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville tlv.getData(), 0, tlv.getData().length); 933c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 934c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 935c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 936c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 937c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 938c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_ALL_SMS_DONE: 939c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 940c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 941c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 942c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) 943c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 944c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 945c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleSmses((ArrayList) ar.result); 946c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 947c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 948c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_MARK_SMS_READ_DONE: 949ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.i("ENF", "marked read: sms " + msg.arg1); 950c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 951c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 952c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 953c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_SMS_ON_SIM: 954c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = false; 955c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 956c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 957c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 958c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int[] index = (int[])ar.result; 959c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 960c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null || index.length != 1) { 961c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("Error on SMS_ON_SIM with exp " 962c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + ar.exception + " length " + index.length); 963c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 964c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("READ EF_SMS RECORD index=" + index[0]); 965c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFLinearFixed(EF_SMS,index[0], 966c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_SMS_DONE)); 967c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 968c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 969c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 970c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_SMS_DONE: 971c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = false; 972c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 973c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception == null) { 974c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleSms((byte[])ar.result); 975c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 976c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("Error on GET_SMS with exp " + ar.exception); 977c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 978c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 979c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_SST_DONE: 980c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 981c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 982c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 983c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 984c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 985c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 986c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 987c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 988c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 989c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mUsimServiceTable = new UsimServiceTable(data); 990c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("SST: " + mUsimServiceTable); 991c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 992c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 993c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_INFO_CPHS_DONE: 994c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 995c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 996c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 997c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 998c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 999c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1000c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1001c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1002c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCphsInfo = (byte[])ar.result; 1003c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1004c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("iCPHS: " + IccUtils.bytesToHexString(mCphsInfo)); 1005c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1006c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1007c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_SET_MBDN_DONE: 1008c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = false; 1009c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 1010c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1011c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception == null) { 1012c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville voiceMailNum = newVoiceMailNum; 1013c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville voiceMailTag = newVoiceMailTag; 1014c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1015c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1016c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (isCphsMailboxEnabled()) { 1017c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville adn = new AdnRecord(voiceMailTag, voiceMailNum); 1018c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message onCphsCompleted = (Message) ar.userObj; 1019c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1020c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /* write to cphs mailbox whenever it is available but 1021c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * we only need notify caller once if both updating are 1022c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * successful. 1023c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 1024c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * so if set_mbdn successful, notify caller here and set 1025c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * onCphsCompleted to null 1026c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1027c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception == null && ar.userObj != null) { 1028c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult.forMessage(((Message) ar.userObj)).exception 1029c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville = null; 1030c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ((Message) ar.userObj).sendToTarget(); 1031c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1032c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Callback with MBDN successful."); 1033c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1034c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onCphsCompleted = null; 1035c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1036c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1037c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh). 1038c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville updateEF(adn, EF_MAILBOX_CPHS, EF_EXT1, 1, null, 1039c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_SET_CPHS_MAILBOX_DONE, 1040c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onCphsCompleted)); 1041c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1042c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.userObj != null) { 1043c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult.forMessage(((Message) ar.userObj)).exception 1044c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville = ar.exception; 1045c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ((Message) ar.userObj).sendToTarget(); 1046c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1047c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1048c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1049c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_SET_CPHS_MAILBOX_DONE: 1050c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = false; 1051c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 1052c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if(ar.exception == null) { 1053c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville voiceMailNum = newVoiceMailNum; 1054c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville voiceMailTag = newVoiceMailTag; 1055c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1056c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Set CPHS MailBox with exception: " 1057c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + ar.exception); 1058c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1059c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.userObj != null) { 1060c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Callback with CPHS MB successful."); 1061c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult.forMessage(((Message) ar.userObj)).exception 1062c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville = ar.exception; 1063c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ((Message) ar.userObj).sendToTarget(); 1064c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1065c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1066c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_SIM_REFRESH: 1067c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = false; 1068c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 1069c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Sim REFRESH with exception: " + ar.exception); 1070c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception == null) { 1071c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleSimRefresh((IccRefreshResponse)ar.result); 1072c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1073c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1074c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_CFIS_DONE: 1075c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 1076c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1077c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 1078c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 1079c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1080c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 1081c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1082c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1083c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1084c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("EF_CFIS: " + IccUtils.bytesToHexString(data)); 1085c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1086a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville if (validEfCfis(data)) { 1087a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville mEfCfis = data; 1088c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1089a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville // Refer TS 51.011 Section 10.3.46 for the content description 1090a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville callForwardingEnabled = ((data[1] & 0x01) != 0); 1091a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville log("EF_CFIS: callFordwardingEnabled=" + callForwardingEnabled); 1092c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1093a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville mRecordsEventsRegistrants.notifyResult(EVENT_CFI); 1094a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville } else { 1095a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville log("EF_CFIS: invalid data=" + IccUtils.bytesToHexString(data)); 1096a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville } 1097c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1098c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1099c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_CSP_CPHS_DONE: 1100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 1101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 1103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 1105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("Exception in fetching EF_CSP data " + ar.exception); 1106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 1110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("EF_CSP: " + IccUtils.bytesToHexString(data)); 1112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleEfCspData(data); 1113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 11152f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim case EVENT_GET_GID1_DONE: 11162f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim isRecordLoadResponse = true; 11172f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim 11182f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim ar = (AsyncResult)msg.obj; 11192f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim data =(byte[])ar.result; 11202f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim 11212f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim if (ar.exception != null) { 11222f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim loge("Exception in get GID1 " + ar.exception); 11232f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim gid1 = null; 11242f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim break; 11252f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim } 11262f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim gid1 = IccUtils.bytesToHexString(data); 11272f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim log("GID1: " + gid1); 11282f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim 11292f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim break; 11302f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim 1131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 1132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville super.handleMessage(msg); // IccRecords handles generic record load responses 1133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville }}catch (RuntimeException exc) { 1135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // I don't want these exceptions to be fatal 1136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville logw("Exception parsing SIM record", exc); 1137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } finally { 1138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Count up record load responses even if they are fails 1139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (isRecordLoadResponse) { 1140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onRecordLoaded(); 1141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void handleFileUpdate(int efid) { 1146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch(efid) { 1147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EF_MBDN: 1148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).loadFromEF(EF_MBDN, EF_EXT6, 1150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mailboxIndex, obtainMessage(EVENT_GET_MBDN_DONE)); 1151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EF_MAILBOX_CPHS: 1153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).loadFromEF(EF_MAILBOX_CPHS, EF_EXT1, 1155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1, obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE)); 1156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EF_CSP_CPHS: 1158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("[CSP] SIM Refresh for EF_CSP_CPHS"); 1160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_CSP_CPHS, 1161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_CSP_CPHS_DONE)); 1162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 1164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // For now, fetch all records if this is not a 1165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // voicemail number. 1166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // TODO: Handle other cases, instead of fetching all. 1167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville adnCache.reset(); 1168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fetchSimRecords(); 1169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void handleSimRefresh(IccRefreshResponse refreshResponse){ 1174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (refreshResponse == null) { 1175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("handleSimRefresh received without input"); 1176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 1177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (refreshResponse.aid != null && 1180e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka !refreshResponse.aid.equals(mParentApp.getAid())) { 1181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // This is for different app. Ignore. 1182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 1183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (refreshResponse.refreshResult) { 1186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case IccRefreshResponse.REFRESH_RESULT_FILE_UPDATE: 1187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("handleSimRefresh with SIM_FILE_UPDATED"); 1188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleFileUpdate(refreshResponse.efId); 1189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case IccRefreshResponse.REFRESH_RESULT_INIT: 1191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("handleSimRefresh with SIM_REFRESH_INIT"); 1192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // need to reload all files (that we care about) 1193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville adnCache.reset(); 1194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fetchSimRecords(); 1195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case IccRefreshResponse.REFRESH_RESULT_RESET: 1197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("handleSimRefresh with SIM_REFRESH_RESET"); 1198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.setRadioPower(false, null); 1199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /* Note: no need to call setRadioPower(true). Assuming the desired 1200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * radio power state is still ON (as tracked by ServiceStateTracker), 1201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ServiceStateTracker will call setRadioPower when it receives the 1202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * RADIO_STATE_CHANGED notification for the power off. And if the 1203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * desired power state has changed in the interim, we don't want to 1204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * override it with an unconditional power on. 1205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 1208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // unknown refresh operation 1209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("handleSimRefresh with unknown operation"); 1210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Dispatch 3GPP format message. Overridden for CDMA/LTE phones by 1216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@link com.android.internal.telephony.cdma.CdmaLteUiccRecords} 1217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * to send messages to the secondary 3GPP format SMS dispatcher. 1218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected int dispatchGsmMessage(SmsMessageBase message) { 1220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mNewSmsRegistrants.notifyResult(message); 1221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return 0; 1222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void handleSms(byte[] ba) { 1225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ba[0] != 0) 1226ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d("ENF", "status : " + ba[0]); 1227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 3GPP TS 51.011 v5.0.0 (20011-12) 10.5.3 1229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 3 == "received by MS from network; message to be read" 1230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ba[0] == 3) { 1231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int n = ba.length; 1232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Note: Data may include trailing FF's. That's OK; message 1234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // should still parse correctly. 1235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] pdu = new byte[n - 1]; 1236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville System.arraycopy(ba, 1, pdu, 0, n - 1); 1237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SmsMessage message = SmsMessage.createFromPdu(pdu); 1238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville dispatchGsmMessage(message); 1240c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void handleSmses(ArrayList messages) { 1245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int count = messages.size(); 1246c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1247c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (int i = 0; i < count; i++) { 1248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] ba = (byte[]) messages.get(i); 1249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ba[0] != 0) 1251ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.i("ENF", "status " + i + ": " + ba[0]); 1252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 3GPP TS 51.011 v5.0.0 (20011-12) 10.5.3 1254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 3 == "received by MS from network; message to be read" 1255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ba[0] == 3) { 1257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int n = ba.length; 1258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Note: Data may include trailing FF's. That's OK; message 1260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // should still parse correctly. 1261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] pdu = new byte[n - 1]; 1262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville System.arraycopy(ba, 1, pdu, 0, n - 1); 1263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SmsMessage message = SmsMessage.createFromPdu(pdu); 1264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville dispatchGsmMessage(message); 1266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 3GPP TS 51.011 v5.0.0 (20011-12) 10.5.3 1268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 1 == "received by MS from network; message read" 1269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ba[0] = 1; 1271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (false) { // XXX writing seems to crash RdoServD 1273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.updateEFLinearFixed(EF_SMS, 1274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville i, ba, null, obtainMessage(EVENT_MARK_SMS_READ_DONE, i)); 1275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void onRecordLoaded() { 1281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // One record loaded successfully or failed, In either case 1282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // we need to update the recordsToLoad count 1283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad -= 1; 1284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("onRecordLoaded " + recordsToLoad + " requested: " + recordsRequested); 1285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (recordsToLoad == 0 && recordsRequested == true) { 1287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onAllRecordsLoaded(); 1288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (recordsToLoad < 0) { 1289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("recordsToLoad <0, programmer error suspected"); 1290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad = 0; 1291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void onAllRecordsLoaded() { 1295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String operator = getOperatorNumeric(); 1296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Some fields require more than one SIM record to set 1298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("SIMRecords: onAllRecordsLoaded set 'gsm.sim.operator.numeric' to operator='" + 1300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville operator + "'"); 1301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SystemProperties.set(PROPERTY_ICC_OPERATOR_NUMERIC, operator); 1302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1303e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mImsi != null) { 1304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SystemProperties.set(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, 1305e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka MccTable.countryCodeForMcc(Integer.parseInt(mImsi.substring(0,3)))); 1306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville else { 1308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("onAllRecordsLoaded: imsi is NULL!"); 1309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setVoiceMailByCountry(operator); 1312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setSpnFromConfig(operator); 1313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsLoadedRegistrants.notifyRegistrants( 1315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AsyncResult(null, null, null)); 1316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Private methods 1319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void setSpnFromConfig(String carrier) { 1321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mSpnOverride.containsCarrier(carrier)) { 1322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spn = mSpnOverride.getSpn(carrier); 1323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void setVoiceMailByCountry (String spn) { 1328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mVmConfig.containsCarrier(spn)) { 1329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isVoiceMailFixed = true; 1330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville voiceMailNum = mVmConfig.getVoiceMailNumber(spn); 1331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville voiceMailTag = mVmConfig.getVoiceMailTag(spn); 1332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 1336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void onReady() { 1337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fetchSimRecords(); 1338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void fetchSimRecords() { 1341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsRequested = true; 1342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("fetchSimRecords " + recordsToLoad); 1344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1345e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.getIMSIForApp(mParentApp.getAid(), obtainMessage(EVENT_GET_IMSI_DONE)); 1346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_ICCID, obtainMessage(EVENT_GET_ICCID_DONE)); 1349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // FIXME should examine EF[MSISDN]'s capability configuration 1352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // to determine which is the voice/data/fax line 1353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).loadFromEF(EF_MSISDN, EF_EXT1, 1, 1354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_MSISDN_DONE)); 1355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Record number is subscriber profile 1358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFLinearFixed(EF_MBI, 1, obtainMessage(EVENT_GET_MBI_DONE)); 1359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_AD, obtainMessage(EVENT_GET_AD_DONE)); 1362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Record number is subscriber profile 1365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFLinearFixed(EF_MWIS, 1, obtainMessage(EVENT_GET_MWIS_DONE)); 1366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Also load CPHS-style voice mail indicator, which stores 1370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // the same info as EF[MWIS]. If both exist, both are updated 1371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // but the EF[MWIS] data is preferred 1372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Please note this must be loaded after EF[MWIS] 1373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent( 1374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_VOICE_MAIL_INDICATOR_CPHS, 1375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE)); 1376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Same goes for Call Forward Status indicator: fetch both 1379c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // EF[CFIS] and CPHS-EF, with EF[CFIS] preferred. 1380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFLinearFixed(EF_CFIS, 1, obtainMessage(EVENT_GET_CFIS_DONE)); 1381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_CFF_CPHS, obtainMessage(EVENT_GET_CFF_DONE)); 1383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville getSpnFsm(true, null); 1387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_SPDI, obtainMessage(EVENT_GET_SPDI_DONE)); 1389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1390c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFLinearFixed(EF_PNN, 1, obtainMessage(EVENT_GET_PNN_DONE)); 1392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_SST, obtainMessage(EVENT_GET_SST_DONE)); 1395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_INFO_CPHS, obtainMessage(EVENT_GET_INFO_CPHS_DONE)); 1398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 14002f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim mFh.loadEFTransparent(EF_CSP_CPHS, obtainMessage(EVENT_GET_CSP_CPHS_DONE)); 14012f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim recordsToLoad++; 14022f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim 14032f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim mFh.loadEFTransparent(EF_GID1, obtainMessage(EVENT_GET_GID1_DONE)); 1404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // XXX should seek instead of examining them all 1407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (false) { // XXX 1408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFLinearFixedAll(EF_SMS, obtainMessage(EVENT_GET_ALL_SMS_DONE)); 1409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (CRASH_RIL) { 1413c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String sms = "0107912160130310f20404d0110041007030208054832b0120" 1414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" 1415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" 1416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" 1417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" 1418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "ffffffffffffffffffffffffffffff"; 1419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] ba = IccUtils.hexStringToBytes(sms); 1420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.updateEFLinearFixed(EF_SMS, 1, ba, null, 1422c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_MARK_SMS_READ_DONE, 1)); 1423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("fetchSimRecords " + recordsToLoad + " requested: " + recordsRequested); 1425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1426c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1427c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Returns the SpnDisplayRule based on settings on the SIM and the 1429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * specified plmn (currently-registered PLMN). See TS 22.101 Annex A 1430c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and TS 51.011 10.3.11 for details. 1431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 14322bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapati * If the SPN is not found on the SIM or is empty, the rule is 14332bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapati * always PLMN_ONLY. 1434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1435c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 1436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public int getDisplayRule(String plmn) { 1437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int rule; 14382bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapati if (TextUtils.isEmpty(spn) || spnDisplayCondition == -1) { 14392bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapati // No EF_SPN content was found on the SIM, or not yet loaded. Just show ONS. 1440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville rule = SPN_RULE_SHOW_PLMN; 1441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (isOnMatchingPlmn(plmn)) { 1442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville rule = SPN_RULE_SHOW_SPN; 1443c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if ((spnDisplayCondition & 0x01) == 0x01) { 1444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ONS required when registered to HPLMN or PLMN in EF_SPDI 1445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville rule |= SPN_RULE_SHOW_PLMN; 1446c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1447c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1448c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville rule = SPN_RULE_SHOW_PLMN; 1449c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if ((spnDisplayCondition & 0x02) == 0x00) { 1450c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // SPN required if not registered to HPLMN or PLMN in EF_SPDI 1451c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville rule |= SPN_RULE_SHOW_SPN; 1452c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1453c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1454c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return rule; 1455c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1456c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1457c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Checks if plmn is HPLMN or on the spdiNetworks list. 1459c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean isOnMatchingPlmn(String plmn) { 1461c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (plmn == null) return false; 1462c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1463c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (plmn.equals(getOperatorNumeric())) { 1464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 1465c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (spdiNetworks != null) { 1468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (String spdiNet : spdiNetworks) { 1469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (plmn.equals(spdiNet)) { 1470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 1471c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1474c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return false; 1475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * States of Get SPN Finite State Machine which only used by getSpnFsm() 1479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private enum Get_Spn_Fsm_State { 1481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville IDLE, // No initialized 1482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville INIT, // Start FSM 1483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville READ_SPN_3GPP, // Load EF_SPN firstly 1484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville READ_SPN_CPHS, // Load EF_SPN_CPHS secondly 1485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville READ_SPN_SHORT_CPHS // Load EF_SPN_SHORT_CPHS last 1486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Finite State Machine to load Service Provider Name , which can be stored 1490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * in either EF_SPN (3GPP), EF_SPN_CPHS, or EF_SPN_SHORT_CPHS (CPHS4.2) 1491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 1492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * After starting, FSM will search SPN EFs in order and stop after finding 1493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * the first valid SPN 1494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 1495c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * If the FSM gets restart while waiting for one of 1496c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * SPN EFs results (i.e. a SIM refresh occurs after issuing 1497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * read EF_CPHS_SPN), it will re-initialize only after 1498c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * receiving and discarding the unfinished SPN EF result. 1499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 1500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param start set true only for initialize loading 1501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param ar the AsyncResult from loadEFTransparent 1502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ar.exception holds exception in error 1503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ar.result is byte[] for data in success 1504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1505c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void getSpnFsm(boolean start, AsyncResult ar) { 1506c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] data; 1507c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1508c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (start) { 1509c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Check previous state to see if there is outstanding 1510c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // SPN read 1511c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if(spnState == Get_Spn_Fsm_State.READ_SPN_3GPP || 1512c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spnState == Get_Spn_Fsm_State.READ_SPN_CPHS || 1513c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spnState == Get_Spn_Fsm_State.READ_SPN_SHORT_CPHS || 1514c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spnState == Get_Spn_Fsm_State.INIT) { 1515c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Set INIT then return so the INIT code 1516c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // will run when the outstanding read done. 1517c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spnState = Get_Spn_Fsm_State.INIT; 1518c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 1519c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1520c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spnState = Get_Spn_Fsm_State.INIT; 1521c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1522c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1523c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch(spnState){ 1525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case INIT: 1526c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spn = null; 1527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1528c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_SPN, 1529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_SPN_DONE)); 1530c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spnState = Get_Spn_Fsm_State.READ_SPN_3GPP; 1533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1534c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case READ_SPN_3GPP: 1535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar != null && ar.exception == null) { 1536c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[]) ar.result; 1537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spnDisplayCondition = 0xff & data[0]; 1538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spn = IccUtils.adnStringFieldToString(data, 1, data.length - 1); 1539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1540c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Load EF_SPN: " + spn 1541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + " spnDisplayCondition: " + spnDisplayCondition); 1542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SystemProperties.set(PROPERTY_ICC_OPERATOR_ALPHA, spn); 1543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spnState = Get_Spn_Fsm_State.IDLE; 1545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent( EF_SPN_CPHS, 1547c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_SPN_DONE)); 1548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spnState = Get_Spn_Fsm_State.READ_SPN_CPHS; 1551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // See TS 51.011 10.3.11. Basically, default to 1553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // show PLMN always, and SPN also if roaming. 1554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spnDisplayCondition = -1; 1555c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case READ_SPN_CPHS: 1558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar != null && ar.exception == null) { 1559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[]) ar.result; 15609386a53046f7cb9137b958c8d255306248c881cdJohan Redestig spn = IccUtils.adnStringFieldToString(data, 0, data.length); 1561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Load EF_SPN_CPHS: " + spn); 1563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SystemProperties.set(PROPERTY_ICC_OPERATOR_ALPHA, spn); 1564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spnState = Get_Spn_Fsm_State.IDLE; 1566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent( 1568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_SPN_SHORT_CPHS, obtainMessage(EVENT_GET_SPN_DONE)); 1569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville recordsToLoad++; 1570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spnState = Get_Spn_Fsm_State.READ_SPN_SHORT_CPHS; 1572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case READ_SPN_SHORT_CPHS: 1575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar != null && ar.exception == null) { 1576c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[]) ar.result; 15779386a53046f7cb9137b958c8d255306248c881cdJohan Redestig spn = IccUtils.adnStringFieldToString(data, 0, data.length); 1578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Load EF_SPN_SHORT_CPHS: " + spn); 1580c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SystemProperties.set(PROPERTY_ICC_OPERATOR_ALPHA, spn); 1581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville }else { 1582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("No SPN loaded in either CHPS or 3GPP"); 1583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spnState = Get_Spn_Fsm_State.IDLE; 1586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 1588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spnState = Get_Spn_Fsm_State.IDLE; 1589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Parse TS 51.011 EF[SPDI] record 1594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * This record contains the list of numeric network IDs that 1595c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * are treated specially when determining SPN display 1596c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 1598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parseEfSpdi(byte[] data) { 1599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SimTlv tlv = new SimTlv(data, 0, data.length); 1600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1601c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] plmnEntries = null; 1602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for ( ; tlv.isValidObject() ; tlv.nextObject()) { 1604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Skip SPDI tag, if existant 1605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (tlv.getTag() == TAG_SPDI) { 1606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville tlv = new SimTlv(tlv.getData(), 0, tlv.getData().length); 1607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // There should only be one TAG_SPDI_PLMN_LIST 1609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (tlv.getTag() == TAG_SPDI_PLMN_LIST) { 1610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville plmnEntries = tlv.getData(); 1611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (plmnEntries == null) { 1616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 1617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spdiNetworks = new ArrayList<String>(plmnEntries.length / 3); 1620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (int i = 0 ; i + 2 < plmnEntries.length ; i += 3) { 1622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String plmnCode; 1623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville plmnCode = IccUtils.bcdToString(plmnEntries, i, 3); 1624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Valid operator codes are 5 or 6 digits 1626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (plmnCode.length() >= 5) { 1627c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("EF_SPDI network: " + plmnCode); 1628c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville spdiNetworks.add(plmnCode); 1629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1632c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1633c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * check to see if Mailbox Number is allocated and activated in CPHS SST 1635c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean isCphsMailboxEnabled() { 1637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mCphsInfo == null) return false; 1638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return ((mCphsInfo[1] & CPHS_SST_MBN_MASK) == CPHS_SST_MBN_ENABLED ); 1639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1641c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void log(String s) { 1642ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "[SIMRecords] " + s); 1643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void loge(String s) { 1646ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.e(LOG_TAG, "[SIMRecords] " + s); 1647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void logw(String s, Throwable tr) { 1650ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.w(LOG_TAG, "[SIMRecords] " + s, tr); 1651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void logv(String s) { 1654ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.v(LOG_TAG, "[SIMRecords] " + s); 1655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Return true if "Restriction of menu options for manual PLMN selection" 1659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * bit is set or EF_CSP data is unavailable, return false otherwise. 1660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public boolean isCspPlmnEnabled() { 1662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return mCspPlmnEnabled; 1663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Parse EF_CSP data and check if 1667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * "Restriction of menu options for manual PLMN selection" is 1668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Enabled/Disabled 1669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 1670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param data EF_CSP hex data. 1671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void handleEfCspData(byte[] data) { 1673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // As per spec CPHS4_2.WW6, CPHS B.4.7.1, EF_CSP contains CPHS defined 1674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 18 bytes (i.e 9 service groups info) and additional data specific to 1675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // operator. The valueAddedServicesGroup is not part of standard 1676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // services. This is operator specific and can be programmed any where. 1677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Normally this is programmed as 10th service after the standard 1678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // services. 1679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int usedCspGroups = data.length / 2; 1680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // This is the "Servive Group Number" of "Value Added Services Group". 1681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte valueAddedServicesGroup = (byte)0xC0; 1682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCspPlmnEnabled = true; 1684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (int i = 0; i < usedCspGroups; i++) { 1685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (data[2 * i] == valueAddedServicesGroup) { 1686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("[CSP] found ValueAddedServicesGroup, value " + data[(2 * i) + 1]); 1687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if ((data[(2 * i) + 1] & 0x80) == 0x80) { 1688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Bit 8 is for 1689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // "Restriction of menu options for manual PLMN selection". 1690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Operator Selection menu should be enabled. 1691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCspPlmnEnabled = true; 1692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCspPlmnEnabled = false; 1694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Operator Selection menu should be disabled. 1695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Operator Selection Mode should be set to Automatic. 1696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("[CSP] Set Automatic Network Selection"); 1697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mNetworkSelectionModeAutomaticRegistrants.notifyRegistrants(); 1698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 1700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("[CSP] Value Added Service Group (0xC0), not found!"); 1704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 170505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka 170605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka @Override 170705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 170805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println("SIMRecords: " + this); 170905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" extends:"); 171005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka super.dump(fd, pw, args); 171105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mVmConfig=" + mVmConfig); 171205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mSpnOverride=" + mSpnOverride); 171305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" callForwardingEnabled=" + callForwardingEnabled); 171405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" spnState=" + spnState); 171505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mCphsInfo=" + mCphsInfo); 171605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mCspPlmnEnabled=" + mCspPlmnEnabled); 171705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" efMWIS[]=" + Arrays.toString(efMWIS)); 171805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" efCPHS_MWI[]=" + Arrays.toString(efCPHS_MWI)); 171905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mEfCff[]=" + Arrays.toString(mEfCff)); 172005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mEfCfis[]=" + Arrays.toString(mEfCfis)); 172105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" spnDisplayCondition=" + spnDisplayCondition); 172205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" spdiNetworks[]=" + spdiNetworks); 172305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" pnnHomeName=" + pnnHomeName); 172405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mUsimServiceTable=" + mUsimServiceTable); 17252f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim pw.println(" gid1=" + gid1); 172605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.flush(); 172705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 17282f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim} 1729