Refactor Usb settings

1. Rename ShouldIgnoreClickEvent() to isClickEventIgnored().
2. Use TetheringManager instead of ConnectivityManager.

Bug: 175651578
Test: make -j42 RunSettingsRoboTests
Change-Id: I37c49694257b7575550b5a905e293b5d056ba1bf
This commit is contained in:
Hugh Chen
2021-03-02 17:47:22 +08:00
parent 73fe82071d
commit 0091ae6142
6 changed files with 58 additions and 46 deletions

View File

@@ -28,7 +28,7 @@ import android.content.pm.PackageManager;
import android.hardware.usb.UsbManager; import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbPort; import android.hardware.usb.UsbPort;
import android.hardware.usb.UsbPortStatus; import android.hardware.usb.UsbPortStatus;
import android.net.ConnectivityManager; import android.net.TetheringManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
@@ -74,9 +74,8 @@ public class UsbBackend {
mIsAdminUser = userManager.isAdminUser(); mIsAdminUser = userManager.isAdminUser();
mMidiSupported = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI); mMidiSupported = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI);
ConnectivityManager cm = final TetheringManager tm = context.getSystemService(TetheringManager.class);
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); mTetheringSupported = tm.isTetheringSupported();
mTetheringSupported = cm.isTetheringSupported();
updatePorts(); updatePorts();
} }

View File

