public static void exitFullScreenVideo(HTML5VideoViewProxy proxy, WebViewClassic webView) {
   if (!mHTML5VideoView.fullScreenExited() && mHTML5VideoView.isFullScreenMode()) {
     WebChromeClient client = webView.getWebChromeClient();
     if (client != null) {
       client.onHideCustomView();
     }
   }
 }
  // Handler for the messages from WebCore or Timer thread to the UI thread.
  @Override
  public void handleMessage(Message msg) {
    // This executes on the UI thread.
    Xlog.d(XLOGTAG, "handleMessage::msg.what is: " + msg.what + this);
    switch (msg.what) {
      case PLAY:
        {
          String url = (String) msg.obj;
          WebChromeClient client = mWebView.getWebChromeClient();
          int videoLayerID = msg.arg1;
          if (client != null) {
            VideoPlayer.play(url, mSeekPosition, this, client, videoLayerID);
          }
          break;
        }
      case ENTER_FULLSCREEN:
        {
          String url = (String) msg.obj;
          WebChromeClient client = mWebView.getWebChromeClient();
          int videoLayerID = msg.arg1;
          if (client != null) {
            VideoPlayer.enterFullScreenVideo(videoLayerID, url, this, mWebView);
          }
          break;
        }
      case SEEK:
        {
          Integer time = (Integer) msg.obj;
          mSeekPosition = time;
          VideoPlayer.seek(mSeekPosition, this);
          break;
        }
      case PAUSE:
        {
          VideoPlayer.pause(this);
          break;
        }
      case ENDED:
        if (msg.arg1 == 1) VideoPlayer.isVideoSelfEnded = true;
        VideoPlayer.end();
        break;
      case ERROR:
        {
          WebChromeClient client = mWebView.getWebChromeClient();
          if (client != null) {
            client.onHideCustomView();
          }
          break;
        }
      case LOAD_DEFAULT_POSTER:
        {
          WebChromeClient client = mWebView.getWebChromeClient();
          if (client != null) {
            doSetPoster(client.getDefaultVideoPoster());
          }
          break;
        }
      case TIMEUPDATE:
        {
          if (VideoPlayer.isPlaying(this)) {
            sendTimeupdate();
          }
          break;
        }
      case BUFFERING_START:
        {
          VideoPlayer.setPlayerBuffering(true);
          break;
        }
      case BUFFERING_END:
        {
          VideoPlayer.setPlayerBuffering(false);
          break;
        }

        /// M: set mute/volume @{
      case SET_VOLUME:
        {
          float volume = ((float) msg.arg1 / 100);
          VideoPlayer.setVolume(volume);
          break;
        }
        /// @}

        /// M: for shutting down player @{
      case TEARDOWN:
        {
          VideoPlayer.teardown();
          break;
        }
        /// @}
    }
  }