| Index: content/renderer/media/android/webmediaplayer_android.cc
|
| diff --git a/content/renderer/media/android/webmediaplayer_android.cc b/content/renderer/media/android/webmediaplayer_android.cc
|
| index d3a458c967751d764d08c1fd5c7134bf4bed3d10..8bbb6b301450f0ffe4c0940d75c5f0d82a79182b 100644
|
| --- a/content/renderer/media/android/webmediaplayer_android.cc
|
| +++ b/content/renderer/media/android/webmediaplayer_android.cc
|
| @@ -182,8 +182,10 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid(
|
|
|
| DCHECK(main_thread_checker_.CalledOnValidThread());
|
|
|
| - if (delegate_)
|
| + if (delegate_) {
|
| delegate_id_ = delegate_->AddObserver(this);
|
| + delegate_->SetIdle(delegate_id_, true);
|
| + }
|
|
|
| player_id_ = player_manager_->RegisterMediaPlayer(this);
|
|
|
| @@ -295,8 +297,8 @@ void WebMediaPlayerAndroid::play() {
|
| bool can_video_play_in_background =
|
| base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| switches::kDisableMediaSuspend) ||
|
| - (IsBackgroundVideoCandidate() &&
|
| - delegate_ && delegate_->IsPlayingBackgroundVideo());
|
| + (IsBackgroundVideoCandidate() && delegate_ &&
|
| + delegate_->IsBackgroundVideoPlaybackUnlocked());
|
| if (!can_video_play_in_background) {
|
| is_play_pending_ = true;
|
| return;
|
| @@ -828,8 +830,10 @@ void WebMediaPlayerAndroid::OnVideoSizeChanged(int width, int height) {
|
| // If we're paused after we receive metadata for the first time, tell the
|
| // delegate we can now be safely suspended due to inactivity if a subsequent
|
| // play event does not occur.
|
| - if (paused() && delegate_)
|
| - delegate_->DidPause(delegate_id_, false);
|
| + if (paused() && delegate_) {
|
| + delegate_->DidPause(delegate_id_);
|
| + delegate_->SetIdle(delegate_id_, true);
|
| + }
|
| }
|
| }
|
|
|
| @@ -1204,19 +1208,28 @@ void WebMediaPlayerAndroid::UpdatePlayingState(bool is_playing) {
|
| // be known at this point -- there are no video only containers, so only
|
| // send audio if we know for sure its audio. The browser side player will
|
| // fill in the correct value later for media sessions.
|
| - delegate_->DidPlay(delegate_id_, hasVideo(), !hasVideo(), isRemote(),
|
| - media::DurationToMediaContentType(duration_));
|
| + if (isRemote()) {
|
| + delegate_->PlayerGone(delegate_id_);
|
| + } else {
|
| + delegate_->DidPlay(delegate_id_, hasVideo(), !hasVideo(),
|
| + media::DurationToMediaContentType(duration_));
|
| + }
|
| + delegate_->SetIdle(delegate_id_, false);
|
| } else {
|
| // Even if OnPlaybackComplete() has not been called yet, Blink may have
|
| // already fired the ended event based on current time relative to
|
| // duration -- so we need to check both possibilities here.
|
| - delegate_->DidPause(delegate_id_,
|
| - playback_completed_ || currentTime() >= duration());
|
| + if (playback_completed_ || currentTime() >= duration()) {
|
| + delegate_->PlayerGone(delegate_id_);
|
| + } else {
|
| + delegate_->DidPause(delegate_id_);
|
| + }
|
| + delegate_->SetIdle(delegate_id_, true);
|
| }
|
| }
|
| }
|
|
|
| -void WebMediaPlayerAndroid::OnHidden() {
|
| +void WebMediaPlayerAndroid::OnFrameHidden() {
|
| // Pause audible video preserving its session.
|
| if (hasVideo() && IsBackgroundVideoCandidate() && !paused()) {
|
| Pause(false);
|
| @@ -1224,29 +1237,30 @@ void WebMediaPlayerAndroid::OnHidden() {
|
| return;
|
| }
|
|
|
| - OnSuspendRequested(false);
|
| + OnIdleTimeout();
|
| }
|
|
|
| -void WebMediaPlayerAndroid::OnShown() {
|
| +void WebMediaPlayerAndroid::OnFrameClosed() {
|
| + SuspendAndReleaseResources();
|
| +}
|
| +
|
| +void WebMediaPlayerAndroid::OnFrameShown() {
|
| if (is_play_pending_)
|
| play();
|
| }
|
|
|
| -bool WebMediaPlayerAndroid::OnSuspendRequested(bool must_suspend) {
|
| - if (!must_suspend &&
|
| - base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| +void WebMediaPlayerAndroid::OnIdleTimeout() {
|
| + if (base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| switches::kDisableMediaSuspend)) {
|
| - return true;
|
| + return;
|
| }
|
|
|
| - // If we're idle or playing video, pause and release resources; audio only
|
| - // players are allowed to continue unless indicated otherwise by the call.
|
| - if (must_suspend || (paused() && playback_completed_) ||
|
| - (hasVideo() && !IsBackgroundVideoCandidate())) {
|
| + // If we're playing video or ended, pause and release resources; audio only
|
| + // players are allowed to continue.
|
| + if ((hasVideo() && !IsBackgroundVideoCandidate()) ||
|
| + (paused() && playback_completed_)) {
|
| SuspendAndReleaseResources();
|
| }
|
| -
|
| - return true;
|
| }
|
|
|
| void WebMediaPlayerAndroid::OnPlay() {
|
| @@ -1327,7 +1341,8 @@ bool WebMediaPlayerAndroid::IsBackgroundVideoCandidate() const {
|
| }
|
|
|
| return base::FeatureList::IsEnabled(media::kResumeBackgroundVideo) &&
|
| - hasAudio() && !isRemote() && delegate_ && delegate_->IsHidden();
|
| + hasAudio() && !isRemote() && delegate_ && delegate_->IsFrameHidden() &&
|
| + !delegate_->IsFrameClosed();
|
| }
|
|
|
| } // namespace content
|
|
|