Use correct SPN format for WFC.

Bug: 30474919
Change-Id: I082dfd847316c15a2e4eda86e21e003e3ac398d5
diff --git a/src/java/com/android/internal/telephony/ServiceStateTracker.java b/src/java/com/android/internal/telephony/ServiceStateTracker.java
index a919af2..5c2928a 100644
--- a/src/java/com/android/internal/telephony/ServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/ServiceStateTracker.java
@@ -2087,6 +2087,34 @@
     }
 
     protected void updateSpnDisplay() {
+        String wfcVoiceSpnFormat = null;
+        String wfcDataSpnFormat = null;
+        if (mPhone.getImsPhone() != null && mPhone.getImsPhone().isWifiCallingEnabled()) {
+            // In Wi-Fi Calling mode show SPN+WiFi
+
+            String[] wfcSpnFormats = mPhone.getContext().getResources().getStringArray(
+                    com.android.internal.R.array.wfcSpnFormats);
+            int voiceIdx = 0;
+            int dataIdx = 0;
+            CarrierConfigManager configLoader = (CarrierConfigManager)
+                    mPhone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE);
+            if (configLoader != null) {
+                try {
+                    PersistableBundle b = configLoader.getConfigForSubId(mPhone.getSubId());
+                    if (b != null) {
+                        voiceIdx = b.getInt(CarrierConfigManager.KEY_WFC_SPN_FORMAT_IDX_INT);
+                        dataIdx = b.getInt(
+                                CarrierConfigManager.KEY_WFC_DATA_SPN_FORMAT_IDX_INT);
+                    }
+                } catch (Exception e) {
+                    loge("updateSpnDisplay: carrier config error: " + e);
+                }
+            }
+
+            wfcVoiceSpnFormat = wfcSpnFormats[voiceIdx];
+            wfcDataSpnFormat = wfcSpnFormats[dataIdx];
+        }
+
         if (mPhone.isPhoneTypeGsm()) {
             // The values of plmn/showPlmn change in different scenarios.
             // 1) No service but emergency call allowed -> expected
@@ -2149,36 +2177,13 @@
                     && ((rule & SIMRecords.SPN_RULE_SHOW_SPN)
                     == SIMRecords.SPN_RULE_SHOW_SPN);
 
-            if (!TextUtils.isEmpty(spn)
-                    && mPhone.getImsPhone() != null
-                    && mPhone.getImsPhone().isWifiCallingEnabled()) {
+            if (!TextUtils.isEmpty(spn) && !TextUtils.isEmpty(wfcVoiceSpnFormat) &&
+                    !TextUtils.isEmpty(wfcDataSpnFormat)) {
                 // In Wi-Fi Calling mode show SPN+WiFi
 
-                final String[] wfcSpnFormats =
-                        mPhone.getContext().getResources().getStringArray(
-                                com.android.internal.R.array.wfcSpnFormats);
-                int voiceIdx = 0;
-                int dataIdx = 0;
-                CarrierConfigManager configLoader = (CarrierConfigManager)
-                        mPhone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE);
-                if (configLoader != null) {
-                    try {
-                        PersistableBundle b = configLoader.getConfigForSubId(mPhone.getSubId());
-                        if (b != null) {
-                            voiceIdx = b.getInt(CarrierConfigManager.KEY_WFC_SPN_FORMAT_IDX_INT);
-                            dataIdx = b.getInt(
-                                    CarrierConfigManager.KEY_WFC_DATA_SPN_FORMAT_IDX_INT);
-                        }
-                    } catch (Exception e) {
-                        loge("updateSpnDisplay: carrier config error: " + e);
-                    }
-                }
-
-                String formatVoice = wfcSpnFormats[voiceIdx];
-                String formatData = wfcSpnFormats[dataIdx];
                 String originalSpn = spn.trim();
-                spn = String.format(formatVoice, originalSpn);
-                dataSpn = String.format(formatData, originalSpn);
+                spn = String.format(wfcVoiceSpnFormat, originalSpn);
+                dataSpn = String.format(wfcDataSpnFormat, originalSpn);
                 showSpn = true;
                 showPlmn = false;
             } else if (mSS.getVoiceRegState() == ServiceState.STATE_POWER_OFF
@@ -2202,10 +2207,9 @@
                     || !TextUtils.equals(dataSpn, mCurDataSpn)
                     || !TextUtils.equals(plmn, mCurPlmn)) {
                 if (DBG) {
-                    log(String.format("updateSpnDisplay: changed" +
-                                    " sending intent rule=" + rule +
-                                    " showPlmn='%b' plmn='%s' showSpn='%b' spn='%s' dataSpn='%s' subId='%d'",
-                            showPlmn, plmn, showSpn, spn, dataSpn, subId));
+                    log(String.format("updateSpnDisplay: changed sending intent rule=" + rule +
+                            " showPlmn='%b' plmn='%s' showSpn='%b' spn='%s' dataSpn='%s' " +
+                            "subId='%d'", showPlmn, plmn, showSpn, spn, dataSpn, subId));
                 }
                 Intent intent = new Intent(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION);
                 intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
@@ -2242,6 +2246,20 @@
                 subId = subIds[0];
             }
 
+            if (!TextUtils.isEmpty(plmn) && !TextUtils.isEmpty(wfcVoiceSpnFormat)) {
+                // In Wi-Fi Calling mode show SPN+WiFi
+
+                String originalPlmn = plmn.trim();
+                plmn = String.format(wfcVoiceSpnFormat, originalPlmn);
+            } else if (mCi.getRadioState() == CommandsInterface.RadioState.RADIO_OFF) {
+                // todo: temporary hack; should have a better fix. This is to avoid using operator
+                // name from ServiceState (populated in resetServiceStateInIwlanMode()) until
+                // wifi calling is actually enabled
+                log("updateSpnDisplay: overwriting plmn from " + plmn + " to null as radio " +
+                        "state is off");
+                plmn = null;
+            }
+
             if (mSubId != subId || !TextUtils.equals(plmn, mCurPlmn)) {
                 // Allow A blank plmn, "" to set showPlmn to true. Previously, we
                 // would set showPlmn to true only if plmn was not empty, i.e. was not
@@ -2414,9 +2432,7 @@
     }
 
     public void onImsCapabilityChanged() {
-        if (mPhone.isPhoneTypeGsm()) {
-            sendMessage(obtainMessage(EVENT_IMS_CAPABILITY_CHANGED));
-        }
+        sendMessage(obtainMessage(EVENT_IMS_CAPABILITY_CHANGED));
     }
 
     public boolean isRadioOn() {
@@ -4809,10 +4825,13 @@
                 log("pollStateDone: reset iwlan RAT value");
                 resetIwlanRatVal = true;
             }
+            // operator info should be kept in SS
+            String operator = mNewSS.getOperatorAlphaLong();
             mNewSS.setStateOff();
             if (resetIwlanRatVal) {
                 mNewSS.setRilDataRadioTechnology(ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN);
                 mNewSS.setDataRegState(ServiceState.STATE_IN_SERVICE);
+                mNewSS.setOperatorAlphaLong(operator);
                 log("pollStateDone: mNewSS = " + mNewSS);
             }
         }