OSDN Git Service

Align with Bluetooth metadata API changes
authorUgo Yu <ugoyu@google.com>
Tue, 5 Mar 2019 08:43:08 +0000 (16:43 +0800)
committerUgo Yu <ugoyu@google.com>
Wed, 10 Apr 2019 06:23:54 +0000 (14:23 +0800)
* Align with the changes of Bluetooth metadata APIs.
* Move metadata utils from Settings to SettingsLib.

Bug: 124448651
Test: make RunSettingsRoboTests
Change-Id: Ic9ad91536ef3ff6807a08bbffa3dd796ef1ad523

src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java
src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
src/com/android/settings/bluetooth/BluetoothFeatureProviderImpl.java
src/com/android/settings/bluetooth/Utils.java
tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java
tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHeaderControllerTest.java
tests/robotests/src/com/android/settings/bluetooth/BluetoothFeatureProviderImplTest.java
tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java

index 9a651d2..d6a668e 100644 (file)
@@ -39,6 +39,7 @@ import androidx.preference.PreferenceScreen;
 import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.fuelgauge.BatteryMeterView;
+import com.android.settingslib.bluetooth.BluetoothUtils;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnDestroy;
@@ -69,13 +70,12 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont
     @VisibleForTesting
     Handler mHandler = new Handler(Looper.getMainLooper());
     @VisibleForTesting
-    final BluetoothAdapter.MetadataListener mMetadataListener =
-            new BluetoothAdapter.MetadataListener() {
+    final BluetoothAdapter.OnMetadataChangedListener mMetadataListener =
+            new BluetoothAdapter.OnMetadataChangedListener() {
                 @Override
-                public void onMetadataChanged(BluetoothDevice device, int key, String value) {
-                    super.onMetadataChanged(device, key, value);
+                public void onMetadataChanged(BluetoothDevice device, int key, byte[] value) {
                     Log.i(TAG, String.format("Metadata updated in Device %s: %d = %s.", device, key,
-                            value));
+                            value == null ? null : new String(value)));
                     refresh();
                 }
             };
@@ -88,9 +88,9 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont
 
     @Override
     public int getAvailabilityStatus() {
-        final boolean unthetheredHeadset = Utils.getBooleanMetaData(mCachedDevice.getDevice(),
-                BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET);
-        return unthetheredHeadset ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+        final boolean untetheredHeadset = BluetoothUtils.getBooleanMetaData(
+                mCachedDevice.getDevice(), BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET);
+        return untetheredHeadset ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
     }
 
     @Override
@@ -108,8 +108,8 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont
             return;
         }
         mCachedDevice.registerCallback(this::onDeviceAttributesChanged);
-        mBluetoothAdapter.registerMetadataListener(mCachedDevice.getDevice(), mMetadataListener,
-                mHandler);
+        mBluetoothAdapter.addOnMetadataChangedListener(mCachedDevice.getDevice(),
+                mContext.getMainExecutor(), mMetadataListener);
     }
 
     @Override
@@ -118,7 +118,8 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont
             return;
         }
         mCachedDevice.unregisterCallback(this::onDeviceAttributesChanged);
-        mBluetoothAdapter.unregisterMetadataListener(mCachedDevice.getDevice());
+        mBluetoothAdapter.removeOnMetadataChangedListener(mCachedDevice.getDevice(),
+                mMetadataListener);
     }
 
     @Override
@@ -154,21 +155,21 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont
             }
 
             updateSubLayout(mLayoutPreference.findViewById(R.id.layout_left),
-                    BluetoothDevice.METADATA_UNTHETHERED_LEFT_ICON,
-                    BluetoothDevice.METADATA_UNTHETHERED_LEFT_BATTERY,
-                    BluetoothDevice.METADATA_UNTHETHERED_LEFT_CHARGING,
+                    BluetoothDevice.METADATA_UNTETHERED_LEFT_ICON,
+                    BluetoothDevice.METADATA_UNTETHERED_LEFT_BATTERY,
+                    BluetoothDevice.METADATA_UNTETHERED_LEFT_CHARGING,
                     R.string.bluetooth_left_name);
 
             updateSubLayout(mLayoutPreference.findViewById(R.id.layout_middle),
-                    BluetoothDevice.METADATA_UNTHETHERED_CASE_ICON,
-                    BluetoothDevice.METADATA_UNTHETHERED_CASE_BATTERY,
-                    BluetoothDevice.METADATA_UNTHETHERED_CASE_CHARGING,
+                    BluetoothDevice.METADATA_UNTETHERED_CASE_ICON,
+                    BluetoothDevice.METADATA_UNTETHERED_CASE_BATTERY,
+                    BluetoothDevice.METADATA_UNTETHERED_CASE_CHARGING,
                     R.string.bluetooth_middle_name);
 
             updateSubLayout(mLayoutPreference.findViewById(R.id.layout_right),
-                    BluetoothDevice.METADATA_UNTHETHERED_RIGHT_ICON,
-                    BluetoothDevice.METADATA_UNTHETHERED_RIGHT_BATTERY,
-                    BluetoothDevice.METADATA_UNTHETHERED_RIGHT_CHARGING,
+                    BluetoothDevice.METADATA_UNTETHERED_RIGHT_ICON,
+                    BluetoothDevice.METADATA_UNTETHERED_RIGHT_BATTERY,
+                    BluetoothDevice.METADATA_UNTETHERED_RIGHT_CHARGING,
                     R.string.bluetooth_right_name);
         }
     }
