| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chromecast/browser/cast_media_blocker.h" | 5 #include "chromecast/browser/cast_media_blocker.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | |
| 8 #include "base/threading/thread_checker.h" | 7 #include "base/threading/thread_checker.h" |
| 8 #include "content/public/browser/media_session.h" |
| 9 #include "content/public/browser/web_contents.h" | 9 #include "content/public/browser/web_contents.h" |
| 10 | 10 |
| 11 namespace chromecast { | 11 namespace chromecast { |
| 12 namespace shell { | 12 namespace shell { |
| 13 | 13 |
| 14 CastMediaBlocker::CastMediaBlocker(content::WebContents* web_contents) | 14 CastMediaBlocker::CastMediaBlocker(content::MediaSession* media_session, |
| 15 : CastMediaBlocker::CastMediaBlocker( | 15 content::WebContents* web_contents) |
| 16 web_contents, | 16 : content::MediaSessionObserver(media_session), |
| 17 base::Bind(&CastMediaBlocker::Suspend, base::Unretained(this)), | 17 content::WebContentsObserver(web_contents), |
| 18 base::Bind(&CastMediaBlocker::Resume, base::Unretained(this))) {} | |
| 19 | |
| 20 CastMediaBlocker::CastMediaBlocker(content::WebContents* web_contents, | |
| 21 const base::Closure& suspend_cb, | |
| 22 const base::Closure& resume_cb) | |
| 23 : content::WebContentsObserver(web_contents), | |
| 24 suspend_cb_(suspend_cb), | |
| 25 resume_cb_(resume_cb), | |
| 26 blocked_(false), | 18 blocked_(false), |
| 27 paused_by_user_(true), | 19 paused_by_user_(true), |
| 28 suspended_(true), | 20 suspended_(true), |
| 29 controllable_(false) {} | 21 controllable_(false) {} |
| 30 | 22 |
| 31 CastMediaBlocker::~CastMediaBlocker() {} | 23 CastMediaBlocker::~CastMediaBlocker() {} |
| 32 | 24 |
| 33 void CastMediaBlocker::BlockMediaLoading(bool blocked) { | 25 void CastMediaBlocker::BlockMediaLoading(bool blocked) { |
| 34 if (blocked_ == blocked) | 26 if (blocked_ == blocked) |
| 35 return; | 27 return; |
| 36 | 28 |
| 37 blocked_ = blocked; | 29 blocked_ = blocked; |
| 38 UpdateMediaBlockedState(); | 30 UpdateMediaBlockedState(); |
| 39 | 31 |
| 40 LOG(INFO) << __FUNCTION__ << " blocked=" << blocked_ | 32 LOG(INFO) << __FUNCTION__ << " blocked=" << blocked_ |
| 41 << " suspended=" << suspended_ << " controllable=" << controllable_ | 33 << " suspended=" << suspended_ << " controllable=" << controllable_ |
| 42 << " paused_by_user=" << paused_by_user_; | 34 << " paused_by_user=" << paused_by_user_; |
| 43 | 35 |
| 44 // If blocking media, suspend if possible. | 36 // If blocking media, suspend if possible. |
| 45 if (blocked_) { | 37 if (blocked_) { |
| 46 if (!suspended_ && controllable_) { | 38 if (!suspended_ && controllable_) { |
| 47 suspend_cb_.Run(); | 39 Suspend(); |
| 48 } | 40 } |
| 49 return; | 41 return; |
| 50 } | 42 } |
| 51 | 43 |
| 52 // If unblocking media, resume if media was not paused by user. | 44 // If unblocking media, resume if media was not paused by user. |
| 53 if (!paused_by_user_ && suspended_ && controllable_) { | 45 if (!paused_by_user_ && suspended_ && controllable_) { |
| 54 paused_by_user_ = true; | 46 paused_by_user_ = true; |
| 55 resume_cb_.Run(); | 47 Resume(); |
| 56 } | 48 } |
| 57 } | 49 } |
| 58 | 50 |
| 59 void CastMediaBlocker::MediaSessionStateChanged(bool is_controllable, | 51 void CastMediaBlocker::MediaSessionStateChanged(bool is_controllable, |
| 60 bool is_suspended) { | 52 bool is_suspended) { |
| 61 LOG(INFO) << __FUNCTION__ << " blocked=" << blocked_ | 53 LOG(INFO) << __FUNCTION__ << " blocked=" << blocked_ |
| 62 << " is_suspended=" << is_suspended | 54 << " is_suspended=" << is_suspended |
| 63 << " is_controllable=" << is_controllable | 55 << " is_controllable=" << is_controllable |
| 64 << " paused_by_user=" << paused_by_user_; | 56 << " paused_by_user=" << paused_by_user_; |
| 65 | 57 |
| 66 // Process controllability first. | 58 // Process controllability first. |
| 67 if (controllable_ != is_controllable) { | 59 if (controllable_ != is_controllable) { |
| 68 controllable_ = is_controllable; | 60 controllable_ = is_controllable; |
| 69 | 61 |
| 70 // If not blocked, and we regain control and the media wasn't paused when | 62 // If not blocked, and we regain control and the media wasn't paused when |
| 71 // blocked, resume media if suspended. | 63 // blocked, resume media if suspended. |
| 72 if (!blocked_ && !paused_by_user_ && is_suspended && controllable_) { | 64 if (!blocked_ && !paused_by_user_ && is_suspended && controllable_) { |
| 73 paused_by_user_ = true; | 65 paused_by_user_ = true; |
| 74 resume_cb_.Run(); | 66 Resume(); |
| 75 } | 67 } |
| 76 | 68 |
| 77 // Suspend if blocked and the session becomes controllable. | 69 // Suspend if blocked and the session becomes controllable. |
| 78 if (blocked_ && !is_suspended && controllable_) { | 70 if (blocked_ && !is_suspended && controllable_) { |
| 79 // Only suspend if suspended_ doesn't change. Otherwise, this will be | 71 // Only suspend if suspended_ doesn't change. Otherwise, this will be |
| 80 // handled in the suspended changed block. | 72 // handled in the suspended changed block. |
| 81 if (suspended_ == is_suspended) | 73 if (suspended_ == is_suspended) |
| 82 suspend_cb_.Run(); | 74 Suspend(); |
| 83 } | 75 } |
| 84 } | 76 } |
| 85 | 77 |
| 86 // Process suspended state next. | 78 // Process suspended state next. |
| 87 if (suspended_ != is_suspended) { | 79 if (suspended_ != is_suspended) { |
| 88 suspended_ = is_suspended; | 80 suspended_ = is_suspended; |
| 89 // If blocking, suspend media whenever possible. | 81 // If blocking, suspend media whenever possible. |
| 90 if (blocked_ && !suspended_) { | 82 if (blocked_ && !suspended_) { |
| 91 // If media was resumed when blocked, the user tried to play music. | 83 // If media was resumed when blocked, the user tried to play music. |
| 92 paused_by_user_ = false; | 84 paused_by_user_ = false; |
| 93 if (controllable_) | 85 if (controllable_) |
| 94 suspend_cb_.Run(); | 86 Suspend(); |
| 95 } | 87 } |
| 96 | 88 |
| 97 // If not blocking, cache the user's play intent. | 89 // If not blocking, cache the user's play intent. |
| 98 if (!blocked_) | 90 if (!blocked_) |
| 99 paused_by_user_ = suspended_; | 91 paused_by_user_ = suspended_; |
| 100 } | 92 } |
| 101 } | 93 } |
| 102 | 94 |
| 103 void CastMediaBlocker::Suspend() { | 95 void CastMediaBlocker::Suspend() { |
| 104 if (!web_contents()) | 96 if (!media_session()) |
| 105 return; | 97 return; |
| 106 | 98 |
| 107 LOG(INFO) << "Suspending media session."; | 99 LOG(INFO) << "Suspending media session."; |
| 108 web_contents()->SuspendMediaSession(); | 100 media_session()->Suspend(content::MediaSession::SuspendType::SYSTEM); |
| 109 } | 101 } |
| 110 | 102 |
| 111 void CastMediaBlocker::Resume() { | 103 void CastMediaBlocker::Resume() { |
| 112 if (!web_contents()) | 104 if (!media_session()) |
| 113 return; | 105 return; |
| 114 | 106 |
| 115 LOG(INFO) << "Resuming media session."; | 107 LOG(INFO) << "Resuming media session."; |
| 116 web_contents()->ResumeMediaSession(); | 108 media_session()->Resume(content::MediaSession::SuspendType::SYSTEM); |
| 117 } | 109 } |
| 118 | 110 |
| 119 } // namespace shell | 111 } // namespace shell |
| 120 } // namespace chromecast | 112 } // namespace chromecast |
| OLD | NEW |