@@ -16,14 +16,17 @@
package com.android.settings.connecteddevice.usb; package com.android.settings.connecteddevice.usb;
import static android.net.ConnectivityManager.TETHERING_USB; import static android.net.TetheringManager.TETHERING_USB;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.hardware.usb.UsbManager; import android.hardware.usb.UsbManager;
import android.net.ConnectivityManager; import android.net.TetheringManager;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.util.Log;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
@@ -43,10 +46,13 @@ import java.util.List;
* Provides options for selecting the default USB mode. * Provides options for selecting the default USB mode.
*/ */
public class UsbDefaultFragment extends RadioButtonPickerFragment { public class UsbDefaultFragment extends RadioButtonPickerFragment {
private static final String TAG = "UsbDefaultFragment";
@VisibleForTesting @VisibleForTesting
UsbBackend mUsbBackend; UsbBackend mUsbBackend;
@VisibleForTesting @VisibleForTesting
ConnectivityManager mConnectivityManager; TetheringManager mTetheringManager;
@VisibleForTesting @VisibleForTesting
OnStartTetheringCallback mOnStartTetheringCallback = new OnStartTetheringCallback(); OnStartTetheringCallback mOnStartTetheringCallback = new OnStartTetheringCallback();
@VisibleForTesting @VisibleForTesting
@@ -57,6 +63,7 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
boolean mIsStartTethering = false; boolean mIsStartTethering = false;
private UsbConnectionBroadcastReceiver mUsbReceiver; private UsbConnectionBroadcastReceiver mUsbReceiver;
private Handler mHandler = new Handler();
@VisibleForTesting @VisibleForTesting
UsbConnectionBroadcastReceiver.UsbConnectionListener mUsbConnectionListener = UsbConnectionBroadcastReceiver.UsbConnectionListener mUsbConnectionListener =
@@ -71,7 +78,7 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
public void onAttach(Context context) { public void onAttach(Context context) {
super.onAttach(context); super.onAttach(context);
mUsbBackend = new UsbBackend(context); mUsbBackend = new UsbBackend(context);
mConnectivityManager = context.getSystemService(ConnectivityManager.class); mTetheringManager = context.getSystemService(TetheringManager.class);
mUsbReceiver = new UsbConnectionBroadcastReceiver(context, mUsbConnectionListener, mUsbReceiver = new UsbConnectionBroadcastReceiver(context, mUsbConnectionListener,
mUsbBackend); mUsbBackend);
getSettingsLifecycle().addObserver(mUsbReceiver); getSettingsLifecycle().addObserver(mUsbReceiver);
@@ -138,9 +145,9 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
if (!Utils.isMonkeyRunning()) { if (!Utils.isMonkeyRunning()) {
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
// ConnectivityManager. // TetheringManager.
mIsStartTethering = true; mIsStartTethering = true;
mConnectivityManager.startTethering(TETHERING_USB, true /* showProvisioningUi */, mTetheringManager.startTethering(TETHERING_USB, new HandlerExecutor(mHandler),
mOnStartTetheringCallback); mOnStartTetheringCallback);
} else { } else {
mIsStartTethering = false; mIsStartTethering = false;
@@ -159,20 +166,19 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
} }
@VisibleForTesting @VisibleForTesting
final class OnStartTetheringCallback extends final class OnStartTetheringCallback implements
ConnectivityManager.OnStartTetheringCallback { TetheringManager.StartTetheringCallback {
@Override @Override
public void onTetheringStarted() { public void onTetheringStarted() {
super.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);
} }
@Override @Override
public void onTetheringFailed() { public void onTetheringFailed(int error) {
super.onTetheringFailed(); Log.w(TAG, "onTetheringFailed() error : " + error);
mUsbBackend.setDefaultUsbFunctions(mPreviousFunctions); mUsbBackend.setDefaultUsbFunctions(mPreviousFunctions);
updateCandidates(); updateCandidates();
} }

View File

@@ -17,11 +17,12 @@
package com.android.settings.connecteddevice.usb; package com.android.settings.connecteddevice.usb;
import static android.hardware.usb.UsbPortStatus.DATA_ROLE_DEVICE; import static android.hardware.usb.UsbPortStatus.DATA_ROLE_DEVICE;
import static android.net.ConnectivityManager.TETHERING_USB;
import android.content.Context; import android.content.Context;
import android.hardware.usb.UsbManager; import android.hardware.usb.UsbManager;
import android.net.ConnectivityManager; import android.net.TetheringManager;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.util.Log; import android.util.Log;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
@@ -55,7 +56,8 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
} }
private PreferenceCategory mProfilesContainer; private PreferenceCategory mProfilesContainer;
private ConnectivityManager mConnectivityManager; private TetheringManager mTetheringManager;
private Handler mHandler = new Handler();
@VisibleForTesting @VisibleForTesting
OnStartTetheringCallback mOnStartTetheringCallback; OnStartTetheringCallback mOnStartTetheringCallback;
@VisibleForTesting @VisibleForTesting
@@ -64,7 +66,7 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
public UsbDetailsFunctionsController(Context context, UsbDetailsFragment fragment, public UsbDetailsFunctionsController(Context context, UsbDetailsFragment fragment,
UsbBackend backend) { UsbBackend backend) {
super(context, fragment, backend); super(context, fragment, backend);
mConnectivityManager = context.getSystemService(ConnectivityManager.class); mTetheringManager = context.getSystemService(TetheringManager.class);
mOnStartTetheringCallback = new OnStartTetheringCallback(); mOnStartTetheringCallback = new OnStartTetheringCallback();
mPreviousFunction = mUsbBackend.getCurrentFunctions(); mPreviousFunction = mUsbBackend.getCurrentFunctions();
} }
@@ -130,7 +132,7 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
+ UsbManager.usbFunctionsToString(previousFunction)); + UsbManager.usbFunctionsToString(previousFunction));
} }
if (function != previousFunction && !Utils.isMonkeyRunning() if (function != previousFunction && !Utils.isMonkeyRunning()
&& !shouldIgnoreClickEvent(function, previousFunction)) { && !isClickEventIgnored(function, previousFunction)) {
mPreviousFunction = previousFunction; mPreviousFunction = previousFunction;
//Update the UI in advance to make it looks smooth //Update the UI in advance to make it looks smooth
@@ -144,8 +146,9 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
if (function == UsbManager.FUNCTION_RNDIS) { if (function == 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
// ConnectivityManager. // TetheringManager.
mConnectivityManager.startTethering(TETHERING_USB, true /* showProvisioningUi */, mTetheringManager.startTethering(
TetheringManager.TETHERING_USB, new HandlerExecutor(mHandler),
mOnStartTetheringCallback); mOnStartTetheringCallback);
} else { } else {
mUsbBackend.setCurrentFunctions(function); mUsbBackend.setCurrentFunctions(function);
@@ -153,7 +156,7 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
} }
} }
private boolean shouldIgnoreClickEvent(long function, long previousFunction) { private boolean isClickEventIgnored(long function, long previousFunction) {
return isAccessoryMode(previousFunction) && function == UsbManager.FUNCTION_MTP; return isAccessoryMode(previousFunction) && function == UsbManager.FUNCTION_MTP;
} }
@@ -172,12 +175,11 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
} }
@VisibleForTesting @VisibleForTesting
final class OnStartTetheringCallback extends final class OnStartTetheringCallback implements TetheringManager.StartTetheringCallback {
ConnectivityManager.OnStartTetheringCallback {
@Override @Override
public void onTetheringFailed() { public void onTetheringFailed(int error) {
super.onTetheringFailed(); Log.w(TAG, "onTetheringFailed() error : " + error);
mUsbBackend.setCurrentFunctions(mPreviousFunction); mUsbBackend.setCurrentFunctions(mPreviousFunction);
} }
} }

