Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(302)

Side by Side Diff: chromecast/browser/cast_media_blocker.cc

Issue 2450433002: Let CastMediaBlocker observe MediaSession instead of WebContents (Closed)
Patch Set: addressed comments Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698