summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJae Seo <jaeseo@google.com>2015-10-07 17:33:47 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-10-07 17:33:47 +0000
commit052b1d4aeb2221a4efc0d260c7d5054d8141957b (patch)
tree24ae1e6d358f15b8bfd0f639f2f33a6d36952c67
parent0750ff8d6b237fb471e126bebab7d858a57cf195 (diff)
parent2bd1f62c4cc1398ee31ffbd87a6aae12294533ec (diff)
downloadandroid_development-052b1d4aeb2221a4efc0d260c7d5054d8141957b.tar.gz
android_development-052b1d4aeb2221a4efc0d260c7d5054d8141957b.tar.bz2
android_development-052b1d4aeb2221a4efc0d260c7d5054d8141957b.zip
Merge "Support7Demos: Update the MediaRouter demo" into mnc-ub-dev
-rw-r--r--samples/Support7Demos/AndroidManifest.xml6
-rwxr-xr-xsamples/Support7Demos/res/drawable-hdpi/ic_android.pngbin0 -> 358 bytes
-rwxr-xr-xsamples/Support7Demos/res/drawable-mdpi/ic_android.pngbin0 -> 226 bytes
-rw-r--r--samples/Support7Demos/res/layout/sample_media_router.xml6
-rw-r--r--samples/Support7Demos/res/values/strings.xml5
-rw-r--r--samples/Support7Demos/res/values/styles.xml35
-rw-r--r--samples/Support7Demos/src/com/example/android/supportv7/media/LocalPlayer.java75
-rw-r--r--samples/Support7Demos/src/com/example/android/supportv7/media/MyMediaRouteControllerDialog.java44
-rw-r--r--samples/Support7Demos/src/com/example/android/supportv7/media/OverlayDisplayWindow.java7
-rw-r--r--samples/Support7Demos/src/com/example/android/supportv7/media/Player.java33
-rw-r--r--samples/Support7Demos/src/com/example/android/supportv7/media/RemotePlayer.java5
-rw-r--r--samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaButtonReceiver.java3
-rw-r--r--samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProvider.java37
-rw-r--r--samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java18
-rw-r--r--samples/Support7Demos/src/com/example/android/supportv7/media/SessionManager.java2
15 files changed, 212 insertions, 64 deletions
diff --git a/samples/Support7Demos/AndroidManifest.xml b/samples/Support7Demos/AndroidManifest.xml
index 164411ac2..1b8850772 100644
--- a/samples/Support7Demos/AndroidManifest.xml
+++ b/samples/Support7Demos/AndroidManifest.xml
@@ -62,7 +62,7 @@
<activity android:name=".media.SampleMediaRouterActivity"
android:configChanges="orientation|screenSize"
android:label="@string/sample_media_router_activity_dark"
- android:theme="@style/Theme.AppCompat">
+ android:theme="@style/Theme.SampleMediaRouter">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="com.example.android.supportv7.SAMPLE_CODE" />
@@ -72,7 +72,7 @@
<activity android:name=".media.SampleMediaRouterActivity$Light"
android:configChanges="orientation|screenSize"
android:label="@string/sample_media_router_activity_light"
- android:theme="@style/Theme.AppCompat.Light">
+ android:theme="@style/Theme.SampleMediaRouter.Light">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="com.example.android.supportv7.SAMPLE_CODE" />
@@ -82,7 +82,7 @@
<activity android:name=".media.SampleMediaRouterActivity$LightWithDarkActionBar"
android:configChanges="orientation|screenSize"
android:label="@string/sample_media_router_activity_light_with_dark_action_bar"
- android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
+ android:theme="@style/Theme.SampleMediaRouter.Light.DarkActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="com.example.android.supportv7.SAMPLE_CODE" />
diff --git a/samples/Support7Demos/res/drawable-hdpi/ic_android.png b/samples/Support7Demos/res/drawable-hdpi/ic_android.png
new file mode 100755
index 000000000..94b8fb1fa
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-hdpi/ic_android.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/ic_android.png b/samples/Support7Demos/res/drawable-mdpi/ic_android.png
new file mode 100755
index 000000000..afc43dbdd
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-mdpi/ic_android.png
Binary files differ
diff --git a/samples/Support7Demos/res/layout/sample_media_router.xml b/samples/Support7Demos/res/layout/sample_media_router.xml
index e2f7008df..618a8e40f 100644
--- a/samples/Support7Demos/res/layout/sample_media_router.xml
+++ b/samples/Support7Demos/res/layout/sample_media_router.xml
@@ -76,6 +76,12 @@
</TabHost>
<!-- Control buttons for the currently selected route. -->
+ <CheckBox android:id="@+id/custom_control_view_checkbox"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/use_default_media_control"
+ android:checked="true"
+ android:visibility="gone"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/samples/Support7Demos/res/values/strings.xml b/samples/Support7Demos/res/values/strings.xml
index 85c1303c2..d0b97f1cc 100644
--- a/samples/Support7Demos/res/values/strings.xml
+++ b/samples/Support7Demos/res/values/strings.xml
@@ -27,6 +27,9 @@
<string name="media_route_menu_title">Play on...</string>
<string name="sample_media_route_settings_activity">Sample route settings</string>
+ <string name="use_default_media_control">Use default media control</string>
+ <string name="my_media_control_text">My Media Control</string>
+
<string name="library_tab_text">Library</string>
<string name="playlist_tab_text">Playlist</string>
<string name="info_tab_text">Route Info</string>
@@ -36,6 +39,8 @@
<string name="variable_volume_basic_route_name">Variable Volume (Basic) Remote Playback Route</string>
<string name="variable_volume_queuing_route_name">Variable Volume (Queuing) Remote Playback Route</string>
<string name="variable_volume_session_route_name">Variable Volume (Session) Remote Playback Route</string>
+ <string name="variable_volume_route_group_name">Variable Volume Route Group</string>
+ <string name="mixed_volume_route_group_name">Mixed Volume Route Group</string>
<string name="sample_route_description">Sample route from Support7Demos</string>
<!-- GridLayout -->
diff --git a/samples/Support7Demos/res/values/styles.xml b/samples/Support7Demos/res/values/styles.xml
index 26a9f70de..a78893826 100644
--- a/samples/Support7Demos/res/values/styles.xml
+++ b/samples/Support7Demos/res/values/styles.xml
@@ -29,8 +29,41 @@
<item name="colorAccent">#ffff00</item>
</style>
+ <style name="Theme.SampleMediaRouter" parent="Theme.AppCompat">
+ <item name="colorPrimary">#fff44336</item>
+ <item name="colorPrimaryDark">#d32f2f</item>
+ <item name="alertDialogTheme">@style/Theme.SampleMediaRouter.Dialog.Alert</item>
+ </style>
+
+ <style name="Theme.SampleMediaRouter.Light" parent="Theme.AppCompat.Light">
+ <item name="colorPrimary">#ffff9800</item>
+ <item name="colorPrimaryDark">#f57c00</item>
+ <item name="alertDialogTheme">@style/Theme.SampleMediaRouter.Light.Dialog.Alert</item>
+ </style>
+
+ <style name="Theme.SampleMediaRouter.Light.DarkActionBar" parent="Theme.AppCompat.Light.DarkActionBar">
+ <item name="colorPrimary">#ff2196f3</item>
+ <item name="colorPrimaryDark">#1976d2</item>
+ <item name="alertDialogTheme">@style/Theme.SampleMediaRouter.Light.DarkActionBar.Dialog.Alert</item>
+ </style>
+
+ <style name="Theme.SampleMediaRouter.Dialog.Alert" parent="Theme.AppCompat.Dialog.Alert">
+ <item name="colorPrimary">#fff44336</item>
+ <item name="colorPrimaryDark">#d32f2f</item>
+ </style>
+
+ <style name="Theme.SampleMediaRouter.Light.Dialog.Alert" parent="Theme.AppCompat.Light.Dialog.Alert">
+ <item name="colorPrimary">#ffff9800</item>
+ <item name="colorPrimaryDark">#f57c00</item>
+ </style>
+
+ <style name="Theme.SampleMediaRouter.Light.DarkActionBar.Dialog.Alert" parent="Theme.AppCompat.Light.Dialog.Alert">
+ <item name="colorPrimary">#ff2196f3</item>
+ <item name="colorPrimaryDark">#1976d2</item>
+ </style>
+
<style name="SortedListItem" parent="@android:style/TextAppearance.Medium">
<item name="android:minHeight">35dp</item>
</style>
-</resources> \ No newline at end of file
+</resources>
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/LocalPlayer.java b/samples/Support7Demos/src/com/example/android/supportv7/media/LocalPlayer.java
index b3c14c26b..b62f76e93 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/media/LocalPlayer.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/LocalPlayer.java
@@ -20,15 +20,12 @@ import android.app.Activity;
import android.app.Presentation;
import android.content.Context;
import android.content.DialogInterface;
-import android.content.res.Resources;
import android.graphics.Bitmap;
import android.media.MediaPlayer;
-import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
-import android.support.v4.media.session.MediaSessionCompat;
import android.support.v7.media.MediaRouter.RouteInfo;
import android.support.v7.media.MediaItemStatus;
import android.util.Log;
@@ -59,6 +56,7 @@ public abstract class LocalPlayer extends Player implements
private final Context mContext;
private final Handler mHandler = new Handler();
+ private final Handler mUpdateSurfaceHandler = new Handler(mHandler.getLooper());
private MediaPlayer mMediaPlayer;
private int mState = STATE_IDLE;
private int mSeekToPos;
@@ -104,11 +102,6 @@ public abstract class LocalPlayer extends Player implements
}
}
- @Override
- public MediaSessionCompat getMediaSession() {
- return mMediaSession;
- }
-
// Player
@Override
public void play(final PlaylistItem item) {
@@ -145,7 +138,8 @@ public abstract class LocalPlayer extends Player implements
if (mState == STATE_PLAYING || mState == STATE_PAUSED) {
mMediaPlayer.seekTo(pos);
mSeekToPos = pos;
- } else if (mState == STATE_IDLE || mState == STATE_PLAY_PENDING) {
+ } else if (mState == STATE_IDLE || mState == STATE_PREPARING_FOR_PLAY
+ || mState == STATE_PREPARING_FOR_PAUSE) {
// Seek before onPrepared() arrives,
// need to performed delayed seek in onPrepared()
mSeekToPos = pos;
@@ -175,6 +169,8 @@ public abstract class LocalPlayer extends Player implements
if (mState == STATE_PLAYING) {
mMediaPlayer.pause();
mState = STATE_PAUSED;
+ } else if (mState == STATE_PREPARING_FOR_PLAY) {
+ mState = STATE_PREPARING_FOR_PAUSE;
}
}
@@ -186,8 +182,8 @@ public abstract class LocalPlayer extends Player implements
if (mState == STATE_READY || mState == STATE_PAUSED) {
mMediaPlayer.start();
mState = STATE_PLAYING;
- } else if (mState == STATE_IDLE){
- mState = STATE_PLAY_PENDING;
+ } else if (mState == STATE_IDLE || mState == STATE_PREPARING_FOR_PAUSE) {
+ mState = STATE_PREPARING_FOR_PLAY;
}
}
@@ -224,8 +220,10 @@ public abstract class LocalPlayer extends Player implements
if (mState == STATE_IDLE) {
mState = STATE_READY;
updateVideoRect();
- } else if (mState == STATE_PLAY_PENDING) {
- mState = STATE_PLAYING;
+ } else if (mState == STATE_PREPARING_FOR_PLAY
+ || mState == STATE_PREPARING_FOR_PAUSE) {
+ int prevState = mState;
+ mState = mState == STATE_PREPARING_FOR_PLAY ? STATE_PLAYING : STATE_PAUSED;
updateVideoRect();
if (mSeekToPos > 0) {
if (DEBUG) {
@@ -233,7 +231,9 @@ public abstract class LocalPlayer extends Player implements
}
mMediaPlayer.seekTo(mSeekToPos);
}
- mMediaPlayer.start();
+ if (prevState == STATE_PREPARING_FOR_PLAY) {
+ mMediaPlayer.start();
+ }
}
if (mCallback != null) {
mCallback.onPlaylistChanged();
@@ -294,6 +294,7 @@ public abstract class LocalPlayer extends Player implements
protected MediaPlayer getMediaPlayer() { return mMediaPlayer; }
protected int getVideoWidth() { return mVideoWidth; }
protected int getVideoHeight() { return mVideoHeight; }
+ protected int getState() { return mState; }
protected void setSurface(Surface surface) {
mSurface = surface;
mSurfaceHolder = null;
@@ -313,23 +314,29 @@ public abstract class LocalPlayer extends Player implements
}
protected void updateSurface() {
- if (mMediaPlayer == null) {
- // just return if media player is already gone
- return;
- }
- if (mSurface != null) {
- // The setSurface API does not exist until V14+.
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
- ICSMediaPlayer.setSurface(mMediaPlayer, mSurface);
- } else {
- throw new UnsupportedOperationException("MediaPlayer does not support "
- + "setSurface() on this version of the platform.");
+ mUpdateSurfaceHandler.removeCallbacksAndMessages(null);
+ mUpdateSurfaceHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (mMediaPlayer == null) {
+ // just return if media player is already gone
+ return;
+ }
+ if (mSurface != null) {
+ // The setSurface API does not exist until V14+.
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+ ICSMediaPlayer.setSurface(mMediaPlayer, mSurface);
+ } else {
+ throw new UnsupportedOperationException("MediaPlayer does not support "
+ + "setSurface() on this version of the platform.");
+ }
+ } else if (mSurfaceHolder != null) {
+ mMediaPlayer.setDisplay(mSurfaceHolder);
+ } else {
+ mMediaPlayer.setDisplay(null);
+ }
}
- } else if (mSurfaceHolder != null) {
- mMediaPlayer.setDisplay(mSurfaceHolder);
- } else {
- mMediaPlayer.setDisplay(null);
- }
+ });
}
protected abstract void updateSize();
@@ -351,7 +358,8 @@ public abstract class LocalPlayer extends Player implements
}
private void updateVideoRect() {
- if (mState != STATE_IDLE && mState != STATE_PLAY_PENDING) {
+ if (mState != STATE_IDLE && mState != STATE_PREPARING_FOR_PLAY
+ && mState != STATE_PREPARING_FOR_PAUSE) {
int width = mMediaPlayer.getVideoWidth();
int height = mMediaPlayer.getVideoHeight();
if (width > 0 && height > 0) {
@@ -632,7 +640,10 @@ public abstract class LocalPlayer extends Player implements
@Override
public Bitmap getSnapshot() {
- return mOverlay.getSnapshot();
+ if (getState() == STATE_PLAYING || getState() == STATE_PAUSED) {
+ return mOverlay.getSnapshot();
+ }
+ return null;
}
}
}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/MyMediaRouteControllerDialog.java b/samples/Support7Demos/src/com/example/android/supportv7/media/MyMediaRouteControllerDialog.java
new file mode 100644
index 000000000..326467174
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/MyMediaRouteControllerDialog.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.media;
+
+import android.graphics.Color;
+import android.os.Bundle;
+import android.support.v7.app.MediaRouteControllerDialog;
+
+import android.content.Context;
+import android.view.View;
+import android.widget.TextView;
+import com.example.android.supportv7.R;
+
+/**
+ * An example MediaRouteControllerDialog for demonstrating
+ * {@link android.support.v7.app.MediaRouteControllerDialog#onCreateMediaControlView}.
+ */
+public class MyMediaRouteControllerDialog extends MediaRouteControllerDialog {
+ public MyMediaRouteControllerDialog(Context context) {
+ super(context);
+ }
+
+ @Override
+ public View onCreateMediaControlView(Bundle savedInstanceState) {
+ TextView view = new TextView(getContext());
+ view.setText(R.string.my_media_control_text);
+ view.setBackgroundColor(Color.GRAY);
+ return view;
+ }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/OverlayDisplayWindow.java b/samples/Support7Demos/src/com/example/android/supportv7/media/OverlayDisplayWindow.java
index 80cc77d9a..1d4aaa12d 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/media/OverlayDisplayWindow.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/OverlayDisplayWindow.java
@@ -19,7 +19,6 @@ import com.example.android.supportv7.R;
import android.content.Context;
import android.graphics.Bitmap;
-import android.graphics.Point;
import android.graphics.SurfaceTexture;
import android.hardware.display.DisplayManager;
import android.os.Build;
@@ -95,9 +94,9 @@ public abstract class OverlayDisplayWindow {
// Watches for significant changes in the overlay display window lifecycle.
public interface OverlayWindowListener {
- public void onWindowCreated(Surface surface);
- public void onWindowCreated(SurfaceHolder surfaceHolder);
- public void onWindowDestroyed();
+ void onWindowCreated(Surface surface);
+ void onWindowCreated(SurfaceHolder surfaceHolder);
+ void onWindowDestroyed();
}
/**
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/Player.java b/samples/Support7Demos/src/com/example/android/supportv7/media/Player.java
index fcab57dd9..a5d58971e 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/media/Player.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/Player.java
@@ -16,10 +16,7 @@
package com.example.android.supportv7.media;
-import android.app.PendingIntent;
-import android.content.ComponentName;
import android.content.Context;
-import android.content.Intent;
import android.graphics.Bitmap;
import android.support.v4.media.MediaMetadataCompat;
import android.support.v4.media.session.MediaSessionCompat;
@@ -32,17 +29,22 @@ import android.util.Log;
* Abstraction of common playback operations of media items, such as play,
* seek, etc. Used by PlaybackManager as a backend to handle actual playback
* of media items.
+ *
+ * TODO: Introduce prepare() method and refactor subclasses accordingly.
*/
public abstract class Player {
private static final String TAG = "SampleMediaRoutePlayer";
protected static final int STATE_IDLE = 0;
- protected static final int STATE_PLAY_PENDING = 1;
- protected static final int STATE_READY = 2;
- protected static final int STATE_PLAYING = 3;
- protected static final int STATE_PAUSED = 4;
+ protected static final int STATE_PREPARING_FOR_PLAY = 1;
+ protected static final int STATE_PREPARING_FOR_PAUSE = 2;
+ protected static final int STATE_READY = 3;
+ protected static final int STATE_PLAYING = 4;
+ protected static final int STATE_PAUSED = 5;
private static final long PLAYBACK_ACTIONS = PlaybackStateCompat.ACTION_PAUSE
| PlaybackStateCompat.ACTION_PLAY;
+ private static final PlaybackStateCompat INIT_PLAYBACK_STATE = new PlaybackStateCompat.Builder()
+ .setState(PlaybackStateCompat.STATE_NONE, 0, .0f).build();
protected Callback mCallback;
protected MediaSessionCompat mMediaSession;
@@ -88,13 +90,18 @@ public abstract class Player {
} else {
player = new LocalPlayer.OverlayPlayer(context);
}
- player.initMediaSession(session);
+ player.setMediaSession(session);
+ player.initMediaSession();
player.connect(route);
return player;
}
- public MediaSessionCompat getMediaSession() {
- return mMediaSession;
+ protected void initMediaSession() {
+ if (mMediaSession == null) {
+ return;
+ }
+ mMediaSession.setMetadata(null);
+ mMediaSession.setPlaybackState(INIT_PLAYBACK_STATE);
}
protected void updateMetadata() {
@@ -138,16 +145,14 @@ public abstract class Player {
}
}
- private void initMediaSession(MediaSessionCompat session) {
+ private void setMediaSession(MediaSessionCompat session) {
mMediaSession = session;
- updateMetadata();
}
-
public interface Callback {
void onError();
void onCompletion();
void onPlaylistChanged();
void onPlaylistReady();
}
-} \ No newline at end of file
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/RemotePlayer.java b/samples/Support7Demos/src/com/example/android/supportv7/media/RemotePlayer.java
index d47c26069..6ad4f75db 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/media/RemotePlayer.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/RemotePlayer.java
@@ -19,10 +19,8 @@ package com.example.android.supportv7.media;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
-import android.net.Uri;
import android.os.Bundle;
import android.support.v7.media.MediaItemStatus;
-import android.support.v7.media.MediaControlIntent;
import android.support.v7.media.MediaRouter.ControlRequestCallback;
import android.support.v7.media.MediaRouter.RouteInfo;
import android.support.v7.media.MediaSessionStatus;
@@ -140,7 +138,6 @@ public class RemotePlayer extends Player {
}
if (item.getState() == MediaItemStatus.PLAYBACK_STATE_PAUSED) {
pause();
- publishState(STATE_PAUSED);
} else {
publishState(STATE_PLAYING);
}
@@ -385,6 +382,8 @@ public class RemotePlayer extends Player {
}
if (item.getState() == MediaItemStatus.PLAYBACK_STATE_PAUSED) {
pause();
+ } else if (item.getState() == MediaItemStatus.PLAYBACK_STATE_PLAYING) {
+ publishState(STATE_PLAYING);
}
if (mEnqueuePending) {
mEnqueuePending = false;
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaButtonReceiver.java b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaButtonReceiver.java
index c2eec8ec5..d35644680 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaButtonReceiver.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaButtonReceiver.java
@@ -16,12 +16,9 @@
package com.example.android.supportv7.media;
-import com.example.android.supportv7.R;
-
import android.content.Context;
import android.content.Intent;
import android.content.BroadcastReceiver;
-import android.util.Log;
import android.view.KeyEvent;
/**
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProvider.java b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProvider.java
index 8aefacf52..9c909103c 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProvider.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProvider.java
@@ -51,6 +51,8 @@ final class SampleMediaRouteProvider extends MediaRouteProvider {
private static final String VARIABLE_VOLUME_BASIC_ROUTE_ID = "variable_basic";
private static final String VARIABLE_VOLUME_QUEUING_ROUTE_ID = "variable_queuing";
private static final String VARIABLE_VOLUME_SESSION_ROUTE_ID = "variable_session";
+ private static final String VARIABLE_VOLUME_ROUTE_GROUP_ID = "variable_group";
+ private static final String MIXED_VOLUME_ROUTE_GROUP_ID = "mixed_group";
private static final int VOLUME_MAX = 10;
@@ -223,11 +225,46 @@ final class SampleMediaRouteProvider extends MediaRouteProvider {
.setVolume(mVolume)
.build();
+ MediaRouteDescriptor routeDescriptor5 = new MediaRouteDescriptor.Builder(
+ VARIABLE_VOLUME_ROUTE_GROUP_ID,
+ r.getString(R.string.variable_volume_route_group_name))
+ .addGroupMemberId(VARIABLE_VOLUME_BASIC_ROUTE_ID)
+ .addGroupMemberId(VARIABLE_VOLUME_QUEUING_ROUTE_ID)
+ .setDescription(r.getString(R.string.sample_route_description))
+ .addControlFilters(CONTROL_FILTERS_SESSION)
+ .setPlaybackStream(AudioManager.STREAM_MUSIC)
+ .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
+ .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE)
+ .setVolumeMax(VOLUME_MAX)
+ .setVolume(mVolume)
+ .build();
+
+ Uri iconUri = Uri.parse("android.resource://com.example.android.supportv7/"
+ + R.drawable.ic_android);
+ MediaRouteDescriptor routeDescriptor6 = new MediaRouteDescriptor.Builder(
+ MIXED_VOLUME_ROUTE_GROUP_ID,
+ r.getString(R.string.mixed_volume_route_group_name))
+ .addGroupMemberId(FIXED_VOLUME_ROUTE_ID)
+ .addGroupMemberId(VARIABLE_VOLUME_BASIC_ROUTE_ID)
+ .addGroupMemberId(VARIABLE_VOLUME_QUEUING_ROUTE_ID)
+ .addGroupMemberId(VARIABLE_VOLUME_SESSION_ROUTE_ID)
+ .setDescription(r.getString(R.string.sample_route_description))
+ .setIconUri(iconUri)
+ .addControlFilters(CONTROL_FILTERS_SESSION)
+ .setPlaybackStream(AudioManager.STREAM_MUSIC)
+ .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
+ .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE)
+ .setVolumeMax(VOLUME_MAX)
+ .setVolume(mVolume)
+ .build();
+
MediaRouteProviderDescriptor providerDescriptor = new MediaRouteProviderDescriptor.Builder()
.addRoute(routeDescriptor1)
.addRoute(routeDescriptor2)
.addRoute(routeDescriptor3)
.addRoute(routeDescriptor4)
+ .addRoute(routeDescriptor5)
+ .addRoute(routeDescriptor6)
.build();
setDescriptor(providerDescriptor);
}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java
index 0a64c55fb..a40992302 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java
@@ -56,6 +56,7 @@ import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
+import android.widget.CheckBox;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SeekBar;
@@ -79,6 +80,7 @@ import java.io.File;
public class SampleMediaRouterActivity extends AppCompatActivity {
private static final String TAG = "SampleMediaRouterActivity";
private static final String DISCOVERY_FRAGMENT_TAG = "DiscoveryFragment";
+ private static final boolean ENABLE_DEFAULT_CONTROL_CHECK_BOX = false;
private MediaRouter mMediaRouter;
private MediaRouteSelector mSelector;
@@ -87,6 +89,7 @@ public class SampleMediaRouterActivity extends AppCompatActivity {
private TextView mInfoTextView;
private ListView mLibraryView;
private ListView mPlayListView;
+ private CheckBox mUseDefaultControlCheckBox;
private ImageButton mPauseResumeButton;
private ImageButton mStopButton;
private SeekBar mSeekBar;
@@ -308,6 +311,10 @@ public class SampleMediaRouterActivity extends AppCompatActivity {
mInfoTextView = (TextView) findViewById(R.id.info);
+ mUseDefaultControlCheckBox = (CheckBox) findViewById(R.id.custom_control_view_checkbox);
+ if (ENABLE_DEFAULT_CONTROL_CHECK_BOX) {
+ mUseDefaultControlCheckBox.setVisibility(View.VISIBLE);
+ }
mPauseResumeButton = (ImageButton)findViewById(R.id.pause_resume_button);
mPauseResumeButton.setOnClickListener(new OnClickListener() {
@Override
@@ -518,7 +525,7 @@ public class SampleMediaRouterActivity extends AppCompatActivity {
mediaRouteActionProvider.setDialogFactory(new MediaRouteDialogFactory() {
@Override
public MediaRouteControllerDialogFragment onCreateControllerDialogFragment() {
- return new ControllerDialogFragment(mPlayer);
+ return new ControllerDialogFragment(mPlayer, mUseDefaultControlCheckBox);
}
});
@@ -734,20 +741,23 @@ public class SampleMediaRouterActivity extends AppCompatActivity {
public static class ControllerDialogFragment extends MediaRouteControllerDialogFragment {
private MediaRouteControllerDialog mControllerDialog;
private Player mPlayer;
+ private CheckBox mUseDefaultControlCheckBox;
public ControllerDialogFragment() {
super();
}
- public ControllerDialogFragment(Player player) {
+ public ControllerDialogFragment(Player player, CheckBox customControlViewCheckBox) {
mPlayer = player;
+ this.mUseDefaultControlCheckBox = customControlViewCheckBox;
}
@Override
public MediaRouteControllerDialog onCreateControllerDialog(
Context context, Bundle savedInstanceState) {
- mControllerDialog = super.onCreateControllerDialog(context,
- savedInstanceState);
+ mControllerDialog = this.mUseDefaultControlCheckBox.isChecked()
+ ? super.onCreateControllerDialog(context, savedInstanceState)
+ : new MyMediaRouteControllerDialog(context);
mControllerDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SessionManager.java b/samples/Support7Demos/src/com/example/android/supportv7/media/SessionManager.java
index 1c00192de..6fab2eb6b 100644
--- a/samples/Support7Demos/src/com/example/android/supportv7/media/SessionManager.java
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/SessionManager.java
@@ -349,6 +349,8 @@ public class SessionManager implements Player.Callback {
if (mCallback != null) {
mCallback.onItemChanged(item);
}
+ } else {
+ mPlayer.initMediaSession();
}
updateStatus();
}