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"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/metrics/histogram.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/android/content_view_core_impl.h"
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/media/android/browser_media_player_manager.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/power_save_blocker_impl.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/android/surface_texture_peer.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/user_metrics.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jni/ContentVideoView_jni.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::AttachCurrentThread;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::CheckException;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ScopedJavaGlobalRef;
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing base::UserMetricsAction;
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing content::RecordAction;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace {
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// There can only be one content video view at a time, this holds onto that
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// singleton instance.
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ContentVideoView* g_content_video_view = NULL;
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static jobject GetSingletonJavaContentVideoView(JNIEnv*env, jclass) {
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (g_content_video_view)
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return g_content_video_view->GetJavaObject(env).Release();
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  else
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NULL;
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContentVideoView::RegisterContentVideoView(JNIEnv* env) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RegisterNativesImpl(env);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ContentVideoView* ContentVideoView::GetInstance() {
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return g_content_video_view;
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ContentVideoView::ContentVideoView(
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    BrowserMediaPlayerManager* manager)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : manager_(manager),
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      weak_factory_(this) {
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(!g_content_video_view);
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  j_content_video_view_ = CreateJavaObject();
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  g_content_video_view = this;
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreatePowerSaveBlocker();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentVideoView::~ContentVideoView() {
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(g_content_video_view);
614ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  JNIEnv* env = AttachCurrentThread();
624ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
634ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  if (!content_video_view.is_null()) {
644ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    Java_ContentVideoView_destroyContentVideoView(env,
654ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        content_video_view.obj(), true);
664ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    j_content_video_view_.reset();
674ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  }
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  g_content_video_view = NULL;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ContentVideoView::OpenVideo() {
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!content_video_view.is_null()) {
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CreatePowerSaveBlocker();
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Java_ContentVideoView_openVideo(env, content_video_view.obj());
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::OnMediaPlayerError(int error_type) {
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()) {
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    power_save_blocker_.reset();
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Java_ContentVideoView_onMediaPlayerError(env, content_video_view.obj(),
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        error_type);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::OnVideoSizeChanged(int width, int height) {
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!content_video_view.is_null()) {
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Java_ContentVideoView_onVideoSizeChanged(env, content_video_view.obj(),
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        width, height);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::OnBufferingUpdate(int percent) {
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!content_video_view.is_null()) {
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Java_ContentVideoView_onBufferingUpdate(env, content_video_view.obj(),
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        percent);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::OnPlaybackComplete() {
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!content_video_view.is_null()) {
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    power_save_blocker_.reset();
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Java_ContentVideoView_onPlaybackComplete(env, content_video_view.obj());
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ContentVideoView::OnExitFullscreen() {
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!content_video_view.is_null())
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Java_ContentVideoView_onExitFullscreen(env, content_video_view.obj());
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ContentVideoView::RecordFullscreenPlayback(
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    JNIEnv*, jobject, bool is_portrait_video, bool is_orientation_portrait) {
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UMA_HISTOGRAM_BOOLEAN("MobileFullscreenVideo.OrientationPortrait",
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        is_orientation_portrait);
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UMA_HISTOGRAM_BOOLEAN("MobileFullscreenVideo.VideoPortrait",
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        is_portrait_video);
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ContentVideoView::RecordExitFullscreenPlayback(
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    JNIEnv*, jobject, bool is_portrait_video,
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    long playback_duration_in_milliseconds_before_orientation_change,
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    long playback_duration_in_milliseconds_after_orientation_change) {
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool orientation_changed = (
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      playback_duration_in_milliseconds_after_orientation_change != 0);
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (is_portrait_video) {
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    UMA_HISTOGRAM_COUNTS(
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        "MobileFullscreenVideo.PortraitDuration",
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        playback_duration_in_milliseconds_before_orientation_change);
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    UMA_HISTOGRAM_COUNTS(
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        "MobileFullscreenVideo.PortraitRotation", orientation_changed);
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (orientation_changed) {
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      UMA_HISTOGRAM_COUNTS(
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "MobileFullscreenVideo.DurationAfterPotraitRotation",
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          playback_duration_in_milliseconds_after_orientation_change);
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    UMA_HISTOGRAM_COUNTS(
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        "MobileFullscreenVideo.LandscapeDuration",
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        playback_duration_in_milliseconds_before_orientation_change);
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    UMA_HISTOGRAM_COUNTS(
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        "MobileFullscreenVideo.LandscapeRotation", orientation_changed);
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::UpdateMediaMetadata() {
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (content_video_view.is_null())
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (player && player->IsPlayerReady()) {
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Java_ContentVideoView_onUpdateMediaMetadata(
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        env, content_video_view.obj(), player->GetVideoWidth(),
168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        player->GetVideoHeight(),
169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        static_cast<int>(player->GetDuration().InMilliseconds()),
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        player->CanPause(),player->CanSeekForward(), player->CanSeekBackward());
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ContentVideoView::GetVideoWidth(JNIEnv*, jobject obj) const {
175b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return player ? player->GetVideoWidth() : 0;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ContentVideoView::GetVideoHeight(JNIEnv*, jobject obj) const {
180b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return player ? player->GetVideoHeight() : 0;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ContentVideoView::GetDurationInMilliSeconds(JNIEnv*, jobject obj) const {
185b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return player ? player->GetDuration().InMilliseconds() : -1;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ContentVideoView::GetCurrentPosition(JNIEnv*, jobject obj) const {
190b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return player ? player->GetCurrentTime().InMilliseconds() : 0;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContentVideoView::IsPlaying(JNIEnv*, jobject obj) {
195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  media::MediaPlayerAndroid* player = manager_->GetFullscreenPlayer();
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return player ? player->IsPlaying() : false;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::SeekTo(JNIEnv*, jobject obj, jint msec) {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->FullscreenPlayerSeek(msec);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::Play(JNIEnv*, jobject obj) {
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreatePowerSaveBlocker();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->FullscreenPlayerPlay();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::Pause(JNIEnv*, jobject obj) {
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  power_save_blocker_.reset();
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->FullscreenPlayerPause();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::ExitFullscreen(
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv*, jobject, jboolean release_media_player) {
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  power_save_blocker_.reset();
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  j_content_video_view_.reset();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->ExitFullscreen(release_media_player);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentVideoView::SetSurface(JNIEnv* env, jobject obj,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  jobject surface) {
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetVideoSurface(
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      gfx::ScopedJavaSurface::AcquireExternalSurface(surface));
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentVideoView::RequestMediaMetadata(JNIEnv* env, jobject obj) {
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::MessageLoop::current()->PostTask(
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FROM_HERE,
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&ContentVideoView::UpdateMediaMetadata,
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 weak_factory_.GetWeakPtr()));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)ScopedJavaLocalRef<jobject> ContentVideoView::GetJavaObject(JNIEnv* env) {
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return j_content_video_view_.get(env);
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::NativeView ContentVideoView::GetNativeView() {
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedJavaLocalRef<jobject> content_video_view = GetJavaObject(env);
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (content_video_view.is_null())
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return NULL;
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return reinterpret_cast<gfx::NativeView>(
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Java_ContentVideoView_getNativeViewAndroid(env,
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 content_video_view.obj()));
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)JavaObjectWeakGlobalRef ContentVideoView::CreateJavaObject() {
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ContentViewCoreImpl* content_view_core = manager_->GetContentViewCore();
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return JavaObjectWeakGlobalRef(
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      env,
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Java_ContentVideoView_createContentVideoView(
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          env,
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          content_view_core->GetContext().obj(),
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          reinterpret_cast<intptr_t>(this),
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          content_view_core->GetContentVideoViewClient().obj()).obj());
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ContentVideoView::CreatePowerSaveBlocker() {
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      switches::kEnableContentVideoViewPowerSaveBlocker)) {
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // In fullscreen Clank reuses the power save blocker attached to the
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // container view that was created for embedded video. The WebView cannot
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // reuse that so we create a new blocker instead.
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (power_save_blocker_) return;
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    power_save_blocker_ = PowerSaveBlocker::Create(
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep,
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        "Playing video").Pass();
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    static_cast<PowerSaveBlockerImpl*>(power_save_blocker_.get())->
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        InitDisplaySleepBlocker(GetNativeView());
273e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace content
277