diff options
7 files changed, 193 insertions, 30 deletions
diff --git a/src/com/android/settings/bluetooth/BluetoothFilesPreferenceController.java b/src/com/android/settings/bluetooth/BluetoothFilesPreferenceController.java index 1ecfed4251..6fbb84a45c 100644 --- a/src/com/android/settings/bluetooth/BluetoothFilesPreferenceController.java +++ b/src/com/android/settings/bluetooth/BluetoothFilesPreferenceController.java @@ -16,12 +16,14 @@ package com.android.settings.bluetooth; +import android.content.pm.PackageManager; import android.content.Context; import android.content.Intent; import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.core.BasePreferenceController; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.AbstractPreferenceController; @@ -30,7 +32,7 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; /** * Controller that shows received files */ -public class BluetoothFilesPreferenceController extends AbstractPreferenceController +public class BluetoothFilesPreferenceController extends BasePreferenceController implements PreferenceControllerMixin { private static final String TAG = "BluetoothFilesPrefCtrl"; @@ -47,13 +49,15 @@ public class BluetoothFilesPreferenceController extends AbstractPreferenceContro private MetricsFeatureProvider mMetricsFeatureProvider; public BluetoothFilesPreferenceController(Context context) { - super(context); + super(context, KEY_RECEIVED_FILES); mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider(); } @Override - public boolean isAvailable() { - return true; + public int getAvailabilityStatus() { + return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH) + ? AVAILABLE + : DISABLED_UNSUPPORTED; } @Override diff --git a/src/com/android/settings/bluetooth/BluetoothPairingDetail.java b/src/com/android/settings/bluetooth/BluetoothPairingDetail.java index 0e556c43d7..1a64f26268 100644 --- a/src/com/android/settings/bluetooth/BluetoothPairingDetail.java +++ b/src/com/android/settings/bluetooth/BluetoothPairingDetail.java @@ -23,6 +23,7 @@ import android.bluetooth.BluetoothDevice; import android.content.Context; import android.os.Bundle; import android.support.annotation.VisibleForTesting; +import android.util.Log; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; @@ -71,7 +72,10 @@ public class BluetoothPairingDetail extends DeviceListPreferenceFragment impleme @Override public void onStart() { super.onStart(); - + if (mLocalManager == null){ + Log.e(TAG, "Bluetooth is not supported on this device"); + return; + } updateBluetooth(); mAvailableDevicesCategory.setProgress(mLocalAdapter.isDiscovering()); } @@ -89,7 +93,10 @@ public class BluetoothPairingDetail extends DeviceListPreferenceFragment impleme @Override public void onStop() { super.onStop(); - + if (mLocalManager == null){ + Log.e(TAG, "Bluetooth is not supported on this device"); + return; + } // Make the device only visible to connected devices. mAlwaysDiscoverable.stop(); disableScanning(); diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceGroupController.java b/src/com/android/settings/connecteddevice/ConnectedDeviceGroupController.java index 3d5d0e58e8..c77a7358d6 100644 --- a/src/com/android/settings/connecteddevice/ConnectedDeviceGroupController.java +++ b/src/com/android/settings/connecteddevice/ConnectedDeviceGroupController.java @@ -15,15 +15,18 @@ */ package com.android.settings.connecteddevice; +import android.content.pm.PackageManager; import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceGroup; import android.support.v7.preference.PreferenceScreen; import com.android.settings.connecteddevice.usb.ConnectedUsbDeviceUpdater; +import com.android.settings.core.BasePreferenceController; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.bluetooth.BluetoothDeviceUpdater; import com.android.settings.bluetooth.ConnectedBluetoothDeviceUpdater; +import com.android.settings.search.ResultPayload; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.LifecycleObserver; @@ -35,7 +38,7 @@ import com.android.settingslib.core.lifecycle.events.OnStop; * Controller to maintain the {@link android.support.v7.preference.PreferenceGroup} for all * connected devices. It uses {@link DevicePreferenceCallback} to add/remove {@link Preference} */ -public class ConnectedDeviceGroupController extends AbstractPreferenceController +public class ConnectedDeviceGroupController extends BasePreferenceController implements PreferenceControllerMixin, LifecycleObserver, OnStart, OnStop, DevicePreferenceCallback { @@ -47,7 +50,7 @@ public class ConnectedDeviceGroupController extends AbstractPreferenceController private ConnectedUsbDeviceUpdater mConnectedUsbDeviceUpdater; public ConnectedDeviceGroupController(DashboardFragment fragment, Lifecycle lifecycle) { - super(fragment.getContext()); + super(fragment.getContext(), KEY); init(lifecycle, new ConnectedBluetoothDeviceUpdater(fragment, this), new ConnectedUsbDeviceUpdater(fragment, this)); } @@ -56,7 +59,7 @@ public class ConnectedDeviceGroupController extends AbstractPreferenceController ConnectedDeviceGroupController(DashboardFragment fragment, Lifecycle lifecycle, BluetoothDeviceUpdater bluetoothDeviceUpdater, ConnectedUsbDeviceUpdater connectedUsbDeviceUpdater) { - super(fragment.getContext()); + super(fragment.getContext(), KEY); init(lifecycle, bluetoothDeviceUpdater, connectedUsbDeviceUpdater); } @@ -75,17 +78,21 @@ public class ConnectedDeviceGroupController extends AbstractPreferenceController @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); - mPreferenceGroup = (PreferenceGroup) screen.findPreference(KEY); - mPreferenceGroup.setVisible(false); + if (isAvailable()) { + mPreferenceGroup = (PreferenceGroup) screen.findPreference(KEY); + mPreferenceGroup.setVisible(false); - mBluetoothDeviceUpdater.setPrefContext(screen.getContext()); - mBluetoothDeviceUpdater.forceUpdate(); - mConnectedUsbDeviceUpdater.initUsbPreference(screen.getContext()); + mBluetoothDeviceUpdater.setPrefContext(screen.getContext()); + mBluetoothDeviceUpdater.forceUpdate(); + mConnectedUsbDeviceUpdater.initUsbPreference(screen.getContext()); + } } @Override - public boolean isAvailable() { - return true; + public int getAvailabilityStatus() { + return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH) + ? AVAILABLE + : DISABLED_UNSUPPORTED; } @Override @@ -111,7 +118,7 @@ public class ConnectedDeviceGroupController extends AbstractPreferenceController private void init(Lifecycle lifecycle, BluetoothDeviceUpdater bluetoothDeviceUpdater, ConnectedUsbDeviceUpdater connectedUsbDeviceUpdater) { - if (lifecycle != null) { + if (lifecycle != null && isAvailable()) { lifecycle.addObserver(this); } mBluetoothDeviceUpdater = bluetoothDeviceUpdater; diff --git a/src/com/android/settings/connecteddevice/SavedDeviceGroupController.java b/src/com/android/settings/connecteddevice/SavedDeviceGroupController.java index 74450477dd..da38d9fddb 100644 --- a/src/com/android/settings/connecteddevice/SavedDeviceGroupController.java +++ b/src/com/android/settings/connecteddevice/SavedDeviceGroupController.java @@ -15,6 +15,7 @@ */ package com.android.settings.connecteddevice; +import android.content.pm.PackageManager; import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceGroup; @@ -22,6 +23,7 @@ import android.support.v7.preference.PreferenceScreen; import com.android.settings.bluetooth.BluetoothDeviceUpdater; import com.android.settings.bluetooth.SavedBluetoothDeviceUpdater; +import com.android.settings.core.BasePreferenceController; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.dashboard.DashboardFragment; import com.android.settingslib.core.AbstractPreferenceController; @@ -34,7 +36,7 @@ import com.android.settingslib.core.lifecycle.events.OnStop; * Controller to maintain the {@link PreferenceGroup} for all * saved devices. It uses {@link DevicePreferenceCallback} to add/remove {@link Preference} */ -public class SavedDeviceGroupController extends AbstractPreferenceController +public class SavedDeviceGroupController extends BasePreferenceController implements PreferenceControllerMixin, LifecycleObserver, OnStart, OnStop, DevicePreferenceCallback { @@ -45,14 +47,14 @@ public class SavedDeviceGroupController extends AbstractPreferenceController private BluetoothDeviceUpdater mBluetoothDeviceUpdater; public SavedDeviceGroupController(DashboardFragment fragment, Lifecycle lifecycle) { - super(fragment.getContext()); + super(fragment.getContext(), KEY); init(lifecycle, new SavedBluetoothDeviceUpdater(fragment, SavedDeviceGroupController.this)); } @VisibleForTesting SavedDeviceGroupController(DashboardFragment fragment, Lifecycle lifecycle, BluetoothDeviceUpdater bluetoothDeviceUpdater) { - super(fragment.getContext()); + super(fragment.getContext(), KEY); init(lifecycle, bluetoothDeviceUpdater); } @@ -68,15 +70,19 @@ public class SavedDeviceGroupController extends AbstractPreferenceController @Override public void displayPreference(PreferenceScreen screen) { - mPreferenceGroup = (PreferenceGroup) screen.findPreference(KEY); - mPreferenceGroup.setVisible(false); - mBluetoothDeviceUpdater.setPrefContext(screen.getContext()); - mBluetoothDeviceUpdater.forceUpdate(); + if (isAvailable()) { + mPreferenceGroup = (PreferenceGroup) screen.findPreference(KEY); + mPreferenceGroup.setVisible(false); + mBluetoothDeviceUpdater.setPrefContext(screen.getContext()); + mBluetoothDeviceUpdater.forceUpdate(); + } } @Override - public boolean isAvailable() { - return true; + public int getAvailabilityStatus() { + return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH) + ? AVAILABLE + : DISABLED_UNSUPPORTED; } @Override @@ -101,7 +107,7 @@ public class SavedDeviceGroupController extends AbstractPreferenceController } private void init(Lifecycle lifecycle, BluetoothDeviceUpdater bluetoothDeviceUpdater) { - if (lifecycle != null) { + if (lifecycle != null && isAvailable()) { lifecycle.addObserver(this); } mBluetoothDeviceUpdater = bluetoothDeviceUpdater; diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothFilesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothFilesPreferenceControllerTest.java index cdaf87637c..11688ba4f2 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothFilesPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothFilesPreferenceControllerTest.java @@ -18,6 +18,10 @@ package com.android.settings.bluetooth; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; + +import android.content.pm.PackageManager; import android.content.Context; import android.content.Intent; import android.os.Bundle; @@ -29,6 +33,7 @@ import com.android.settings.TestConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @@ -40,15 +45,18 @@ public class BluetoothFilesPreferenceControllerTest { private Context mContext; private BluetoothFilesPreferenceController mController; private Preference mPreference; + @Mock + private PackageManager mPackageManager; @Before public void setUp() { MockitoAnnotations.initMocks(this); - - mContext = RuntimeEnvironment.application; + mContext = spy(RuntimeEnvironment.application); mController = new BluetoothFilesPreferenceController(mContext); mPreference = new Preference(mContext); mPreference.setKey(BluetoothFilesPreferenceController.KEY_RECEIVED_FILES); + doReturn(mPackageManager).when(mContext).getPackageManager(); + doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); } @Test diff --git a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceGroupControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceGroupControllerTest.java index b478c4ed96..1fd03da4c2 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceGroupControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceGroupControllerTest.java @@ -15,6 +15,8 @@ */ package com.android.settings.connecteddevice; +import static com.android.settings.core.BasePreferenceController.DISABLED_UNSUPPORTED; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.anyString; @@ -24,6 +26,7 @@ import static org.mockito.Mockito.verify; import android.arch.lifecycle.LifecycleOwner; import android.content.Context; +import android.content.pm.PackageManager; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceGroup; import android.support.v7.preference.PreferenceManager; @@ -60,6 +63,8 @@ public class ConnectedDeviceGroupControllerTest { private PreferenceScreen mPreferenceScreen; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private PreferenceManager mPreferenceManager; + @Mock + private PackageManager mPackageManager; private PreferenceGroup mPreferenceGroup; private Context mContext; @@ -72,7 +77,7 @@ public class ConnectedDeviceGroupControllerTest { public void setUp() { MockitoAnnotations.initMocks(this); - mContext = RuntimeEnvironment.application; + mContext = spy(RuntimeEnvironment.application); mPreference = new Preference(mContext); mPreference.setKey(PREFERENCE_KEY_1); mLifecycleOwner = () -> mLifecycle; @@ -80,6 +85,8 @@ public class ConnectedDeviceGroupControllerTest { mPreferenceGroup = spy(new PreferenceScreen(mContext, null)); doReturn(mPreferenceManager).when(mPreferenceGroup).getPreferenceManager(); doReturn(mContext).when(mDashboardFragment).getContext(); + doReturn(mPackageManager).when(mContext).getPackageManager(); + doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); mConnectedDeviceGroupController = new ConnectedDeviceGroupController(mDashboardFragment, mLifecycle, mConnectedBluetoothDeviceUpdater, mConnectedUsbDeviceUpdater); @@ -136,4 +143,12 @@ public class ConnectedDeviceGroupControllerTest { verify(mConnectedBluetoothDeviceUpdater).unregisterCallback(); verify(mConnectedUsbDeviceUpdater).unregisterCallback(); } + + @Test + public void testGetAvailabilityStatus_noBluetoothFeature_returnUnSupported() { + doReturn(false).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); + + assertThat(mConnectedDeviceGroupController.getAvailabilityStatus()).isEqualTo( + DISABLED_UNSUPPORTED); + } } diff --git a/tests/robotests/src/com/android/settings/connecteddevice/SavedDeviceGroupControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/SavedDeviceGroupControllerTest.java new file mode 100644 index 0000000000..723b304c56 --- /dev/null +++ b/tests/robotests/src/com/android/settings/connecteddevice/SavedDeviceGroupControllerTest.java @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ +package com.android.settings.connecteddevice; + +import static android.arch.lifecycle.Lifecycle.Event.ON_START; + +import static com.android.settings.core.BasePreferenceController.AVAILABLE; +import static com.android.settings.core.BasePreferenceController.DISABLED_UNSUPPORTED; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; + +import android.arch.lifecycle.LifecycleOwner; +import android.content.Context; +import android.content.pm.PackageManager; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceGroup; +import android.support.v7.preference.PreferenceManager; +import android.support.v7.preference.PreferenceScreen; + +import com.android.settings.TestConfig; +import com.android.settings.bluetooth.BluetoothDeviceUpdater; +import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settingslib.core.lifecycle.Lifecycle; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class SavedDeviceGroupControllerTest { + private static final String PREFERENCE_KEY_1 = "pref_key_1"; + + @Mock + private DashboardFragment mDashboardFragment; + @Mock + private BluetoothDeviceUpdater mBluetoothDeviceUpdater; + @Mock + private PreferenceScreen mPreferenceScreen; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private PreferenceManager mPreferenceManager; + @Mock + private PackageManager mPackageManager; + + private PreferenceGroup mPreferenceGroup; + private Context mContext; + private Preference mPreference; + private SavedDeviceGroupController mConnectedDeviceGroupController; + private LifecycleOwner mLifecycleOwner; + private Lifecycle mLifecycle; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + mContext = spy(RuntimeEnvironment.application); + mLifecycleOwner = () -> mLifecycle; + mLifecycle = new Lifecycle(mLifecycleOwner); + + doReturn(mContext).when(mDashboardFragment).getContext(); + doReturn(mPackageManager).when(mContext).getPackageManager(); + } + + @Test + public void constructor_noBluetoothFeature_shouldNotRegisterCallback() { + doReturn(false).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); + + mConnectedDeviceGroupController = new SavedDeviceGroupController(mDashboardFragment, + mLifecycle, mBluetoothDeviceUpdater); + + assertThat(mConnectedDeviceGroupController.getAvailabilityStatus()).isEqualTo( + DISABLED_UNSUPPORTED); + + mLifecycle.handleLifecycleEvent(ON_START); + verify(mBluetoothDeviceUpdater, never()).registerCallback(); + } + + + @Test + public void constructor_hasBluetoothFeature_shouldRegisterCallback() { + doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); + + mConnectedDeviceGroupController = new SavedDeviceGroupController(mDashboardFragment, + mLifecycle, mBluetoothDeviceUpdater); + + assertThat(mConnectedDeviceGroupController.getAvailabilityStatus()).isEqualTo( + AVAILABLE); + + mLifecycle.handleLifecycleEvent(ON_START); + verify(mBluetoothDeviceUpdater).registerCallback(); + } +} |