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

Commit 5a295f5c authored by Hunsuk Choi's avatar Hunsuk Choi Committed by Cherrypicker Worker
Browse files

Update CallWaitingController, SYNC_USER_CHANGE

Implement the configuration, CALL_WAITING_SYNC_USER_CHANGE
The change of user’s setting is always passed to the CS network.

Bug: 202463005
Test: atest

Change-Id: I1f21bb0f3f6b5f21ed9eb08527a05eb9595a52b7
(cherry picked from commit 9f80747d451e02c5f68deb182e227e3349f1d052)
Merged-In: I1f21bb0f3f6b5f21ed9eb08527a05eb9595a52b7
parent 3cfbf59e
Loading
Loading
Loading
Loading
+67 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.internal.telephony;

import static android.telephony.CarrierConfigManager.ImsSs.CALL_WAITING_SYNC_NONE;
import static android.telephony.CarrierConfigManager.ImsSs.CALL_WAITING_SYNC_USER_CHANGE;
import static android.telephony.CarrierConfigManager.ImsSs.KEY_TERMINAL_BASED_CALL_WAITING_DEFAULT_ENABLED_BOOL;
import static android.telephony.CarrierConfigManager.ImsSs.KEY_TERMINAL_BASED_CALL_WAITING_SYNC_TYPE_INT;
import static android.telephony.CarrierConfigManager.ImsSs.KEY_UT_TERMINAL_BASED_SERVICES_INT_ARRAY;
@@ -33,6 +34,7 @@ import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.AsyncResult;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
@@ -46,7 +48,7 @@ import com.android.telephony.Rlog;
 *
 * {@hide}
 */
public class CallWaitingController {
public class CallWaitingController extends Handler {

    public static final String LOG_TAG = "CallWaiting";
    private static final boolean DBG = false; /* STOPSHIP if true */
@@ -58,6 +60,20 @@ public class CallWaitingController {
    // Terminal-based call waiting is supported and activated. */
    public static final int TERMINAL_BASED_ACTIVATED = 1;

    private static final int EVENT_SET_CALL_WAITING_DONE = 1;
    private static final int EVENT_GET_CALL_WAITING_DONE = 2;

    // Class to pack mOnComplete object passed by the caller
    private static class Cw {
        final boolean mEnable;
        final Message mOnComplete;

        Cw(boolean enable, Message onComplete) {
            mEnable = enable;
            mOnComplete = onComplete;
        }
    }

    @VisibleForTesting
    public static final String PREFERENCE_TBCW = "terminal_based_call_waiting";
    @VisibleForTesting
@@ -157,6 +173,11 @@ public class CallWaitingController {
        if (mSyncPreference == CALL_WAITING_SYNC_NONE) {
            sendGetCallWaitingResponse(onComplete);
            return true;
        } else if (mSyncPreference == CALL_WAITING_SYNC_USER_CHANGE) {
            Cw cw = new Cw(false, onComplete);
            Message resp = obtainMessage(EVENT_GET_CALL_WAITING_DONE, 0, 0, cw);
            mPhone.mCi.queryCallWaiting(SERVICE_CLASS_NONE, resp);
            return true;
        }

        return false;
@@ -182,11 +203,56 @@ public class CallWaitingController {

            sendToTarget(onComplete, null, null);
            return true;
        } else if (mSyncPreference == CALL_WAITING_SYNC_USER_CHANGE) {
            Cw cw = new Cw(enable, onComplete);
            Message resp = obtainMessage(EVENT_SET_CALL_WAITING_DONE, 0, 0, cw);
            mPhone.mCi.setCallWaiting(enable, serviceClass, resp);
            return true;
        }

        return false;
    }

    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case EVENT_SET_CALL_WAITING_DONE:
                onSetCallWaitingDone((AsyncResult) msg.obj);
                break;
            case EVENT_GET_CALL_WAITING_DONE:
                onGetCallWaitingDone((AsyncResult) msg.obj);
                break;
        }
    }

    private void onSetCallWaitingDone(AsyncResult ar) {
        if (ar.userObj != null && ar.userObj instanceof Cw) {
            if (DBG) Rlog.d(LOG_TAG, "onSetCallWaitingDone");
            Cw cw = (Cw) ar.userObj;
            if (ar.exception == null) {
                updateState(
                        cw.mEnable ? TERMINAL_BASED_ACTIVATED : TERMINAL_BASED_NOT_ACTIVATED);
            }
            sendToTarget(cw.mOnComplete, ar.result, ar.exception);
        }
    }

    private void onGetCallWaitingDone(AsyncResult ar) {
        if (ar.userObj != null && ar.userObj instanceof Cw) {
            if (DBG) Rlog.d(LOG_TAG, "onGetCallWaitingDone");
            Cw cw = (Cw) ar.userObj;
            if (ar.exception == null) {
                int[] resp = (int[]) ar.result;
                if (resp != null && resp.length > 1) {
                    boolean enabled =
                            resp[0] == 1 && (resp[1] & SERVICE_CLASS_VOICE) == SERVICE_CLASS_VOICE;
                    updateState(enabled ? TERMINAL_BASED_ACTIVATED : TERMINAL_BASED_NOT_ACTIVATED);
                }
            }
            sendToTarget(cw.mOnComplete, ar.result, ar.exception);
        }
    }

