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
This commit is contained in:
Hugh Chen
2021-04-26 17:45:46 +08:00
parent e06f5a93b1
commit ddafb202bd
3 changed files with 31 additions and 10 deletions

View File

@@ -63,7 +63,7 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
boolean mIsStartTethering = false; boolean mIsStartTethering = false;
private UsbConnectionBroadcastReceiver mUsbReceiver; private UsbConnectionBroadcastReceiver mUsbReceiver;
private Handler mHandler = new Handler(); private Handler mHandler;
private boolean mIsConnected = false; private boolean mIsConnected = false;
@VisibleForTesting @VisibleForTesting
@@ -71,14 +71,17 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
(connected, functions, powerRole, dataRole) -> { (connected, functions, powerRole, dataRole) -> {
final long defaultFunctions = mUsbBackend.getDefaultUsbFunctions(); final long defaultFunctions = mUsbBackend.getDefaultUsbFunctions();
Log.d(TAG, "UsbConnectionListener() connected : " + connected + ", functions : " Log.d(TAG, "UsbConnectionListener() connected : " + connected + ", functions : "
+ functions + ", defaultFunctions : " + defaultFunctions); + functions + ", defaultFunctions : " + defaultFunctions
if (connected && !mIsConnected && defaultFunctions == UsbManager.FUNCTION_RNDIS) { + ", mIsStartTethering : " + mIsStartTethering);
if (connected && !mIsConnected && defaultFunctions == UsbManager.FUNCTION_RNDIS
&& !mIsStartTethering) {
startTethering(); startTethering();
} }
if (mIsStartTethering) { if (mIsStartTethering && connected) {
mCurrentFunctions = functions; mCurrentFunctions = functions;
refresh(functions); refresh(functions);
mUsbBackend.setDefaultUsbFunctions(functions);
mIsStartTethering = false; mIsStartTethering = false;
} }
mIsConnected = connected; mIsConnected = connected;
@@ -91,6 +94,7 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
mTetheringManager = context.getSystemService(TetheringManager.class); mTetheringManager = context.getSystemService(TetheringManager.class);
mUsbReceiver = new UsbConnectionBroadcastReceiver(context, mUsbConnectionListener, mUsbReceiver = new UsbConnectionBroadcastReceiver(context, mUsbConnectionListener,
mUsbBackend); mUsbBackend);
mHandler = new Handler(context.getMainLooper());
getSettingsLifecycle().addObserver(mUsbReceiver); getSettingsLifecycle().addObserver(mUsbReceiver);
mCurrentFunctions = mUsbBackend.getDefaultUsbFunctions(); mCurrentFunctions = mUsbBackend.getDefaultUsbFunctions();
} }

View File

@@ -57,7 +57,7 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
private PreferenceCategory mProfilesContainer; private PreferenceCategory mProfilesContainer;
private TetheringManager mTetheringManager; private TetheringManager mTetheringManager;
private Handler mHandler = new Handler(); private Handler mHandler;
@VisibleForTesting @VisibleForTesting
OnStartTetheringCallback mOnStartTetheringCallback; OnStartTetheringCallback mOnStartTetheringCallback;
@VisibleForTesting @VisibleForTesting
@@ -69,6 +69,7 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
mTetheringManager = context.getSystemService(TetheringManager.class); mTetheringManager = context.getSystemService(TetheringManager.class);
mOnStartTetheringCallback = new OnStartTetheringCallback(); mOnStartTetheringCallback = new OnStartTetheringCallback();
mPreviousFunction = mUsbBackend.getCurrentFunctions(); mPreviousFunction = mUsbBackend.getCurrentFunctions();
mHandler = new Handler(context.getMainLooper());
} }
@Override @Override

View File

@@ -27,6 +27,7 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -172,7 +173,7 @@ public class UsbDefaultFragmentTest {
mFragment.onPause(); mFragment.onPause();
verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_RNDIS); verify(mUsbBackend, times(2)).setDefaultUsbFunctions(UsbManager.FUNCTION_RNDIS);
assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_RNDIS); assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_RNDIS);
} }
@@ -184,7 +185,7 @@ public class UsbDefaultFragmentTest {
mFragment.onPause(); mFragment.onPause();
verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_NONE); verify(mUsbBackend, times(2)).setDefaultUsbFunctions(UsbManager.FUNCTION_NONE);
assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_NONE); assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_NONE);
} }
@@ -196,7 +197,7 @@ public class UsbDefaultFragmentTest {
mFragment.onPause(); mFragment.onPause();
verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_MTP); verify(mUsbBackend, times(2)).setDefaultUsbFunctions(UsbManager.FUNCTION_MTP);
assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_MTP); assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_MTP);
} }
@@ -208,7 +209,7 @@ public class UsbDefaultFragmentTest {
mFragment.onPause(); mFragment.onPause();
verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_PTP); verify(mUsbBackend, times(2)).setDefaultUsbFunctions(UsbManager.FUNCTION_PTP);
assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_PTP); assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_PTP);
} }
@@ -220,7 +221,7 @@ public class UsbDefaultFragmentTest {
mFragment.onPause(); mFragment.onPause();
verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_MIDI); verify(mUsbBackend, times(2)).setDefaultUsbFunctions(UsbManager.FUNCTION_MIDI);
assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_MIDI); assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_MIDI);
} }
@@ -250,6 +251,21 @@ public class UsbDefaultFragmentTest {
eq(mFragment.mOnStartTetheringCallback)); 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 static class TestFragment extends UsbDefaultFragment {
public final PreferenceScreen mScreen; public final PreferenceScreen mScreen;