diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java index 0e935c0a5e0..31055cca057 100644 --- a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java +++ b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java @@ -109,6 +109,10 @@ public abstract class BluetoothDeviceUpdater implements BluetoothCallback, * Force to update the list of bluetooth devices */ public void forceUpdate() { + if (mLocalManager == null) { + Log.e(TAG, "forceUpdate() Bluetooth is not supported on this device"); + return; + } if (BluetoothAdapter.getDefaultAdapter().isEnabled()) { final Collection cachedDevices = mLocalManager.getCachedDeviceManager().getCachedDevicesCopy(); @@ -121,6 +125,10 @@ public abstract class BluetoothDeviceUpdater implements BluetoothCallback, } public void removeAllDevicesFromPreference() { + if (mLocalManager == null) { + Log.e(TAG, "removeAllDevicesFromPreference() BT is not supported on this device"); + return; + } final Collection cachedDevices = mLocalManager.getCachedDeviceManager().getCachedDevicesCopy(); for (CachedBluetoothDevice cachedBluetoothDevice : cachedDevices) { diff --git a/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java b/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java index be822845527..cac46b0d0c0 100644 --- a/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java +++ b/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java @@ -83,9 +83,11 @@ public class AvailableMediaDeviceGroupController extends BasePreferenceControlle @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); + + mPreferenceGroup = screen.findPreference(KEY); + mPreferenceGroup.setVisible(false); + if (isAvailable()) { - mPreferenceGroup = screen.findPreference(KEY); - mPreferenceGroup.setVisible(false); updateTitle(); mBluetoothDeviceUpdater.setPrefContext(screen.getContext()); mBluetoothDeviceUpdater.forceUpdate(); diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceGroupController.java b/src/com/android/settings/connecteddevice/ConnectedDeviceGroupController.java index aa83e67ae5f..957737a118f 100644 --- a/src/com/android/settings/connecteddevice/ConnectedDeviceGroupController.java +++ b/src/com/android/settings/connecteddevice/ConnectedDeviceGroupController.java @@ -73,10 +73,11 @@ public class ConnectedDeviceGroupController extends BasePreferenceController @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); - if (isAvailable()) { - mPreferenceGroup = screen.findPreference(KEY); - mPreferenceGroup.setVisible(false); + mPreferenceGroup = screen.findPreference(KEY); + mPreferenceGroup.setVisible(false); + + if (isAvailable()) { final Context context = screen.getContext(); mBluetoothDeviceUpdater.setPrefContext(context); mBluetoothDeviceUpdater.forceUpdate(); @@ -88,7 +89,11 @@ public class ConnectedDeviceGroupController extends BasePreferenceController @Override public int getAvailabilityStatus() { - return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH) + final PackageManager packageManager = mContext.getPackageManager(); + return (packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH) + || packageManager.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY) + || packageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST) + || mConnectedDockUpdater != null) ? AVAILABLE_UNSEARCHABLE : UNSUPPORTED_ON_DEVICE; } diff --git a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java index 45f128d9c25..5b23d69cf91 100644 --- a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java +++ b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java @@ -52,7 +52,8 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc @Override public int getAvailabilityStatus() { - return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH) + return (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH) + || mSavedDockUpdater != null) ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } diff --git a/src/com/android/settings/connecteddevice/SavedDeviceGroupController.java b/src/com/android/settings/connecteddevice/SavedDeviceGroupController.java index e1dc7501aba..062fa2db792 100644 --- a/src/com/android/settings/connecteddevice/SavedDeviceGroupController.java +++ b/src/com/android/settings/connecteddevice/SavedDeviceGroupController.java @@ -73,10 +73,10 @@ public class SavedDeviceGroupController extends BasePreferenceController @Override public void displayPreference(PreferenceScreen screen) { - if (isAvailable()) { - mPreferenceGroup = screen.findPreference(KEY); - mPreferenceGroup.setVisible(false); + mPreferenceGroup = screen.findPreference(KEY); + mPreferenceGroup.setVisible(false); + if (isAvailable()) { final Context context = screen.getContext(); mBluetoothDeviceUpdater.setPrefContext(context); mBluetoothDeviceUpdater.forceUpdate(); @@ -87,7 +87,8 @@ public class SavedDeviceGroupController extends BasePreferenceController @Override public int getAvailabilityStatus() { - return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH) + return (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH) + || mSavedDockUpdater != null) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } diff --git a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceGroupControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceGroupControllerTest.java index 23754a05d36..946d639e909 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceGroupControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceGroupControllerTest.java @@ -88,6 +88,7 @@ public class ConnectedDeviceGroupControllerTest { mPreferenceGroup = spy(new PreferenceScreen(mContext, null)); when(mPreferenceGroup.getPreferenceManager()).thenReturn(mPreferenceManager); doReturn(mContext).when(mDashboardFragment).getContext(); + mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, true); mConnectedDeviceGroupController = new ConnectedDeviceGroupController(mContext); mConnectedDeviceGroupController.init(mConnectedBluetoothDeviceUpdater, @@ -153,8 +154,12 @@ public class ConnectedDeviceGroupControllerTest { } @Test - public void getAvailabilityStatus_noBluetoothFeature_returnUnSupported() { + public void getAvailabilityStatus_noBluetoothUsbDockFeature_returnUnSupported() { mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, false); + mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_ACCESSORY, false); + mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_HOST, false); + mConnectedDeviceGroupController.init(mConnectedBluetoothDeviceUpdater, + mConnectedUsbDeviceUpdater, null); assertThat(mConnectedDeviceGroupController.getAvailabilityStatus()).isEqualTo( UNSUPPORTED_ON_DEVICE); @@ -163,8 +168,37 @@ public class ConnectedDeviceGroupControllerTest { @Test public void getAvailabilityStatus_BluetoothFeature_returnSupported() { mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, true); + mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_ACCESSORY, false); + mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_HOST, false); + mConnectedDeviceGroupController.init(mConnectedBluetoothDeviceUpdater, + mConnectedUsbDeviceUpdater, null); assertThat(mConnectedDeviceGroupController.getAvailabilityStatus()).isEqualTo( AVAILABLE_UNSEARCHABLE); } + + @Test + public void getAvailabilityStatus_haveUsbFeature_returnSupported() { + mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, false); + mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_ACCESSORY, false); + mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_HOST, true); + mConnectedDeviceGroupController.init(mConnectedBluetoothDeviceUpdater, + mConnectedUsbDeviceUpdater, null); + + assertThat(mConnectedDeviceGroupController.getAvailabilityStatus()).isEqualTo( + AVAILABLE_UNSEARCHABLE); + } + + @Test + public void getAvailabilityStatus_haveDockFeature_returnSupported() { + mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, false); + mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_ACCESSORY, false); + mPackageManager.setSystemFeature(PackageManager.FEATURE_USB_HOST, false); + mConnectedDeviceGroupController.init(mConnectedBluetoothDeviceUpdater, + mConnectedUsbDeviceUpdater, mConnectedDockUpdater); + + assertThat(mConnectedDeviceGroupController.getAvailabilityStatus()).isEqualTo( + AVAILABLE_UNSEARCHABLE); + } + } diff --git a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java index 48f734d0e72..90cbea9e5f1 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java @@ -95,18 +95,31 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { } @Test - public void getAvailabilityStatus_noBluetoothFeature_returnUnSupported() { + public void getAvailabilityStatus_noBluetoothDockFeature_returnUnSupported() { doReturn(false).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); + mPreConnectedDeviceController.setSavedDockUpdater(null); + assertThat(mPreConnectedDeviceController.getAvailabilityStatus()).isEqualTo( CONDITIONALLY_UNAVAILABLE); } + @Test public void getAvailabilityStatus_hasBluetoothFeature_returnSupported() { doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); + mPreConnectedDeviceController.setSavedDockUpdater(null); + assertThat(mPreConnectedDeviceController.getAvailabilityStatus()).isEqualTo( AVAILABLE); } + @Test + public void getAvailabilityStatus_haveDockFeature_returnSupported() { + doReturn(false).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); + + assertThat(mPreConnectedDeviceController.getAvailabilityStatus()).isEqualTo( + AVAILABLE); + } + @Test public void onDeviceAdded_addDevicePreference_displayIt() { mPreConnectedDeviceController.onDeviceAdded(new Preference(mContext)); diff --git a/tests/robotests/src/com/android/settings/connecteddevice/SavedDeviceGroupControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/SavedDeviceGroupControllerTest.java index c386719e23b..6c6cf472c18 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/SavedDeviceGroupControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/SavedDeviceGroupControllerTest.java @@ -23,6 +23,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.content.Context; import android.content.pm.PackageManager; @@ -81,6 +82,7 @@ public class SavedDeviceGroupControllerTest { verify(mBluetoothDeviceUpdater).registerCallback(); verify(mSavedDockUpdater).registerCallback(); } + @Test public void testUnregister() { // unregister the callback in onStop() @@ -88,16 +90,30 @@ public class SavedDeviceGroupControllerTest { verify(mBluetoothDeviceUpdater).unregisterCallback(); verify(mSavedDockUpdater).unregisterCallback(); } + @Test - public void testGetAvailabilityStatus_noBluetoothFeature_returnUnSupported() { + public void testGetAvailabilityStatus_noBluetoothDockFeature_returnUnSupported() { doReturn(false).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); + mSavedDeviceGroupController.setSavedDockUpdater(null); + assertThat(mSavedDeviceGroupController.getAvailabilityStatus()).isEqualTo( UNSUPPORTED_ON_DEVICE); } + @Test public void testGetAvailabilityStatus_BluetoothFeature_returnSupported() { doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); + mSavedDeviceGroupController.setSavedDockUpdater(null); + assertThat(mSavedDeviceGroupController.getAvailabilityStatus()).isEqualTo( AVAILABLE); } + + @Test + public void getAvailabilityStatus_haveDockFeature_returnSupported() { + when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)).thenReturn(false); + + assertThat(mSavedDeviceGroupController.getAvailabilityStatus()).isEqualTo( + AVAILABLE); + } }