content_video_view.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/android/content_video_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/android/content_view_core_impl.h"
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/media/android/browser_media_player_manager.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/power_save_blocker_impl.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/android/surface_texture_peer.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jni/ContentVideoView_jni.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::AttachCurrentThread;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::CheckException;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ScopedJavaGlobalRef;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace {
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// There can only be one content video view at a time, this holds onto that
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// singleton instance.
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ContentVideoView* g_content_video_view = NULL;
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static jobject GetSingletonJavaContentVideoView(JNIEnv*env, jclass) {
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (g_content_video_view)
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return g_content_video_view->GetJavaObject(env).Release();
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  else
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContentVideoView::RegisterContentVideoView(JNIEnv* env) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RegisterNativesImpl(env);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ContentVideoView* ContentVideoView::GetInstance() {
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return g_content_video_view;
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ContentVideoView::ContentVideoView(
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    BrowserMediaPlayerManager* manager)
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : manager_(manager),
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      weak_factory_(this) {
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(!g_content_video_view);
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  j_content_video_view_ = CreateJavaObject();
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  g_content_video_view = this;
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreatePowerSaveBlocker();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentVideoView::~ContentVideoView() {
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(g_content_video_view);
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DestroyContentVideoView(true);
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  g_content_video_view = NULL;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ContentVideoView::OpenVideo() {
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!content_video_view.is_null()) {
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CreatePowerSaveBlocker();
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Java_ContentVideoView_openVideo(env, content_video_view.obj());
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::OnMediaPlayerError(int error_type) {
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!content_video_view.is_null()) {
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    power_save_blocker_.reset();
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Java_ContentVideoView_onMediaPlayerError(env, content_video_view.obj(),
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        error_type);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::OnVideoSizeChanged(int width, int height) {
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!content_video_view.is_null()) {
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Java_ContentVideoView_onVideoSizeChanged(env, content_video_view.obj(),
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        width, height);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::OnBufferingUpdate(int percent) {
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!content_video_view.is_null()) {
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Java_ContentVideoView_onBufferingUpdate(env, content_video_view.obj(),
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        percent);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::OnPlaybackComplete() {
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!content_video_view.is_null()) {
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    power_save_blocker_.reset();
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Java_ContentVideoView_onPlaybackComplete(env, content_video_view.obj());
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ContentVideoView::OnExitFullscreen() {
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!content_video_view.is_null()) {
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Java_ContentVideoView_onExitFullscreen(env, content_video_view.obj());
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    j_content_video_view_.reset();
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::UpdateMediaMetadata() {
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (content_video_view.is_null())
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (player && player->IsPlayerReady()) {
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Java_ContentVideoView_onUpdateMediaMetadata(
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        env, content_video_view.obj(), player->GetVideoWidth(),
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        player->GetVideoHeight(), player->GetDuration().InMilliseconds(),
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        player->CanPause(),player->CanSeekForward(), player->CanSeekBackward());
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ContentVideoView::GetVideoWidth(JNIEnv*, jobject obj) const {
132b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return player ? player->GetVideoWidth() : 0;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ContentVideoView::GetVideoHeight(JNIEnv*, jobject obj) const {
137b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return player ? player->GetVideoHeight() : 0;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ContentVideoView::GetDurationInMilliSeconds(JNIEnv*, jobject obj) const {
142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return player ? player->GetDuration().InMilliseconds() : -1;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ContentVideoView::GetCurrentPosition(JNIEnv*, jobject obj) const {
147b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return player ? player->GetCurrentTime().InMilliseconds() : 0;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContentVideoView::IsPlaying(JNIEnv*, jobject obj) {
152b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return player ? player->IsPlaying() : false;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::SeekTo(JNIEnv*, jobject obj, jint msec) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->FullscreenPlayerSeek(msec);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::Play(JNIEnv*, jobject obj) {
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreatePowerSaveBlocker();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->FullscreenPlayerPlay();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::Pause(JNIEnv*, jobject obj) {
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  power_save_blocker_.reset();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->FullscreenPlayerPause();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::ExitFullscreen(
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv*, jobject, jboolean release_media_player) {
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  power_save_blocker_.reset();
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  j_content_video_view_.reset();
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->ExitFullscreen(release_media_player);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::SetSurface(JNIEnv* env, jobject obj,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  jobject surface) {
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetVideoSurface(
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      gfx::ScopedJavaSurface::AcquireExternalSurface(surface));
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentVideoView::RequestMediaMetadata(JNIEnv* env, jobject obj) {
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::MessageLoop::current()->PostTask(
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FROM_HERE,
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&ContentVideoView::UpdateMediaMetadata,
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 weak_factory_.GetWeakPtr()));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ScopedJavaLocalRef<jobject> ContentVideoView::GetJavaObject(JNIEnv* env) {
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return j_content_video_view_.get(env);
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::NativeView ContentVideoView::GetNativeView() {
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (content_video_view.is_null())
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return NULL;
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return reinterpret_cast<gfx::NativeView>(
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Java_ContentVideoView_getNativeViewAndroid(env,
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 content_video_view.obj()));
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)JavaObjectWeakGlobalRef ContentVideoView::CreateJavaObject() {
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ContentViewCoreImpl* content_view_core = manager_->GetContentViewCore();
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool legacyMode = !CommandLine::ForCurrentProcess()->HasSwitch(
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      switches::kEnableOverlayFullscreenVideoSubtitle);
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return JavaObjectWeakGlobalRef(
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      env,
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Java_ContentVideoView_createContentVideoView(
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          env,
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          content_view_core->GetContext().obj(),
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          reinterpret_cast<intptr_t>(this),
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          content_view_core->GetContentVideoViewClient().obj(),
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          legacyMode).obj());
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentVideoView::CreatePowerSaveBlocker() {
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (power_save_blocker_) return;
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  power_save_blocker_ = PowerSaveBlocker::Create(
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep,
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "Playing video").Pass();
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static_cast<PowerSaveBlockerImpl*>(power_save_blocker_.get())->
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      InitDisplaySleepBlocker(GetNativeView());
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ContentVideoView::DestroyContentVideoView(bool native_view_destroyed) {
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
233a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!content_video_view.is_null()) {
235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    Java_ContentVideoView_destroyContentVideoView(env,
236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        content_video_view.obj(), native_view_destroyed);
237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    j_content_video_view_.reset();
238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace content
241