From 8828c891e042c1820aa29cf5575ff6c04417844d Mon Sep 17 00:00:00 2001 From: Kyunglyul Hyun Date: Mon, 17 Feb 2020 20:49:58 +0900 Subject: [PATCH] MediaRouter: Define route type Change deviceType to type and define more types. TYPE_GROUP is also added to classify static group routes. Device type for the default route is set from now Bug: 149677159 Test: cts test and atest mediaroutertest Change-Id: I0626efe7b6160f22fe69a0b75368ee1a67d8768c --- media/java/android/media/MediaRoute2Info.java | 177 ++++++++++++++++-- .../SampleMediaRoute2ProviderService.java | 8 +- .../server/media/BluetoothRouteProvider.java | 3 +- .../media/SystemMediaRoute2Provider.java | 3 + 4 files changed, 169 insertions(+), 22 deletions(-) diff --git a/media/java/android/media/MediaRoute2Info.java b/media/java/android/media/MediaRoute2Info.java index bf04fe88f9e47..8d63cf04da6da 100644 --- a/media/java/android/media/MediaRoute2Info.java +++ b/media/java/android/media/MediaRoute2Info.java @@ -104,10 +104,12 @@ public final class MediaRoute2Info implements Parcelable { /** @hide */ @IntDef({ - DEVICE_TYPE_UNKNOWN, DEVICE_TYPE_REMOTE_TV, - DEVICE_TYPE_REMOTE_SPEAKER, DEVICE_TYPE_BLUETOOTH}) + TYPE_UNKNOWN, TYPE_BUILTIN_SPEAKER, TYPE_WIRED_HEADSET, + TYPE_WIRED_HEADPHONES, TYPE_BLUETOOTH_A2DP, TYPE_HDMI, TYPE_USB_DEVICE, + TYPE_USB_ACCESSORY, TYPE_DOCK, TYPE_USB_HEADSET, TYPE_HEARING_AID, + TYPE_REMOTE_TV, TYPE_REMOTE_SPEAKER, TYPE_GROUP}) @Retention(RetentionPolicy.SOURCE) - public @interface DeviceType {} + public @interface Type {} /** * The default receiver device type of the route indicating the type is unknown. @@ -140,6 +142,121 @@ public final class MediaRoute2Info implements Parcelable { */ public static final int DEVICE_TYPE_BLUETOOTH = 3; + + /** + * The default route type indicating the type is unknown. + * + * @see #getType + * @hide + */ + public static final int TYPE_UNKNOWN = 0; + + /** + * A route type describing the speaker system (i.e. a mono speaker or stereo speakers) built + * in a device. + * + * @see #getType + * @hide + */ + public static final int TYPE_BUILTIN_SPEAKER = AudioDeviceInfo.TYPE_BUILTIN_SPEAKER; + + /** + * A route type describing a headset, which is the combination of a headphones and microphone. + * + * @see #getType + * @hide + */ + public static final int TYPE_WIRED_HEADSET = AudioDeviceInfo.TYPE_WIRED_HEADSET; + + /** + * A route type describing a pair of wired headphones. + * + * @see #getType + * @hide + */ + public static final int TYPE_WIRED_HEADPHONES = AudioDeviceInfo.TYPE_WIRED_HEADPHONES; + + /** + * A route type indicating the presentation of the media is happening + * on a bluetooth device such as a bluetooth speaker. + * + * @see #getType + * @hide + */ + public static final int TYPE_BLUETOOTH_A2DP = AudioDeviceInfo.TYPE_BLUETOOTH_A2DP; + + /** + * A route type describing an HDMI connection. + * + * @see #getType + * @hide + */ + public static final int TYPE_HDMI = AudioDeviceInfo.TYPE_HDMI; + + /** + * A route type describing a USB audio device. + * + * @see #getType + * @hide + */ + public static final int TYPE_USB_DEVICE = AudioDeviceInfo.TYPE_USB_DEVICE; + + /** + * A route type describing a USB audio device in accessory mode. + * + * @see #getType + * @hide + */ + public static final int TYPE_USB_ACCESSORY = AudioDeviceInfo.TYPE_USB_ACCESSORY; + + /** + * A route type describing the audio device associated with a dock. + * + * @see #getType + * @hide + */ + public static final int TYPE_DOCK = AudioDeviceInfo.TYPE_DOCK; + + /** + * A device type describing a USB audio headset. + * + * @see #getType + * @hide + */ + public static final int TYPE_USB_HEADSET = AudioDeviceInfo.TYPE_USB_HEADSET; + + /** + * A route type describing a Hearing Aid. + * + * @see #getType + * @hide + */ + public static final int TYPE_HEARING_AID = AudioDeviceInfo.TYPE_HEARING_AID; + + /** + * A route type indicating the presentation of the media is happening on a TV. + * + * @see #getType + * @hide + */ + public static final int TYPE_REMOTE_TV = 1001; + + /** + * A route type indicating the presentation of the media is happening on a speaker. + * + * @see #getType + * @hide + */ + public static final int TYPE_REMOTE_SPEAKER = 1002; + + /** + * A route type indicating the presentation of the media is happening on multiple devices. + * + * @see #getType + * @hide + */ + public static final int TYPE_GROUP = 2000; + /** * Media feature: Live audio. *

@@ -196,8 +313,8 @@ public final class MediaRoute2Info implements Parcelable { final String mId; final CharSequence mName; final List mFeatures; - @DeviceType - final int mDeviceType; + @Type + final int mType; final boolean mIsSystem; final Uri mIconUri; final CharSequence mDescription; @@ -214,7 +331,7 @@ public final class MediaRoute2Info implements Parcelable { mId = builder.mId; mName = builder.mName; mFeatures = builder.mFeatures; - mDeviceType = builder.mDeviceType; + mType = builder.mType; mIsSystem = builder.mIsSystem; mIconUri = builder.mIconUri; mDescription = builder.mDescription; @@ -231,7 +348,7 @@ public final class MediaRoute2Info implements Parcelable { mId = in.readString(); mName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); mFeatures = in.createStringArrayList(); - mDeviceType = in.readInt(); + mType = in.readInt(); mIsSystem = in.readBoolean(); mIconUri = in.readParcelable(null); mDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); @@ -285,9 +402,26 @@ public final class MediaRoute2Info implements Parcelable { * {@link #DEVICE_TYPE_REMOTE_TV}, {@link #DEVICE_TYPE_REMOTE_SPEAKER}, * {@link #DEVICE_TYPE_BLUETOOTH}. */ - @DeviceType + @Type public int getDeviceType() { - return mDeviceType; + return getType(); + } + + /** + * Gets the type of this route. + * + * @return The type of this route: + * {@link #TYPE_UNKNOWN}, + * {@link #TYPE_BUILTIN_SPEAKER}, {@link #TYPE_WIRED_HEADSET}, {@link #TYPE_WIRED_HEADPHONES}, + * {@link #TYPE_BLUETOOTH_A2DP}, {@link #TYPE_HDMI}, {@link #TYPE_DOCK}, + * {@Link #TYPE_USB_DEVICE}, {@link #TYPE_USB_ACCESSORY}, {@link #TYPE_USB_HEADSET} + * {@link #TYPE_HEARING_AID}, + * {@link #TYPE_REMOTE_TV}, {@link #TYPE_REMOTE_SPEAKER}, {@link #TYPE_GROUP}. + * @hide + */ + @Type + public int getType() { + return mType; } /** @@ -437,7 +571,7 @@ public final class MediaRoute2Info implements Parcelable { return Objects.equals(mId, other.mId) && Objects.equals(mName, other.mName) && Objects.equals(mFeatures, other.mFeatures) - && (mDeviceType == other.mDeviceType) + && (mType == other.mType) && (mIsSystem == other.mIsSystem) && Objects.equals(mIconUri, other.mIconUri) && Objects.equals(mDescription, other.mDescription) @@ -452,7 +586,7 @@ public final class MediaRoute2Info implements Parcelable { @Override public int hashCode() { // Note: mExtras is not included. - return Objects.hash(mId, mName, mFeatures, mDeviceType, mIsSystem, mIconUri, mDescription, + return Objects.hash(mId, mName, mFeatures, mType, mIsSystem, mIconUri, mDescription, mConnectionState, mClientPackageName, mVolumeHandling, mVolumeMax, mVolume, mProviderId); } @@ -488,7 +622,7 @@ public final class MediaRoute2Info implements Parcelable { dest.writeString(mId); TextUtils.writeToParcel(mName, dest, flags); dest.writeStringList(mFeatures); - dest.writeInt(mDeviceType); + dest.writeInt(mType); dest.writeBoolean(mIsSystem); dest.writeParcelable(mIconUri, flags); TextUtils.writeToParcel(mDescription, dest, flags); @@ -509,8 +643,8 @@ public final class MediaRoute2Info implements Parcelable { final CharSequence mName; final List mFeatures; - @DeviceType - int mDeviceType = DEVICE_TYPE_UNKNOWN; + @Type + int mType = TYPE_UNKNOWN; boolean mIsSystem; Uri mIconUri; CharSequence mDescription; @@ -557,7 +691,7 @@ public final class MediaRoute2Info implements Parcelable { mId = routeInfo.mId; mName = routeInfo.mName; mFeatures = new ArrayList<>(routeInfo.mFeatures); - mDeviceType = routeInfo.mDeviceType; + mType = routeInfo.mType; mIsSystem = routeInfo.mIsSystem; mIconUri = routeInfo.mIconUri; mDescription = routeInfo.mDescription; @@ -621,8 +755,17 @@ public final class MediaRoute2Info implements Parcelable { * Sets the route's device type. */ @NonNull - public Builder setDeviceType(@DeviceType int deviceType) { - mDeviceType = deviceType; + public Builder setDeviceType(@Type int type) { + return setType(type); + } + + /** + * Sets the route's type. + * @hide + */ + @NonNull + public Builder setType(@Type int type) { + mType = type; return this; } diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/SampleMediaRoute2ProviderService.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/SampleMediaRoute2ProviderService.java index 3faefdb148e15..641e5f2c80441 100644 --- a/media/tests/MediaRouter/src/com/android/mediaroutertest/SampleMediaRoute2ProviderService.java +++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/SampleMediaRoute2ProviderService.java @@ -16,9 +16,9 @@ package com.android.mediaroutertest; -import static android.media.MediaRoute2Info.DEVICE_TYPE_REMOTE_SPEAKER; -import static android.media.MediaRoute2Info.DEVICE_TYPE_REMOTE_TV; import static android.media.MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE; +import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER; +import static android.media.MediaRoute2Info.TYPE_REMOTE_TV; import android.annotation.NonNull; import android.annotation.Nullable; @@ -79,11 +79,11 @@ public class SampleMediaRoute2ProviderService extends MediaRoute2ProviderService private void initializeRoutes() { MediaRoute2Info route1 = new MediaRoute2Info.Builder(ROUTE_ID1, ROUTE_NAME1) .addFeature(FEATURE_SAMPLE) - .setDeviceType(DEVICE_TYPE_REMOTE_TV) + .setType(TYPE_REMOTE_TV) .build(); MediaRoute2Info route2 = new MediaRoute2Info.Builder(ROUTE_ID2, ROUTE_NAME2) .addFeature(FEATURE_SAMPLE) - .setDeviceType(DEVICE_TYPE_REMOTE_SPEAKER) + .setType(TYPE_REMOTE_SPEAKER) .build(); MediaRoute2Info route3 = new MediaRoute2Info.Builder( ROUTE_ID3_SESSION_CREATION_FAILED, ROUTE_NAME3) diff --git a/services/core/java/com/android/server/media/BluetoothRouteProvider.java b/services/core/java/com/android/server/media/BluetoothRouteProvider.java index 33e01bd211055..265b9ad105618 100644 --- a/services/core/java/com/android/server/media/BluetoothRouteProvider.java +++ b/services/core/java/com/android/server/media/BluetoothRouteProvider.java @@ -213,7 +213,8 @@ class BluetoothRouteProvider { .setConnectionState(MediaRoute2Info.CONNECTION_STATE_DISCONNECTED) .setDescription(mContext.getResources().getText( R.string.bluetooth_a2dp_audio_route_name).toString()) - .setDeviceType(MediaRoute2Info.DEVICE_TYPE_BLUETOOTH) + //TODO: Set type correctly (BLUETOOTH_A2DP or HEARING_AID) + .setType(MediaRoute2Info.TYPE_BLUETOOTH_A2DP) .setVolumeHandling(MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE) .build(); newBtRoute.connectedProfiles = new SparseBooleanArray(); diff --git a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java index f7e1398a2bd3d..c73df576b5f01 100644 --- a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java +++ b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java @@ -18,6 +18,7 @@ package com.android.server.media; import static android.media.MediaRoute2Info.FEATURE_LIVE_AUDIO; import static android.media.MediaRoute2Info.FEATURE_LIVE_VIDEO; +import static android.media.MediaRoute2Info.TYPE_BUILTIN_SPEAKER; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -192,6 +193,8 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { : MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE) .setVolumeMax(mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)) .setVolume(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)) + //TODO: Guess the exact type using AudioDevice + .setType(TYPE_BUILTIN_SPEAKER) .addFeature(FEATURE_LIVE_AUDIO) .addFeature(FEATURE_LIVE_VIDEO) .setConnectionState(MediaRoute2Info.CONNECTION_STATE_CONNECTED)