diff --git a/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java index 34a758bf9cc..64c98669c0d 100644 --- a/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java +++ b/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java @@ -16,6 +16,7 @@ package com.android.settings.bluetooth; +import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.graphics.Bitmap; @@ -23,6 +24,8 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.os.Handler; +import android.os.Looper; import android.provider.MediaStore; import android.util.Log; import android.view.View; @@ -59,9 +62,25 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont @VisibleForTesting final Map mIconCache; private CachedBluetoothDevice mCachedDevice; + @VisibleForTesting + BluetoothAdapter mBluetoothAdapter; + @VisibleForTesting + Handler mHandler = new Handler(Looper.getMainLooper()); + @VisibleForTesting + final BluetoothAdapter.MetadataListener mMetadataListener = + new BluetoothAdapter.MetadataListener() { + @Override + public void onMetadataChanged(BluetoothDevice device, int key, String value) { + super.onMetadataChanged(device, key, value); + Log.i(TAG, String.format("Metadata updated in Device %s: %d = %s.", device, key, + value)); + refresh(); + } + }; public AdvancedBluetoothDetailsHeaderController(Context context, String prefKey) { super(context, prefKey); + mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); mIconCache = new HashMap<>(); } @@ -84,11 +103,14 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont @Override public void onStart() { mCachedDevice.registerCallback(this::onDeviceAttributesChanged); + mBluetoothAdapter.registerMetadataListener(mCachedDevice.getDevice(), mMetadataListener, + mHandler); } @Override public void onStop() { mCachedDevice.unregisterCallback(this::onDeviceAttributesChanged); + mBluetoothAdapter.unregisterMetadataListener(mCachedDevice.getDevice()); // Destroy icon bitmap associated with this header for (Bitmap bitmap : mIconCache.values()) { diff --git a/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java index 53fac3ca5f8..139ef41e489 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java @@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.graphics.Bitmap; @@ -65,6 +66,8 @@ public class AdvancedBluetoothDetailsHeaderControllerTest{ private ImageView mImageView; @Mock private CachedBluetoothDevice mCachedDevice; + @Mock + private BluetoothAdapter mBluetoothAdapter; private AdvancedBluetoothDetailsHeaderController mController; private LayoutPreference mLayoutPreference; @@ -78,6 +81,7 @@ public class AdvancedBluetoothDetailsHeaderControllerTest{ mLayoutPreference = new LayoutPreference(mContext, LayoutInflater.from(mContext).inflate(R.layout.advanced_bt_entity_header, null)); mController.mLayoutPreference = mLayoutPreference; + mController.mBluetoothAdapter = mBluetoothAdapter; when(mCachedDevice.getDevice()).thenReturn(mBluetoothDevice); } @@ -159,6 +163,21 @@ public class AdvancedBluetoothDetailsHeaderControllerTest{ verify(mImageView).setImageBitmap(mBitmap); } + @Test + public void onStart_registerCallback() { + mController.onStart(); + + verify(mBluetoothAdapter).registerMetadataListener(mBluetoothDevice, + mController.mMetadataListener, mController.mHandler); + } + + @Test + public void onStop_unregisterCallback() { + mController.onStop(); + + verify(mBluetoothAdapter).unregisterMetadataListener(mBluetoothDevice); + } + private void assertBatteryLevel(LinearLayout linearLayout, int batteryLevel) { final TextView textView = linearLayout.findViewById(R.id.bt_battery_summary); assertThat(textView.getText().toString()).isEqualTo(