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

Side by Side Diff: chrome/browser/media/android/router/media_router_android.cc

Issue 2788783002: [Cast,Android] Handle some PresentationAPI edge cases (Closed)
Patch Set: Fixed the unittests Created 3 years, 8 months 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "chrome/browser/media/android/router/media_router_android.h" 5 #include "chrome/browser/media/android/router/media_router_android.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 #include <vector>
10 9
11 #include "base/android/jni_android.h"
12 #include "base/android/jni_array.h"
13 #include "base/android/jni_string.h"
14 #include "base/guid.h" 10 #include "base/guid.h"
15 #include "base/logging.h" 11 #include "base/logging.h"
16 #include "base/memory/ptr_util.h" 12 #include "base/memory/ptr_util.h"
17 #include "chrome/browser/android/tab_android.h" 13 #include "chrome/browser/android/tab_android.h"
18 #include "chrome/browser/media/router/media_routes_observer.h" 14 #include "chrome/browser/media/router/media_routes_observer.h"
19 #include "chrome/browser/media/router/media_sinks_observer.h" 15 #include "chrome/browser/media/router/media_sinks_observer.h"
20 #include "chrome/browser/media/router/route_message.h" 16 #include "chrome/browser/media/router/route_message.h"
21 #include "chrome/browser/media/router/route_message_observer.h" 17 #include "chrome/browser/media/router/route_message_observer.h"
22 #include "chrome/browser/media/router/route_request_result.h" 18 #include "chrome/browser/media/router/route_request_result.h"
23 #include "content/public/browser/browser_context.h" 19 #include "content/public/browser/browser_context.h"
24 #include "jni/ChromeMediaRouter_jni.h"
25 #include "url/gurl.h" 20 #include "url/gurl.h"
26 21
27 using base::android::ConvertUTF8ToJavaString;
28 using base::android::ConvertJavaStringToUTF8;
29 using base::android::JavaParamRef;
30 using base::android::ScopedJavaLocalRef;
31 using base::android::AttachCurrentThread;
32
33 namespace media_router { 22 namespace media_router {
34 23
35 MediaRouterAndroid::MediaRouteRequest::MediaRouteRequest( 24 MediaRouterAndroid::MediaRouteRequest::MediaRouteRequest(
36 const MediaSource& source, 25 const MediaSource& source,
37 const std::string& presentation_id, 26 const std::string& presentation_id,
38 const std::vector<MediaRouteResponseCallback>& callbacks) 27 const std::vector<MediaRouteResponseCallback>& callbacks)
39 : media_source(source), 28 : media_source(source),
40 presentation_id(presentation_id), 29 presentation_id(presentation_id),
41 callbacks(callbacks) {} 30 callbacks(callbacks) {}
42 31
43 MediaRouterAndroid::MediaRouteRequest::~MediaRouteRequest() {} 32 MediaRouterAndroid::MediaRouteRequest::~MediaRouteRequest() {}
44 33
45 34 MediaRouterAndroid::MediaRouterAndroid(content::BrowserContext*)
46 MediaRouterAndroid::MediaRouterAndroid(content::BrowserContext*) { 35 : bridge_(new MediaRouterAndroidBridge(this)) {}
47 JNIEnv* env = base::android::AttachCurrentThread();
48 java_media_router_.Reset(
49 Java_ChromeMediaRouter_create(env, reinterpret_cast<jlong>(this)));
50 }
51 36
52 MediaRouterAndroid::~MediaRouterAndroid() { 37 MediaRouterAndroid::~MediaRouterAndroid() {
53 } 38 }
54 39
55 // static
56 bool MediaRouterAndroid::Register(JNIEnv* env) {
57 bool ret = RegisterNativesImpl(env);
58 DCHECK(g_ChromeMediaRouter_clazz);
59 return ret;
60 }
61
62 const MediaRoute* MediaRouterAndroid::FindRouteBySource( 40 const MediaRoute* MediaRouterAndroid::FindRouteBySource(
63 const MediaSource::Id& source_id) const { 41 const MediaSource::Id& source_id) const {
64 for (const auto& route : active_routes_) { 42 for (const auto& route : active_routes_) {
65 if (route.media_source().id() == source_id) 43 if (route.media_source().id() == source_id)
66 return &route; 44 return &route;
67 } 45 }
68 return nullptr; 46 return nullptr;
69 } 47 }
70 48
71 void MediaRouterAndroid::CreateRoute( 49 void MediaRouterAndroid::CreateRoute(
(...skipping 12 matching lines...) Expand all
84 ? TabAndroid::FromWebContents(web_contents) : nullptr; 62 ? TabAndroid::FromWebContents(web_contents) : nullptr;
85 if (tab) 63 if (tab)
86 tab_id = tab->GetAndroidId(); 64 tab_id = tab->GetAndroidId();
87 65
88 bool is_incognito = web_contents 66 bool is_incognito = web_contents
89 && web_contents->GetBrowserContext()->IsOffTheRecord(); 67 && web_contents->GetBrowserContext()->IsOffTheRecord();
90 68
91 int route_request_id = 69 int route_request_id =
92 route_requests_.Add(base::MakeUnique<MediaRouteRequest>( 70 route_requests_.Add(base::MakeUnique<MediaRouteRequest>(
93 MediaSource(source_id), presentation_id, callbacks)); 71 MediaSource(source_id), presentation_id, callbacks));
94 72 bridge_->CreateRoute(source_id, sink_id, presentation_id, origin, tab_id,
95 JNIEnv* env = base::android::AttachCurrentThread(); 73 is_incognito, route_request_id);
96 ScopedJavaLocalRef<jstring> jsource_id =
97 base::android::ConvertUTF8ToJavaString(env, source_id);
98 ScopedJavaLocalRef<jstring> jsink_id =
99 base::android::ConvertUTF8ToJavaString(env, sink_id);
100 ScopedJavaLocalRef<jstring> jpresentation_id =
101 base::android::ConvertUTF8ToJavaString(env, presentation_id);
102 // TODO(crbug.com/685358): Unique origins should not be considered
103 // same-origin.
104 ScopedJavaLocalRef<jstring> jorigin =
105 base::android::ConvertUTF8ToJavaString(env, origin.GetURL().spec());
106
107 Java_ChromeMediaRouter_createRoute(env, java_media_router_, jsource_id,
108 jsink_id, jpresentation_id, jorigin,
109 tab_id, is_incognito, route_request_id);
110 } 74 }
111 75
112 void MediaRouterAndroid::ConnectRouteByRouteId( 76 void MediaRouterAndroid::ConnectRouteByRouteId(
113 const MediaSource::Id& source, 77 const MediaSource::Id& source,
114 const MediaRoute::Id& route_id, 78 const MediaRoute::Id& route_id,
115 const url::Origin& origin, 79 const url::Origin& origin,
116 content::WebContents* web_contents, 80 content::WebContents* web_contents,
117 const std::vector<MediaRouteResponseCallback>& callbacks, 81 const std::vector<MediaRouteResponseCallback>& callbacks,
118 base::TimeDelta timeout, 82 base::TimeDelta timeout,
119 bool incognito) { 83 bool incognito) {
(...skipping 13 matching lines...) Expand all
133 TabAndroid* tab = web_contents 97 TabAndroid* tab = web_contents
134 ? TabAndroid::FromWebContents(web_contents) : nullptr; 98 ? TabAndroid::FromWebContents(web_contents) : nullptr;
135 if (tab) 99 if (tab)
136 tab_id = tab->GetAndroidId(); 100 tab_id = tab->GetAndroidId();
137 101
138 DVLOG(2) << "JoinRoute: " << source_id << ", " << presentation_id << ", " 102 DVLOG(2) << "JoinRoute: " << source_id << ", " << presentation_id << ", "
139 << origin.GetURL().spec() << ", " << tab_id; 103 << origin.GetURL().spec() << ", " << tab_id;
140 104
141 int request_id = route_requests_.Add(base::MakeUnique<MediaRouteRequest>( 105 int request_id = route_requests_.Add(base::MakeUnique<MediaRouteRequest>(
142 MediaSource(source_id), presentation_id, callbacks)); 106 MediaSource(source_id), presentation_id, callbacks));
143 107 bridge_->JoinRoute(source_id, presentation_id, origin, tab_id, request_id);
144 JNIEnv* env = base::android::AttachCurrentThread();
145 ScopedJavaLocalRef<jstring> jsource_id =
146 base::android::ConvertUTF8ToJavaString(env, source_id);
147 ScopedJavaLocalRef<jstring> jpresentation_id =
148 base::android::ConvertUTF8ToJavaString(env, presentation_id);
149 ScopedJavaLocalRef<jstring> jorigin =
150 base::android::ConvertUTF8ToJavaString(env, origin.GetURL().spec());
151
152 Java_ChromeMediaRouter_joinRoute(env, java_media_router_, jsource_id,
153 jpresentation_id, jorigin, tab_id,
154 request_id);
155 } 108 }
156 109
157 void MediaRouterAndroid::TerminateRoute(const MediaRoute::Id& route_id) { 110 void MediaRouterAndroid::TerminateRoute(const MediaRoute::Id& route_id) {
158 JNIEnv* env = base::android::AttachCurrentThread(); 111 bridge_->TerminateRoute(route_id);
159 ScopedJavaLocalRef<jstring> jroute_id =
160 base::android::ConvertUTF8ToJavaString(env, route_id);
161 Java_ChromeMediaRouter_closeRoute(env, java_media_router_, jroute_id);
162 } 112 }
163 113
164 void MediaRouterAndroid::SendRouteMessage( 114 void MediaRouterAndroid::SendRouteMessage(
165 const MediaRoute::Id& route_id, 115 const MediaRoute::Id& route_id,
166 const std::string& message, 116 const std::string& message,
167 const SendRouteMessageCallback& callback) { 117 const SendRouteMessageCallback& callback) {
168 int callback_id = message_callbacks_.Add( 118 int callback_id = message_callbacks_.Add(
169 base::MakeUnique<SendRouteMessageCallback>(callback)); 119 base::MakeUnique<SendRouteMessageCallback>(callback));
170 JNIEnv* env = base::android::AttachCurrentThread(); 120 bridge_->SendRouteMessage(route_id, message, callback_id);
171 ScopedJavaLocalRef<jstring> jroute_id =
172 base::android::ConvertUTF8ToJavaString(env, route_id);
173 ScopedJavaLocalRef<jstring> jmessage =
174 base::android::ConvertUTF8ToJavaString(env, message);
175 Java_ChromeMediaRouter_sendStringMessage(env, java_media_router_, jroute_id,
176 jmessage, callback_id);
177 } 121 }
178 122
179 void MediaRouterAndroid::SendRouteBinaryMessage( 123 void MediaRouterAndroid::SendRouteBinaryMessage(
180 const MediaRoute::Id& route_id, 124 const MediaRoute::Id& route_id,
181 std::unique_ptr<std::vector<uint8_t>> data, 125 std::unique_ptr<std::vector<uint8_t>> data,
182 const SendRouteMessageCallback& callback) { 126 const SendRouteMessageCallback& callback) {
183 // Binary messaging is not supported on Android. 127 // Binary messaging is not supported on Android.
184 callback.Run(false); 128 callback.Run(false);
185 } 129 }
186 130
(...skipping 17 matching lines...) Expand all
204 NOTIMPLEMENTED(); 148 NOTIMPLEMENTED();
205 } 149 }
206 150
207 void MediaRouterAndroid::ProvideSinks( 151 void MediaRouterAndroid::ProvideSinks(
208 const std::string& provider_name, 152 const std::string& provider_name,
209 const std::vector<MediaSinkInternal>& sinks) { 153 const std::vector<MediaSinkInternal>& sinks) {
210 NOTIMPLEMENTED(); 154 NOTIMPLEMENTED();
211 } 155 }
212 156
213 void MediaRouterAndroid::DetachRoute(const MediaRoute::Id& route_id) { 157 void MediaRouterAndroid::DetachRoute(const MediaRoute::Id& route_id) {
214 JNIEnv* env = base::android::AttachCurrentThread(); 158 bridge_->DetachRoute(route_id);
215 ScopedJavaLocalRef<jstring> jroute_id = 159 RemoveRoute(route_id);
216 base::android::ConvertUTF8ToJavaString(env, route_id); 160 NotifyPresentationConnectionClose(
217 Java_ChromeMediaRouter_detachRoute(env, java_media_router_, jroute_id); 161 route_id, content::PRESENTATION_CONNECTION_CLOSE_REASON_CLOSED,
162 "Remove route");
218 } 163 }
219 164
220 bool MediaRouterAndroid::RegisterMediaSinksObserver( 165 bool MediaRouterAndroid::RegisterMediaSinksObserver(
221 MediaSinksObserver* observer) { 166 MediaSinksObserver* observer) {
222 const std::string& source_id = observer->source().id(); 167 const std::string& source_id = observer->source().id();
223 auto& observer_list = sinks_observers_[source_id]; 168 auto& observer_list = sinks_observers_[source_id];
224 if (!observer_list) { 169 if (!observer_list) {
225 observer_list = base::MakeUnique<base::ObserverList<MediaSinksObserver>>(); 170 observer_list = base::MakeUnique<base::ObserverList<MediaSinksObserver>>();
226 } else { 171 } else {
227 DCHECK(!observer_list->HasObserver(observer)); 172 DCHECK(!observer_list->HasObserver(observer));
228 } 173 }
229 174
230 observer_list->AddObserver(observer); 175 observer_list->AddObserver(observer);
231 JNIEnv* env = base::android::AttachCurrentThread(); 176 return bridge_->StartObservingMediaSinks(source_id);
232 ScopedJavaLocalRef<jstring> jsource_id =
233 base::android::ConvertUTF8ToJavaString(env, source_id);
234 return Java_ChromeMediaRouter_startObservingMediaSinks(
235 env, java_media_router_, jsource_id);
236 } 177 }
237 178
238 void MediaRouterAndroid::UnregisterMediaSinksObserver( 179 void MediaRouterAndroid::UnregisterMediaSinksObserver(
239 MediaSinksObserver* observer) { 180 MediaSinksObserver* observer) {
240 const std::string& source_id = observer->source().id(); 181 const std::string& source_id = observer->source().id();
241 auto it = sinks_observers_.find(source_id); 182 auto it = sinks_observers_.find(source_id);
242 if (it == sinks_observers_.end() || !it->second->HasObserver(observer)) 183 if (it == sinks_observers_.end() || !it->second->HasObserver(observer))
243 return; 184 return;
244 185
245 // If we are removing the final observer for the source, then stop 186 // If we are removing the final observer for the source, then stop
246 // observing sinks for it. 187 // observing sinks for it.
247 // might_have_observers() is reliable here on the assumption that this call 188 // might_have_observers() is reliable here on the assumption that this call
248 // is not inside the ObserverList iteration. 189 // is not inside the ObserverList iteration.
249 it->second->RemoveObserver(observer); 190 it->second->RemoveObserver(observer);
250 if (!it->second->might_have_observers()) { 191 if (!it->second->might_have_observers()) {
251 sinks_observers_.erase(source_id); 192 sinks_observers_.erase(source_id);
252 JNIEnv* env = base::android::AttachCurrentThread(); 193 bridge_->StopObservingMediaSinks(source_id);
253 ScopedJavaLocalRef<jstring> jsource_id =
254 base::android::ConvertUTF8ToJavaString(env, source_id);
255 Java_ChromeMediaRouter_stopObservingMediaSinks(env, java_media_router_,
256 jsource_id);
257 } 194 }
258 } 195 }
259 196
260 void MediaRouterAndroid::RegisterMediaRoutesObserver( 197 void MediaRouterAndroid::RegisterMediaRoutesObserver(
261 MediaRoutesObserver* observer) { 198 MediaRoutesObserver* observer) {
262 DVLOG(2) << "Added MediaRoutesObserver: " << observer; 199 DVLOG(2) << "Added MediaRoutesObserver: " << observer;
263 if (!observer->source_id().empty()) 200 if (!observer->source_id().empty())
264 NOTIMPLEMENTED() << "Joinable routes query not implemented."; 201 NOTIMPLEMENTED() << "Joinable routes query not implemented.";
265 202
266 routes_observers_.AddObserver(observer); 203 routes_observers_.AddObserver(observer);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 RouteMessageObserver* observer) { 236 RouteMessageObserver* observer) {
300 const MediaRoute::Id& route_id = observer->route_id(); 237 const MediaRoute::Id& route_id = observer->route_id();
301 auto* observer_list = message_observers_[route_id].get(); 238 auto* observer_list = message_observers_[route_id].get();
302 DCHECK(observer_list->HasObserver(observer)); 239 DCHECK(observer_list->HasObserver(observer));
303 240
304 observer_list->RemoveObserver(observer); 241 observer_list->RemoveObserver(observer);
305 if (!observer_list->might_have_observers()) 242 if (!observer_list->might_have_observers())
306 message_observers_.erase(route_id); 243 message_observers_.erase(route_id);
307 } 244 }
308 245
309 void MediaRouterAndroid::OnSinksReceived( 246 void MediaRouterAndroid::OnSinksReceived(const std::string& source_urn,
310 JNIEnv* env, 247 const std::vector<MediaSink>& sinks) {
311 const JavaParamRef<jobject>& obj,
312 const JavaParamRef<jstring>& jsource_urn,
313 jint jcount) {
314 std::vector<MediaSink> sinks_converted;
315 sinks_converted.reserve(jcount);
316 for (int i = 0; i < jcount; ++i) {
317 ScopedJavaLocalRef<jstring> jsink_urn = Java_ChromeMediaRouter_getSinkUrn(
318 env, java_media_router_, jsource_urn, i);
319 ScopedJavaLocalRef<jstring> jsink_name = Java_ChromeMediaRouter_getSinkName(
320 env, java_media_router_, jsource_urn, i);
321 sinks_converted.push_back(
322 MediaSink(ConvertJavaStringToUTF8(env, jsink_urn.obj()),
323 ConvertJavaStringToUTF8(env, jsink_name.obj()),
324 MediaSink::GENERIC));
325 }
326
327 std::string source_urn = ConvertJavaStringToUTF8(env, jsource_urn);
328 auto it = sinks_observers_.find(source_urn); 248 auto it = sinks_observers_.find(source_urn);
329 if (it != sinks_observers_.end()) { 249 if (it != sinks_observers_.end()) {
330 // TODO(imcheng): Pass origins to OnSinksUpdated (crbug.com/594858). 250 // TODO(imcheng): Pass origins to OnSinksUpdated (crbug.com/594858).
331 for (auto& observer : *it->second) 251 for (auto& observer : *it->second)
332 observer.OnSinksUpdated(sinks_converted, std::vector<url::Origin>()); 252 observer.OnSinksUpdated(sinks, std::vector<url::Origin>());
333 } 253 }
334 } 254 }
335 255
336 void MediaRouterAndroid::OnRouteCreated( 256 void MediaRouterAndroid::OnRouteCreated(const MediaRoute::Id& route_id,
337 JNIEnv* env, 257 const MediaSink::Id& sink_id,
338 const JavaParamRef<jobject>& obj, 258 int route_request_id,
339 const JavaParamRef<jstring>& jmedia_route_id, 259 bool is_local) {
340 const JavaParamRef<jstring>& jsink_id, 260 MediaRouteRequest* request = route_requests_.Lookup(route_request_id);
341 jint jroute_request_id,
342 jboolean jis_local) {
343 MediaRouteRequest* request = route_requests_.Lookup(jroute_request_id);
344 if (!request) 261 if (!request)
345 return; 262 return;
346 263
347 MediaRoute route(ConvertJavaStringToUTF8(env, jmedia_route_id), 264 MediaRoute route(route_id, request->media_source, sink_id, std::string(),
348 request->media_source, 265 is_local, std::string(),
349 ConvertJavaStringToUTF8(env, jsink_id), std::string(),
350 jis_local, std::string(),
351 true); // TODO(avayvod): Populate for_display. 266 true); // TODO(avayvod): Populate for_display.
352 267
353 std::unique_ptr<RouteRequestResult> result = 268 std::unique_ptr<RouteRequestResult> result =
354 RouteRequestResult::FromSuccess(route, request->presentation_id); 269 RouteRequestResult::FromSuccess(route, request->presentation_id);
355 for (const MediaRouteResponseCallback& callback : request->callbacks) 270 for (const MediaRouteResponseCallback& callback : request->callbacks)
356 callback.Run(*result); 271 callback.Run(*result);
357 272
358 route_requests_.Remove(jroute_request_id); 273 route_requests_.Remove(route_request_id);
359 274
360 active_routes_.push_back(route); 275 active_routes_.push_back(route);
361 for (auto& observer : routes_observers_) 276 for (auto& observer : routes_observers_)
362 observer.OnRoutesUpdated(active_routes_, std::vector<MediaRoute::Id>()); 277 observer.OnRoutesUpdated(active_routes_, std::vector<MediaRoute::Id>());
363 } 278 }
364 279
365 void MediaRouterAndroid::OnRouteRequestError( 280 void MediaRouterAndroid::OnRouteRequestError(const std::string& error_text,
366 JNIEnv* env, 281 int route_request_id) {
367 const JavaParamRef<jobject>& obj, 282 MediaRouteRequest* request = route_requests_.Lookup(route_request_id);
368 const JavaParamRef<jstring>& jerror_text,
369 jint jroute_request_id) {
370 MediaRouteRequest* request = route_requests_.Lookup(jroute_request_id);
371 if (!request) 283 if (!request)
372 return; 284 return;
373 285
374 // TODO(imcheng): Provide a more specific result code. 286 // TODO(imcheng): Provide a more specific result code.
375 std::unique_ptr<RouteRequestResult> result = 287 std::unique_ptr<RouteRequestResult> result = RouteRequestResult::FromError(
376 RouteRequestResult::FromError(ConvertJavaStringToUTF8(env, jerror_text), 288 error_text, RouteRequestResult::UNKNOWN_ERROR);
377 RouteRequestResult::UNKNOWN_ERROR);
378 for (const MediaRouteResponseCallback& callback : request->callbacks) 289 for (const MediaRouteResponseCallback& callback : request->callbacks)
379 callback.Run(*result); 290 callback.Run(*result);
380 291
381 route_requests_.Remove(jroute_request_id); 292 route_requests_.Remove(route_request_id);
382 } 293 }
383 294
384 void MediaRouterAndroid::OnRouteClosed( 295 void MediaRouterAndroid::OnRouteClosed(const MediaRoute::Id& route_id) {
385 JNIEnv* env, 296 RemoveRoute(route_id);
386 const JavaParamRef<jobject>& obj, 297 NotifyPresentationConnectionStateChange(
387 const JavaParamRef<jstring>& jmedia_route_id) { 298 route_id, content::PRESENTATION_CONNECTION_STATE_TERMINATED);
388 MediaRoute::Id route_id = ConvertJavaStringToUTF8(env, jmedia_route_id); 299 }
300
301 void MediaRouterAndroid::OnRouteClosedWithError(const MediaRoute::Id& route_id,
302 const std::string& message) {
303 RemoveRoute(route_id);
304 NotifyPresentationConnectionClose(
305 route_id,
306 content::PRESENTATION_CONNECTION_CLOSE_REASON_CONNECTION_ERROR,
307 message);
308 }
309
310 void MediaRouterAndroid::OnMessageSentResult(bool success, int callback_id) {
311 SendRouteMessageCallback* callback = message_callbacks_.Lookup(callback_id);
312 callback->Run(success);
313 message_callbacks_.Remove(callback_id);
314 }
315
316 void MediaRouterAndroid::OnMessage(const MediaRoute::Id& route_id,
317 const std::string& message) {
318 auto it = message_observers_.find(route_id);
319 if (it == message_observers_.end())
320 return;
321
322 std::vector<RouteMessage> messages(1);
323 messages.front().type = RouteMessage::TEXT;
324 messages.front().text = message;
325 for (auto& observer : *it->second.get())
326 observer.OnMessagesReceived(messages);
327 }
328
329 void MediaRouterAndroid::RemoveRoute(const MediaRoute::Id& route_id) {
389 for (auto it = active_routes_.begin(); it != active_routes_.end(); ++it) 330 for (auto it = active_routes_.begin(); it != active_routes_.end(); ++it)
390 if (it->media_route_id() == route_id) { 331 if (it->media_route_id() == route_id) {
391 active_routes_.erase(it); 332 active_routes_.erase(it);
392 break; 333 break;
393 } 334 }
394 335
395 for (auto& observer : routes_observers_) 336 for (auto& observer : routes_observers_)
396 observer.OnRoutesUpdated(active_routes_, std::vector<MediaRoute::Id>()); 337 observer.OnRoutesUpdated(active_routes_, std::vector<MediaRoute::Id>());
397 NotifyPresentationConnectionStateChange(
398 route_id, content::PRESENTATION_CONNECTION_STATE_TERMINATED);
399 }
400
401 void MediaRouterAndroid::OnRouteClosedWithError(
402 JNIEnv* env,
403 const JavaParamRef<jobject>& obj,
404 const JavaParamRef<jstring>& jmedia_route_id,
405 const JavaParamRef<jstring>& jmessage) {
406 MediaRoute::Id route_id = ConvertJavaStringToUTF8(env, jmedia_route_id);
407 std::string message = ConvertJavaStringToUTF8(env, jmessage);
408 NotifyPresentationConnectionClose(
409 route_id,
410 content::PRESENTATION_CONNECTION_CLOSE_REASON_CONNECTION_ERROR,
411 message);
412
413 OnRouteClosed(env, obj, jmedia_route_id);
414 }
415
416 void MediaRouterAndroid::OnMessageSentResult(JNIEnv* env,
417 const JavaParamRef<jobject>& obj,
418 jboolean jsuccess,
419 jint jcallback_id) {
420 SendRouteMessageCallback* callback = message_callbacks_.Lookup(jcallback_id);
421 callback->Run(jsuccess);
422 message_callbacks_.Remove(jcallback_id);
423 }
424
425 // Notifies the media router about a message received from the media route.
426 void MediaRouterAndroid::OnMessage(JNIEnv* env,
427 const JavaParamRef<jobject>& obj,
428 const JavaParamRef<jstring>& jmedia_route_id,
429 const JavaParamRef<jstring>& jmessage) {
430 MediaRoute::Id route_id = ConvertJavaStringToUTF8(env, jmedia_route_id);
431 auto it = message_observers_.find(route_id);
432 if (it == message_observers_.end())
433 return;
434
435 std::vector<RouteMessage> messages(1);
436 messages.front().type = RouteMessage::TEXT;
437 messages.front().text = ConvertJavaStringToUTF8(env, jmessage);
438 for (auto& observer : *it->second.get())
439 observer.OnMessagesReceived(messages);
440 } 338 }
441 339
442 } // namespace media_router 340 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698