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

Commit 02f3fed2 authored by Hunsuk Choi's avatar Hunsuk Choi
Browse files

Fix SsDomainController to support terminal-based CLIR with vendor IMS

If vendor Ims service handles the terminal based call waiting service
by itself, we should forward the request to Ims service as legacy
implementation when Ut is available.

Bug: 237030511
Test: atest
Change-Id: I701cf010da26a7fd4b93e06e99f9dcdcaf0d0e81
parent 3f2e85a9
Loading
Loading
Loading
Loading
+30 −8
Original line number Diff line number Diff line
@@ -2378,18 +2378,18 @@ public class GsmCdmaPhone extends Phone {

    /**
     * Checks the availability of Ut directly without SsDomainController.
     * This is only applicable for the case that the terminal-based call waiting service
     * is handled by the IMS service alone without interworking with CallWaitingController.
     * This is only applicable for the case that the terminal-based service
     * is handled by the IMS service alone without interworking with framework.
     */
    private boolean useCallWaitingOverUt(Message onComplete) {
    private boolean useTerminalBasedServiceOverIms(Message onComplete) {
        Phone imsPhone = mImsPhone;
        if (imsPhone == null) {
            logd("useCallWaitingOverUt: called for GsmCdma");
            logd("useTerminalBasedServiceOverIms: called for GsmCdma");
            return false;
        }

        boolean isUtEnabled = imsPhone.isUtEnabled();
        Rlog.d(LOG_TAG, "useCallWaitingOverUt isUtEnabled= " + isUtEnabled
        Rlog.d(LOG_TAG, "useTerminalBasedServiceOverIms isUtEnabled= " + isUtEnabled
                + " isCsRetry(onComplete))= " + isCsRetry(onComplete));
        return isUtEnabled && !isCsRetry(onComplete);
    }
@@ -2409,6 +2409,14 @@ public class GsmCdmaPhone extends Phone {
        return mSsDomainController.getOemHandlesTerminalBasedCallWaiting();
    }

    /**
     * Returns whether the carrier supports the terminal-based CLIR
     * and Ims service handles it by itself.
     */
    private boolean getOemHandlesTerminalBasedClir() {
        return mSsDomainController.getOemHandlesTerminalBasedClir();
    }

    /**
     * Sends response indicating no nework is available for supplementary services.
     */
@@ -2668,6 +2676,13 @@ public class GsmCdmaPhone extends Phone {
                responseInvalidState(onComplete);
                return;
            }
        } else if (getOemHandlesTerminalBasedClir()) {
            // Ims service handles the terminal-based CLIR by itself.
            // Use legacy implementation. Forward the request to Ims service if Ut is available.
            if (useTerminalBasedServiceOverIms(onComplete)) {
                imsPhone.getOutgoingCallerIdDisplay(onComplete);
                return;
            }
        }

        if (isPhoneTypeGsm()) {
@@ -2700,6 +2715,13 @@ public class GsmCdmaPhone extends Phone {
                responseInvalidState(onComplete);
                return;
            }
        } else if (getOemHandlesTerminalBasedClir()) {
            // Ims service handles the terminal-based CLIR by itself.
            // Use legacy implementation. Forward the request to Ims service if Ut is available.
            if (useTerminalBasedServiceOverIms(onComplete)) {
                imsPhone.setOutgoingCallerIdDisplay(commandInterfaceCLIRMode, onComplete);
                return;
            }
        }

        if (isPhoneTypeGsm()) {
@@ -2771,7 +2793,7 @@ public class GsmCdmaPhone extends Phone {
        } else if (getOemHandlesTerminalBasedCallWaiting()) {
            // Ims service handles the terminal-based call waiting service by itself.
            // Use legacy implementation. Forward the request to Ims service if Ut is available.
            if (useCallWaitingOverUt(onComplete)) {
            if (useTerminalBasedServiceOverIms(onComplete)) {
                imsPhone.getCallWaiting(onComplete);
                return;
            }
@@ -2836,7 +2858,7 @@ public class GsmCdmaPhone extends Phone {
        } else if (getOemHandlesTerminalBasedCallWaiting()) {
            // Ims service handles the terminal-based call waiting service by itself.
            // Use legacy implementation. Forward the request to Ims service if Ut is available.
            if (useCallWaitingOverUt(onComplete)) {
            if (useTerminalBasedServiceOverIms(onComplete)) {
                imsPhone.setCallWaiting(enable, onComplete);
                return;
            }
@@ -2880,7 +2902,7 @@ public class GsmCdmaPhone extends Phone {
    @Override
    public void setTerminalBasedCallWaitingSupported(boolean supported) {
        mCallWaitingController.setTerminalBasedCallWaitingSupported(supported);
        mSsDomainController.setOemHandlesTerminalBasedCallWaiting(!supported);
        mSsDomainController.setOemHandlesTerminalBasedService(!supported);
    }

    @Override
+30 −14
Original line number Diff line number Diff line
@@ -170,9 +170,10 @@ public class SsDomainController {
    private Set<Integer> mUtAvailableRats = new HashSet<>();
    private boolean mWiFiAvailable = false;
    private boolean mIsMonitoringConnectivity = false;
    /** true if Ims service handles the terminal-based call waiting service by itself. */
    private boolean mOemHandlesTerminalBasedCallWaiting = false;
    /** true if Ims service handles the terminal-based service by itself. */
    private boolean mOemHandlesTerminalBasedService = false;
    private boolean mSupportsTerminalBasedCallWaiting = false;
    private boolean mSupportsTerminalBasedClir = false;

    public SsDomainController(GsmCdmaPhone phone) {
        mPhone = phone;
@@ -221,16 +222,19 @@ public class SsDomainController {
        mUtAvailableWhenRoaming = availableWhenRoaming;

        mSupportsTerminalBasedCallWaiting = false;
        mSupportsTerminalBasedClir = false;
        if (tbServices != null) {
            for (int tbService : tbServices) {
                if (tbService == SUPPLEMENTARY_SERVICE_CW) {
                    mSupportsTerminalBasedCallWaiting = true;
                    break;
                }
                if (tbService == SUPPLEMENTARY_SERVICE_IDENTIFICATION_OIR) {
                    mSupportsTerminalBasedClir = true;
                }
            }
        }
        logi("updateSsOverUtConfig terminal-based cw "
                + mSupportsTerminalBasedCallWaiting);
        logi("updateSsOverUtConfig terminal-based cw=" + mSupportsTerminalBasedCallWaiting
                + ", clir=" + mSupportsTerminalBasedClir);

        mCbOverUtSupported.clear();
        mCfOverUtSupported.clear();
@@ -535,8 +539,9 @@ public class SsDomainController {
     * Only for ImsPhoneMmiCode.
     */
    public SuppServiceRoutingInfo getSuppServiceRoutingInfoForSs(String service) {
        if (SS_CW.equals(service) && getOemHandlesTerminalBasedCallWaiting()) {
            // Ims service handles the terminal based call waiting service by itself.
        if ((SS_CW.equals(service) && getOemHandlesTerminalBasedCallWaiting())
                || (SS_CLIR.equals(service) && getOemHandlesTerminalBasedClir())) {
            // Ims service handles the terminal based service by itself.
            // Use legacy implementation. Forward the request to Ims service if Ut is available.
            Phone imsPhone = mPhone.getImsPhone();
            boolean isUtEnabled = (imsPhone != null) && imsPhone.isUtEnabled();
@@ -575,12 +580,12 @@ public class SsDomainController {
    }

    /**
     * @param state true if Ims service handles the terminal-based call waiting service by itself.
     * @param state true if Ims service handles the terminal-based service by itself.
     *              Otherwise, false.
     */
    public void setOemHandlesTerminalBasedCallWaiting(boolean state) {
        logi("setOemHandlesTerminalBasedCallWaiting " + state);
        mOemHandlesTerminalBasedCallWaiting = state;
    public void setOemHandlesTerminalBasedService(boolean state) {
        logi("setOemHandlesTerminalBasedService " + state);
        mOemHandlesTerminalBasedService = state;
    }

    /**
@@ -589,8 +594,18 @@ public class SsDomainController {
     */
    public boolean getOemHandlesTerminalBasedCallWaiting() {
        logi("getOemHandlesTerminalBasedCallWaiting "
                + mSupportsTerminalBasedCallWaiting + ", " + mOemHandlesTerminalBasedCallWaiting);
        return mSupportsTerminalBasedCallWaiting && mOemHandlesTerminalBasedCallWaiting;
                + mSupportsTerminalBasedCallWaiting + ", " + mOemHandlesTerminalBasedService);
        return mSupportsTerminalBasedCallWaiting && mOemHandlesTerminalBasedService;
    }

    /**
     * Returns whether the carrier supports the terminal-based CLIR
     * and Ims service handles it by itself.
     */
    public boolean getOemHandlesTerminalBasedClir() {
        logi("getOemHandlesTerminalBasedClir "
                + mSupportsTerminalBasedClir + ", " + mOemHandlesTerminalBasedService);
        return mSupportsTerminalBasedClir && mOemHandlesTerminalBasedService;
    }

    /**
@@ -610,8 +625,9 @@ public class SsDomainController {
        pw.println(" mUtAvailableWhenRoaming=" + mUtAvailableWhenRoaming);
        pw.println(" mUtAvailableRats=" + mUtAvailableRats);
        pw.println(" mWiFiAvailable=" + mWiFiAvailable);
        pw.println(" mOemHandlesTerminalBasedCallWaiting=" + mOemHandlesTerminalBasedCallWaiting);
        pw.println(" mOemHandlesTerminalBasedService=" + mOemHandlesTerminalBasedService);
        pw.println(" mSupportsTerminalBasedCallWaiting=" + mSupportsTerminalBasedCallWaiting);
        pw.println(" mSupportsTerminalBasedClir=" + mSupportsTerminalBasedClir);
        pw.decreaseIndent();
    }

+29 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.internal.telephony;

import static com.android.internal.telephony.CommandsInterface.CF_ACTION_ENABLE;
import static com.android.internal.telephony.CommandsInterface.CF_REASON_UNCONDITIONAL;
import static com.android.internal.telephony.CommandsInterface.CLIR_SUPPRESSION;
import static com.android.internal.telephony.Phone.EVENT_ICC_CHANGED;
import static com.android.internal.telephony.Phone.EVENT_SRVCC_STATE_CHANGED;
import static com.android.internal.telephony.Phone.EVENT_UICC_APPS_ENABLEMENT_STATUS_CHANGED;
@@ -2206,4 +2207,32 @@ public class GsmCdmaPhoneTest extends TelephonyTest {
        mPhoneUT.setCallWaiting(false, CommandsInterface.SERVICE_CLASS_VOICE, null);
        verify(mImsPhone, times(1)).setCallWaiting(eq(false), any());
    }

    @Test
    @SmallTest
    public void testOemHandlesTerminalBasedClir() throws Exception {
        doReturn(true).when(mImsPhone).isUtEnabled();
        replaceInstance(Phone.class, "mImsPhone", mPhoneUT, mImsPhone);

        // Ut is disabled in config
        doReturn(false).when(mSsDomainController).useSsOverUt(anyString());
        doReturn(false).when(mSsDomainController).getOemHandlesTerminalBasedClir();

        replaceInstance(GsmCdmaPhone.class, "mSsDomainController", mPhoneUT, mSsDomainController);

        mPhoneUT.getOutgoingCallerIdDisplay(null);
        verify(mImsPhone, times(0)).getOutgoingCallerIdDisplay(any());

        mPhoneUT.setOutgoingCallerIdDisplay(CLIR_SUPPRESSION, null);
        verify(mImsPhone, times(0)).setOutgoingCallerIdDisplay(anyInt(), any());

        // OEM handles the terminal-based CLIR by itself.
        doReturn(true).when(mSsDomainController).getOemHandlesTerminalBasedClir();

        mPhoneUT.getOutgoingCallerIdDisplay(null);
        verify(mImsPhone, times(1)).getOutgoingCallerIdDisplay(any());

        mPhoneUT.setOutgoingCallerIdDisplay(CLIR_SUPPRESSION, null);
        verify(mImsPhone, times(1)).setOutgoingCallerIdDisplay(eq(CLIR_SUPPRESSION), any());
    }
}
+37 −2
Original line number Diff line number Diff line
@@ -440,19 +440,54 @@ public class SsDomainControllerTest extends TelephonyTest {
                new int[] {}, UT_OVER_ALL, new int[] { SUPPLEMENTARY_SERVICE_CW });
        String sc = mServices.get(SS_CW);

        mSdc.setOemHandlesTerminalBasedCallWaiting(false);
        mSdc.setOemHandlesTerminalBasedService(false);
        SsDomainController.SuppServiceRoutingInfo ssCode =
                ImsPhoneMmiCode.getSuppServiceRoutingInfo("*#" + sc + "#", mSdc);
        assertNotNull(ssCode);
        assertFalse(ssCode.useSsOverUt());

        mSdc.setOemHandlesTerminalBasedCallWaiting(true);
        mSdc.setOemHandlesTerminalBasedService(true);
        ssCode = ImsPhoneMmiCode.getSuppServiceRoutingInfo("*#" + sc + "#", mSdc);

        assertNotNull(ssCode);
        assertTrue(ssCode.useSsOverUt());
    }

    @Test
    @SmallTest
    public void testOemHandlesTerminalBasedClir() {
        setUtEnabled();

        // Enable terminal-based CLIR
        mSdc.updateCarrierConfigForTest(true, true, false, true, true,
                new int[] {}, UT_OVER_ALL, new int[] { SUPPLEMENTARY_SERVICE_IDENTIFICATION_OIR });
        String sc = mServices.get(SS_CLIR);

        mSdc.setOemHandlesTerminalBasedService(false);
        SsDomainController.SuppServiceRoutingInfo ssCode =
                ImsPhoneMmiCode.getSuppServiceRoutingInfo("*#" + sc + "#", mSdc);

        assertNotNull(ssCode);
        assertFalse(ssCode.useSsOverUt());
        assertFalse(mSdc.getOemHandlesTerminalBasedClir());

        mSdc.setOemHandlesTerminalBasedService(true);
        ssCode = ImsPhoneMmiCode.getSuppServiceRoutingInfo("*#" + sc + "#", mSdc);

        assertNotNull(ssCode);
        assertTrue(ssCode.useSsOverUt());
        assertTrue(mSdc.getOemHandlesTerminalBasedClir());

        // Disable terminal-based CLIR
        mSdc.updateCarrierConfigForTest(true, true, false, true, true,
                new int[] {}, UT_OVER_ALL, new int[] {});
        ssCode = ImsPhoneMmiCode.getSuppServiceRoutingInfo("*#" + sc + "#", mSdc);

        assertNotNull(ssCode);
        assertFalse(ssCode.useSsOverUt());
        assertFalse(mSdc.getOemHandlesTerminalBasedClir());
    }

    private void setUtEnabled() {
        doReturn(0).when(mImsPhone).getSubId();
        mSdc.updateWifiForUt(false);