    private void sendToTarget(Message onComplete, Object result, Throwable exception) {
        if (onComplete != null) {
            AsyncResult.forMessage(onComplete, result, exception);
+53 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
package com.android.internal.telephony;

import static android.telephony.CarrierConfigManager.ImsSs.CALL_WAITING_SYNC_NONE;
import static android.telephony.CarrierConfigManager.ImsSs.CALL_WAITING_SYNC_USER_CHANGE;
import static android.telephony.CarrierConfigManager.ImsSs.KEY_TERMINAL_BASED_CALL_WAITING_DEFAULT_ENABLED_BOOL;
import static android.telephony.CarrierConfigManager.ImsSs.KEY_TERMINAL_BASED_CALL_WAITING_SYNC_TYPE_INT;
import static android.telephony.CarrierConfigManager.ImsSs.KEY_UT_TERMINAL_BASED_SERVICES_INT_ARRAY;
@@ -224,6 +225,58 @@ public class CallWaitingControllerTest extends TelephonyTest {
        assertTrue(retrieveStatePreference(mPhone.getSubId()) == TERMINAL_BASED_NOT_ACTIVATED);
    }

    @Test
    @SmallTest
    public void testSyncUserChange() {
        mCWC.setTerminalBasedCallWaitingSupported(false);
        setPreference(mPhone.getPhoneId(), FAKE_SUB_ID,
                TERMINAL_BASED_ACTIVATED, CALL_WAITING_SYNC_USER_CHANGE);
        mCWC.setTerminalBasedCallWaitingSupported(true);
        PersistableBundle bundle = getBundle(true, CALL_WAITING_SYNC_USER_CHANGE, true);
        mCWC.updateCarrierConfig(FAKE_SUB_ID, bundle, true);

        assertTrue(mCWC.getTerminalBasedCallWaitingState() == TERMINAL_BASED_ACTIVATED);
        assertTrue(retrieveStatePreference(mPhone.getSubId()) == TERMINAL_BASED_ACTIVATED);

        mHandler = new GetTestHandler();

        mSimulatedCommands.setCallWaiting(false, SERVICE_CLASS_VOICE, null);

        assertTrue(mCWC.getCallWaiting(mHandler.obtainMessage(GET_DONE)));
        mTestableLooper.processAllMessages();

        assertNotNull(mHandler.resp);
        assertEquals(2, mHandler.resp.length);
        assertEquals(TERMINAL_BASED_NOT_ACTIVATED, mHandler.resp[0]);
        assertEquals(SERVICE_CLASS_NONE, mHandler.resp[1]);

        assertTrue(mCWC.getTerminalBasedCallWaitingState() == TERMINAL_BASED_NOT_ACTIVATED);
        assertTrue(retrieveStatePreference(mPhone.getSubId()) == TERMINAL_BASED_NOT_ACTIVATED);

        mHandler.reset();

        mSimulatedCommands.setCallWaiting(true, SERVICE_CLASS_VOICE, null);

        assertTrue(mCWC.getCallWaiting(mHandler.obtainMessage(GET_DONE)));
        mTestableLooper.processAllMessages();

        assertNotNull(mHandler.resp);
        assertEquals(2, mHandler.resp.length);
        assertEquals(TERMINAL_BASED_ACTIVATED, mHandler.resp[0]);
        assertEquals(SERVICE_CLASS_VOICE, mHandler.resp[1]);

        assertTrue(mCWC.getTerminalBasedCallWaitingState() == TERMINAL_BASED_ACTIVATED);
        assertTrue(retrieveStatePreference(mPhone.getSubId()) == TERMINAL_BASED_ACTIVATED);

        mHandler.reset();

        assertTrue(mCWC.setCallWaiting(false, SERVICE_CLASS_VOICE, null));
        mTestableLooper.processAllMessages();

        assertTrue(mCWC.getTerminalBasedCallWaitingState() == TERMINAL_BASED_NOT_ACTIVATED);
        assertTrue(retrieveStatePreference(mPhone.getSubId()) == TERMINAL_BASED_NOT_ACTIVATED);
    }

    private PersistableBundle getBundle(boolean provisioned, int preference, boolean defaultState) {
        PersistableBundle bundle = new PersistableBundle();
        bundle.putIntArray(KEY_UT_TERMINAL_BASED_SERVICES_INT_ARRAY,
+16 −2
Original line number Diff line number Diff line
@@ -186,6 +186,8 @@ public class SimulatedCommands extends BaseCommands
    public boolean mSetRadioPowerForEmergencyCall;
    public boolean mSetRadioPowerAsSelectedPhoneForEmergencyCall;

    public boolean mCallWaitActivated = false;

    // mode for Icc Sim Authentication
    private int mAuthenticationMode;
    //***** Constructor
@@ -1432,6 +1434,14 @@ public class SimulatedCommands extends BaseCommands

    @Override
    public void queryCallWaiting(int serviceClass, Message response) {
        if (response != null && serviceClass == SERVICE_CLASS_NONE) {
            int[] r = new int[2];
            r[0] = (mCallWaitActivated ? 1 : 0);
            r[1] = (mCallWaitActivated ? SERVICE_CLASS_VOICE : SERVICE_CLASS_NONE);
            resultSuccess(response, r);
            return;
        }

        unimplemented(response);
    }

@@ -1440,11 +1450,15 @@ public class SimulatedCommands extends BaseCommands
     * @param serviceClass is a sum of SERVICE_CLASS_*
     * @param response is callback message
     */

    @Override
    public void setCallWaiting(boolean enable, int serviceClass,
            Message response) {
        unimplemented(response);
        if ((serviceClass & SERVICE_CLASS_VOICE) == SERVICE_CLASS_VOICE) {
            mCallWaitActivated = enable;
        }
        if (response != null) {
            resultSuccess(response, null);
        }
    }

    /**