1c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/* 2c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Copyright (C) 2008 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 19e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_TEST_CSIM; 20e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 2105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.FileDescriptor; 2205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.io.PrintWriter; 23e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport java.util.ArrayList; 2405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenkaimport java.util.Arrays; 25e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport java.util.Locale; 26c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.Context; 27c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.AsyncResult; 28c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Message; 29c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.SystemProperties; 30c1b229b7389e4cd682452c8d662afa1b3af14345Jack Yuimport android.telephony.SubscriptionInfo; 315866914ae9798adebcb84cd710bca660b797bff0Amit Mahajanimport android.telephony.SubscriptionManager; 3299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog; 33e9070e6d48d1389987650fa2c3e1f90aab860684Wink Savilleimport android.text.TextUtils; 342351b17aba5350004fc76707f3b3d2859ce773c8xinheimport android.util.Log; 35e409b02a691d5bb0515aab41cfa597c725eb9174duho.roimport android.content.res.Resources; 36c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 37c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.CommandsInterface; 38e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.GsmAlphabet; 39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.MccTable; 40062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawalimport com.android.internal.telephony.SubscriptionController; 41c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 42e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.cdma.sms.UserData; 43d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType; 442351b17aba5350004fc76707f3b3d2859ce773c8xinheimport com.android.internal.util.BitwiseInputStream; 45c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 46c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/** 47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide} 48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 49153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajanpublic class RuimRecords extends IccRecords { 50cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville static final String LOG_TAG = "RuimRecords"; 51c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville private boolean mOtaCommited=false; 53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 54c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Instance Variables 55c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private String mMyMobileNumber; 57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private String mMin2Min1; 58c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 59c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private String mPrlVersion; 60e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // From CSIM application 61e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private byte[] mEFpl = null; 62e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private byte[] mEFli = null; 63e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka boolean mCsimSpnDisplayCondition = false; 64e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private String mMdn; 65e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private String mMin; 66e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private String mHomeSystemId; 67e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private String mHomeNetworkId; 682351b17aba5350004fc76707f3b3d2859ce773c8xinhe private String mNai; 69c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 70f92cb4bd5519427a0db673709d94683a8baf203aWink Saville @Override 71f92cb4bd5519427a0db673709d94683a8baf203aWink Saville public String toString() { 72f92cb4bd5519427a0db673709d94683a8baf203aWink Saville return "RuimRecords: " + super.toString() 7322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + " m_ota_commited" + mOtaCommited 74f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mMyMobileNumber=" + "xxxx" 75f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mMin2Min1=" + mMin2Min1 76f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mPrlVersion=" + mPrlVersion 77f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mEFpl=" + mEFpl 78f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mEFli=" + mEFli 79f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mCsimSpnDisplayCondition=" + mCsimSpnDisplayCondition 80f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mMdn=" + mMdn 81f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mMin=" + mMin 82f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mHomeSystemId=" + mHomeSystemId 83f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " mHomeNetworkId=" + mHomeNetworkId; 84f92cb4bd5519427a0db673709d94683a8baf203aWink Saville } 85f92cb4bd5519427a0db673709d94683a8baf203aWink Saville 86c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ***** Event Constants 87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_IMSI_DONE = 3; 88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_DEVICE_IDENTITY_DONE = 4; 89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_ICCID_DONE = 5; 90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_CDMA_SUBSCRIPTION_DONE = 10; 91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_UPDATE_DONE = 14; 92c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_SST_DONE = 17; 93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_ALL_SMS_DONE = 18; 94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_MARK_SMS_READ_DONE = 19; 95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_SMS_ON_RUIM = 21; 97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_GET_SMS_DONE = 22; 98c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_RUIM_REFRESH = 31; 100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 101e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public RuimRecords(UiccCardApplication app, Context c, CommandsInterface ci) { 102e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka super(app, c, ci); 103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 10422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAdnCache = new AdnRecordCache(mFh); 105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 10622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsRequested = false; // No load request is made till SIM ready 107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // recordsToLoad is set to 0 because no requests are made yet 10922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad = 0; 110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // NOTE the EVENT_SMS_ON_RUIM is not registered 112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.registerForIccRefresh(this, EVENT_RUIM_REFRESH, null); 113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Start off by setting empty state 115e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka resetRecords(); 116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 117e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mParentApp.registerForReady(this, EVENT_APP_READY, null); 118f92cb4bd5519427a0db673709d94683a8baf203aWink Saville if (DBG) log("RuimRecords X ctor this=" + this); 119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dispose() { 123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Disposing RuimRecords " + this); 124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //Unregister for all events 125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.unregisterForIccRefresh(this); 126e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mParentApp.unregisterForReady(this); 127e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka resetRecords(); 128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville super.dispose(); 129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void finalize() { 133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if(DBG) log("RuimRecords finalized"); 134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 136e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka protected void resetRecords() { 13722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mMncLength = UNINITIALIZED; 138a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("setting0 mMncLength" + mMncLength); 139b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville mIccId = null; 140a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan mFullIccId = null; 141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 14222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAdnCache.reset(); 143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Don't clean up PROPERTY_ICC_OPERATOR_ISO_COUNTRY and 145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // PROPERTY_ICC_OPERATOR_NUMERIC here. Since not all CDMA 146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // devices have RUIM, these properties should keep the original 147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // values, e.g. build time settings, when there is no RUIM but 148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // set new values when RUIM is available and loaded. 149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // recordsRequested is set to false indicating that the SIM 151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // read requests made so far are not valid. This is set to 152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // true only when fresh set of read requests are made. 15322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsRequested = false; 154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 156e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 157e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public String getIMSI() { 158e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mImsi; 159e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 160e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getMdnNumber() { 162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return mMyMobileNumber; 163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getCdmaMin() { 166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return mMin2Min1; 167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Returns null if RUIM is not yet ready */ 170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getPrlVersion() { 171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return mPrlVersion; 172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 1752351b17aba5350004fc76707f3b3d2859ce773c8xinhe /** Returns null if RUIM is not yet ready */ 1762351b17aba5350004fc76707f3b3d2859ce773c8xinhe public String getNAI() { 1772351b17aba5350004fc76707f3b3d2859ce773c8xinhe return mNai; 1782351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 1792351b17aba5350004fc76707f3b3d2859ce773c8xinhe 1802351b17aba5350004fc76707f3b3d2859ce773c8xinhe @Override 181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void setVoiceMailNumber(String alphaTag, String voiceNumber, Message onComplete){ 182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // In CDMA this is Operator/OEM dependent 183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult.forMessage((onComplete)).exception = 184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new IccException("setVoiceMailNumber not implemented"); 185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onComplete.sendToTarget(); 186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("method setVoiceMailNumber is not implemented"); 187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called by CCAT Service when REFRESH is received. 191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param fileChanged indicates whether any files changed 192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param fileList if non-null, a list of EF files that changed 193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void onRefresh(boolean fileChanged, int[] fileList) { 196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (fileChanged) { 197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // A future optimization would be to inspect fileList and 198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // only reload those files that we care about. For now, 199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // just re-fetch all RUIM records that we cache. 200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fetchRuimRecords(); 201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 204e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private int adjstMinDigits (int digits) { 205e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Per C.S0005 section 2.3.1. 206e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka digits += 111; 207e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka digits = (digits % 10 == 0)?(digits - 10):digits; 208e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka digits = ((digits / 10) % 10 == 0)?(digits - 100):digits; 209e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka digits = ((digits / 100) % 10 == 0)?(digits - 1000):digits; 210e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return digits; 211e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 212e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Returns the 5 or 6 digit MCC/MNC of the operator that 215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * provided the RUIM card. Returns null of RUIM is not yet ready 216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getRUIMOperatorNumeric() { 218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mImsi == null) { 219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return null; 220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 22222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mMncLength != UNINITIALIZED && mMncLength != UNKNOWN) { 223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Length = length of MCC + length of MNC 224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // length of mcc = 3 (3GPP2 C.S0005 - Section 2.3) 22522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mImsi.substring(0, 3 + mMncLength); 226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Guess the MNC length based on the MCC if we don't 229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // have a valid value in ef[ad] 230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int mcc = Integer.parseInt(mImsi.substring(0,3)); 232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return mImsi.substring(0, 3 + MccTable.smallestDigitsMccForMnc(mcc)); 233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 235e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Refer to ETSI TS 102.221 236e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private class EfPlLoaded implements IccRecordLoaded { 237cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 238e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public String getEfName() { 239e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return "EF_PL"; 240e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 241e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 242cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 243e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void onRecordLoaded(AsyncResult ar) { 244e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mEFpl = (byte[]) ar.result; 245e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("EF_PL=" + IccUtils.bytesToHexString(mEFpl)); 246e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 247e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 248e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 249e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Refer to C.S0065 5.2.26 250e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private class EfCsimLiLoaded implements IccRecordLoaded { 251cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 252e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public String getEfName() { 253e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return "EF_CSIM_LI"; 254e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 255e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 256cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 257e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void onRecordLoaded(AsyncResult ar) { 258e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mEFli = (byte[]) ar.result; 259e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // convert csim efli data to iso 639 format 260e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka for (int i = 0; i < mEFli.length; i+=2) { 261e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka switch(mEFli[i+1]) { 262e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case 0x01: mEFli[i] = 'e'; mEFli[i+1] = 'n';break; 263e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case 0x02: mEFli[i] = 'f'; mEFli[i+1] = 'r';break; 264e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case 0x03: mEFli[i] = 'e'; mEFli[i+1] = 's';break; 265e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case 0x04: mEFli[i] = 'j'; mEFli[i+1] = 'a';break; 266e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case 0x05: mEFli[i] = 'k'; mEFli[i+1] = 'o';break; 267e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case 0x06: mEFli[i] = 'z'; mEFli[i+1] = 'h';break; 268e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case 0x07: mEFli[i] = 'h'; mEFli[i+1] = 'e';break; 269e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka default: mEFli[i] = ' '; mEFli[i+1] = ' '; 270e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 271e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 272e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 273e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("EF_LI=" + IccUtils.bytesToHexString(mEFli)); 274e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 275e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 276e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 277e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Refer to C.S0065 5.2.32 278e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private class EfCsimSpnLoaded implements IccRecordLoaded { 279cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 280e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public String getEfName() { 281e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return "EF_CSIM_SPN"; 282e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 283e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 284cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 285e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void onRecordLoaded(AsyncResult ar) { 286e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka byte[] data = (byte[]) ar.result; 287e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("CSIM_SPN=" + 288e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka IccUtils.bytesToHexString(data)); 289e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 290e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // C.S0065 for EF_SPN decoding 291e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCsimSpnDisplayCondition = ((0x01 & data[0]) != 0); 292e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 293e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int encoding = data[1]; 294e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int language = data[2]; 295e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka byte[] spnData = new byte[32]; 296e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int len = ((data.length - 3) < 32) ? (data.length - 3) : 32; 297e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka System.arraycopy(data, 3, spnData, 0, len); 298e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 299e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int numBytes; 300e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka for (numBytes = 0; numBytes < spnData.length; numBytes++) { 301e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if ((spnData[numBytes] & 0xFF) == 0xFF) break; 302e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 303e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 304e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (numBytes == 0) { 305b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal setServiceProviderName(""); 306e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 307e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 308e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka try { 309e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka switch (encoding) { 310e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case UserData.ENCODING_OCTET: 311e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case UserData.ENCODING_LATIN: 312b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal setServiceProviderName(new String(spnData, 0, numBytes, "ISO-8859-1")); 313e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 314e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case UserData.ENCODING_IA5: 315e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case UserData.ENCODING_GSM_7BIT_ALPHABET: 316b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal setServiceProviderName( 317b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal GsmAlphabet.gsm7BitPackedToString(spnData, 0, (numBytes*8)/7)); 318e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 31960e3a52dad667a094af0c269176ee30da739ee84Sandeep Gutta case UserData.ENCODING_7BIT_ASCII: 320b5d27d8e567ef835e961548b144cdad95d2361deJing Zhao String spn = new String(spnData, 0, numBytes, "US-ASCII"); 321b5d27d8e567ef835e961548b144cdad95d2361deJing Zhao // To address issues with incorrect encoding scheme 322b5d27d8e567ef835e961548b144cdad95d2361deJing Zhao // programmed in some commercial CSIM cards, the decoded 323b5d27d8e567ef835e961548b144cdad95d2361deJing Zhao // SPN is checked to have characters in printable ASCII 324b5d27d8e567ef835e961548b144cdad95d2361deJing Zhao // range. If not, they are decoded with 325b5d27d8e567ef835e961548b144cdad95d2361deJing Zhao // ENCODING_GSM_7BIT_ALPHABET scheme. 326b5d27d8e567ef835e961548b144cdad95d2361deJing Zhao if (TextUtils.isPrintableAsciiOnly(spn)) { 327b5d27d8e567ef835e961548b144cdad95d2361deJing Zhao setServiceProviderName(spn); 328b5d27d8e567ef835e961548b144cdad95d2361deJing Zhao } else { 329b5d27d8e567ef835e961548b144cdad95d2361deJing Zhao if (DBG) log("Some corruption in SPN decoding = " + spn); 330b5d27d8e567ef835e961548b144cdad95d2361deJing Zhao if (DBG) log("Using ENCODING_GSM_7BIT_ALPHABET scheme..."); 331b5d27d8e567ef835e961548b144cdad95d2361deJing Zhao setServiceProviderName( 332b5d27d8e567ef835e961548b144cdad95d2361deJing Zhao GsmAlphabet.gsm7BitPackedToString(spnData, 0, (numBytes * 8) / 7)); 333b5d27d8e567ef835e961548b144cdad95d2361deJing Zhao } 33460e3a52dad667a094af0c269176ee30da739ee84Sandeep Gutta break; 335e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case UserData.ENCODING_UNICODE_16: 336b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal setServiceProviderName(new String(spnData, 0, numBytes, "utf-16")); 337e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 338e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka default: 339e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka log("SPN encoding not supported"); 340e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 341e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } catch(Exception e) { 342e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka log("spn decode error: " + e); 343e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 344b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal if (DBG) log("spn=" + getServiceProviderName()); 345e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("spnCondition=" + mCsimSpnDisplayCondition); 346e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu mTelephonyManager.setSimOperatorNameForPhone( 347e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu mParentApp.getPhoneId(), getServiceProviderName()); 348e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 349e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 350e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 351e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private class EfCsimMdnLoaded implements IccRecordLoaded { 352cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 353e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public String getEfName() { 354e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return "EF_CSIM_MDN"; 355e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 356e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 357cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 358e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void onRecordLoaded(AsyncResult ar) { 359e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka byte[] data = (byte[]) ar.result; 360e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("CSIM_MDN=" + IccUtils.bytesToHexString(data)); 361e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Refer to C.S0065 5.2.35 362e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int mdnDigitsNum = 0x0F & data[0]; 363e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mMdn = IccUtils.cdmaBcdToString(data, 1, mdnDigitsNum); 364e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("CSIM MDN=" + mMdn); 365e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 366e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 367e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 368e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private class EfCsimImsimLoaded implements IccRecordLoaded { 369cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 370e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public String getEfName() { 371e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return "EF_CSIM_IMSIM"; 372e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 373e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 374cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 375e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void onRecordLoaded(AsyncResult ar) { 376e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka byte[] data = (byte[]) ar.result; 377f9f73e5f5125df262b8c2bec21de5600dc4d1801Etan Cohen if (VDBG) log("CSIM_IMSIM=" + IccUtils.bytesToHexString(data)); 378e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // C.S0065 section 5.2.2 for IMSI_M encoding 379e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // C.S0005 section 2.3.1 for MIN encoding in IMSI_M. 380e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka boolean provisioned = ((data[7] & 0x80) == 0x80); 381e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 382e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (provisioned) { 383e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int first3digits = ((0x03 & data[2]) << 8) + (0xFF & data[1]); 384e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int second3digits = (((0xFF & data[5]) << 8) | (0xFF & data[4])) >> 6; 385e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int digit7 = 0x0F & (data[4] >> 2); 386e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (digit7 > 0x09) digit7 = 0; 387e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int last3digits = ((0x03 & data[4]) << 8) | (0xFF & data[3]); 388e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka first3digits = adjstMinDigits(first3digits); 389e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka second3digits = adjstMinDigits(second3digits); 390e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka last3digits = adjstMinDigits(last3digits); 391e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 392e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka StringBuilder builder = new StringBuilder(); 393e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka builder.append(String.format(Locale.US, "%03d", first3digits)); 394e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka builder.append(String.format(Locale.US, "%03d", second3digits)); 395e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka builder.append(String.format(Locale.US, "%d", digit7)); 396e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka builder.append(String.format(Locale.US, "%03d", last3digits)); 397e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mMin = builder.toString(); 398e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("min present=" + mMin); 399e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else { 400e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("min not present"); 401e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 402e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 403e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 404e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 405e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private class EfCsimCdmaHomeLoaded implements IccRecordLoaded { 406cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 407e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public String getEfName() { 408e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return "EF_CSIM_CDMAHOME"; 409e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 410e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 411cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 412e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void onRecordLoaded(AsyncResult ar) { 413e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Per C.S0065 section 5.2.8 414e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ArrayList<byte[]> dataList = (ArrayList<byte[]>) ar.result; 415e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("CSIM_CDMAHOME data size=" + dataList.size()); 416e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (dataList.isEmpty()) { 417e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return; 418e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 419e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka StringBuilder sidBuf = new StringBuilder(); 420e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka StringBuilder nidBuf = new StringBuilder(); 421e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 422e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka for (byte[] data : dataList) { 423e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (data.length == 5) { 424e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int sid = ((data[1] & 0xFF) << 8) | (data[0] & 0xFF); 425e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int nid = ((data[3] & 0xFF) << 8) | (data[2] & 0xFF); 426e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka sidBuf.append(sid).append(','); 427e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka nidBuf.append(nid).append(','); 428e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 429e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 430e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // remove trailing "," 431e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka sidBuf.setLength(sidBuf.length()-1); 432e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka nidBuf.setLength(nidBuf.length()-1); 433e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 434e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mHomeSystemId = sidBuf.toString(); 435e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mHomeNetworkId = nidBuf.toString(); 436e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 437e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 438e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 439e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private class EfCsimEprlLoaded implements IccRecordLoaded { 440cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 441e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public String getEfName() { 442e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return "EF_CSIM_EPRL"; 443e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 444cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 445e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public void onRecordLoaded(AsyncResult ar) { 446e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onGetCSimEprlDone(ar); 447e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 448e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 449e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 450e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka private void onGetCSimEprlDone(AsyncResult ar) { 451e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // C.S0065 section 5.2.57 for EFeprl encoding 452e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // C.S0016 section 3.5.5 for PRL format. 453e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka byte[] data = (byte[]) ar.result; 454e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("CSIM_EPRL=" + IccUtils.bytesToHexString(data)); 455e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 456e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Only need the first 4 bytes of record 457e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (data.length > 3) { 458e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka int prlId = ((data[2] & 0xFF) << 8) | (data[3] & 0xFF); 459e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPrlVersion = Integer.toString(prlId); 460e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 461e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (DBG) log("CSIM PRL version=" + mPrlVersion); 462e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 463e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 4642351b17aba5350004fc76707f3b3d2859ce773c8xinhe private class EfCsimMipUppLoaded implements IccRecordLoaded { 4652351b17aba5350004fc76707f3b3d2859ce773c8xinhe @Override 4662351b17aba5350004fc76707f3b3d2859ce773c8xinhe public String getEfName() { 4672351b17aba5350004fc76707f3b3d2859ce773c8xinhe return "EF_CSIM_MIPUPP"; 4682351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 4692351b17aba5350004fc76707f3b3d2859ce773c8xinhe 4702351b17aba5350004fc76707f3b3d2859ce773c8xinhe boolean checkLengthLegal(int length, int expectLength) { 4712351b17aba5350004fc76707f3b3d2859ce773c8xinhe if(length < expectLength) { 4722351b17aba5350004fc76707f3b3d2859ce773c8xinhe Log.e(LOG_TAG, "CSIM MIPUPP format error, length = " + length + 4732351b17aba5350004fc76707f3b3d2859ce773c8xinhe "expected length at least =" + expectLength); 4742351b17aba5350004fc76707f3b3d2859ce773c8xinhe return false; 4752351b17aba5350004fc76707f3b3d2859ce773c8xinhe } else { 4762351b17aba5350004fc76707f3b3d2859ce773c8xinhe return true; 4772351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 4782351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 4792351b17aba5350004fc76707f3b3d2859ce773c8xinhe 4802351b17aba5350004fc76707f3b3d2859ce773c8xinhe @Override 4812351b17aba5350004fc76707f3b3d2859ce773c8xinhe public void onRecordLoaded(AsyncResult ar) { 4822351b17aba5350004fc76707f3b3d2859ce773c8xinhe // 3GPP2 C.S0065 section 5.2.24 4832351b17aba5350004fc76707f3b3d2859ce773c8xinhe byte[] data = (byte[]) ar.result; 4842351b17aba5350004fc76707f3b3d2859ce773c8xinhe 4852351b17aba5350004fc76707f3b3d2859ce773c8xinhe if(data.length < 1) { 4862351b17aba5350004fc76707f3b3d2859ce773c8xinhe Log.e(LOG_TAG,"MIPUPP read error"); 4872351b17aba5350004fc76707f3b3d2859ce773c8xinhe return; 4882351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 4892351b17aba5350004fc76707f3b3d2859ce773c8xinhe 4902351b17aba5350004fc76707f3b3d2859ce773c8xinhe BitwiseInputStream bitStream = new BitwiseInputStream(data); 4912351b17aba5350004fc76707f3b3d2859ce773c8xinhe try { 4922351b17aba5350004fc76707f3b3d2859ce773c8xinhe int mipUppLength = bitStream.read(8); 4932351b17aba5350004fc76707f3b3d2859ce773c8xinhe //transfer length from byte to bit 4942351b17aba5350004fc76707f3b3d2859ce773c8xinhe mipUppLength = (mipUppLength << 3); 4952351b17aba5350004fc76707f3b3d2859ce773c8xinhe 4962351b17aba5350004fc76707f3b3d2859ce773c8xinhe if (!checkLengthLegal(mipUppLength, 1)) { 4972351b17aba5350004fc76707f3b3d2859ce773c8xinhe return; 4982351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 4992351b17aba5350004fc76707f3b3d2859ce773c8xinhe //parse the MIPUPP body 3GPP2 C.S0016-C 3.5.8.6 5002351b17aba5350004fc76707f3b3d2859ce773c8xinhe int retryInfoInclude = bitStream.read(1); 5012351b17aba5350004fc76707f3b3d2859ce773c8xinhe mipUppLength--; 5022351b17aba5350004fc76707f3b3d2859ce773c8xinhe 5032351b17aba5350004fc76707f3b3d2859ce773c8xinhe if(retryInfoInclude == 1) { 5042351b17aba5350004fc76707f3b3d2859ce773c8xinhe if (!checkLengthLegal(mipUppLength, 11)) { 5052351b17aba5350004fc76707f3b3d2859ce773c8xinhe return; 5062351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5072351b17aba5350004fc76707f3b3d2859ce773c8xinhe bitStream.skip(11); //not used now 5082351b17aba5350004fc76707f3b3d2859ce773c8xinhe //transfer length from byte to bit 5092351b17aba5350004fc76707f3b3d2859ce773c8xinhe mipUppLength -= 11; 5102351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5112351b17aba5350004fc76707f3b3d2859ce773c8xinhe 5122351b17aba5350004fc76707f3b3d2859ce773c8xinhe if (!checkLengthLegal(mipUppLength, 4)) { 5132351b17aba5350004fc76707f3b3d2859ce773c8xinhe return; 5142351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5152351b17aba5350004fc76707f3b3d2859ce773c8xinhe int numNai = bitStream.read(4); 5162351b17aba5350004fc76707f3b3d2859ce773c8xinhe mipUppLength -= 4; 5172351b17aba5350004fc76707f3b3d2859ce773c8xinhe 5182351b17aba5350004fc76707f3b3d2859ce773c8xinhe //start parse NAI body 5192351b17aba5350004fc76707f3b3d2859ce773c8xinhe for(int index = 0; index < numNai; index++) { 5202351b17aba5350004fc76707f3b3d2859ce773c8xinhe if (!checkLengthLegal(mipUppLength, 4)) { 5212351b17aba5350004fc76707f3b3d2859ce773c8xinhe return; 5222351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5232351b17aba5350004fc76707f3b3d2859ce773c8xinhe int naiEntryIndex = bitStream.read(4); 5242351b17aba5350004fc76707f3b3d2859ce773c8xinhe mipUppLength -= 4; 5252351b17aba5350004fc76707f3b3d2859ce773c8xinhe 5262351b17aba5350004fc76707f3b3d2859ce773c8xinhe if (!checkLengthLegal(mipUppLength, 8)) { 5272351b17aba5350004fc76707f3b3d2859ce773c8xinhe return; 5282351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5292351b17aba5350004fc76707f3b3d2859ce773c8xinhe int naiLength = bitStream.read(8); 5302351b17aba5350004fc76707f3b3d2859ce773c8xinhe mipUppLength -= 8; 5312351b17aba5350004fc76707f3b3d2859ce773c8xinhe 5322351b17aba5350004fc76707f3b3d2859ce773c8xinhe if(naiEntryIndex == 0) { 5332351b17aba5350004fc76707f3b3d2859ce773c8xinhe //we find the one! 5342351b17aba5350004fc76707f3b3d2859ce773c8xinhe if (!checkLengthLegal(mipUppLength, naiLength << 3)) { 5352351b17aba5350004fc76707f3b3d2859ce773c8xinhe return; 5362351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5372351b17aba5350004fc76707f3b3d2859ce773c8xinhe char naiCharArray[] = new char[naiLength]; 5382351b17aba5350004fc76707f3b3d2859ce773c8xinhe for(int index1 = 0; index1 < naiLength; index1++) { 5392351b17aba5350004fc76707f3b3d2859ce773c8xinhe naiCharArray[index1] = (char)(bitStream.read(8) & 0xFF); 5402351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5412351b17aba5350004fc76707f3b3d2859ce773c8xinhe mNai = new String(naiCharArray); 542e9fdc85df2111a0a0d7d240bbc11ed5b14b01376xinhe if (Log.isLoggable(LOG_TAG, Log.VERBOSE)) { 543e9fdc85df2111a0a0d7d240bbc11ed5b14b01376xinhe Log.v(LOG_TAG,"MIPUPP Nai = " + mNai); 544e9fdc85df2111a0a0d7d240bbc11ed5b14b01376xinhe } 5452351b17aba5350004fc76707f3b3d2859ce773c8xinhe return; //need not parsing further 5462351b17aba5350004fc76707f3b3d2859ce773c8xinhe } else { 5472351b17aba5350004fc76707f3b3d2859ce773c8xinhe //ignore this NAI body 5482351b17aba5350004fc76707f3b3d2859ce773c8xinhe if (!checkLengthLegal(mipUppLength, (naiLength << 3) + 102)) { 5492351b17aba5350004fc76707f3b3d2859ce773c8xinhe return; 5502351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5512351b17aba5350004fc76707f3b3d2859ce773c8xinhe bitStream.skip((naiLength << 3) + 101);//not used 5522351b17aba5350004fc76707f3b3d2859ce773c8xinhe int mnAaaSpiIndicator = bitStream.read(1); 5532351b17aba5350004fc76707f3b3d2859ce773c8xinhe mipUppLength -= ((naiLength << 3) + 102); 5542351b17aba5350004fc76707f3b3d2859ce773c8xinhe 5552351b17aba5350004fc76707f3b3d2859ce773c8xinhe if(mnAaaSpiIndicator == 1) { 5562351b17aba5350004fc76707f3b3d2859ce773c8xinhe if (!checkLengthLegal(mipUppLength, 32)) { 5572351b17aba5350004fc76707f3b3d2859ce773c8xinhe return; 5582351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5592351b17aba5350004fc76707f3b3d2859ce773c8xinhe bitStream.skip(32); //not used 5602351b17aba5350004fc76707f3b3d2859ce773c8xinhe mipUppLength -= 32; 5612351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5622351b17aba5350004fc76707f3b3d2859ce773c8xinhe 5632351b17aba5350004fc76707f3b3d2859ce773c8xinhe //MN-HA_AUTH_ALGORITHM 5642351b17aba5350004fc76707f3b3d2859ce773c8xinhe if (!checkLengthLegal(mipUppLength, 5)) { 5652351b17aba5350004fc76707f3b3d2859ce773c8xinhe return; 5662351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5672351b17aba5350004fc76707f3b3d2859ce773c8xinhe bitStream.skip(4); 5682351b17aba5350004fc76707f3b3d2859ce773c8xinhe mipUppLength -= 4; 5692351b17aba5350004fc76707f3b3d2859ce773c8xinhe int mnHaSpiIndicator = bitStream.read(1); 5702351b17aba5350004fc76707f3b3d2859ce773c8xinhe mipUppLength--; 5712351b17aba5350004fc76707f3b3d2859ce773c8xinhe 5722351b17aba5350004fc76707f3b3d2859ce773c8xinhe if(mnHaSpiIndicator == 1) { 5732351b17aba5350004fc76707f3b3d2859ce773c8xinhe if (!checkLengthLegal(mipUppLength, 32)) { 5742351b17aba5350004fc76707f3b3d2859ce773c8xinhe return; 5752351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5762351b17aba5350004fc76707f3b3d2859ce773c8xinhe bitStream.skip(32); 5772351b17aba5350004fc76707f3b3d2859ce773c8xinhe mipUppLength -= 32; 5782351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5792351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5802351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5812351b17aba5350004fc76707f3b3d2859ce773c8xinhe } catch(Exception e) { 5822351b17aba5350004fc76707f3b3d2859ce773c8xinhe Log.e(LOG_TAG,"MIPUPP read Exception error!"); 5832351b17aba5350004fc76707f3b3d2859ce773c8xinhe return; 5842351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5852351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5862351b17aba5350004fc76707f3b3d2859ce773c8xinhe } 5872351b17aba5350004fc76707f3b3d2859ce773c8xinhe 588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void handleMessage(Message msg) { 590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult ar; 591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte data[]; 593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean isRecordLoadResponse = false; 595c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 596bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka if (mDestroyed.get()) { 597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("Received message " + msg + 598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "[" + msg.what + "] while being destroyed. Ignoring."); 599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 601c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { switch (msg.what) { 603e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka case EVENT_APP_READY: 604e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka onReady(); 605e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka break; 606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_DEVICE_IDENTITY_DONE: 608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("Event EVENT_GET_DEVICE_IDENTITY_DONE Received"); 609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /* IO events */ 612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_IMSI_DONE: 613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("Exception querying IMSI, Exception:" + ar.exception); 618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mImsi = (String) ar.result; 622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // IMSI (MCC+MNC+MSIN) is at least 6 digits, but not more 624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // than 15 (and usually 15). 625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mImsi != null && (mImsi.length() < 6 || mImsi.length() > 15)) { 626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("invalid IMSI " + mImsi); 627c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mImsi = null; 628c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 630f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby // FIXME: CSIM IMSI may not contain the MNC. 631f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby if (false) { 632f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby log("IMSI: " + mImsi.substring(0, 6) + "xxxxxxxxx"); 633f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby 634f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby String operatorNumeric = getRUIMOperatorNumeric(); 635f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby if (operatorNumeric != null) { 636f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby if (operatorNumeric.length() <= 6) { 637a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("update mccmnc=" + operatorNumeric); 638f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby MccTable.updateMccMncConfiguration(mContext, operatorNumeric, false); 639f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby } 640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 641a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 642a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String operatorNumeric = getRUIMOperatorNumeric(); 643a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("NO update mccmnc=" + operatorNumeric); 644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 645f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby 646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_CDMA_SUBSCRIPTION_DONE: 649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String localTemp[] = (String[])ar.result; 651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mMyMobileNumber = localTemp[0]; 656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mMin2Min1 = localTemp[3]; 657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPrlVersion = localTemp[4]; 658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("MDN: " + mMyMobileNumber + " MIN: " + mMin2Min1); 660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_ICCID_DONE: 664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = true; 665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville data = (byte[])ar.result; 668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 673b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville mIccId = IccUtils.bcdToString(data, 0, data.length); 674a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan mFullIccId = IccUtils.bchToString(data, 0, data.length); 675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 676a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan log("iccid: " + SubscriptionInfo.givePrintableIccid(mFullIccId)); 677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_UPDATE_DONE: 681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 68399c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.i(LOG_TAG, "RuimRecords update failed", ar.exception); 684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_ALL_SMS_DONE: 688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_MARK_SMS_READ_DONE: 689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_SMS_ON_RUIM: 690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_SMS_DONE: 69199c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.w(LOG_TAG, "Event not supported: " + msg.what); 692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // TODO: probably EF_CST should be read instead 695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_SST_DONE: 696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("Event EVENT_GET_SST_DONE Received"); 697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_RUIM_REFRESH: 700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isRecordLoadResponse = false; 701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception == null) { 703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleRuimRefresh((IccRefreshResponse)ar.result); 704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 707e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka default: 708e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka super.handleMessage(msg); // IccRecords handles generic record load responses 709e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 710c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville }}catch (RuntimeException exc) { 711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // I don't want these exceptions to be fatal 71299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.w(LOG_TAG, "Exception parsing RUIM record", exc); 713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } finally { 714c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Count up record load responses even if they are fails 715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (isRecordLoadResponse) { 716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onRecordLoaded(); 717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 718c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 7210cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath /** 7220cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath * Returns an array of languages we have assets for. 7230cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath * 7240cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath * NOTE: This array will have duplicates. If this method will be caused 7250cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath * frequently or in a tight loop, it can be rewritten for efficiency. 7260cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath */ 7270cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath private static String[] getAssetLanguages(Context ctx) { 7280cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath final String[] locales = ctx.getAssets().getLocales(); 7290cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath final String[] localeLangs = new String[locales.length]; 7300cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath for (int i = 0; i < locales.length; ++i) { 7310cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath final String localeStr = locales[i]; 7320cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath final int separator = localeStr.indexOf('-'); 7330cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath if (separator < 0) { 7340cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath localeLangs[i] = localeStr; 7350cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath } else { 7360cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath localeLangs[i] = localeStr.substring(0, separator); 7370cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath } 7380cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath } 7390cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath 7400cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath return localeLangs; 7410cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath } 7420cdae27a3afaf241764dc3a03bfff6ed012656dbNarayan Kamath 743c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void onRecordLoaded() { 745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // One record loaded successfully or failed, In either case 746c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // we need to update the recordsToLoad count 74722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad -= 1; 74822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (DBG) log("onRecordLoaded " + mRecordsToLoad + " requested: " + mRecordsRequested); 749c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 75022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mRecordsToLoad == 0 && mRecordsRequested == true) { 751c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onAllRecordsLoaded(); 75222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville } else if (mRecordsToLoad < 0) { 753bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka loge("recordsToLoad <0, programmer error suspected"); 75422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad = 0; 755c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 756c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 757c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 758c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 759c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void onAllRecordsLoaded() { 760bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka if (DBG) log("record load complete"); 761bb36adde615d3d85fa0fc23935197c6bc6a799edAlex Yakavenka 762c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Further records that can be inserted are Operator/OEM dependent 763c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 764f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby // FIXME: CSIM IMSI may not contain the MNC. 765f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby if (false) { 766f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby String operator = getRUIMOperatorNumeric(); 767f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby if (!TextUtils.isEmpty(operator)) { 768f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby log("onAllRecordsLoaded set 'gsm.sim.operator.numeric' to operator='" + 769f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby operator + "'"); 770a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("update icc_operator_numeric=" + operator); 771e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu mTelephonyManager.setSimOperatorNumericForPhone( 772e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu mParentApp.getPhoneId(), operator); 773f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby } else { 774f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby log("onAllRecordsLoaded empty 'gsm.sim.operator.numeric' skipping"); 775f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby } 776c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 777f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby if (!TextUtils.isEmpty(mImsi)) { 778a1421a82e8d4f711ba13a86d40889868ead492d4Amit Mahajan log("onAllRecordsLoaded set mcc imsi=" + (VDBG ? ("=" + mImsi) : "")); 779e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu mTelephonyManager.setSimCountryIsoForPhone( 780e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu mParentApp.getPhoneId(), 781e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu MccTable.countryCodeForMcc( 782e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu Integer.parseInt(mImsi.substring(0,3)))); 783f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby } else { 784f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby log("onAllRecordsLoaded empty imsi skipping setting mcc"); 785f93def879c5225379e1542eedf50bfd6aca17779Jake Hamby } 786c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 787e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 788c9a55d1e545ab7bc92e14c2ca1123ac71b18f7feAmit Mahajan Resources resource = Resources.getSystem(); 789c9a55d1e545ab7bc92e14c2ca1123ac71b18f7feAmit Mahajan if (resource.getBoolean(com.android.internal.R.bool.config_use_sim_language_file)) { 790c9a55d1e545ab7bc92e14c2ca1123ac71b18f7feAmit Mahajan setSimLanguage(mEFli, mEFpl); 791c9a55d1e545ab7bc92e14c2ca1123ac71b18f7feAmit Mahajan } 792c9a55d1e545ab7bc92e14c2ca1123ac71b18f7feAmit Mahajan 793b7881d6e7e4e79491376bedf151c3412dfdc4121Wink Saville mRecordsLoadedRegistrants.notifyRegistrants( 794c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville new AsyncResult(null, null, null)); 7955866914ae9798adebcb84cd710bca660b797bff0Amit Mahajan 796062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal // TODO: The below is hacky since the SubscriptionController may not be ready at this time. 7975866914ae9798adebcb84cd710bca660b797bff0Amit Mahajan if (!TextUtils.isEmpty(mMdn)) { 798062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal int phoneId = mParentApp.getUiccCard().getPhoneId(); 799062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal int[] subIds = SubscriptionController.getInstance().getSubId(phoneId); 800062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal if (subIds != null) { 801062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal SubscriptionManager.from(mContext).setDisplayNumber(mMdn, subIds[0]); 802062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal } else { 803062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal log("Cannot call setDisplayNumber: invalid subId"); 804062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal } 8055866914ae9798adebcb84cd710bca660b797bff0Amit Mahajan } 806c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 807c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 808c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 809c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void onReady() { 810c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fetchRuimRecords(); 811c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 812c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCi.getCDMASubscription(obtainMessage(EVENT_GET_CDMA_SUBSCRIPTION_DONE)); 813c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 814c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 815c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 816c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void fetchRuimRecords() { 81722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsRequested = true; 818c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 81922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (DBG) log("fetchRuimRecords " + mRecordsToLoad); 820c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 821e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mCi.getIMSIForApp(mParentApp.getAid(), obtainMessage(EVENT_GET_IMSI_DONE)); 82222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 823c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 824c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mFh.loadEFTransparent(EF_ICCID, 825c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_GET_ICCID_DONE)); 82622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 827c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 828c9a55d1e545ab7bc92e14c2ca1123ac71b18f7feAmit Mahajan mFh.loadEFTransparent(EF_PL, 829c9a55d1e545ab7bc92e14c2ca1123ac71b18f7feAmit Mahajan obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfPlLoaded())); 830c9a55d1e545ab7bc92e14c2ca1123ac71b18f7feAmit Mahajan mRecordsToLoad++; 831e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 832c9a55d1e545ab7bc92e14c2ca1123ac71b18f7feAmit Mahajan mFh.loadEFTransparent(EF_CSIM_LI, 833c9a55d1e545ab7bc92e14c2ca1123ac71b18f7feAmit Mahajan obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfCsimLiLoaded())); 834c9a55d1e545ab7bc92e14c2ca1123ac71b18f7feAmit Mahajan mRecordsToLoad++; 835e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 836e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mFh.loadEFTransparent(EF_CSIM_SPN, 837e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfCsimSpnLoaded())); 83822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 839e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 840e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mFh.loadEFLinearFixed(EF_CSIM_MDN, 1, 841e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfCsimMdnLoaded())); 84222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 843e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 844e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mFh.loadEFTransparent(EF_CSIM_IMSIM, 845e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfCsimImsimLoaded())); 84622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 847e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 848e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mFh.loadEFLinearFixedAll(EF_CSIM_CDMAHOME, 849e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfCsimCdmaHomeLoaded())); 85022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 851e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 852e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // Entire PRL could be huge. We are only interested in 853e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // the first 4 bytes of the record. 854e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mFh.loadEFTransparent(EF_CSIM_EPRL, 4, 855e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfCsimEprlLoaded())); 85622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mRecordsToLoad++; 857e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 8582351b17aba5350004fc76707f3b3d2859ce773c8xinhe mFh.loadEFTransparent(EF_CSIM_MIPUPP, 8592351b17aba5350004fc76707f3b3d2859ce773c8xinhe obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfCsimMipUppLoaded())); 8602351b17aba5350004fc76707f3b3d2859ce773c8xinhe mRecordsToLoad++; 8612351b17aba5350004fc76707f3b3d2859ce773c8xinhe 86222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (DBG) log("fetchRuimRecords " + mRecordsToLoad + " requested: " + mRecordsRequested); 863c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Further records that can be inserted are Operator/OEM dependent 864c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 865c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 866c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 867c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@inheritDoc} 868c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 869c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * No Display rule for RUIMs yet. 870c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 871c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 872c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public int getDisplayRule(String plmn) { 873c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // TODO together with spn 874c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return 0; 875c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 876c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 877c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 878e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public boolean isProvisioned() { 879e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // If UICC card has CSIM app, look for MDN and MIN field 880e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // to determine if the SIM is provisioned. Otherwise, 881e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // consider the SIM is provisioned. (for case of ordinal 882e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // USIM only UICC.) 883e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // If PROPERTY_TEST_CSIM is defined, bypess provision check 884e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka // and consider the SIM is provisioned. 885e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (SystemProperties.getBoolean(PROPERTY_TEST_CSIM, false)) { 886e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return true; 887e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 888e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 889e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mParentApp == null) { 890e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return false; 891e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 892e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 893e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mParentApp.getType() == AppType.APPTYPE_CSIM && 894e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ((mMdn == null) || (mMin == null))) { 895e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return false; 896e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 897e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return true; 898e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 899e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 900e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka @Override 901c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void setVoiceMessageWaiting(int line, int countWaiting) { 90226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa // Will be used in future to store voice mail count in UIM 90326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa // C.S0023-D_v1.0 does not have a file id in UIM for MWI 90426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa log("RuimRecords:setVoiceMessageWaiting - NOP for CDMA"); 90526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa } 906c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 90726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa @Override 90826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa public int getVoiceMessageCount() { 90926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa // Will be used in future to retrieve voice mail count for UIM 91026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa // C.S0023-D_v1.0 does not have a file id in UIM for MWI 91126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa log("RuimRecords:getVoiceMessageCount - NOP for CDMA"); 91226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa return 0; 913c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 914c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 915c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void handleRuimRefresh(IccRefreshResponse refreshResponse) { 916c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (refreshResponse == null) { 917c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("handleRuimRefresh received without input"); 918c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 919c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 920c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 921c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (refreshResponse.aid != null && 922e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka !refreshResponse.aid.equals(mParentApp.getAid())) { 923c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // This is for different app. Ignore. 924c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 925c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 926c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 927c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (refreshResponse.refreshResult) { 928c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case IccRefreshResponse.REFRESH_RESULT_FILE_UPDATE: 929c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("handleRuimRefresh with SIM_REFRESH_FILE_UPDATED"); 93022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAdnCache.reset(); 931c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fetchRuimRecords(); 932c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 933c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case IccRefreshResponse.REFRESH_RESULT_INIT: 934c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("handleRuimRefresh with SIM_REFRESH_INIT"); 935c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // need to reload all files (that we care about) 93664bfd98578babdd437f1a83d2d5e1fc92c76e729Alex Yakavenka onIccRefreshInit(); 937c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 938c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case IccRefreshResponse.REFRESH_RESULT_RESET: 93962648296ee1514d871d7d779d6f33da5e55babcaShishir Agrawal // Refresh reset is handled by the UiccCard object. 940c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("handleRuimRefresh with SIM_REFRESH_RESET"); 941c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 942c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 943c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // unknown refresh operation 944c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("handleRuimRefresh with unknown operation"); 945c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 946c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 947c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 948c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 949e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public String getMdn() { 950e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mMdn; 951e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 952e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 953e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public String getMin() { 954e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mMin; 955e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 956e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 957e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public String getSid() { 958e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mHomeSystemId; 959e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 960e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 961e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public String getNid() { 962e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mHomeNetworkId; 963e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 964e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 965e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka public boolean getCsimSpnDisplayCondition() { 966e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka return mCsimSpnDisplayCondition; 967e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } 968c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 969c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void log(String s) { 97099c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.d(LOG_TAG, "[RuimRecords] " + s); 971c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 972c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 973c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 974c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void loge(String s) { 97599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.e(LOG_TAG, "[RuimRecords] " + s); 976c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 97705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka 97805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka @Override 97905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 98005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println("RuimRecords: " + this); 98105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" extends:"); 98205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka super.dump(fd, pw, args); 98322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville pw.println(" mOtaCommited=" + mOtaCommited); 98405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mMyMobileNumber=" + mMyMobileNumber); 98505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mMin2Min1=" + mMin2Min1); 98605ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mPrlVersion=" + mPrlVersion); 98705ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mEFpl[]=" + Arrays.toString(mEFpl)); 98805ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mEFli[]=" + Arrays.toString(mEFli)); 98905ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mCsimSpnDisplayCondition=" + mCsimSpnDisplayCondition); 99005ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mMdn=" + mMdn); 99105ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mMin=" + mMin); 99205ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mHomeSystemId=" + mHomeSystemId); 99305ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.println(" mHomeNetworkId=" + mHomeNetworkId); 99405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka pw.flush(); 99505ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka } 996c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville} 997