SIMRecords.java revision 6bc4098827f3070a44b5e51508b455d7c7be9c07
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.Message; 25c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.SystemProperties; 26a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.TelephonyManager; 2731ae682ff511ddde4073c3f94eff15da2f7fade6Wink Savilleimport android.telephony.PhoneNumberUtils; 28a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hambyimport android.telephony.SmsMessage; 292bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapatiimport android.text.TextUtils; 3099c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog; 31c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 32c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.CommandsInterface; 33c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.MccTable; 34a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hambyimport com.android.internal.telephony.SmsConstants; 35d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.gsm.SimTlv; 36c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 3705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.FileDescriptor; 3805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.PrintWriter; 39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.ArrayList; 4005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.util.Arrays; 41c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 42c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/** 43c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide} 44c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 45c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic class SIMRecords extends IccRecords { 46cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville protected static final String LOG_TAG = "SIMRecords"; 47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final boolean CRASH_RIL = false; 49c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 50c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Instance Variables 51c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 52c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville VoiceMailConstants mVmConfig; 53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 54c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 55c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SpnOverride mSpnOverride; 56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Cached SIM State; cleared on channel close 58c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville private boolean mCallForwardingEnabled; 60c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 61c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 62c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 63c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * States only used by getSpnFsm FSM 64c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 6522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville private GetSpnFsmState mSpnState; 66c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 67c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** CPHS service information (See CPHS 4.2 B.3.1.1) 68c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * It will be set in onSimReady if reading GET_CPHS_INFO successfully 69c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * mCphsInfo[0] is CPHS Phase 70c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * mCphsInfo[1] and mCphsInfo[2] is CPHS Service Table 71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 72c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private byte[] mCphsInfo = null; 73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean mCspPlmnEnabled = true; 74c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 7522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville byte[] mEfMWIS = null; 7622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville byte[] mEfCPHS_MWI =null; 77c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] mEfCff = null; 78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] mEfCfis = null; 79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville int mSpnDisplayCondition; 82c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Numeric network codes listed in TS 51.011 EF[SPDI] 8322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville ArrayList<String> mSpdiNetworks = null; 84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville String mPnnHomeName = null; 86c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville UsimServiceTable mUsimServiceTable; 88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 89f92cb4bd5519427a0db673709d94683a8baf203aWink Saville @Override 90f92cb4bd5519427a0db673709d94683a8baf203aWink Saville public String toString() { 91f92cb4bd5519427a0db673709d94683a8baf203aWink Saville return "SimRecords: " + super.toString() 92f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mVmConfig" + mVmConfig 93f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mSpnOverride=" + "mSpnOverride" 9422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " callForwardingEnabled=" + mCallForwardingEnabled 9522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " spnState=" + mSpnState 96f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mCphsInfo=" + mCphsInfo 97f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mCspPlmnEnabled=" + mCspPlmnEnabled 9822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " efMWIS=" + mEfMWIS 9922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " efCPHS_MWI=" + mEfCPHS_MWI 100f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mEfCff=" + mEfCff 101f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mEfCfis=" + mEfCfis 102f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " getOperatorNumeric=" + getOperatorNumeric(); 103f92cb4bd5519427a0db673709d94683a8baf203aWink Saville } 104f92cb4bd5519427a0db673709d94683a8baf203aWink Saville 105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Constants 106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // From TS 51.011 EF[SPDI] section 108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int TAG_SPDI = 0xA3; 109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int TAG_SPDI_PLMN_LIST = 0x80; 110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Full Name IEI from TS 24.008 112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int TAG_FULL_NETWORK_NAME = 0x43; 113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Short Name IEI from TS 24.008 115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int TAG_SHORT_NETWORK_NAME = 0x45; 116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // active CFF from CPHS 4.2 B.4.5 118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int CFF_UNCONDITIONAL_ACTIVE = 0x0a; 119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int CFF_UNCONDITIONAL_DEACTIVE = 0x05; 120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int CFF_LINE1_MASK = 0x0f; 121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int CFF_LINE1_RESET = 0xf0; 122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // CPHS Service Table (See CPHS 4.2 B.3.1) 124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int CPHS_SST_MBN_MASK = 0x30; 125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int CPHS_SST_MBN_ENABLED = 0x30; 126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 12731ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville // EF_CFIS related constants 12831ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville // Spec reference TS 51.011 section 10.3.46. 12931ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville private static final int CFIS_BCD_NUMBER_LENGTH_OFFSET = 2; 13031ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville private static final int CFIS_TON_NPI_OFFSET = 3; 13131ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville private static final int CFIS_ADN_CAPABILITY_ID_OFFSET = 14; 13231ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville private static final int CFIS_ADN_EXTENSION_ID_OFFSET = 15; 13331ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville 134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Event Constants 135e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_GET_IMSI_DONE = 3; 136e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private static final int EVENT_GET_ICCID_DONE = 4; 137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_MBI_DONE = 5; 138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_MBDN_DONE = 6; 139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_MWIS_DONE = 7; 140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE = 8; 141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected static final int EVENT_GET_AD_DONE = 9; // Admin data on SIM 142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected static final int EVENT_GET_MSISDN_DONE = 10; 143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_CPHS_MAILBOX_DONE = 11; 144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_SPN_DONE = 12; 145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_SPDI_DONE = 13; 146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_UPDATE_DONE = 14; 147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_PNN_DONE = 15; 148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected static final int EVENT_GET_SST_DONE = 17; 149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_ALL_SMS_DONE = 18; 150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_MARK_SMS_READ_DONE = 19; 151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_SET_MBDN_DONE = 20; 152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_SMS_ON_SIM = 21; 153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_SMS_DONE = 22; 154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_CFF_DONE = 24; 155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_SET_CPHS_MAILBOX_DONE = 25; 156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_INFO_CPHS_DONE = 26; 157cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // private static final int EVENT_SET_MSISDN_DONE = 30; Defined in IccRecords as 30 158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_SIM_REFRESH = 31; 159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_CFIS_DONE = 32; 160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_CSP_CPHS_DONE = 33; 1612f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim private static final int EVENT_GET_GID1_DONE = 34; 162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Lookup table for carriers known to produce SIMs which incorrectly indicate MNC length. 164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final String[] MCCMNC_CODES_HAVING_3DIGITS_MNC = { 1660530f592d89c1eceea7ee5bccb2359061a04f968duho.ro "302370", "302720", "310260", 167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405025", "405026", "405027", "405028", "405029", "405030", "405031", "405032", 168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405033", "405034", "405035", "405036", "405037", "405038", "405039", "405040", 169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405041", "405042", "405043", "405044", "405045", "405046", "405047", "405750", 170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405751", "405752", "405753", "405754", "405755", "405756", "405799", "405800", 171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405801", "405802", "405803", "405804", "405805", "405806", "405807", "405808", 172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405809", "405810", "405811", "405812", "405813", "405814", "405815", "405816", 173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405817", "405818", "405819", "405820", "405821", "405822", "405823", "405824", 174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405825", "405826", "405827", "405828", "405829", "405830", "405831", "405832", 175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405833", "405834", "405835", "405836", "405837", "405838", "405839", "405840", 176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405841", "405842", "405843", "405844", "405845", "405846", "405847", "405848", 177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405849", "405850", "405851", "405852", "405853", "405875", "405876", "405877", 178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405878", "405879", "405880", "405881", "405882", "405883", "405884", "405885", 179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405886", "405908", "405909", "405910", "405911", "405912", "405913", "405914", 180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405915", "405916", "405917", "405918", "405919", "405920", "405921", "405922", 181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "405923", "405924", "405925", "405926", "405927", "405928", "405929", "405930", 1820530f592d89c1eceea7ee5bccb2359061a04f968duho.ro "405931", "405932", "502142", "502143", "502145", "502146", "502147", "502148" 183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville }; 184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Constructor 186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 187e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public SIMRecords(UiccCardApplication app, Context c, CommandsInterface ci) { 188e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka super(app, c, ci); 189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 19022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAdnCache = new AdnRecordCache(mFh); 191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mVmConfig = new VoiceMailConstants(); 193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mSpnOverride = new SpnOverride(); 194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 19522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsRequested = false; // No load request is made till SIM ready 196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // recordsToLoad is set to 0 because no requests are made yet 19822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad = 0; 199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.setOnSmsOnSim(this, EVENT_SMS_ON_SIM, null); 201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.registerForIccRefresh(this, EVENT_SIM_REFRESH, null); 202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Start off by setting empty state 204e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka resetRecords(); 205e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mParentApp.registerForReady(this, EVENT_APP_READY, null); 206f92cb4bd5519427a0db673709d94683a8baf203aWink Saville if (DBG) log("SIMRecords X ctor this=" + this); 207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dispose() { 211f92cb4bd5519427a0db673709d94683a8baf203aWink Saville if (DBG) log("Disposing SIMRecords this=" + this); 212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //Unregister for all events 213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.unregisterForIccRefresh(this); 214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.unSetOnSmsOnSim(this); 215e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mParentApp.unregisterForReady(this); 216e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka resetRecords(); 217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville super.dispose(); 218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 220cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void finalize() { 222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if(DBG) log("finalized"); 223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 225e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka protected void resetRecords() { 226e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mImsi = null; 22722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMsisdn = null; 22822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mVoiceMailNum = null; 22922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCountVoiceMessages = 0; 23022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMncLength = UNINITIALIZED; 231a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("setting0 mMncLength" + mMncLength); 232b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville mIccId = null; 233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // -1 means no EF_SPN found; treat accordingly. 23422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpnDisplayCondition = -1; 23522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mEfMWIS = null; 23622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mEfCPHS_MWI = null; 23722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpdiNetworks = null; 23822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPnnHomeName = null; 239620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt mGid1 = null; 240c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 24122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAdnCache.reset(); 242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("SIMRecords: onRadioOffOrNotAvailable set 'gsm.sim.operator.numeric' to operator=null"); 244a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("update icc_operator_numeric=" + null); 245a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setSystemProperty(PROPERTY_ICC_OPERATOR_NUMERIC, null); 246a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, null); 247a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, null); 248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // recordsRequested is set to false indicating that the SIM 250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // read requests made so far are not valid. This is set to 251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // true only when fresh set of read requests are made. 25222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsRequested = false; 253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Public Methods 257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@inheritDoc} 260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getIMSI() { 263e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mImsi; 264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 266cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getMsisdnNumber() { 26822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mMsisdn; 269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 2722f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim public String getGid1() { 273620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt return mGid1; 2742f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim } 2752f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim 2762f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim @Override 277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public UsimServiceTable getUsimServiceTable() { 278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return mUsimServiceTable; 279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Set subscriber number to SIM record 283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * The subscriber number is stored in EF_MSISDN (TS 51.011) 285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * When the operation is complete, onComplete will be sent to its handler 287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param alphaTag alpha-tagging of the dailing nubmer (up to 10 characters) 289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param number dailing nubmer (up to 20 digits) 290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * if the number starts with '+', then set to international TOA 291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param onComplete 292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * onComplete.obj will be an AsyncResult 293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ((AsyncResult)onComplete.obj).exception == null on success 294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ((AsyncResult)onComplete.obj).exception != null on fail 295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 296cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void setMsisdnNumber(String alphaTag, String number, 298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message onComplete) { 299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 3006bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // If the SIM card is locked by PIN, we will set EF_MSISDN fail. 3016bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // In that case, msisdn and msisdnTag should not be update. 3026bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville mNewMsisdn = number; 3036bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville mNewMsisdnTag = alphaTag; 304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 3056bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if(DBG) log("Set MSISDN: " + mNewMsisdnTag + " " + /*mNewMsisdn*/ "xxxxxxx"); 306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 3086bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville AdnRecord adn = new AdnRecord(mNewMsisdnTag, mNewMsisdn); 309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).updateEF(adn, EF_MSISDN, EF_EXT1, 1, null, 311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_SET_MSISDN_DONE, onComplete)); 312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 314cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getMsisdnAlphaTag() { 31622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mMsisdnTag; 317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 319cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getVoiceMailNumber() { 32122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mVoiceMailNum; 322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Set voice mail number to SIM record 326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * The voice mail number can be stored either in EF_MBDN (TS 51.011) or 328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * EF_MAILBOX_CPHS (CPHS 4.2) 329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * If EF_MBDN is available, store the voice mail number to EF_MBDN 331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * If EF_MAILBOX_CPHS is enabled, store the voice mail number to EF_CHPS 333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * So the voice mail number will be stored in both EFs if both are available 335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Return error only if both EF_MBDN and EF_MAILBOX_CPHS fail. 337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * When the operation is complete, onComplete will be sent to its handler 339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param alphaTag alpha-tagging of the dailing nubmer (upto 10 characters) 341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param voiceNumber dailing nubmer (upto 20 digits) 342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * if the number is start with '+', then set to international TOA 343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param onComplete 344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * onComplete.obj will be an AsyncResult 345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ((AsyncResult)onComplete.obj).exception == null on success 346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ((AsyncResult)onComplete.obj).exception != null on fail 347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 348cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void setVoiceMailNumber(String alphaTag, String voiceNumber, 350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message onComplete) { 35122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mIsVoiceMailFixed) { 352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult.forMessage((onComplete)).exception = 353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new IccVmFixedException("Voicemail number is fixed by operator"); 354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onComplete.sendToTarget(); 355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 35822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNewVoiceMailNum = voiceNumber; 35922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNewVoiceMailTag = alphaTag; 360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 36122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville AdnRecord adn = new AdnRecord(mNewVoiceMailTag, mNewVoiceMailNum); 362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 36322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mMailboxIndex != 0 && mMailboxIndex != 0xff) { 364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).updateEF(adn, EF_MBDN, EF_EXT6, 36622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMailboxIndex, null, 367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_SET_MBDN_DONE, onComplete)); 368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (isCphsMailboxEnabled()) { 370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).updateEF(adn, EF_MAILBOX_CPHS, 372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_EXT1, 1, null, 373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_SET_CPHS_MAILBOX_DONE, onComplete)); 374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult.forMessage((onComplete)).exception = 377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new IccVmNotSupportedException("Update SIM voice mailbox error"); 378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onComplete.sendToTarget(); 379c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 382cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getVoiceMailAlphaTag() 384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville { 38522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mVoiceMailTag; 386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Sets the SIM voice message waiting indicator records 390c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param line GSM Subscriber Profile Number, one-based. Only '1' is supported 391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param countWaiting The number of messages waiting, if known. Use 392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * -1 to indicate that an unknown number of 393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * messages are waiting 394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 395cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void 397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setVoiceMessageWaiting(int line, int countWaiting) { 398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (line != 1) { 399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // only profile 1 is supported 400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // range check 404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (countWaiting < 0) { 405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville countWaiting = -1; 406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (countWaiting > 0xff) { 407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // TS 23.040 9.2.3.24.2 408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // "The value 255 shall be taken to mean 255 or greater" 409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville countWaiting = 0xff; 410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 41222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCountVoiceMessages = countWaiting; 413c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRecordsEventsRegistrants.notifyResult(EVENT_MWI); 415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 41722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mEfMWIS != null) { 418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // TS 51.011 10.3.45 419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // lsb of byte 0 is 'voicemail' status 42122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mEfMWIS[0] = (byte)((mEfMWIS[0] & 0xfe) 42222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville | (mCountVoiceMessages == 0 ? 0 : 1)); 423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // byte 1 is the number of voice messages waiting 425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (countWaiting < 0) { 426c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The spec does not define what this should be 427c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // if we don't know the count 42822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mEfMWIS[1] = 0; 429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 43022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mEfMWIS[1] = (byte) countWaiting; 431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 432c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.updateEFLinearFixed( 43422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville EF_MWIS, 1, mEfMWIS, null, 435c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage (EVENT_UPDATE_DONE, EF_MWIS)); 436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 43822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mEfCPHS_MWI != null) { 439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Refer CPHS4_2.WW6 B4.2.3 44022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mEfCPHS_MWI[0] = (byte)((mEfCPHS_MWI[0] & 0xf0) 44122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville | (mCountVoiceMessages == 0 ? 0x5 : 0xa)); 442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 443c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.updateEFTransparent( 44422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville EF_VOICE_MAIL_INDICATOR_CPHS, mEfCPHS_MWI, 445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage (EVENT_UPDATE_DONE, EF_VOICE_MAIL_INDICATOR_CPHS)); 446c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 447c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (ArrayIndexOutOfBoundsException ex) { 448c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville logw("Error saving voice mail state to SIM. Probably malformed SIM record", ex); 449c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 450c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 451c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 452a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville // Validate data is !null and the MSP (Multiple Subscriber Profile) 453a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville // byte is between 1 and 4. See ETSI TS 131 102 v11.3.0 section 4.2.64. 454a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville private boolean validEfCfis(byte[] data) { 455a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville return ((data != null) && (data[0] >= 1) && (data[0] <= 4)); 456a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville } 457a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville 458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 459c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@inheritDoc} 460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 461c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 462c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public boolean getVoiceCallForwardingFlag() { 46322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mCallForwardingEnabled; 464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 465c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@inheritDoc} 468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 47031ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville public void setVoiceCallForwardingFlag(int line, boolean enable, String dialNumber) { 471c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (line != 1) return; // only line 1 is supported 473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 47422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCallForwardingEnabled = enable; 475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRecordsEventsRegistrants.notifyResult(EVENT_CFI); 477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 479a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville if (validEfCfis(mEfCfis)) { 480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // lsb is of byte 1 is voice status 481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (enable) { 482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mEfCfis[1] |= 1; 483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mEfCfis[1] &= 0xfe; 485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 487a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville log("setVoiceCallForwardingFlag: enable=" + enable 488a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville + " mEfCfis=" + IccUtils.bytesToHexString(mEfCfis)); 489a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville 49031ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville // Update dialNumber if not empty and CFU is enabled. 49131ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville // Spec reference for EF_CFIS contents, TS 51.011 section 10.3.46. 49231ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville if (enable && !TextUtils.isEmpty(dialNumber)) { 49331ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville log("EF_CFIS: updating cf number, " + dialNumber); 49431ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville byte[] bcdNumber = PhoneNumberUtils.numberToCalledPartyBCD(dialNumber); 49531ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville 49631ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville System.arraycopy(bcdNumber, 0, mEfCfis, CFIS_TON_NPI_OFFSET, bcdNumber.length); 49731ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville 49831ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville mEfCfis[CFIS_BCD_NUMBER_LENGTH_OFFSET] = (byte) (bcdNumber.length); 49931ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville mEfCfis[CFIS_ADN_CAPABILITY_ID_OFFSET] = (byte) 0xFF; 50031ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville mEfCfis[CFIS_ADN_EXTENSION_ID_OFFSET] = (byte) 0xFF; 50131ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville } 502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.updateEFLinearFixed( 504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_CFIS, 1, mEfCfis, null, 505c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage (EVENT_UPDATE_DONE, EF_CFIS)); 506a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville } else { 507a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville log("setVoiceCallForwardingFlag: ignoring enable=" + enable 508a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville + " invalid mEfCfis=" + IccUtils.bytesToHexString(mEfCfis)); 509c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 510c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 511c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mEfCff != null) { 512c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (enable) { 513c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mEfCff[0] = (byte) ((mEfCff[0] & CFF_LINE1_RESET) 514c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville | CFF_UNCONDITIONAL_ACTIVE); 515c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 516c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mEfCff[0] = (byte) ((mEfCff[0] & CFF_LINE1_RESET) 517c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville | CFF_UNCONDITIONAL_DEACTIVE); 518c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 519c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 520c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.updateEFTransparent( 521c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_CFF_CPHS, mEfCff, 522c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage (EVENT_UPDATE_DONE, EF_CFF_CPHS)); 523c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (ArrayIndexOutOfBoundsException ex) { 525e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby logw("Error saving call forwarding flag to SIM. " 526c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "Probably malformed SIM record", ex); 527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 528c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 530c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called by STK Service when REFRESH is received. 533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param fileChanged indicates whether any files changed 534c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param fileList if non-null, a list of EF files that changed 535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 536cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void onRefresh(boolean fileChanged, int[] fileList) { 538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (fileChanged) { 539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // A future optimization would be to inspect fileList and 540c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // only reload those files that we care about. For now, 541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // just re-fetch all SIM records that we cache. 542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fetchSimRecords(); 543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 547c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@inheritDoc} 548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getOperatorNumeric() { 551e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mImsi == null) { 552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("getOperatorNumeric: IMSI == null"); 553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return null; 554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 55522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mMncLength == UNINITIALIZED || mMncLength == UNKNOWN) { 556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("getSIMOperatorNumeric: bad mncLength"); 557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return null; 558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 560c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Length = length of MCC + length of MNC 561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // length of mcc = 3 (TS 23.003 Section 2.2) 56222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mImsi.substring(0, 3 + mMncLength); 563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Overridden from Handler 566cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void handleMessage(Message msg) { 568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult ar; 569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AdnRecord adn; 570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte data[]; 572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean isRecordLoadResponse = false; 574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 575bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka if (mDestroyed.get()) { 576c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("Received message " + msg + "[" + msg.what + "] " + 577c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville " while being destroyed. Ignoring."); 578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 580c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { switch (msg.what) { 582e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_APP_READY: 583e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onReady(); 584e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /* IO events */ 587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_IMSI_DONE: 588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("Exception querying IMSI, Exception:" + ar.exception); 594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 595c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 596c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 597e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mImsi = (String) ar.result; 598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // IMSI (MCC+MNC+MSIN) is at least 6 digits, but not more 600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // than 15 (and usually 15). 601e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mImsi != null && (mImsi.length() < 6 || mImsi.length() > 15)) { 602e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka loge("invalid IMSI " + mImsi); 603e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mImsi = null; 604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 606a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("IMSI: mMncLength=" + mMncLength); 607a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("IMSI: " + mImsi.substring(0, 6) + "xxxxxxx"); 608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 60922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (((mMncLength == UNKNOWN) || (mMncLength == 2)) && 610e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ((mImsi != null) && (mImsi.length() >= 6))) { 611e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka String mccmncCode = mImsi.substring(0, 6); 612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (String mccmnc : MCCMNC_CODES_HAVING_3DIGITS_MNC) { 613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mccmnc.equals(mccmncCode)) { 61422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMncLength = 3; 615a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("IMSI: setting1 mMncLength=" + mMncLength); 616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 62122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mMncLength == UNKNOWN) { 622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // the SIM has told us all it knows, but it didn't know the mnc length. 623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // guess using the mcc 624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 625e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int mcc = Integer.parseInt(mImsi.substring(0,3)); 62622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMncLength = MccTable.smallestDigitsMccForMnc(mcc); 627a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("setting2 mMncLength=" + mMncLength); 628c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (NumberFormatException e) { 62922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMncLength = UNKNOWN; 630a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("Corrupt IMSI! setting3 mMncLength=" + mMncLength); 631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 632c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 633c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 63422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mMncLength != UNKNOWN && mMncLength != UNINITIALIZED) { 635a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("update mccmnc=" + mImsi.substring(0, 3 + mMncLength)); 636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // finally have both the imsi and the mncLength and can parse the imsi properly 637b0b637dbf2a67c0e7eee917c0809f1cc54983986Robert Greenwalt MccTable.updateMccMncConfiguration(mContext, 638b0b637dbf2a67c0e7eee917c0809f1cc54983986Robert Greenwalt mImsi.substring(0, 3 + mMncLength), false); 639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 640e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mImsiReadyRegistrants.notifyRegistrants(); 641c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_MBI_DONE: 644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean isValidMbdn; 645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[]) ar.result; 649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isValidMbdn = false; 651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception == null) { 652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Refer TS 51.011 Section 10.3.44 for content details 653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("EF_MBI: " + IccUtils.bytesToHexString(data)); 654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Voice mail record number stored first 65622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMailboxIndex = data[0] & 0xff; 657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // check if dailing numbe id valid 65922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mMailboxIndex != 0 && mMailboxIndex != 0xff) { 660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("Got valid mailbox number for MBDN"); 661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isValidMbdn = true; 662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // one more record to load 66622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad += 1; 667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (isValidMbdn) { 669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Note: MBDN was not included in NUM_OF_SIM_RECORDS_LOADED 670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).loadFromEF(EF_MBDN, EF_EXT6, 67122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMailboxIndex, obtainMessage(EVENT_GET_MBDN_DONE)); 672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If this EF not present, try mailbox as in CPHS standard 674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // CPHS (CPHS4_2.WW6) is a european standard. 675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).loadFromEF(EF_MAILBOX_CPHS, 676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_EXT1, 1, 677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE)); 678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_CPHS_MAILBOX_DONE: 682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_MBDN_DONE: 683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //Resetting the voice mail number and voice mail tag to null 684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //as these should be updated from the data read from EF_MBDN. 685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //If they are not reset, incase of invalid data/exception these 686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //variables are retaining their previous values and are 687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //causing invalid voice mailbox info display to user. 68822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mVoiceMailNum = null; 68922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mVoiceMailTag = null; 690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("Invalid or missing EF" 697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + ((msg.what == EVENT_GET_CPHS_MAILBOX_DONE) ? "[MAILBOX]" : "[MBDN]")); 698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Bug #645770 fall back to CPHS 700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // FIXME should use SST to decide 701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (msg.what == EVENT_GET_MBDN_DONE) { 703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //load CPHS on fail... 704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // FIXME right now, only load line1's CPHS voice mail entry 705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 70622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad += 1; 707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).loadFromEF( 708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_MAILBOX_CPHS, EF_EXT1, 1, 709c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE)); 710c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 714c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville adn = (AdnRecord)ar.result; 715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("VM: " + adn + 717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ((msg.what == EVENT_GET_CPHS_MAILBOX_DONE) ? " EF[MAILBOX]" : " EF[MBDN]")); 718c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (adn.isEmpty() && msg.what == EVENT_GET_MBDN_DONE) { 720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Bug #645770 fall back to CPHS 721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // FIXME should use SST to decide 722c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // FIXME right now, only load line1's CPHS voice mail entry 72322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad += 1; 724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).loadFromEF( 725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_MAILBOX_CPHS, EF_EXT1, 1, 726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE)); 727c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 728c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 729c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 730c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 73122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mVoiceMailNum = adn.getNumber(); 73222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mVoiceMailTag = adn.getAlphaTag(); 733c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 734c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 735c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_MSISDN_DONE: 736c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 740c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 741c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("Invalid or missing EF[MSISDN]"); 742c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 743c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville adn = (AdnRecord)ar.result; 746c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 74722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMsisdn = adn.getNumber(); 74822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMsisdnTag = adn.getAlphaTag(); 749c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 75022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville log("MSISDN: " + /*mMsisdn*/ "xxxxxxx"); 751c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 752c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 753c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_SET_MSISDN_DONE: 754c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = false; 755c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 756c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 7576bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville if (ar.exception == null) { 7586bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville mMsisdn = mNewMsisdn; 7596bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville mMsisdnTag = mNewMsisdnTag; 7606bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville log("Success to update EF[MSISDN]"); 7616bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville } 7626bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville 763c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.userObj != null) { 764c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult.forMessage(((Message) ar.userObj)).exception 765c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville = ar.exception; 766c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ((Message) ar.userObj).sendToTarget(); 767c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 768c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 769c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 770c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_MWIS_DONE: 771c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 772c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 773c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 774c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 775c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 776c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 777c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 778c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 779c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 780c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("EF_MWIS: " + IccUtils.bytesToHexString(data)); 781c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 78222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mEfMWIS = data; 783c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 784c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if ((data[0] & 0xff) == 0xff) { 785c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("Uninitialized record MWIS"); 786c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 787c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 788c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 789c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Refer TS 51.011 Section 10.3.45 for the content description 790c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean voiceMailWaiting = ((data[0] & 0x01) != 0); 79122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCountVoiceMessages = data[1] & 0xff; 792c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 79322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (voiceMailWaiting && mCountVoiceMessages == 0) { 794c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Unknown count = -1 79522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCountVoiceMessages = -1; 796c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 797c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 798c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRecordsEventsRegistrants.notifyResult(EVENT_MWI); 799c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 800c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 801c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE: 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 81122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mEfCPHS_MWI = data; 812c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 813c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Use this data if the EF[MWIS] exists and 814c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // has been loaded 815c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 81622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mEfMWIS == null) { 817cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville int indicator = data[0] & 0xf; 818c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 819c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Refer CPHS4_2.WW6 B4.2.3 820c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (indicator == 0xA) { 821c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Unknown count = -1 82222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCountVoiceMessages = -1; 823c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (indicator == 0x5) { 82422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCountVoiceMessages = 0; 825c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 826c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 827c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRecordsEventsRegistrants.notifyResult(EVENT_MWI); 828c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 829c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 830c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 831c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_ICCID_DONE: 832c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 833c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 834c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 835c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 836c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 837c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 838c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 839c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 840c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 841b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville mIccId = IccUtils.bcdToString(data, 0, data.length); 842c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 843b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville log("iccid: " + mIccId); 844c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 845c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 846c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 847c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 848c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_AD_DONE: 849c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 850c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 851c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 852c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 853c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 854c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 855c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 856c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 857c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 858c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 859c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("EF_AD: " + IccUtils.bytesToHexString(data)); 860c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 861c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (data.length < 3) { 862c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("Corrupt AD data on SIM"); 863c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 864c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 865c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 866c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (data.length == 3) { 867c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("MNC length not present in EF_AD"); 868c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 869c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 870c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 87122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMncLength = data[3] & 0xf; 872a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("setting4 mMncLength=" + mMncLength); 873c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 87422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mMncLength == 0xf) { 87522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMncLength = UNKNOWN; 876a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("setting5 mMncLength=" + mMncLength); 877c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 878c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } finally { 87922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (((mMncLength == UNINITIALIZED) || (mMncLength == UNKNOWN) || 88022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville (mMncLength == 2)) && ((mImsi != null) && (mImsi.length() >= 6))) { 881e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka String mccmncCode = mImsi.substring(0, 6); 882a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("mccmncCode=" + mccmncCode); 883c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (String mccmnc : MCCMNC_CODES_HAVING_3DIGITS_MNC) { 884c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mccmnc.equals(mccmncCode)) { 88522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMncLength = 3; 886a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("setting6 mMncLength=" + mMncLength); 887c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 888c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 889c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 890c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 891c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 89222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mMncLength == UNKNOWN || mMncLength == UNINITIALIZED) { 893e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mImsi != null) { 894c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 895e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int mcc = Integer.parseInt(mImsi.substring(0,3)); 896c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 89722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMncLength = MccTable.smallestDigitsMccForMnc(mcc); 898a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("setting7 mMncLength=" + mMncLength); 899c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (NumberFormatException e) { 90022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMncLength = UNKNOWN; 901a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville loge("Corrupt IMSI! setting8 mMncLength=" + mMncLength); 902c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 903c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 904c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Indicate we got this info, but it didn't contain the length. 90522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMncLength = UNKNOWN; 906a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("MNC length not present in EF_AD setting9 mMncLength=" + mMncLength); 907c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 908c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 90922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mImsi != null && mMncLength != UNKNOWN) { 910c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // finally have both imsi and the length of the mnc and can parse 911c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // the imsi properly 912a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("update mccmnc=" + mImsi.substring(0, 3 + mMncLength)); 913c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville MccTable.updateMccMncConfiguration(mContext, 914b0b637dbf2a67c0e7eee917c0809f1cc54983986Robert Greenwalt mImsi.substring(0, 3 + mMncLength), false); 915c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 916c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 917c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 918c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 919c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_SPN_DONE: 920c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 921c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult) msg.obj; 922c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville getSpnFsm(false, ar); 923c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 924c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 925c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_CFF_DONE: 926c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 927c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 928c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult) msg.obj; 929c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[]) ar.result; 930c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 931c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 932c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 933c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 934c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 935c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("EF_CFF_CPHS: " + IccUtils.bytesToHexString(data)); 936c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mEfCff = data; 937c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 938e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby // if EF_CFIS is valid, prefer it to EF_CFF_CPHS 939e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby if (!validEfCfis(mEfCfis)) { 94022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCallForwardingEnabled = 941c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ((data[0] & CFF_LINE1_MASK) == CFF_UNCONDITIONAL_ACTIVE); 942c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 943c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRecordsEventsRegistrants.notifyResult(EVENT_CFI); 944a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville } else { 945e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby log("EVENT_GET_CFF_DONE: EF_CFIS is valid, ignoring EF_CFF_CPHS"); 946c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 947c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 948c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 949c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_SPDI_DONE: 950c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 951c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 952c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 953c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 954c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 955c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 956c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 957c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 958c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 959c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parseEfSpdi(data); 960c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 961c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 962c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_UPDATE_DONE: 963c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 964c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 965c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville logw("update failed. ", ar.exception); 966c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 967c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 968c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 969c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_PNN_DONE: 970c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 971c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 972c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 973c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 974c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 975c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 976c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 977c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 978c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 979c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SimTlv tlv = new SimTlv(data, 0, data.length); 980c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 981c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for ( ; tlv.isValidObject() ; tlv.nextObject()) { 982c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (tlv.getTag() == TAG_FULL_NETWORK_NAME) { 98322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPnnHomeName 984c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville = IccUtils.networkNameToString( 985c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville tlv.getData(), 0, tlv.getData().length); 986c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 987c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 988c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 989c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 990c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 991c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_ALL_SMS_DONE: 992c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 993c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 994c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 995c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) 996c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 997c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 998cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville handleSmses((ArrayList<byte []>) ar.result); 999c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1000c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1001c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_MARK_SMS_READ_DONE: 100299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.i("ENF", "marked read: sms " + msg.arg1); 1003c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1004c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1005c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1006c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_SMS_ON_SIM: 1007c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = false; 1008c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1009c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 1010c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1011c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int[] index = (int[])ar.result; 1012c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1013c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null || index.length != 1) { 1014c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("Error on SMS_ON_SIM with exp " 1015c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + ar.exception + " length " + index.length); 1016c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1017c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("READ EF_SMS RECORD index=" + index[0]); 1018c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFLinearFixed(EF_SMS,index[0], 1019c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_SMS_DONE)); 1020c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1021c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1022c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1023c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_SMS_DONE: 1024c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = false; 1025c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 1026c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception == null) { 1027c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleSms((byte[])ar.result); 1028c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1029c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("Error on GET_SMS with exp " + ar.exception); 1030c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1031c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1032c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_SST_DONE: 1033c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 1034c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1035c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 1036c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 1037c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1038c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 1039c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1040c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1041c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1042c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mUsimServiceTable = new UsimServiceTable(data); 1043c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("SST: " + mUsimServiceTable); 1044c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1045c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1046c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_INFO_CPHS_DONE: 1047c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 1048c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1049c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 1050c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1051c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 1052c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1053c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1054c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1055c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCphsInfo = (byte[])ar.result; 1056c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1057c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("iCPHS: " + IccUtils.bytesToHexString(mCphsInfo)); 1058c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1059c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1060c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_SET_MBDN_DONE: 1061c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = false; 1062c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 1063c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1064c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception == null) { 106522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mVoiceMailNum = mNewVoiceMailNum; 106622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mVoiceMailTag = mNewVoiceMailTag; 1067c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1068c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1069c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (isCphsMailboxEnabled()) { 107022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville adn = new AdnRecord(mVoiceMailTag, mVoiceMailNum); 1071c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message onCphsCompleted = (Message) ar.userObj; 1072c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1073c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /* write to cphs mailbox whenever it is available but 1074c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * we only need notify caller once if both updating are 1075c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * successful. 1076c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 1077c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * so if set_mbdn successful, notify caller here and set 1078c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * onCphsCompleted to null 1079c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1080c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception == null && ar.userObj != null) { 1081c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult.forMessage(((Message) ar.userObj)).exception 1082c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville = null; 1083c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ((Message) ar.userObj).sendToTarget(); 1084c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1085c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Callback with MBDN successful."); 1086c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1087c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onCphsCompleted = null; 1088c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1089c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1090c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh). 1091c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville updateEF(adn, EF_MAILBOX_CPHS, EF_EXT1, 1, null, 1092c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_SET_CPHS_MAILBOX_DONE, 1093c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onCphsCompleted)); 1094c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1095c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.userObj != null) { 1096c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult.forMessage(((Message) ar.userObj)).exception 1097c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville = ar.exception; 1098c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ((Message) ar.userObj).sendToTarget(); 1099c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_SET_CPHS_MAILBOX_DONE: 1103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = false; 1104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 1105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if(ar.exception == null) { 110622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mVoiceMailNum = mNewVoiceMailNum; 110722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mVoiceMailTag = mNewVoiceMailTag; 1108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Set CPHS MailBox with exception: " 1110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + ar.exception); 1111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.userObj != null) { 1113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Callback with CPHS MB successful."); 1114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult.forMessage(((Message) ar.userObj)).exception 1115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville = ar.exception; 1116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ((Message) ar.userObj).sendToTarget(); 1117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_SIM_REFRESH: 1120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = false; 1121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 1122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Sim REFRESH with exception: " + ar.exception); 1123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception == null) { 1124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleSimRefresh((IccRefreshResponse)ar.result); 1125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_CFIS_DONE: 1128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 1129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 1131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 1132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 1134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("EF_CFIS: " + IccUtils.bytesToHexString(data)); 1138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1139a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville if (validEfCfis(data)) { 1140a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville mEfCfis = data; 1141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1142a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville // Refer TS 51.011 Section 10.3.46 for the content description 114322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCallForwardingEnabled = ((data[1] & 0x01) != 0); 1144e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby log("EF_CFIS: callForwardingEnabled=" + mCallForwardingEnabled); 1145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1146a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville mRecordsEventsRegistrants.notifyResult(EVENT_CFI); 1147a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville } else { 1148a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville log("EF_CFIS: invalid data=" + IccUtils.bytesToHexString(data)); 1149a2985af1d00f7db8cb11da3874dc74e0c7ff7088Wink Saville } 1150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_CSP_CPHS_DONE: 1153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 1154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 1156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 1158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("Exception in fetching EF_CSP data " + ar.exception); 1159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 1163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("EF_CSP: " + IccUtils.bytesToHexString(data)); 1165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleEfCspData(data); 1166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 11682f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim case EVENT_GET_GID1_DONE: 11692f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim isRecordLoadResponse = true; 11702f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim 11712f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim ar = (AsyncResult)msg.obj; 11722f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim data =(byte[])ar.result; 11732f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim 11742f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim if (ar.exception != null) { 11752f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim loge("Exception in get GID1 " + ar.exception); 1176620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt mGid1 = null; 11772f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim break; 11782f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim } 1179620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt mGid1 = IccUtils.bytesToHexString(data); 1180620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt log("GID1: " + mGid1); 11812f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim 11822f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim break; 11832f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim 1184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 1185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville super.handleMessage(msg); // IccRecords handles generic record load responses 1186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville }}catch (RuntimeException exc) { 1188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // I don't want these exceptions to be fatal 1189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville logw("Exception parsing SIM record", exc); 1190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } finally { 1191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Count up record load responses even if they are fails 1192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (isRecordLoadResponse) { 1193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onRecordLoaded(); 1194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void handleFileUpdate(int efid) { 1199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch(efid) { 1200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EF_MBDN: 120122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).loadFromEF(EF_MBDN, EF_EXT6, 120322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMailboxIndex, obtainMessage(EVENT_GET_MBDN_DONE)); 1204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EF_MAILBOX_CPHS: 120622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).loadFromEF(EF_MAILBOX_CPHS, EF_EXT1, 1208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1, obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE)); 1209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EF_CSP_CPHS: 121122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("[CSP] SIM Refresh for EF_CSP_CPHS"); 1213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_CSP_CPHS, 1214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_CSP_CPHS_DONE)); 1215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 121667aacea4e6b0199579a71b3a6a2f5d6778b8a002Kevin Li case EF_FDN: 121767aacea4e6b0199579a71b3a6a2f5d6778b8a002Kevin Li if (DBG) log("SIM Refresh called for EF_FDN"); 121867aacea4e6b0199579a71b3a6a2f5d6778b8a002Kevin Li mParentApp.queryFdn(); 121967aacea4e6b0199579a71b3a6a2f5d6778b8a002Kevin Li break; 1220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 1221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // For now, fetch all records if this is not a 1222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // voicemail number. 1223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // TODO: Handle other cases, instead of fetching all. 122422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAdnCache.reset(); 1225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fetchSimRecords(); 1226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void handleSimRefresh(IccRefreshResponse refreshResponse){ 1231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (refreshResponse == null) { 1232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("handleSimRefresh received without input"); 1233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 1234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (refreshResponse.aid != null && 1237e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka !refreshResponse.aid.equals(mParentApp.getAid())) { 1238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // This is for different app. Ignore. 1239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 1240c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (refreshResponse.refreshResult) { 1243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case IccRefreshResponse.REFRESH_RESULT_FILE_UPDATE: 1244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("handleSimRefresh with SIM_FILE_UPDATED"); 1245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleFileUpdate(refreshResponse.efId); 1246c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1247c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case IccRefreshResponse.REFRESH_RESULT_INIT: 1248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("handleSimRefresh with SIM_REFRESH_INIT"); 1249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // need to reload all files (that we care about) 125064bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka onIccRefreshInit(); 1251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case IccRefreshResponse.REFRESH_RESULT_RESET: 1253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("handleSimRefresh with SIM_REFRESH_RESET"); 1254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.setRadioPower(false, null); 1255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /* Note: no need to call setRadioPower(true). Assuming the desired 1256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * radio power state is still ON (as tracked by ServiceStateTracker), 1257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ServiceStateTracker will call setRadioPower when it receives the 1258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * RADIO_STATE_CHANGED notification for the power off. And if the 1259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * desired power state has changed in the interim, we don't want to 1260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * override it with an unconditional power on. 1261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 12627af882af5b1195e03881a61f177adf86e44ab76fduho.ro mAdnCache.reset(); 1263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 1265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // unknown refresh operation 1266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("handleSimRefresh with unknown operation"); 1267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1272e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby * Dispatch 3GPP format message to registrant ({@code GSMPhone} or {@code CDMALTEPhone}) 1273e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby * to pass to the 3GPP SMS dispatcher for delivery. 1274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1275a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hamby private int dispatchGsmMessage(SmsMessage message) { 1276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mNewSmsRegistrants.notifyResult(message); 1277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return 0; 1278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void handleSms(byte[] ba) { 1281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ba[0] != 0) 128299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.d("ENF", "status : " + ba[0]); 1283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 3GPP TS 51.011 v5.0.0 (20011-12) 10.5.3 1285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 3 == "received by MS from network; message to be read" 1286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ba[0] == 3) { 1287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int n = ba.length; 1288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Note: Data may include trailing FF's. That's OK; message 1290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // should still parse correctly. 1291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] pdu = new byte[n - 1]; 1292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville System.arraycopy(ba, 1, pdu, 0, n - 1); 1293a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hamby SmsMessage message = SmsMessage.createFromPdu(pdu, SmsConstants.FORMAT_3GPP); 1294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville dispatchGsmMessage(message); 1296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1300cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private void handleSmses(ArrayList<byte[]> messages) { 1301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int count = messages.size(); 1302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (int i = 0; i < count; i++) { 1304cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville byte[] ba = messages.get(i); 1305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ba[0] != 0) 130799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.i("ENF", "status " + i + ": " + ba[0]); 1308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 3GPP TS 51.011 v5.0.0 (20011-12) 10.5.3 1310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 3 == "received by MS from network; message to be read" 1311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ba[0] == 3) { 1313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int n = ba.length; 1314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Note: Data may include trailing FF's. That's OK; message 1316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // should still parse correctly. 1317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] pdu = new byte[n - 1]; 1318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville System.arraycopy(ba, 1, pdu, 0, n - 1); 1319a0d02d50aa0fd7cf1c2d9f4d811efd2e4bfb7d4aJake Hamby SmsMessage message = SmsMessage.createFromPdu(pdu, SmsConstants.FORMAT_3GPP); 1320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville dispatchGsmMessage(message); 1322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 3GPP TS 51.011 v5.0.0 (20011-12) 10.5.3 1324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 1 == "received by MS from network; message read" 1325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ba[0] = 1; 1327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1328cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (false) { // FIXME: writing seems to crash RdoServD 1329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.updateEFLinearFixed(EF_SMS, 1330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville i, ba, null, obtainMessage(EVENT_MARK_SMS_READ_DONE, i)); 1331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1336cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 1337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void onRecordLoaded() { 1338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // One record loaded successfully or failed, In either case 1339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // we need to update the recordsToLoad count 134022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad -= 1; 134122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (DBG) log("onRecordLoaded " + mRecordsToLoad + " requested: " + mRecordsRequested); 1342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 134322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mRecordsToLoad == 0 && mRecordsRequested == true) { 1344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onAllRecordsLoaded(); 134522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville } else if (mRecordsToLoad < 0) { 1346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("recordsToLoad <0, programmer error suspected"); 134722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad = 0; 1348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1351cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 1352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void onAllRecordsLoaded() { 1353e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville if (DBG) log("record load complete"); 1354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Some fields require more than one SIM record to set 1356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1357e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville String operator = getOperatorNumeric(); 1358e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville if (!TextUtils.isEmpty(operator)) { 1359e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville log("onAllRecordsLoaded set 'gsm.sim.operator.numeric' to operator='" + 1360e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville operator + "'"); 1361a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("update icc_operator_numeric=" + operator); 1362a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setSystemProperty(PROPERTY_ICC_OPERATOR_NUMERIC, operator); 1363e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville } else { 1364e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville log("onAllRecordsLoaded empty 'gsm.sim.operator.numeric' skipping"); 1365e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville } 1366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1367e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville if (!TextUtils.isEmpty(mImsi)) { 1368e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville log("onAllRecordsLoaded set mcc imsi=" + mImsi); 1369a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, 1370e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka MccTable.countryCodeForMcc(Integer.parseInt(mImsi.substring(0,3)))); 1371e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville } else { 1372e9070e6d48d1389987650fa2c3e1f90aab860684Wink Saville log("onAllRecordsLoaded empty imsi skipping setting mcc"); 1373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setVoiceMailByCountry(operator); 1376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setSpnFromConfig(operator); 1377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1378b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville mRecordsLoadedRegistrants.notifyRegistrants( 1379c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AsyncResult(null, null, null)); 1380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Private methods 1383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void setSpnFromConfig(String carrier) { 1385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mSpnOverride.containsCarrier(carrier)) { 1386b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal setServiceProviderName(mSpnOverride.getSpn(carrier)); 1387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1390c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void setVoiceMailByCountry (String spn) { 1392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mVmConfig.containsCarrier(spn)) { 139322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsVoiceMailFixed = true; 139422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mVoiceMailNum = mVmConfig.getVoiceMailNumber(spn); 139522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mVoiceMailTag = mVmConfig.getVoiceMailTag(spn); 1396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 1400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void onReady() { 1401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fetchSimRecords(); 1402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void fetchSimRecords() { 140522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsRequested = true; 1406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 140722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (DBG) log("fetchSimRecords " + mRecordsToLoad); 1408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1409e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.getIMSIForApp(mParentApp.getAid(), obtainMessage(EVENT_GET_IMSI_DONE)); 141022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_ICCID, obtainMessage(EVENT_GET_ICCID_DONE)); 141322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // FIXME should examine EF[MSISDN]'s capability configuration 1416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // to determine which is the voice/data/fax line 1417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AdnRecordLoader(mFh).loadFromEF(EF_MSISDN, EF_EXT1, 1, 1418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_MSISDN_DONE)); 141922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Record number is subscriber profile 1422c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFLinearFixed(EF_MBI, 1, obtainMessage(EVENT_GET_MBI_DONE)); 142322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_AD, obtainMessage(EVENT_GET_AD_DONE)); 142622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1427c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Record number is subscriber profile 1429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFLinearFixed(EF_MWIS, 1, obtainMessage(EVENT_GET_MWIS_DONE)); 143022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1432c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Also load CPHS-style voice mail indicator, which stores 1434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // the same info as EF[MWIS]. If both exist, both are updated 1435c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // but the EF[MWIS] data is preferred 1436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Please note this must be loaded after EF[MWIS] 1437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent( 1438c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_VOICE_MAIL_INDICATOR_CPHS, 1439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE)); 144022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Same goes for Call Forward Status indicator: fetch both 1443c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // EF[CFIS] and CPHS-EF, with EF[CFIS] preferred. 1444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFLinearFixed(EF_CFIS, 1, obtainMessage(EVENT_GET_CFIS_DONE)); 144522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1446c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_CFF_CPHS, obtainMessage(EVENT_GET_CFF_DONE)); 144722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1448c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1449c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1450c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville getSpnFsm(true, null); 1451c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1452c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_SPDI, obtainMessage(EVENT_GET_SPDI_DONE)); 145322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1454c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1455c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFLinearFixed(EF_PNN, 1, obtainMessage(EVENT_GET_PNN_DONE)); 145622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1457c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_SST, obtainMessage(EVENT_GET_SST_DONE)); 145922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1461c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_INFO_CPHS, obtainMessage(EVENT_GET_INFO_CPHS_DONE)); 146222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1463c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_CSP_CPHS,obtainMessage(EVENT_GET_CSP_CPHS_DONE)); 146522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 14672f837b8058eba0bc59e983c67efbc00cd9a80eeeHyejin Kim mFh.loadEFTransparent(EF_GID1, obtainMessage(EVENT_GET_GID1_DONE)); 1468620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt mRecordsToLoad++; 1469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // XXX should seek instead of examining them all 1471c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (false) { // XXX 1472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFLinearFixedAll(EF_SMS, obtainMessage(EVENT_GET_ALL_SMS_DONE)); 147322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1474c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (CRASH_RIL) { 1477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String sms = "0107912160130310f20404d0110041007030208054832b0120" 1478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" 1479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" 1480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" 1481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" 1482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "ffffffffffffffffffffffffffffff"; 1483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] ba = IccUtils.hexStringToBytes(sms); 1484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.updateEFLinearFixed(EF_SMS, 1, ba, null, 1486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_MARK_SMS_READ_DONE, 1)); 1487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 148822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (DBG) log("fetchSimRecords " + mRecordsToLoad + " requested: " + mRecordsRequested); 1489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Returns the SpnDisplayRule based on settings on the SIM and the 1493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * specified plmn (currently-registered PLMN). See TS 22.101 Annex A 1494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and TS 51.011 10.3.11 for details. 1495c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 14962bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapati * If the SPN is not found on the SIM or is empty, the rule is 14972bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapati * always PLMN_ONLY. 1498c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 1500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public int getDisplayRule(String plmn) { 1501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int rule; 1502be6c87905a15d1e36e87189ad7df5d5a72a52f69Shishir Agrawal 150368515b655255005f653aec29e9f152412514982aShishir Agrawal if (mParentApp.getUiccCard() != null && 150468515b655255005f653aec29e9f152412514982aShishir Agrawal mParentApp.getUiccCard().getOperatorBrandOverride() != null) { 1505be6c87905a15d1e36e87189ad7df5d5a72a52f69Shishir Agrawal // If the operator has been overridden, treat it as the SPN file on the SIM did not exist. 1506be6c87905a15d1e36e87189ad7df5d5a72a52f69Shishir Agrawal rule = SPN_RULE_SHOW_PLMN; 1507be6c87905a15d1e36e87189ad7df5d5a72a52f69Shishir Agrawal } else if (TextUtils.isEmpty(getServiceProviderName()) || mSpnDisplayCondition == -1) { 15082bc7f2e1da139e183519af01f50940327ca9765eAnju Mathapati // No EF_SPN content was found on the SIM, or not yet loaded. Just show ONS. 1509c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville rule = SPN_RULE_SHOW_PLMN; 1510c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (isOnMatchingPlmn(plmn)) { 1511c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville rule = SPN_RULE_SHOW_SPN; 151222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if ((mSpnDisplayCondition & 0x01) == 0x01) { 1513c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ONS required when registered to HPLMN or PLMN in EF_SPDI 1514c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville rule |= SPN_RULE_SHOW_PLMN; 1515c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1516c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1517c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville rule = SPN_RULE_SHOW_PLMN; 151822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if ((mSpnDisplayCondition & 0x02) == 0x00) { 1519c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // SPN required if not registered to HPLMN or PLMN in EF_SPDI 1520c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville rule |= SPN_RULE_SHOW_SPN; 1521c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1522c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1523c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return rule; 1524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1526c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Checks if plmn is HPLMN or on the spdiNetworks list. 1528c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean isOnMatchingPlmn(String plmn) { 1530c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (plmn == null) return false; 1531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (plmn.equals(getOperatorNumeric())) { 1533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 1534c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 153622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mSpdiNetworks != null) { 153722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville for (String spdiNet : mSpdiNetworks) { 1538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (plmn.equals(spdiNet)) { 1539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 1540c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return false; 1544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1547c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * States of Get SPN Finite State Machine which only used by getSpnFsm() 1548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 154922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville private enum GetSpnFsmState { 1550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville IDLE, // No initialized 1551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville INIT, // Start FSM 1552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville READ_SPN_3GPP, // Load EF_SPN firstly 1553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville READ_SPN_CPHS, // Load EF_SPN_CPHS secondly 1554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville READ_SPN_SHORT_CPHS // Load EF_SPN_SHORT_CPHS last 1555c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Finite State Machine to load Service Provider Name , which can be stored 1559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * in either EF_SPN (3GPP), EF_SPN_CPHS, or EF_SPN_SHORT_CPHS (CPHS4.2) 1560c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 1561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * After starting, FSM will search SPN EFs in order and stop after finding 1562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * the first valid SPN 1563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 1564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * If the FSM gets restart while waiting for one of 1565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * SPN EFs results (i.e. a SIM refresh occurs after issuing 1566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * read EF_CPHS_SPN), it will re-initialize only after 1567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * receiving and discarding the unfinished SPN EF result. 1568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 1569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param start set true only for initialize loading 1570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param ar the AsyncResult from loadEFTransparent 1571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ar.exception holds exception in error 1572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * ar.result is byte[] for data in success 1573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void getSpnFsm(boolean start, AsyncResult ar) { 1575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] data; 1576c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1577c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (start) { 1578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Check previous state to see if there is outstanding 1579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // SPN read 158022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if(mSpnState == GetSpnFsmState.READ_SPN_3GPP || 158122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpnState == GetSpnFsmState.READ_SPN_CPHS || 158222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpnState == GetSpnFsmState.READ_SPN_SHORT_CPHS || 158322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpnState == GetSpnFsmState.INIT) { 1584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Set INIT then return so the INIT code 1585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // will run when the outstanding read done. 158622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpnState = GetSpnFsmState.INIT; 1587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 1588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 158922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpnState = GetSpnFsmState.INIT; 1590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 159322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville switch(mSpnState){ 1594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case INIT: 1595b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal setServiceProviderName(null); 1596c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_SPN, 1598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_SPN_DONE)); 159922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 160122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpnState = GetSpnFsmState.READ_SPN_3GPP; 1602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case READ_SPN_3GPP: 1604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar != null && ar.exception == null) { 1605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[]) ar.result; 160622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpnDisplayCondition = 0xff & data[0]; 1607b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal setServiceProviderName(IccUtils.adnStringFieldToString( 1608b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal data, 1, data.length - 1)); 1609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1610b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal if (DBG) log("Load EF_SPN: " + getServiceProviderName() 161122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " spnDisplayCondition: " + mSpnDisplayCondition); 1612b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, getServiceProviderName()); 1613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 161422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpnState = GetSpnFsmState.IDLE; 1615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent( EF_SPN_CPHS, 1617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_SPN_DONE)); 161822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 162022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpnState = GetSpnFsmState.READ_SPN_CPHS; 1621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // See TS 51.011 10.3.11. Basically, default to 1623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // show PLMN always, and SPN also if roaming. 162422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpnDisplayCondition = -1; 1625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1627c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case READ_SPN_CPHS: 1628c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar != null && ar.exception == null) { 1629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[]) ar.result; 1630b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal setServiceProviderName(IccUtils.adnStringFieldToString(data, 0, data.length)); 1631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1632b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal if (DBG) log("Load EF_SPN_CPHS: " + getServiceProviderName()); 1633b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, getServiceProviderName()); 1634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 163522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpnState = GetSpnFsmState.IDLE; 1636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent( 1638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EF_SPN_SHORT_CPHS, obtainMessage(EVENT_GET_SPN_DONE)); 163922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 1640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 164122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpnState = GetSpnFsmState.READ_SPN_SHORT_CPHS; 1642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case READ_SPN_SHORT_CPHS: 1645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar != null && ar.exception == null) { 1646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[]) ar.result; 1647b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal setServiceProviderName(IccUtils.adnStringFieldToString(data, 0, data.length)); 1648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1649b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal if (DBG) log("Load EF_SPN_SHORT_CPHS: " + getServiceProviderName()); 1650b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, getServiceProviderName()); 1651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville }else { 1652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("No SPN loaded in either CHPS or 3GPP"); 1653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 165522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpnState = GetSpnFsmState.IDLE; 1656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 165822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpnState = GetSpnFsmState.IDLE; 1659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Parse TS 51.011 EF[SPDI] record 1664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * This record contains the list of numeric network IDs that 1665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * are treated specially when determining SPN display 1666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 1668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parseEfSpdi(byte[] data) { 1669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SimTlv tlv = new SimTlv(data, 0, data.length); 1670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] plmnEntries = null; 1672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for ( ; tlv.isValidObject() ; tlv.nextObject()) { 1674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Skip SPDI tag, if existant 1675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (tlv.getTag() == TAG_SPDI) { 1676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville tlv = new SimTlv(tlv.getData(), 0, tlv.getData().length); 1677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // There should only be one TAG_SPDI_PLMN_LIST 1679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (tlv.getTag() == TAG_SPDI_PLMN_LIST) { 1680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville plmnEntries = tlv.getData(); 1681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (plmnEntries == null) { 1686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 1687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 168922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpdiNetworks = new ArrayList<String>(plmnEntries.length / 3); 1690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (int i = 0 ; i + 2 < plmnEntries.length ; i += 3) { 1692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String plmnCode; 1693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville plmnCode = IccUtils.bcdToString(plmnEntries, i, 3); 1694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Valid operator codes are 5 or 6 digits 1696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (plmnCode.length() >= 5) { 1697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("EF_SPDI network: " + plmnCode); 169822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSpdiNetworks.add(plmnCode); 1699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * check to see if Mailbox Number is allocated and activated in CPHS SST 1705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean isCphsMailboxEnabled() { 1707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mCphsInfo == null) return false; 1708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return ((mCphsInfo[1] & CPHS_SST_MBN_MASK) == CPHS_SST_MBN_ENABLED ); 1709c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1710c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1711cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 1712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void log(String s) { 171399c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.d(LOG_TAG, "[SIMRecords] " + s); 1714c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1716cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 1717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void loge(String s) { 171899c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.e(LOG_TAG, "[SIMRecords] " + s); 1719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void logw(String s, Throwable tr) { 172299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.w(LOG_TAG, "[SIMRecords] " + s, tr); 1723c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void logv(String s) { 172699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.v(LOG_TAG, "[SIMRecords] " + s); 1727c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1728c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1729c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1730c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Return true if "Restriction of menu options for manual PLMN selection" 1731c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * bit is set or EF_CSP data is unavailable, return false otherwise. 1732c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1733cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 1734c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public boolean isCspPlmnEnabled() { 1735c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return mCspPlmnEnabled; 1736c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Parse EF_CSP data and check if 1740c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * "Restriction of menu options for manual PLMN selection" is 1741c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Enabled/Disabled 1742c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 1743c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param data EF_CSP hex data. 1744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void handleEfCspData(byte[] data) { 1746c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // As per spec CPHS4_2.WW6, CPHS B.4.7.1, EF_CSP contains CPHS defined 1747c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 18 bytes (i.e 9 service groups info) and additional data specific to 1748c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // operator. The valueAddedServicesGroup is not part of standard 1749c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // services. This is operator specific and can be programmed any where. 1750c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Normally this is programmed as 10th service after the standard 1751c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // services. 1752c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int usedCspGroups = data.length / 2; 1753e17fb5a149610484b4bcda31cde04abfd4e5d4ecJake Hamby // This is the "Service Group Number" of "Value Added Services Group". 1754c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte valueAddedServicesGroup = (byte)0xC0; 1755c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1756c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCspPlmnEnabled = true; 1757c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (int i = 0; i < usedCspGroups; i++) { 1758c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (data[2 * i] == valueAddedServicesGroup) { 1759c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("[CSP] found ValueAddedServicesGroup, value " + data[(2 * i) + 1]); 1760c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if ((data[(2 * i) + 1] & 0x80) == 0x80) { 1761c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Bit 8 is for 1762c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // "Restriction of menu options for manual PLMN selection". 1763c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Operator Selection menu should be enabled. 1764c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCspPlmnEnabled = true; 1765c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1766c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCspPlmnEnabled = false; 1767c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Operator Selection menu should be disabled. 1768c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Operator Selection Mode should be set to Automatic. 1769c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("[CSP] Set Automatic Network Selection"); 1770c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mNetworkSelectionModeAutomaticRegistrants.notifyRegistrants(); 1771c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1772c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 1773c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1774c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1775c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1776c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("[CSP] Value Added Service Group (0xC0), not found!"); 1777c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 177805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka 177905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka @Override 178005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 178105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println("SIMRecords: " + this); 178205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" extends:"); 178305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka super.dump(fd, pw, args); 178405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mVmConfig=" + mVmConfig); 178505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mSpnOverride=" + mSpnOverride); 178622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mCallForwardingEnabled=" + mCallForwardingEnabled); 178722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mSpnState=" + mSpnState); 178805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mCphsInfo=" + mCphsInfo); 178905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mCspPlmnEnabled=" + mCspPlmnEnabled); 179022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mEfMWIS[]=" + Arrays.toString(mEfMWIS)); 179122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mEfCPHS_MWI[]=" + Arrays.toString(mEfCPHS_MWI)); 179205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mEfCff[]=" + Arrays.toString(mEfCff)); 179305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mEfCfis[]=" + Arrays.toString(mEfCfis)); 179422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mSpnDisplayCondition=" + mSpnDisplayCondition); 179522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mSpdiNetworks[]=" + mSpdiNetworks); 179622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mPnnHomeName=" + mPnnHomeName); 179705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mUsimServiceTable=" + mUsimServiceTable); 1798620c8855bcaa3fe8d492e93811b0ed6e8b4f59fcRobert Greenwalt pw.println(" mGid1=" + mGid1); 179905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.flush(); 180005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 1801c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville} 1802