diff options
Diffstat (limited to 'src/java/com/android/internal/telephony/uicc/SIMRecords.java')
-rw-r--r-- | src/java/com/android/internal/telephony/uicc/SIMRecords.java | 191 |
1 files changed, 159 insertions, 32 deletions
diff --git a/src/java/com/android/internal/telephony/uicc/SIMRecords.java b/src/java/com/android/internal/telephony/uicc/SIMRecords.java index e936d85cf..96311b382 100644 --- a/src/java/com/android/internal/telephony/uicc/SIMRecords.java +++ b/src/java/com/android/internal/telephony/uicc/SIMRecords.java @@ -20,15 +20,15 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.res.Resources; import android.os.AsyncResult; import android.os.Message; import android.telephony.CarrierConfigManager; import android.telephony.PhoneNumberUtils; +import android.telephony.Rlog; import android.telephony.SmsMessage; import android.telephony.SubscriptionInfo; import android.text.TextUtils; -import android.telephony.Rlog; -import android.content.res.Resources; import com.android.internal.telephony.CommandsInterface; import com.android.internal.telephony.MccTable; @@ -51,6 +51,8 @@ public class SIMRecords extends IccRecords { private static final boolean CRASH_RIL = false; + private static final boolean VDBG = false; + // ***** Instance Variables VoiceMailConstants mVmConfig; @@ -138,36 +140,47 @@ public class SIMRecords extends IccRecords { private static final int CFIS_ADN_EXTENSION_ID_OFFSET = 15; // ***** Event Constants - private static final int EVENT_GET_IMSI_DONE = 3; - private static final int EVENT_GET_ICCID_DONE = 4; - private static final int EVENT_GET_MBI_DONE = 5; - private static final int EVENT_GET_MBDN_DONE = 6; - private static final int EVENT_GET_MWIS_DONE = 7; - private static final int EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE = 8; - protected static final int EVENT_GET_AD_DONE = 9; // Admin data on SIM - protected static final int EVENT_GET_MSISDN_DONE = 10; - private static final int EVENT_GET_CPHS_MAILBOX_DONE = 11; - private static final int EVENT_GET_SPN_DONE = 12; - private static final int EVENT_GET_SPDI_DONE = 13; - private static final int EVENT_UPDATE_DONE = 14; - private static final int EVENT_GET_PNN_DONE = 15; - protected static final int EVENT_GET_SST_DONE = 17; - private static final int EVENT_GET_ALL_SMS_DONE = 18; - private static final int EVENT_MARK_SMS_READ_DONE = 19; - private static final int EVENT_SET_MBDN_DONE = 20; - private static final int EVENT_SMS_ON_SIM = 21; - private static final int EVENT_GET_SMS_DONE = 22; - private static final int EVENT_GET_CFF_DONE = 24; - private static final int EVENT_SET_CPHS_MAILBOX_DONE = 25; - private static final int EVENT_GET_INFO_CPHS_DONE = 26; - // private static final int EVENT_SET_MSISDN_DONE = 30; Defined in IccRecords as 30 - private static final int EVENT_SIM_REFRESH = 31; - private static final int EVENT_GET_CFIS_DONE = 32; - private static final int EVENT_GET_CSP_CPHS_DONE = 33; - private static final int EVENT_GET_GID1_DONE = 34; - private static final int EVENT_APP_LOCKED = 35; - private static final int EVENT_GET_GID2_DONE = 36; - private static final int EVENT_CARRIER_CONFIG_CHANGED = 37; + private static final int SIM_RECORD_EVENT_BASE = 0x00; + private static final int EVENT_GET_IMSI_DONE = 3 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_ICCID_DONE = 4 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_MBI_DONE = 5 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_MBDN_DONE = 6 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_MWIS_DONE = 7 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE = 8 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_AD_DONE = 9 + SIM_RECORD_EVENT_BASE; // Admin data on SIM + private static final int EVENT_GET_MSISDN_DONE = 10 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_CPHS_MAILBOX_DONE = 11 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_SPN_DONE = 12 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_SPDI_DONE = 13 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_UPDATE_DONE = 14 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_PNN_DONE = 15 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_SST_DONE = 17 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_ALL_SMS_DONE = 18 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_MARK_SMS_READ_DONE = 19 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_SET_MBDN_DONE = 20 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_SMS_ON_SIM = 21 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_SMS_DONE = 22 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_CFF_DONE = 24 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_SET_CPHS_MAILBOX_DONE = 25 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_INFO_CPHS_DONE = 26 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_SET_MSISDN_DONE = 30 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_CFIS_DONE = 32 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_CSP_CPHS_DONE = 33 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_GID1_DONE = 34 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_GID2_DONE = 36 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_PLMN_W_ACT_DONE = 37 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_OPLMN_W_ACT_DONE = 38 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_HPLMN_W_ACT_DONE = 39 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_EHPLMN_DONE = 40 + SIM_RECORD_EVENT_BASE; + private static final int EVENT_GET_FPLMN_DONE = 41 + SIM_RECORD_EVENT_BASE; + + // TODO: Possibly move these to IccRecords.java + private static final int SYSTEM_EVENT_BASE = 0x100; + private static final int EVENT_CARRIER_CONFIG_CHANGED = 1 + SYSTEM_EVENT_BASE; + private static final int EVENT_APP_LOCKED = 2 + SYSTEM_EVENT_BASE; + private static final int EVENT_SIM_REFRESH = 3 + SYSTEM_EVENT_BASE; + + // Lookup table for carriers known to produce SIMs which incorrectly indicate MNC length. @@ -262,6 +275,11 @@ public class SIMRecords extends IccRecords { mPnnHomeName = null; mGid1 = null; mGid2 = null; + mPlmnActRecords = null; + mOplmnActRecords = null; + mHplmnActRecords = null; + mFplmns = null; + mEhplmns = null; mAdnCache.reset(); @@ -1240,6 +1258,76 @@ public class SIMRecords extends IccRecords { break; + case EVENT_GET_PLMN_W_ACT_DONE: + isRecordLoadResponse = true; + ar = (AsyncResult) msg.obj; + data = (byte[]) ar.result; + + if (ar.exception != null || data == null) { + loge("Failed getting User PLMN with Access Tech Records: " + ar.exception); + break; + } else { + log("Received a PlmnActRecord, raw=" + IccUtils.bytesToHexString(data)); + mPlmnActRecords = PlmnActRecord.getRecords(data); + if (VDBG) log("PlmnActRecords=" + Arrays.toString(mPlmnActRecords)); + } + break; + + case EVENT_GET_OPLMN_W_ACT_DONE: + isRecordLoadResponse = true; + ar = (AsyncResult) msg.obj; + data = (byte[]) ar.result; + + if (ar.exception != null || data == null) { + loge("Failed getting Operator PLMN with Access Tech Records: " + + ar.exception); + break; + } else { + log("Received a PlmnActRecord, raw=" + IccUtils.bytesToHexString(data)); + mOplmnActRecords = PlmnActRecord.getRecords(data); + if (VDBG) log("OplmnActRecord[]=" + Arrays.toString(mOplmnActRecords)); + } + break; + + case EVENT_GET_HPLMN_W_ACT_DONE: + isRecordLoadResponse = true; + ar = (AsyncResult) msg.obj; + data = (byte[]) ar.result; + + if (ar.exception != null || data == null) { + loge("Failed getting Home PLMN with Access Tech Records: " + ar.exception); + break; + } else { + log("Received a PlmnActRecord, raw=" + IccUtils.bytesToHexString(data)); + mHplmnActRecords = PlmnActRecord.getRecords(data); + log("HplmnActRecord[]=" + Arrays.toString(mHplmnActRecords)); + } + break; + + case EVENT_GET_EHPLMN_DONE: + isRecordLoadResponse = true; + ar = (AsyncResult) msg.obj; + data = (byte[]) ar.result; + if (ar.exception != null || data == null) { + loge("Failed getting Equivalent Home PLMNs: " + ar.exception); + break; + } else { + mEhplmns = parseBcdPlmnList(data, "Equivalent Home"); + } + break; + + case EVENT_GET_FPLMN_DONE: + isRecordLoadResponse = true; + ar = (AsyncResult) msg.obj; + data = (byte[]) ar.result; + if (ar.exception != null || data == null) { + loge("Failed getting Forbidden PLMNs: " + ar.exception); + break; + } else { + mFplmns = parseBcdPlmnList(data, "Forbidden"); + } + break; + case EVENT_CARRIER_CONFIG_CHANGED: handleCarrierNameOverride(); break; @@ -1634,6 +1722,21 @@ public class SIMRecords extends IccRecords { mFh.loadEFTransparent(EF_GID2, obtainMessage(EVENT_GET_GID2_DONE)); mRecordsToLoad++; + mFh.loadEFTransparent(EF_PLMN_W_ACT, obtainMessage(EVENT_GET_PLMN_W_ACT_DONE)); + mRecordsToLoad++; + + mFh.loadEFTransparent(EF_OPLMN_W_ACT, obtainMessage(EVENT_GET_OPLMN_W_ACT_DONE)); + mRecordsToLoad++; + + mFh.loadEFTransparent(EF_HPLMN_W_ACT, obtainMessage(EVENT_GET_HPLMN_W_ACT_DONE)); + mRecordsToLoad++; + + mFh.loadEFTransparent(EF_EHPLMN, obtainMessage(EVENT_GET_EHPLMN_DONE)); + mRecordsToLoad++; + + mFh.loadEFTransparent(EF_FPLMN, obtainMessage(EVENT_GET_FPLMN_DONE)); + mRecordsToLoad++; + loadEfLiAndEfPl(); // XXX should seek instead of examining them all @@ -1910,6 +2013,25 @@ public class SIMRecords extends IccRecords { } /** + * convert a byte array of packed plmns to an array of strings + */ + private String[] parseBcdPlmnList(byte[] data, String description) { + final int packedBcdPlmnLenBytes = 3; + log("Received " + description + " PLMNs, raw=" + IccUtils.bytesToHexString(data)); + if (data.length == 0 || (data.length % packedBcdPlmnLenBytes) != 0) { + loge("Received invalid " + description + " PLMN list"); + return null; + } + int numPlmns = data.length / packedBcdPlmnLenBytes; + String[] ret = new String[numPlmns]; + for (int i = 0; i < numPlmns; i++) { + ret[i] = IccUtils.bcdPlmnToString(data, i * packedBcdPlmnLenBytes); + } + if (VDBG) logv(description + " PLMNs: " + Arrays.toString(ret)); + return ret; + } + + /** * check to see if Mailbox Number is allocated and activated in CPHS SST */ private boolean isCphsMailboxEnabled() { @@ -2006,6 +2128,11 @@ public class SIMRecords extends IccRecords { pw.println(" mUsimServiceTable=" + mUsimServiceTable); pw.println(" mGid1=" + mGid1); pw.println(" mGid2=" + mGid2); + pw.println(" mPlmnActRecords[]=" + Arrays.toString(mPlmnActRecords)); + pw.println(" mOplmnActRecords[]=" + Arrays.toString(mOplmnActRecords)); + pw.println(" mHplmnActRecords[]=" + Arrays.toString(mHplmnActRecords)); + pw.println(" mFplmns[]=" + Arrays.toString(mFplmns)); + pw.println(" mEhplmns[]=" + Arrays.toString(mEhplmns)); pw.flush(); } } |