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

Commit cd21b3b4 authored by Jack Yu's avatar Jack Yu Committed by Automerger Merge Worker
Browse files

Merge "Removed state machine from DcController" am: 8e2faa2b

Original change: https://android-review.googlesource.com/c/platform/frameworks/opt/telephony/+/1439251

Change-Id: I9a0a0f922b10543361ff168fb616d75e3012de01
parents 83c9f5b9 8e2faa2b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -638,7 +638,7 @@ public class DataConnection extends StateMachine {
    private DataConnection(Phone phone, String tagSuffix, int id,
                           DcTracker dct, DataServiceManager dataServiceManager,
                           DcTesterFailBringUpAll failBringUpAll, DcController dcc) {
        super("DC-" + tagSuffix, dcc.getHandler());
        super("DC-" + tagSuffix, dcc);
        mTagSuffix = tagSuffix;
        setLogRecSize(300);
        setLogOnlyTransitions(true);
+220 −297
Original line number Diff line number Diff line
@@ -17,26 +17,21 @@
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.Looper;
import android.os.Message;
import android.os.RegistrantList;
import android.telephony.AccessNetworkConstants;
import android.telephony.DataFailCause;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.telephony.data.DataCallResponse;

import com.android.internal.telephony.DctConstants;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.dataconnection.DataConnection.UpdateLinkPropertyResult;
import com.android.internal.telephony.util.HandlerExecutor;
import com.android.internal.telephony.util.TelephonyUtils;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
import com.android.net.module.util.LinkPropertiesUtils;
import com.android.net.module.util.LinkPropertiesUtils.CompareResult;
import com.android.net.module.util.NetUtils;
@@ -55,7 +50,7 @@ import java.util.List;
 * multiple data connections. For instance listening for unsolicited messages
 * and then demultiplexing them to the appropriate DC.
 */
public class DcController extends StateMachine {
public class DcController extends Handler {
    private static final boolean DBG = true;
    private static final boolean VDBG = false;

@@ -79,6 +74,7 @@ public class DcController extends StateMachine {

    private final Phone mPhone;
    private final DcTracker mDct;
    private final String mTag;
    private final DataServiceManager mDataServiceManager;
    private final DcTesterDeactivateAll mDcTesterDeactivateAll;

@@ -88,16 +84,6 @@ public class DcController extends StateMachine {
    // @GuardedBy("mDcListAll")
    private final HashMap<Integer, DataConnection> mDcListActiveByCid = new HashMap<>();

    private DccDefaultState mDccDefaultState = new DccDefaultState();

    final TelephonyManager mTelephonyManager;

    private PhoneStateListener mPhoneStateListener;

    //mExecutingCarrierChange tracks whether the phone is currently executing
    //carrier network change
    private volatile boolean mExecutingCarrierChange;

    /**
     * Aggregated physical link state from all data connections. This reflects the device's RRC
     * connection state.
@@ -115,50 +101,47 @@ public class DcController extends StateMachine {
     * @param phone the phone associated with Dcc and Dct
     * @param dct the DataConnectionTracker associated with Dcc
     * @param dataServiceManager the data service manager that manages data services
     * @param handler defines the thread/looper to be used with Dcc
     * @param looper looper for this handler
     */
    private DcController(String name, Phone phone, DcTracker dct,
                         DataServiceManager dataServiceManager, Handler handler) {
        super(name, handler);
        setLogRecSize(300);
        log("E ctor");
                         DataServiceManager dataServiceManager, Looper looper) {
        super(looper);
        mPhone = phone;
        mDct = dct;
        mTag = name;
        mDataServiceManager = dataServiceManager;
        addState(mDccDefaultState);
        setInitialState(mDccDefaultState);
        log("X ctor");

        mPhoneStateListener = new PhoneStateListener(new HandlerExecutor(handler)) {
            @Override
            public void onCarrierNetworkChange(boolean active) {
                mExecutingCarrierChange = active;
            }
        };

        mTelephonyManager = (TelephonyManager) phone.getContext()
                .getSystemService(Context.TELEPHONY_SERVICE);

        mDcTesterDeactivateAll = (TelephonyUtils.IS_DEBUGGABLE)
                ? new DcTesterDeactivateAll(mPhone, DcController.this, getHandler())
                ? new DcTesterDeactivateAll(mPhone, DcController.this, this)
                : null;

        if (mTelephonyManager != null) {
            mTelephonyManager.listen(mPhoneStateListener,
                    PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE);
        if (mPhone != null && mDataServiceManager.getTransportType()
                == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
            mPhone.mCi.registerForRilConnected(this,
                    DataConnection.EVENT_RIL_CONNECTED, null);
        }

        mDataServiceManager.registerForDataCallListChanged(this,
                DataConnection.EVENT_DATA_STATE_CHANGED);
    }

    public static DcController makeDcc(Phone phone, DcTracker dct,
                                       DataServiceManager dataServiceManager, Handler handler,
                                       DataServiceManager dataServiceManager, Looper looper,
                                       String tagSuffix) {
        return new DcController("Dcc" + tagSuffix, phone, dct, dataServiceManager, handler);
        return new DcController("Dcc" + tagSuffix, phone, dct, dataServiceManager, looper);
    }

    void dispose() {
        log("dispose: call quiteNow()");
        if(mTelephonyManager != null) mTelephonyManager.listen(mPhoneStateListener, 0);
        quitNow();
        log("dispose");
        if (mPhone != null & mDataServiceManager.getTransportType()
                == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
            mPhone.mCi.unregisterForRilConnected(this);
        }
        mDataServiceManager.unregisterForDataCallListChanged(this);

        if (mDcTesterDeactivateAll != null) {
            mDcTesterDeactivateAll.dispose();
        }
    }

    void addDc(DataConnection dc) {
@@ -183,7 +166,7 @@ public class DcController extends StateMachine {
        }
    }

    public DataConnection getActiveDcByCid(int cid) {
    DataConnection getActiveDcByCid(int cid) {
        synchronized (mDcListAll) {
            return mDcListActiveByCid.get(cid);
        }
@@ -198,38 +181,8 @@ public class DcController extends StateMachine {
        }
    }

    boolean isExecutingCarrierChange() {
        return mExecutingCarrierChange;
    }

    private class DccDefaultState extends State {
    @Override
        public void enter() {
            if (mPhone != null && mDataServiceManager.getTransportType()
                    == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
                mPhone.mCi.registerForRilConnected(getHandler(),
                        DataConnection.EVENT_RIL_CONNECTED, null);
            }

            mDataServiceManager.registerForDataCallListChanged(getHandler(),
                    DataConnection.EVENT_DATA_STATE_CHANGED);
        }

        @Override
        public void exit() {
            if (mPhone != null & mDataServiceManager.getTransportType()
                    == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
                mPhone.mCi.unregisterForRilConnected(getHandler());
            }
            mDataServiceManager.unregisterForDataCallListChanged(getHandler());

            if (mDcTesterDeactivateAll != null) {
                mDcTesterDeactivateAll.dispose();
            }
        }

        @Override
        public boolean processMessage(Message msg) {
    public void handleMessage(Message msg) {
        AsyncResult ar;

        switch (msg.what) {
@@ -237,11 +190,11 @@ public class DcController extends StateMachine {
                ar = (AsyncResult) msg.obj;
                if (ar.exception == null) {
                    if (DBG) {
                            log("DccDefaultState: msg.what=EVENT_RIL_CONNECTED mRilVersion=" +
                                ar.result);
                        log("EVENT_RIL_CONNECTED mRilVersion="
                                + ar.result);
                    }
                } else {
                        log("DccDefaultState: Unexpected exception on EVENT_RIL_CONNECTED");
                    log("Unexpected exception on EVENT_RIL_CONNECTED");
                }
                break;

@@ -250,12 +203,10 @@ public class DcController extends StateMachine {
                if (ar.exception == null) {
                    onDataStateChanged((ArrayList<DataCallResponse>) ar.result);
                } else {
                        log("DccDefaultState: EVENT_DATA_STATE_CHANGED:" +
                                    " exception; likely radio not available, ignore");
                    log("EVENT_DATA_STATE_CHANGED: exception; likely radio not available, ignore");
                }
                break;
        }
            return HANDLED;
    }

    /**
@@ -263,20 +214,15 @@ public class DcController extends StateMachine {
     * @param dcsList as sent by RIL_UNSOL_DATA_CALL_LIST_CHANGED
     */
    private void onDataStateChanged(ArrayList<DataCallResponse> dcsList) {
            final ArrayList<DataConnection> dcListAll;
        final HashMap<Integer, DataConnection> dcListActiveByCid;
        synchronized (mDcListAll) {
                dcListAll = new ArrayList<>(mDcListAll);
            dcListActiveByCid = new HashMap<>(mDcListActiveByCid);
        }

        if (DBG) {
                lr("onDataStateChanged: dcsList=" + dcsList
            log("onDataStateChanged: dcsList=" + dcsList
                    + " dcListActiveByCid=" + dcListActiveByCid);
        }
            if (VDBG) {
                log("onDataStateChanged: mDcListAll=" + dcListAll);
            }

        // Create hashmap of cid to DataCallResponse
        HashMap<Integer, DataCallResponse> dataCallResponseListByCid =
@@ -371,8 +317,8 @@ public class DcController extends StateMachine {
                                        LinkPropertiesUtils.compareAddresses(result.oldLp,
                                                result.newLp);
                                if (DBG) {
                                        log("onDataStateChanged: oldLp=" + result.oldLp +
                                                " newLp=" + result.newLp + " car=" + car);
                                    log("onDataStateChanged: oldLp=" + result.oldLp
                                            + " newLp=" + result.newLp + " car=" + car);
                                }
                                boolean needToClean = false;
                                for (LinkAddress added : car.added) {
@@ -449,7 +395,7 @@ public class DcController extends StateMachine {
        }

        if (DBG) {
                lr("onDataStateChanged: dcsToRetry=" + dcsToRetry
            log("onDataStateChanged: dcsToRetry=" + dcsToRetry
                    + " apnsToCleanup=" + apnsToCleanup);
        }

@@ -466,7 +412,6 @@ public class DcController extends StateMachine {

        if (VDBG) log("onDataStateChanged: X");
    }
    }

    /**
     * Register for physical link state (i.e. RRC state) changed event.
@@ -474,7 +419,7 @@ public class DcController extends StateMachine {
     * @param h The handler
     * @param what The event
     */
    public void registerForPhysicalLinkStateChanged(Handler h, int what) {
    void registerForPhysicalLinkStateChanged(Handler h, int what) {
        mPhysicalLinkStateChangedRegistrants.addUnique(h, what, null);
    }

@@ -483,36 +428,16 @@ public class DcController extends StateMachine {
     *
     * @param h The previously registered handler
     */
    public void unregisterForPhysicalLinkStateChanged(Handler h) {
    void unregisterForPhysicalLinkStateChanged(Handler h) {
        mPhysicalLinkStateChangedRegistrants.remove(h);
    }

    /**
     * lr is short name for logAndAddLogRec
     * @param s
     */
    private void lr(String s) {
        logAndAddLogRec(s);
    private void log(String s) {
        Rlog.d(mTag, s);
    }

    @Override
    protected void log(String s) {
        Rlog.d(getName(), s);
    }

    @Override
    protected void loge(String s) {
        Rlog.e(getName(), s);
    }

    /**
     * @return the string for msg.what as our info.
     */
    @Override
    protected String getWhatToString(int what) {
        String info = null;
        info = DataConnection.cmdToString(what);
        return info;
    private void loge(String s) {
        Rlog.e(mTag, s);
    }

    @Override
@@ -522,9 +447,7 @@ public class DcController extends StateMachine {
        }
    }

    @Override
    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
        super.dump(fd, pw, args);
        pw.println(" mPhone=" + mPhone);
        synchronized (mDcListAll) {
            pw.println(" mDcListAll=" + mDcListAll);
+3 −3
Original line number Diff line number Diff line
@@ -715,7 +715,8 @@ public class DcTracker extends Handler {
        mHandlerThread = new HandlerThread("DcHandlerThread");
        mHandlerThread.start();
        Handler dcHandler = new Handler(mHandlerThread.getLooper());
        mDcc = DcController.makeDcc(mPhone, this, mDataServiceManager, dcHandler, mLogTagSuffix);
        mDcc = DcController.makeDcc(mPhone, this, mDataServiceManager, dcHandler.getLooper(),
                mLogTagSuffix);
        mDcTesterFailBringUpAll = new DcTesterFailBringUpAll(mPhone, dcHandler);

        mDataConnectionTracker = this;
@@ -5078,9 +5079,8 @@ public class DcTracker extends Handler {
        if (bound) {
            if (mDcc == null) {
                mDcc = DcController.makeDcc(mPhone, this, mDataServiceManager,
                        new Handler(mHandlerThread.getLooper()), mLogTagSuffix);
                        mHandlerThread.getLooper(), mLogTagSuffix);
            }
            mDcc.start();
        } else {
            if (mTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
                boolean connPersistenceOnRestart = mPhone.getContext().getResources()
+1 −2
Original line number Diff line number Diff line
@@ -253,8 +253,7 @@ public class DataConnectionTest extends TelephonyTest {

            DataServiceManager manager = new DataServiceManager(mPhone,
                    AccessNetworkConstants.TRANSPORT_TYPE_WWAN, "");
            mDcc = DcController.makeDcc(mPhone, mDcTracker, manager, h, "");
            mDcc.start();
            mDcc = DcController.makeDcc(mPhone, mDcTracker, manager, h.getLooper(), "");
            mDc = DataConnection.makeDataConnection(mPhone, 0, mDcTracker, manager,
                    mDcTesterFailBringUpAll, mDcc);
        }
+4 −7
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_G
import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_IFNAME;
import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_PCSCF_ADDRESS;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doReturn;
@@ -34,7 +33,6 @@ import android.net.InetAddresses;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.os.AsyncResult;
import android.os.Handler;
import android.os.Looper;
import android.telephony.AccessNetworkConstants;
import android.telephony.data.ApnSetting;
@@ -103,9 +101,8 @@ public class DcControllerTest extends TelephonyTest {
        doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                .when(mDataServiceManager).getTransportType();

        mDcc = DcController.makeDcc(mPhone, mDcTracker, mDataServiceManager,
                new Handler(Looper.myLooper()), "");
        mDcc.start();
        mDcc = DcController.makeDcc(mPhone, mDcTracker, mDataServiceManager, Looper.myLooper(),
                "");
        processAllMessages();
    }

@@ -117,7 +114,6 @@ public class DcControllerTest extends TelephonyTest {
    @Test
    @SmallTest
    public void testDataDormant() throws Exception {
        assertEquals("DccDefaultState", getCurrentState().getName());
        ArrayList<DataCallResponse> l = new ArrayList<>();
        DataCallResponse dcResponse = new DataCallResponse.Builder()
                .setCause(0)
@@ -140,7 +136,8 @@ public class DcControllerTest extends TelephonyTest {
        mDc.mCid = 1;
        mDcc.addActiveDcByCid(mDc);

        mDcc.sendMessage(EVENT_DATA_STATE_CHANGED, new AsyncResult(null, l, null));
        mDcc.sendMessage(mDcc.obtainMessage(EVENT_DATA_STATE_CHANGED,
                new AsyncResult(null, l, null)));
        processAllMessages();

        verify(mDcTracker, times(1)).sendStopNetStatPoll(eq(DctConstants.Activity.DORMANT));