From ddafb202bd33bd268fb1bf8a50ef37f20006755b Mon Sep 17 00:00:00 2001 From: Hugh Chen Date: Mon, 26 Apr 2021 17:45:46 +0800 Subject: [PATCH] Fix usb tethering switch back to none after off/on the screen This CL adds conditions to check whether usb is connected or not. If usb is not connected or tethering is not started don't update the state. Bug: 157709648 Test: make RunSettingsRoboTests -j56 Change-Id: Ifbf5900923419d6abf35834b196aab12601076e4 --- .../usb/UsbDefaultFragment.java | 12 ++++++--- .../usb/UsbDetailsFunctionsController.java | 3 ++- .../usb/UsbDefaultFragmentTest.java | 26 +++++++++++++++---- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java index de08f38524f..390faa45d07 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java +++ b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java @@ -63,7 +63,7 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment { boolean mIsStartTethering = false; private UsbConnectionBroadcastReceiver mUsbReceiver; - private Handler mHandler = new Handler(); + private Handler mHandler; private boolean mIsConnected = false; @VisibleForTesting @@ -71,14 +71,17 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment { (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) { + + functions + ", defaultFunctions : " + defaultFunctions + + ", mIsStartTethering : " + mIsStartTethering); + if (connected && !mIsConnected && defaultFunctions == UsbManager.FUNCTION_RNDIS + && !mIsStartTethering) { startTethering(); } - if (mIsStartTethering) { + if (mIsStartTethering && connected) { mCurrentFunctions = functions; refresh(functions); + mUsbBackend.setDefaultUsbFunctions(functions); mIsStartTethering = false; } mIsConnected = connected; @@ -91,6 +94,7 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment { mTetheringManager = context.getSystemService(TetheringManager.class); mUsbReceiver = new UsbConnectionBroadcastReceiver(context, mUsbConnectionListener, mUsbBackend); + mHandler = new Handler(context.getMainLooper()); getSettingsLifecycle().addObserver(mUsbReceiver); mCurrentFunctions = mUsbBackend.getDefaultUsbFunctions(); } diff --git a/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java b/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java index 40626fbaf04..4698bc77992 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java +++ b/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java @@ -57,7 +57,7 @@ public class UsbDetailsFunctionsController extends UsbDetailsController private PreferenceCategory mProfilesContainer; private TetheringManager mTetheringManager; - private Handler mHandler = new Handler(); + private Handler mHandler; @VisibleForTesting OnStartTetheringCallback mOnStartTetheringCallback; @VisibleForTesting @@ -69,6 +69,7 @@ public class UsbDetailsFunctionsController extends UsbDetailsController mTetheringManager = context.getSystemService(TetheringManager.class); mOnStartTetheringCallback = new OnStartTetheringCallback(); mPreviousFunction = mUsbBackend.getCurrentFunctions(); + mHandler = new Handler(context.getMainLooper()); } @Override 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 31081507bf9..77d47312a85 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java @@ -27,6 +27,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -172,7 +173,7 @@ public class UsbDefaultFragmentTest { mFragment.onPause(); - verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_RNDIS); + verify(mUsbBackend, times(2)).setDefaultUsbFunctions(UsbManager.FUNCTION_RNDIS); assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_RNDIS); } @@ -184,7 +185,7 @@ public class UsbDefaultFragmentTest { mFragment.onPause(); - verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_NONE); + verify(mUsbBackend, times(2)).setDefaultUsbFunctions(UsbManager.FUNCTION_NONE); assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_NONE); } @@ -196,7 +197,7 @@ public class UsbDefaultFragmentTest { mFragment.onPause(); - verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_MTP); + verify(mUsbBackend, times(2)).setDefaultUsbFunctions(UsbManager.FUNCTION_MTP); assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_MTP); } @@ -208,7 +209,7 @@ public class UsbDefaultFragmentTest { mFragment.onPause(); - verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_PTP); + verify(mUsbBackend, times(2)).setDefaultUsbFunctions(UsbManager.FUNCTION_PTP); assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_PTP); } @@ -220,7 +221,7 @@ public class UsbDefaultFragmentTest { mFragment.onPause(); - verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_MIDI); + verify(mUsbBackend, times(2)).setDefaultUsbFunctions(UsbManager.FUNCTION_MIDI); assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_MIDI); } @@ -250,6 +251,21 @@ public class UsbDefaultFragmentTest { eq(mFragment.mOnStartTetheringCallback)); } + @Test + public void usbIsPluginAndUsbTetheringIsAlreadyStarted_startTetheringIsNotInvoked() { + mFragment.mIsStartTethering = true; + 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, never()).startTethering(eq(TetheringManager.TETHERING_USB), + any(), + eq(mFragment.mOnStartTetheringCallback)); + } + public static class TestFragment extends UsbDefaultFragment { public final PreferenceScreen mScreen;