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)