From 3f5d58b9818e35a2cc476dfaab7a17e2f19a3c90 Mon Sep 17 00:00:00 2001 From: Ben Lin Date: Fri, 17 Nov 2017 16:22:50 -0800 Subject: [PATCH] Do not add SelectUsbConfigPreferenceController if USB is disabled. Bug: 69479572 Test: Local cherry-picked to master-arc-dev, and deployed cheets_x86 to a ChromeOS device. Developer Options show up. Updated SelectUsbConfigPreferenceControllerTest. Change-Id: I8c6a4501849e67c92f50b8a3781260e9dbcdaf20 --- .../SelectUsbConfigPreferenceController.java | 9 ++++++ ...lectUsbConfigPreferenceControllerTest.java | 32 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/com/android/settings/development/SelectUsbConfigPreferenceController.java b/src/com/android/settings/development/SelectUsbConfigPreferenceController.java index 59ac23f04a8..13470643bfa 100644 --- a/src/com/android/settings/development/SelectUsbConfigPreferenceController.java +++ b/src/com/android/settings/development/SelectUsbConfigPreferenceController.java @@ -20,6 +20,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.PackageManager; import android.hardware.usb.UsbManager; import android.os.Bundle; import android.support.annotation.VisibleForTesting; @@ -104,6 +105,14 @@ public class SelectUsbConfigPreferenceController extends mContext.unregisterReceiver(mUsbReceiver); } + @Override + public boolean isAvailable() { + final PackageManager packageManager = mContext.getPackageManager(); + + return packageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST) + || packageManager.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY); + } + @Override protected void onDeveloperOptionsSwitchEnabled() { mPreference.setEnabled(true); diff --git a/tests/robotests/src/com/android/settings/development/SelectUsbConfigPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/SelectUsbConfigPreferenceControllerTest.java index 71260f33ba2..9a08a51fe77 100644 --- a/tests/robotests/src/com/android/settings/development/SelectUsbConfigPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/SelectUsbConfigPreferenceControllerTest.java @@ -19,6 +19,9 @@ package com.android.settings.development; import static android.arch.lifecycle.Lifecycle.Event.ON_CREATE; import static android.arch.lifecycle.Lifecycle.Event.ON_DESTROY; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; + import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyString; @@ -29,6 +32,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; +import android.content.pm.PackageManager; import android.hardware.usb.UsbManager; import android.support.v7.preference.ListPreference; import android.support.v7.preference.PreferenceScreen; @@ -42,6 +46,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @@ -56,6 +61,8 @@ public class SelectUsbConfigPreferenceControllerTest { private PreferenceScreen mScreen; @Mock private UsbManager mUsbManager; + @Mock + private PackageManager mPackageManager; private Context mContext; private Lifecycle mLifecycle; @@ -80,6 +87,7 @@ public class SelectUsbConfigPreferenceControllerTest { mLifecycle = new Lifecycle(() -> mLifecycle); mContext = spy(RuntimeEnvironment.application); doReturn(mUsbManager).when(mContext).getSystemService(Context.USB_SERVICE); + doReturn(mPackageManager).when(mContext).getPackageManager(); mValues = mContext.getResources().getStringArray(R.array.usb_configuration_values); mSummaries = mContext.getResources().getStringArray(R.array.usb_configuration_titles); mController = spy(new SelectUsbConfigPreferenceController(mContext, mLifecycle)); @@ -97,6 +105,30 @@ public class SelectUsbConfigPreferenceControllerTest { verify(mController).setCurrentFunction(mValues[0], false /* usb data unlock */); } + @Test + public void onUsbAccessoryAndHostDisabled_shouldNotBeAvailable() { + when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)).thenReturn(false); + when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY)).thenReturn( + false); + assertFalse(mController.isAvailable()); + } + + @Test + public void onUsbHostEnabled_shouldBeAvailable() { + when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)).thenReturn(true); + when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY)).thenReturn( + false); + assertTrue(mController.isAvailable()); + } + + @Test + public void onUsbAccessoryEnabled_shouldBeAvailable() { + when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)).thenReturn(false); + when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY)).thenReturn( + true); + assertTrue(mController.isAvailable()); + } + @Test public void onPreferenceChange_setMtp_shouldEnableMtp() { when(mUsbManager.isFunctionEnabled(mValues[1])).thenReturn(true);