diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java index dece0ccccf6..69708e7a77b 100644 --- a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java +++ b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java @@ -15,6 +15,7 @@ */ package com.android.settings.bluetooth; +import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.os.Bundle; @@ -115,16 +116,30 @@ public abstract class BluetoothDeviceUpdater implements BluetoothCallback, * Force to update the list of bluetooth devices */ public void forceUpdate() { - Collection cachedDevices = + if (BluetoothAdapter.getDefaultAdapter().isEnabled()) { + final Collection cachedDevices = + mLocalManager.getCachedDeviceManager().getCachedDevicesCopy(); + for (CachedBluetoothDevice cachedBluetoothDevice : cachedDevices) { + update(cachedBluetoothDevice); + } + } + } + + public void removeAllDevicesFromPreference() { + final Collection cachedDevices = mLocalManager.getCachedDeviceManager().getCachedDevicesCopy(); for (CachedBluetoothDevice cachedBluetoothDevice : cachedDevices) { - update(cachedBluetoothDevice); + removePreference(cachedBluetoothDevice); } } @Override public void onBluetoothStateChanged(int bluetoothState) { - forceUpdate(); + if (BluetoothAdapter.STATE_ON == bluetoothState) { + forceUpdate(); + } else if (BluetoothAdapter.STATE_OFF == bluetoothState) { + removeAllDevicesFromPreference(); + } } @Override diff --git a/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java index cf73d41eb78..e676cf4b041 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java @@ -22,6 +22,7 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.content.Context; @@ -31,6 +32,7 @@ import com.android.settings.connecteddevice.DevicePreferenceCallback; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.ShadowAudioManager; +import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; import com.android.settingslib.bluetooth.HeadsetProfile; @@ -44,12 +46,13 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.shadow.api.Shadow; import java.util.ArrayList; import java.util.Collection; @RunWith(SettingsRobolectricTestRunner.class) -@Config(shadows = {ShadowAudioManager.class}) +@Config(shadows = {ShadowAudioManager.class, ShadowBluetoothAdapter.class}) public class AvailableMediaBluetoothDeviceUpdaterTest { @Mock private DashboardFragment mDashboardFragment; @@ -73,12 +76,15 @@ public class AvailableMediaBluetoothDeviceUpdaterTest { private Collection cachedDevices; private ShadowAudioManager mShadowAudioManager; private BluetoothDevicePreference mPreference; + private ShadowBluetoothAdapter mShadowBluetoothAdapter; @Before public void setUp() { MockitoAnnotations.initMocks(this); mShadowAudioManager = ShadowAudioManager.getShadow(); + mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter()); + mShadowBluetoothAdapter.setEnabled(true); mContext = RuntimeEnvironment.application; doReturn(mContext).when(mDashboardFragment).getContext(); cachedDevices = diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java index 9f81711c88c..f338e3668d2 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java @@ -22,15 +22,19 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.content.Intent; +import androidx.preference.Preference; import com.android.settings.SettingsActivity; import com.android.settings.connecteddevice.DevicePreferenceCallback; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; import com.android.settingslib.bluetooth.CachedBluetoothDevice; +import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; import com.android.settingslib.bluetooth.LocalBluetoothManager; import org.junit.Before; @@ -40,10 +44,14 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.shadow.api.Shadow; -import androidx.preference.Preference; +import java.util.ArrayList; +import java.util.List; @RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = {ShadowBluetoothAdapter.class}) public class BluetoothDeviceUpdaterTest { @Mock @@ -58,18 +66,26 @@ public class BluetoothDeviceUpdaterTest { private SettingsActivity mSettingsActivity; @Mock private LocalBluetoothManager mLocalManager; + @Mock + private CachedBluetoothDeviceManager mCachedDeviceManager; private Context mContext; private BluetoothDeviceUpdater mBluetoothDeviceUpdater; private BluetoothDevicePreference mPreference; + private ShadowBluetoothAdapter mShadowBluetoothAdapter; + private List mCachedDevices = new ArrayList(); @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; + mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter()); + mCachedDevices.add(mCachedBluetoothDevice); doReturn(mContext).when(mDashboardFragment).getContext(); when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice); + when(mLocalManager.getCachedDeviceManager()).thenReturn(mCachedDeviceManager); + when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(mCachedDevices); mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, false); mBluetoothDeviceUpdater = @@ -171,4 +187,38 @@ public class BluetoothDeviceUpdaterTest { // Shouldn't crash mBluetoothDeviceUpdater.unregisterCallback(); } + + @Test + public void forceUpdate_bluetoothDisabled_doNothing() { + mShadowBluetoothAdapter.setEnabled(false); + mBluetoothDeviceUpdater.forceUpdate(); + + verify(mDevicePreferenceCallback, never()).onDeviceAdded(any(Preference.class)); + } + + @Test + public void forceUpdate_bluetoothEnabled_addPreference() { + mShadowBluetoothAdapter.setEnabled(true); + mBluetoothDeviceUpdater.forceUpdate(); + + verify(mDevicePreferenceCallback).onDeviceAdded(any(Preference.class)); + } + + @Test + public void onBluetoothStateChanged_bluetoothStateIsOn_forceUpdate() { + mShadowBluetoothAdapter.setEnabled(true); + mBluetoothDeviceUpdater.onBluetoothStateChanged(BluetoothAdapter.STATE_ON); + + verify(mDevicePreferenceCallback).onDeviceAdded(any(Preference.class)); + } + + @Test + public void onBluetoothStateChanged_bluetoothStateIsOff_removeAllDevicesFromPreference() { + mBluetoothDeviceUpdater.mPreferenceMap.put(mBluetoothDevice, mPreference); + + mBluetoothDeviceUpdater.onBluetoothStateChanged(BluetoothAdapter.STATE_OFF); + + verify(mDevicePreferenceCallback).onDeviceRemoved(mPreference); + assertThat(mBluetoothDeviceUpdater.mPreferenceMap.containsKey(mBluetoothDevice)).isFalse(); + } } diff --git a/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java index d94a8a7cf0a..ece71d73d9c 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java @@ -23,6 +23,7 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.content.Context; @@ -32,6 +33,7 @@ import com.android.settings.connecteddevice.DevicePreferenceCallback; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.ShadowAudioManager; +import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; import com.android.settingslib.bluetooth.LocalBluetoothManager; @@ -43,12 +45,13 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.shadow.api.Shadow; import java.util.ArrayList; import java.util.Collection; @RunWith(SettingsRobolectricTestRunner.class) -@Config(shadows = {ShadowAudioManager.class}) +@Config(shadows = {ShadowAudioManager.class, ShadowBluetoothAdapter.class}) public class ConnectedBluetoothDeviceUpdaterTest { @Mock private DashboardFragment mDashboardFragment; @@ -67,12 +70,15 @@ public class ConnectedBluetoothDeviceUpdaterTest { private ConnectedBluetoothDeviceUpdater mBluetoothDeviceUpdater; private Collection cachedDevices; private ShadowAudioManager mShadowAudioManager; + private ShadowBluetoothAdapter mShadowBluetoothAdapter; @Before public void setUp() { MockitoAnnotations.initMocks(this); mShadowAudioManager = ShadowAudioManager.getShadow(); + mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter()); + mShadowBluetoothAdapter.setEnabled(true); mContext = RuntimeEnvironment.application; doReturn(mContext).when(mDashboardFragment).getContext(); cachedDevices =