Merge "Fix "USB tethering" doesn't work after reconnecting USB" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-03-05 09:53:05 +00:00
committed by Android (Google) Code Review
2 changed files with 45 additions and 3 deletions

View File

@@ -64,14 +64,24 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
private UsbConnectionBroadcastReceiver mUsbReceiver; private UsbConnectionBroadcastReceiver mUsbReceiver;
private Handler mHandler = new Handler(); private Handler mHandler = new Handler();
private boolean mIsConnected = false;
@VisibleForTesting @VisibleForTesting
UsbConnectionBroadcastReceiver.UsbConnectionListener mUsbConnectionListener = UsbConnectionBroadcastReceiver.UsbConnectionListener mUsbConnectionListener =
(connected, functions, powerRole, dataRole) -> { (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) { if (mIsStartTethering) {
mCurrentFunctions = functions; mCurrentFunctions = functions;
refresh(functions); refresh(functions);
mIsStartTethering = false;
} }
mIsConnected = connected;
}; };
@Override @Override
@@ -146,9 +156,7 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
if (functions == UsbManager.FUNCTION_RNDIS) { if (functions == UsbManager.FUNCTION_RNDIS) {
// We need to have entitlement check for usb tethering, so use API in // We need to have entitlement check for usb tethering, so use API in
// TetheringManager. // TetheringManager.
mIsStartTethering = true; startTethering();
mTetheringManager.startTethering(TETHERING_USB, new HandlerExecutor(mHandler),
mOnStartTetheringCallback);
} else { } else {
mIsStartTethering = false; mIsStartTethering = false;
mCurrentFunctions = functions; mCurrentFunctions = functions;
@@ -159,6 +167,13 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
return true; return true;
} }
private void startTethering() {
Log.d(TAG, "startTethering()");
mIsStartTethering = true;
mTetheringManager.startTethering(TETHERING_USB, new HandlerExecutor(mHandler),
mOnStartTetheringCallback);
}
@Override @Override
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
@@ -171,6 +186,7 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
@Override @Override
public void onTetheringStarted() { public void onTetheringStarted() {
Log.d(TAG, "onTetheringStarted()");
// Set default usb functions again to make internal data persistent // Set default usb functions again to make internal data persistent
mCurrentFunctions = UsbManager.FUNCTION_RNDIS; mCurrentFunctions = UsbManager.FUNCTION_RNDIS;
mUsbBackend.setDefaultUsbFunctions(UsbManager.FUNCTION_RNDIS); mUsbBackend.setDefaultUsbFunctions(UsbManager.FUNCTION_RNDIS);

View File

@@ -224,6 +224,32 @@ public class UsbDefaultFragmentTest {
assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_MIDI); 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 static class TestFragment extends UsbDefaultFragment {
public final PreferenceScreen mScreen; public final PreferenceScreen mScreen;