View File

@@ -34,7 +34,7 @@ import android.content.pm.PackageManager;
import android.hardware.usb.UsbManager; import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbPort; import android.hardware.usb.UsbPort;
import android.hardware.usb.UsbPortStatus; import android.hardware.usb.UsbPortStatus;
import android.net.ConnectivityManager; import android.net.TetheringManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
@@ -57,7 +57,7 @@ public class UsbBackendTest {
@Mock @Mock
private UserManager mUserManager; private UserManager mUserManager;
@Mock @Mock
private ConnectivityManager mConnectivityManager; private TetheringManager mTetheringManager;
@Mock @Mock
private UsbPort mUsbPort; private UsbPort mUsbPort;
@Mock @Mock
@@ -69,8 +69,8 @@ public class UsbBackendTest {
when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI)) when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI))
.thenReturn(true); .thenReturn(true);
when((Object) mContext.getSystemService(UsbManager.class)).thenReturn(mUsbManager); when((Object) mContext.getSystemService(UsbManager.class)).thenReturn(mUsbManager);
when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE)) when((Object) mContext.getSystemService(
.thenReturn(mConnectivityManager); TetheringManager.class)).thenReturn(mTetheringManager);
when(mUsbManager.getPorts()).thenReturn(Collections.singletonList(mUsbPort)); when(mUsbManager.getPorts()).thenReturn(Collections.singletonList(mUsbPort));
when(mUsbPortStatus.isConnected()).thenReturn(true); when(mUsbPortStatus.isConnected()).thenReturn(true);
when(mUsbPort.getStatus()).thenReturn(mUsbPortStatus); when(mUsbPort.getStatus()).thenReturn(mUsbPortStatus);

View File

@@ -18,11 +18,12 @@ package com.android.settings.connecteddevice.usb;
import static android.hardware.usb.UsbPortStatus.DATA_ROLE_DEVICE; import static android.hardware.usb.UsbPortStatus.DATA_ROLE_DEVICE;
import static android.hardware.usb.UsbPortStatus.POWER_ROLE_SINK; import static android.hardware.usb.UsbPortStatus.POWER_ROLE_SINK;
import static android.net.ConnectivityManager.TETHERING_USB;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyLong;
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;
@@ -30,7 +31,7 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.hardware.usb.UsbManager; import android.hardware.usb.UsbManager;
import android.net.ConnectivityManager; import android.net.TetheringManager;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
@@ -50,7 +51,7 @@ public class UsbDefaultFragmentTest {
@Mock @Mock
private UsbBackend mUsbBackend; private UsbBackend mUsbBackend;
@Mock @Mock
private ConnectivityManager mConnectivityManager; private TetheringManager mTetheringManager;
private UsbDefaultFragment mFragment; private UsbDefaultFragment mFragment;
@@ -59,7 +60,7 @@ public class UsbDefaultFragmentTest {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mFragment = new TestFragment(); mFragment = new TestFragment();
mFragment.mUsbBackend = mUsbBackend; mFragment.mUsbBackend = mUsbBackend;
mFragment.mConnectivityManager = mConnectivityManager; mFragment.mTetheringManager = mTetheringManager;
} }
@Test @Test
@@ -136,8 +137,9 @@ public class UsbDefaultFragmentTest {
mFragment.setDefaultKey(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_RNDIS)); mFragment.setDefaultKey(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_RNDIS));
verify(mConnectivityManager).startTethering(TETHERING_USB, true, verify(mTetheringManager).startTethering(eq(TetheringManager.TETHERING_USB),
mFragment.mOnStartTetheringCallback); any(),
eq(mFragment.mOnStartTetheringCallback));
assertThat(mFragment.mPreviousFunctions).isEqualTo( assertThat(mFragment.mPreviousFunctions).isEqualTo(
UsbManager.FUNCTION_MTP); UsbManager.FUNCTION_MTP);
} }

