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

Commit 8e2faa2b authored by Jack Yu's avatar Jack Yu Committed by Gerrit Code Review
Browse files

Merge "Removed state machine from DcController"

parents 86540511 00efea1f
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));