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;