Merge change 25493 into eclair

* changes:
  Wire the rest of MediaPlayer to our implementation of WebCore::MediaPlayerPrivate
This commit is contained in:
Android (Google) Code Review
2009-09-17 12:52:59 -04:00

View File

@@ -47,11 +47,14 @@ import android.widget.VideoView;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* <p>Proxy for HTML5 video views.
*/
class HTML5VideoViewProxy extends Handler {
class HTML5VideoViewProxy extends Handler
implements MediaPlayer.OnPreparedListener,
MediaPlayer.OnCompletionListener {
// Logging tag.
private static final String LOGTAG = "HTML5VideoViewProxy";
@@ -59,9 +62,15 @@ class HTML5VideoViewProxy extends Handler {
private static final int INIT = 100;
private static final int PLAY = 101;
private static final int SET_POSTER = 102;
private static final int SEEK = 103;
private static final int PAUSE = 104;
// Message Ids to be handled on the WebCore thread
private static final int PREPARED = 200;
private static final int ENDED = 201;
// The C++ MediaPlayerPrivateAndroid object.
int mNativePointer;
// The handler for WebCore thread messages;
private Handler mWebCoreHandler;
// The WebView instance that created this view.
@@ -72,6 +81,8 @@ class HTML5VideoViewProxy extends Handler {
private ImageView mPosterView;
// The poster downloader.
private PosterDownloader mPosterDownloader;
// The seek position.
private int mSeekPosition;
// A helper class to control the playback. This executes on the UI thread!
private static final class VideoPlayer {
// The proxy that is currently playing (if any).
@@ -94,7 +105,8 @@ class HTML5VideoViewProxy extends Handler {
}
};
public static void play(String url, HTML5VideoViewProxy proxy, WebChromeClient client) {
public static void play(String url, int time, HTML5VideoViewProxy proxy,
WebChromeClient client) {
if (mCurrentProxy != null) {
// Some other video is already playing. Notify the caller that its playback ended.
proxy.playbackEnded();
@@ -105,9 +117,46 @@ class HTML5VideoViewProxy extends Handler {
mVideoView.setWillNotDraw(false);
mVideoView.setMediaController(new MediaController(proxy.getContext()));
mVideoView.setVideoURI(Uri.parse(url));
mVideoView.setOnCompletionListener(proxy);
mVideoView.setOnPreparedListener(proxy);
mVideoView.seekTo(time);
mVideoView.start();
client.onShowCustomView(mVideoView, mCallback);
}
public static void seek(int time, HTML5VideoViewProxy proxy) {
if (mCurrentProxy == proxy && time >= 0 && mVideoView != null) {
mVideoView.seekTo(time);
}
}
public static void pause(HTML5VideoViewProxy proxy) {
if (mCurrentProxy == proxy && mVideoView != null) {
mVideoView.pause();
}
}
}
// A bunch event listeners for our VideoView
// MediaPlayer.OnPreparedListener
public void onPrepared(MediaPlayer mp) {
Message msg = Message.obtain(mWebCoreHandler, PREPARED);
Map<String, Object> map = new HashMap<String, Object>();
map.put("dur", new Integer(mp.getDuration()));
map.put("width", new Integer(mp.getVideoWidth()));
map.put("height", new Integer(mp.getVideoHeight()));
msg.obj = map;
mWebCoreHandler.sendMessage(msg);
}
// MediaPlayer.OnCompletionListener;
public void onCompletion(MediaPlayer mp) {
playbackEnded();
}
public void playbackEnded() {
Message msg = Message.obtain(mWebCoreHandler, ENDED);
mWebCoreHandler.sendMessage(msg);
}
// Handler for the messages from WebCore thread to the UI thread.
@@ -124,7 +173,7 @@ class HTML5VideoViewProxy extends Handler {
String url = (String) msg.obj;
WebChromeClient client = mWebView.getWebChromeClient();
if (client != null) {
VideoPlayer.play(url, this, client);
VideoPlayer.play(url, mSeekPosition, this, client);
}
break;
}
@@ -133,13 +182,19 @@ class HTML5VideoViewProxy extends Handler {
mPosterView.setImageBitmap(poster);
break;
}
case SEEK: {
Integer time = (Integer) msg.obj;
mSeekPosition = time;
VideoPlayer.seek(mSeekPosition, this);
break;
}
case PAUSE: {
VideoPlayer.pause(this);
break;
}
}
}
public void playbackEnded() {
// TODO: notify WebKit
}
// Everything below this comment executes on the WebCore thread, except for
// the EventHandler methods, which are called on the network thread.
@@ -273,13 +328,16 @@ class HTML5VideoViewProxy extends Handler {
/**
* Private constructor.
* @param context is the application context.
* @param webView is the WebView that hosts the video.
* @param nativePtr is the C++ pointer to the MediaPlayerPrivate object.
*/
private HTML5VideoViewProxy(WebView webView) {
private HTML5VideoViewProxy(WebView webView, int nativePtr) {
// This handler is for the main (UI) thread.
super(Looper.getMainLooper());
// Save the WebView object.
mWebView = webView;
// Save the native ptr
mNativePointer = nativePtr;
// create the message handler for this thread
createWebCoreHandler();
}
@@ -289,8 +347,18 @@ class HTML5VideoViewProxy extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
// TODO here we will process the messages from the VideoPlayer
// and will call native WebKit methods.
case PREPARED: {
Map<String, Object> map = (Map<String, Object>) msg.obj;
Integer duration = (Integer) map.get("dur");
Integer width = (Integer) map.get("width");
Integer height = (Integer) map.get("height");
nativeOnPrepared(duration.intValue(), width.intValue(),
height.intValue(), mNativePointer);
break;
}
case ENDED:
nativeOnEnded(mNativePointer);
break;
}
}
};
@@ -314,18 +382,34 @@ class HTML5VideoViewProxy extends Handler {
/**
* Play a video stream.
* @param url is the URL of the video stream.
* @param webview is the WebViewCore that is requesting the playback.
*/
public void play(String url) {
if (url == null) {
return;
}
// We need to know the webview that is requesting the playback.
Message message = obtainMessage(PLAY);
message.obj = url;
sendMessage(message);
}
/**
* Seek into the video stream.
* @param time is the position in the video stream.
*/
public void seek(int time) {
Message message = obtainMessage(SEEK);
message.obj = new Integer(time);
sendMessage(message);
}
/**
* Pause the playback.
*/
public void pause() {
Message message = obtainMessage(PAUSE);
sendMessage(message);
}
/**
* Create the child view that will cary the poster.
*/
@@ -384,7 +468,10 @@ class HTML5VideoViewProxy extends Handler {
*
* @return a new HTML5VideoViewProxy object.
*/
public static HTML5VideoViewProxy getInstance(WebViewCore webViewCore) {
return new HTML5VideoViewProxy(webViewCore.getWebView());
public static HTML5VideoViewProxy getInstance(WebViewCore webViewCore, int nativePtr) {
return new HTML5VideoViewProxy(webViewCore.getWebView(), nativePtr);
}
private native void nativeOnPrepared(int duration, int width, int height, int nativePointer);
private native void nativeOnEnded(int nativePointer);
}