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

Commit f1d3b4dc authored by Brad Ebinger's avatar Brad Ebinger
Browse files

Decouple the creation of MmTelFeature from ImsFeature state listener

Decouple the creation of the MmtelFeature from the ImsFeature state
listener in order to allow the internal tracking of the feature to
be created and initialized before starting the process of sending
state updates

Test: atest CtsTelephonyTestCases ImsCommonTests FrameworksTelephonyTests
Change-Id: Ib3812ff8a631fce1fcfba6388d66b5d6b80fcd17
parent 3a91416e
Loading
Loading
Loading
Loading
+44 −19
Original line number Diff line number Diff line
@@ -744,12 +744,9 @@ public class ImsServiceController {
            return;
        }
        if (featurePair.featureType != ImsFeature.FEATURE_EMERGENCY_MMTEL) {
            ImsFeatureStatusCallback c = new ImsFeatureStatusCallback(featurePair.slotId,
                    featurePair.featureType);
            mFeatureStatusCallbacks.add(c);
            IInterface f = createImsFeature(featurePair.slotId, featurePair.featureType,
                    c.getCallback());
            IInterface f = createImsFeature(featurePair.slotId, featurePair.featureType);
            addImsFeatureBinder(featurePair.slotId, featurePair.featureType, f);
            addImsFeatureStatusCallback(featurePair.slotId, featurePair.featureType);
        } else {
            // Don't update ImsService for emergency MMTEL feature.
            Log.i(LOG_TAG, "supports emergency calling on slot " + featurePair.slotId);
@@ -770,17 +767,10 @@ public class ImsServiceController {
        // Signal ImsResolver to change supported ImsFeatures for this ImsServiceController
        mCallbacks.imsServiceFeatureRemoved(featurePair.slotId, featurePair.featureType, this);
        if (featurePair.featureType != ImsFeature.FEATURE_EMERGENCY_MMTEL) {
            ImsFeatureStatusCallback callbackToRemove = mFeatureStatusCallbacks.stream().filter(c ->
                    c.mSlotId == featurePair.slotId && c.mFeatureType == featurePair.featureType)
                    .findFirst().orElse(null);
            // Remove status callbacks from list.
            if (callbackToRemove != null) {
                mFeatureStatusCallbacks.remove(callbackToRemove);
            }
            removeImsFeatureStatusCallback(featurePair.slotId, featurePair.featureType);
            removeImsFeatureBinder(featurePair.slotId, featurePair.featureType);
            try {
                removeImsFeature(featurePair.slotId, featurePair.featureType,
                        (callbackToRemove != null ? callbackToRemove.getCallback() : null));
                removeImsFeature(featurePair.slotId, featurePair.featureType);
            } catch (RemoteException e) {
                // The connection to this ImsService doesn't exist. This may happen if the service
                // has died and we are removing features.
@@ -801,24 +791,59 @@ public class ImsServiceController {

    // This method should only be called when already synchronized on mLock.
    // overridden by compat layer to create features
    protected IInterface createImsFeature(int slotId, int featureType, IImsFeatureStatusCallback c)
    protected IInterface createImsFeature(int slotId, int featureType)
            throws RemoteException {
        switch (featureType) {
            case ImsFeature.FEATURE_MMTEL: {
                return mIImsServiceController.createMmTelFeature(slotId, c);
                return mIImsServiceController.createMmTelFeature(slotId);
            }
            case ImsFeature.FEATURE_RCS: {
                return mIImsServiceController.createRcsFeature(slotId, c);
                return mIImsServiceController.createRcsFeature(slotId);
            }
            default:
                return null;
        }
    }

    // This method should only be called when already synchronized on mLock.
    private void addImsFeatureStatusCallback(int slotId, int featureType) throws RemoteException {
        ImsFeatureStatusCallback c = new ImsFeatureStatusCallback(slotId, featureType);
        mFeatureStatusCallbacks.add(c);
        registerImsFeatureStatusCallback(slotId, featureType, c.getCallback());
    }

    // This method should only be called when already synchronized on mLock.
    private void removeImsFeatureStatusCallback(int slotId, int featureType) {
        ImsFeatureStatusCallback callbackToRemove = mFeatureStatusCallbacks.stream().filter(c ->
                c.mSlotId == slotId && c.mFeatureType == featureType).findFirst().orElse(null);
        // Remove status callbacks from list.
        if (callbackToRemove != null) {
            mFeatureStatusCallbacks.remove(callbackToRemove);
            unregisterImsFeatureStatusCallback(slotId, featureType, callbackToRemove.getCallback());
        }
    }

    // overridden by compat layer to register feature status callbacks
    protected void registerImsFeatureStatusCallback(int slotId, int featureType,
            IImsFeatureStatusCallback c) throws RemoteException {
        mIImsServiceController.addFeatureStatusCallback(slotId, featureType, c);
    }

    // overridden by compat layer to deregister feature status callbacks
    protected void unregisterImsFeatureStatusCallback(int slotId, int featureType,
            IImsFeatureStatusCallback c) {
        try {
            mIImsServiceController.removeFeatureStatusCallback(slotId, featureType, c);
        } catch (RemoteException e) {
            mLocalLog.log("unregisterImsFeatureStatusCallback - couldn't remove " + c);
        }
    }


    // overridden by compat layer to remove features
    protected void removeImsFeature(int slotId, int featureType, IImsFeatureStatusCallback c)
    protected void removeImsFeature(int slotId, int featureType)
            throws RemoteException {
        mIImsServiceController.removeImsFeature(slotId, featureType, c);
        mIImsServiceController.removeImsFeature(slotId, featureType);
    }

    // This method should only be called when synchronized on mLock
+27 −11
Original line number Diff line number Diff line
@@ -133,15 +133,15 @@ public class ImsServiceControllerCompat extends ImsServiceController {
    }

    @Override
    protected final IInterface createImsFeature(int slotId, int featureType,
            IImsFeatureStatusCallback c)
    protected final IInterface createImsFeature(int slotId, int featureType)
            throws RemoteException {
        switch (featureType) {
            case ImsFeature.MMTEL: {
                return createMMTelCompat(slotId, c);
                return createMMTelCompat(slotId);
            }
            case ImsFeature.RCS: {
                return createRcsFeature(slotId, c);

                return createRcsFeature(slotId);
            }
            default:
                return null;
@@ -149,7 +149,23 @@ public class ImsServiceControllerCompat extends ImsServiceController {
    }

    @Override
    protected final void removeImsFeature(int slotId, int featureType, IImsFeatureStatusCallback c)
    protected void registerImsFeatureStatusCallback(int slotId, int featureType,
            IImsFeatureStatusCallback c) throws RemoteException {
        mServiceController.addFeatureStatusCallback(slotId, featureType, c);
    }

    @Override
    protected void unregisterImsFeatureStatusCallback(int slotId, int featureType,
            IImsFeatureStatusCallback c) {
        try {
            mServiceController.removeFeatureStatusCallback(slotId, featureType, c);
        } catch (RemoteException e) {
            Log.w(TAG, "compat - unregisterImsFeatureStatusCallback - couldn't remove " + c);
        }
    }

    @Override
    protected final void removeImsFeature(int slotId, int featureType)
            throws RemoteException {
        if (featureType == ImsFeature.MMTEL) {
            mMmTelCompatAdapters.remove(slotId);
@@ -157,7 +173,7 @@ public class ImsServiceControllerCompat extends ImsServiceController {
            mConfigCompatAdapters.remove(slotId);
        }
        if (mServiceController != null) {
            mServiceController.removeImsFeature(slotId, featureType, c);
            mServiceController.removeImsFeature(slotId, featureType);
        }
    }

@@ -171,9 +187,9 @@ public class ImsServiceControllerCompat extends ImsServiceController {
        return mServiceController != null;
    }

    private MmTelInterfaceAdapter getInterface(int slotId, IImsFeatureStatusCallback c)
    private MmTelInterfaceAdapter getInterface(int slotId)
            throws RemoteException {
        IImsMMTelFeature feature = mServiceController.createMMTelFeature(slotId, c);
        IImsMMTelFeature feature = mServiceController.createMMTelFeature(slotId);
        if (feature == null) {
            Log.w(TAG, "createMMTelCompat: createMMTelFeature returned null.");
            return null;
@@ -181,9 +197,9 @@ public class ImsServiceControllerCompat extends ImsServiceController {
        return new MmTelInterfaceAdapter(slotId, feature.asBinder());
    }

    private IImsMmTelFeature createMMTelCompat(int slotId, IImsFeatureStatusCallback c)
    private IImsMmTelFeature createMMTelCompat(int slotId)
            throws RemoteException {
        MmTelInterfaceAdapter interfaceAdapter = getInterface(slotId, c);
        MmTelInterfaceAdapter interfaceAdapter = getInterface(slotId);
        MmTelFeatureCompatAdapter mmTelAdapter = new MmTelFeatureCompatAdapter(mContext, slotId,
                interfaceAdapter);
        mMmTelCompatAdapters.put(slotId, mmTelAdapter);
@@ -195,7 +211,7 @@ public class ImsServiceControllerCompat extends ImsServiceController {
        return mmTelAdapter.getBinder();
    }

    private IImsRcsFeature createRcsFeature(int slotId, IImsFeatureStatusCallback c) {
    private IImsRcsFeature createRcsFeature(int slotId) {
        // Return non-null if there is a custom RCS implementation that needs a compatability layer.
        return null;
    }
+11 −4
Original line number Diff line number Diff line
@@ -85,7 +85,9 @@ public class ImsServiceTest {
    @Test
    @SmallTest
    public void testCreateMMTelFeature() throws RemoteException {
        IImsMmTelFeature f = mTestImsServiceBinder.createMmTelFeature(TEST_SLOT_0, mTestCallback);
        IImsMmTelFeature f = mTestImsServiceBinder.createMmTelFeature(TEST_SLOT_0);
        mTestImsServiceBinder.addFeatureStatusCallback(TEST_SLOT_0, ImsFeature.FEATURE_MMTEL,
                mTestCallback);
        mTestImsService.mTestMmTelFeature.sendSetFeatureState(ImsFeature.STATE_READY);

        SparseArray<ImsFeature> features = mTestImsService.getFeatures(TEST_SLOT_0);
@@ -106,10 +108,13 @@ public class ImsServiceTest {
    @Test
    @SmallTest
    public void testRemoveMMTelFeature() throws RemoteException {
        mTestImsServiceBinder.createMmTelFeature(TEST_SLOT_0, mTestCallback);
        mTestImsServiceBinder.createMmTelFeature(TEST_SLOT_0);
        mTestImsServiceBinder.addFeatureStatusCallback(TEST_SLOT_0, ImsFeature.FEATURE_MMTEL,
                mTestCallback);

        mTestImsServiceBinder.removeImsFeature(TEST_SLOT_0, ImsFeature.FEATURE_MMTEL,
        mTestImsServiceBinder.removeFeatureStatusCallback(TEST_SLOT_0, ImsFeature.FEATURE_MMTEL,
                mTestCallback);
        mTestImsServiceBinder.removeImsFeature(TEST_SLOT_0, ImsFeature.FEATURE_MMTEL);

        verify(mTestImsService.mSpyMmTelFeature).onFeatureRemoved();
        verify(mTestImsService.mSpyMmTelFeature).removeImsFeatureStatusCallback(mTestCallback);
@@ -120,7 +125,9 @@ public class ImsServiceTest {
    @Test
    @SmallTest
    public void testCallMethodOnCreatedFeature() throws RemoteException {
        IImsMmTelFeature f = mTestImsServiceBinder.createMmTelFeature(TEST_SLOT_0, mTestCallback);
        IImsMmTelFeature f = mTestImsServiceBinder.createMmTelFeature(TEST_SLOT_0);
        mTestImsServiceBinder.addFeatureStatusCallback(TEST_SLOT_0, ImsFeature.FEATURE_MMTEL,
                mTestCallback);

        f.getUtInterface();

+63 −17
Original line number Diff line number Diff line
@@ -163,8 +163,12 @@ public class ImsServiceControllerTest extends ImsTestBase {

        bindAndConnectService(testFeatures);

        verify(mMockServiceControllerBinder).createMmTelFeature(eq(SLOT_0), any());
        verify(mMockServiceControllerBinder).createRcsFeature(eq(SLOT_0), any());
        verify(mMockServiceControllerBinder).createMmTelFeature(SLOT_0);
        verify(mMockServiceControllerBinder).addFeatureStatusCallback(eq(SLOT_0),
                eq(ImsFeature.FEATURE_MMTEL), any());
        verify(mMockServiceControllerBinder).createRcsFeature(SLOT_0);
        verify(mMockServiceControllerBinder).addFeatureStatusCallback(eq(SLOT_0),
                eq(ImsFeature.FEATURE_RCS), any());
        verify(mMockCallbacks).imsServiceFeatureCreated(eq(SLOT_0), eq(ImsFeature.FEATURE_MMTEL),
                eq(mTestImsServiceController));
        verify(mMockCallbacks).imsServiceFeatureCreated(eq(SLOT_0), eq(ImsFeature.FEATURE_RCS),
@@ -188,7 +192,9 @@ public class ImsServiceControllerTest extends ImsTestBase {

        bindAndConnectService(testFeatures);

        verify(mMockServiceControllerBinder).createMmTelFeature(eq(SLOT_0), any());
        verify(mMockServiceControllerBinder).createMmTelFeature(SLOT_0);
        verify(mMockServiceControllerBinder).addFeatureStatusCallback(eq(SLOT_0),
                eq(ImsFeature.FEATURE_MMTEL), any());
        verify(mMockCallbacks).imsServiceFeatureCreated(eq(SLOT_0), eq(ImsFeature.FEATURE_MMTEL),
                eq(mTestImsServiceController));
        verify(mMockCallbacks).imsServiceFeatureCreated(eq(SLOT_0),
@@ -217,7 +223,9 @@ public class ImsServiceControllerTest extends ImsTestBase {
        bindAndConnectService(testFeatures);

        // Verify no MMTEL or EMERGENCY_MMTEL features are created
        verify(mMockServiceControllerBinder, never()).createMmTelFeature(eq(SLOT_0), any());
        verify(mMockServiceControllerBinder, never()).createMmTelFeature(SLOT_0);
        verify(mMockServiceControllerBinder, never()).addFeatureStatusCallback(eq(SLOT_0),
                eq(ImsFeature.FEATURE_MMTEL), any());
        verify(mMockCallbacks, never()).imsServiceFeatureCreated(eq(SLOT_0),
                eq(ImsFeature.FEATURE_MMTEL), eq(mTestImsServiceController));
        verify(mMockCallbacks, never()).imsServiceFeatureCreated(eq(SLOT_0),
@@ -227,7 +235,9 @@ public class ImsServiceControllerTest extends ImsTestBase {
        verify(mMockProxyCallbacks, never()).imsFeatureCreated(eq(SLOT_0),
                eq(ImsFeature.FEATURE_MMTEL));
        // verify RCS feature is created
        verify(mMockServiceControllerBinder).createRcsFeature(eq(SLOT_0), any());
        verify(mMockServiceControllerBinder).createRcsFeature(SLOT_0);
        verify(mMockServiceControllerBinder).addFeatureStatusCallback(eq(SLOT_0),
                eq(ImsFeature.FEATURE_RCS), any());
        verify(mMockCallbacks).imsServiceFeatureCreated(eq(SLOT_0), eq(ImsFeature.FEATURE_RCS),
                eq(mTestImsServiceController));
        verify(mMockProxyCallbacks).imsFeatureCreated(eq(SLOT_0), eq(ImsFeature.FEATURE_RCS));
@@ -337,8 +347,12 @@ public class ImsServiceControllerTest extends ImsTestBase {

        verify(mMockContext).unbindService(eq(conn));
        verify(mMockServiceControllerBinder).removeImsFeature(eq(SLOT_0),
                eq(ImsFeature.FEATURE_MMTEL));
        verify(mMockServiceControllerBinder).removeFeatureStatusCallback(eq(SLOT_0),
                eq(ImsFeature.FEATURE_MMTEL), any());
        verify(mMockServiceControllerBinder).removeImsFeature(eq(SLOT_0),
                eq(ImsFeature.FEATURE_RCS));
        verify(mMockServiceControllerBinder).removeFeatureStatusCallback(eq(SLOT_0),
                eq(ImsFeature.FEATURE_RCS), any());
        verify(mMockCallbacks).imsServiceFeatureRemoved(eq(SLOT_0), eq(ImsFeature.FEATURE_MMTEL),
                eq(mTestImsServiceController));
@@ -402,7 +416,9 @@ public class ImsServiceControllerTest extends ImsTestBase {
        testFeatures.add(new ImsFeatureConfiguration.FeatureSlotPair(SLOT_0,
                ImsFeature.FEATURE_MMTEL));
        bindAndConnectService(testFeatures);
        verify(mMockServiceControllerBinder).createMmTelFeature(eq(SLOT_0), any());
        verify(mMockServiceControllerBinder).createMmTelFeature(SLOT_0);
        verify(mMockServiceControllerBinder).addFeatureStatusCallback(eq(SLOT_0),
                eq(ImsFeature.FEATURE_MMTEL), any());
        verify(mMockCallbacks).imsServiceFeatureCreated(eq(SLOT_0), eq(ImsFeature.FEATURE_MMTEL),
                eq(mTestImsServiceController));
        verify(mMockProxyCallbacks).imsFeatureCreated(eq(SLOT_0), eq(ImsFeature.FEATURE_MMTEL));
@@ -414,7 +430,9 @@ public class ImsServiceControllerTest extends ImsTestBase {

        mTestImsServiceController.changeImsServiceFeatures(testFeaturesWithAddition);

        verify(mMockServiceControllerBinder).createMmTelFeature(eq(SLOT_1), any());
        verify(mMockServiceControllerBinder).createMmTelFeature(SLOT_1);
        verify(mMockServiceControllerBinder).addFeatureStatusCallback(eq(SLOT_1),
                eq(ImsFeature.FEATURE_MMTEL), any());
        verify(mMockCallbacks).imsServiceFeatureCreated(eq(SLOT_1), eq(ImsFeature.FEATURE_MMTEL),
                eq(mTestImsServiceController));
        verify(mMockProxyCallbacks).imsFeatureCreated(eq(SLOT_1), eq(ImsFeature.FEATURE_MMTEL));
@@ -431,7 +449,9 @@ public class ImsServiceControllerTest extends ImsTestBase {
        testFeatures.add(new ImsFeatureConfiguration.FeatureSlotPair(SLOT_0,
                ImsFeature.FEATURE_RCS));
        bindAndConnectService(testFeatures);
        verify(mMockServiceControllerBinder).createRcsFeature(eq(SLOT_0), any());
        verify(mMockServiceControllerBinder).createRcsFeature(SLOT_0);
        verify(mMockServiceControllerBinder).addFeatureStatusCallback(eq(SLOT_0),
                eq(ImsFeature.FEATURE_RCS), any());
        verify(mMockCallbacks).imsServiceFeatureCreated(eq(SLOT_0), eq(ImsFeature.FEATURE_RCS),
                eq(mTestImsServiceController));
        verify(mMockProxyCallbacks).imsFeatureCreated(eq(SLOT_0), eq(ImsFeature.FEATURE_RCS));
@@ -443,7 +463,9 @@ public class ImsServiceControllerTest extends ImsTestBase {

        mTestImsServiceController.changeImsServiceFeatures(testFeaturesWithAddition);

        verify(mMockServiceControllerBinder, never()).createMmTelFeature(eq(SLOT_1), any());
        verify(mMockServiceControllerBinder, never()).createMmTelFeature(SLOT_1);
        verify(mMockServiceControllerBinder, never()).addFeatureStatusCallback(eq(SLOT_1),
                eq(ImsFeature.FEATURE_MMTEL), any());
        verify(mMockCallbacks, never()).imsServiceFeatureCreated(eq(SLOT_1),
                eq(ImsFeature.FEATURE_MMTEL),
                eq(mTestImsServiceController));
@@ -462,7 +484,9 @@ public class ImsServiceControllerTest extends ImsTestBase {
        testFeatures.add(new ImsFeatureConfiguration.FeatureSlotPair(SLOT_0,
                ImsFeature.FEATURE_MMTEL));
        bindAndConnectService(testFeatures);
        verify(mMockServiceControllerBinder).createMmTelFeature(eq(SLOT_0), any());
        verify(mMockServiceControllerBinder).createMmTelFeature(SLOT_0);
        verify(mMockServiceControllerBinder).addFeatureStatusCallback(eq(SLOT_0),
                eq(ImsFeature.FEATURE_MMTEL), any());
        verify(mMockCallbacks).imsServiceFeatureCreated(eq(SLOT_0), eq(ImsFeature.FEATURE_MMTEL),
                eq(mTestImsServiceController));
        verify(mMockProxyCallbacks).imsFeatureCreated(eq(SLOT_0), eq(ImsFeature.FEATURE_MMTEL));
@@ -470,8 +494,14 @@ public class ImsServiceControllerTest extends ImsTestBase {
        // Call change with the same features and make sure it is disregarded
        mTestImsServiceController.changeImsServiceFeatures(testFeatures);

        verify(mMockServiceControllerBinder, times(1)).createMmTelFeature(eq(SLOT_0), any());
        verify(mMockServiceControllerBinder, never()).removeImsFeature(anyInt(), anyInt(), any());
        verify(mMockServiceControllerBinder, times(1)).createMmTelFeature(SLOT_0);
        verify(mMockServiceControllerBinder, times(1)).addFeatureStatusCallback(eq(SLOT_0),
                eq(ImsFeature.FEATURE_MMTEL), any());
        verify(mMockServiceControllerBinder, never()).removeImsFeature(anyInt(), anyInt());


        verify(mMockServiceControllerBinder, never()).removeFeatureStatusCallback(anyInt(),
                anyInt(), any());
        verify(mMockCallbacks, times(1)).imsServiceFeatureCreated(eq(SLOT_0),
                eq(ImsFeature.FEATURE_MMTEL), eq(mTestImsServiceController));
        verify(mMockCallbacks, never()).imsServiceFeatureRemoved(anyInt(), anyInt(), any());
@@ -492,11 +522,15 @@ public class ImsServiceControllerTest extends ImsTestBase {
        testFeatures.add(new ImsFeatureConfiguration.FeatureSlotPair(SLOT_1,
                ImsFeature.FEATURE_MMTEL));
        bindAndConnectService(testFeatures);
        verify(mMockServiceControllerBinder).createMmTelFeature(eq(SLOT_0), any());
        verify(mMockServiceControllerBinder).createMmTelFeature(SLOT_0);
        verify(mMockServiceControllerBinder).addFeatureStatusCallback(eq(SLOT_0),
                eq(ImsFeature.FEATURE_MMTEL), any());
        verify(mMockCallbacks).imsServiceFeatureCreated(eq(SLOT_0), eq(ImsFeature.FEATURE_MMTEL),
                eq(mTestImsServiceController));
        verify(mMockProxyCallbacks).imsFeatureCreated(eq(SLOT_0), eq(ImsFeature.FEATURE_MMTEL));
        verify(mMockServiceControllerBinder).createMmTelFeature(eq(SLOT_1), any());
        verify(mMockServiceControllerBinder).createMmTelFeature(SLOT_1);
        verify(mMockServiceControllerBinder).addFeatureStatusCallback(eq(SLOT_1),
                eq(ImsFeature.FEATURE_MMTEL), any());
        verify(mMockCallbacks).imsServiceFeatureCreated(eq(SLOT_1), eq(ImsFeature.FEATURE_MMTEL),
                eq(mTestImsServiceController));
        verify(mMockProxyCallbacks).imsFeatureCreated(eq(SLOT_1), eq(ImsFeature.FEATURE_MMTEL));
@@ -509,6 +543,8 @@ public class ImsServiceControllerTest extends ImsTestBase {
        mTestImsServiceController.changeImsServiceFeatures(testFeaturesWithSubtraction);

        verify(mMockServiceControllerBinder).removeImsFeature(eq(SLOT_1),
                eq(ImsFeature.FEATURE_MMTEL));
        verify(mMockServiceControllerBinder).removeFeatureStatusCallback(eq(SLOT_1),
                eq(ImsFeature.FEATURE_MMTEL), any());
        verify(mMockCallbacks).imsServiceFeatureRemoved(eq(SLOT_1), eq(ImsFeature.FEATURE_MMTEL),
                eq(mTestImsServiceController));
@@ -527,11 +563,15 @@ public class ImsServiceControllerTest extends ImsTestBase {
        testFeatures.add(new ImsFeatureConfiguration.FeatureSlotPair(SLOT_1,
                ImsFeature.FEATURE_MMTEL));
        bindAndConnectService(testFeatures);
        verify(mMockServiceControllerBinder).createMmTelFeature(eq(SLOT_0), any());
        verify(mMockServiceControllerBinder).createMmTelFeature(SLOT_0);
        verify(mMockServiceControllerBinder).addFeatureStatusCallback(eq(SLOT_0),
                eq(ImsFeature.FEATURE_MMTEL), any());
        verify(mMockCallbacks).imsServiceFeatureCreated(eq(SLOT_0), eq(ImsFeature.FEATURE_MMTEL),
                eq(mTestImsServiceController));
        verify(mMockProxyCallbacks).imsFeatureCreated(eq(SLOT_0), eq(ImsFeature.FEATURE_MMTEL));
        verify(mMockServiceControllerBinder).createMmTelFeature(eq(SLOT_1), any());
        verify(mMockServiceControllerBinder).createMmTelFeature(SLOT_1);
        verify(mMockServiceControllerBinder).addFeatureStatusCallback(eq(SLOT_1),
                eq(ImsFeature.FEATURE_MMTEL), any());
        verify(mMockCallbacks).imsServiceFeatureCreated(eq(SLOT_1), eq(ImsFeature.FEATURE_MMTEL),
                eq(mTestImsServiceController));
        verify(mMockProxyCallbacks).imsFeatureCreated(eq(SLOT_1), eq(ImsFeature.FEATURE_MMTEL));
@@ -540,11 +580,15 @@ public class ImsServiceControllerTest extends ImsTestBase {
        mTestImsServiceController.changeImsServiceFeatures(new HashSet<>());

        verify(mMockServiceControllerBinder).removeImsFeature(eq(SLOT_0),
                eq(ImsFeature.FEATURE_MMTEL));
        verify(mMockServiceControllerBinder).removeFeatureStatusCallback(eq(SLOT_0),
                eq(ImsFeature.FEATURE_MMTEL), any());
        verify(mMockCallbacks).imsServiceFeatureRemoved(eq(SLOT_0), eq(ImsFeature.FEATURE_MMTEL),
                eq(mTestImsServiceController));
        verify(mMockProxyCallbacks).imsFeatureRemoved(eq(SLOT_0), eq(ImsFeature.FEATURE_MMTEL));
        verify(mMockServiceControllerBinder).removeImsFeature(eq(SLOT_1),
                eq(ImsFeature.FEATURE_MMTEL));
        verify(mMockServiceControllerBinder).removeFeatureStatusCallback(eq(SLOT_1),
                eq(ImsFeature.FEATURE_MMTEL), any());
        verify(mMockCallbacks).imsServiceFeatureRemoved(eq(SLOT_1), eq(ImsFeature.FEATURE_MMTEL),
                eq(mTestImsServiceController));
@@ -571,7 +615,9 @@ public class ImsServiceControllerTest extends ImsTestBase {

        mTestImsServiceController.changeImsServiceFeatures(testFeaturesWithAddition);

        verify(mMockServiceControllerBinder, never()).createRcsFeature(eq(SLOT_0), any());
        verify(mMockServiceControllerBinder, never()).createRcsFeature(eq(SLOT_0));
        verify(mMockServiceControllerBinder, never()).removeFeatureStatusCallback(eq(SLOT_0),
                eq(ImsFeature.FEATURE_RCS), any());
        verify(mMockCallbacks, never()).imsServiceFeatureCreated(eq(SLOT_0),
                eq(ImsFeature.FEATURE_RCS), eq(mTestImsServiceController));
        verify(mMockProxyCallbacks, never()).imsFeatureCreated(eq(SLOT_0),
+0 −117

File deleted.

Preview size limit exceeded, changes collapsed.