View File

@@ -18,11 +18,12 @@ package com.android.settings.connecteddevice.usb;
import static android.hardware.usb.UsbPortStatus.DATA_ROLE_DEVICE; import static android.hardware.usb.UsbPortStatus.DATA_ROLE_DEVICE;
import static android.hardware.usb.UsbPortStatus.POWER_ROLE_SINK; import static android.hardware.usb.UsbPortStatus.POWER_ROLE_SINK;
import static android.net.ConnectivityManager.TETHERING_USB;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
@@ -31,7 +32,7 @@ import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.hardware.usb.UsbManager; import android.hardware.usb.UsbManager;
import android.net.ConnectivityManager; import android.net.TetheringManager;
import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentActivity;
import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceCategory;
@@ -73,7 +74,7 @@ public class UsbDetailsFunctionsControllerTest {
@Mock @Mock
private FragmentActivity mActivity; private FragmentActivity mActivity;
@Mock @Mock
private ConnectivityManager mConnectivityManager; private TetheringManager mTetheringManager;
@Before @Before
public void setUp() { public void setUp() {
@@ -89,7 +90,7 @@ public class UsbDetailsFunctionsControllerTest {
when(mFragment.getContext()).thenReturn(mContext); when(mFragment.getContext()).thenReturn(mContext);
when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager); when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
when(mFragment.getPreferenceScreen()).thenReturn(mScreen); when(mFragment.getPreferenceScreen()).thenReturn(mScreen);
when(mContext.getSystemService(ConnectivityManager.class)).thenReturn(mConnectivityManager); when(mContext.getSystemService(TetheringManager.class)).thenReturn(mTetheringManager);
mDetailsFunctionsController = new UsbDetailsFunctionsController(mContext, mFragment, mDetailsFunctionsController = new UsbDetailsFunctionsController(mContext, mFragment,
mUsbBackend); mUsbBackend);
@@ -245,8 +246,9 @@ public class UsbDetailsFunctionsControllerTest {
mDetailsFunctionsController.onRadioButtonClicked(mRadioButtonPreference); mDetailsFunctionsController.onRadioButtonClicked(mRadioButtonPreference);
verify(mConnectivityManager).startTethering(TETHERING_USB, true, verify(mTetheringManager).startTethering(eq(TetheringManager.TETHERING_USB),
mDetailsFunctionsController.mOnStartTetheringCallback); any(),
eq(mDetailsFunctionsController.mOnStartTetheringCallback));
assertThat(mDetailsFunctionsController.mPreviousFunction).isEqualTo( assertThat(mDetailsFunctionsController.mPreviousFunction).isEqualTo(
UsbManager.FUNCTION_MTP); UsbManager.FUNCTION_MTP);
} }
@@ -295,15 +297,16 @@ public class UsbDetailsFunctionsControllerTest {
mDetailsFunctionsController.onRadioButtonClicked(mRadioButtonPreference); mDetailsFunctionsController.onRadioButtonClicked(mRadioButtonPreference);
verify(mUsbBackend, never()).setCurrentFunctions(UsbManager.FUNCTION_PTP); verify(mUsbBackend, never()).setCurrentFunctions(UsbManager.FUNCTION_PTP);
verify(mConnectivityManager, never()).startTethering(TETHERING_USB, true, verify(mTetheringManager, never()).startTethering(eq(TetheringManager.TETHERING_USB),
mDetailsFunctionsController.mOnStartTetheringCallback); any(),
eq(mDetailsFunctionsController.mOnStartTetheringCallback));
} }
@Test @Test
public void onTetheringFailed_resetPreviousFunctions() { public void onTetheringFailed_resetPreviousFunctions() {
mDetailsFunctionsController.mPreviousFunction = UsbManager.FUNCTION_PTP; mDetailsFunctionsController.mPreviousFunction = UsbManager.FUNCTION_PTP;
mDetailsFunctionsController.mOnStartTetheringCallback.onTetheringFailed(); mDetailsFunctionsController.mOnStartTetheringCallback.onTetheringFailed(0);
verify(mUsbBackend).setCurrentFunctions(UsbManager.FUNCTION_PTP); verify(mUsbBackend).setCurrentFunctions(UsbManager.FUNCTION_PTP);
} }