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

Commit 4d01c473 authored by joonhunshin's avatar joonhunshin Committed by Automerger Merge Worker
Browse files

New provisioning keys for VoLTE/VoNR, VT, VoWiFi am: 411c9b67

parents c53180f8 411c9b67
Loading
Loading
Loading
Loading
+87 −14
Original line number Original line Diff line number Diff line
@@ -17,17 +17,19 @@
package com.android.ims;
package com.android.ims;


import static android.telephony.ims.ProvisioningManager.KEY_VOIMS_OPT_IN_STATUS;
import static android.telephony.ims.ProvisioningManager.KEY_VOIMS_OPT_IN_STATUS;
import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT;
import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO;
import static android.telephony.ims.feature.MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE;
import static android.telephony.ims.feature.RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE;
import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN;
import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_LTE;


import android.annotation.NonNull;
import android.annotation.NonNull;
import android.app.PendingIntent;
import android.app.PendingIntent;
import android.app.compat.CompatChanges;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledSince;
import android.compat.annotation.UnsupportedAppUsage;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.ContentResolver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.Build;
import android.os.Build;
import android.os.Message;
import android.os.Message;
import android.os.PersistableBundle;
import android.os.PersistableBundle;
@@ -825,7 +827,11 @@ public class ImsManager implements FeatureUpdates {
     * Indicates whether VoLTE is provisioned on this slot.
     * Indicates whether VoLTE is provisioned on this slot.
     */
     */
    public boolean isVolteProvisionedOnDevice() {
    public boolean isVolteProvisionedOnDevice() {
        if (getBooleanCarrierConfig(
        // check new carrier config first KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE
        // if that returns false, check deprecated carrier config
        // KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL
        if (isMmTelProvisioningRequired(CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE) ||
                getBooleanCarrierConfig(
                        CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) {
                        CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) {
            return isVolteProvisioned();
            return isVolteProvisioned();
        }
        }
@@ -837,7 +843,11 @@ public class ImsManager implements FeatureUpdates {
     * Indicates whether EAB is provisioned on this slot.
     * Indicates whether EAB is provisioned on this slot.
     */
     */
    public boolean isEabProvisionedOnDevice() {
    public boolean isEabProvisionedOnDevice() {
        if (getBooleanCarrierConfig(
        // check new carrier config first KEY_RCS_REQUIRES_PROVISIONING_BUNDLE
        // if that returns false, check deprecated carrier config
        // KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL
        if (isRcsProvisioningRequired(CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_LTE) ||
                getBooleanCarrierConfig(
                        CarrierConfigManager.KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL)) {
                        CarrierConfigManager.KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL)) {
            return isEabProvisioned();
            return isEabProvisioned();
        }
        }
@@ -878,7 +888,11 @@ public class ImsManager implements FeatureUpdates {
            }
            }
        }
        }


        if (getBooleanCarrierConfig(
        // check new carrier config first KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE
        // if that returns false, check deprecated carrier config
        // KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL
        if (isMmTelProvisioningRequired(CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_IWLAN)
                || getBooleanCarrierConfig(
                        CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) {
                        CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) {
            return isWfcProvisioned();
            return isWfcProvisioned();
        }
        }
@@ -906,7 +920,11 @@ public class ImsManager implements FeatureUpdates {
     * Indicates whether VT is provisioned on slot.
     * Indicates whether VT is provisioned on slot.
     */
     */
    public boolean isVtProvisionedOnDevice() {
    public boolean isVtProvisionedOnDevice() {
        if (getBooleanCarrierConfig(
        // check new carrier config first KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE
        // if that returns false, check deprecated carrier config
        // KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL
        if (isMmTelProvisioningRequired(CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_LTE) ||
                getBooleanCarrierConfig(
                        CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) {
                        CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) {
            return isVtProvisioned();
            return isVtProvisioned();
        }
        }
@@ -1896,7 +1914,12 @@ public class ImsManager implements FeatureUpdates {


    private void updateUtFeatureValue(CapabilityChangeRequest request) {
    private void updateUtFeatureValue(CapabilityChangeRequest request) {
        boolean isCarrierSupported = isSuppServicesOverUtEnabledByPlatform();
        boolean isCarrierSupported = isSuppServicesOverUtEnabledByPlatform();
        boolean requiresProvisioning = getBooleanCarrierConfig(

        // check new carrier config first KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE
        // if that returns false, check deprecated carrier config
        // KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL
        boolean requiresProvisioning = isMmTelProvisioningRequired(CAPABILITY_TYPE_UT,
                REGISTRATION_TECH_LTE) || getBooleanCarrierConfig(
                        CarrierConfigManager.KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL);
                        CarrierConfigManager.KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL);
        // Count as "provisioned" if we do not require provisioning.
        // Count as "provisioned" if we do not require provisioning.
        boolean isProvisioned = true;
        boolean isProvisioned = true;
@@ -3159,6 +3182,56 @@ public class ImsManager implements FeatureUpdates {
                ImsConfig.ConfigConstants.LVC_SETTING_ENABLED);
                ImsConfig.ConfigConstants.LVC_SETTING_ENABLED);
    }
    }


    private boolean isMmTelProvisioningRequired(int capability, int tech) {
        int subId = getSubId();
        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
            logw("isMmTelProvisioningRequired subId is invalid");
            return false;
        }

        ITelephony iTelephony = getITelephony();
        if (iTelephony == null) {
            logw("isMmTelProvisioningRequired ITelephony interface is invalid");
            return false;
        }

        boolean required = false;
        try {
                required |= iTelephony.isProvisioningRequiredForCapability(subId, capability,
                        tech);
        } catch (RemoteException e) {
            logw("isMmTelProvisioningRequired couldn't reach telephony!");
        }

        log("MmTel Provisioning required " + required + " for capability " + capability);
        return required;
    }

    private boolean isRcsProvisioningRequired(int capability, int tech) {
        int subId = getSubId();
        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
            logw("isRcsProvisioningRequired subId is invalid");
            return false;
        }

        ITelephony iTelephony = getITelephony();
        if (iTelephony == null) {
            logw("isRcsProvisioningRequired ITelephony interface is invalid");
            return false;
        }

        boolean required = false;
        try {
            required |= iTelephony.isRcsProvisioningRequiredForCapability(subId, capability,
                    tech);
        } catch (RemoteException e) {
            logw("isRcsProvisioningRequired couldn't reach telephony!");
        }

        log("Rcs Provisioning required " + required + " for capability " + capability);
        return required;
    }

    private static String booleanToPropertyString(boolean bool) {
    private static String booleanToPropertyString(boolean bool) {
        return bool ? "1" : "0";
        return bool ? "1" : "0";
    }
    }
+201 −0
Original line number Original line Diff line number Diff line
@@ -36,11 +36,13 @@ import android.telephony.BinderCacheManager;
import android.telephony.CarrierConfigManager;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager;
import android.telephony.ims.ImsMmTelManager;
import android.telephony.ims.ImsMmTelManager;
import android.telephony.ims.ImsRcsManager;
import android.telephony.ims.ProvisioningManager;
import android.telephony.ims.ProvisioningManager;
import android.telephony.ims.aidl.IImsConfig;
import android.telephony.ims.aidl.IImsConfig;
import android.telephony.ims.aidl.IImsRegistration;
import android.telephony.ims.aidl.IImsRegistration;
import android.telephony.ims.aidl.ISipTransport;
import android.telephony.ims.aidl.ISipTransport;
import android.telephony.ims.feature.MmTelFeature;
import android.telephony.ims.feature.MmTelFeature;
import android.telephony.ims.feature.RcsFeature;
import android.telephony.ims.stub.ImsConfigImplBase;
import android.telephony.ims.stub.ImsConfigImplBase;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.telephony.ims.stub.ImsRegistrationImplBase;


@@ -95,6 +97,9 @@ public class ImsManagerTest extends ImsTestBase {
    private final int[] mSubId = {0};
    private final int[] mSubId = {0};
    private final int mPhoneId = 1;
    private final int mPhoneId = 1;


    private boolean mMmTelProvisioningRequired = false;
    private boolean mRcsProvisioningRequired = false;

    @Before
    @Before
    public void setUp() throws Exception {
    public void setUp() throws Exception {
        super.setUp();
        super.setUp();
@@ -312,6 +317,194 @@ public class ImsManagerTest extends ImsTestBase {
                eq(ProvisioningManager.KEY_EAB_PROVISIONING_STATUS));
                eq(ProvisioningManager.KEY_EAB_PROVISIONING_STATUS));
    }
    }


    @Test
    public void testGetProvisionedValuesForWfc() throws Exception {
        ImsManager imsManager = getImsManagerAndInitProvisionedValues();

        // defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE
        // not defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL
        mMmTelProvisioningRequired = true;
        mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL,
                false);
        assertEquals(true, imsManager.isWfcProvisionedOnDevice());
        verify(mITelephony, times(1)).getImsProvisioningInt(
                anyInt(),
                eq(ProvisioningManager.KEY_VOICE_OVER_WIFI_ENABLED_OVERRIDE));
        verify(mITelephony, times(1)).
                isProvisioningRequiredForCapability(anyInt(),
                        eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
                        eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN));
        clearInvocations(mITelephony);

        // defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE
        // not defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL
        mMmTelProvisioningRequired = false;
        mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL,
                true);
        assertEquals(true, imsManager.isWfcProvisionedOnDevice());
        verify(mITelephony, times(1)).getImsProvisioningInt(
                anyInt(),
                eq(ProvisioningManager.KEY_VOICE_OVER_WIFI_ENABLED_OVERRIDE));
        verify(mITelephony, times(1)).
                isProvisioningRequiredForCapability(anyInt(),
                        eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
                        eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN));
        clearInvocations(mITelephony);

        // defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE
        // not defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL
        mMmTelProvisioningRequired = false;
        mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL,
                false);
        assertEquals(true, imsManager.isWfcProvisionedOnDevice());
        verify(mITelephony, never()).getImsProvisioningInt(
                anyInt(),
                eq(ProvisioningManager.KEY_VOICE_OVER_WIFI_ENABLED_OVERRIDE));
        verify(mITelephony, times(1)).
                isProvisioningRequiredForCapability(anyInt(),
                        eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
                        eq(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN));
        clearInvocations(mITelephony);
    }

    @Test
    public void testGetProvisionedValuesForVt() throws Exception {
        ImsManager imsManager = getImsManagerAndInitProvisionedValues();

        // defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE
        // not defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL
        mMmTelProvisioningRequired = true;
        mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL,
                false);
        assertEquals(true, imsManager.isVtProvisionedOnDevice());
        verify(mITelephony, times(1)).getImsProvisioningInt(
                anyInt(),
                eq(ProvisioningManager.KEY_VT_PROVISIONING_STATUS));
        verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(),
                eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO),
                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
        clearInvocations(mITelephony);

        // not defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE
        // defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL
        mMmTelProvisioningRequired = false;
        mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL,
                true);
        assertEquals(true, imsManager.isVtProvisionedOnDevice());
        verify(mITelephony, times(1)).getImsProvisioningInt(
                anyInt(),
                eq(ProvisioningManager.KEY_VT_PROVISIONING_STATUS));
        verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(),
                eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO),
                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
        clearInvocations(mITelephony);

        // not defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE
        // not defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL
        mMmTelProvisioningRequired = false;
        mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL,
                false);
        assertEquals(true, imsManager.isVtProvisionedOnDevice());
        verify(mITelephony, never()).getImsProvisioningInt(
                anyInt(),
                eq(ProvisioningManager.KEY_VT_PROVISIONING_STATUS));
        verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(),
                eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO),
                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
        clearInvocations(mITelephony);
    }

    @Test
    public void testGetProvisionedValuesForVolte() throws Exception {
        ImsManager imsManager = getImsManagerAndInitProvisionedValues();

        // defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE
        // not defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL
        mMmTelProvisioningRequired = true;
        mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL,
                false);
        assertEquals(true, imsManager.isVolteProvisionedOnDevice());
        verify(mITelephony, times(1)).getImsProvisioningInt(
                anyInt(),
                eq(ProvisioningManager.KEY_VOLTE_PROVISIONING_STATUS));
        verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(),
                eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
        clearInvocations(mITelephony);

        // not defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE
        // defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL
        mMmTelProvisioningRequired = false;
        mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL,
                true);
        assertEquals(true, imsManager.isVolteProvisionedOnDevice());
        verify(mITelephony, times(1)).getImsProvisioningInt(
                anyInt(),
                eq(ProvisioningManager.KEY_VOLTE_PROVISIONING_STATUS));
        verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(),
                eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
        clearInvocations(mITelephony);

        // not defined : KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE
        // not defined : KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL
        mMmTelProvisioningRequired = false;
        mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL,
                false);
        assertEquals(true, imsManager.isVolteProvisionedOnDevice());
        verify(mITelephony, never()).getImsProvisioningInt(
                anyInt(),
                eq(ProvisioningManager.KEY_VOLTE_PROVISIONING_STATUS));
        verify(mITelephony, times(1)).isProvisioningRequiredForCapability(anyInt(),
                eq(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
        clearInvocations(mITelephony);
    }

    @Test
    public void testGetProvisionedValuesForEab() throws Exception {
        ImsManager imsManager = getImsManagerAndInitProvisionedValues();

        // defined : KEY_RCS_REQUIRES_PROVISIONING_BUNDLE
        // not defined : KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL
        mRcsProvisioningRequired = true;
        mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL, false);
        assertEquals(true, imsManager.isEabProvisionedOnDevice());
        verify(mITelephony, times(1)).getImsProvisioningInt(
                anyInt(),
                eq(ProvisioningManager.KEY_EAB_PROVISIONING_STATUS));
        verify(mITelephony, times(1)).isRcsProvisioningRequiredForCapability(anyInt(),
                eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE),
                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
        clearInvocations(mITelephony);

        // not defined : KEY_RCS_REQUIRES_PROVISIONING_BUNDLE
        // defined : KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL
        mRcsProvisioningRequired = false;
        mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL, true);
        assertEquals(true, imsManager.isEabProvisionedOnDevice());
        verify(mITelephony, times(1)).getImsProvisioningInt(
                anyInt(),
                eq(ProvisioningManager.KEY_EAB_PROVISIONING_STATUS));
        verify(mITelephony, times(1)).isRcsProvisioningRequiredForCapability(anyInt(),
                eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE),
                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
        clearInvocations(mITelephony);

        // not defined : KEY_RCS_REQUIRES_PROVISIONING_BUNDLE
        // not defined : KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL
        mRcsProvisioningRequired = false;
        mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL, false);
        assertEquals(true, imsManager.isEabProvisionedOnDevice());
        verify(mITelephony, never()).getImsProvisioningInt(
                anyInt(),
                eq(ProvisioningManager.KEY_EAB_PROVISIONING_STATUS));
        verify(mITelephony, times(1)).isRcsProvisioningRequiredForCapability(anyInt(),
                eq(RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE),
                eq(ImsRegistrationImplBase.REGISTRATION_TECH_LTE));
        clearInvocations(mITelephony);
    }

    @Test
    @Test
    public void testSetProvisionedValues() throws Exception {
    public void testSetProvisionedValues() throws Exception {
        ImsManager imsManager = getImsManagerAndInitProvisionedValues();
        ImsManager imsManager = getImsManagerAndInitProvisionedValues();
@@ -925,6 +1118,14 @@ public class ImsManagerTest extends ImsTestBase {
                                (Integer) (invocation.getArguments()[2]));
                                (Integer) (invocation.getArguments()[2]));
                        return ImsConfig.OperationStatusConstants.SUCCESS;
                        return ImsConfig.OperationStatusConstants.SUCCESS;
                    });
                    });
            when(mITelephony.isProvisioningRequiredForCapability(anyInt(), anyInt(), anyInt()))
                    .thenAnswer(invocation -> {
                        return mMmTelProvisioningRequired;
                    });
            when(mITelephony.isRcsProvisioningRequiredForCapability(anyInt(), anyInt(), anyInt()))
                    .thenAnswer(invocation -> {
                        return mRcsProvisioningRequired;
                    });
        } catch (RemoteException e) {}
        } catch (RemoteException e) {}


        ImsManager mgr = new ImsManager(mContext, mPhoneId,
        ImsManager mgr = new ImsManager(mContext, mPhoneId,