blob: e070327c1a707dcce4e41481afb096b57ef4caed [file] [log] [blame]
// Copyright (c) 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.
#ifndef CONTENT_BROWSER_ANDROID_CONTENT_VIDEO_VIEW_H_
#define CONTENT_BROWSER_ANDROID_CONTENT_VIDEO_VIEW_H_
#include <jni.h>
#include "base/android/jni_weak_ref.h"
#include "base/android/scoped_java_ref.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "ui/gl/android/scoped_java_surface.h"
namespace gfx {
class Size;
}
namespace content {
class WebContents;
// Native mirror of ContentVideoView.java. This class is responsible for
// creating the Java video view and passing changes in player status to it.
// This class must be used on the UI thread.
class ContentVideoView {
public:
// Returns the singleton object or NULL.
static ContentVideoView* GetInstance();
class Client {
public:
Client() {}
// For receiving notififcations when the SurfaceView surface is created and
// destroyed. When |surface.IsEmpty()| the surface was destroyed and
// the client should not hold any references to it once this returns.
virtual void SetVideoSurface(gl::ScopedJavaSurface surface) = 0;
// Called after the ContentVideoView has been hidden because we're exiting
// fullscreen.
virtual void DidExitFullscreen(bool release_media_player) = 0;
protected:
~Client() {}
DISALLOW_COPY_AND_ASSIGN(Client);
};
explicit ContentVideoView(Client* client,
WebContents* web_contents,
const base::android::JavaRef<jobject>& embedder,
const gfx::Size& video_natural_size);
~ContentVideoView();
// To open another video on existing ContentVideoView.
void OpenVideo();
// Display an error dialog to the user.
void OnMediaPlayerError(int error_type);
// Update the video size.
void OnVideoSizeChanged(int width, int height);
// Exit fullscreen and notify |client_| with |DidExitFullscreen|.
void ExitFullscreen();
// Returns the corresponding ContentVideoView Java object if any.
base::android::ScopedJavaLocalRef<jobject> GetJavaObject(JNIEnv* env);
// Called by the Java class when the surface changes.
void SetSurface(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& surface);
// Called when the Java fullscreen view is destroyed. If
// |release_media_player| is true, |client_| needs to release the player
// as we are quitting the app.
void DidExitFullscreen(JNIEnv*,
const base::android::JavaParamRef<jobject>&,
jboolean release_media_player);
// Functions called to record fullscreen playback UMA metrics.
void RecordFullscreenPlayback(JNIEnv*,
const base::android::JavaParamRef<jobject>&,
bool is_portrait_video,
bool is_orientation_portrait);
void RecordExitFullscreenPlayback(
JNIEnv*,
const base::android::JavaParamRef<jobject>&,
bool is_portrait_video,
long playback_duration_in_milliseconds_before_orientation_change,
long playback_duration_in_milliseconds_after_orientation_change);
private:
// Creates the corresponding ContentVideoView Java object.
JavaObjectWeakGlobalRef CreateJavaObject(
WebContents* web_contents,
const base::android::JavaRef<jobject>& j_content_video_view_embedder,
const gfx::Size& video_natural_size);
Client* client_;
// Weak reference to corresponding Java object.
JavaObjectWeakGlobalRef j_content_video_view_;
// Weak pointer for posting tasks.
base::WeakPtrFactory<ContentVideoView> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(ContentVideoView);
};
} // namespace content
#endif // CONTENT_BROWSER_ANDROID_CONTENT_VIDEO_VIEW_H_