Update "Previous connected device" preference

1. Show up to 3 devices in main page
2. Add "See all" preference to go ot detail page

Bug: 116350449
Test: Screenshot && RunSettingsRoboTests
Change-Id: Iee0de8a2b7f2543e946a117ba2d9ca9dde6c8678
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7308de7..a99c9d77 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -414,6 +414,9 @@
     <!-- Toast text for hint user bluetooth is turned on [CHAR LIMIT=none]-->
     <string name="connected_device_bluetooth_turned_on_toast">Bluetooth turned on</string>
 
+    <!-- Title to see all the previous connected devices [CHAR LIMIT=50] -->
+    <string name="previous_connected_see_all">See all</string>
+
     <!-- Date & time settings screen title -->
     <string name="date_and_time">Date &amp; time</string>
     <!-- The title of the activity to pick a time zone. -->
diff --git a/res/xml/connected_devices.xml b/res/xml/connected_devices.xml
index 424ca75..29c9e01 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"/>
 
-    <Preference
+    <PreferenceCategory
         android:key="previously_connected_devices"
         android:title="@string/connected_device_previously_connected_title"
-        android:icon="@drawable/ic_devices_other_black"
-        android:fragment="com.android.settings.connecteddevice.PreviouslyConnectedDeviceDashboardFragment"
-        settings:allowDividerAbove="true"
-        settings:controller="com.android.settings.connecteddevice.PreviouslyConnectedDevicePreferenceController"/>
+        settings:controller="com.android.settings.connecteddevice.PreviouslyConnectedDevicePreferenceController">
+
+        <Preference
+            android:key="previously_connected_devices_see_all"
+            android:title="@string/previous_connected_see_all"
+            android:icon="@drawable/ic_chevron_right_24dp"
+            android:order="10"
+            android:fragment="com.android.settings.connecteddevice.PreviouslyConnectedDeviceDashboardFragment"/>
+    </PreferenceCategory>
 
     <Preference
         android:key="connection_preferences"
         android:title="@string/connected_device_connections_title"
         android:fragment="com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment"
+        settings:allowDividerAbove="true"
         settings:controller="com.android.settings.connecteddevice.AdvancedConnectedDeviceController"/>
 
 </PreferenceScreen>
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java
index 297c90b..4cc329c 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java
@@ -269,7 +269,8 @@
         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();
     }
diff --git a/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
index 8c6d3f2..6d034fd 100644
--- a/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
+++ b/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
@@ -43,7 +43,8 @@
         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();
     }
diff --git a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
index 5f6ffb2..ffcd1fc 100644
--- a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
+++ b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
@@ -20,6 +20,7 @@
 
 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 @@
 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 @@
     @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 void onStart() {
         mBluetoothDeviceUpdater.registerCallback();
         mSavedDockUpdater.registerCallback();
-        updatePreferenceOnSizeChanged();
     }
 
     @Override
@@ -86,13 +90,17 @@
     @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 @@
     }
 
     @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/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java
index fc08016..52b2e95 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.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 @@
     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 @@
         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 @@
     }
 
     @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);
+    }
+
 }