Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(248)

Unified Diff: content/public/android/java/src/org/chromium/content/browser/ContentVideoViewLegacy.java

Issue 25040002: Enables fullscreen subtitle and media control from Blink (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@build_hack
Patch Set: rebased, let's go! Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/public/android/java/src/org/chromium/content/browser/ContentVideoViewLegacy.java
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentVideoViewLegacy.java b/content/public/android/java/src/org/chromium/content/browser/ContentVideoViewLegacy.java
new file mode 100644
index 0000000000000000000000000000000000000000..06fbc192c41f825eb7244596b73c35e9d72e5645
--- /dev/null
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentVideoViewLegacy.java
@@ -0,0 +1,268 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.content.browser;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.View;
+import android.widget.MediaController;
+
+/**
+ * Adds Android media controller to ContentVideoView.
+ * The sole purpose of this class is to maintain legacy behavior while we test
+ * the blink-based media controller.
+ * https://code.google.com/p/chromium/issues/detail?id=331966
+ */
+public class ContentVideoViewLegacy extends ContentVideoView {
+ private MediaController mMediaController;
+ private boolean mCanPause;
+ private boolean mCanSeekBackward;
+ private boolean mCanSeekForward;
+ private int mCurrentBufferPercentage;
+
+ private static class FullScreenMediaController extends MediaController {
+
+ View mVideoView;
+
+ public FullScreenMediaController(Context context, View video) {
+ super(context);
+ mVideoView = video;
+ }
+
+ @Override
+ public void show() {
+ super.show();
+ if (mVideoView != null) {
+ mVideoView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
+ }
+ }
+
+ @Override
+ public void hide() {
+ if (mVideoView != null) {
+ mVideoView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
+ }
+ super.hide();
+ }
+ }
+
+ ContentVideoViewLegacy(Context context, long nativeContentVideoView,
+ ContentVideoViewClient client) {
+ super(context, nativeContentVideoView, client);
+ setBackgroundColor(Color.BLACK);
+ mCurrentBufferPercentage = 0;
+ }
+
+ @Override
+ protected void showContentVideoView() {
+ SurfaceView surfaceView = getSurfaceView();
+ surfaceView.setZOrderOnTop(true);
+ surfaceView.setOnKeyListener(new OnKeyListener() {
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ boolean isKeyCodeSupported = (
+ keyCode != KeyEvent.KEYCODE_BACK &&
+ keyCode != KeyEvent.KEYCODE_VOLUME_UP &&
+ keyCode != KeyEvent.KEYCODE_VOLUME_DOWN &&
+ keyCode != KeyEvent.KEYCODE_VOLUME_MUTE &&
+ keyCode != KeyEvent.KEYCODE_CALL &&
+ keyCode != KeyEvent.KEYCODE_MENU &&
+ keyCode != KeyEvent.KEYCODE_SEARCH &&
+ keyCode != KeyEvent.KEYCODE_ENDCALL);
+ if (isInPlaybackState() && isKeyCodeSupported && mMediaController != null) {
+ if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK ||
+ keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) {
+ if (isPlaying()) {
+ pause();
+ mMediaController.show();
+ } else {
+ start();
+ mMediaController.hide();
+ }
+ return true;
+ } else if (keyCode == KeyEvent.KEYCODE_MEDIA_PLAY) {
+ if (!isPlaying()) {
+ start();
+ mMediaController.hide();
+ }
+ return true;
+ } else if (keyCode == KeyEvent.KEYCODE_MEDIA_STOP
+ || keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE) {
+ if (isPlaying()) {
+ pause();
+ mMediaController.show();
+ }
+ return true;
+ } else {
+ toggleMediaControlsVisiblity();
+ }
+ } else if (keyCode == KeyEvent.KEYCODE_BACK &&
+ event.getAction() == KeyEvent.ACTION_UP) {
+ exitFullscreen(false);
+ return true;
+ } else if (keyCode == KeyEvent.KEYCODE_MENU || keyCode == KeyEvent.KEYCODE_SEARCH) {
+ return true;
+ }
+ return false;
+ }
+ });
+ surfaceView.setOnTouchListener(new OnTouchListener() {
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ if (isInPlaybackState() && mMediaController != null &&
+ event.getAction() == MotionEvent.ACTION_DOWN) {
+ toggleMediaControlsVisiblity();
+ }
+ return true;
+ }
+ });
+ surfaceView.setFocusable(true);
+ surfaceView.setFocusableInTouchMode(true);
+ surfaceView.requestFocus();
+ super.showContentVideoView();
+ }
+
+ @Override
+ public void onMediaPlayerError(int errorType) {
+ super.onMediaPlayerError(errorType);
+ if (errorType == MEDIA_ERROR_INVALID_CODE) return;
+ if (mMediaController != null) mMediaController.hide();
+ }
+
+ @Override
+ protected void onBufferingUpdate(int percent) {
+ super.onBufferingUpdate(percent);
+ mCurrentBufferPercentage = percent;
+ }
+
+ @Override
+ protected void onUpdateMediaMetadata(
+ int videoWidth,
+ int videoHeight,
+ int duration,
+ boolean canPause,
+ boolean canSeekBack,
+ boolean canSeekForward) {
+ super.onUpdateMediaMetadata(videoWidth, videoHeight, duration,
+ canPause, canSeekBack, canSeekForward);
+ mCanPause = canPause;
+ mCanSeekBackward = canSeekBack;
+ mCanSeekForward = canSeekForward;
+
+ if (mMediaController == null) return;
+
+ mMediaController.setEnabled(true);
+ // If paused , should show the controller forever.
+ if (isPlaying()) {
+ mMediaController.show();
+ } else {
+ mMediaController.show(0);
+ }
+ }
+
+ @Override
+ public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+ super.surfaceChanged(holder, format, width, height);
+ SurfaceView surfaceView = getSurfaceView();
+ surfaceView.setFocusable(true);
+ surfaceView.setFocusableInTouchMode(true);
+ if (isInPlaybackState() && mMediaController != null) {
+ mMediaController.show();
+ }
+ }
+
+ @Override
+ protected void openVideo() {
+ super.openVideo();
+
+ mCurrentBufferPercentage = 0;
+
+ if (mMediaController != null) return;
+ mMediaController = new FullScreenMediaController(getContext(), this);
+ mMediaController.setMediaPlayer(new MediaController.MediaPlayerControl() {
+ @Override public boolean canPause() { return mCanPause; }
+ @Override public boolean canSeekBackward() { return mCanSeekBackward; }
+ @Override public boolean canSeekForward() { return mCanSeekForward; }
+ @Override public int getAudioSessionId() { return 0; }
+ @Override public int getBufferPercentage() { return mCurrentBufferPercentage; }
+
+ @Override
+ public int getCurrentPosition() {
+ return ContentVideoViewLegacy.this.getCurrentPosition();
+ }
+
+ @Override
+ public int getDuration() {
+ return ContentVideoViewLegacy.this.getDuration();
+ }
+
+ @Override
+ public boolean isPlaying() {
+ return ContentVideoViewLegacy.this.isPlaying();
+ }
+
+ @Override
+ public void pause() {
+ ContentVideoViewLegacy.this.pause();
+ }
+
+ @Override
+ public void seekTo(int pos) {
+ ContentVideoViewLegacy.this.seekTo(pos);
+ }
+
+ @Override
+ public void start() {
+ ContentVideoViewLegacy.this.start();
+ }
+ });
+ mMediaController.setAnchorView(getSurfaceView());
+ mMediaController.setEnabled(false);
+ }
+
+ @Override
+ protected void onCompletion() {
+ super.onCompletion();
+ if (mMediaController != null) {
+ mMediaController.hide();
+ }
+ }
+
+ @Override
+ public boolean onTrackballEvent(MotionEvent ev) {
+ if (isInPlaybackState() && mMediaController != null) {
+ toggleMediaControlsVisiblity();
+ }
+ return false;
+ }
+
+ private void toggleMediaControlsVisiblity() {
+ if (mMediaController.isShowing()) {
+ mMediaController.hide();
+ } else {
+ mMediaController.show();
+ }
+ }
+
+ @Override
+ protected void destroyContentVideoView(boolean nativeViewDestroyed) {
+ if (mMediaController != null) {
+ mMediaController.setEnabled(false);
+ mMediaController.hide();
+ mMediaController = null;
+ }
+ super.destroyContentVideoView(nativeViewDestroyed);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ return true;
+ }
+
+}

Powered by Google App Engine
This is Rietveld 408576698