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

Commit 9790b2ba authored by Brad Ebinger's avatar Brad Ebinger
Browse files

Report OUT_OF_SERVICE when service is lost but still IMS registered

We currently report IN_SERVICE for voice reg state for IMS when
registered. This is incorrect because we can lose the physical link
to the network when the user moves too far away from the tower,
but IMS will still stay registered for 15 min until timeout.

This change modifies the ServiceState of ImsPhone to report
IN_SERVICE only if we are IMS registered and voice capable
(whether that be VoLTE or VoWiFi).

Bug: 72483562
Test: Manual Callbox tests, atest FrameworksTelephonyTests

Change-Id: I74bda92992fe86bf3a847f67d84aacf12f963020
parent 8d614b64
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -1583,6 +1583,7 @@ public class ImsPhone extends ImsPhoneBase {
    }

    public void onFeatureCapabilityChanged() {
        updateVoiceServiceState();
        mDefaultPhone.getServiceStateTracker().onImsCapabilityChanged();
    }

@@ -1618,6 +1619,7 @@ public class ImsPhone extends ImsPhoneBase {

    public void setImsRegistered(boolean value) {
        mImsRegistered = value;
        updateVoiceServiceState();
    }

    @Override
@@ -1625,6 +1627,24 @@ public class ImsPhone extends ImsPhoneBase {
        mCT.callEndCleanupHandOverCallIfAny();
    }

    /**
     * Determines what the voice registration state for ImsPhone is. Considered "in service" if
     * we are both registered for IMS and have voice capability (either through LTE or IWLAN).
     */
    private void updateVoiceServiceState() {
        if (!isImsRegistered()) {
            // We are considered out of service is not registered to IMS
            setServiceState(ServiceState.STATE_OUT_OF_SERVICE);
            return;
        }
        // We are registered for IMS
        if (isVolteEnabled() || isWifiCallingEnabled()) {
            setServiceState(ServiceState.STATE_IN_SERVICE);
        } else {
            setServiceState(ServiceState.STATE_OUT_OF_SERVICE);
        }
    }

    private BroadcastReceiver mResultReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
+0 −3
Original line number Diff line number Diff line
@@ -2865,7 +2865,6 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
                public void onRegistered(
                        @ImsRegistrationImplBase.ImsRegistrationTech int imsRadioTech) {
                    if (DBG) log("onImsConnected imsRadioTech=" + imsRadioTech);
                    mPhone.setServiceState(ServiceState.STATE_IN_SERVICE);
                    mPhone.setImsRegistered(true);
                    mMetrics.writeOnImsConnectionState(mPhone.getPhoneId(),
                            ImsConnectionState.State.CONNECTED, null);
@@ -2875,7 +2874,6 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
                public void onRegistering(
                        @ImsRegistrationImplBase.ImsRegistrationTech int imsRadioTech) {
                    if (DBG) log("onImsProgressing imsRadioTech=" + imsRadioTech);
                    mPhone.setServiceState(ServiceState.STATE_OUT_OF_SERVICE);
                    mPhone.setImsRegistered(false);
                    mMetrics.writeOnImsConnectionState(mPhone.getPhoneId(),
                            ImsConnectionState.State.PROGRESSING, null);
@@ -2885,7 +2883,6 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
                public void onDeregistered(ImsReasonInfo imsReasonInfo) {
                    if (DBG) log("onImsDisconnected imsReasonInfo=" + imsReasonInfo);
                    resetImsCapabilities();
                    mPhone.setServiceState(ServiceState.STATE_OUT_OF_SERVICE);
                    mPhone.setImsRegistered(false);
                    mPhone.processDisconnectReason(imsReasonInfo);
                    mMetrics.writeOnImsConnectionState(mPhone.getPhoneId(),
+0 −9
Original line number Diff line number Diff line
@@ -246,30 +246,21 @@ public class ImsPhoneCallTrackerTest extends TelephonyTest {
    @Test
    @SmallTest
    public void testImsRegistered() {
        // when IMS is registered
        mRegistrationCallback.onRegistered(ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
        // then service state should be IN_SERVICE and ImsPhone state set to registered
        verify(mImsPhone).setServiceState(eq(ServiceState.STATE_IN_SERVICE));
        verify(mImsPhone).setImsRegistered(eq(true));
    }

    @Test
    @SmallTest
    public void testImsRegistering() {
        // when IMS is registering
        mRegistrationCallback.onRegistering(ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
        // then service state should be OUT_OF_SERVICE and ImsPhone state set to not registered
        verify(mImsPhone).setServiceState(eq(ServiceState.STATE_OUT_OF_SERVICE));
        verify(mImsPhone).setImsRegistered(eq(false));
    }

    @Test
    @SmallTest
    public void testImsDeregistered() {
        // when IMS is deregistered
        mRegistrationCallback.onDeregistered(new ImsReasonInfo());
        // then service state should be OUT_OF_SERVICE and ImsPhone state set to not registered
        verify(mImsPhone).setServiceState(eq(ServiceState.STATE_OUT_OF_SERVICE));
        verify(mImsPhone).setImsRegistered(eq(false));
    }

+42 −0
Original line number Diff line number Diff line
@@ -506,6 +506,48 @@ public class ImsPhoneTest extends TelephonyTest {
        verify(mSST, never()).onImsServiceStateChanged();
    }

    @Test
    public void testInServiceWhenRegisteredAndVoLTE() {
        mImsPhoneUT.setImsRegistered(true);
        doReturn(true).when(mImsCT).isVolteEnabled();
        mImsPhoneUT.onFeatureCapabilityChanged();
        assertEquals(ServiceState.STATE_IN_SERVICE, mImsPhoneUT.getServiceState().getState());
    }

    @Test
    public void testInServiceWhenRegisteredAndVoWiFi() {
        mImsPhoneUT.setImsRegistered(true);
        doReturn(true).when(mImsCT).isVowifiEnabled();
        mImsPhoneUT.onFeatureCapabilityChanged();
        assertEquals(ServiceState.STATE_IN_SERVICE, mImsPhoneUT.getServiceState().getState());
    }

    @Test
    public void testOutOfServiceWhenRegisteredAndNoVoice() {
        mImsPhoneUT.setImsRegistered(true);
        doReturn(false).when(mImsCT).isVowifiEnabled();
        doReturn(false).when(mImsCT).isVolteEnabled();
        mImsPhoneUT.onFeatureCapabilityChanged();
        assertEquals(ServiceState.STATE_OUT_OF_SERVICE, mImsPhoneUT.getServiceState().getState());
    }

    @Test
    public void testOutOfServiceWhenNotRegistered() {
        mImsPhoneUT.setImsRegistered(false);
        assertEquals(ServiceState.STATE_OUT_OF_SERVICE, mImsPhoneUT.getServiceState().getState());
    }

    @Test
    public void testOutOfServiceWhenRegisteredAndLoseVoice() {
        doReturn(true).when(mImsCT).isVolteEnabled();
        mImsPhoneUT.setImsRegistered(true);
        assertEquals(ServiceState.STATE_IN_SERVICE, mImsPhoneUT.getServiceState().getState());

        doReturn(false).when(mImsCT).isVolteEnabled();
        mImsPhoneUT.onFeatureCapabilityChanged();
        assertEquals(ServiceState.STATE_OUT_OF_SERVICE, mImsPhoneUT.getServiceState().getState());
    }

    @Test
    @SmallTest
    public void testCellBarring() throws Exception {