@@ -194,15 +195,15 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont
             return;
         }
         final BluetoothDevice bluetoothDevice = mCachedDevice.getDevice();
-        final String iconUri = Utils.getStringMetaData(bluetoothDevice, iconMetaKey);
+        final String iconUri = BluetoothUtils.getStringMetaData(bluetoothDevice, iconMetaKey);
         if (iconUri != null) {
             final ImageView imageView = linearLayout.findViewById(R.id.header_icon);
             updateIcon(imageView, iconUri);
         }
 
-        final int batteryLevel = Utils.getIntMetaData(bluetoothDevice, batteryMetaKey);
-        final boolean charging = Utils.getBooleanMetaData(bluetoothDevice, chargeMetaKey);
-        if (batteryLevel != Utils.META_INT_ERROR) {
+        final int batteryLevel = BluetoothUtils.getIntMetaData(bluetoothDevice, batteryMetaKey);
+        final boolean charging = BluetoothUtils.getBooleanMetaData(bluetoothDevice, chargeMetaKey);
+        if (batteryLevel != BluetoothUtils.META_INT_ERROR) {
             linearLayout.setVisibility(View.VISIBLE);
             final ImageView imageView = linearLayout.findViewById(R.id.bt_battery_icon);
             imageView.setImageDrawable(createBtBatteryIcon(mContext, batteryLevel, charging));
@@ -233,7 +234,7 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont
 
         // Only show bluetooth icon
         final BluetoothDevice bluetoothDevice = mCachedDevice.getDevice();
-        final String iconUri = Utils.getStringMetaData(bluetoothDevice,
+        final String iconUri = BluetoothUtils.getStringMetaData(bluetoothDevice,
                 BluetoothDevice.METADATA_MAIN_ICON);
         if (iconUri != null) {
             final ImageView imageView = linearLayout.findViewById(R.id.header_icon);
index 47d56bc..ee63045 100644 (file)
@@ -53,8 +53,8 @@ public class BluetoothDetailsHeaderController extends BluetoothDetailsController
 
     @Override
     public boolean isAvailable() {
-        return !Utils.getBooleanMetaData(mCachedDevice.getDevice(),
-                BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET);
+        return !BluetoothUtils.getBooleanMetaData(mCachedDevice.getDevice(),
+                BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET);
     }
 
     @Override
index e486b68..cd75951 100644 (file)
@@ -33,8 +33,8 @@ public class BluetoothFeatureProviderImpl implements BluetoothFeatureProvider {
 
     @Override
     public Uri getBluetoothDeviceSettingsUri(BluetoothDevice bluetoothDevice) {
-        final String uriString = bluetoothDevice.getMetadata(
+        final byte[] uriByte = bluetoothDevice.getMetadata(
                 BluetoothDevice.METADATA_ENHANCED_SETTINGS_UI_URI);
-        return uriString != null ? Uri.parse(uriString) : null;
+        return uriByte == null ? null : Uri.parse(new String(uriByte));
     }
 }
index a86e1d5..d6e395e 100755 (executable)
@@ -47,8 +47,6 @@ public final class Utils {
     static final boolean V = BluetoothUtils.V; // verbose logging
     static final boolean D =  BluetoothUtils.D;  // regular logging
 
-    public static final int META_INT_ERROR = -1;
-
     private Utils() {
     }
 
@@ -154,30 +152,4 @@ public final class Utils {
         return Settings.Global.getInt(context.getContentResolver(),
                 Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE, 0) == 1;
     }
-
-    public static boolean getBooleanMetaData(BluetoothDevice bluetoothDevice, int key) {
-        if (bluetoothDevice == null) {
-            return false;
-        }
-
-        return Boolean.parseBoolean(bluetoothDevice.getMetadata(key));
-    }
-
-    public static String getStringMetaData(BluetoothDevice bluetoothDevice, int key) {
-        if (bluetoothDevice == null) {
-            return null;
-        }
-        return bluetoothDevice.getMetadata(key);
-    }
-
-    public static int getIntMetaData(BluetoothDevice bluetoothDevice, int key) {
-        if (bluetoothDevice == null) {
-            return META_INT_ERROR;
-        }
-        try {
-            return Integer.parseInt(bluetoothDevice.getMetadata(key));
-        } catch (NumberFormatException e) {
-            return META_INT_ERROR;
-        }
-    }
 }
index 3532bf8..362b003 100644 (file)
@@ -104,14 +104,14 @@ public class AdvancedBluetoothDetailsHeaderControllerTest{
     @Test
     public void refresh_connected_updateCorrectInfo() {
         when(mBluetoothDevice.getMetadata(
-                BluetoothDevice.METADATA_UNTHETHERED_LEFT_BATTERY)).thenReturn(
-                String.valueOf(BATTERY_LEVEL_LEFT));
+                BluetoothDevice.METADATA_UNTETHERED_LEFT_BATTERY)).thenReturn(
+                String.valueOf(BATTERY_LEVEL_LEFT).getBytes());
         when(mBluetoothDevice.getMetadata(
-                BluetoothDevice.METADATA_UNTHETHERED_RIGHT_BATTERY)).thenReturn(
-                String.valueOf(BATTERY_LEVEL_RIGHT));
+                BluetoothDevice.METADATA_UNTETHERED_RIGHT_BATTERY)).thenReturn(
+                String.valueOf(BATTERY_LEVEL_RIGHT).getBytes());
         when(mBluetoothDevice.getMetadata(
-                BluetoothDevice.METADATA_UNTHETHERED_CASE_BATTERY)).thenReturn(
-                String.valueOf(BATTERY_LEVEL_MAIN));
+                BluetoothDevice.METADATA_UNTETHERED_CASE_BATTERY)).thenReturn(
+                String.valueOf(BATTERY_LEVEL_MAIN).getBytes());
         when(mCachedDevice.isConnected()).thenReturn(true);
         mController.refresh();
 
@@ -141,18 +141,18 @@ public class AdvancedBluetoothDetailsHeaderControllerTest{
     }
 
     @Test
-    public void getAvailabilityStatus_unthetheredHeadset_returnAvailable() {
-        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET))
-                .thenReturn("true");
+    public void getAvailabilityStatus_untetheredHeadset_returnAvailable() {
+        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET))
+                .thenReturn("true".getBytes());
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(
                 BasePreferenceController.AVAILABLE);
     }
 
     @Test
