diff --git a/src/com/android/settings/connecteddevice/usb/UsbBackend.java b/src/com/android/settings/connecteddevice/usb/UsbBackend.java index 4773aca814c..244818fe163 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbBackend.java +++ b/src/com/android/settings/connecteddevice/usb/UsbBackend.java @@ -28,7 +28,7 @@ import android.content.pm.PackageManager; import android.hardware.usb.UsbManager; import android.hardware.usb.UsbPort; import android.hardware.usb.UsbPortStatus; -import android.net.ConnectivityManager; +import android.net.TetheringManager; import android.os.UserHandle; import android.os.UserManager; @@ -74,9 +74,8 @@ public class UsbBackend { mIsAdminUser = userManager.isAdminUser(); mMidiSupported = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI); - ConnectivityManager cm = - (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - mTetheringSupported = cm.isTetheringSupported(); + final TetheringManager tm = context.getSystemService(TetheringManager.class); + mTetheringSupported = tm.isTetheringSupported(); updatePorts(); } diff --git a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java index 12e978ff349..668ec3f2ce2 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java +++ b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java @@ -16,14 +16,17 @@ 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.content.Context; import android.graphics.drawable.Drawable; import android.hardware.usb.UsbManager; -import android.net.ConnectivityManager; +import android.net.TetheringManager; import android.os.Bundle; +import android.os.Handler; +import android.os.HandlerExecutor; +import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.preference.PreferenceScreen; @@ -43,10 +46,13 @@ import java.util.List; * Provides options for selecting the default USB mode. */ public class UsbDefaultFragment extends RadioButtonPickerFragment { + + private static final String TAG = "UsbDefaultFragment"; + @VisibleForTesting UsbBackend mUsbBackend; @VisibleForTesting - ConnectivityManager mConnectivityManager; + TetheringManager mTetheringManager; @VisibleForTesting OnStartTetheringCallback mOnStartTetheringCallback = new OnStartTetheringCallback(); @VisibleForTesting @@ -57,6 +63,7 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment { boolean mIsStartTethering = false; private UsbConnectionBroadcastReceiver mUsbReceiver; + private Handler mHandler = new Handler(); @VisibleForTesting UsbConnectionBroadcastReceiver.UsbConnectionListener mUsbConnectionListener = @@ -71,7 +78,7 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment { public void onAttach(Context context) { super.onAttach(context); mUsbBackend = new UsbBackend(context); - mConnectivityManager = context.getSystemService(ConnectivityManager.class); + mTetheringManager = context.getSystemService(TetheringManager.class); mUsbReceiver = new UsbConnectionBroadcastReceiver(context, mUsbConnectionListener, mUsbBackend); getSettingsLifecycle().addObserver(mUsbReceiver); @@ -138,9 +145,9 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment { if (!Utils.isMonkeyRunning()) { if (functions == UsbManager.FUNCTION_RNDIS) { // We need to have entitlement check for usb tethering, so use API in - // ConnectivityManager. + // TetheringManager. mIsStartTethering = true; - mConnectivityManager.startTethering(TETHERING_USB, true /* showProvisioningUi */, + mTetheringManager.startTethering(TETHERING_USB, new HandlerExecutor(mHandler), mOnStartTetheringCallback); } else { mIsStartTethering = false; @@ -159,20 +166,19 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment { } @VisibleForTesting - final class OnStartTetheringCallback extends - ConnectivityManager.OnStartTetheringCallback { + final class OnStartTetheringCallback implements + TetheringManager.StartTetheringCallback { @Override public void onTetheringStarted() { - super.onTetheringStarted(); // Set default usb functions again to make internal data persistent mCurrentFunctions = UsbManager.FUNCTION_RNDIS; mUsbBackend.setDefaultUsbFunctions(UsbManager.FUNCTION_RNDIS); } @Override - public void onTetheringFailed() { - super.onTetheringFailed(); + public void onTetheringFailed(int error) { + Log.w(TAG, "onTetheringFailed() error : " + error); mUsbBackend.setDefaultUsbFunctions(mPreviousFunctions); updateCandidates(); } diff --git a/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java b/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java index 99e9d50be32..40626fbaf04 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java +++ b/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java @@ -17,11 +17,12 @@ package com.android.settings.connecteddevice.usb; import static android.hardware.usb.UsbPortStatus.DATA_ROLE_DEVICE; -import static android.net.ConnectivityManager.TETHERING_USB; import android.content.Context; 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 androidx.annotation.VisibleForTesting; @@ -55,7 +56,8 @@ public class UsbDetailsFunctionsController extends UsbDetailsController } private PreferenceCategory mProfilesContainer; - private ConnectivityManager mConnectivityManager; + private TetheringManager mTetheringManager; + private Handler mHandler = new Handler(); @VisibleForTesting OnStartTetheringCallback mOnStartTetheringCallback; @VisibleForTesting @@ -64,7 +66,7 @@ public class UsbDetailsFunctionsController extends UsbDetailsController public UsbDetailsFunctionsController(Context context, UsbDetailsFragment fragment, UsbBackend backend) { super(context, fragment, backend); - mConnectivityManager = context.getSystemService(ConnectivityManager.class); + mTetheringManager = context.getSystemService(TetheringManager.class); mOnStartTetheringCallback = new OnStartTetheringCallback(); mPreviousFunction = mUsbBackend.getCurrentFunctions(); } @@ -130,7 +132,7 @@ public class UsbDetailsFunctionsController extends UsbDetailsController + UsbManager.usbFunctionsToString(previousFunction)); } if (function != previousFunction && !Utils.isMonkeyRunning() - && !shouldIgnoreClickEvent(function, previousFunction)) { + && !isClickEventIgnored(function, previousFunction)) { mPreviousFunction = previousFunction; //Update the UI in advance to make it looks smooth @@ -144,8 +146,9 @@ public class UsbDetailsFunctionsController extends UsbDetailsController if (function == UsbManager.FUNCTION_RNDIS) { // We need to have entitlement check for usb tethering, so use API in - // ConnectivityManager. - mConnectivityManager.startTethering(TETHERING_USB, true /* showProvisioningUi */, + // TetheringManager. + mTetheringManager.startTethering( + TetheringManager.TETHERING_USB, new HandlerExecutor(mHandler), mOnStartTetheringCallback); } else { 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; } @@ -172,12 +175,11 @@ public class UsbDetailsFunctionsController extends UsbDetailsController } @VisibleForTesting - final class OnStartTetheringCallback extends - ConnectivityManager.OnStartTetheringCallback { + final class OnStartTetheringCallback implements TetheringManager.StartTetheringCallback { @Override - public void onTetheringFailed() { - super.onTetheringFailed(); + public void onTetheringFailed(int error) { + Log.w(TAG, "onTetheringFailed() error : " + error); mUsbBackend.setCurrentFunctions(mPreviousFunction); } } diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbBackendTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbBackendTest.java index b816a187bd4..b3f732f9ed3 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbBackendTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbBackendTest.java @@ -34,7 +34,7 @@ import android.content.pm.PackageManager; import android.hardware.usb.UsbManager; import android.hardware.usb.UsbPort; import android.hardware.usb.UsbPortStatus; -import android.net.ConnectivityManager; +import android.net.TetheringManager; import android.os.UserHandle; import android.os.UserManager; @@ -57,7 +57,7 @@ public class UsbBackendTest { @Mock private UserManager mUserManager; @Mock - private ConnectivityManager mConnectivityManager; + private TetheringManager mTetheringManager; @Mock private UsbPort mUsbPort; @Mock @@ -69,8 +69,8 @@ public class UsbBackendTest { when(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI)) .thenReturn(true); when((Object) mContext.getSystemService(UsbManager.class)).thenReturn(mUsbManager); - when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE)) - .thenReturn(mConnectivityManager); + when((Object) mContext.getSystemService( + TetheringManager.class)).thenReturn(mTetheringManager); when(mUsbManager.getPorts()).thenReturn(Collections.singletonList(mUsbPort)); when(mUsbPortStatus.isConnected()).thenReturn(true); when(mUsbPort.getStatus()).thenReturn(mUsbPortStatus); 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 4afe22a7a8d..c751e98d965 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java @@ -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.POWER_ROLE_SINK; -import static android.net.ConnectivityManager.TETHERING_USB; 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.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -30,7 +31,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.hardware.usb.UsbManager; -import android.net.ConnectivityManager; +import android.net.TetheringManager; import androidx.preference.PreferenceScreen; @@ -50,7 +51,7 @@ public class UsbDefaultFragmentTest { @Mock private UsbBackend mUsbBackend; @Mock - private ConnectivityManager mConnectivityManager; + private TetheringManager mTetheringManager; private UsbDefaultFragment mFragment; @@ -59,7 +60,7 @@ public class UsbDefaultFragmentTest { MockitoAnnotations.initMocks(this); mFragment = new TestFragment(); mFragment.mUsbBackend = mUsbBackend; - mFragment.mConnectivityManager = mConnectivityManager; + mFragment.mTetheringManager = mTetheringManager; } @Test @@ -136,8 +137,9 @@ public class UsbDefaultFragmentTest { mFragment.setDefaultKey(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_RNDIS)); - verify(mConnectivityManager).startTethering(TETHERING_USB, true, - mFragment.mOnStartTetheringCallback); + verify(mTetheringManager).startTethering(eq(TetheringManager.TETHERING_USB), + any(), + eq(mFragment.mOnStartTetheringCallback)); assertThat(mFragment.mPreviousFunctions).isEqualTo( UsbManager.FUNCTION_MTP); } diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java index 3ea27562eb8..9118645ce61 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java @@ -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.POWER_ROLE_SINK; -import static android.net.ConnectivityManager.TETHERING_USB; 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.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -31,7 +32,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.hardware.usb.UsbManager; -import android.net.ConnectivityManager; +import android.net.TetheringManager; import androidx.fragment.app.FragmentActivity; import androidx.preference.PreferenceCategory; @@ -73,7 +74,7 @@ public class UsbDetailsFunctionsControllerTest { @Mock private FragmentActivity mActivity; @Mock - private ConnectivityManager mConnectivityManager; + private TetheringManager mTetheringManager; @Before public void setUp() { @@ -89,7 +90,7 @@ public class UsbDetailsFunctionsControllerTest { when(mFragment.getContext()).thenReturn(mContext); when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager); when(mFragment.getPreferenceScreen()).thenReturn(mScreen); - when(mContext.getSystemService(ConnectivityManager.class)).thenReturn(mConnectivityManager); + when(mContext.getSystemService(TetheringManager.class)).thenReturn(mTetheringManager); mDetailsFunctionsController = new UsbDetailsFunctionsController(mContext, mFragment, mUsbBackend); @@ -245,8 +246,9 @@ public class UsbDetailsFunctionsControllerTest { mDetailsFunctionsController.onRadioButtonClicked(mRadioButtonPreference); - verify(mConnectivityManager).startTethering(TETHERING_USB, true, - mDetailsFunctionsController.mOnStartTetheringCallback); + verify(mTetheringManager).startTethering(eq(TetheringManager.TETHERING_USB), + any(), + eq(mDetailsFunctionsController.mOnStartTetheringCallback)); assertThat(mDetailsFunctionsController.mPreviousFunction).isEqualTo( UsbManager.FUNCTION_MTP); } @@ -295,15 +297,16 @@ public class UsbDetailsFunctionsControllerTest { mDetailsFunctionsController.onRadioButtonClicked(mRadioButtonPreference); verify(mUsbBackend, never()).setCurrentFunctions(UsbManager.FUNCTION_PTP); - verify(mConnectivityManager, never()).startTethering(TETHERING_USB, true, - mDetailsFunctionsController.mOnStartTetheringCallback); + verify(mTetheringManager, never()).startTethering(eq(TetheringManager.TETHERING_USB), + any(), + eq(mDetailsFunctionsController.mOnStartTetheringCallback)); } @Test public void onTetheringFailed_resetPreviousFunctions() { mDetailsFunctionsController.mPreviousFunction = UsbManager.FUNCTION_PTP; - mDetailsFunctionsController.mOnStartTetheringCallback.onTetheringFailed(); + mDetailsFunctionsController.mOnStartTetheringCallback.onTetheringFailed(0); verify(mUsbBackend).setCurrentFunctions(UsbManager.FUNCTION_PTP); }