From 8ee474a3690534d4490a43df0f01dc9bfa9fcb17 Mon Sep 17 00:00:00 2001 From: hughchen Date: Tue, 7 Aug 2018 18:00:28 +0800 Subject: [PATCH] Clear connected Bluetooth device from preference when Bluetooth state is off 1. Clear connected Bluetooth device from preference when Bluetooth state is off. 2. Do not force to update the list of Bluetooth device when Bluetooth is disable. 3. Add test to verify following situations: 1. Do not force to update the list of Bluetooth device when Bluetooth is disable. 2. Force to update the list of Bluetooth device when Bluetooth is enable. 3. Force to update the list of Bluetooth device when Bluetooth state is on. 4. Clear the connected Bluetooth device from preference when Bluetooth state is off. Bug: 110178164 Test: make -j42 RunSettingsRoboTests Change-Id: I8b17c5d761e010e4eab620355c8b9185543e85ed --- .../bluetooth/BluetoothDeviceUpdater.java | 21 ++++++-- ...ilableMediaBluetoothDeviceUpdaterTest.java | 8 ++- .../bluetooth/BluetoothDeviceUpdaterTest.java | 52 ++++++++++++++++++- .../ConnectedBluetoothDeviceUpdaterTest.java | 8 ++- 4 files changed, 83 insertions(+), 6 deletions(-) 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 =