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

Commit 6f7612e0 authored by android-build-team Robot's avatar android-build-team Robot
Browse files

Snap for 6626121 from 6b3d35d4 to rvc-release

Change-Id: I5ecb9efad6b3fe31943d3d9c9ff31674990a3f3c
parents 18e40d07 6b3d35d4
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -888,6 +888,8 @@ public class GsmCdmaCallTracker extends CallTracker {
                                hoConnection.mPreHandoverState != GsmCdmaCall.State.HOLDING &&
                                dc.state == DriverCall.State.ACTIVE) {
                            mConnections[i].onConnectedInOrOut();
                        } else {
                            mConnections[i].onConnectedConnectionMigrated();
                        }

                        mHandoverConnections.remove(hoConnection);
+52 −61
Original line number Diff line number Diff line
@@ -23,12 +23,10 @@ import android.content.IntentFilter;
import android.os.AsyncResult;
import android.os.Message;
import android.os.PersistableBundle;
import android.provider.Settings;
import android.telephony.AccessNetworkConstants;
import android.telephony.Annotation;
import android.telephony.CarrierConfigManager;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.PhoneStateListener;
import android.telephony.RadioAccessFamily;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
@@ -36,6 +34,8 @@ import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyManager;
import android.text.TextUtils;

import com.android.internal.telephony.dataconnection.DcController;
import com.android.internal.telephony.dataconnection.DcController.PhysicalLinkState;
import com.android.internal.util.IState;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.State;
@@ -81,42 +81,40 @@ 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_DATA_ACTIVITY_CHANGED = 5;
    private static final int EVENT_PHYSICAL_LINK_STATE_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;
    private static final int EVENT_SECONDARY_TIMER_EXPIRED = 9;
    private static final int EVENT_RADIO_OFF_OR_UNAVAILABLE = 10;
    private static final int EVENT_DATA_CONNECTION_STATE_CHANGED = 11;
    private static final int EVENT_PREFERRED_NETWORK_MODE_CHANGED = 12;
    private static final int EVENT_PREFERRED_NETWORK_MODE_CHANGED = 11;
    private static final int EVENT_INITIALIZE = 12;
    // events that don't reset the timer
    private static final int[] ALL_EVENTS = { EVENT_DATA_RAT_CHANGED, EVENT_NR_STATE_CHANGED,
            EVENT_NR_FREQUENCY_CHANGED, EVENT_DATA_ACTIVITY_CHANGED,
            EVENT_NR_FREQUENCY_CHANGED, EVENT_PHYSICAL_LINK_STATE_CHANGED,
            EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED, EVENT_PRIMARY_TIMER_EXPIRED,
            EVENT_SECONDARY_TIMER_EXPIRED, EVENT_DATA_CONNECTION_STATE_CHANGED };
            EVENT_SECONDARY_TIMER_EXPIRED};

    private static final String[] sEvents = new String[EVENT_PREFERRED_NETWORK_MODE_CHANGED + 1];
    private static final String[] sEvents = new String[EVENT_INITIALIZE + 1];
    static {
        sEvents[EVENT_UPDATE] = "EVENT_UPDATE";
        sEvents[EVENT_QUIT] = "EVENT_QUIT";
        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_DATA_ACTIVITY_CHANGED] = "EVENT_DATA_ACTIVITY_CHANGED";
        sEvents[EVENT_PHYSICAL_LINK_STATE_CHANGED] = "EVENT_PHYSICAL_LINK_STATE_CHANGED";
        sEvents[EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED] =
                "EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED";
        sEvents[EVENT_CARRIER_CONFIG_CHANGED] = "EVENT_CARRIER_CONFIG_CHANGED";
        sEvents[EVENT_PRIMARY_TIMER_EXPIRED] = "EVENT_PRIMARY_TIMER_EXPIRED";
        sEvents[EVENT_SECONDARY_TIMER_EXPIRED] = "EVENT_SECONDARY_TIMER_EXPIRED";
        sEvents[EVENT_RADIO_OFF_OR_UNAVAILABLE] = "EVENT_RADIO_OFF_OR_UNAVAILABLE";
        sEvents[EVENT_DATA_CONNECTION_STATE_CHANGED] = "EVENT_DATA_CONNECTION_STATE_CHANGED";
        sEvents[EVENT_PREFERRED_NETWORK_MODE_CHANGED] = "EVENT_PREFERRED_NETWORK_MODE_CHANGED";
        sEvents[EVENT_INITIALIZE] = "EVENT_INITIALIZE";
    }

    private final Phone mPhone;
    private final DisplayInfoController mDisplayInfoController;
    private final TelephonyManager mTelephonyManager;
    private final SettingsObserver mSettingsObserver;
    private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
