Make FSM for loading SPN more robust

Let FSM for loading SPN continue if the loaded
data is null or empty.

Change-Id: Ie0a138edb62a02761108b9dbf117d9199ef8354b
diff --git a/src/java/com/android/internal/telephony/uicc/SIMRecords.java b/src/java/com/android/internal/telephony/uicc/SIMRecords.java
index 06ea59b..7df7aa4 100644
--- a/src/java/com/android/internal/telephony/uicc/SIMRecords.java
+++ b/src/java/com/android/internal/telephony/uicc/SIMRecords.java
@@ -1732,22 +1732,32 @@
                 if (ar != null && ar.exception == null) {
                     data = (byte[]) ar.result;
                     mSpnDisplayCondition = 0xff & data[0];
+
                     setServiceProviderName(IccUtils.adnStringFieldToString(
                             data, 1, data.length - 1));
+                    // for card double-check and brand override
+                    // we have to do this:
+                    final String spn = getServiceProviderName();
 
-                    if (DBG) log("Load EF_SPN: " + getServiceProviderName()
-                            + " spnDisplayCondition: " + mSpnDisplayCondition);
-                    mTelephonyManager.setSimOperatorNameForPhone(
-                            mParentApp.getPhoneId(), getServiceProviderName());
+                    if (spn == null || spn.length() == 0) {
+                        mSpnState = GetSpnFsmState.READ_SPN_CPHS;
+                    } else {
+                        if (DBG) log("Load EF_SPN: " + spn
+                                + " spnDisplayCondition: " + mSpnDisplayCondition);
+                        mTelephonyManager.setSimOperatorNameForPhone(
+                                mParentApp.getPhoneId(), spn);
 
-                    mSpnState = GetSpnFsmState.IDLE;
+                        mSpnState = GetSpnFsmState.IDLE;
+                    }
                 } else {
+                    mSpnState = GetSpnFsmState.READ_SPN_CPHS;
+                }
+
+                if (mSpnState == GetSpnFsmState.READ_SPN_CPHS) {
                     mFh.loadEFTransparent( EF_SPN_CPHS,
                             obtainMessage(EVENT_GET_SPN_DONE));
                     mRecordsToLoad++;
 
-                    mSpnState = GetSpnFsmState.READ_SPN_CPHS;
-
                     // See TS 51.011 10.3.11.  Basically, default to
                     // show PLMN always, and SPN also if roaming.
                     mSpnDisplayCondition = -1;
@@ -1756,34 +1766,57 @@
             case READ_SPN_CPHS:
                 if (ar != null && ar.exception == null) {
                     data = (byte[]) ar.result;
-                    setServiceProviderName(IccUtils.adnStringFieldToString(data, 0, data.length));
-                    // Display CPHS Operator Name only when not roaming
-                    mSpnDisplayCondition = 2;
 
-                    if (DBG) log("Load EF_SPN_CPHS: " + getServiceProviderName());
-                    mTelephonyManager.setSimOperatorNameForPhone(
-                            mParentApp.getPhoneId(), getServiceProviderName());
+                    setServiceProviderName(IccUtils.adnStringFieldToString(
+                            data, 0, data.length));
+                    // for card double-check and brand override
+                    // we have to do this:
+                    final String spn = getServiceProviderName();
 
-                    mSpnState = GetSpnFsmState.IDLE;
+                    if (spn == null || spn.length() == 0) {
+                        mSpnState = GetSpnFsmState.READ_SPN_SHORT_CPHS;
+                    } else {
+                        // Display CPHS Operator Name only when not roaming
+                        mSpnDisplayCondition = 2;
+
+                        if (DBG) log("Load EF_SPN_CPHS: " + spn);
+                        mTelephonyManager.setSimOperatorNameForPhone(
+                                mParentApp.getPhoneId(), spn);
+
+                        mSpnState = GetSpnFsmState.IDLE;
+                    }
                 } else {
+                    mSpnState = GetSpnFsmState.READ_SPN_SHORT_CPHS;
+                }
+
+                if (mSpnState == GetSpnFsmState.READ_SPN_SHORT_CPHS) {
                     mFh.loadEFTransparent(
                             EF_SPN_SHORT_CPHS, obtainMessage(EVENT_GET_SPN_DONE));
                     mRecordsToLoad++;
-
-                    mSpnState = GetSpnFsmState.READ_SPN_SHORT_CPHS;
                 }
                 break;
             case READ_SPN_SHORT_CPHS:
                 if (ar != null && ar.exception == null) {
                     data = (byte[]) ar.result;
-                    setServiceProviderName(IccUtils.adnStringFieldToString(data, 0, data.length));
-                    // Display CPHS Operator Name only when not roaming
-                    mSpnDisplayCondition = 2;
 
-                    if (DBG) log("Load EF_SPN_SHORT_CPHS: " + getServiceProviderName());
-                    mTelephonyManager.setSimOperatorNameForPhone(
-                            mParentApp.getPhoneId(), getServiceProviderName());
-                }else {
+                    setServiceProviderName(IccUtils.adnStringFieldToString(
+                            data, 0, data.length));
+                    // for card double-check and brand override
+                    // we have to do this:
+                    final String spn = getServiceProviderName();
+
+                    if (spn == null || spn.length() == 0) {
+                        if (DBG) log("No SPN loaded in either CHPS or 3GPP");
+                    } else {
+                        // Display CPHS Operator Name only when not roaming
+                        mSpnDisplayCondition = 2;
+
+                        if (DBG) log("Load EF_SPN_SHORT_CPHS: " + spn);
+                        mTelephonyManager.setSimOperatorNameForPhone(
+                                mParentApp.getPhoneId(), spn);
+                    }
+                } else {
+                    setServiceProviderName(null);
                     if (DBG) log("No SPN loaded in either CHPS or 3GPP");
                 }