From 50fc7d15ef3ebeff935ded56066d941ae6e26cf3 Mon Sep 17 00:00:00 2001 From: Hugh Chen Date: Thu, 4 Mar 2021 15:11:40 +0800 Subject: [PATCH] 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 --- .../usb/UsbDefaultFragment.java | 22 +++++++++++++--- .../usb/UsbDefaultFragmentTest.java | 26 +++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java index 668ec3f2ce2..de08f38524f 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java +++ b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java @@ -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); diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java index c751e98d965..31081507bf9 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java @@ -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;