| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/remote/remote_media_player_bridge.h" | 5 #include "chrome/browser/media/android/remote/remote_media_player_bridge.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/android/jni_android.h" | 9 #include "base/android/jni_android.h" |
| 10 #include "base/android/jni_string.h" | 10 #include "base/android/jni_string.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 manager->GetLocalPlayer(player_id)->frame_url()), | 51 manager->GetLocalPlayer(player_id)->frame_url()), |
| 52 width_(0), | 52 width_(0), |
| 53 height_(0), | 53 height_(0), |
| 54 url_(manager->GetLocalPlayer(player_id)->GetUrl()), | 54 url_(manager->GetLocalPlayer(player_id)->GetUrl()), |
| 55 first_party_for_cookies_( | 55 first_party_for_cookies_( |
| 56 manager->GetLocalPlayer(player_id)->GetFirstPartyForCookies()), | 56 manager->GetLocalPlayer(player_id)->GetFirstPartyForCookies()), |
| 57 user_agent_(user_agent), | 57 user_agent_(user_agent), |
| 58 weak_factory_(this) { | 58 weak_factory_(this) { |
| 59 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 59 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 60 JNIEnv* env = base::android::AttachCurrentThread(); | 60 JNIEnv* env = base::android::AttachCurrentThread(); |
| 61 CHECK(env); | 61 DCHECK(env); |
| 62 ScopedJavaLocalRef<jstring> j_url_string; | 62 ScopedJavaLocalRef<jstring> j_url_string; |
| 63 if (url_.is_valid()) { | 63 if (url_.is_valid()) { |
| 64 // Escape the URL to make it safe to use. Don't escape existing escape | 64 // Escape the URL to make it safe to use. Don't escape existing escape |
| 65 // sequences though. | 65 // sequences though. |
| 66 std::string escaped_url = net::EscapeExternalHandlerValue(url_.spec()); | 66 std::string escaped_url = net::EscapeExternalHandlerValue(url_.spec()); |
| 67 // Create a Java String for the URL. | 67 // Create a Java String for the URL. |
| 68 j_url_string = ConvertUTF8ToJavaString(env, escaped_url); | 68 j_url_string = ConvertUTF8ToJavaString(env, escaped_url); |
| 69 } | 69 } |
| 70 ScopedJavaLocalRef<jstring> j_frame_url_string; | 70 ScopedJavaLocalRef<jstring> j_frame_url_string; |
| 71 GURL frameUrl = GetLocalPlayer()->frame_url(); | 71 GURL frameUrl = GetLocalPlayer()->frame_url(); |
| 72 if (frameUrl.is_valid()) { | 72 if (frameUrl.is_valid()) { |
| 73 // Create a Java String for the URL. | 73 // Create a Java String for the URL. |
| 74 j_frame_url_string = ConvertUTF8ToJavaString(env, frameUrl.spec()); | 74 j_frame_url_string = ConvertUTF8ToJavaString(env, frameUrl.spec()); |
| 75 } | 75 } |
| 76 java_bridge_.Reset(Java_RemoteMediaPlayerBridge_create( | 76 java_bridge_.Reset(Java_RemoteMediaPlayerBridge_create( |
| 77 env, reinterpret_cast<intptr_t>(this), j_url_string, j_frame_url_string, | 77 env, reinterpret_cast<intptr_t>(this), j_url_string, j_frame_url_string, |
| 78 ConvertUTF8ToJavaString(env, user_agent))); | 78 ConvertUTF8ToJavaString(env, user_agent))); |
| 79 } | 79 } |
| 80 | 80 |
| 81 RemoteMediaPlayerBridge::~RemoteMediaPlayerBridge() { | 81 RemoteMediaPlayerBridge::~RemoteMediaPlayerBridge() { |
| 82 JNIEnv* env = base::android::AttachCurrentThread(); | 82 JNIEnv* env = base::android::AttachCurrentThread(); |
| 83 CHECK(env); | 83 DCHECK(env); |
| 84 Java_RemoteMediaPlayerBridge_destroy(env, java_bridge_); | 84 Java_RemoteMediaPlayerBridge_destroy(env, java_bridge_); |
| 85 Release(); | 85 Release(); |
| 86 } | 86 } |
| 87 | 87 |
| 88 bool RemoteMediaPlayerBridge::HasVideo() const { | 88 bool RemoteMediaPlayerBridge::HasVideo() const { |
| 89 NOTIMPLEMENTED(); | 89 NOTIMPLEMENTED(); |
| 90 return true; | 90 return true; |
| 91 } | 91 } |
| 92 | 92 |
| 93 bool RemoteMediaPlayerBridge::HasAudio() const { | 93 bool RemoteMediaPlayerBridge::HasAudio() const { |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 DCHECK(g_RemoteMediaPlayerBridge_clazz); | 255 DCHECK(g_RemoteMediaPlayerBridge_clazz); |
| 256 return ret; | 256 return ret; |
| 257 } | 257 } |
| 258 | 258 |
| 259 void RemoteMediaPlayerBridge::RequestRemotePlayback() { | 259 void RemoteMediaPlayerBridge::RequestRemotePlayback() { |
| 260 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 260 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 261 MediaPlayerAndroid* local_player = GetLocalPlayer(); | 261 MediaPlayerAndroid* local_player = GetLocalPlayer(); |
| 262 if (!local_player) | 262 if (!local_player) |
| 263 return; | 263 return; |
| 264 JNIEnv* env = AttachCurrentThread(); | 264 JNIEnv* env = AttachCurrentThread(); |
| 265 CHECK(env); | 265 DCHECK(env); |
| 266 | 266 |
| 267 Java_RemoteMediaPlayerBridge_requestRemotePlayback( | 267 Java_RemoteMediaPlayerBridge_requestRemotePlayback( |
| 268 env, java_bridge_, local_player->GetCurrentTime().InMilliseconds()); | 268 env, java_bridge_, local_player->GetCurrentTime().InMilliseconds()); |
| 269 } | 269 } |
| 270 | 270 |
| 271 void RemoteMediaPlayerBridge::RequestRemotePlaybackControl() { | 271 void RemoteMediaPlayerBridge::RequestRemotePlaybackControl() { |
| 272 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 272 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 273 JNIEnv* env = AttachCurrentThread(); | 273 JNIEnv* env = AttachCurrentThread(); |
| 274 CHECK(env); | 274 DCHECK(env); |
| 275 | 275 |
| 276 Java_RemoteMediaPlayerBridge_requestRemotePlaybackControl(env, java_bridge_); | 276 Java_RemoteMediaPlayerBridge_requestRemotePlaybackControl(env, java_bridge_); |
| 277 } | 277 } |
| 278 | 278 |
| 279 void RemoteMediaPlayerBridge::RequestRemotePlaybackStop() { |
| 280 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 281 JNIEnv* env = AttachCurrentThread(); |
| 282 DCHECK(env); |
| 283 |
| 284 Java_RemoteMediaPlayerBridge_requestRemotePlaybackStop(env, java_bridge_); |
| 285 } |
| 286 |
| 279 void RemoteMediaPlayerBridge::SetNativePlayer() { | 287 void RemoteMediaPlayerBridge::SetNativePlayer() { |
| 280 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 288 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 281 JNIEnv* env = AttachCurrentThread(); | 289 JNIEnv* env = AttachCurrentThread(); |
| 282 CHECK(env); | 290 DCHECK(env); |
| 283 | 291 |
| 284 Java_RemoteMediaPlayerBridge_setNativePlayer(env, java_bridge_); | 292 Java_RemoteMediaPlayerBridge_setNativePlayer(env, java_bridge_); |
| 285 } | 293 } |
| 286 | 294 |
| 287 void RemoteMediaPlayerBridge::OnPlayerCreated() { | 295 void RemoteMediaPlayerBridge::OnPlayerCreated() { |
| 288 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 296 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 289 JNIEnv* env = AttachCurrentThread(); | 297 JNIEnv* env = AttachCurrentThread(); |
| 290 CHECK(env); | 298 DCHECK(env); |
| 291 | 299 |
| 292 Java_RemoteMediaPlayerBridge_onPlayerCreated(env, java_bridge_); | 300 Java_RemoteMediaPlayerBridge_onPlayerCreated(env, java_bridge_); |
| 293 } | 301 } |
| 294 | 302 |
| 295 void RemoteMediaPlayerBridge::OnPlayerDestroyed() { | 303 void RemoteMediaPlayerBridge::OnPlayerDestroyed() { |
| 296 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 304 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 297 JNIEnv* env = AttachCurrentThread(); | 305 JNIEnv* env = AttachCurrentThread(); |
| 298 CHECK(env); | 306 DCHECK(env); |
| 299 | 307 |
| 300 Java_RemoteMediaPlayerBridge_onPlayerDestroyed(env, java_bridge_); | 308 Java_RemoteMediaPlayerBridge_onPlayerDestroyed(env, java_bridge_); |
| 301 } | 309 } |
| 302 | 310 |
| 303 std::string RemoteMediaPlayerBridge::GetCastingMessage() { | 311 std::string RemoteMediaPlayerBridge::GetCastingMessage() { |
| 304 return casting_message_ ? | 312 return casting_message_ ? |
| 305 *casting_message_ : std::string(); | 313 *casting_message_ : std::string(); |
| 306 } | 314 } |
| 307 | 315 |
| 308 void RemoteMediaPlayerBridge::SetPosterBitmap( | 316 void RemoteMediaPlayerBridge::SetPosterBitmap( |
| 309 const std::vector<SkBitmap>& bitmaps) { | 317 const std::vector<SkBitmap>& bitmaps) { |
| 310 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 318 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 311 JNIEnv* env = AttachCurrentThread(); | 319 JNIEnv* env = AttachCurrentThread(); |
| 312 CHECK(env); | 320 DCHECK(env); |
| 313 | 321 |
| 314 if (bitmaps.empty()) { | 322 if (bitmaps.empty()) { |
| 315 Java_RemoteMediaPlayerBridge_setPosterBitmap(env, java_bridge_, nullptr); | 323 Java_RemoteMediaPlayerBridge_setPosterBitmap(env, java_bridge_, nullptr); |
| 316 } else { | 324 } else { |
| 317 ScopedJavaLocalRef<jobject> j_poster_bitmap; | 325 ScopedJavaLocalRef<jobject> j_poster_bitmap; |
| 318 j_poster_bitmap = gfx::ConvertToJavaBitmap(&(bitmaps[0])); | 326 j_poster_bitmap = gfx::ConvertToJavaBitmap(&(bitmaps[0])); |
| 319 | 327 |
| 320 Java_RemoteMediaPlayerBridge_setPosterBitmap(env, java_bridge_, | 328 Java_RemoteMediaPlayerBridge_setPosterBitmap(env, java_bridge_, |
| 321 j_poster_bitmap); | 329 j_poster_bitmap); |
| 322 } | 330 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 335 time = duration; | 343 time = duration; |
| 336 | 344 |
| 337 // Seeking to an invalid position may cause media player to stuck in an | 345 // Seeking to an invalid position may cause media player to stuck in an |
| 338 // error state. | 346 // error state. |
| 339 if (time < base::TimeDelta()) { | 347 if (time < base::TimeDelta()) { |
| 340 DCHECK_EQ(-1.0, time.InMillisecondsF()); | 348 DCHECK_EQ(-1.0, time.InMillisecondsF()); |
| 341 return; | 349 return; |
| 342 } | 350 } |
| 343 | 351 |
| 344 JNIEnv* env = AttachCurrentThread(); | 352 JNIEnv* env = AttachCurrentThread(); |
| 345 CHECK(env); | 353 DCHECK(env); |
| 346 int time_msec = static_cast<int>(time.InMilliseconds()); | 354 int time_msec = static_cast<int>(time.InMilliseconds()); |
| 347 Java_RemoteMediaPlayerBridge_seekTo(env, java_bridge_, time_msec); | 355 Java_RemoteMediaPlayerBridge_seekTo(env, java_bridge_, time_msec); |
| 348 } | 356 } |
| 349 | 357 |
| 350 void RemoteMediaPlayerBridge::Release() { | 358 void RemoteMediaPlayerBridge::Release() { |
| 351 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 359 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 352 time_update_timer_.Stop(); | 360 time_update_timer_.Stop(); |
| 353 JNIEnv* env = AttachCurrentThread(); | 361 JNIEnv* env = AttachCurrentThread(); |
| 354 Java_RemoteMediaPlayerBridge_release(env, java_bridge_); | 362 Java_RemoteMediaPlayerBridge_release(env, java_bridge_); |
| 355 DetachListener(); | 363 DetachListener(); |
| 356 } | 364 } |
| 357 | 365 |
| 358 void RemoteMediaPlayerBridge::UpdateEffectiveVolumeInternal( | 366 void RemoteMediaPlayerBridge::UpdateEffectiveVolumeInternal( |
| 359 double effective_volume) { | 367 double effective_volume) { |
| 360 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 368 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 361 JNIEnv* env = AttachCurrentThread(); | 369 JNIEnv* env = AttachCurrentThread(); |
| 362 CHECK(env); | 370 DCHECK(env); |
| 363 Java_RemoteMediaPlayerBridge_setVolume(env, java_bridge_, | 371 Java_RemoteMediaPlayerBridge_setVolume(env, java_bridge_, |
| 364 GetEffectiveVolume()); | 372 GetEffectiveVolume()); |
| 365 } | 373 } |
| 366 | 374 |
| 367 base::TimeDelta RemoteMediaPlayerBridge::GetCurrentTime() { | 375 base::TimeDelta RemoteMediaPlayerBridge::GetCurrentTime() { |
| 368 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 376 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 369 JNIEnv* env = AttachCurrentThread(); | 377 JNIEnv* env = AttachCurrentThread(); |
| 370 return base::TimeDelta::FromMilliseconds( | 378 return base::TimeDelta::FromMilliseconds( |
| 371 Java_RemoteMediaPlayerBridge_getCurrentPosition(env, java_bridge_)); | 379 Java_RemoteMediaPlayerBridge_getCurrentPosition(env, java_bridge_)); |
| 372 } | 380 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 386 return media::kInfiniteDuration; | 394 return media::kInfiniteDuration; |
| 387 return local_player->GetDuration(); | 395 return local_player->GetDuration(); |
| 388 } | 396 } |
| 389 return duration_ms < 0 ? media::kInfiniteDuration | 397 return duration_ms < 0 ? media::kInfiniteDuration |
| 390 : base::TimeDelta::FromMilliseconds(duration_ms); | 398 : base::TimeDelta::FromMilliseconds(duration_ms); |
| 391 } | 399 } |
| 392 | 400 |
| 393 bool RemoteMediaPlayerBridge::IsPlaying() { | 401 bool RemoteMediaPlayerBridge::IsPlaying() { |
| 394 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 402 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 395 JNIEnv* env = AttachCurrentThread(); | 403 JNIEnv* env = AttachCurrentThread(); |
| 396 CHECK(env); | 404 DCHECK(env); |
| 397 jboolean result = Java_RemoteMediaPlayerBridge_isPlaying(env, java_bridge_); | 405 jboolean result = Java_RemoteMediaPlayerBridge_isPlaying(env, java_bridge_); |
| 398 return result; | 406 return result; |
| 399 } | 407 } |
| 400 | 408 |
| 401 bool RemoteMediaPlayerBridge::CanPause() { | 409 bool RemoteMediaPlayerBridge::CanPause() { |
| 402 return true; | 410 return true; |
| 403 } | 411 } |
| 404 | 412 |
| 405 bool RemoteMediaPlayerBridge::CanSeekForward() { | 413 bool RemoteMediaPlayerBridge::CanSeekForward() { |
| 406 return true; | 414 return true; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 461 ->OnCancelledRemotePlaybackRequest(player_id()); | 469 ->OnCancelledRemotePlaybackRequest(player_id()); |
| 462 } | 470 } |
| 463 | 471 |
| 464 | 472 |
| 465 void RemoteMediaPlayerBridge::OnCookiesRetrieved(const std::string& cookies) { | 473 void RemoteMediaPlayerBridge::OnCookiesRetrieved(const std::string& cookies) { |
| 466 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 474 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 467 // TODO(aberent) Do we need to retrieve auth credentials for basic | 475 // TODO(aberent) Do we need to retrieve auth credentials for basic |
| 468 // authentication? MediaPlayerBridge does. | 476 // authentication? MediaPlayerBridge does. |
| 469 cookies_ = cookies; | 477 cookies_ = cookies; |
| 470 JNIEnv* env = AttachCurrentThread(); | 478 JNIEnv* env = AttachCurrentThread(); |
| 471 CHECK(env); | 479 DCHECK(env); |
| 472 Java_RemoteMediaPlayerBridge_setCookies( | 480 Java_RemoteMediaPlayerBridge_setCookies( |
| 473 env, java_bridge_, ConvertUTF8ToJavaString(env, cookies)); | 481 env, java_bridge_, ConvertUTF8ToJavaString(env, cookies)); |
| 474 } | 482 } |
| 475 | 483 |
| 476 MediaPlayerAndroid* RemoteMediaPlayerBridge::GetLocalPlayer() { | 484 MediaPlayerAndroid* RemoteMediaPlayerBridge::GetLocalPlayer() { |
| 477 return static_cast<RemoteMediaPlayerManager*>(manager())->GetLocalPlayer( | 485 return static_cast<RemoteMediaPlayerManager*>(manager())->GetLocalPlayer( |
| 478 player_id()); | 486 player_id()); |
| 479 } | 487 } |
| 480 | 488 |
| 481 } // namespace remote_media | 489 } // namespace remote_media |
| OLD | NEW |