@@ -129,16 +127,6 @@ public class NetworkTypeController extends StateMachine {
            }
        }
    };
    private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
        @Override
        public void onDataActivity(int direction) {
            sendMessage(EVENT_DATA_ACTIVITY_CHANGED);
        }
        @Override
        public void onDataConnectionStateChanged(int state, int networkType) {
            sendMessage(EVENT_DATA_CONNECTION_STATE_CHANGED);
        }
    };

    private Map<String, OverrideTimerRule> mOverrideTimerRules = new HashMap<>();
    private String mLteEnhancedPattern = "";
@@ -149,6 +137,7 @@ public class NetworkTypeController extends StateMachine {
    private String mPrimaryTimerState;
    private String mSecondaryTimerState;
    private String mPreviousState;
    private @PhysicalLinkState int mPhysicalLinkState;

    /**
     * NetworkTypeController constructor.
@@ -160,9 +149,6 @@ public class NetworkTypeController extends StateMachine {
        super(TAG, displayInfoController);
        mPhone = phone;
        mDisplayInfoController = displayInfoController;
        mTelephonyManager = TelephonyManager.from(phone.getContext())
                .createForSubscriptionId(phone.getSubId());
        mSettingsObserver = new SettingsObserver(mPhone.getContext(), getHandler());
        mOverrideNetworkType = TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE;
        mIsPhysicalChannelConfigOn = true;
        addState(mDefaultState);
@@ -171,9 +157,8 @@ public class NetworkTypeController extends StateMachine {
        addState(mLteConnectedState, mDefaultState);
        addState(mNrConnectedState, mDefaultState);
        setInitialState(mDefaultState);
        registerForAllEvents();
        parseCarrierConfigs();
        start();
        sendMessage(EVENT_INITIALIZE);
    }

    /**
@@ -187,9 +172,14 @@ public class NetworkTypeController extends StateMachine {
    private void registerForAllEvents() {
        mPhone.registerForRadioOffOrNotAvailable(getHandler(),
                EVENT_RADIO_OFF_OR_UNAVAILABLE, null);
        mPhone.registerForPreferredNetworkTypeChanged(getHandler(),
                EVENT_PREFERRED_NETWORK_MODE_CHANGED, null);
        mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN, getHandler(),
                EVENT_DATA_RAT_CHANGED, null);
        mPhone.getDcTracker(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                .registerForPhysicalLinkStateChanged(getHandler(),
                        EVENT_PHYSICAL_LINK_STATE_CHANGED);
        mPhone.getServiceStateTracker().registerForNrStateChanged(getHandler(),
                EVENT_NR_STATE_CHANGED, null);
        mPhone.getServiceStateTracker().registerForNrFrequencyChanged(getHandler(),
@@ -199,26 +189,17 @@ public class NetworkTypeController extends StateMachine {
        IntentFilter filter = new IntentFilter();
        filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
        mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone);
        if (mTelephonyManager != null) {
            mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_DATA_ACTIVITY
                    | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
        }
        mSettingsObserver.observe(Settings.Global.getUriFor(Settings.Global.PREFERRED_NETWORK_MODE),
                EVENT_PREFERRED_NETWORK_MODE_CHANGED);
    }

    private void unRegisterForAllEvents() {
        mPhone.unregisterForRadioOffOrNotAvailable(getHandler());
        mPhone.unregisterForPreferredNetworkTypeChanged(getHandler());
        mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged(
                AccessNetworkConstants.TRANSPORT_TYPE_WWAN, getHandler());
        mPhone.getServiceStateTracker().unregisterForNrStateChanged(getHandler());
        mPhone.getServiceStateTracker().unregisterForNrFrequencyChanged(getHandler());
        mPhone.getDeviceStateMonitor().unregisterForPhysicalChannelConfigNotifChanged(getHandler());
        mPhone.getContext().unregisterReceiver(mIntentReceiver);
        if (mTelephonyManager != null) {
            mTelephonyManager.listen(mPhoneStateListener, 0);
        }
        mSettingsObserver.unobserve();
    }

    private void parseCarrierConfigs() {
@@ -393,7 +374,7 @@ public class NetworkTypeController extends StateMachine {
                keys.add(STATE_CONNECTED);
                break;
            case NetworkRegistrationInfo.NR_STATE_NOT_RESTRICTED:
                keys.add(isDataActive() ? STATE_NOT_RESTRICTED_RRC_CON
                keys.add(isPhysicalLinkActive() ? STATE_NOT_RESTRICTED_RRC_CON
                        : STATE_NOT_RESTRICTED_RRC_IDLE);
                break;
            case NetworkRegistrationInfo.NR_STATE_RESTRICTED:
@@ -457,12 +438,22 @@ public class NetworkTypeController extends StateMachine {
                    unRegisterForAllEvents();
                    quit();
                    break;
                case EVENT_INITIALIZE:
                    // The reason that we do it here is because some of the works below requires
                    // other modules (e.g. DcTracker, ServiceStateTracker), which is not created
                    // yet when NetworkTypeController is created.
                    registerForAllEvents();
                    parseCarrierConfigs();
                    break;
                case EVENT_DATA_RAT_CHANGED:
                case EVENT_NR_STATE_CHANGED:
                case EVENT_NR_FREQUENCY_CHANGED:
                case EVENT_DATA_ACTIVITY_CHANGED:
                    // ignored
                    break;
                case EVENT_PHYSICAL_LINK_STATE_CHANGED:
                    AsyncResult ar = (AsyncResult) msg.obj;
                    mPhysicalLinkState = (int) ar.result;
                    break;
                case EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED:
                    AsyncResult result = (AsyncResult) msg.obj;
                    mIsPhysicalChannelConfigOn = (boolean) result.result;
@@ -498,13 +489,6 @@ public class NetworkTypeController extends StateMachine {
                    resetAllTimers();
                    transitionTo(mLegacyState);
                    break;
                case EVENT_DATA_CONNECTION_STATE_CHANGED:
                    if (mPhone.getServiceState().getDataNetworkType()
                            != mDisplayInfoController.getTelephonyDisplayInfo().getNetworkType()) {
                        resetAllTimers();
                        transitionToCurrentState();
                    }
                    break;
                case EVENT_PREFERRED_NETWORK_MODE_CHANGED:
                    resetAllTimers();
                    transitionToCurrentState();
@@ -551,7 +535,8 @@ public class NetworkTypeController extends StateMachine {
                    if (rat == TelephonyManager.NETWORK_TYPE_NR || isLte(rat) && isNrConnected()) {
                        transitionTo(mNrConnectedState);
                    } else if (isLte(rat) && isNrNotRestricted()) {
                        transitionWithTimerTo(isDataActive() ? mLteConnectedState : mIdleState);
                        transitionWithTimerTo(isPhysicalLinkActive()
                                ? mLteConnectedState : mIdleState);
                    } else {
                        updateOverrideNetworkType();
                    }
@@ -561,14 +546,14 @@ public class NetworkTypeController extends StateMachine {
                    if (isNrConnected()) {
                        transitionTo(mNrConnectedState);
                    } else if (isLte(rat) && isNrNotRestricted()) {
                        transitionWithTimerTo(isDataActive() ? mLteConnectedState : mIdleState);
                        transitionWithTimerTo(isPhysicalLinkActive()
                                ? mLteConnectedState : mIdleState);
                    } else if (isLte(rat) && isNrRestricted()) {
                        updateOverrideNetworkType();
                    }
                    mIsNrRestricted = isNrRestricted();
                    break;
                case EVENT_NR_FREQUENCY_CHANGED:
                case EVENT_DATA_ACTIVITY_CHANGED:
                    // ignored
                    break;
                default:
@@ -625,10 +610,12 @@ public class NetworkTypeController extends StateMachine {
                case EVENT_NR_FREQUENCY_CHANGED:
                    // ignore
                    break;
                case EVENT_DATA_ACTIVITY_CHANGED:
                case EVENT_PHYSICAL_LINK_STATE_CHANGED:
                    AsyncResult ar = (AsyncResult) msg.obj;
                    mPhysicalLinkState = (int) ar.result;
                    if (isNrNotRestricted()) {
                        // NOT_RESTRICTED_RRC_IDLE -> NOT_RESTRICTED_RRC_CON
                        if (isDataActive()) {
                        if (isPhysicalLinkActive()) {
                            transitionWithTimerTo(mLteConnectedState);
                        }
                    } else {
@@ -690,10 +677,12 @@ public class NetworkTypeController extends StateMachine {
                case EVENT_NR_FREQUENCY_CHANGED:
                    // ignore
                    break;
                case EVENT_DATA_ACTIVITY_CHANGED:
                case EVENT_PHYSICAL_LINK_STATE_CHANGED:
                    AsyncResult ar = (AsyncResult) msg.obj;
                    mPhysicalLinkState = (int) ar.result;
                    if (isNrNotRestricted()) {
                        // NOT_RESTRICTED_RRC_CON -> NOT_RESTRICTED_RRC_IDLE
                        if (!isDataActive()) {
                        if (!isPhysicalLinkActive()) {
                            transitionWithTimerTo(mIdleState);
                        }
                    } else {
@@ -745,14 +734,16 @@ public class NetworkTypeController extends StateMachine {
                    if (rat == TelephonyManager.NETWORK_TYPE_NR || isLte(rat) && isNrConnected()) {
                        updateOverrideNetworkType();
                    } else if (isLte(rat) && isNrNotRestricted()) {
                        transitionWithTimerTo(isDataActive() ? mLteConnectedState : mIdleState);
                        transitionWithTimerTo(isPhysicalLinkActive()
                                ? mLteConnectedState : mIdleState);
                    } else {
                        transitionWithTimerTo(mLegacyState);
                    }
                    break;
                case EVENT_NR_STATE_CHANGED:
                    if (isLte(rat) && isNrNotRestricted()) {
                        transitionWithTimerTo(isDataActive() ? mLteConnectedState : mIdleState);
                        transitionWithTimerTo(isPhysicalLinkActive()
                                ? mLteConnectedState : mIdleState);
                    } else if (rat != TelephonyManager.NETWORK_TYPE_NR && !isNrConnected()) {
                        transitionWithTimerTo(mLegacyState);
                    }
@@ -772,7 +763,9 @@ public class NetworkTypeController extends StateMachine {
                    }
                    mIsNrMmwave = isNrMmwave();
                    break;
                case EVENT_DATA_ACTIVITY_CHANGED:
                case EVENT_PHYSICAL_LINK_STATE_CHANGED:
                    AsyncResult ar = (AsyncResult) msg.obj;
                    mPhysicalLinkState = (int) ar.result;
                    if (!isNrConnected()) {
                        log("NR state changed. Sending EVENT_NR_STATE_CHANGED");
                        sendMessage(EVENT_NR_STATE_CHANGED);
@@ -831,7 +824,7 @@ public class NetworkTypeController extends StateMachine {
            transitionState = mNrConnectedState;
            mPreviousState = isNrMmwave() ? STATE_CONNECTED_MMWAVE : STATE_CONNECTED;
        } else if (isLte(dataRat) && isNrNotRestricted()) {
            if (isDataActive()) {
            if (isPhysicalLinkActive()) {
                transitionState = mLteConnectedState;
                mPreviousState = STATE_NOT_RESTRICTED_RRC_CON;
            } else {
@@ -994,10 +987,8 @@ public class NetworkTypeController extends StateMachine {
                || rat == TelephonyManager.NETWORK_TYPE_LTE_CA;
    }

    private boolean isDataActive() {
        PhoneInternalInterface.DataActivityState activity = mPhone.getDataActivityState();
        return activity != PhoneInternalInterface.DataActivityState.DORMANT
                && activity != PhoneInternalInterface.DataActivityState.NONE;
    private boolean isPhysicalLinkActive() {
        return mPhysicalLinkState == DcController.PHYSICAL_LINK_ACTIVE;
    }

    private String getEventName(int event) {
+24 −0
Original line number Diff line number Diff line
@@ -401,6 +401,8 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {

    private final RegistrantList mOtaspRegistrants = new RegistrantList();

    private final RegistrantList mPreferredNetworkTypeRegistrants = new RegistrantList();

    protected Registrant mPostDialHandler;

    protected final LocalLog mLocalLog;
@@ -2264,6 +2266,7 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
                + " filteredType = " + filteredType);

        mCi.setPreferredNetworkType(filteredType, response);
        mPreferredNetworkTypeRegistrants.notifyRegistrants();
    }

    /**
@@ -2275,6 +2278,27 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
        mCi.getPreferredNetworkType(response);
    }

    /**
     * Register for preferred network type changes
     *
     * @param h Handler that receives the notification message.
     * @param what User-defined message code.
     * @param obj User object.
     */
    public void registerForPreferredNetworkTypeChanged(Handler h, int what, Object obj) {
        checkCorrectThread(h);
        mPreferredNetworkTypeRegistrants.addUnique(h, what, obj);
    }

    /**
     * Unregister for preferred network type changes.
     *
     * @param h Handler that should be unregistered.
     */
    public void unregisterForPreferredNetworkTypeChanged(Handler h) {
        mPreferredNetworkTypeRegistrants.remove(h);
    }

    /**
     * Get the cached value of the preferred network type setting
     */
+57 −0
Original line number Diff line number Diff line
@@ -16,12 +16,14 @@

package com.android.internal.telephony.dataconnection;

import android.annotation.IntDef;
import android.content.Context;
import android.hardware.radio.V1_4.DataConnActiveStatus;
import android.net.LinkAddress;
import android.os.AsyncResult;
import android.os.Handler;
import android.os.Message;
import android.os.RegistrantList;
import android.telephony.AccessNetworkConstants;
import android.telephony.DataFailCause;
import android.telephony.PhoneStateListener;
@@ -42,6 +44,8 @@ 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;
@@ -55,6 +59,24 @@ public class DcController extends StateMachine {
    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 DataServiceManager mDataServiceManager;
@@ -76,6 +98,16 @@ public class DcController extends StateMachine {
    //carrier network change
    private volatile boolean mExecutingCarrierChange;

    /**
     * Aggregated physical link state from all data connections. This reflects the device's RRC
     * connection state.
     * // TODO: Instead of tracking the RRC state here, we should make PhysicalChannelConfig work in
     *          S.
     */
    private @PhysicalLinkState int mPhysicalLinkState = PHYSICAL_LINK_UNKNOWN;

    private RegistrantList mPhysicalLinkStateChangedRegistrants = new RegistrantList();

    /**
     * Constructor.
     *
@@ -394,6 +426,12 @@ public class DcController extends StateMachine {

            if (mDataServiceManager.getTransportType()
                    == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
                int physicalLinkState = isAnyDataCallActive
                        ? PHYSICAL_LINK_ACTIVE : PHYSICAL_LINK_NOT_ACTIVE;
                if (mPhysicalLinkState != physicalLinkState) {
                    mPhysicalLinkState = physicalLinkState;
                    mPhysicalLinkStateChangedRegistrants.notifyResult(mPhysicalLinkState);
                }
                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
@@ -436,6 +474,25 @@ public class DcController extends StateMachine {
        }
    }

    /**
     * Register for physical link state (i.e. RRC state) changed event.
     *
     * @param h The handler
     * @param what The event
     */
    public void registerForPhysicalLinkStateChanged(Handler h, int what) {
        mPhysicalLinkStateChangedRegistrants.addUnique(h, what, null);
    }

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

    /**
     * lr is short name for logAndAddLogRec
     * @param s
+19 −0
Original line number Diff line number Diff line
@@ -5142,4 +5142,23 @@ public class DcTracker extends Handler {
        }
        updateLinkBandwidths(bandwidths, useLte);
    }

    /**
     * Register for physical link state (i.e. RRC state) changed event.
     *
     * @param h The handler
     * @param what The event
     */
    public void registerForPhysicalLinkStateChanged(Handler h, int what) {
        mDcc.registerForPhysicalLinkStateChanged(h, what);
    }

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