diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java index f67822d088a..ec5381c1c9f 100644 --- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java +++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java @@ -31,6 +31,7 @@ import android.util.Pair; import android.util.TypedValue; import android.widget.ImageView; +import androidx.annotation.VisibleForTesting; import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.preference.PreferenceViewHolder; @@ -59,6 +60,8 @@ public final class BluetoothDevicePreference extends GearPreference implements private AlertDialog mDisconnectDialog; private String contentDescription = null; private boolean mHideSecondTarget = false; + @VisibleForTesting + boolean mNeedNotifyHierarchyChanged = false; /* Talk-back descriptions for various BT icons */ Resources mResources; @@ -81,8 +84,8 @@ public final class BluetoothDevicePreference extends GearPreference implements onDeviceAttributesChanged(); } - void rebind() { - notifyChanged(); + public void setNeedNotifyHierarchyChanged(boolean needNotifyHierarchyChanged) { + mNeedNotifyHierarchyChanged = needNotifyHierarchyChanged; } @Override @@ -145,7 +148,9 @@ public final class BluetoothDevicePreference extends GearPreference implements setVisible(mShowDevicesWithoutNames || mCachedDevice.hasHumanReadableName()); // This could affect ordering, so notify that - notifyHierarchyChanged(); + if (mNeedNotifyHierarchyChanged) { + notifyHierarchyChanged(); + } } @Override diff --git a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java index 385b5d9716c..4f27a39f9c0 100644 --- a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java +++ b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java @@ -36,6 +36,7 @@ import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.LocalBluetoothManager; import java.util.Collection; +import java.util.HashMap; import java.util.WeakHashMap; /** @@ -69,8 +70,8 @@ public abstract class DeviceListPreferenceFragment extends @VisibleForTesting PreferenceGroup mDeviceListGroup; - final WeakHashMap mDevicePreferenceMap = - new WeakHashMap(); + final HashMap mDevicePreferenceMap = + new HashMap<>(); boolean mShowDevicesWithoutNames; @@ -195,17 +196,13 @@ public abstract class DeviceListPreferenceFragment extends //Set hideSecondTarget is true if it's bonded device. preference.hideSecondTarget(true); mDeviceListGroup.addPreference(preference); - } else { - // Tell the preference it is being re-used in case there is new info in the - // cached device. - preference.rebind(); } initDevicePreference(preference); mDevicePreferenceMap.put(cachedDevice, preference); } - void initDevicePreference(BluetoothDevicePreference preference) { + protected void initDevicePreference(BluetoothDevicePreference preference) { // Does nothing by default } diff --git a/src/com/android/settings/bluetooth/DevicePickerFragment.java b/src/com/android/settings/bluetooth/DevicePickerFragment.java index 207b375cd36..02625bbad2b 100644 --- a/src/com/android/settings/bluetooth/DevicePickerFragment.java +++ b/src/com/android/settings/bluetooth/DevicePickerFragment.java @@ -151,6 +151,12 @@ public final class DevicePickerFragment extends DeviceListPreferenceFragment { } } + @Override + protected void initDevicePreference(BluetoothDevicePreference preference) { + super.initDevicePreference(preference); + preference.setNeedNotifyHierarchyChanged(true); + } + @Override public void onBluetoothStateChanged(int bluetoothState) { super.onBluetoothStateChanged(bluetoothState); diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java index 56d17f490e8..92f2354f5fd 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java @@ -166,7 +166,7 @@ public class BluetoothDevicePreferenceTest { } @Test - public void testVisible_showDeviceWithoutNames_visible() { + public void isVisible_showDeviceWithoutNames_visible() { doReturn(false).when(mCachedBluetoothDevice).hasHumanReadableName(); BluetoothDevicePreference preference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, @@ -176,11 +176,18 @@ public class BluetoothDevicePreferenceTest { } @Test - public void testVisible_hideDeviceWithoutNames_invisible() { + public void isVisible_hideDeviceWithoutNames_invisible() { doReturn(false).when(mCachedBluetoothDevice).hasHumanReadableName(); BluetoothDevicePreference preference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, false); assertThat(preference.isVisible()).isFalse(); } + + @Test + public void setNeedNotifyHierarchyChanged_updateValue() { + mPreference.setNeedNotifyHierarchyChanged(true); + + assertThat(mPreference.mNeedNotifyHierarchyChanged).isTrue(); + } }