Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 439561ad authored by Brad Ebinger's avatar Brad Ebinger
Browse files

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
parent ca8166fb
Loading
Loading
Loading
Loading
+81 −58
Original line number Diff line number Diff line
@@ -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,
        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,15 +1069,20 @@ public class ImsManager {
     * @param roaming {@code false} for home network setting, {@code true} for roaming setting
     */
    public void setWfcMode(int wfcMode, boolean roaming) {
        int subId = getSubId();
        if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
            if (!roaming) {
                if (DBG) log("setWfcMode(i,b) - setting=" + wfcMode);
            SubscriptionManager.setSubscriptionProperty(getSubId(),
                    SubscriptionManager.WFC_IMS_MODE, Integer.toString(wfcMode));
                SubscriptionManager.setSubscriptionProperty(subId, SubscriptionManager.WFC_IMS_MODE,
                        Integer.toString(wfcMode));
            } else {
                if (DBG) log("setWfcMode(i,b) (roaming) - setting=" + wfcMode);
            SubscriptionManager.setSubscriptionProperty(getSubId(),
                SubscriptionManager.setSubscriptionProperty(subId,
                        SubscriptionManager.WFC_IMS_ROAMING_MODE, Integer.toString(wfcMode));
            }
        } else {
            loge("setWfcMode(i,b): invalid sub id, skip setting setting in siminfo db");
        }

        TelephonyManager tm = (TelephonyManager)
                mContext.getSystemService(Context.TELEPHONY_SERVICE);
@@ -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() {
        int subId = getSubId();
        if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
            // Set VoLTE to default
        SubscriptionManager.setSubscriptionProperty(getSubId(),
            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(getSubId(),
            SubscriptionManager.setSubscriptionProperty(subId,
                    SubscriptionManager.WFC_IMS_ENABLED,
                    booleanToPropertyString(getBooleanCarrierConfig(
                            CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ENABLED_BOOL)));

            // Set VoWiFi mode to default
        SubscriptionManager.setSubscriptionProperty(getSubId(),
            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(getSubId(),
            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(getSubId(),
            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);