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

Commit 7fd7f903 authored by Brad Ebinger's avatar Brad Ebinger Committed by android-build-merger
Browse files

Merge changes from topics "cp_rm_dyn_ims_config", "support_multiple_bind_ims"...

Merge changes from topics "cp_rm_dyn_ims_config", "support_multiple_bind_ims" am: 0dcf6924 am: e611a25b
am: 8f9cfab2

Change-Id: I295e07c51adcbbfa39a54ffa3e4f2c76ca57d7aa
parents d67bff88 8f9cfab2
Loading
Loading
Loading
Loading
+289 −246

File changed.

Preview size limit exceeded, changes collapsed.

+25 −7
Original line number Original line Diff line number Diff line
@@ -49,6 +49,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.Iterator;
import java.util.Set;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;


/**
/**
 * Manages the Binding lifecycle of one ImsService as well as the relevant ImsFeatures that the
 * Manages the Binding lifecycle of one ImsService as well as the relevant ImsFeatures that the
@@ -205,7 +206,7 @@ public class ImsServiceController {
    private boolean mIsBound = false;
    private boolean mIsBound = false;
    private boolean mIsBinding = false;
    private boolean mIsBinding = false;
    // Set of a pair of slotId->feature
    // Set of a pair of slotId->feature
    private HashSet<ImsFeatureConfiguration.FeatureSlotPair> mImsFeatures;
    private Set<ImsFeatureConfiguration.FeatureSlotPair> mImsFeatures;
    // Binder interfaces to the features set in mImsFeatures;
    // Binder interfaces to the features set in mImsFeatures;
    private HashSet<ImsFeatureContainer> mImsFeatureBinders = new HashSet<>();
    private HashSet<ImsFeatureContainer> mImsFeatureBinders = new HashSet<>();
    private IImsServiceController mIImsServiceController;
    private IImsServiceController mIImsServiceController;
@@ -362,10 +363,11 @@ public class ImsServiceController {
     * @return {@link true} if the service is in the process of being bound, {@link false} if it
     * @return {@link true} if the service is in the process of being bound, {@link false} if it
     * has failed.
     * has failed.
     */
     */
    public boolean bind(HashSet<ImsFeatureConfiguration.FeatureSlotPair> imsFeatureSet) {
    public boolean bind(Set<ImsFeatureConfiguration.FeatureSlotPair> imsFeatureSet) {
        synchronized (mLock) {
        synchronized (mLock) {
            if (!mIsBound && !mIsBinding) {
            if (!mIsBound && !mIsBinding) {
                mIsBinding = true;
                mIsBinding = true;
                sanitizeFeatureConfig(imsFeatureSet);
                mImsFeatures = imsFeatureSet;
                mImsFeatures = imsFeatureSet;
                grantPermissionsToService();
                grantPermissionsToService();
                Intent imsServiceIntent = new Intent(getServiceInterface()).setComponent(
                Intent imsServiceIntent = new Intent(getServiceInterface()).setComponent(
@@ -400,6 +402,21 @@ public class ImsServiceController {
        }
        }
    }
    }


    /**
     * Ensure the feature includes MMTEL when it supports EMERGENCY_MMTEL, if not, remove.
     */
    private void sanitizeFeatureConfig(Set<ImsFeatureConfiguration.FeatureSlotPair> features) {
        Set<ImsFeatureConfiguration.FeatureSlotPair> emergencyMmtelFeatures = features.stream()
                .filter(feature -> feature.featureType == ImsFeature.FEATURE_EMERGENCY_MMTEL)
                .collect(Collectors.toSet());
        for (ImsFeatureConfiguration.FeatureSlotPair feature : emergencyMmtelFeatures) {
            if (!features.contains(new ImsFeatureConfiguration.FeatureSlotPair(feature.slotId,
                    ImsFeature.FEATURE_MMTEL))) {
                features.remove(feature);
            }
        }
    }

    /**
    /**
     * Calls {@link IImsServiceController#removeImsFeature} on all features that the
     * Calls {@link IImsServiceController#removeImsFeature} on all features that the
     * ImsService supports and then unbinds the service.
     * ImsService supports and then unbinds the service.
@@ -427,8 +444,9 @@ public class ImsServiceController {
     * ImsFeature that is removed, {@link IImsServiceController#removeImsFeature} is called.
     * ImsFeature that is removed, {@link IImsServiceController#removeImsFeature} is called.
     */
     */
    public void changeImsServiceFeatures(
    public void changeImsServiceFeatures(
            HashSet<ImsFeatureConfiguration.FeatureSlotPair> newImsFeatures)
            Set<ImsFeatureConfiguration.FeatureSlotPair> newImsFeatures)
            throws RemoteException {
            throws RemoteException {
        sanitizeFeatureConfig(newImsFeatures);
        synchronized (mLock) {
        synchronized (mLock) {
            if (mImsFeatures.equals(newImsFeatures)) {
            if (mImsFeatures.equals(newImsFeatures)) {
                return;
                return;
@@ -697,12 +715,12 @@ public class ImsServiceController {
            IInterface f = createImsFeature(featurePair.slotId, featurePair.featureType,
            IInterface f = createImsFeature(featurePair.slotId, featurePair.featureType,
                    c.getCallback());
                    c.getCallback());
            addImsFeatureBinder(featurePair.slotId, featurePair.featureType, f);
            addImsFeatureBinder(featurePair.slotId, featurePair.featureType, f);
            // Signal ImsResolver to change supported ImsFeatures for this ImsServiceController
            mCallbacks.imsServiceFeatureCreated(featurePair.slotId, featurePair.featureType, this);
        } else {
        } else {
            // Don't update ImsService for emergency MMTEL feature.
            // Don't update ImsService for emergency MMTEL feature.
            Log.i(LOG_TAG, "supports emergency calling on slot " + featurePair.slotId);
            Log.i(LOG_TAG, "supports emergency calling on slot " + featurePair.slotId);
        }
        }
        // Signal ImsResolver to change supported ImsFeatures for this ImsServiceController
        mCallbacks.imsServiceFeatureCreated(featurePair.slotId, featurePair.featureType, this);
        // Send callback to ImsServiceProxy to change supported ImsFeatures including emergency
        // Send callback to ImsServiceProxy to change supported ImsFeatures including emergency
        // MMTEL state.
        // MMTEL state.
        sendImsFeatureCreatedCallback(featurePair.slotId, featurePair.featureType);
        sendImsFeatureCreatedCallback(featurePair.slotId, featurePair.featureType);
@@ -714,6 +732,8 @@ public class ImsServiceController {
            Log.w(LOG_TAG, "removeImsServiceFeature called with null values.");
            Log.w(LOG_TAG, "removeImsServiceFeature called with null values.");
            return;
            return;
        }
        }
        // Signal ImsResolver to change supported ImsFeatures for this ImsServiceController
        mCallbacks.imsServiceFeatureRemoved(featurePair.slotId, featurePair.featureType, this);
        if (featurePair.featureType != ImsFeature.FEATURE_EMERGENCY_MMTEL) {
        if (featurePair.featureType != ImsFeature.FEATURE_EMERGENCY_MMTEL) {
            ImsFeatureStatusCallback callbackToRemove = mFeatureStatusCallbacks.stream().filter(c ->
            ImsFeatureStatusCallback callbackToRemove = mFeatureStatusCallbacks.stream().filter(c ->
                    c.mSlotId == featurePair.slotId && c.mFeatureType == featurePair.featureType)
                    c.mSlotId == featurePair.slotId && c.mFeatureType == featurePair.featureType)
@@ -723,8 +743,6 @@ public class ImsServiceController {
                mFeatureStatusCallbacks.remove(callbackToRemove);
                mFeatureStatusCallbacks.remove(callbackToRemove);
            }
            }
            removeImsFeatureBinder(featurePair.slotId, featurePair.featureType);
            removeImsFeatureBinder(featurePair.slotId, featurePair.featureType);
            // Signal ImsResolver to change supported ImsFeatures for this ImsServiceController
            mCallbacks.imsServiceFeatureRemoved(featurePair.slotId, featurePair.featureType, this);
            try {
            try {
                removeImsFeature(featurePair.slotId, featurePair.featureType,
                removeImsFeature(featurePair.slotId, featurePair.featureType,
                        (callbackToRemove != null ? callbackToRemove.getCallback() : null));
                        (callbackToRemove != null ? callbackToRemove.getCallback() : null));
+64 −1
Original line number Original line Diff line number Diff line
@@ -212,6 +212,8 @@ public class ImsResolverTest extends ImsTestBase {
        // Set CarrierConfig default package name and make it available to the package manager
        // Set CarrierConfig default package name and make it available to the package manager
        setConfigCarrierString(0, TEST_CARRIER_DEFAULT_NAME.getPackageName());
        setConfigCarrierString(0, TEST_CARRIER_DEFAULT_NAME.getPackageName());
        HashSet<ImsFeatureConfiguration.FeatureSlotPair> features = new HashSet<>();
        HashSet<ImsFeatureConfiguration.FeatureSlotPair> features = new HashSet<>();
        features.add(new ImsFeatureConfiguration.FeatureSlotPair(0,
                ImsFeature.FEATURE_EMERGENCY_MMTEL));
        features.add(new ImsFeatureConfiguration.FeatureSlotPair(0, ImsFeature.FEATURE_MMTEL));
        features.add(new ImsFeatureConfiguration.FeatureSlotPair(0, ImsFeature.FEATURE_MMTEL));
        features.add(new ImsFeatureConfiguration.FeatureSlotPair(0, ImsFeature.FEATURE_RCS));
        features.add(new ImsFeatureConfiguration.FeatureSlotPair(0, ImsFeature.FEATURE_RCS));
        setupPackageQuery(TEST_CARRIER_DEFAULT_NAME, new HashSet<>(), true);
        setupPackageQuery(TEST_CARRIER_DEFAULT_NAME, new HashSet<>(), true);
@@ -225,6 +227,34 @@ public class ImsResolverTest extends ImsTestBase {
        assertEquals(TEST_CARRIER_DEFAULT_NAME, controller.getComponentName());
        assertEquals(TEST_CARRIER_DEFAULT_NAME, controller.getComponentName());
    }
    }


    /**
     * Creates a carrier ImsService that defines FEATURE_EMERGENCY_MMTEL but not FEATURE_MMTEL and
     * ensure that the controller doesn't set FEATURE_EMERGENCY_MMTEL.
     */
    @Test
    @SmallTest
    public void testCarrierPackageBindWithEmergencyButNotMmtel() throws RemoteException {
        setupResolver(1/*numSlots*/);
        // Set CarrierConfig default package name and make it available to the package manager
        setConfigCarrierString(0, TEST_CARRIER_DEFAULT_NAME.getPackageName());
        HashSet<ImsFeatureConfiguration.FeatureSlotPair> features = new HashSet<>();
        features.add(new ImsFeatureConfiguration.FeatureSlotPair(0,
                ImsFeature.FEATURE_EMERGENCY_MMTEL));
        features.add(new ImsFeatureConfiguration.FeatureSlotPair(0, ImsFeature.FEATURE_RCS));
        setupPackageQuery(TEST_CARRIER_DEFAULT_NAME, new HashSet<>(), true);
        ImsServiceController controller = setupController();

        startBindCarrierConfigAlreadySet();
        setupDynamicQueryFeatures(TEST_CARRIER_DEFAULT_NAME, features, 1);

        // We will not bind with FEATURE_EMERGENCY_MMTEL
        features.remove(new ImsFeatureConfiguration.FeatureSlotPair(0,
                ImsFeature.FEATURE_EMERGENCY_MMTEL));
        verify(controller).bind(features);
        verify(controller, never()).unbind();
        assertEquals(TEST_CARRIER_DEFAULT_NAME, controller.getComponentName());
    }

    /**
    /**
     * Creates a carrier ImsService that does not report FEATURE_EMERGENCY_MMTEL and then update the
     * Creates a carrier ImsService that does not report FEATURE_EMERGENCY_MMTEL and then update the
     * ImsService to define it. Ensure that the controller sets this capability once enabled.
     * ImsService to define it. Ensure that the controller sets this capability once enabled.
@@ -312,6 +342,37 @@ public class ImsResolverTest extends ImsTestBase {
        assertEquals(TEST_DEVICE_DEFAULT_NAME, controller.getComponentName());
        assertEquals(TEST_DEVICE_DEFAULT_NAME, controller.getComponentName());
    }
    }


    /**
     * Test that the ImsService corresponding to the default device ImsService package name is
     * bound to only RCS if METADATA_EMERGENCY_MMTEL_FEATURE but not METADATA_MMTEL_FEATURE.
     */
    @Test
    @SmallTest
    public void testDevicePackageInvalidMmTelBind() throws RemoteException {
        setupResolver(1/*numSlots*/);
        List<ResolveInfo> info = new ArrayList<>();
        Set<String> features = new HashSet<>();
        features.add(ImsResolver.METADATA_EMERGENCY_MMTEL_FEATURE);
        features.add(ImsResolver.METADATA_RCS_FEATURE);
        // Use device default package, which will load the ImsService that the device provides
        info.add(getResolveInfo(TEST_DEVICE_DEFAULT_NAME, features, true));
        info.add(getResolveInfo(TEST_CARRIER_DEFAULT_NAME, new HashSet<>(), true));
        setupPackageQuery(info);
        ImsServiceController controller = setupController();


        startBindNoCarrierConfig(1);
        mLooper.processAllMessages();

        // There is no carrier override set, so make sure that the ImsServiceController binds
        // to all SIMs.
        HashSet<ImsFeatureConfiguration.FeatureSlotPair> featureSet = convertToHashSet(features, 0);
        verify(controller).bind(featureSet);
        verify(controller, never()).unbind();
        verify(mMockQueryManager, never()).startQuery(any(), any());
        assertEquals(TEST_DEVICE_DEFAULT_NAME, controller.getComponentName());
    }

    /**
    /**
     * Test that when a device and carrier override package are set, both ImsServices are bound.
     * Test that when a device and carrier override package are set, both ImsServices are bound.
     * Verify that the carrier ImsService features are created and the device default features
     * Verify that the carrier ImsService features are created and the device default features
@@ -484,7 +545,9 @@ public class ImsResolverTest extends ImsTestBase {
        // remove carrier overrides for slot 0
        // remove carrier overrides for slot 0
        newDeviceFeatureSet.removeAll(carrierFeatures);
        newDeviceFeatureSet.removeAll(carrierFeatures);
        verify(deviceController).changeImsServiceFeatures(newDeviceFeatureSet);
        verify(deviceController).changeImsServiceFeatures(newDeviceFeatureSet);
        verify(carrierController, never()).changeImsServiceFeatures(any());
        // features should be the same as before, ImsServiceController will disregard change if it
        // is the same feature set anyway.
        verify(carrierController).changeImsServiceFeatures(carrierFeatures);
    }
    }


    /**
    /**
+232 −126

File changed.

Preview size limit exceeded, changes collapsed.