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

Commit 50fc7d15 authored by Hugh Chen's avatar Hugh Chen
Browse files

Fix "USB tethering" doesn't work after reconnecting USB

Before this CL, if users selects usb tethering option and
reconnects usb it would not start entitlement check.
Because we only start entitlement checks when users select it.

This CL will start entitlement checks when usb tethering option
is selected and reconnects usb.

Bug: 176037347
Test: make -j42 RunSettingsRoboTests
Change-Id: I3a2ad392a1cae9cf97355ef3cd4fb8c23de18673
parent 6d513a2c
Loading
Loading
Loading
Loading
+19 −3
Original line number Diff line number Diff line
@@ -64,14 +64,24 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {

    private UsbConnectionBroadcastReceiver mUsbReceiver;
    private Handler mHandler = new Handler();
    private boolean mIsConnected = false;

    @VisibleForTesting
    UsbConnectionBroadcastReceiver.UsbConnectionListener mUsbConnectionListener =
            (connected, functions, powerRole, dataRole) -> {
                final long defaultFunctions = mUsbBackend.getDefaultUsbFunctions();
                Log.d(TAG, "UsbConnectionListener() connected : " + connected + ", functions : "
                        + functions + ", defaultFunctions : " + defaultFunctions);
                if (connected && !mIsConnected && defaultFunctions == UsbManager.FUNCTION_RNDIS) {
                    startTethering();
                }

                if (mIsStartTethering) {
                    mCurrentFunctions = functions;
                    refresh(functions);
                    mIsStartTethering = false;
                }
                mIsConnected = connected;
            };

    @Override
@@ -146,9 +156,7 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
            if (functions == UsbManager.FUNCTION_RNDIS) {
                // We need to have entitlement check for usb tethering, so use API in
                // TetheringManager.
                mIsStartTethering = true;
                mTetheringManager.startTethering(TETHERING_USB, new HandlerExecutor(mHandler),
                        mOnStartTetheringCallback);
                startTethering();
            } else {
                mIsStartTethering = false;
                mCurrentFunctions = functions;
@@ -159,6 +167,13 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
        return true;
    }

    private void startTethering() {
        Log.d(TAG, "startTethering()");
        mIsStartTethering = true;
        mTetheringManager.startTethering(TETHERING_USB, new HandlerExecutor(mHandler),
                mOnStartTetheringCallback);
    }

    @Override
    public void onPause() {
        super.onPause();
@@ -171,6 +186,7 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {

        @Override
        public void onTetheringStarted() {
            Log.d(TAG, "onTetheringStarted()");
            // Set default usb functions again to make internal data persistent
            mCurrentFunctions = UsbManager.FUNCTION_RNDIS;
            mUsbBackend.setDefaultUsbFunctions(UsbManager.FUNCTION_RNDIS);
+26 −0
Original line number Diff line number Diff line
@@ -224,6 +224,32 @@ public class UsbDefaultFragmentTest {
        assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_MIDI);
    }

    @Test
    public void usbIsPluginAndUsbTetheringIsOn_startTetheringIsInvoked() {
        when(mUsbBackend.getDefaultUsbFunctions()).thenReturn(UsbManager.FUNCTION_RNDIS);

        mFragment.mUsbConnectionListener.onUsbConnectionChanged(false /* connected */,
                UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
        mFragment.mUsbConnectionListener.onUsbConnectionChanged(true /* connected */,
                UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE);

        verify(mTetheringManager).startTethering(eq(TetheringManager.TETHERING_USB),
                any(),
                eq(mFragment.mOnStartTetheringCallback));
    }

    @Test
    public void usbIsNotPluginAndUsbTetheringIsOn_startTetheringIsNotInvoked() {
        when(mUsbBackend.getDefaultUsbFunctions()).thenReturn(UsbManager.FUNCTION_RNDIS);

        mFragment.mUsbConnectionListener.onUsbConnectionChanged(false /* connected */,
                UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE);

        verify(mTetheringManager, never()).startTethering(eq(TetheringManager.TETHERING_USB),
                any(),
                eq(mFragment.mOnStartTetheringCallback));
    }

    public static class TestFragment extends UsbDefaultFragment {
        public final PreferenceScreen mScreen;