Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "content/browser/media/session/media_session_delegate_android.h" | |
| 6 | |
| 7 #include "base/android/context_utils.h" | |
| 8 #include "base/android/jni_android.h" | |
| 9 #include "content/browser/media/session/media_session.h" | |
| 10 #include "content/common/android/media_metadata_android.h" | |
| 11 #include "jni/MediaSessionDelegate_jni.h" | |
| 12 | |
| 13 using base::android::JavaParamRef; | |
| 14 | |
| 15 namespace content { | |
| 16 | |
| 17 // static | |
| 18 bool MediaSessionDelegateAndroid::Register(JNIEnv* env) { | |
| 19 return RegisterNativesImpl(env); | |
| 20 } | |
| 21 | |
| 22 // static | |
| 23 void MediaSessionDelegateAndroid::CreateAndConnect( | |
| 24 MediaSession* session, | |
| 25 JNIEnv* env, | |
| 26 const base::android::JavaParamRef<jobject>& j_delegate) { | |
| 27 MediaSessionDelegateAndroid* delegate = | |
| 28 new MediaSessionDelegateAndroid(session, env, j_delegate); | |
| 29 session->PassObserverOwnership( | |
| 30 std::unique_ptr<MediaSessionDelegateAndroid>(delegate)); | |
| 31 Java_MediaSessionDelegate_mediaSessionConnected( | |
| 32 env, j_delegate, reinterpret_cast<intptr_t>(delegate)); | |
| 33 } | |
| 34 | |
| 35 MediaSessionDelegateAndroid::MediaSessionDelegateAndroid( | |
| 36 MediaSession* session, | |
| 37 JNIEnv* env, | |
| 38 const base::android::JavaParamRef<jobject>& j_delegate) | |
| 39 : MediaSessionObserver(session), j_delegate_(env, j_delegate) {} | |
| 40 | |
| 41 MediaSessionDelegateAndroid::~MediaSessionDelegateAndroid() { | |
| 42 MediaSessionDisconnected(); | |
| 43 j_delegate_.reset(); | |
|
whywhat
2016/10/20 22:56:53
Don't think you need to do this in dtor.
Zhiqiang Zhang (Slow)
2016/10/21 13:43:52
Done.
| |
| 44 } | |
| 45 | |
| 46 void MediaSessionDelegateAndroid::MediaSessionDisconnected() { | |
| 47 MediaSessionObserver::MediaSessionDisconnected(); | |
| 48 JNIEnv* env = base::android::AttachCurrentThread(); | |
| 49 DCHECK(env); | |
| 50 if (!j_delegate_.is_empty()) { | |
|
boliu
2016/10/21 14:37:15
this in theory is not safe because gc could run be
Zhiqiang Zhang (Slow)
2016/10/21 15:05:23
Done.
| |
| 51 Java_MediaSessionDelegate_mediaSessionDisconnectedWrapper( | |
| 52 env, j_delegate_.get(env)); | |
| 53 } | |
| 54 } | |
| 55 | |
| 56 void MediaSessionDelegateAndroid::MediaSessionStateChanged(bool is_controllable, | |
| 57 bool is_active) { | |
| 58 JNIEnv* env = base::android::AttachCurrentThread(); | |
| 59 DCHECK(env); | |
| 60 if (!j_delegate_.is_empty()) { | |
| 61 Java_MediaSessionDelegate_mediaSessionStateChanged( | |
| 62 env, j_delegate_.get(env), is_controllable, is_active); | |
| 63 } | |
| 64 } | |
| 65 | |
| 66 void MediaSessionDelegateAndroid::MediaSessionMetadataChanged( | |
| 67 const base::Optional<MediaMetadata>& metadata) { | |
| 68 JNIEnv* env = base::android::AttachCurrentThread(); | |
| 69 DCHECK(env); | |
| 70 if (!j_delegate_.is_empty()) { | |
| 71 base::android::ScopedJavaLocalRef<jobject> j_metadata; | |
| 72 if (metadata.has_value()) { | |
| 73 j_metadata = | |
| 74 MediaMetadataAndroid::CreateJavaObject(env, metadata.value()); | |
| 75 } | |
| 76 Java_MediaSessionDelegate_mediaSessionMetadataChanged( | |
| 77 env, j_delegate_.get(env), j_metadata); | |
| 78 } | |
| 79 } | |
| 80 | |
| 81 void MediaSessionDelegateAndroid::ResumeMediaSession( | |
| 82 JNIEnv* env, | |
| 83 const JavaParamRef<jobject>& obj) { | |
| 84 if (session()) | |
| 85 session()->Resume(MediaSession::SuspendType::UI); | |
| 86 } | |
| 87 | |
| 88 void MediaSessionDelegateAndroid::SuspendMediaSession( | |
| 89 JNIEnv* env, | |
| 90 const JavaParamRef<jobject>& obj) { | |
| 91 if (session()) | |
| 92 session()->Suspend(MediaSession::SuspendType::UI); | |
| 93 } | |
| 94 | |
| 95 void MediaSessionDelegateAndroid::StopMediaSession( | |
| 96 JNIEnv* env, | |
| 97 const JavaParamRef<jobject>& obj) { | |
| 98 if (session()) | |
| 99 session()->Stop(MediaSession::SuspendType::UI); | |
| 100 } | |
| 101 | |
| 102 void MediaSessionDelegateAndroid::DisconnectMediaSession( | |
| 103 JNIEnv* env, | |
| 104 const JavaParamRef<jobject>& obj) { | |
| 105 // Will destroy this and send `mediaSessionDisconnected` to Java. | |
| 106 if (session()) | |
| 107 session()->RemoveObserver(this); | |
| 108 } | |
| 109 | |
| 110 } // namespace content | |
| OLD | NEW |