diff --git a/res/values/strings.xml b/res/values/strings.xml index 90a46aebab5..d78b7b01af6 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -414,6 +414,9 @@ Bluetooth turned on + + See all + Date & time diff --git a/res/xml/connected_devices.xml b/res/xml/connected_devices.xml index 424ca750f9b..29c9e01183f 100644 --- a/res/xml/connected_devices.xml +++ b/res/xml/connected_devices.xml @@ -41,18 +41,24 @@ settings:useAdminDisabledSummary="true" settings:controller="com.android.settings.connecteddevice.AddDevicePreferenceController"/> - + settings:controller="com.android.settings.connecteddevice.PreviouslyConnectedDevicePreferenceController"> + + + diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java index 297c90b2904..cac4565bddb 100644 --- a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java +++ b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java @@ -269,8 +269,9 @@ public abstract class BluetoothDeviceUpdater implements BluetoothCallback, final BluetoothDevice device = cachedDevice.getDevice(); if (DBG) { Log.d(TAG, "isDeviceConnected() device name : " + cachedDevice.getName() + - ", is connected : " + device.isConnected()); + ", is connected : " + device.isConnected() + " , is profile connected : " + + cachedDevice.isConnected()); } - return device.getBondState() == BluetoothDevice.BOND_BONDED && device.isConnected(); + return device.getBondState() == BluetoothDevice.BOND_BONDED && cachedDevice.isConnected(); } } diff --git a/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java index 8c6d3f26704..127cb03e18f 100644 --- a/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java +++ b/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java @@ -43,9 +43,10 @@ public class SavedBluetoothDeviceUpdater extends BluetoothDeviceUpdater final BluetoothDevice device = cachedDevice.getDevice(); if (DBG) { Log.d(TAG, "isFilterMatched() device name : " + cachedDevice.getName() + - ", is connected : " + device.isConnected()); + ", is connected : " + device.isConnected() + ", is profile connected : " + + cachedDevice.isConnected()); } - return device.getBondState() == BluetoothDevice.BOND_BONDED && !device.isConnected(); + return device.getBondState() == BluetoothDevice.BOND_BONDED && !cachedDevice.isConnected(); } @Override diff --git a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java index 5f6ffb24eec..ffcd1fc4faa 100644 --- a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java +++ b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java @@ -20,6 +20,7 @@ import android.content.pm.PackageManager; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; +import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceScreen; import com.android.settings.bluetooth.BluetoothDeviceUpdater; @@ -35,7 +36,9 @@ import com.android.settingslib.core.lifecycle.events.OnStop; public class PreviouslyConnectedDevicePreferenceController extends BasePreferenceController implements LifecycleObserver, OnStart, OnStop, DevicePreferenceCallback { - private Preference mPreference; + private static final int MAX_DEVICE_NUM = 3; + + private PreferenceGroup mPreferenceGroup; private BluetoothDeviceUpdater mBluetoothDeviceUpdater; private DockUpdater mSavedDockUpdater; private int mPreferenceSize; @@ -57,8 +60,10 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); + mPreferenceGroup = (PreferenceGroup) screen.findPreference(getPreferenceKey()); + mPreferenceGroup.setVisible(false); + if (isAvailable()) { - mPreference = screen.findPreference(getPreferenceKey()); final Context context = screen.getContext(); mBluetoothDeviceUpdater.setPrefContext(context); mSavedDockUpdater.setPreferenceContext(context); @@ -69,7 +74,6 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc public void onStart() { mBluetoothDeviceUpdater.registerCallback(); mSavedDockUpdater.registerCallback(); - updatePreferenceOnSizeChanged(); } @Override @@ -86,13 +90,17 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc @Override public void onDeviceAdded(Preference preference) { mPreferenceSize++; - updatePreferenceOnSizeChanged(); + if (mPreferenceSize <= MAX_DEVICE_NUM) { + mPreferenceGroup.addPreference(preference); + } + updatePreferenceVisiblity(); } @Override public void onDeviceRemoved(Preference preference) { mPreferenceSize--; - updatePreferenceOnSizeChanged(); + mPreferenceGroup.removePreference(preference); + updatePreferenceVisiblity(); } @VisibleForTesting @@ -106,18 +114,12 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc } @VisibleForTesting - void setPreferenceSize(int size) { - mPreferenceSize = size; + void setPreferenceGroup(PreferenceGroup preferenceGroup) { + mPreferenceGroup = preferenceGroup; } @VisibleForTesting - void setPreference(Preference preference) { - mPreference = preference; - } - - private void updatePreferenceOnSizeChanged() { - if (isAvailable()) { - mPreference.setEnabled(mPreferenceSize != 0); - } + void updatePreferenceVisiblity() { + mPreferenceGroup.setVisible(mPreferenceSize > 0); } } diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java index 28bf3ab8903..4ede9477995 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java @@ -161,7 +161,7 @@ public class BluetoothDeviceUpdaterTest { @Test public void isDeviceConnected_deviceConnected() { doReturn(BluetoothDevice.BOND_BONDED).when(mBluetoothDevice).getBondState(); - doReturn(true).when(mBluetoothDevice).isConnected(); + doReturn(true).when(mCachedBluetoothDevice).isConnected(); assertThat(mBluetoothDeviceUpdater.isDeviceConnected(mCachedBluetoothDevice)).isTrue(); } @@ -169,7 +169,7 @@ public class BluetoothDeviceUpdaterTest { @Test public void isDeviceConnected_deviceNotConnected() { doReturn(BluetoothDevice.BOND_BONDED).when(mBluetoothDevice).getBondState(); - doReturn(false).when(mBluetoothDevice).isConnected(); + doReturn(false).when(mCachedBluetoothDevice).isConnected(); assertThat(mBluetoothDeviceUpdater.isDeviceConnected(mCachedBluetoothDevice)).isFalse(); } diff --git a/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java index e25e4b22744..4d4a711ff5e 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdaterTest.java @@ -77,7 +77,7 @@ public class SavedBluetoothDeviceUpdaterTest { @Test public void update_filterMatch_addPreference() { doReturn(BluetoothDevice.BOND_BONDED).when(mBluetoothDevice).getBondState(); - doReturn(false).when(mBluetoothDevice).isConnected(); + doReturn(false).when(mCachedBluetoothDevice).isConnected(); mBluetoothDeviceUpdater.update(mCachedBluetoothDevice); @@ -87,7 +87,7 @@ public class SavedBluetoothDeviceUpdaterTest { @Test public void update_filterNotMatch_removePreference() { doReturn(BluetoothDevice.BOND_NONE).when(mBluetoothDevice).getBondState(); - doReturn(true).when(mBluetoothDevice).isConnected(); + doReturn(true).when(mCachedBluetoothDevice).isConnected(); mBluetoothDeviceUpdater.update(mCachedBluetoothDevice); @@ -96,7 +96,7 @@ public class SavedBluetoothDeviceUpdaterTest { @Test public void onProfileConnectionStateChanged_deviceConnected_removePreference() { - when(mBluetoothDevice.isConnected()).thenReturn(true); + when(mCachedBluetoothDevice.isConnected()).thenReturn(true); mBluetoothDeviceUpdater.onProfileConnectionStateChanged(mCachedBluetoothDevice, BluetoothProfile.STATE_CONNECTED, BluetoothProfile.A2DP); @@ -106,7 +106,7 @@ public class SavedBluetoothDeviceUpdaterTest { @Test public void onProfileConnectionStateChanged_deviceDisconnected_addPreference() { - when(mBluetoothDevice.isConnected()).thenReturn(false); + when(mCachedBluetoothDevice.isConnected()).thenReturn(false); mBluetoothDeviceUpdater.onProfileConnectionStateChanged(mCachedBluetoothDevice, BluetoothProfile.STATE_DISCONNECTED, BluetoothProfile.A2DP); diff --git a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java index fc08016f4d0..52b2e95593c 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java @@ -28,6 +28,9 @@ import android.content.Context; import android.content.pm.PackageManager; import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; +import androidx.preference.PreferenceGroup; +import androidx.preference.PreferenceManager; import com.android.settings.bluetooth.BluetoothDeviceUpdater; import com.android.settings.connecteddevice.dock.DockUpdater; @@ -54,10 +57,12 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { private DockUpdater mDockUpdater; @Mock private PackageManager mPackageManager; + @Mock + private PreferenceManager mPreferenceManager; private Context mContext; private PreviouslyConnectedDevicePreferenceController mPreConnectedDeviceController; - private Preference mPreference; + private PreferenceGroup mPreferenceGroup; @Before public void setUp() { @@ -70,8 +75,10 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { mPreConnectedDeviceController.setBluetoothDeviceUpdater(mBluetoothDeviceUpdater); mPreConnectedDeviceController.setSavedDockUpdater(mDockUpdater); - mPreference = new Preference(mContext); - mPreConnectedDeviceController.setPreference(mPreference); + mPreferenceGroup = spy(new PreferenceCategory(mContext)); + doReturn(mPreferenceManager).when(mPreferenceGroup).getPreferenceManager(); + mPreferenceGroup.setVisible(false); + mPreConnectedDeviceController.setPreferenceGroup(mPreferenceGroup); } @Test @@ -101,20 +108,34 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { } @Test - public void onDeviceAdded_addFirstDevice_preferenceIsEnable() { - doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); - mPreConnectedDeviceController.setPreferenceSize(0); - mPreConnectedDeviceController.onDeviceAdded(mPreference); + public void onDeviceAdded_addDevicePreference_displayIt() { + mPreConnectedDeviceController.onDeviceAdded(new Preference(mContext)); - assertThat(mPreference.isEnabled()).isTrue(); + assertThat(mPreferenceGroup.isVisible()).isTrue(); + assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1); } @Test - public void onDeviceRemoved_removeLastDevice_preferenceIsDisable() { - doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); - mPreConnectedDeviceController.setPreferenceSize(1); - mPreConnectedDeviceController.onDeviceRemoved(mPreference); + public void onDeviceAdded_addFourDevicePreference_onlyDisplayThree() { + mPreConnectedDeviceController.onDeviceAdded(new Preference(mContext)); + mPreConnectedDeviceController.onDeviceAdded(new Preference(mContext)); + mPreConnectedDeviceController.onDeviceAdded(new Preference(mContext)); + mPreConnectedDeviceController.onDeviceAdded(new Preference(mContext)); - assertThat(mPreference.isEnabled()).isFalse(); + assertThat(mPreferenceGroup.isVisible()).isTrue(); + assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(3); } + + @Test + public void onDeviceRemoved_removeLastDevice_setInvisible() { + final Preference preference = new Preference(mContext); + mPreferenceGroup.addPreference(preference); + mPreferenceGroup.setVisible(true); + + mPreConnectedDeviceController.onDeviceRemoved(preference); + + assertThat(mPreferenceGroup.isVisible()).isFalse(); + assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0); + } + }