Index: content/public/android/java/src/org/chromium/content/browser/ContentVideoView.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentVideoView.java b/content/public/android/java/src/org/chromium/content/browser/ContentVideoView.java |
deleted file mode 100644 |
index a1c2f1492ec1b3c39295bfac80f6b53c224d5767..0000000000000000000000000000000000000000 |
--- a/content/public/android/java/src/org/chromium/content/browser/ContentVideoView.java |
+++ /dev/null |
@@ -1,440 +0,0 @@ |
-// Copyright 2012 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.app.Activity; |
-import android.app.AlertDialog; |
-import android.content.Context; |
-import android.content.DialogInterface; |
-import android.util.Log; |
-import android.view.Gravity; |
-import android.view.KeyEvent; |
-import android.view.Surface; |
-import android.view.SurfaceHolder; |
-import android.view.SurfaceView; |
-import android.view.View; |
-import android.view.ViewGroup; |
-import android.widget.FrameLayout; |
-import android.widget.LinearLayout; |
-import android.widget.ProgressBar; |
-import android.widget.TextView; |
- |
-import org.chromium.base.CalledByNative; |
-import org.chromium.base.JNINamespace; |
-import org.chromium.base.ThreadUtils; |
- |
-/** |
- * This class implements accelerated fullscreen video playback using surface view. |
- */ |
-@JNINamespace("content") |
-public class ContentVideoView extends FrameLayout implements SurfaceHolder.Callback { |
- |
- private static final String TAG = "ContentVideoView"; |
- |
- /* Do not change these values without updating their counterparts |
- * in include/media/mediaplayer.h! |
- */ |
- private static final int MEDIA_NOP = 0; // interface test message |
- private static final int MEDIA_PREPARED = 1; |
- private static final int MEDIA_PLAYBACK_COMPLETE = 2; |
- private static final int MEDIA_BUFFERING_UPDATE = 3; |
- private static final int MEDIA_SEEK_COMPLETE = 4; |
- private static final int MEDIA_SET_VIDEO_SIZE = 5; |
- private static final int MEDIA_ERROR = 100; |
- private static final int MEDIA_INFO = 200; |
- |
- /** |
- * Keep these error codes in sync with the code we defined in |
- * MediaPlayerListener.java. |
- */ |
- public static final int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 2; |
- public static final int MEDIA_ERROR_INVALID_CODE = 3; |
- |
- // all possible internal states |
- private static final int STATE_ERROR = -1; |
- private static final int STATE_IDLE = 0; |
- private static final int STATE_PLAYING = 1; |
- private static final int STATE_PAUSED = 2; |
- private static final int STATE_PLAYBACK_COMPLETED = 3; |
- |
- private SurfaceHolder mSurfaceHolder; |
- private int mVideoWidth; |
- private int mVideoHeight; |
- private int mDuration; |
- |
- // Native pointer to C++ ContentVideoView object. |
- private long mNativeContentVideoView; |
- |
- // webkit should have prepared the media |
- private int mCurrentState = STATE_IDLE; |
- |
- // Strings for displaying media player errors |
- private String mPlaybackErrorText; |
- private String mUnknownErrorText; |
- private String mErrorButton; |
- private String mErrorTitle; |
- private String mVideoLoadingText; |
- |
- // This view will contain the video. |
- private VideoSurfaceView mVideoSurfaceView; |
- |
- // Progress view when the video is loading. |
- private View mProgressView; |
- |
- private final ContentVideoViewClient mClient; |
- |
- private class VideoSurfaceView extends SurfaceView { |
- |
- public VideoSurfaceView(Context context) { |
- super(context); |
- } |
- |
- @Override |
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { |
- int width = getDefaultSize(mVideoWidth, widthMeasureSpec); |
- int height = getDefaultSize(mVideoHeight, heightMeasureSpec); |
- if (mVideoWidth > 0 && mVideoHeight > 0) { |
- if (mVideoWidth * height > width * mVideoHeight) { |
- height = width * mVideoHeight / mVideoWidth; |
- } else if (mVideoWidth * height < width * mVideoHeight) { |
- width = height * mVideoWidth / mVideoHeight; |
- } |
- } |
- setMeasuredDimension(width, height); |
- } |
- } |
- |
- private static class ProgressView extends LinearLayout { |
- |
- private final ProgressBar mProgressBar; |
- private final TextView mTextView; |
- |
- public ProgressView(Context context, String videoLoadingText) { |
- super(context); |
- setOrientation(LinearLayout.VERTICAL); |
- setLayoutParams(new LinearLayout.LayoutParams( |
- LinearLayout.LayoutParams.WRAP_CONTENT, |
- LinearLayout.LayoutParams.WRAP_CONTENT)); |
- mProgressBar = new ProgressBar(context, null, android.R.attr.progressBarStyleLarge); |
- mTextView = new TextView(context); |
- mTextView.setText(videoLoadingText); |
- addView(mProgressBar); |
- addView(mTextView); |
- } |
- } |
- |
- private final Runnable mExitFullscreenRunnable = new Runnable() { |
- @Override |
- public void run() { |
- exitFullscreen(true); |
- } |
- }; |
- |
- protected ContentVideoView(Context context, long nativeContentVideoView, |
- ContentVideoViewClient client) { |
- super(context); |
- mNativeContentVideoView = nativeContentVideoView; |
- mClient = client; |
- initResources(context); |
- mVideoSurfaceView = new VideoSurfaceView(context); |
- showContentVideoView(); |
- setVisibility(View.VISIBLE); |
- mClient.onShowCustomView(this); |
- } |
- |
- private void initResources(Context context) { |
- if (mPlaybackErrorText != null) return; |
- mPlaybackErrorText = context.getString( |
- org.chromium.content.R.string.media_player_error_text_invalid_progressive_playback); |
- mUnknownErrorText = context.getString( |
- org.chromium.content.R.string.media_player_error_text_unknown); |
- mErrorButton = context.getString( |
- org.chromium.content.R.string.media_player_error_button); |
- mErrorTitle = context.getString( |
- org.chromium.content.R.string.media_player_error_title); |
- mVideoLoadingText = context.getString( |
- org.chromium.content.R.string.media_player_loading_video); |
- } |
- |
- protected void showContentVideoView() { |
- mVideoSurfaceView.getHolder().addCallback(this); |
- this.addView(mVideoSurfaceView, new FrameLayout.LayoutParams( |
- ViewGroup.LayoutParams.MATCH_PARENT, |
- ViewGroup.LayoutParams.MATCH_PARENT, |
- Gravity.CENTER)); |
- |
- mProgressView = mClient.getVideoLoadingProgressView(); |
- if (mProgressView == null) { |
- mProgressView = new ProgressView(getContext(), mVideoLoadingText); |
- } |
- this.addView(mProgressView, new FrameLayout.LayoutParams( |
- ViewGroup.LayoutParams.WRAP_CONTENT, |
- ViewGroup.LayoutParams.WRAP_CONTENT, |
- Gravity.CENTER)); |
- } |
- |
- protected SurfaceView getSurfaceView() { |
- return mVideoSurfaceView; |
- } |
- |
- @CalledByNative |
- public void onMediaPlayerError(int errorType) { |
- Log.d(TAG, "OnMediaPlayerError: " + errorType); |
- if (mCurrentState == STATE_ERROR || mCurrentState == STATE_PLAYBACK_COMPLETED) { |
- return; |
- } |
- |
- // Ignore some invalid error codes. |
- if (errorType == MEDIA_ERROR_INVALID_CODE) { |
- return; |
- } |
- |
- mCurrentState = STATE_ERROR; |
- |
- /* Pop up an error dialog so the user knows that |
- * something bad has happened. Only try and pop up the dialog |
- * if we're attached to a window. When we're going away and no |
- * longer have a window, don't bother showing the user an error. |
- * |
- * TODO(qinmin): We need to review whether this Dialog is OK with |
- * the rest of the browser UI elements. |
- */ |
- if (getWindowToken() != null) { |
- String message; |
- |
- if (errorType == MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK) { |
- message = mPlaybackErrorText; |
- } else { |
- message = mUnknownErrorText; |
- } |
- |
- try { |
- new AlertDialog.Builder(getContext()) |
- .setTitle(mErrorTitle) |
- .setMessage(message) |
- .setPositiveButton(mErrorButton, |
- new DialogInterface.OnClickListener() { |
- @Override |
- public void onClick(DialogInterface dialog, int whichButton) { |
- /* Inform that the video is over. |
- */ |
- onCompletion(); |
- } |
- }) |
- .setCancelable(false) |
- .show(); |
- } catch (RuntimeException e) { |
- Log.e(TAG, "Cannot show the alert dialog, error message: " + message, e); |
- } |
- } |
- } |
- |
- @CalledByNative |
- private void onVideoSizeChanged(int width, int height) { |
- mVideoWidth = width; |
- mVideoHeight = height; |
- // This will trigger the SurfaceView.onMeasure() call. |
- mVideoSurfaceView.getHolder().setFixedSize(mVideoWidth, mVideoHeight); |
- } |
- |
- @CalledByNative |
- protected void onBufferingUpdate(int percent) { |
- } |
- |
- @CalledByNative |
- private void onPlaybackComplete() { |
- onCompletion(); |
- } |
- |
- @CalledByNative |
- protected void onUpdateMediaMetadata( |
- int videoWidth, |
- int videoHeight, |
- int duration, |
- boolean canPause, |
- boolean canSeekBack, |
- boolean canSeekForward) { |
- mDuration = duration; |
- mProgressView.setVisibility(View.GONE); |
- mCurrentState = isPlaying() ? STATE_PLAYING : STATE_PAUSED; |
- onVideoSizeChanged(videoWidth, videoHeight); |
- } |
- |
- @Override |
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { |
- } |
- |
- @Override |
- public void surfaceCreated(SurfaceHolder holder) { |
- mSurfaceHolder = holder; |
- openVideo(); |
- } |
- |
- @Override |
- public void surfaceDestroyed(SurfaceHolder holder) { |
- if (mNativeContentVideoView != 0) { |
- nativeSetSurface(mNativeContentVideoView, null); |
- } |
- mSurfaceHolder = null; |
- post(mExitFullscreenRunnable); |
- } |
- |
- @CalledByNative |
- protected void openVideo() { |
- if (mSurfaceHolder != null) { |
- mCurrentState = STATE_IDLE; |
- if (mNativeContentVideoView != 0) { |
- nativeRequestMediaMetadata(mNativeContentVideoView); |
- nativeSetSurface(mNativeContentVideoView, |
- mSurfaceHolder.getSurface()); |
- } |
- } |
- } |
- |
- protected void onCompletion() { |
- mCurrentState = STATE_PLAYBACK_COMPLETED; |
- } |
- |
- |
- protected boolean isInPlaybackState() { |
- return (mCurrentState != STATE_ERROR && mCurrentState != STATE_IDLE); |
- } |
- |
- protected void start() { |
- if (isInPlaybackState()) { |
- if (mNativeContentVideoView != 0) { |
- nativePlay(mNativeContentVideoView); |
- } |
- mCurrentState = STATE_PLAYING; |
- } |
- } |
- |
- protected void pause() { |
- if (isInPlaybackState()) { |
- if (isPlaying()) { |
- if (mNativeContentVideoView != 0) { |
- nativePause(mNativeContentVideoView); |
- } |
- mCurrentState = STATE_PAUSED; |
- } |
- } |
- } |
- |
- // cache duration as mDuration for faster access |
- protected int getDuration() { |
- if (isInPlaybackState()) { |
- if (mDuration > 0) { |
- return mDuration; |
- } |
- if (mNativeContentVideoView != 0) { |
- mDuration = nativeGetDurationInMilliSeconds(mNativeContentVideoView); |
- } else { |
- mDuration = 0; |
- } |
- return mDuration; |
- } |
- mDuration = -1; |
- return mDuration; |
- } |
- |
- protected int getCurrentPosition() { |
- if (isInPlaybackState() && mNativeContentVideoView != 0) { |
- return nativeGetCurrentPosition(mNativeContentVideoView); |
- } |
- return 0; |
- } |
- |
- protected void seekTo(int msec) { |
- if (mNativeContentVideoView != 0) { |
- nativeSeekTo(mNativeContentVideoView, msec); |
- } |
- } |
- |
- protected boolean isPlaying() { |
- return mNativeContentVideoView != 0 && nativeIsPlaying(mNativeContentVideoView); |
- } |
- |
- @CalledByNative |
- private static ContentVideoView createContentVideoView( |
- Context context, long nativeContentVideoView, ContentVideoViewClient client, |
- boolean legacy) { |
- ThreadUtils.assertOnUiThread(); |
- // The context needs be Activity to create the ContentVideoView correctly. |
- if (!(context instanceof Activity)) { |
- Log.w(TAG, "Wrong type of context, can't create fullscreen video"); |
- return null; |
- } |
- if (legacy) { |
- return new ContentVideoViewLegacy(context, nativeContentVideoView, client); |
- } else { |
- return new ContentVideoView(context, nativeContentVideoView, client); |
- } |
- } |
- |
- public void removeSurfaceView() { |
- removeView(mVideoSurfaceView); |
- removeView(mProgressView); |
- mVideoSurfaceView = null; |
- mProgressView = null; |
- } |
- |
- public void exitFullscreen(boolean relaseMediaPlayer) { |
- destroyContentVideoView(false); |
- if (mNativeContentVideoView != 0) { |
- nativeExitFullscreen(mNativeContentVideoView, relaseMediaPlayer); |
- mNativeContentVideoView = 0; |
- } |
- } |
- |
- @CalledByNative |
- private void onExitFullscreen() { |
- exitFullscreen(false); |
- } |
- |
- /** |
- * This method shall only be called by native and exitFullscreen, |
- * To exit fullscreen, use exitFullscreen in Java. |
- */ |
- @CalledByNative |
- protected void destroyContentVideoView(boolean nativeViewDestroyed) { |
- if (mVideoSurfaceView != null) { |
- removeSurfaceView(); |
- setVisibility(View.GONE); |
- |
- // To prevent re-entrance, call this after removeSurfaceView. |
- mClient.onDestroyContentVideoView(); |
- } |
- if (nativeViewDestroyed) { |
- mNativeContentVideoView = 0; |
- } |
- } |
- |
- public static ContentVideoView getContentVideoView() { |
- return nativeGetSingletonJavaContentVideoView(); |
- } |
- |
- @Override |
- public boolean onKeyUp(int keyCode, KeyEvent event) { |
- if (keyCode == KeyEvent.KEYCODE_BACK) { |
- exitFullscreen(false); |
- return true; |
- } |
- return super.onKeyUp(keyCode, event); |
- } |
- |
- private static native ContentVideoView nativeGetSingletonJavaContentVideoView(); |
- private native void nativeExitFullscreen(long nativeContentVideoView, |
- boolean relaseMediaPlayer); |
- private native int nativeGetCurrentPosition(long nativeContentVideoView); |
- private native int nativeGetDurationInMilliSeconds(long nativeContentVideoView); |
- private native void nativeRequestMediaMetadata(long nativeContentVideoView); |
- private native int nativeGetVideoWidth(long nativeContentVideoView); |
- private native int nativeGetVideoHeight(long nativeContentVideoView); |
- private native boolean nativeIsPlaying(long nativeContentVideoView); |
- private native void nativePause(long nativeContentVideoView); |
- private native void nativePlay(long nativeContentVideoView); |
- private native void nativeSeekTo(long nativeContentVideoView, int msec); |
- private native void nativeSetSurface(long nativeContentVideoView, Surface surface); |
-} |