-    public void getAvailabilityStatus_notUnthetheredHeadset_returnUnavailable() {
-        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET))
-                .thenReturn("false");
+    public void getAvailabilityStatus_notUntetheredHeadset_returnUnavailable() {
+        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET))
+                .thenReturn("false".getBytes());
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(
                 BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
@@ -169,50 +169,52 @@ public class AdvancedBluetoothDetailsHeaderControllerTest{
 
     @Test
     public void onStart_isAvailable_registerCallback() {
-        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET))
-                .thenReturn("true");
+        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET))
+                .thenReturn("true".getBytes());
 
         mController.onStart();
 
-        verify(mBluetoothAdapter).registerMetadataListener(mBluetoothDevice,
-                mController.mMetadataListener, mController.mHandler);
+        verify(mBluetoothAdapter).addOnMetadataChangedListener(mBluetoothDevice,
+                mContext.getMainExecutor() ,mController.mMetadataListener);
     }
 
     @Test
     public void onStop_isAvailable_unregisterCallback() {
-        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET))
-                .thenReturn("true");
+        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET))
+                .thenReturn("true".getBytes());
 
         mController.onStop();
 
-        verify(mBluetoothAdapter).unregisterMetadataListener(mBluetoothDevice);
+        verify(mBluetoothAdapter).removeOnMetadataChangedListener(mBluetoothDevice,
+                mController.mMetadataListener);
     }
 
     @Test
     public void onStart_notAvailable_registerCallback() {
-        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET))
-                .thenReturn("false");
+        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET))
+                .thenReturn("false".getBytes());
 
         mController.onStart();
 
-        verify(mBluetoothAdapter, never()).registerMetadataListener(mBluetoothDevice,
-                mController.mMetadataListener, mController.mHandler);
+        verify(mBluetoothAdapter, never()).addOnMetadataChangedListener(mBluetoothDevice,
+                mContext.getMainExecutor() ,mController.mMetadataListener);
     }
 
     @Test
     public void onStop_notAvailable_unregisterCallback() {
-        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET))
-                .thenReturn("false");
+        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET))
+                .thenReturn("false".getBytes());
 
         mController.onStop();
 
