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 |