From 1ea19b1d019b301099a940d0c199f47e25069bae Mon Sep 17 00:00:00 2001 From: Kyunglyul Hyun Date: Wed, 10 Jun 2020 20:04:15 +0900 Subject: [PATCH] Add address to MediaRoute2Info The route ID of a bluetooth route was its hardware address and SettingsLib depended on that to get BluetoothDevice. We can't use the address as ID for a pair of hearing devices, which has their own address but should have the same route ID. Instead, this CL adds "address" field explictly to be used for bluetooth routes. Maybe it can be used by other devices as well. Bug: 157708273 Test: make -j42 RunSettingsLibRoboTests && cts test Change-Id: Ib940da9975fc8d68ec3fb7cf2c4a85c0d1a195f3 --- media/java/android/media/MediaRoute2Info.java | 51 +++++++++++-------- .../settingslib/media/InfoMediaManager.java | 2 +- .../media/InfoMediaManagerTest.java | 4 +- .../server/media/BluetoothRouteProvider.java | 1 + 4 files changed, 34 insertions(+), 24 deletions(-) diff --git a/media/java/android/media/MediaRoute2Info.java b/media/java/android/media/MediaRoute2Info.java index e5ad569bb24f4..54c0bc94c2d09 100644 --- a/media/java/android/media/MediaRoute2Info.java +++ b/media/java/android/media/MediaRoute2Info.java @@ -317,9 +317,10 @@ public final class MediaRoute2Info implements Parcelable { @ConnectionState final int mConnectionState; final String mClientPackageName; - final int mVolume; - final int mVolumeMax; final int mVolumeHandling; + final int mVolumeMax; + final int mVolume; + final String mAddress; final Bundle mExtras; final String mProviderId; @@ -336,6 +337,7 @@ public final class MediaRoute2Info implements Parcelable { mVolumeHandling = builder.mVolumeHandling; mVolumeMax = builder.mVolumeMax; mVolume = builder.mVolume; + mAddress = builder.mAddress; mExtras = builder.mExtras; mProviderId = builder.mProviderId; } @@ -353,6 +355,7 @@ public final class MediaRoute2Info implements Parcelable { mVolumeHandling = in.readInt(); mVolumeMax = in.readInt(); mVolume = in.readInt(); + mAddress = in.readString(); mExtras = in.readBundle(); mProviderId = in.readString(); } @@ -483,6 +486,15 @@ public final class MediaRoute2Info implements Parcelable { return mVolume; } + /** + * Gets the hardware address of the route if available. + * @hide + */ + @Nullable + public String getAddress() { + return mAddress; + } + @Nullable public Bundle getExtras() { return mExtras == null ? null : new Bundle(mExtras); @@ -564,6 +576,7 @@ public final class MediaRoute2Info implements Parcelable { && (mVolumeHandling == other.mVolumeHandling) && (mVolumeMax == other.mVolumeMax) && (mVolume == other.mVolume) + && Objects.equals(mAddress, other.mAddress) && Objects.equals(mProviderId, other.mProviderId); } @@ -572,7 +585,7 @@ public final class MediaRoute2Info implements Parcelable { // Note: mExtras is not included. return Objects.hash(mId, mName, mFeatures, mType, mIsSystem, mIconUri, mDescription, mConnectionState, mClientPackageName, mVolumeHandling, mVolumeMax, mVolume, - mProviderId); + mAddress, mProviderId); } @Override @@ -614,6 +627,7 @@ public final class MediaRoute2Info implements Parcelable { dest.writeInt(mVolumeHandling); dest.writeInt(mVolumeMax); dest.writeInt(mVolume); + dest.writeString(mAddress); dest.writeBundle(mExtras); dest.writeString(mProviderId); } @@ -637,6 +651,7 @@ public final class MediaRoute2Info implements Parcelable { int mVolumeHandling = PLAYBACK_VOLUME_FIXED; int mVolumeMax; int mVolume; + String mAddress; Bundle mExtras; String mProviderId; @@ -669,24 +684,7 @@ public final class MediaRoute2Info implements Parcelable { * @param routeInfo the existing instance to copy data from. */ public Builder(@NonNull MediaRoute2Info routeInfo) { - Objects.requireNonNull(routeInfo, "routeInfo must not be null"); - - mId = routeInfo.mId; - mName = routeInfo.mName; - mFeatures = new ArrayList<>(routeInfo.mFeatures); - mType = routeInfo.mType; - mIsSystem = routeInfo.mIsSystem; - mIconUri = routeInfo.mIconUri; - mDescription = routeInfo.mDescription; - mConnectionState = routeInfo.mConnectionState; - mClientPackageName = routeInfo.mClientPackageName; - mVolumeHandling = routeInfo.mVolumeHandling; - mVolumeMax = routeInfo.mVolumeMax; - mVolume = routeInfo.mVolume; - if (routeInfo.mExtras != null) { - mExtras = new Bundle(routeInfo.mExtras); - } - mProviderId = routeInfo.mProviderId; + this(routeInfo.mId, routeInfo); } /** @@ -715,6 +713,7 @@ public final class MediaRoute2Info implements Parcelable { mVolumeHandling = routeInfo.mVolumeHandling; mVolumeMax = routeInfo.mVolumeMax; mVolume = routeInfo.mVolume; + mAddress = routeInfo.mAddress; if (routeInfo.mExtras != null) { mExtras = new Bundle(routeInfo.mExtras); } @@ -864,6 +863,16 @@ public final class MediaRoute2Info implements Parcelable { return this; } + /** + * Sets the hardware address of the route. + * @hide + */ + @NonNull + public Builder setAddress(String address) { + mAddress = address; + return this; + } + /** * Sets a bundle of extras for the route. *

diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index b83a9c4835e01..3bdf1d0bf4073 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -430,7 +430,7 @@ public class InfoMediaManager extends MediaManager { case TYPE_HEARING_AID: case TYPE_BLUETOOTH_A2DP: final BluetoothDevice device = - BluetoothAdapter.getDefaultAdapter().getRemoteDevice(route.getOriginalId()); + BluetoothAdapter.getDefaultAdapter().getRemoteDevice(route.getAddress()); final CachedBluetoothDevice cachedDevice = mBluetoothManager.getCachedDeviceManager().findDevice(device); if (cachedDevice != null) { diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java index 248eb5b96b925..94d95f06050df 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java @@ -681,7 +681,7 @@ public class InfoMediaManagerTest { assertThat(mInfoMediaManager.mMediaDevices.get(0) instanceof PhoneMediaDevice).isTrue(); when(route2Info.getType()).thenReturn(TYPE_BLUETOOTH_A2DP); - when(route2Info.getOriginalId()).thenReturn("00:00:00:00:00:00"); + when(route2Info.getAddress()).thenReturn("00:00:00:00:00:00"); when(mLocalBluetoothManager.getCachedDeviceManager()) .thenReturn(cachedBluetoothDeviceManager); when(cachedBluetoothDeviceManager.findDevice(any(BluetoothDevice.class))) @@ -703,7 +703,7 @@ public class InfoMediaManagerTest { mock(CachedBluetoothDeviceManager.class); when(route2Info.getType()).thenReturn(TYPE_BLUETOOTH_A2DP); - when(route2Info.getOriginalId()).thenReturn("00:00:00:00:00:00"); + when(route2Info.getAddress()).thenReturn("00:00:00:00:00:00"); when(mLocalBluetoothManager.getCachedDeviceManager()) .thenReturn(cachedBluetoothDeviceManager); when(cachedBluetoothDeviceManager.findDevice(any(BluetoothDevice.class))) diff --git a/services/core/java/com/android/server/media/BluetoothRouteProvider.java b/services/core/java/com/android/server/media/BluetoothRouteProvider.java index 2461b0ce93a56..30a636d4240e4 100644 --- a/services/core/java/com/android/server/media/BluetoothRouteProvider.java +++ b/services/core/java/com/android/server/media/BluetoothRouteProvider.java @@ -247,6 +247,7 @@ class BluetoothRouteProvider { .setType(type) .setVolumeHandling(MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE) .setVolumeMax(mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)) + .setAddress(device.getAddress()) .build(); return newBtRoute; }