Merge "Fix NPE for VVM Sync sms messages." into mnc-dev
diff --git a/sip/src/com/android/services/telephony/sip/SipAccountRegistry.java b/sip/src/com/android/services/telephony/sip/SipAccountRegistry.java
index 0a08c61..dd76c27 100644
--- a/sip/src/com/android/services/telephony/sip/SipAccountRegistry.java
+++ b/sip/src/com/android/services/telephony/sip/SipAccountRegistry.java
@@ -113,9 +113,30 @@
     }
 
     void setup(Context context) {
+        verifyAndPurgeInvalidPhoneAccounts(context);
         startSipProfilesAsync(context, (String) null, false);
+    }
 
-        // TODO: remove orphaned SIP Accounts
+    /**
+     * Checks the existing SIP phone {@link PhoneAccount}s registered with telecom and deletes any
+     * invalid accounts.
+     *
+     * @param context The context.
+     */
+    void verifyAndPurgeInvalidPhoneAccounts(Context context) {
+        TelecomManager telecomManager = TelecomManager.from(context);
+        SipProfileDb profileDb = new SipProfileDb(context);
+        List<PhoneAccountHandle> accountHandles = telecomManager.getPhoneAccountsSupportingScheme(
+                PhoneAccount.SCHEME_SIP);
+
+        for (PhoneAccountHandle accountHandle : accountHandles) {
+            String profileName = SipUtil.getSipProfileNameFromPhoneAccount(accountHandle);
+            SipProfile profile = profileDb.retrieveSipProfileFromName(profileName);
+            if (profile == null) {
+                log("verifyAndPurgeInvalidPhoneAccounts, deleting account: " + accountHandle);
+                telecomManager.unregisterPhoneAccount(accountHandle);
+            }
+        }
     }
 
     /**
diff --git a/src/com/android/phone/CarrierConfigLoader.java b/src/com/android/phone/CarrierConfigLoader.java
index 2c2e095..09f12ff 100644
--- a/src/com/android/phone/CarrierConfigLoader.java
+++ b/src/com/android/phone/CarrierConfigLoader.java
@@ -259,8 +259,9 @@
                         newMsg.getData().putBoolean("loaded_from_xml", true);
                         sendMessage(newMsg);
                     } else {
-                        if (bindToConfigPackage(carrierPackageName, phoneId,
-                                EVENT_CONNECTED_TO_CARRIER)) {
+                        if (carrierPackageName != null
+                            && bindToConfigPackage(carrierPackageName, phoneId,
+                                    EVENT_CONNECTED_TO_CARRIER)) {
                             sendMessageDelayed(obtainMessage(EVENT_BIND_CARRIER_TIMEOUT, phoneId, -1),
                                     BIND_TIMEOUT_MILLIS);
                         } else {
diff --git a/src/com/android/phone/MobileNetworkSettings.java b/src/com/android/phone/MobileNetworkSettings.java
index ad9032f..cf928ae 100644
--- a/src/com/android/phone/MobileNetworkSettings.java
+++ b/src/com/android/phone/MobileNetworkSettings.java
@@ -992,7 +992,9 @@
                         R.string.preferred_network_mode_lte_cdma_evdo_summary);
                 break;
             case Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA:
-                if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
+                if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA ||
+                        mIsGlobalCdma ||
+                        isWorldMode()) {
                     mButtonPreferredNetworkMode.setSummary(
                             R.string.preferred_network_mode_global_summary);
                 } else {
@@ -1092,7 +1094,9 @@
                 }
                 mButtonEnabledNetworks.setValue(
                         Integer.toString(Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA));
-                if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
+                if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA ||
+                        mIsGlobalCdma ||
+                        isWorldMode()) {
                     mButtonEnabledNetworks.setSummary(R.string.network_global);
                 } else {
                     mButtonEnabledNetworks.setSummary((mShow4GForLTE == true)
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 5848135..9c53898 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -186,7 +186,9 @@
         // when voice RAT is OOS but Data RAT is present.
         int state = phone.getServiceState().getState();
         if (state == ServiceState.STATE_OUT_OF_SERVICE) {
-            state = phone.getServiceState().getDataRegState();
+            if (phone.getServiceState().getDataNetworkType() == TelephonyManager.NETWORK_TYPE_LTE) {
+                state = phone.getServiceState().getDataRegState();
+            }
         }
         boolean useEmergencyCallHelper = false;