Chromium Code Reviews| 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..54055adfa0b2dea8bd89de24046ecb736b4960db |
| --- /dev/null |
| +++ b/content/public/android/java/src/org/chromium/content/browser/ContentVideoViewLegacy.java |
| @@ -0,0 +1,265 @@ |
| +// Copyright 2012 The Chromium Authors. All rights reserved. |
|
Ted C
2013/12/26 23:06:15
2013
|
| +// 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; |
| + |
| +public class ContentVideoViewLegacy extends ContentVideoView { |
|
Ted C
2013/12/26 23:06:15
needs a class level description
|
| + 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 && |
|
Ted C
2013/12/26 23:06:15
Although this is moved code, these lines should be
|
| + 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; |
|
Ted C
2013/12/26 23:06:15
this can probably all fit on a single line
|
| + } |
| + if (mMediaController != null) { |
|
Ted C
2013/12/26 23:06:15
same
|
| + 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) { |
|
Ted C
2013/12/26 23:06:15
personally, I prefer to exit early in this case an
|
| + mMediaController.setEnabled(true); |
| + // If paused , should show the controller forever. |
| + if (isPlaying()) |
|
Ted C
2013/12/26 23:06:15
braces required in java land
|
| + 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) { |
|
Ted C
2013/12/26 23:06:15
make a one liner here too
|
| + 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; |
| + } |
| + |
| +} |