am bb55777b: Merge changes Ia44d880a,Ifbf63b24 into honeycomb-mr1

* commit 'bb55777be1a3231d187205dc378ca35b01e8bc65':
  DO NOT MERGE : cherry pick of change Ieb7ae26b from master
  DO NOT MERGE : cherry pick of change I0f9f2c65 from master
diff --git a/core/java/android/webkit/HTML5VideoFullScreen.java b/core/java/android/webkit/HTML5VideoFullScreen.java
index 0726266..0918683 100644
--- a/core/java/android/webkit/HTML5VideoFullScreen.java
+++ b/core/java/android/webkit/HTML5VideoFullScreen.java
@@ -191,8 +191,6 @@
 
         if (mProgressView != null) {
             mProgressView.setVisibility(View.GONE);
-            mLayout.removeView(mProgressView);
-            mProgressView = null;
         }
 
         mVideoWidth = mp.getVideoWidth();
@@ -314,4 +312,13 @@
         return false;
     }
 
+    @Override
+    protected void switchProgressView(boolean playerBuffering) {
+        if (playerBuffering) {
+            mProgressView.setVisibility(View.VISIBLE);
+        } else {
+            mProgressView.setVisibility(View.GONE);
+        }
+        return;
+    }
 }
diff --git a/core/java/android/webkit/HTML5VideoView.java b/core/java/android/webkit/HTML5VideoView.java
index 8ea73b5..fd3f358 100644
--- a/core/java/android/webkit/HTML5VideoView.java
+++ b/core/java/android/webkit/HTML5VideoView.java
@@ -15,7 +15,7 @@
 /**
  * @hide This is only used by the browser
  */
-public class HTML5VideoView implements MediaPlayer.OnPreparedListener{
+public class HTML5VideoView implements MediaPlayer.OnPreparedListener {
 
     protected static final String LOGTAG = "HTML5VideoView";
 
@@ -78,6 +78,7 @@
                         TIMEUPDATE_PERIOD);
             }
             mPlayer.start();
+            setPlayerBuffering(false);
         }
     }
 
@@ -189,6 +190,10 @@
         mPlayer.setOnPreparedListener(this);
     }
 
+    public void setOnInfoListener(HTML5VideoViewProxy proxy) {
+        mPlayer.setOnInfoListener(proxy);
+    }
+
     // Normally called immediately after setVideoURI. But for full screen,
     // this should be after surface holder created
     public void prepareDataAndDisplayMode(HTML5VideoViewProxy proxy) {
@@ -198,7 +203,7 @@
         setOnCompletionListener(proxy);
         setOnPreparedListener(proxy);
         setOnErrorListener(proxy);
-
+        setOnInfoListener(proxy);
         // When there is exception, we could just bail out silently.
         // No Video will be played though. Write the stack for debug
         try {
@@ -292,4 +297,21 @@
         return 0;
     }
 
+    // This is true only when the player is buffering and paused
+    public boolean mPlayerBuffering = false;
+
+    public boolean getPlayerBuffering() {
+        return mPlayerBuffering;
+    }
+
+    public void setPlayerBuffering(boolean playerBuffering) {
+        mPlayerBuffering = playerBuffering;
+        switchProgressView(playerBuffering);
+    }
+
+
+    protected void switchProgressView(boolean playerBuffering) {
+        // Only used in HTML5VideoFullScreen
+    }
+
 }
diff --git a/core/java/android/webkit/HTML5VideoViewProxy.java b/core/java/android/webkit/HTML5VideoViewProxy.java
index c727029..060c0bb 100644
--- a/core/java/android/webkit/HTML5VideoViewProxy.java
+++ b/core/java/android/webkit/HTML5VideoViewProxy.java
@@ -46,6 +46,7 @@
                           implements MediaPlayer.OnPreparedListener,
                           MediaPlayer.OnCompletionListener,
                           MediaPlayer.OnErrorListener,
+                          MediaPlayer.OnInfoListener,
                           SurfaceTexture.OnFrameAvailableListener {
     // Logging tag.
     private static final String LOGTAG = "HTML5VideoViewProxy";
@@ -56,6 +57,8 @@
     private static final int PAUSE               = 102;
     private static final int ERROR               = 103;
     private static final int LOAD_DEFAULT_POSTER = 104;
+    private static final int BUFFERING_START     = 105;
+    private static final int BUFFERING_END       = 106;
 
     // Message Ids to be handled on the WebCore thread
     private static final int PREPARED          = 200;
@@ -92,6 +95,10 @@
         // identify the exact layer on the UI thread to use the SurfaceTexture.
         private static int mBaseLayer = 0;
 
+        private static void setPlayerBuffering(boolean playerBuffering) {
+            mHTML5VideoView.setPlayerBuffering(playerBuffering);
+        }
+
         // Every time webView setBaseLayer, this will be called.
         // When we found the Video layer, then we set the Surface Texture to it.
         // Otherwise, we may want to delete the Surface Texture to save memory.
@@ -106,6 +113,8 @@
                 int currentVideoLayerId = mHTML5VideoView.getVideoLayerId();
                 if (layer != 0 && surfTexture != null && currentVideoLayerId != -1) {
                     int playerState = mHTML5VideoView.getCurrentState();
+                    if (mHTML5VideoView.getPlayerBuffering())
+                        playerState = HTML5VideoView.STATE_NOTPREPARED;
                     boolean foundInTree = nativeSendSurfaceTexture(surfTexture,
                             layer, currentVideoLayerId, textureName,
                             playerState);
@@ -159,7 +168,6 @@
                 WebChromeClient client, int videoLayerId) {
             int currentVideoLayerId = -1;
             boolean backFromFullScreenMode = false;
-
             if (mHTML5VideoView != null) {
                 currentVideoLayerId = mHTML5VideoView.getVideoLayerId();
                 if (mHTML5VideoView instanceof HTML5VideoFullScreen) {
@@ -342,6 +350,14 @@
                 }
                 break;
             }
+            case BUFFERING_START: {
+                VideoPlayer.setPlayerBuffering(true);
+                break;
+            }
+            case BUFFERING_END: {
+                VideoPlayer.setPlayerBuffering(false);
+                break;
+            }
         }
     }
 
@@ -671,4 +687,14 @@
     private native static boolean nativeSendSurfaceTexture(SurfaceTexture texture,
             int baseLayer, int videoLayerId, int textureName,
             int playerState);
+
+    @Override
+    public boolean onInfo(MediaPlayer mp, int what, int extra) {
+        if (what == MediaPlayer.MEDIA_INFO_BUFFERING_START) {
+            sendMessage(obtainMessage(BUFFERING_START, what, extra));
+        } else if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END) {
+            sendMessage(obtainMessage(BUFFERING_END, what, extra));
+        }
+        return false;
+    }
 }