content_video_view.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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