From 439561ad21ada21c32977f8189af4b01aaacaff8 Mon Sep 17 00:00:00 2001 From: Brad Ebinger Date: Thu, 30 Aug 2018 16:20:40 -0700 Subject: Fix SubscriptionController crash during subid verification Receiving reports of ImsManager causing crashes when trying to update settings in the siminfo db related to WFC. This should only be triggered when there is a valid sub id, which causes a crash. There is not enough info in the bugreports to find the root cause, but I can at least fix the phone crash and log an error when this happens. Test: atest FrameworksTelephonyTests Bug: 113291931 Change-Id: I825392c6a8ac1602ac7e5c915b80b41aa6734d27 --- src/java/com/android/ims/ImsManager.java | 139 ++++++++++++++++++------------- 1 file changed, 81 insertions(+), 58 deletions(-) diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java index 31dd86f4..dc58813f 100644 --- a/src/java/com/android/ims/ImsManager.java +++ b/src/java/com/android/ims/ImsManager.java @@ -480,21 +480,28 @@ public class ImsManager { * */ public void setEnhanced4gLteModeSetting(boolean enabled) { + int subId = getSubId(); // If editable=false, we must keep default advanced 4G mode. if (!getBooleanCarrierConfig(CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL)) { enabled = getBooleanCarrierConfig( CarrierConfigManager.KEY_ENHANCED_4G_LTE_ON_BY_DEFAULT_BOOL); } - int prevSetting = SubscriptionManager.getIntegerSubscriptionProperty( - getSubId(), SubscriptionManager.ENHANCED_4G_MODE_ENABLED, - SUB_PROPERTY_NOT_INITIALIZED, mContext); + int prevSetting = SubscriptionManager.getIntegerSubscriptionProperty(subId, + SubscriptionManager.ENHANCED_4G_MODE_ENABLED, SUB_PROPERTY_NOT_INITIALIZED, + mContext); if (prevSetting != (enabled ? ImsConfig.FeatureValueConstants.ON : ImsConfig.FeatureValueConstants.OFF)) { - SubscriptionManager.setSubscriptionProperty(getSubId(), - SubscriptionManager.ENHANCED_4G_MODE_ENABLED, booleanToPropertyString(enabled)); + if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + SubscriptionManager.setSubscriptionProperty(subId, + SubscriptionManager.ENHANCED_4G_MODE_ENABLED, + booleanToPropertyString(enabled)); + } else { + loge("setEnhanced4gLteModeSetting: invalid sub id, can not set property in " + + " siminfo db."); + } if (isNonTtyOrTtyOnVolteEnabled()) { try { setAdvanced4GMode(enabled); @@ -760,8 +767,13 @@ public class ImsManager { * Change persistent VT enabled setting for slot. */ public void setVtSetting(boolean enabled) { - SubscriptionManager.setSubscriptionProperty(getSubId(), SubscriptionManager.VT_IMS_ENABLED, - booleanToPropertyString(enabled)); + int subId = getSubId(); + if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + SubscriptionManager.setSubscriptionProperty(subId, SubscriptionManager.VT_IMS_ENABLED, + booleanToPropertyString(enabled)); + } else { + loge("setVtSetting: sub id invalid, skip modifying vt state in subinfo db."); + } try { changeMmTelCapability(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO, @@ -871,12 +883,17 @@ public class ImsManager { * Change persistent WFC enabled setting for slot. */ public void setWfcSetting(boolean enabled) { - SubscriptionManager.setSubscriptionProperty(getSubId(), - SubscriptionManager.WFC_IMS_ENABLED, booleanToPropertyString(enabled)); + int subId = getSubId(); + if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + SubscriptionManager.setSubscriptionProperty(subId, SubscriptionManager.WFC_IMS_ENABLED, + booleanToPropertyString(enabled)); + } else { + loge("setWfcSetting: invalid sub id, can not set WFC setting in siminfo db"); + } TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); - setWfcNonPersistent(enabled, getWfcMode(tm.isNetworkRoaming(getSubId()))); + setWfcNonPersistent(enabled, getWfcMode(tm.isNetworkRoaming(subId))); } /** @@ -952,8 +969,13 @@ public class ImsManager { public void setWfcMode(int wfcMode) { if (DBG) log("setWfcMode(i) - setting=" + wfcMode); - SubscriptionManager.setSubscriptionProperty(getSubId(), - SubscriptionManager.WFC_IMS_MODE, Integer.toString(wfcMode)); + int subId = getSubId(); + if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + SubscriptionManager.setSubscriptionProperty(subId, SubscriptionManager.WFC_IMS_MODE, + Integer.toString(wfcMode)); + } else { + loge("setWfcMode: invalid sub id, skip setting value in siminfo db"); + } setWfcModeInternal(wfcMode); } @@ -1047,14 +1069,19 @@ public class ImsManager { * @param roaming {@code false} for home network setting, {@code true} for roaming setting */ public void setWfcMode(int wfcMode, boolean roaming) { - if (!roaming) { - if (DBG) log("setWfcMode(i,b) - setting=" + wfcMode); - SubscriptionManager.setSubscriptionProperty(getSubId(), - SubscriptionManager.WFC_IMS_MODE, Integer.toString(wfcMode)); + int subId = getSubId(); + if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + if (!roaming) { + if (DBG) log("setWfcMode(i,b) - setting=" + wfcMode); + SubscriptionManager.setSubscriptionProperty(subId, SubscriptionManager.WFC_IMS_MODE, + Integer.toString(wfcMode)); + } else { + if (DBG) log("setWfcMode(i,b) (roaming) - setting=" + wfcMode); + SubscriptionManager.setSubscriptionProperty(subId, + SubscriptionManager.WFC_IMS_ROAMING_MODE, Integer.toString(wfcMode)); + } } else { - if (DBG) log("setWfcMode(i,b) (roaming) - setting=" + wfcMode); - SubscriptionManager.setSubscriptionProperty(getSubId(), - SubscriptionManager.WFC_IMS_ROAMING_MODE, Integer.toString(wfcMode)); + loge("setWfcMode(i,b): invalid sub id, skip setting setting in siminfo db"); } TelephonyManager tm = (TelephonyManager) @@ -1938,15 +1965,10 @@ public class ImsManager { * @return boolean value of corresponding key. */ private boolean getBooleanCarrierConfig(String key) { - int[] subIds = SubscriptionManager.getSubId(mPhoneId); - int subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; - if (subIds != null && subIds.length >= 1) { - subId = subIds[0]; - } PersistableBundle b = null; if (mConfigManager != null) { // If an invalid subId is used, this bundle will contain default values. - b = mConfigManager.getConfigForSubId(subId); + b = mConfigManager.getConfigForSubId(getSubId()); } if (b != null) { return b.getBoolean(key); @@ -1963,15 +1985,10 @@ public class ImsManager { * @return integer value of corresponding key. */ private int getIntCarrierConfig(String key) { - int[] subIds = SubscriptionManager.getSubId(mPhoneId); - int subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; - if (subIds != null && subIds.length >= 1) { - subId = subIds[0]; - } PersistableBundle b = null; if (mConfigManager != null) { // If an invalid subId is used, this bundle will contain default values. - b = mConfigManager.getConfigForSubId(subId); + b = mConfigManager.getConfigForSubId(getSubId()); } if (b != null) { return b.getInt(key); @@ -2306,33 +2323,39 @@ public class ImsManager { * @hide */ public void factoryReset() { - // Set VoLTE to default - SubscriptionManager.setSubscriptionProperty(getSubId(), - SubscriptionManager.ENHANCED_4G_MODE_ENABLED, - booleanToPropertyString(getBooleanCarrierConfig( - CarrierConfigManager.KEY_ENHANCED_4G_LTE_ON_BY_DEFAULT_BOOL))); - - // Set VoWiFi to default - SubscriptionManager.setSubscriptionProperty(getSubId(), - SubscriptionManager.WFC_IMS_ENABLED, - booleanToPropertyString(getBooleanCarrierConfig( - CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ENABLED_BOOL))); - - // Set VoWiFi mode to default - SubscriptionManager.setSubscriptionProperty(getSubId(), - SubscriptionManager.WFC_IMS_MODE, - Integer.toString(getIntCarrierConfig( - CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT))); - - // Set VoWiFi roaming to default - SubscriptionManager.setSubscriptionProperty(getSubId(), - SubscriptionManager.WFC_IMS_ROAMING_ENABLED, - booleanToPropertyString(getBooleanCarrierConfig( - CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_ENABLED_BOOL))); - - // Set VT to default - SubscriptionManager.setSubscriptionProperty(getSubId(), - SubscriptionManager.VT_IMS_ENABLED, booleanToPropertyString(true)); + int subId = getSubId(); + if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + // Set VoLTE to default + SubscriptionManager.setSubscriptionProperty(subId, + SubscriptionManager.ENHANCED_4G_MODE_ENABLED, + booleanToPropertyString(getBooleanCarrierConfig( + CarrierConfigManager.KEY_ENHANCED_4G_LTE_ON_BY_DEFAULT_BOOL))); + + // Set VoWiFi to default + SubscriptionManager.setSubscriptionProperty(subId, + SubscriptionManager.WFC_IMS_ENABLED, + booleanToPropertyString(getBooleanCarrierConfig( + CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ENABLED_BOOL))); + + // Set VoWiFi mode to default + SubscriptionManager.setSubscriptionProperty(subId, + SubscriptionManager.WFC_IMS_MODE, + Integer.toString(getIntCarrierConfig( + CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT))); + + // Set VoWiFi roaming to default + SubscriptionManager.setSubscriptionProperty(subId, + SubscriptionManager.WFC_IMS_ROAMING_ENABLED, + booleanToPropertyString(getBooleanCarrierConfig( + CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_ENABLED_BOOL))); + + + // Set VT to default + SubscriptionManager.setSubscriptionProperty(subId, + SubscriptionManager.VT_IMS_ENABLED, booleanToPropertyString(true)); + } else { + loge("factoryReset: invalid sub id, can not reset siminfo db settings"); + } // Push settings to ImsConfig updateImsServiceConfig(true); -- cgit v1.2.3