diff options
author | Brad Ebinger <breadley@google.com> | 2018-08-30 16:20:40 -0700 |
---|---|---|
committer | Brad Ebinger <breadley@google.com> | 2018-08-30 16:27:15 -0700 |
commit | 439561ad21ada21c32977f8189af4b01aaacaff8 (patch) | |
tree | a058e98e224bd0bf19b83c7a2f22842dbbb809cc | |
parent | ca8166fba2d042a475b042d61c079deb4fac736b (diff) | |
download | ims-439561ad21ada21c32977f8189af4b01aaacaff8.tar.gz |
Fix SubscriptionController crash during subid verificationandroid-o-mr1-iot-release-1.0.4
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
-rw-r--r-- | src/java/com/android/ims/ImsManager.java | 139 |
1 files 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); |