package com.android.settings.bluetooth;
+import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.graphics.Bitmap;
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;
@VisibleForTesting
final Map<String, Bitmap> 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<>();
}
@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()) {
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;
private ImageView mImageView;
@Mock
private CachedBluetoothDevice mCachedDevice;
+ @Mock
+ private BluetoothAdapter mBluetoothAdapter;
private AdvancedBluetoothDetailsHeaderController mController;
private LayoutPreference mLayoutPreference;
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);
}
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(