Wire the rest of MediaPlayer to our implementation of WebCore::MediaPlayerPrivate
diff --git a/core/java/android/webkit/HTML5VideoViewProxy.java b/core/java/android/webkit/HTML5VideoViewProxy.java
index 14bc33b..c10355c 100644
--- a/core/java/android/webkit/HTML5VideoViewProxy.java
+++ b/core/java/android/webkit/HTML5VideoViewProxy.java
@@ -47,11 +47,14 @@
 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 @@
     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 @@
     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 @@
                 }
             };
 
-        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 @@
             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 @@
                 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 @@
                 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 @@
 
     /**
      * 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 @@
             @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,19 +382,35 @@
     /**
      * 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.
      */
     public void createView() {
@@ -384,7 +468,10 @@
      *
      * @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);
 }