-        verify(mBluetoothAdapter, never()).unregisterMetadataListener(mBluetoothDevice);
+        verify(mBluetoothAdapter, never()).removeOnMetadataChangedListener(mBluetoothDevice,
+                mController.mMetadataListener);
     }
 
     @Test
     public void onDestroy_isAvailable_recycleBitmap() {
-        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET))
-                .thenReturn("true");
+        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET))
+                .thenReturn("true".getBytes());
         mController.mIconCache.put(ICON_URI, mBitmap);
 
         mController.onDestroy();
index cf119ea..1ee1de6 100644 (file)
@@ -123,9 +123,9 @@ public class BluetoothDetailsHeaderControllerTest extends BluetoothDetailsContro
     }
 
     @Test
-    public void isAvailable_unthetheredHeadset_returnFalse() {
+    public void isAvailable_untetheredHeadset_returnFalse() {
         when(mBluetoothDevice.getMetadata(
-                BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET)).thenReturn("true");
+                BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)).thenReturn("true".getBytes());
 
         assertThat(mController.isAvailable()).isFalse();
     }
index a921215..9ab1d87 100644 (file)
@@ -49,7 +49,8 @@ public class BluetoothFeatureProviderImplTest {
     @Test
     public void getBluetoothDeviceSettingsUri_containCorrectMacAddress() {
         when(mBluetoothDevice.getMetadata(
-                BluetoothDevice.METADATA_ENHANCED_SETTINGS_UI_URI)).thenReturn(SETTINGS_URI);
+                BluetoothDevice.METADATA_ENHANCED_SETTINGS_UI_URI)).thenReturn(
+                SETTINGS_URI.getBytes());
         final Uri uri = mBluetoothFeatureProvider.getBluetoothDeviceSettingsUri(mBluetoothDevice);
         assertThat(uri.toString()).isEqualTo(SETTINGS_URI);
     }
index ee79d61..1920019 100644 (file)
@@ -43,14 +43,8 @@ import org.robolectric.RobolectricTestRunner;
 @RunWith(RobolectricTestRunner.class)
 public class UtilsTest {
 
-    private static final String STRING_METADATA = "string_metadata";
-    private static final String BOOL_METADATA = "true";
-    private static final String INT_METADATA = "25";
-
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Context mContext;
-    @Mock
-    private BluetoothDevice mBluetoothDevice;
 
     private MetricsFeatureProvider mMetricsFeatureProvider;
 
@@ -69,41 +63,4 @@ public class UtilsTest {
         verify(mMetricsFeatureProvider).visible(eq(mContext), anyInt(),
                 eq(MetricsEvent.ACTION_SETTINGS_BLUETOOTH_CONNECT_ERROR));
     }
-
-    @Test
-    public void getStringMetaData_hasMetaData_getCorrectMetaData() {
-        when(mBluetoothDevice.getMetadata(
-                BluetoothDevice.METADATA_UNTHETHERED_LEFT_ICON)).thenReturn(STRING_METADATA);
-
-        assertThat(Utils.getStringMetaData(mBluetoothDevice,
-                BluetoothDevice.METADATA_UNTHETHERED_LEFT_ICON)).isEqualTo(STRING_METADATA);
-    }
-
-    @Test
-    public void getIntMetaData_hasMetaData_getCorrectMetaData() {
-        when(mBluetoothDevice.getMetadata(
-            BluetoothDevice.METADATA_UNTHETHERED_LEFT_BATTERY)).thenReturn(INT_METADATA);
-
-        assertThat(Utils.getIntMetaData(mBluetoothDevice,
-            BluetoothDevice.METADATA_UNTHETHERED_LEFT_BATTERY))
-            .isEqualTo(Integer.parseInt(INT_METADATA));
-    }
-
-    @Test
-    public void getIntMetaData_invalidMetaData_getErrorCode() {
-        when(mBluetoothDevice.getMetadata(
-                BluetoothDevice.METADATA_UNTHETHERED_LEFT_BATTERY)).thenReturn(STRING_METADATA);
-
-        assertThat(Utils.getIntMetaData(mBluetoothDevice,
-                BluetoothDevice.METADATA_UNTHETHERED_LEFT_ICON)).isEqualTo(Utils.META_INT_ERROR);
-    }
-
-    @Test
-    public void getBooleanMetaData_hasMetaData_getCorrectMetaData() {
-        when(mBluetoothDevice.getMetadata(
-                BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET)).thenReturn(BOOL_METADATA);
-
-        assertThat(Utils.getBooleanMetaData(mBluetoothDevice,
-                BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET)).isEqualTo(true);
-    }
 }