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

Commit deeca16a authored by Jack Yu's avatar Jack Yu
Browse files

Replaced link state with link status

Used the existing APIs DataCallResponse.LinkStatus. This
is the preliminary step to remove DcController.

Bug: 213246140
Test: Manual
Change-Id: I0d9907d886efe1cf3f9840765c35f660acaa21f4
parent bb5dba68
Loading
Loading
Loading
Loading
+27 −28
Original line number Diff line number Diff line
@@ -34,11 +34,10 @@ import android.telephony.SubscriptionManager;
import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.telephony.data.DataCallResponse;
import android.text.TextUtils;

import com.android.internal.telephony.dataconnection.DataConnection;
import com.android.internal.telephony.dataconnection.DcController;
import com.android.internal.telephony.dataconnection.DcController.PhysicalLinkState;
import com.android.internal.telephony.dataconnection.DcTracker;
import com.android.internal.telephony.util.ArrayUtils;
import com.android.internal.util.IState;
@@ -88,7 +87,7 @@ public class NetworkTypeController extends StateMachine {
    private static final int EVENT_DATA_RAT_CHANGED = 2;
    private static final int EVENT_NR_STATE_CHANGED = 3;
    private static final int EVENT_NR_FREQUENCY_CHANGED = 4;
    private static final int EVENT_PHYSICAL_LINK_STATE_CHANGED = 5;
    private static final int EVENT_PHYSICAL_LINK_STATUS_CHANGED = 5;
    private static final int EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED = 6;
    private static final int EVENT_CARRIER_CONFIG_CHANGED = 7;
    private static final int EVENT_PRIMARY_TIMER_EXPIRED = 8;
@@ -107,7 +106,7 @@ public class NetworkTypeController extends StateMachine {
        sEvents[EVENT_DATA_RAT_CHANGED] = "EVENT_DATA_RAT_CHANGED";
        sEvents[EVENT_NR_STATE_CHANGED] = "EVENT_NR_STATE_CHANGED";
        sEvents[EVENT_NR_FREQUENCY_CHANGED] = "EVENT_NR_FREQUENCY_CHANGED";
        sEvents[EVENT_PHYSICAL_LINK_STATE_CHANGED] = "EVENT_PHYSICAL_LINK_STATE_CHANGED";
        sEvents[EVENT_PHYSICAL_LINK_STATUS_CHANGED] = "EVENT_PHYSICAL_LINK_STATUS_CHANGED";
        sEvents[EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED] =
                "EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED";
        sEvents[EVENT_CARRIER_CONFIG_CHANGED] = "EVENT_CARRIER_CONFIG_CHANGED";
@@ -148,7 +147,7 @@ public class NetworkTypeController extends StateMachine {
    private String mPrimaryTimerState;
    private String mSecondaryTimerState;
    private String mPreviousState;
    private @PhysicalLinkState int mPhysicalLinkState;
    private @DataCallResponse.LinkStatus int mPhysicalLinkStatus;
    private boolean mIsPhysicalChannelConfig16Supported;
    private Boolean mIsNrAdvancedAllowedByPco = false;
    private int mNrAdvancedCapablePcoId = 0;
@@ -210,8 +209,8 @@ public class NetworkTypeController extends StateMachine {
                TelephonyManager.CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED);
        if (!mIsPhysicalChannelConfig16Supported) {
            mPhone.getDcTracker(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                    .registerForPhysicalLinkStateChanged(getHandler(),
                            EVENT_PHYSICAL_LINK_STATE_CHANGED);
                    .registerForPhysicalLinkStatusChanged(getHandler(),
                            EVENT_PHYSICAL_LINK_STATUS_CHANGED);
        }
        mPhone.getServiceStateTracker().registerForNrStateChanged(getHandler(),
                EVENT_NR_STATE_CHANGED, null);
@@ -298,8 +297,8 @@ public class NetworkTypeController extends StateMachine {
                        CarrierConfigManager.KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL);
                if (mIsPhysicalChannelConfig16Supported && mIsUsingUserDataForRrcDetection) {
                    mPhone.getDcTracker(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                            .registerForPhysicalLinkStateChanged(getHandler(),
                                    EVENT_PHYSICAL_LINK_STATE_CHANGED);
                            .registerForPhysicalLinkStatusChanged(getHandler(),
                                    EVENT_PHYSICAL_LINK_STATUS_CHANGED);
                }
            }
        }
@@ -527,12 +526,12 @@ public class NetworkTypeController extends StateMachine {
                    break;
                case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED:
                    if (isUsingPhysicalChannelConfigForRrcDetection()) {
                        mPhysicalLinkState = getPhysicalLinkStateFromPhysicalChannelConfig();
                        mPhysicalLinkStatus = getPhysicalLinkStatusFromPhysicalChannelConfig();
                    }
                    break;
                case EVENT_PHYSICAL_LINK_STATE_CHANGED:
                case EVENT_PHYSICAL_LINK_STATUS_CHANGED:
                    AsyncResult ar = (AsyncResult) msg.obj;
                    mPhysicalLinkState = (int) ar.result;
                    mPhysicalLinkStatus = (int) ar.result;
                    break;
                case EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED:
                    AsyncResult result = (AsyncResult) msg.obj;
@@ -632,7 +631,7 @@ public class NetworkTypeController extends StateMachine {
                    break;
                case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED:
                    if (isUsingPhysicalChannelConfigForRrcDetection()) {
                        mPhysicalLinkState = getPhysicalLinkStateFromPhysicalChannelConfig();
                        mPhysicalLinkStatus = getPhysicalLinkStatusFromPhysicalChannelConfig();
                        if (mIsTimerResetEnabledForLegacyStateRRCIdle && !isPhysicalLinkActive()) {
                            resetAllTimers();
                        }
@@ -640,9 +639,9 @@ public class NetworkTypeController extends StateMachine {
                    // Update in case of LTE/LTE+ switch
                    updateOverrideNetworkType();
                    break;
                case EVENT_PHYSICAL_LINK_STATE_CHANGED:
                case EVENT_PHYSICAL_LINK_STATUS_CHANGED:
                    AsyncResult ar = (AsyncResult) msg.obj;
                    mPhysicalLinkState = (int) ar.result;
                    mPhysicalLinkStatus = (int) ar.result;
                    if (mIsTimerResetEnabledForLegacyStateRRCIdle && !isPhysicalLinkActive()) {
                        resetAllTimers();
                        updateOverrideNetworkType();
@@ -704,7 +703,7 @@ public class NetworkTypeController extends StateMachine {
                    break;
                case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED:
                    if (isUsingPhysicalChannelConfigForRrcDetection()) {
                        mPhysicalLinkState = getPhysicalLinkStateFromPhysicalChannelConfig();
                        mPhysicalLinkStatus = getPhysicalLinkStatusFromPhysicalChannelConfig();
                        if (isNrNotRestricted()) {
                            // NOT_RESTRICTED_RRC_IDLE -> NOT_RESTRICTED_RRC_CON
                            if (isPhysicalLinkActive()) {
@@ -719,9 +718,9 @@ public class NetworkTypeController extends StateMachine {
                    // Update in case of LTE/LTE+ switch
                    updateOverrideNetworkType();
                    break;
                case EVENT_PHYSICAL_LINK_STATE_CHANGED:
                case EVENT_PHYSICAL_LINK_STATUS_CHANGED:
                    AsyncResult ar = (AsyncResult) msg.obj;
                    mPhysicalLinkState = (int) ar.result;
                    mPhysicalLinkStatus = (int) ar.result;
                    if (isNrNotRestricted()) {
                        // NOT_RESTRICTED_RRC_IDLE -> NOT_RESTRICTED_RRC_CON
                        if (isPhysicalLinkActive()) {
@@ -788,7 +787,7 @@ public class NetworkTypeController extends StateMachine {
                    break;
                case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED:
                    if (isUsingPhysicalChannelConfigForRrcDetection()) {
                        mPhysicalLinkState = getPhysicalLinkStateFromPhysicalChannelConfig();
                        mPhysicalLinkStatus = getPhysicalLinkStatusFromPhysicalChannelConfig();
                        if (isNrNotRestricted()) {
                            // NOT_RESTRICTED_RRC_CON -> NOT_RESTRICTED_RRC_IDLE
                            if (!isPhysicalLinkActive()) {
@@ -803,9 +802,9 @@ public class NetworkTypeController extends StateMachine {
                    // Update in case of LTE/LTE+ switch
                    updateOverrideNetworkType();
                    break;
                case EVENT_PHYSICAL_LINK_STATE_CHANGED:
                case EVENT_PHYSICAL_LINK_STATUS_CHANGED:
                    AsyncResult ar = (AsyncResult) msg.obj;
                    mPhysicalLinkState = (int) ar.result;
                    mPhysicalLinkStatus = (int) ar.result;
                    if (isNrNotRestricted()) {
                        // NOT_RESTRICTED_RRC_CON -> NOT_RESTRICTED_RRC_IDLE
                        if (!isPhysicalLinkActive()) {
@@ -880,13 +879,13 @@ public class NetworkTypeController extends StateMachine {
                case EVENT_NR_FREQUENCY_CHANGED:
                case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED:
                    if (isUsingPhysicalChannelConfigForRrcDetection()) {
                        mPhysicalLinkState = getPhysicalLinkStateFromPhysicalChannelConfig();
                        mPhysicalLinkStatus = getPhysicalLinkStatusFromPhysicalChannelConfig();
                    }
                    updateNrAdvancedState();
                    break;
                case EVENT_PHYSICAL_LINK_STATE_CHANGED:
                case EVENT_PHYSICAL_LINK_STATUS_CHANGED:
                    AsyncResult ar = (AsyncResult) msg.obj;
                    mPhysicalLinkState = (int) ar.result;
                    mPhysicalLinkStatus = (int) ar.result;
                    if (!isNrConnected()) {
                        log("NR state changed. Sending EVENT_NR_STATE_CHANGED");
                        sendMessage(EVENT_NR_STATE_CHANGED);
@@ -1214,14 +1213,14 @@ public class NetworkTypeController extends StateMachine {
    }

    private boolean isPhysicalLinkActive() {
        return mPhysicalLinkState == DcController.PHYSICAL_LINK_ACTIVE;
        return mPhysicalLinkStatus == DataCallResponse.LINK_STATUS_ACTIVE;
    }

    private int getPhysicalLinkStateFromPhysicalChannelConfig() {
    private int getPhysicalLinkStatusFromPhysicalChannelConfig() {
        List<PhysicalChannelConfig> physicalChannelConfigList =
                mPhone.getServiceStateTracker().getPhysicalChannelConfigList();
        return (physicalChannelConfigList == null || physicalChannelConfigList.isEmpty())
                ? DcController.PHYSICAL_LINK_NOT_ACTIVE : DcController.PHYSICAL_LINK_ACTIVE;
                ? DataCallResponse.LINK_STATUS_DORMANT : DataCallResponse.LINK_STATUS_ACTIVE;
    }

    private int getDataNetworkType() {
@@ -1283,7 +1282,7 @@ public class NetworkTypeController extends StateMachine {
        pw.println("mPrimaryTimerState=" + mPrimaryTimerState);
        pw.println("mSecondaryTimerState=" + mSecondaryTimerState);
        pw.println("mPreviousState=" + mPreviousState);
        pw.println("mPhysicalLinkState=" + mPhysicalLinkState);
        pw.println("mPhysicalLinkStatus=" + mPhysicalLinkStatus);
        pw.println("mAdditionalNrAdvancedBandsList="
                + Arrays.toString(mAdditionalNrAdvancedBandsList));
        pw.println("mNrAdvancedCapablePcoId=" + mNrAdvancedCapablePcoId);
+23 −41
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.internal.telephony.dataconnection;

import android.annotation.IntDef;
import android.hardware.radio.V1_4.DataConnActiveStatus;
import android.net.LinkAddress;
import android.os.AsyncResult;
@@ -25,6 +24,7 @@ import android.os.Looper;
import android.os.Message;
import android.os.RegistrantList;
import android.telephony.AccessNetworkConstants;
import android.telephony.CarrierConfigManager;
import android.telephony.DataFailCause;
import android.telephony.data.ApnSetting;
import android.telephony.data.DataCallResponse;
@@ -41,8 +41,6 @@ import com.android.telephony.Rlog;

import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -57,24 +55,6 @@ public class DcController extends Handler {
    private static final boolean DBG = true;
    private static final boolean VDBG = false;

    /** Physical link state unknown */
    public static final int PHYSICAL_LINK_UNKNOWN = 0;

    /** Physical link state inactive (i.e. RRC idle) */
    public static final int PHYSICAL_LINK_NOT_ACTIVE = 1;

    /** Physical link state active (i.e. RRC connected) */
    public static final int PHYSICAL_LINK_ACTIVE = 2;

    /** @hide */
    @IntDef(prefix = { "PHYSICAL_LINK_" }, value = {
            PHYSICAL_LINK_UNKNOWN,
            PHYSICAL_LINK_NOT_ACTIVE,
            PHYSICAL_LINK_ACTIVE
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface PhysicalLinkState{}

    private final Phone mPhone;
    private final DcTracker mDct;
    private final String mTag;
@@ -88,14 +68,15 @@ public class DcController extends Handler {
    private final HashMap<Integer, DataConnection> mDcListActiveByCid = new HashMap<>();

    /**
     * Aggregated physical link state from all data connections. This reflects the device's RRC
     * Aggregated physical link status from all data connections. This reflects the device's RRC
     * connection state.
     * If {@link CarrierConfigManager.KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL} is true,
     * If {@link CarrierConfigManager#KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL} is true,
     * then This reflects "internet data connection" instead of RRC state.
     */
    private @PhysicalLinkState int mPhysicalLinkState = PHYSICAL_LINK_UNKNOWN;
    private @DataCallResponse.LinkStatus int mPhysicalLinkStatus =
            DataCallResponse.LINK_STATUS_UNKNOWN;

    private RegistrantList mPhysicalLinkStateChangedRegistrants = new RegistrantList();
    private RegistrantList mPhysicalLinkStatusChangedRegistrants = new RegistrantList();

    /**
     * Constructor.
@@ -368,22 +349,23 @@ public class DcController extends Handler {

        if (mDataServiceManager.getTransportType()
                == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
            boolean isPhysicalLinkStateFocusingOnInternetData =
            boolean isPhysicalLinkStatusFocusingOnInternetData =
                    mDct.getLteEndcUsingUserDataForIdleDetection();
            int physicalLinkState =
                    (isPhysicalLinkStateFocusingOnInternetData
            int physicalLinkStatus =
                    (isPhysicalLinkStatusFocusingOnInternetData
                            ? isInternetDataCallActive : isAnyDataCallActive)
                            ? PHYSICAL_LINK_ACTIVE : PHYSICAL_LINK_NOT_ACTIVE;
            if (mPhysicalLinkState != physicalLinkState) {
                mPhysicalLinkState = physicalLinkState;
                mPhysicalLinkStateChangedRegistrants.notifyResult(mPhysicalLinkState);
                            ? DataCallResponse.LINK_STATUS_ACTIVE
                            : DataCallResponse.LINK_STATUS_DORMANT;
            if (mPhysicalLinkStatus != physicalLinkStatus) {
                mPhysicalLinkStatus = physicalLinkStatus;
                mPhysicalLinkStatusChangedRegistrants.notifyResult(mPhysicalLinkStatus);
            }
            if (isAnyDataCallDormant && !isAnyDataCallActive) {
                // There is no way to indicate link activity per APN right now. So
                // Link Activity will be considered dormant only when all data calls
                // are dormant.
                // If a single data call is in dormant state and none of the data
                // calls are active broadcast overall link state as dormant.
                // calls are active broadcast overall link status as dormant.
                if (DBG) {
                    log("onDataStateChanged: Data activity DORMANT. stopNetStatePoll");
                }
@@ -420,24 +402,24 @@ public class DcController extends Handler {
    }

    /**
     * Register for physical link state (i.e. RRC state) changed event.
     * if {@link CarrierConfigManager.KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL} is true,
     * then physical link state is focusing on "internet data connection" instead of RRC state.
     * Register for physical link status (i.e. RRC state) changed event.
     * if {@link CarrierConfigManager#KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL} is true,
     * then physical link status is focusing on "internet data connection" instead of RRC state.
     * @param h The handler
     * @param what The event
     */
    @VisibleForTesting
    public void registerForPhysicalLinkStateChanged(Handler h, int what) {
        mPhysicalLinkStateChangedRegistrants.addUnique(h, what, null);
    public void registerForPhysicalLinkStatusChanged(Handler h, int what) {
        mPhysicalLinkStatusChangedRegistrants.addUnique(h, what, null);
    }

    /**
     * Unregister from physical link state (i.e. RRC state) changed event.
     * Unregister from physical link status (i.e. RRC state) changed event.
     *
     * @param h The previously registered handler
     */
    void unregisterForPhysicalLinkStateChanged(Handler h) {
        mPhysicalLinkStateChangedRegistrants.remove(h);
    void unregisterForPhysicalLinkStatusChanged(Handler h) {
        mPhysicalLinkStatusChangedRegistrants.remove(h);
    }

    private void log(String s) {
+7 −7
Original line number Diff line number Diff line
@@ -354,7 +354,7 @@ public class DcTracker extends Handler {
    private boolean mNrSaSub6Unmetered = false;
    private boolean mNrNsaRoamingUnmetered = false;

    // it effect the PhysicalLinkStateChanged
    // it effect the PhysicalLinkStatusChanged
    private boolean mLteEndcUsingUserDataForRrcDetection = false;

    // stats per data call recovery event
@@ -5620,24 +5620,24 @@ public class DcTracker extends Handler {
    }

    /**
     * Register for physical link state (i.e. RRC state) changed event.
     * Register for physical link status (i.e. RRC state) changed event.
     * if {@link CarrierConfigManager.KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL} is true,
     * then physical link state is focusing on "internet data connection" instead of RRC state.
     *
     * @param h The handler
     * @param what The event
     */
    public void registerForPhysicalLinkStateChanged(Handler h, int what) {
        mDcc.registerForPhysicalLinkStateChanged(h, what);
    public void registerForPhysicalLinkStatusChanged(Handler h, int what) {
        mDcc.registerForPhysicalLinkStatusChanged(h, what);
    }

    /**
     * Unregister from physical link state (i.e. RRC state) changed event.
     * Unregister from physical link status (i.e. RRC state) changed event.
     *
     * @param h The previously registered handler
     */
    public void unregisterForPhysicalLinkStateChanged(Handler h) {
        mDcc.unregisterForPhysicalLinkStateChanged(h);
    public void unregisterForPhysicalLinkStatusChanged(Handler h) {
        mDcc.unregisterForPhysicalLinkStatusChanged(h);
    }

    // We use a specialized equals function in Apn setting when checking if an active
+32 −32

File changed.

Preview size limit exceeded, changes collapsed.

+11 −11
Original line number Diff line number Diff line
@@ -71,7 +71,7 @@ public class DcControllerTest extends TelephonyTest {
    private static final int DATA_CONNECTION_ACTIVE_PH_LINK_ACTIVE = 2;

    private static final int EVENT_DATA_STATE_CHANGED = 0x00040007;
    private static final int EVENT_PHYSICAL_LINK_STATE_CHANGED = 1;
    private static final int EVENT_PHYSICAL_LINK_STATUS_CHANGED = 1;

    @Mock
    private DataConnection mDc;
@@ -155,7 +155,7 @@ public class DcControllerTest extends TelephonyTest {

    @Test
    @SmallTest
    public void testPhysicalLinkStateChanged_defaultApnTypeAndDormant_registrantNotifyResult()
    public void testPhysicalLinkStatusChanged_defaultApnTypeAndDormant_registrantNotifyResult()
            throws Exception {
        ArrayList<DataCallResponse> l = new ArrayList<>();
        DataCallResponse dcResponse = new DataCallResponse.Builder()
@@ -182,7 +182,7 @@ public class DcControllerTest extends TelephonyTest {
        apnContextList.add(apnContext);
        doReturn(apnContextList).when(mDc).getApnContexts();
        doReturn(true).when(mDcTracker).getLteEndcUsingUserDataForIdleDetection();
        mDcc.registerForPhysicalLinkStateChanged(mTestHandler, EVENT_PHYSICAL_LINK_STATE_CHANGED);
        mDcc.registerForPhysicalLinkStatusChanged(mTestHandler, EVENT_PHYSICAL_LINK_STATUS_CHANGED);

        mDcc.sendMessage(mDcc.obtainMessage(EVENT_DATA_STATE_CHANGED,
                new AsyncResult(null, l, null)));
@@ -191,16 +191,16 @@ public class DcControllerTest extends TelephonyTest {
        ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
        verify(mTestHandler, times(1)).sendMessageDelayed(messageCaptor.capture(), anyLong());
        Message message = messageCaptor.getValue();
        assertEquals(EVENT_PHYSICAL_LINK_STATE_CHANGED, message.what);
        assertEquals(EVENT_PHYSICAL_LINK_STATUS_CHANGED, message.what);
        AsyncResult ar = (AsyncResult) message.obj;
        assertEquals(DcController.PHYSICAL_LINK_NOT_ACTIVE, (int) ar.result);
        assertEquals(DataCallResponse.LINK_STATUS_DORMANT, (int) ar.result);
    }

    @Test
    @SmallTest
    public void testPhysicalLinkStateChanged_imsApnTypeAndDormant_NoNotifyResult()
    public void testPhysicalLinkStatusChanged_imsApnTypeAndDormant_NoNotifyResult()
            throws Exception {
        testPhysicalLinkStateChanged_defaultApnTypeAndDormant_registrantNotifyResult();
        testPhysicalLinkStatusChanged_defaultApnTypeAndDormant_registrantNotifyResult();

        ArrayList<DataCallResponse> l = new ArrayList<>();
        DataCallResponse dcResponse = new DataCallResponse.Builder()
@@ -238,9 +238,9 @@ public class DcControllerTest extends TelephonyTest {

    @Test
    @SmallTest
    public void testPhysicalLinkStateChanged_defaultApnTypeAndStateChanged_registrantNotifyResult()
    public void testPhysicalLinkStatusChanged_defaultApnTypeAndStateChanged_registrantNotifyResult()
            throws Exception {
        testPhysicalLinkStateChanged_imsApnTypeAndDormant_NoNotifyResult();
        testPhysicalLinkStatusChanged_imsApnTypeAndDormant_NoNotifyResult();

        ArrayList<DataCallResponse> l = new ArrayList<>();
        DataCallResponse dcResponse = new DataCallResponse.Builder()
@@ -275,8 +275,8 @@ public class DcControllerTest extends TelephonyTest {
        ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
        verify(mTestHandler, times(2)).sendMessageDelayed(messageCaptor.capture(), anyLong());
        Message message = messageCaptor.getValue();
        assertEquals(EVENT_PHYSICAL_LINK_STATE_CHANGED, message.what);
        assertEquals(EVENT_PHYSICAL_LINK_STATUS_CHANGED, message.what);
        AsyncResult ar = (AsyncResult) message.obj;
        assertEquals(DcController.PHYSICAL_LINK_ACTIVE, (int) ar.result);
        assertEquals(DataCallResponse.LINK_STATUS_ACTIVE, (int) ar.result);
    }
}
 No newline at end of file