Fix the device on "Media devices" wouldn't update

- This CL use new CachedBluetoothDevice callback instance
  in construct to avoid unregister wrong callback.
- This CL use flag to make sure preference will register
  callback on onAttached() when preference remove callback
  on onPrepareForRemoval() or onDetached().
- Update test case

Bug: 168682778
Bug: 157653997
Test: make -j42 RunSettingsRoboTests
Change-Id: I7a0d9f5332153ee80634e191847b84cd7c380b7d
This commit is contained in:
Hugh Chen
2020-09-16 20:43:40 +08:00
parent 195aa70291
commit cafeab2813
2 changed files with 45 additions and 7 deletions

View File

@@ -52,8 +52,7 @@ import java.lang.annotation.RetentionPolicy;
* BluetoothDevicePreference is the preference type used to display each remote
* Bluetooth device in the Bluetooth Settings screen.
*/
public final class BluetoothDevicePreference extends GearPreference implements
CachedBluetoothDevice.Callback {
public final class BluetoothDevicePreference extends GearPreference {
private static final String TAG = "BluetoothDevicePref";
private static int sDimAlpha = Integer.MIN_VALUE;
@@ -77,10 +76,20 @@ public final class BluetoothDevicePreference extends GearPreference implements
private AlertDialog mDisconnectDialog;
private String contentDescription = null;
private boolean mHideSecondTarget = false;
private boolean mIsCallbackRemoved = false;
@VisibleForTesting
boolean mNeedNotifyHierarchyChanged = false;
/* Talk-back descriptions for various BT icons */
Resources mResources;
final BluetoothDevicePreferenceCallback mCallback;
private class BluetoothDevicePreferenceCallback implements CachedBluetoothDevice.Callback {
@Override
public void onDeviceAttributesChanged() {
onPreferenceAttributesChanged();
}
}
public BluetoothDevicePreference(Context context, CachedBluetoothDevice cachedDevice,
boolean showDeviceWithoutNames, @SortType int type) {
@@ -96,10 +105,12 @@ public final class BluetoothDevicePreference extends GearPreference implements
}
mCachedDevice = cachedDevice;
mCallback = new BluetoothDevicePreferenceCallback();
mCachedDevice.registerCallback(mCallback);
mCurrentTime = System.currentTimeMillis();
mType = type;
onDeviceAttributesChanged();
onPreferenceAttributesChanged();
}
public void setNeedNotifyHierarchyChanged(boolean needNotifyHierarchyChanged) {
@@ -126,6 +137,10 @@ public final class BluetoothDevicePreference extends GearPreference implements
@Override
protected void onPrepareForRemoval() {
super.onPrepareForRemoval();
if (!mIsCallbackRemoved) {
mCachedDevice.unregisterCallback(mCallback);
mIsCallbackRemoved = true;
}
if (mDisconnectDialog != null) {
mDisconnectDialog.dismiss();
mDisconnectDialog = null;
@@ -135,13 +150,20 @@ public final class BluetoothDevicePreference extends GearPreference implements
@Override
public void onAttached() {
super.onAttached();
mCachedDevice.registerCallback(this);
if (mIsCallbackRemoved) {
mCachedDevice.registerCallback(mCallback);
mIsCallbackRemoved = false;
}
onPreferenceAttributesChanged();
}
@Override
public void onDetached() {
super.onDetached();
mCachedDevice.unregisterCallback(this);
if (!mIsCallbackRemoved) {
mCachedDevice.unregisterCallback(mCallback);
mIsCallbackRemoved = true;
}
}
public CachedBluetoothDevice getBluetoothDevice() {
@@ -152,7 +174,7 @@ public final class BluetoothDevicePreference extends GearPreference implements
mHideSecondTarget = hideSecondTarget;
}
public void onDeviceAttributesChanged() {
private void onPreferenceAttributesChanged() {
/*
* The preference framework takes care of making sure the value has
* changed before proceeding. It will also call notifyChanged() if