summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/16.txt91
-rw-r--r--api/current.txt34
-rw-r--r--core/java/android/app/MediaRouteActionProvider.java4
-rw-r--r--core/java/android/app/MediaRouteButton.java8
-rw-r--r--core/res/AndroidManifest.xml6
-rw-r--r--media/java/android/media/MediaRouter.java230
6 files changed, 238 insertions, 135 deletions
diff --git a/api/16.txt b/api/16.txt
index 25885fb8af54..bcbccdab5ef1 100644
--- a/api/16.txt
+++ b/api/16.txt
@@ -675,6 +675,7 @@ package android {
field public static final int maxWidth = 16843039; // 0x101011f
field public static final int measureAllChildren = 16843018; // 0x101010a
field public static final int measureWithLargestChild = 16843476; // 0x10102d4
+ field public static final int mediaRouteButtonStyle = 16843693; // 0x10103ad
field public static final int menuCategory = 16843230; // 0x10101de
field public static final int mimeType = 16842790; // 0x1010026
field public static final int minDate = 16843583; // 0x101033f
@@ -1789,6 +1790,7 @@ package android {
field public static final int Widget_DeviceDefault_Light_ListPopupWindow = 16974235; // 0x103019b
field public static final int Widget_DeviceDefault_Light_ListView = 16974210; // 0x1030182
field public static final int Widget_DeviceDefault_Light_ListView_DropDown = 16974205; // 0x103017d
+ field public static final int Widget_DeviceDefault_Light_MediaRouteButton = 16974296; // 0x10301d8
field public static final int Widget_DeviceDefault_Light_PopupMenu = 16974236; // 0x103019c
field public static final int Widget_DeviceDefault_Light_PopupWindow = 16974211; // 0x1030183
field public static final int Widget_DeviceDefault_Light_ProgressBar = 16974212; // 0x1030184
@@ -1814,6 +1816,7 @@ package android {
field public static final int Widget_DeviceDefault_ListPopupWindow = 16974180; // 0x1030164
field public static final int Widget_DeviceDefault_ListView = 16974158; // 0x103014e
field public static final int Widget_DeviceDefault_ListView_DropDown = 16974153; // 0x1030149
+ field public static final int Widget_DeviceDefault_MediaRouteButton = 16974295; // 0x10301d7
field public static final int Widget_DeviceDefault_PopupMenu = 16974181; // 0x1030165
field public static final int Widget_DeviceDefault_PopupWindow = 16974159; // 0x103014f
field public static final int Widget_DeviceDefault_ProgressBar = 16974160; // 0x1030150
@@ -1905,6 +1908,7 @@ package android {
field public static final int Widget_Holo_Light_ListPopupWindow = 16974043; // 0x10300db
field public static final int Widget_Holo_Light_ListView = 16974018; // 0x10300c2
field public static final int Widget_Holo_Light_ListView_DropDown = 16974013; // 0x10300bd
+ field public static final int Widget_Holo_Light_MediaRouteButton = 16974294; // 0x10301d6
field public static final int Widget_Holo_Light_PopupMenu = 16974044; // 0x10300dc
field public static final int Widget_Holo_Light_PopupWindow = 16974019; // 0x10300c3
field public static final int Widget_Holo_Light_ProgressBar = 16974020; // 0x10300c4
@@ -1930,6 +1934,7 @@ package android {
field public static final int Widget_Holo_ListPopupWindow = 16973997; // 0x10300ad
field public static final int Widget_Holo_ListView = 16973975; // 0x1030097
field public static final int Widget_Holo_ListView_DropDown = 16973970; // 0x1030092
+ field public static final int Widget_Holo_MediaRouteButton = 16974293; // 0x10301d5
field public static final int Widget_Holo_PopupMenu = 16973998; // 0x10300ae
field public static final int Widget_Holo_PopupWindow = 16973976; // 0x1030098
field public static final int Widget_Holo_ProgressBar = 16973977; // 0x1030099
@@ -3671,6 +3676,20 @@ package android.app {
method public android.view.Window startActivity(java.lang.String, android.content.Intent);
}
+ public class MediaRouteActionProvider extends android.view.ActionProvider {
+ ctor public MediaRouteActionProvider(android.content.Context);
+ method public android.view.View onCreateActionView();
+ method public void setRouteTypes(int);
+ }
+
+ public class MediaRouteButton extends android.view.View {
+ ctor public MediaRouteButton(android.content.Context);
+ ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet);
+ ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet, int);
+ method public int getRouteTypes();
+ method public void setRouteTypes(int);
+ }
+
public class NativeActivity extends android.app.Activity implements android.view.InputQueue.Callback android.view.SurfaceHolder.Callback2 android.view.ViewTreeObserver.OnGlobalLayoutListener {
ctor public NativeActivity();
method public void onGlobalLayout();
@@ -11486,6 +11505,75 @@ package android.media {
field public static final int DEFAULT = 0; // 0x0
}
+ public class MediaRouter {
+ method public void addCallback(int, android.media.MediaRouter.Callback);
+ method public void addUserRoute(android.media.MediaRouter.UserRouteInfo);
+ method public void clearUserRoutes();
+ method public android.media.MediaRouter.RouteCategory createRouteCategory(java.lang.CharSequence, boolean);
+ method public android.media.MediaRouter.UserRouteInfo createUserRoute(android.media.MediaRouter.RouteCategory);
+ method public static android.media.MediaRouter forApplication(android.content.Context);
+ method public android.media.MediaRouter.RouteCategory getCategoryAt(int);
+ method public int getCategoryCount();
+ method public android.media.MediaRouter.RouteInfo getRouteAt(int);
+ method public int getRouteCount();
+ method public android.media.MediaRouter.RouteInfo getSelectedRoute(int);
+ method public void removeCallback(android.media.MediaRouter.Callback);
+ method public void removeUserRoute(android.media.MediaRouter.UserRouteInfo);
+ method public void selectRoute(int, android.media.MediaRouter.RouteInfo);
+ field public static final int ROUTE_TYPE_LIVE_AUDIO = 1; // 0x1
+ field public static final int ROUTE_TYPE_USER = 8388608; // 0x800000
+ }
+
+ public static abstract interface MediaRouter.Callback {
+ method public abstract void onRouteAdded(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
+ method public abstract void onRouteChanged(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
+ method public abstract void onRouteGrouped(android.media.MediaRouter, android.media.MediaRouter.RouteInfo, android.media.MediaRouter.RouteGroup, int);
+ method public abstract void onRouteRemoved(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
+ method public abstract void onRouteSelected(android.media.MediaRouter, int, android.media.MediaRouter.RouteInfo);
+ method public abstract void onRouteUngrouped(android.media.MediaRouter, android.media.MediaRouter.RouteInfo, android.media.MediaRouter.RouteGroup);
+ method public abstract void onRouteUnselected(android.media.MediaRouter, int, android.media.MediaRouter.RouteInfo);
+ }
+
+ public class MediaRouter.RouteCategory {
+ method public java.lang.CharSequence getName();
+ method public java.util.List<android.media.MediaRouter.RouteInfo> getRoutes(java.util.List<android.media.MediaRouter.RouteInfo>);
+ method public int getSupportedTypes();
+ method public boolean isGroupable();
+ }
+
+ public class MediaRouter.RouteGroup extends android.media.MediaRouter.RouteInfo {
+ method public void addRoute(android.media.MediaRouter.RouteInfo);
+ method public void addRoute(android.media.MediaRouter.RouteInfo, int);
+ method public android.media.MediaRouter.RouteInfo getRouteAt(int);
+ method public int getRouteCount();
+ method public void removeRoute(android.media.MediaRouter.RouteInfo);
+ method public void removeRoute(int);
+ }
+
+ public class MediaRouter.RouteInfo {
+ method public android.media.MediaRouter.RouteCategory getCategory();
+ method public android.media.MediaRouter.RouteGroup getGroup();
+ method public java.lang.CharSequence getName();
+ method public java.lang.CharSequence getStatus();
+ method public int getSupportedTypes();
+ }
+
+ public static class MediaRouter.SimpleCallback implements android.media.MediaRouter.Callback {
+ ctor public MediaRouter.SimpleCallback();
+ method public void onRouteAdded(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
+ method public void onRouteChanged(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
+ method public void onRouteGrouped(android.media.MediaRouter, android.media.MediaRouter.RouteInfo, android.media.MediaRouter.RouteGroup, int);
+ method public void onRouteRemoved(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
+ method public void onRouteSelected(android.media.MediaRouter, int, android.media.MediaRouter.RouteInfo);
+ method public void onRouteUngrouped(android.media.MediaRouter, android.media.MediaRouter.RouteInfo, android.media.MediaRouter.RouteGroup);
+ method public void onRouteUnselected(android.media.MediaRouter, int, android.media.MediaRouter.RouteInfo);
+ }
+
+ public class MediaRouter.UserRouteInfo extends android.media.MediaRouter.RouteInfo {
+ method public void setName(java.lang.CharSequence);
+ method public void setStatus(java.lang.CharSequence);
+ }
+
public class MediaScannerConnection implements android.content.ServiceConnection {
ctor public MediaScannerConnection(android.content.Context, android.media.MediaScannerConnection.MediaScannerConnectionClient);
method public void connect();
@@ -22710,7 +22798,8 @@ package android.view {
public abstract class ActionProvider {
ctor public ActionProvider(android.content.Context);
method public boolean hasSubMenu();
- method public abstract android.view.View onCreateActionView();
+ method public abstract deprecated android.view.View onCreateActionView();
+ method public android.view.View onCreateActionView(android.view.MenuItem);
method public boolean onPerformDefaultAction();
method public void onPrepareSubMenu(android.view.SubMenu);
}
diff --git a/api/current.txt b/api/current.txt
index 3beaaa5fbd7f..bcbccdab5ef1 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -98,7 +98,6 @@ package android {
field public static final java.lang.String RECORD_AUDIO = "android.permission.RECORD_AUDIO";
field public static final java.lang.String REORDER_TASKS = "android.permission.REORDER_TASKS";
field public static final deprecated java.lang.String RESTART_PACKAGES = "android.permission.RESTART_PACKAGES";
- field public static final java.lang.String ROUTE_MEDIA_OUTPUT = "android.permission.ROUTE_MEDIA_OUTPUT";
field public static final java.lang.String SEND_SMS = "android.permission.SEND_SMS";
field public static final java.lang.String SET_ACTIVITY_WATCHER = "android.permission.SET_ACTIVITY_WATCHER";
field public static final java.lang.String SET_ALARM = "com.android.alarm.permission.SET_ALARM";
@@ -11521,24 +11520,23 @@ package android.media {
method public void removeCallback(android.media.MediaRouter.Callback);
method public void removeUserRoute(android.media.MediaRouter.UserRouteInfo);
method public void selectRoute(int, android.media.MediaRouter.RouteInfo);
- method public void setSelectedRouteVolume(int, float);
field public static final int ROUTE_TYPE_LIVE_AUDIO = 1; // 0x1
field public static final int ROUTE_TYPE_USER = 8388608; // 0x800000
}
public static abstract interface MediaRouter.Callback {
- method public abstract void onRouteAdded(int, android.media.MediaRouter.RouteInfo);
- method public abstract void onRouteChanged(android.media.MediaRouter.RouteInfo);
- method public abstract void onRouteRemoved(int, android.media.MediaRouter.RouteInfo);
- method public abstract void onRouteSelected(int, android.media.MediaRouter.RouteInfo);
- method public abstract void onRouteUnselected(int, android.media.MediaRouter.RouteInfo);
- method public abstract void onVolumeChanged(int, float);
+ method public abstract void onRouteAdded(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
+ method public abstract void onRouteChanged(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
+ method public abstract void onRouteGrouped(android.media.MediaRouter, android.media.MediaRouter.RouteInfo, android.media.MediaRouter.RouteGroup, int);
+ method public abstract void onRouteRemoved(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
+ method public abstract void onRouteSelected(android.media.MediaRouter, int, android.media.MediaRouter.RouteInfo);
+ method public abstract void onRouteUngrouped(android.media.MediaRouter, android.media.MediaRouter.RouteInfo, android.media.MediaRouter.RouteGroup);
+ method public abstract void onRouteUnselected(android.media.MediaRouter, int, android.media.MediaRouter.RouteInfo);
}
public class MediaRouter.RouteCategory {
method public java.lang.CharSequence getName();
- method public android.media.MediaRouter.RouteInfo getRouteAt(int);
- method public int getRouteCount();
+ method public java.util.List<android.media.MediaRouter.RouteInfo> getRoutes(java.util.List<android.media.MediaRouter.RouteInfo>);
method public int getSupportedTypes();
method public boolean isGroupable();
}
@@ -11546,6 +11544,8 @@ package android.media {
public class MediaRouter.RouteGroup extends android.media.MediaRouter.RouteInfo {
method public void addRoute(android.media.MediaRouter.RouteInfo);
method public void addRoute(android.media.MediaRouter.RouteInfo, int);
+ method public android.media.MediaRouter.RouteInfo getRouteAt(int);
+ method public int getRouteCount();
method public void removeRoute(android.media.MediaRouter.RouteInfo);
method public void removeRoute(int);
}
@@ -11556,17 +11556,17 @@ package android.media {
method public java.lang.CharSequence getName();
method public java.lang.CharSequence getStatus();
method public int getSupportedTypes();
- method public float getVolume();
}
public static class MediaRouter.SimpleCallback implements android.media.MediaRouter.Callback {
ctor public MediaRouter.SimpleCallback();
- method public void onRouteAdded(int, android.media.MediaRouter.RouteInfo);
- method public void onRouteChanged(android.media.MediaRouter.RouteInfo);
- method public void onRouteRemoved(int, android.media.MediaRouter.RouteInfo);
- method public void onRouteSelected(int, android.media.MediaRouter.RouteInfo);
- method public void onRouteUnselected(int, android.media.MediaRouter.RouteInfo);
- method public void onVolumeChanged(int, float);
+ method public void onRouteAdded(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
+ method public void onRouteChanged(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
+ method public void onRouteGrouped(android.media.MediaRouter, android.media.MediaRouter.RouteInfo, android.media.MediaRouter.RouteGroup, int);
+ method public void onRouteRemoved(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
+ method public void onRouteSelected(android.media.MediaRouter, int, android.media.MediaRouter.RouteInfo);
+ method public void onRouteUngrouped(android.media.MediaRouter, android.media.MediaRouter.RouteInfo, android.media.MediaRouter.RouteGroup);
+ method public void onRouteUnselected(android.media.MediaRouter, int, android.media.MediaRouter.RouteInfo);
}
public class MediaRouter.UserRouteInfo extends android.media.MediaRouter.RouteInfo {
diff --git a/core/java/android/app/MediaRouteActionProvider.java b/core/java/android/app/MediaRouteActionProvider.java
index 301b125794b2..9b9e14f74dba 100644
--- a/core/java/android/app/MediaRouteActionProvider.java
+++ b/core/java/android/app/MediaRouteActionProvider.java
@@ -87,12 +87,12 @@ public class MediaRouteActionProvider extends ActionProvider {
private class RouterCallback extends MediaRouter.SimpleCallback {
@Override
- public void onRouteAdded(int type, RouteInfo info) {
+ public void onRouteAdded(MediaRouter router, RouteInfo info) {
mMenuItem.setVisible(mRouter.getRouteCount() > 1);
}
@Override
- public void onRouteRemoved(int type, RouteInfo info) {
+ public void onRouteRemoved(MediaRouter router, RouteInfo info) {
mMenuItem.setVisible(mRouter.getRouteCount() > 1);
}
}
diff --git a/core/java/android/app/MediaRouteButton.java b/core/java/android/app/MediaRouteButton.java
index 3aabd5d0d561..10c079361204 100644
--- a/core/java/android/app/MediaRouteButton.java
+++ b/core/java/android/app/MediaRouteButton.java
@@ -262,22 +262,22 @@ public class MediaRouteButton extends View {
private class MediaRouteCallback extends MediaRouter.SimpleCallback {
@Override
- public void onRouteSelected(int type, RouteInfo info) {
+ public void onRouteSelected(MediaRouter router, int type, RouteInfo info) {
updateRemoteIndicator();
}
@Override
- public void onRouteUnselected(int type, RouteInfo info) {
+ public void onRouteUnselected(MediaRouter router, int type, RouteInfo info) {
updateRemoteIndicator();
}
@Override
- public void onRouteAdded(int type, RouteInfo info) {
+ public void onRouteAdded(MediaRouter router, RouteInfo info) {
updateRouteCount();
}
@Override
- public void onRouteRemoved(int type, RouteInfo info) {
+ public void onRouteRemoved(MediaRouter router, RouteInfo info) {
updateRouteCount();
}
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 969801851b91..6546fedc18e0 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -636,12 +636,6 @@
android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
android:protectionLevel="signature" />
- <!-- Allows an application to route media output to other devices. -->
- <permission android:name="android.permission.ROUTE_MEDIA_OUTPUT"
- android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
- android:label="@string/permlab_route_media_output"
- android:description="@string/permdesc_route_media_output" />
-
<!-- =========================================== -->
<!-- Permissions associated with telephony state -->
<!-- =========================================== -->
diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java
index 7e4ca6a17363..8259a5f5ce99 100644
--- a/media/java/android/media/MediaRouter.java
+++ b/media/java/android/media/MediaRouter.java
@@ -26,6 +26,7 @@ import android.util.Log;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
/**
* MediaRouter allows applications to control the routing of media channels
@@ -119,16 +120,10 @@ public class MediaRouter {
ROUTE_TYPE_LIVE_AUDIO, false);
registerReceivers();
-
createDefaultRoutes();
}
private void registerReceivers() {
- final BroadcastReceiver volumeReceiver = new VolumeChangedBroadcastReceiver();
- mAppContext.registerReceiver(volumeReceiver,
- new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION));
- mRegisteredReceivers.add(volumeReceiver);
-
final IntentFilter speakerFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
speakerFilter.addAction(Intent.ACTION_ANALOG_AUDIO_DOCK_PLUG);
speakerFilter.addAction(Intent.ACTION_DIGITAL_AUDIO_DOCK_PLUG);
@@ -152,11 +147,6 @@ public class MediaRouter {
mDefaultAudio.mName = mAppContext.getText(
com.android.internal.R.string.default_audio_route_name);
mDefaultAudio.mSupportedTypes = ROUTE_TYPE_LIVE_AUDIO;
- final int maxMusicVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
- if (maxMusicVolume > 0) {
- mDefaultAudio.mVolume =
- mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC) / maxMusicVolume;
- }
addRoute(mDefaultAudio);
}
@@ -184,23 +174,6 @@ public class MediaRouter {
}
/**
- * Set volume for the specified selected route types.
- *
- * @param types Volume will be set for these route types
- * @param volume Volume to set in the range 0.f (inaudible) to 1.f (full volume).
- */
- public void setSelectedRouteVolume(int types, float volume) {
- if ((types & ROUTE_TYPE_LIVE_AUDIO) != 0 && mSelectedRoute == mDefaultAudio) {
- final int index = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
- mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, index, 0);
- }
- if ((types & ROUTE_TYPE_USER) != 0 && mSelectedRoute instanceof UserRouteInfo) {
- mSelectedRoute.mVolume = volume;
- dispatchVolumeChanged(ROUTE_TYPE_USER, volume);
- }
- }
-
- /**
* Add a callback to listen to events about specific kinds of media routes.
* If the specified callback is already registered, its registration will be updated for any
* additional route types specified.
@@ -236,6 +209,13 @@ public class MediaRouter {
Log.w(TAG, "removeCallback(" + cb + "): callback not registered");
}
+ /**
+ * Select the specified route to use for output of the given media types.
+ *
+ * @param types type flags indicating which types this route should be used for.
+ * The route must support at least a subset.
+ * @param route Route to select
+ */
public void selectRoute(int types, RouteInfo route) {
if (mSelectedRoute == route) return;
@@ -267,15 +247,23 @@ public class MediaRouter {
if (!mCategories.contains(cat)) {
mCategories.add(cat);
}
- if (info.getCategory().isGroupable() && !(info instanceof RouteGroup)) {
+ final boolean onlyRoute = mRoutes.isEmpty();
+ if (cat.isGroupable() && !(info instanceof RouteGroup)) {
// Enforce that any added route in a groupable category must be in a group.
final RouteGroup group = new RouteGroup(info.getCategory());
+ mRoutes.add(group);
+ dispatchRouteAdded(group);
+
+ final int at = group.getRouteCount();
group.addRoute(info);
+ dispatchRouteGrouped(info, group, at);
+
info = group;
+ } else {
+ mRoutes.add(info);
+ dispatchRouteAdded(info);
}
- final boolean onlyRoute = mRoutes.isEmpty();
- mRoutes.add(info);
- dispatchRouteAdded(info);
+
if (onlyRoute) {
selectRoute(info.getSupportedTypes(), info);
}
@@ -420,7 +408,7 @@ public class MediaRouter {
for (int i = 0; i < count; i++) {
final CallbackInfo cbi = mCallbacks.get(i);
if ((cbi.type & type) != 0) {
- cbi.cb.onRouteSelected(type, info);
+ cbi.cb.onRouteSelected(this, type, info);
}
}
}
@@ -430,7 +418,7 @@ public class MediaRouter {
for (int i = 0; i < count; i++) {
final CallbackInfo cbi = mCallbacks.get(i);
if ((cbi.type & type) != 0) {
- cbi.cb.onRouteUnselected(type, info);
+ cbi.cb.onRouteUnselected(this, type, info);
}
}
}
@@ -440,7 +428,7 @@ public class MediaRouter {
for (int i = 0; i < count; i++) {
final CallbackInfo cbi = mCallbacks.get(i);
if ((cbi.type & info.mSupportedTypes) != 0) {
- cbi.cb.onRouteChanged(info);
+ cbi.cb.onRouteChanged(this, info);
}
}
}
@@ -450,7 +438,7 @@ public class MediaRouter {
for (int i = 0; i < count; i++) {
final CallbackInfo cbi = mCallbacks.get(i);
if ((cbi.type & info.mSupportedTypes) != 0) {
- cbi.cb.onRouteAdded(info.mSupportedTypes, info);
+ cbi.cb.onRouteAdded(this, info);
}
}
}
@@ -460,17 +448,27 @@ public class MediaRouter {
for (int i = 0; i < count; i++) {
final CallbackInfo cbi = mCallbacks.get(i);
if ((cbi.type & info.mSupportedTypes) != 0) {
- cbi.cb.onRouteRemoved(info.mSupportedTypes, info);
+ cbi.cb.onRouteRemoved(this, info);
}
}
}
- void dispatchVolumeChanged(int type, float volume) {
+ void dispatchRouteGrouped(RouteInfo info, RouteGroup group, int index) {
final int count = mCallbacks.size();
for (int i = 0; i < count; i++) {
final CallbackInfo cbi = mCallbacks.get(i);
- if ((cbi.type & type) != 0) {
- cbi.cb.onVolumeChanged(type, volume);
+ if ((cbi.type & group.mSupportedTypes) != 0) {
+ cbi.cb.onRouteGrouped(this, info, group, index);
+ }
+ }
+ }
+
+ void dispatchRouteUngrouped(RouteInfo info, RouteGroup group) {
+ final int count = mCallbacks.size();
+ for (int i = 0; i < count; i++) {
+ final CallbackInfo cbi = mCallbacks.get(i);
+ if ((cbi.type & group.mSupportedTypes) != 0) {
+ cbi.cb.onRouteUngrouped(this, info, group);
}
}
}
@@ -496,11 +494,9 @@ public class MediaRouter {
int mSupportedTypes;
RouteGroup mGroup;
final RouteCategory mCategory;
- float mVolume;
RouteInfo(RouteCategory category) {
mCategory = category;
- category.mRoutes.add(this);
}
/**
@@ -540,13 +536,6 @@ public class MediaRouter {
return mCategory;
}
- /**
- * @return This route's current volume setting.
- */
- public float getVolume() {
- return mVolume;
- }
-
void setStatusInt(CharSequence status) {
if (!status.equals(mStatus)) {
mStatus = status;
@@ -634,8 +623,10 @@ public class MediaRouter {
"(Route category=" + route.getCategory() +
" group category=" + mCategory + ")");
}
+ final int at = mRoutes.size();
mRoutes.add(route);
mUpdateName = true;
+ dispatchRouteGrouped(route, this, at);
routeUpdated();
}
@@ -657,6 +648,7 @@ public class MediaRouter {
}
mRoutes.add(insertAt, route);
mUpdateName = true;
+ dispatchRouteGrouped(route, this, insertAt);
routeUpdated();
}
@@ -672,6 +664,7 @@ public class MediaRouter {
}
mRoutes.remove(route);
mUpdateName = true;
+ dispatchRouteUngrouped(route, this);
routeUpdated();
}
@@ -681,11 +674,29 @@ public class MediaRouter {
* @param index index of the route to remove
*/
public void removeRoute(int index) {
- mRoutes.remove(index);
+ RouteInfo route = mRoutes.remove(index);
mUpdateName = true;
+ dispatchRouteUngrouped(route, this);
routeUpdated();
}
+ /**
+ * @return The number of routes in this group
+ */
+ public int getRouteCount() {
+ return mRoutes.size();
+ }
+
+ /**
+ * Return the route in this group at the specified index
+ *
+ * @param index Index to fetch
+ * @return The route at index
+ */
+ public RouteInfo getRouteAt(int index) {
+ return mRoutes.get(index);
+ }
+
void memberNameChanged(RouteInfo info, CharSequence name) {
mUpdateName = true;
routeUpdated();
@@ -712,7 +723,6 @@ public class MediaRouter {
* Definition of a category of routes. All routes belong to a category.
*/
public class RouteCategory {
- final ArrayList<RouteInfo> mRoutes = new ArrayList<RouteInfo>();
CharSequence mName;
int mTypes;
final boolean mGroupable;
@@ -731,20 +741,33 @@ public class MediaRouter {
}
/**
- * @return the number of routes in this category
- */
- public int getRouteCount() {
- return mRoutes.size();
- }
-
- /**
- * Return a route from this category
+ * Return the current list of routes in this category that have been added
+ * to the MediaRouter.
*
- * @param index Index from [0-getRouteCount)
- * @return the route at the given index
+ * <p>This list will not include routes that are nested within RouteGroups.
+ * A RouteGroup is treated as a single route within its category.</p>
+ *
+ * @param out a List to fill with the routes in this category. If this parameter is
+ * non-null, it will be cleared, filled with the current routes with this
+ * category, and returned. If this parameter is null, a new List will be
+ * allocated to report the category's current routes.
+ * @return A list with the routes in this category that have been added to the MediaRouter.
*/
- public RouteInfo getRouteAt(int index) {
- return mRoutes.get(index);
+ public List<RouteInfo> getRoutes(List<RouteInfo> out) {
+ if (out == null) {
+ out = new ArrayList<RouteInfo>();
+ } else {
+ out.clear();
+ }
+
+ final int count = getRouteCount();
+ for (int i = 0; i < count; i++) {
+ final RouteInfo route = getRouteAt(i);
+ if (route.mCategory == this) {
+ out.add(route);
+ }
+ }
+ return out;
}
/**
@@ -758,7 +781,7 @@ public class MediaRouter {
* Return whether or not this category supports grouping.
*
* <p>If this method returns true, all routes obtained from this category
- * via calls to {@link #getRouteAt(int)} will be {@link MediaRouter.RouteGroup}s.
+ * via calls to {@link #getRouteAt(int)} will be {@link MediaRouter.RouteGroup}s.</p>
*
* @return true if this category supports
*/
@@ -797,43 +820,37 @@ public class MediaRouter {
* Called when the supplied route becomes selected as the active route
* for the given route type.
*
+ * @param router the MediaRouter reporting the event
* @param type Type flag set indicating the routes that have been selected
* @param info Route that has been selected for the given route types
*/
- public void onRouteSelected(int type, RouteInfo info);
+ public void onRouteSelected(MediaRouter router, int type, RouteInfo info);
/**
* Called when the supplied route becomes unselected as the active route
* for the given route type.
*
+ * @param router the MediaRouter reporting the event
* @param type Type flag set indicating the routes that have been unselected
* @param info Route that has been unselected for the given route types
*/
- public void onRouteUnselected(int type, RouteInfo info);
-
- /**
- * Called when the volume is changed for the specified route types.
- *
- * @param type Type flags indicating which volume type was changed
- * @param volume New volume value in the range 0 (inaudible) to 1 (full)
- */
- public void onVolumeChanged(int type, float volume);
+ public void onRouteUnselected(MediaRouter router, int type, RouteInfo info);
/**
* Called when a route for the specified type was added.
*
- * @param type Type flags indicating which types the added route supports
+ * @param router the MediaRouter reporting the event
* @param info Route that has become available for use
*/
- public void onRouteAdded(int type, RouteInfo info);
+ public void onRouteAdded(MediaRouter router, RouteInfo info);
/**
* Called when a route for the specified type was removed.
*
- * @param type Type flags indicating which types the removed route supported
+ * @param router the MediaRouter reporting the event
* @param info Route that has been removed from availability
*/
- public void onRouteRemoved(int type, RouteInfo info);
+ public void onRouteRemoved(MediaRouter router, RouteInfo info);
/**
* Called when an aspect of the indicated route has changed.
@@ -841,9 +858,29 @@ public class MediaRouter {
* <p>This will not indicate that the types supported by this route have
* changed, only that cosmetic info such as name or status have been updated.</p>
*
+ * @param router the MediaRouter reporting the event
* @param info The route that was changed
*/
- public void onRouteChanged(RouteInfo info);
+ public void onRouteChanged(MediaRouter router, RouteInfo info);
+
+ /**
+ * Called when a route is added to a group.
+ *
+ * @param router the MediaRouter reporting the event
+ * @param info The route that was added
+ * @param group The group the route was added to
+ * @param index The route index within group that info was added at
+ */
+ public void onRouteGrouped(MediaRouter router, RouteInfo info, RouteGroup group, int index);
+
+ /**
+ * Called when a route is removed from a group.
+ *
+ * @param router the MediaRouter reporting the event
+ * @param info The route that was removed
+ * @param group The group the route was removed from
+ */
+ public void onRouteUngrouped(MediaRouter router, RouteInfo info, RouteGroup group);
}
/**
@@ -854,51 +891,34 @@ public class MediaRouter {
public static class SimpleCallback implements Callback {
@Override
- public void onRouteSelected(int type, RouteInfo info) {
-
+ public void onRouteSelected(MediaRouter router, int type, RouteInfo info) {
}
@Override
- public void onRouteUnselected(int type, RouteInfo info) {
-
+ public void onRouteUnselected(MediaRouter router, int type, RouteInfo info) {
}
@Override
- public void onVolumeChanged(int type, float volume) {
-
+ public void onRouteAdded(MediaRouter router, RouteInfo info) {
}
@Override
- public void onRouteAdded(int type, RouteInfo info) {
-
+ public void onRouteRemoved(MediaRouter router, RouteInfo info) {
}
@Override
- public void onRouteRemoved(int type, RouteInfo info) {
-
+ public void onRouteChanged(MediaRouter router, RouteInfo info) {
}
@Override
- public void onRouteChanged(RouteInfo info) {
-
+ public void onRouteGrouped(MediaRouter router, RouteInfo info, RouteGroup group,
+ int index) {
}
- }
-
- class VolumeChangedBroadcastReceiver extends BroadcastReceiver {
@Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- if (AudioManager.VOLUME_CHANGED_ACTION.equals(action) &&
- AudioManager.STREAM_MUSIC == intent.getIntExtra(
- AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1)) {
- final int maxVol = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
- final int volExtra = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, 0);
- final float volume = (float) volExtra / maxVol;
- mDefaultAudio.mVolume = volume;
- dispatchVolumeChanged(ROUTE_TYPE_LIVE_AUDIO, volume);
- }
+ public void onRouteUngrouped(MediaRouter router, RouteInfo info, RouteGroup group) {
}
+
}
class BtChangedBroadcastReceiver extends BroadcastReceiver {