am fd49faae: Merge change 25772 into eclair

Merge commit 'fd49faae33dc813c93347d1bcc8fa7c4fa0ae55d' into eclair-plus-aosp

* commit 'fd49faae33dc813c93347d1bcc8fa7c4fa0ae55d':
  Add progress view and default poster for the <video> implementation
This commit is contained in:
Andrei Popescu
2009-09-18 11:28:48 -07:00
committed by Android Git Automerger
2 changed files with 65 additions and 1 deletions

View File

@@ -36,10 +36,12 @@ import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.MotionEvent;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.ViewManager.ChildView;
import android.widget.AbsoluteLayout;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.VideoView;
@@ -90,6 +92,10 @@ class HTML5VideoViewProxy extends Handler
// The VideoView instance. This is a singleton for now, at least until
// http://b/issue?id=1973663 is fixed.
private static VideoView mVideoView;
// The progress view.
private static View mProgressView;
// The container for the progress view and video view
private static FrameLayout mLayout;
private static final WebChromeClient.CustomViewCallback mCallback =
new WebChromeClient.CustomViewCallback() {
@@ -101,7 +107,13 @@ class HTML5VideoViewProxy extends Handler
// is invoked.
mCurrentProxy.playbackEnded();
mCurrentProxy = null;
mLayout.removeView(mVideoView);
mVideoView = null;
if (mProgressView != null) {
mLayout.removeView(mProgressView);
mProgressView = null;
}
mLayout = null;
}
};
@@ -113,6 +125,13 @@ class HTML5VideoViewProxy extends Handler
return;
}
mCurrentProxy = proxy;
// Create a FrameLayout that will contain the VideoView and the
// progress view (if any).
mLayout = new FrameLayout(proxy.getContext());
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
Gravity.CENTER);
mVideoView = new VideoView(proxy.getContext());
mVideoView.setWillNotDraw(false);
mVideoView.setMediaController(new MediaController(proxy.getContext()));
@@ -120,8 +139,15 @@ class HTML5VideoViewProxy extends Handler
mVideoView.setOnCompletionListener(proxy);
mVideoView.setOnPreparedListener(proxy);
mVideoView.seekTo(time);
mLayout.addView(mVideoView, layoutParams);
mProgressView = client.getVideoLoadingProgressView();
if (mProgressView != null) {
mLayout.addView(mProgressView, layoutParams);
mProgressView.setVisibility(View.VISIBLE);
}
mLayout.setVisibility(View.VISIBLE);
mVideoView.start();
client.onShowCustomView(mVideoView, mCallback);
client.onShowCustomView(mLayout, mCallback);
}
public static void seek(int time, HTML5VideoViewProxy proxy) {
@@ -135,11 +161,20 @@ class HTML5VideoViewProxy extends Handler
mVideoView.pause();
}
}
public static void onPrepared() {
if (mProgressView != null) {
mProgressView.setVisibility(View.GONE);
mLayout.removeView(mProgressView);
mProgressView = null;
}
}
}
// A bunch event listeners for our VideoView
// MediaPlayer.OnPreparedListener
public void onPrepared(MediaPlayer mp) {
VideoPlayer.onPrepared();
Message msg = Message.obtain(mWebCoreHandler, PREPARED);
Map<String, Object> map = new HashMap<String, Object>();
map.put("dur", new Integer(mp.getDuration()));
@@ -166,6 +201,13 @@ class HTML5VideoViewProxy extends Handler
switch (msg.what) {
case INIT: {
mPosterView = new ImageView(mWebView.getContext());
WebChromeClient client = mWebView.getWebChromeClient();
if (client != null) {
Bitmap poster = client.getDefaultVideoPoster();
if (poster != null) {
mPosterView.setImageBitmap(poster);
}
}
mChildView.mView = mPosterView;
break;
}

View File

@@ -273,4 +273,26 @@ public class WebChromeClient {
* @hide pending API council.
*/
public void addMessageToConsole(String message, int lineNumber, String sourceID) {}
/**
* Ask the host application for an icon to represent a <video> element.
* This icon will be used if the Web page did not specify a poster attribute.
*
* @return Bitmap The icon or null if no such icon is available.
* @hide pending API Council approval
*/
public Bitmap getDefaultVideoPoster() {
return null;
}
/**
* Ask the host application for a custom progress view to show while
* a <video> is loading.
*
* @return View The progress view.
* @hide pending API Council approval
*/
public View getVideoLoadingProgressView() {
return null;
}
}