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

Commit 026490cc authored by Jack Yu's avatar Jack Yu
Browse files

Support multiple DcTracker for IWLAN refactoring

If the device is configured as AP-assited mode, multiple
DcTrackers will be created for each corresponding
data service. For legacy mode, only one DcTracker will
be created.

Test: Unit tests and telephony sanity tests
Bug: 73659459
Merged-In: I320e9b75dbec1725b5d69e482735a01cae5795b6
Change-Id: I320e9b75dbec1725b5d69e482735a01cae5795b6
(cherry picked from commit 79505d27)
parent 9d59bdfd
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.telephony.Rlog;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;

import java.util.List;

@@ -182,7 +183,8 @@ public class DefaultPhoneNotifier implements PhoneNotifier {
            if (mRegistry != null) {
                mRegistry.notifyDataConnectionForSubscriber(subId,
                    PhoneConstantConversions.convertDataState(state),
                        sender.isDataAllowed(), reason,
                        sender.isDataAllowed(ApnSetting.getApnTypesBitmaskFromString(apnType)),
                        reason,
                        sender.getActiveApnHost(apnType),
                        apnType,
                        linkProperties,
+10 −4
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.os.PersistableBundle;
import android.os.Registrant;
import android.os.RegistrantList;
import android.os.SystemProperties;
import android.telephony.AccessNetworkConstants.TransportType;
import android.telephony.CarrierConfigManager;
import android.telephony.CellLocation;
import android.telephony.DisconnectCause;
@@ -172,8 +173,9 @@ public class GsmCdmaCallTracker extends CallTracker {
            mCi.unregisterForCallWaitingInfo(this);
            // Prior to phone switch to GSM, if CDMA has any emergency call
            // data will be in disabled state, after switching to GSM enable data.
            if (mIsInEmergencyCall) {
                mPhone.mDcTracker.setInternalDataEnabled(true);
            if (mIsInEmergencyCall && mPhone.getDcTracker(TransportType.WWAN) != null) {
                mPhone.getDcTracker(TransportType.WWAN).setInternalDataEnabled(true);

            }
        } else {
            mConnections = new GsmCdmaConnection[MAX_CONNECTIONS_CDMA];
@@ -372,7 +374,9 @@ public class GsmCdmaCallTracker extends CallTracker {
    //CDMA
    public void setIsInEmergencyCall() {
        mIsInEmergencyCall = true;
        mPhone.mDcTracker.setInternalDataEnabled(false);
        if (mPhone.getDcTracker(TransportType.WWAN) != null) {
            mPhone.getDcTracker(TransportType.WWAN).setInternalDataEnabled(false);
        }
        mPhone.notifyEmergencyCallRegistrants(true);
        mPhone.sendEmergencyCallStateChange(true);
    }
@@ -1628,7 +1632,9 @@ public class GsmCdmaCallTracker extends CallTracker {
            }
            if (!inEcm) {
                // Re-initiate data connection
                mPhone.mDcTracker.setInternalDataEnabled(true);
                if (mPhone.getDcTracker(TransportType.WWAN) != null) {
                    mPhone.getDcTracker(TransportType.WWAN).setInternalDataEnabled(true);
                }
                mPhone.notifyEmergencyCallRegistrants(false);
            }
            mPhone.sendEmergencyCallStateChange(false);
+50 −24
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ import android.preference.PreferenceManager;
import android.provider.Settings;
import android.provider.Telephony;
import android.telecom.VideoProfile;
import android.telephony.AccessNetworkConstants.TransportType;
import android.telephony.CarrierConfigManager;
import android.telephony.CellLocation;
import android.telephony.ImsiEncryptionInfo;
@@ -66,6 +67,7 @@ import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.UssdResponse;
import android.telephony.data.ApnSetting;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
@@ -227,7 +229,11 @@ public class GsmCdmaPhone extends Phone {
        mTransportManager = mTelephonyComponentFactory.makeTransportManager(this);
        mSST = mTelephonyComponentFactory.makeServiceStateTracker(this, this.mCi);
        // DcTracker uses SST so needs to be created after it is instantiated
        mDcTracker = mTelephonyComponentFactory.makeDcTracker(this);
        for (int transport : mTransportManager.getAvailableTransports()) {
            mDcTrackers.put(transport, mTelephonyComponentFactory.makeDcTracker(this,
                    transport));
        }

        mCarrierResolver = mTelephonyComponentFactory.makeCarrierResolver(this);

        mSST.registerForNetworkAttached(this, EVENT_REGISTERED_TO_NETWORK, null);
@@ -523,7 +529,10 @@ public class GsmCdmaPhone extends Phone {

            ret = PhoneConstants.DataState.DISCONNECTED;
        } else { /* mSST.gprsState == ServiceState.STATE_IN_SERVICE */
            switch (mDcTracker.getState(apnType)) {
            int currentTransport = mTransportManager.getCurrentTransport(
                    ApnSetting.getApnTypesBitmaskFromString(apnType));
            if (getDcTracker(currentTransport) != null) {
                switch (getDcTracker(currentTransport).getState(apnType)) {
                    case CONNECTED:
                    case DISCONNECTING:
                        if (mCT.mState != PhoneConstants.State.IDLE
@@ -540,6 +549,7 @@ public class GsmCdmaPhone extends Phone {
                        ret = PhoneConstants.DataState.DISCONNECTED;
                }
            }
        }

        logd("getDataConnectionState apnType=" + apnType + " ret=" + ret);
        return ret;
@@ -549,8 +559,9 @@ public class GsmCdmaPhone extends Phone {
    public DataActivityState getDataActivityState() {
        DataActivityState ret = DataActivityState.NONE;

        if (mSST.getCurrentDataConnectionState() == ServiceState.STATE_IN_SERVICE) {
            switch (mDcTracker.getActivity()) {
        if (mSST.getCurrentDataConnectionState() == ServiceState.STATE_IN_SERVICE
                && getDcTracker(TransportType.WWAN) != null) {
            switch (getDcTracker(TransportType.WWAN).getActivity()) {
                case DATAIN:
                    ret = DataActivityState.DATAIN;
                break;
@@ -2036,12 +2047,17 @@ public class GsmCdmaPhone extends Phone {

    @Override
    public boolean getDataRoamingEnabled() {
        return mDcTracker.getDataRoamingEnabled();
        if (getDcTracker(TransportType.WWAN) != null) {
            return getDcTracker(TransportType.WWAN).getDataRoamingEnabled();
        }
        return false;
    }

    @Override
    public void setDataRoamingEnabled(boolean enable) {
        mDcTracker.setDataRoamingEnabledByUser(enable);
        if (getDcTracker(TransportType.WWAN) != null) {
            getDcTracker(TransportType.WWAN).setDataRoamingEnabledByUser(enable);
        }
    }

    @Override
@@ -2086,17 +2102,25 @@ public class GsmCdmaPhone extends Phone {

    @Override
    public boolean isUserDataEnabled() {
        return mDcTracker.isUserDataEnabled();
        if (getDcTracker(TransportType.WWAN) != null) {
            return getDcTracker(TransportType.WWAN).isUserDataEnabled();
        }
        return false;
    }

    @Override
    public boolean isDataEnabled() {
        return mDcTracker.isDataEnabled();
        if (getDcTracker(TransportType.WWAN) != null) {
            return getDcTracker(TransportType.WWAN).isDataEnabled();
        }
        return false;
    }

    @Override
    public void setUserDataEnabled(boolean enable) {
        mDcTracker.setUserDataEnabled(enable);
        if (getDcTracker(TransportType.WWAN) != null) {
            getDcTracker(TransportType.WWAN).setUserDataEnabled(enable);
        }
    }

    /**
@@ -3065,7 +3089,9 @@ public class GsmCdmaPhone extends Phone {
            // send an Intent
            sendEmergencyCallbackModeChange();
            // Re-initiate data connection
            mDcTracker.setInternalDataEnabled(true);
            if (getDcTracker(TransportType.WWAN) != null) {
                getDcTracker(TransportType.WWAN).setInternalDataEnabled(true);
            }
            notifyEmergencyCallRegistrants(false);
        }
    }
+6 −5
Original line number Diff line number Diff line
@@ -127,7 +127,8 @@ public class NetworkRegistrationManager {
    private class NetworkServiceConnection implements ServiceConnection {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            logd("service connected.");
            logd("service " + name + " for transport "
                    + TransportType.toString(mTransportType) + " is now connected.");
            mServiceBinder = (INetworkService.Stub) service;
            mDeathRecipient = new RegManagerDeathRecipient(name);
            try {
@@ -144,7 +145,8 @@ public class NetworkRegistrationManager {

        @Override
        public void onServiceDisconnected(ComponentName name) {
            logd("onServiceDisconnected " + name);
            logd("service " + name + " for transport "
                    + TransportType.toString(mTransportType) + " is now disconnected.");
            if (mServiceBinder != null) {
                mServiceBinder.unlinkToDeath(mDeathRecipient, 0);
            }
@@ -180,6 +182,8 @@ public class NetworkRegistrationManager {
        try {
            // We bind this as a foreground service because it is operating directly on the SIM,
            // and we do not want it subjected to power-savings restrictions while doing so.
            logd("Trying to bind " + getPackageName() + " for transport "
                    + TransportType.toString(mTransportType));
            return mPhone.getContext().bindService(intent, new NetworkServiceConnection(),
                    Context.BIND_AUTO_CREATE);
        } catch (SecurityException e) {
@@ -219,9 +223,6 @@ public class NetworkRegistrationManager {
            packageName = b.getString(carrierConfig, packageName);
        }

        logd("Binding to packageName " + packageName + " for transport type"
                + mTransportType);

        return packageName;
    }

+167 −66
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.internal.telephony;

import android.annotation.Nullable;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -40,6 +41,7 @@ import android.preference.PreferenceManager;
import android.provider.Settings;
import android.service.carrier.CarrierIdentifier;
import android.telecom.VideoProfile;
import android.telephony.AccessNetworkConstants.TransportType;
import android.telephony.CarrierConfigManager;
import android.telephony.CellInfo;
import android.telephony.CellLocation;
@@ -53,8 +55,11 @@ import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.telephony.data.ApnSetting.ApnType;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.text.TextUtils;
import android.util.SparseArray;

import com.android.ims.ImsCall;
import com.android.ims.ImsConfig;
@@ -77,6 +82,7 @@ import com.android.internal.telephony.uicc.UsimServiceTable;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
@@ -160,6 +166,7 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
    protected static final int EVENT_GET_CALL_FORWARD_DONE       = 13;
    protected static final int EVENT_CALL_RING                   = 14;
    private static final int EVENT_CALL_RING_CONTINUE            = 15;
    private static final int EVENT_ALL_DATA_DISCONNECTED         = 16;

    // Used to intercept the carrier selection calls so that
    // we can save the values.
@@ -251,7 +258,11 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
    public CommandsInterface mCi;
    protected int mVmCount = 0;
    private boolean mDnsCheckDisabled;
    public DcTracker mDcTracker;
    // Data connection trackers. For each transport type (e.g. WWAN, WLAN), there will be a
    // corresponding DcTracker. The WWAN DcTracker is for cellular data connections while
    // WLAN DcTracker is for IWLAN data connection. For IWLAN legacy mode, only one (WWAN) DcTracker
    // will be created.
    protected final SparseArray<DcTracker> mDcTrackers = new SparseArray<>();
    /* Used for dispatching signals to configured carrier apps */
    protected CarrierSignalAgent mCarrierSignalAgent;
    /* Used for dispatching carrier action from carrier apps */
@@ -307,47 +318,35 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
    public static final String EXTRA_KEY_ALERT_SHOW = "alertShow";
    public static final String EXTRA_KEY_NOTIFICATION_MESSAGE = "notificationMessage";

    private final RegistrantList mPreciseCallStateRegistrants
            = new RegistrantList();
    private final RegistrantList mPreciseCallStateRegistrants = new RegistrantList();

    private final RegistrantList mHandoverRegistrants
            = new RegistrantList();
    private final RegistrantList mHandoverRegistrants = new RegistrantList();

    private final RegistrantList mNewRingingConnectionRegistrants
            = new RegistrantList();
    private final RegistrantList mNewRingingConnectionRegistrants = new RegistrantList();

    private final RegistrantList mIncomingRingRegistrants
            = new RegistrantList();
    private final RegistrantList mIncomingRingRegistrants = new RegistrantList();

    protected final RegistrantList mDisconnectRegistrants
            = new RegistrantList();
    protected final RegistrantList mDisconnectRegistrants = new RegistrantList();

    private final RegistrantList mServiceStateRegistrants
            = new RegistrantList();
    private final RegistrantList mServiceStateRegistrants = new RegistrantList();

    protected final RegistrantList mMmiCompleteRegistrants
            = new RegistrantList();
    protected final RegistrantList mMmiCompleteRegistrants = new RegistrantList();

    protected final RegistrantList mMmiRegistrants
            = new RegistrantList();
    protected final RegistrantList mMmiRegistrants = new RegistrantList();

    protected final RegistrantList mUnknownConnectionRegistrants
            = new RegistrantList();
    protected final RegistrantList mUnknownConnectionRegistrants = new RegistrantList();

    protected final RegistrantList mSuppServiceFailedRegistrants
            = new RegistrantList();
    protected final RegistrantList mSuppServiceFailedRegistrants = new RegistrantList();

    protected final RegistrantList mRadioOffOrNotAvailableRegistrants
            = new RegistrantList();
    protected final RegistrantList mRadioOffOrNotAvailableRegistrants = new RegistrantList();

    protected final RegistrantList mSimRecordsLoadedRegistrants
            = new RegistrantList();
    protected final RegistrantList mSimRecordsLoadedRegistrants = new RegistrantList();

    private final RegistrantList mVideoCapabilityChangedRegistrants
            = new RegistrantList();
    private final RegistrantList mVideoCapabilityChangedRegistrants = new RegistrantList();

    protected final RegistrantList mEmergencyCallToggledRegistrants
            = new RegistrantList();
    protected final RegistrantList mEmergencyCallToggledRegistrants = new RegistrantList();

    private final RegistrantList mAllDataDisconnectedRegistrants = new RegistrantList();

    private final RegistrantList mCellInfoRegistrants = new RegistrantList();

@@ -713,6 +712,12 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
                onCheckForNetworkSelectionModeAutomatic(msg);
                break;
            }

            case EVENT_ALL_DATA_DISCONNECTED:
                if (areAllDataDisconnected()) {
                    mAllDataDisconnectedRegistrants.notifyRegistrants();
                }
                break;
            default:
                throw new RuntimeException("unexpected event not handled");
        }
@@ -2189,8 +2194,11 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {

    public void notifyDataConnection(String reason) {
        String types[] = getActiveApnTypes();
        if (types != null) {
            for (String apnType : types) {
            mNotifier.notifyDataConnection(this, reason, apnType, getDataConnectionState(apnType));
                mNotifier.notifyDataConnection(this, reason, apnType,
                        getDataConnectionState(apnType));
            }
        }
    }

@@ -2820,15 +2828,24 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
    /**
     * Returns an array of string identifiers for the APN types serviced by the
     * currently active.
     *  @return The string array will always return at least one entry, Phone.APN_TYPE_DEFAULT.
     * TODO: Revisit if we always should return at least one entry.
     *
     * @return The string array of APN types. Return null if no active APN types.
     */
    @Nullable
    public String[] getActiveApnTypes() {
        if (mDcTracker == null) {
            return null;
        if (mTransportManager != null) {
            List<String> typesList = new ArrayList<>();
            for (int transportType : mTransportManager.getAvailableTransports()) {
                if (getDcTracker(transportType) != null) {
                    typesList.addAll(Arrays.asList(
                            getDcTracker(transportType).getActiveApnTypes()));
                }
            }

        return mDcTracker.getActiveApnTypes();
            return typesList.toArray(new String[typesList.size()]);
        }

        return null;
    }

    /**
@@ -2836,7 +2853,10 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
     * @return true if there is a matching DUN APN.
     */
    public boolean hasMatchedTetherApnSetting() {
        return mDcTracker.hasMatchedTetherApnSetting();
        if (getDcTracker(TransportType.WWAN) != null) {
            return getDcTracker(TransportType.WWAN).hasMatchedTetherApnSetting();
        }
        return false;
    }

    /**
@@ -2844,40 +2864,71 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
     *  @return type as a string or null if none.
     */
    public String getActiveApnHost(String apnType) {
        return mDcTracker.getActiveApnString(apnType);
        if (mTransportManager != null) {
            int transportType = mTransportManager.getCurrentTransport(
                    ApnSetting.getApnTypesBitmaskFromString(apnType));
            if (getDcTracker(transportType) != null) {
                return getDcTracker(transportType).getActiveApnString(apnType);
            }
        }

        return null;
    }

    /**
     * Return the LinkProperties for the named apn or null if not available
     */
    public LinkProperties getLinkProperties(String apnType) {
        return mDcTracker.getLinkProperties(apnType);
        if (mTransportManager != null) {
            int transport = mTransportManager.getCurrentTransport(
                    ApnSetting.getApnTypesBitmaskFromString(apnType));
            if (getDcTracker(transport) != null) {
                return getDcTracker(transport).getLinkProperties(apnType);
            }
        }
        return null;
    }

    /**
     * Return the NetworkCapabilities
     */
    public NetworkCapabilities getNetworkCapabilities(String apnType) {
        return mDcTracker.getNetworkCapabilities(apnType);
        if (mTransportManager != null) {
            int transportType = mTransportManager.getCurrentTransport(
                    ApnSetting.getApnTypesBitmaskFromString(apnType));
            if (getDcTracker(transportType) != null) {
                return getDcTracker(transportType).getNetworkCapabilities(apnType);
            }
        }
        return null;
    }

    /**
     * Report on whether data connectivity is allowed.
     * Report on whether data connectivity is allowed for given APN type.
     *
     * @param apnType APN type
     *
     * @return True if data is allowed to be established.
     */
    public boolean isDataAllowed() {
        return ((mDcTracker != null) && (mDcTracker.isDataAllowed(null)));
    public boolean isDataAllowed(@ApnType int apnType) {
        return isDataAllowed(apnType, null);
    }

    /**
     * Report on whether data connectivity is allowed.
     *
     * @param apnType APN type
     * @param reasons The reasons that data can/can't be established. This is an output param.
     * @return True if data is allowed to be established
     */
    public boolean isDataAllowed(DataConnectionReasons reasons) {
        return ((mDcTracker != null) && (mDcTracker.isDataAllowed(reasons)));
    public boolean isDataAllowed(@ApnType int apnType, DataConnectionReasons reasons) {
        if (mTransportManager != null) {
            int transport = mTransportManager.getCurrentTransport(apnType);
            if (getDcTracker(transport) != null) {
                return getDcTracker(transport).isDataAllowed(reasons);
            }
        }
        return false;
    }


@@ -3067,7 +3118,15 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
     * @param apnType the apnType, "ims" for IMS APN, "emergency" for EMERGENCY APN
     */
    public String[] getPcscfAddress(String apnType) {
        return mDcTracker.getPcscfAddress(apnType);
        if (mTransportManager != null) {
            int transportType = mTransportManager.getCurrentTransport(
                    ApnSetting.getApnTypesBitmaskFromString(apnType));
            if (getDcTracker(transportType) != null) {
                return getDcTracker(transportType).getPcscfAddress(apnType);
            }
        }

        return null;
    }

    /**
@@ -3606,31 +3665,59 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
    }

    public void updateDataConnectionTracker() {
        mDcTracker.update();
        if (mTransportManager != null) {
            for (int transport : mTransportManager.getAvailableTransports()) {
                if (getDcTracker(transport) != null) {
                    getDcTracker(transport).update();
                }
            }
        }

    public void setInternalDataEnabled(boolean enable, Message onCompleteMsg) {
        mDcTracker.setInternalDataEnabled(enable, onCompleteMsg);
    }

    public boolean updateCurrentCarrierInProvider() {
        return false;
    }

    public void registerForAllDataDisconnected(Handler h, int what, Object obj) {
        mDcTracker.registerForAllDataDisconnected(h, what, obj);
    /**
     * @return True if all data connections are disconnected.
     */
    public boolean areAllDataDisconnected() {
        if (mTransportManager != null) {
            for (int transport : mTransportManager.getAvailableTransports()) {
                if (getDcTracker(transport) != null && !getDcTracker(transport).isDisconnected()) {
                    return false;
                }
            }
        }
        return true;
    }

    public void registerForAllDataDisconnected(Handler h, int what) {
        mAllDataDisconnectedRegistrants.addUnique(h, what, null);
        if (mTransportManager != null) {
            for (int transport : mTransportManager.getAvailableTransports()) {
                if (getDcTracker(transport) != null && !getDcTracker(transport).isDisconnected()) {
                    getDcTracker(transport).registerForAllDataDisconnected(
                            this, EVENT_ALL_DATA_DISCONNECTED);
                }
            }
        }
    }

    public void unregisterForAllDataDisconnected(Handler h) {
        mDcTracker.unregisterForAllDataDisconnected(h);
        mAllDataDisconnectedRegistrants.remove(h);
    }

    public void registerForDataEnabledChanged(Handler h, int what, Object obj) {
        mDcTracker.registerForDataEnabledChanged(h, what, obj);
        if (getDcTracker(TransportType.WWAN) != null) {
            getDcTracker(TransportType.WWAN).registerForDataEnabledChanged(h, what, obj);
        }
    }

    public void unregisterForDataEnabledChanged(Handler h) {
        mDcTracker.unregisterForDataEnabledChanged(h);
        if (getDcTracker(TransportType.WWAN) != null) {
            getDcTracker(TransportType.WWAN).unregisterForDataEnabledChanged(h);
        }
    }

    public IccSmsInterfaceManager getIccSmsInterfaceManager(){
@@ -3708,7 +3795,13 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
     * @param enabled True if enabling the data, otherwise disabling.
     */
    public void setPolicyDataEnabled(boolean enabled) {
        mDcTracker.setPolicyDataEnabled(enabled);
        if (mTransportManager != null) {
            for (int transport : mTransportManager.getAvailableTransports()) {
                if (getDcTracker(transport) != null) {
                    getDcTracker(transport).setPolicyDataEnabled(enabled);
                }
            }
        }
    }

    /**
@@ -3745,12 +3838,21 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
            String gid2, String pnn, String spn) {
    }

    /**
     * Get data connection tracker based on the transport type
     *
     * @param transportType Transport type defined in AccessNetworkConstants.TransportType
     * @return The data connection tracker. Null if not found.
     */
    public @Nullable DcTracker getDcTracker(int transportType) {
        return mDcTrackers.get(transportType);
    }

    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
        pw.println("Phone: subId=" + getSubId());
        pw.println(" mPhoneId=" + mPhoneId);
        pw.println(" mCi=" + mCi);
        pw.println(" mDnsCheckDisabled=" + mDnsCheckDisabled);
        pw.println(" mDcTracker=" + mDcTracker);
        pw.println(" mDoesRilSendMultipleCallRing=" + mDoesRilSendMultipleCallRing);
        pw.println(" mCallRingContinueToken=" + mCallRingContinueToken);
        pw.println(" mCallRingDelay=" + mCallRingDelay);
@@ -3794,16 +3896,15 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
            pw.println("++++++++++++++++++++++++++++++++");
        }

        if (mDcTracker != null) {
            try {
                mDcTracker.dump(fd, pw, args);
            } catch (Exception e) {
                e.printStackTrace();
            }

        if (mTransportManager != null) {
            for (int transport : mTransportManager.getAvailableTransports()) {
                if (getDcTracker(transport) != null) {
                    getDcTracker(transport).dump(fd, pw, args);
                    pw.flush();
                    pw.println("++++++++++++++++++++++++++++++++");
                }
            }
        }

        if (getServiceStateTracker() != null) {
            try {
Loading