Merge "Unhide VideoView2 APIs"
diff --git a/api/current.txt b/api/current.txt
index 0f1981f..d56d1e2 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -54666,6 +54666,27 @@
method public void suspend();
}
+ public class VideoView2 extends android.view.ViewGroup {
+ ctor public VideoView2(android.content.Context);
+ ctor public VideoView2(android.content.Context, android.util.AttributeSet);
+ ctor public VideoView2(android.content.Context, android.util.AttributeSet, int);
+ ctor public VideoView2(android.content.Context, android.util.AttributeSet, int, int);
+ method public android.widget.MediaControlView2 getMediaControlView2();
+ method public android.media.SessionToken2 getMediaSessionToken();
+ method public int getViewType();
+ method public boolean isSubtitleEnabled();
+ method public void setAudioAttributes(android.media.AudioAttributes);
+ method public void setAudioFocusRequest(int);
+ method public void setDataSource(android.media.DataSourceDesc);
+ method public void setMediaControlView2(android.widget.MediaControlView2, long);
+ method public void setMediaItem(android.media.MediaItem2);
+ method public void setSpeed(float);
+ method public void setSubtitleEnabled(boolean);
+ method public void setViewType(int);
+ field public static final int VIEW_TYPE_SURFACEVIEW = 1; // 0x1
+ field public static final int VIEW_TYPE_TEXTUREVIEW = 2; // 0x2
+ }
+
public class ViewAnimator extends android.widget.FrameLayout {
ctor public ViewAnimator(android.content.Context);
ctor public ViewAnimator(android.content.Context, android.util.AttributeSet);
diff --git a/core/java/android/widget/VideoView2.java b/core/java/android/widget/VideoView2.java
index a7ae3234..09ff337 100644
--- a/core/java/android/widget/VideoView2.java
+++ b/core/java/android/widget/VideoView2.java
@@ -22,8 +22,12 @@
import android.content.Context;
import android.media.AudioAttributes;
import android.media.AudioManager;
+import android.media.DataSourceDesc;
+import android.media.MediaItem2;
import android.media.MediaMetadata2;
+import android.media.MediaPlayer2;
import android.media.MediaPlayerBase;
+import android.media.SessionToken2;
import android.media.session.MediaController;
import android.media.session.MediaSession;
import android.media.session.PlaybackState;
@@ -45,14 +49,14 @@
// TODO: Replace MediaSession wtih MediaSession2 once MediaSession2 is submitted.
/**
- * Displays a video file. VideoView2 class is a View class which is wrapping MediaPlayer2 so that
- * developers can easily implement a video rendering application.
+ * Displays a video file. VideoView2 class is a View class which is wrapping {@link MediaPlayer2}
+ * so that developers can easily implement a video rendering application.
*
* <p>
* <em> Data sources that VideoView2 supports : </em>
* VideoView2 can play video files and audio-only files as
* well. It can load from various sources such as resources or content providers. The supported
- * media file formats are the same as MediaPlayer2.
+ * media file formats are the same as {@link MediaPlayer2}.
*
* <p>
* <em> View type can be selected : </em>
@@ -101,8 +105,6 @@
* does not restore the current play state, play position, selected tracks. Applications should save
* and restore these on their own in {@link android.app.Activity#onSaveInstanceState} and
* {@link android.app.Activity#onRestoreInstanceState}.
- *
- * @hide
*/
public class VideoView2 extends ViewGroupHelper<VideoView2Provider> {
/** @hide */
@@ -199,12 +201,24 @@
* before calling this method.
*
* @throws IllegalStateException if interal MediaSession is not created yet.
+ * @hide TODO: remove
*/
public MediaController getMediaController() {
return mProvider.getMediaController_impl();
}
/**
+ * Returns {@link android.media.SessionToken2} so that developers create their own
+ * {@link android.media.MediaController2} instance. This method should be called when VideoView2
+ * is attached to window, or it throws IllegalStateException.
+ *
+ * @throws IllegalStateException if interal MediaSession is not created yet.
+ */
+ public SessionToken2 getMediaSessionToken() {
+ return mProvider.getMediaSessionToken_impl();
+ }
+
+ /**
* Shows or hides closed caption or subtitles if there is any.
* The first subtitle track will be chosen if there multiple subtitle tracks exist.
* Default behavior of VideoView2 is not showing subtitle.
@@ -265,6 +279,7 @@
mProvider.setAudioAttributes_impl(attributes);
}
+ // TODO: unhide this method when MediaPlayerInterface became unhidden.
/**
* Sets a remote player for handling playback of the selected route from MediaControlView2.
* If this is not called, MediaCotrolView2 will not show the route button.
@@ -302,6 +317,8 @@
* Sets video path.
*
* @param path the path of the video.
+ *
+ * @hide TODO remove
*/
public void setVideoPath(String path) {
mProvider.setVideoPath_impl(path);
@@ -311,6 +328,8 @@
* Sets video URI.
*
* @param uri the URI of the video.
+ *
+ * @hide TODO remove
*/
public void setVideoUri(Uri uri) {
mProvider.setVideoUri_impl(uri);
@@ -325,12 +344,33 @@
* changed with key/value pairs through the headers parameter with
* "android-allow-cross-domain-redirect" as the key and "0" or "1" as the value
* to disallow or allow cross domain redirection.
+ *
+ * @hide TODO remove
*/
public void setVideoUri(Uri uri, Map<String, String> headers) {
mProvider.setVideoUri_impl(uri, headers);
}
/**
+ * Sets {@link MediaItem2} object to render using VideoView2. Alternative way to set media
+ * object to VideoView2 is {@link #setDataSource}.
+ * @param mediaItem the MediaItem2 to play
+ * @see #setDataSource
+ */
+ public void setMediaItem(@NonNull MediaItem2 mediaItem) {
+ mProvider.setMediaItem_impl(mediaItem);
+ }
+
+ /**
+ * Sets {@link DataSourceDesc} object to render using VideoView2.
+ * @param dataSource the {@link DataSourceDesc} object to play.
+ * @see #setMediaItem
+ */
+ public void setDataSource(@NonNull DataSourceDesc dataSource) {
+ mProvider.setDataSource_impl(dataSource);
+ }
+
+ /**
* Selects which view will be used to render video between SurfacView and TextureView.
*
* @param viewType the view type to render video
@@ -361,6 +401,7 @@
* in {@link MediaControlView2}.
* @param executor executor to run callbacks on.
* @param listener A listener to be called when a custom button is clicked.
+ * @hide TODO remove
*/
public void setCustomActions(List<PlaybackState.CustomAction> actionList,
Executor executor, OnCustomActionListener listener) {
@@ -371,7 +412,6 @@
* Registers a callback to be invoked when a view type change is done.
* {@see #setViewType(int)}
* @param l The callback that will be run
- *
* @hide
*/
@VisibleForTesting
@@ -382,6 +422,7 @@
/**
* Registers a callback to be invoked when the fullscreen mode should be changed.
* @param l The callback that will be run
+ * @hide TODO remove
*/
public void setFullScreenRequestListener(OnFullScreenRequestListener l) {
mProvider.setFullScreenRequestListener_impl(l);
@@ -410,6 +451,7 @@
/**
* Interface definition of a callback to be invoked to inform the fullscreen mode is changed.
* Application should handle the fullscreen mode accordingly.
+ * @hide TODO remove
*/
public interface OnFullScreenRequestListener {
/**
@@ -420,8 +462,8 @@
/**
* Interface definition of a callback to be invoked to inform that a custom action is performed.
+ * @hide TODO remove
*/
- // TODO: When MediaSession2 is ready, modify the method to match the signature.
public interface OnCustomActionListener {
/**
* Called to indicate that a custom action is performed.
diff --git a/media/java/android/media/update/VideoView2Provider.java b/media/java/android/media/update/VideoView2Provider.java
index 152ace9..11b3560 100644
--- a/media/java/android/media/update/VideoView2Provider.java
+++ b/media/java/android/media/update/VideoView2Provider.java
@@ -18,8 +18,11 @@
import android.annotation.SystemApi;
import android.media.AudioAttributes;
+import android.media.DataSourceDesc;
+import android.media.MediaItem2;
import android.media.MediaMetadata2;
import android.media.MediaPlayerBase;
+import android.media.SessionToken2;
import android.media.session.MediaController;
import android.media.session.PlaybackState;
import android.media.session.MediaSession;
@@ -53,7 +56,11 @@
void setMediaControlView2_impl(MediaControlView2 mediaControlView, long intervalMs);
void setMediaMetadata_impl(MediaMetadata2 metadata);
+ /**
+ * @hide TODO: remove
+ */
MediaController getMediaController_impl();
+ SessionToken2 getMediaSessionToken_impl();
MediaControlView2 getMediaControlView2_impl();
MediaMetadata2 getMediaMetadata_impl();
void setSubtitleEnabled_impl(boolean enable);
@@ -66,13 +73,31 @@
* @hide
*/
void setRouteAttributes_impl(List<String> routeCategories, MediaPlayerBase player);
+ /**
+ * @hide
+ */
// TODO: remove setRouteAttributes_impl with MediaSession.Callback once MediaSession2 is ready.
void setRouteAttributes_impl(List<String> routeCategories, MediaSession.Callback sessionPlayer);
+
+ /**
+ * @hide TODO: remove
+ */
void setVideoPath_impl(String path);
+ /**
+ * @hide TODO: remove
+ */
void setVideoUri_impl(Uri uri);
+ /**
+ * @hide TODO: remove
+ */
void setVideoUri_impl(Uri uri, Map<String, String> headers);
+ void setMediaItem_impl(MediaItem2 mediaItem);
+ void setDataSource_impl(DataSourceDesc dsd);
void setViewType_impl(int viewType);
int getViewType_impl();
+ /**
+ * @hide TODO: remove
+ */
void setCustomActions_impl(List<PlaybackState.CustomAction> actionList,
Executor executor, VideoView2.OnCustomActionListener listener);
/**
@@ -80,5 +105,8 @@
*/
@VisibleForTesting
void setOnViewTypeChangedListener_impl(VideoView2.OnViewTypeChangedListener l);
+ /**
+ * @hide TODO: remove
+ */
void setFullScreenRequestListener_impl(VideoView2.OnFullScreenRequestListener l);
}