Merge "Fix connected devices settings jank issue" into sc-dev
diff --git a/res/xml/connected_devices.xml b/res/xml/connected_devices.xml
index 75878f9..e7e3c2c 100644
--- a/res/xml/connected_devices.xml
+++ b/res/xml/connected_devices.xml
@@ -40,24 +40,13 @@
         android:key="add_bt_devices"
         android:title="@string/bluetooth_pairing_pref_title"
         android:icon="@drawable/ic_add_24dp"
-        android:fragment="com.android.settings.bluetooth.BluetoothPairingDetail"
-        settings:allowDividerAbove="true"
-        settings:keywords="@string/keywords_add_bt_device"
-        settings:userRestriction="no_config_bluetooth"
-        settings:useAdminDisabledSummary="true"
-        settings:controller="com.android.settings.connecteddevice.AddDevicePreferenceController"/>
-
-    <com.android.settingslib.RestrictedPreference
-        android:key="add_bt_devices_summary"
-        android:title="@string/bluetooth_pairing_pref_title"
-        android:icon="@drawable/ic_add_24dp"
         android:summary="@string/connected_device_add_device_summary"
         android:fragment="com.android.settings.bluetooth.BluetoothPairingDetail"
         settings:allowDividerAbove="true"
         settings:keywords="@string/keywords_add_bt_device"
         settings:userRestriction="no_config_bluetooth"
         settings:useAdminDisabledSummary="true"
-        settings:controller="com.android.settings.connecteddevice.AddDeviceSummaryPreferenceController"/>
+        settings:controller="com.android.settings.connecteddevice.AddDevicePreferenceController"/>
 
     <PreferenceCategory
         android:key="previously_connected_devices"
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java b/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java
index d42a1be..e8751dc 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java
@@ -41,6 +41,12 @@
         mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
     }
 
+    @Override
+    public int getAvailabilityStatus() {
+        return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()
+                ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+    }
+
     /**
      * Set the {@link Fragment} that used to show {@link LocalDeviceNameDialogFragment}
      * in {@code handlePreferenceTreeClick}
diff --git a/src/com/android/settings/connecteddevice/AddDevicePreferenceController.java b/src/com/android/settings/connecteddevice/AddDevicePreferenceController.java
index 6fdc7e5..a2d477d 100644
--- a/src/com/android/settings/connecteddevice/AddDevicePreferenceController.java
+++ b/src/com/android/settings/connecteddevice/AddDevicePreferenceController.java
@@ -33,7 +33,7 @@
 
 /**
  * Controller to maintain the {@link androidx.preference.Preference} for add
- * device without summary at beginning. It monitor Bluetooth's status(on/off) and decide if need
+ * device. It monitor Bluetooth's status(on/off) and decide if need
  * to show summary or not.
  */
 public class AddDevicePreferenceController extends BasePreferenceController
@@ -43,12 +43,11 @@
     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
-            updateState();
+            updateState(mPreference);
         }
     };
     private IntentFilter mIntentFilter;
-
-    protected BluetoothAdapter mBluetoothAdapter;
+    private BluetoothAdapter mBluetoothAdapter;
 
     public AddDevicePreferenceController(Context context, String key) {
         super(context, key);
@@ -59,7 +58,6 @@
     @Override
     public void onStart() {
         mContext.registerReceiver(mReceiver, mIntentFilter);
-        updateState(mPreference);
     }
 
     @Override
@@ -72,13 +70,13 @@
         super.displayPreference(screen);
         if (isAvailable()) {
             mPreference = screen.findPreference(getPreferenceKey());
+            updateState(mPreference);
         }
     }
 
     @Override
     public int getAvailabilityStatus() {
         return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)
-                && isBluetoothEnabled()
                 ? AVAILABLE
                 : UNSUPPORTED_ON_DEVICE;
     }
@@ -93,8 +91,4 @@
     protected boolean isBluetoothEnabled() {
         return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled();
     }
-
-    void updateState() {
-        updateState(mPreference);
-    }
 }
diff --git a/src/com/android/settings/connecteddevice/AddDeviceSummaryPreferenceController.java b/src/com/android/settings/connecteddevice/AddDeviceSummaryPreferenceController.java
deleted file mode 100644
index 4513473..0000000
--- a/src/com/android/settings/connecteddevice/AddDeviceSummaryPreferenceController.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2021 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 android.content.Context;
-import android.content.pm.PackageManager;
-
-/**
- * Controller to maintain the {@link androidx.preference.Preference} for add
- * device with summary at beginning. It monitor Bluetooth's status(on/off) and decide if need
- * to show summary or not.
- */
-public class AddDeviceSummaryPreferenceController extends AddDevicePreferenceController {
-
-    public AddDeviceSummaryPreferenceController(Context context, String key) {
-        super(context, key);
-    }
-
-    @Override
-    public int getAvailabilityStatus() {
-        return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)
-                && !isBluetoothEnabled()
-                ? AVAILABLE
-                : UNSUPPORTED_ON_DEVICE;
-    }
-}
diff --git a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
index 4a29485..4469d26 100644
--- a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
+++ b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
@@ -103,6 +103,7 @@
             final Context context = screen.getContext();
             mBluetoothDeviceUpdater.setPrefContext(context);
             mSavedDockUpdater.setPreferenceContext(context);
+            mBluetoothDeviceUpdater.forceUpdate();
         }
     }
 
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/AddDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/AddDevicePreferenceControllerTest.java
index c3841c9..7384d3a 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/AddDevicePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/AddDevicePreferenceControllerTest.java
@@ -87,7 +87,7 @@
     @Test
     public void addDevice_bt_resume_on_then_off() {
         when(mBluetoothAdapter.isEnabled()).thenReturn(true);
-        mAddDevicePreferenceController.updateState();
+        mAddDevicePreferenceController.updateState(mAddDevicePreference);
         assertTrue(TextUtils.isEmpty(mAddDevicePreference.getSummary()));
 
         Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED);
@@ -103,7 +103,7 @@
     @Test
     public void addDevice_bt_resume_off_then_on() {
         when(mBluetoothAdapter.isEnabled()).thenReturn(false);
-        mAddDevicePreferenceController.updateState();
+        mAddDevicePreferenceController.updateState(mAddDevicePreference);
         assertThat(mAddDevicePreference.getSummary()).isEqualTo(
                 mContext.getString(R.string.connected_device_add_device_summary));
 
@@ -131,9 +131,8 @@
     }
 
     @Test
-    public void getAvailabilityStatus_bluetoothIsDisabled_unSupported() {
-        mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, true);
-        when(mBluetoothAdapter.isEnabled()).thenReturn(false);
+    public void getAvailabilityStatus_noBluetoothFeature_unSupported() {
+        mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, false);
 
         assertThat(mAddDevicePreferenceController.getAvailabilityStatus())
                 .isEqualTo(UNSUPPORTED_ON_DEVICE);
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/AddDeviceSummaryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/AddDeviceSummaryPreferenceControllerTest.java
deleted file mode 100644
index e134a16..0000000
--- a/tests/robotests/src/com/android/settings/connecteddevice/AddDeviceSummaryPreferenceControllerTest.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2021 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 com.android.settings.core.BasePreferenceController.AVAILABLE;
-import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.when;
-
-import android.bluetooth.BluetoothAdapter;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.text.TextUtils;
-
-import androidx.preference.PreferenceScreen;
-
-import com.android.settings.R;
-import com.android.settingslib.RestrictedPreference;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowApplicationPackageManager;
-import org.robolectric.util.ReflectionHelpers;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowApplicationPackageManager.class)
-public class AddDeviceSummaryPreferenceControllerTest {
-
-    @Mock
-    private PreferenceScreen mScreen;
-    @Mock
-    private BluetoothAdapter mBluetoothAdapter;
-
-    private Context mContext;
-    private AddDeviceSummaryPreferenceController mAddDeviceSummaryPreferenceController;
-    private RestrictedPreference mAddDevicePreference;
-    private ShadowApplicationPackageManager mPackageManager;
-
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mContext = RuntimeEnvironment.application;
-        mPackageManager = (ShadowApplicationPackageManager) Shadows.shadowOf(
-                mContext.getPackageManager());
-        mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, true);
-
-        mAddDeviceSummaryPreferenceController = new AddDeviceSummaryPreferenceController(mContext,
-                "add_bt_devices");
-        ReflectionHelpers.setField(mAddDeviceSummaryPreferenceController,
-                "mBluetoothAdapter", mBluetoothAdapter);
-
-        String key = mAddDeviceSummaryPreferenceController.getPreferenceKey();
-        mAddDevicePreference = new RestrictedPreference(mContext);
-        mAddDevicePreference.setKey(key);
-        when(mScreen.findPreference(key)).thenReturn(mAddDevicePreference);
-        when(mBluetoothAdapter.isEnabled()).thenReturn(false);
-        mAddDeviceSummaryPreferenceController.displayPreference(mScreen);
-    }
-
-    @Test
-    public void getSummary_btOnThenOff_summaryShouldBeShown() {
-        when(mBluetoothAdapter.isEnabled()).thenReturn(true);
-
-        mAddDeviceSummaryPreferenceController.updateState();
-
-        assertTrue(TextUtils.isEmpty(mAddDevicePreference.getSummary()));
-
-        Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED);
-        intent.putExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_OFF);
-        BroadcastReceiver receiver = ReflectionHelpers.getField(
-                mAddDeviceSummaryPreferenceController, "mReceiver");
-        when(mBluetoothAdapter.isEnabled()).thenReturn(false);
-
-        receiver.onReceive(mContext, intent);
-
-        assertThat(mAddDevicePreference.getSummary()).isEqualTo(
-                mContext.getString(R.string.connected_device_add_device_summary));
-    }
-
-    @Test
-    public void getSummary_btOffThenOn_summaryShouldNotBeShown() {
-        when(mBluetoothAdapter.isEnabled()).thenReturn(false);
-
-        mAddDeviceSummaryPreferenceController.updateState();
-
-        assertThat(mAddDevicePreference.getSummary()).isEqualTo(
-                mContext.getString(R.string.connected_device_add_device_summary));
-
-        Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED);
-        intent.putExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_ON);
-        BroadcastReceiver receiver = ReflectionHelpers.getField(
-                mAddDeviceSummaryPreferenceController, "mReceiver");
-        when(mBluetoothAdapter.isEnabled()).thenReturn(true);
-
-        receiver.onReceive(mContext, intent);
-
-        assertTrue(TextUtils.isEmpty(mAddDevicePreference.getSummary()));
-    }
-
-    @Test
-    public void getAvailabilityStatus_notHaveBluetoothFeature_unSupported() {
-        mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, false);
-
-        assertThat(mAddDeviceSummaryPreferenceController.getAvailabilityStatus())
-                .isEqualTo(UNSUPPORTED_ON_DEVICE);
-    }
-
-    @Test
-    public void getAvailabilityStatus_haveBluetoothFeature_supported() {
-        mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, true);
-
-        assertThat(mAddDeviceSummaryPreferenceController.getAvailabilityStatus())
-                .isEqualTo(AVAILABLE);
-    }
-
-    @Test
-    public void getAvailabilityStatus_bluetoothIsEnabled_unSupported() {
-        mPackageManager.setSystemFeature(PackageManager.FEATURE_BLUETOOTH, true);
-        when(mBluetoothAdapter.isEnabled()).thenReturn(true);
-
-        assertThat(mAddDeviceSummaryPreferenceController.getAvailabilityStatus())
-                .isEqualTo(UNSUPPORTED_ON_DEVICE);
-    }
-}