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

Side by Side Diff: remoting/client/jni/jni_client.cc

Issue 2007123003: [Android Client] Break down multi-threaded classes by thread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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 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 "remoting/client/jni/jni_client.h" 5 #include "remoting/client/jni/jni_client.h"
6 6
7 #include "base/android/jni_android.h" 7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h" 8 #include "base/android/jni_string.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "jni/Client_jni.h" 10 #include "jni/Client_jni.h"
11 #include "remoting/client/jni/chromoting_jni_instance.h" 11 #include "remoting/client/jni/chromoting_jni_instance.h"
12 #include "remoting/client/jni/chromoting_jni_runtime.h" 12 #include "remoting/client/jni/chromoting_jni_runtime.h"
13 #include "remoting/client/jni/jni_display_handler.h"
14 #include "remoting/client/jni/jni_secret_fetcher.h"
13 #include "remoting/client/jni/jni_touch_event_data.h" 15 #include "remoting/client/jni/jni_touch_event_data.h"
14 16
15 using base::android::ConvertJavaStringToUTF8; 17 using base::android::ConvertJavaStringToUTF8;
16 using base::android::ConvertUTF8ToJavaString; 18 using base::android::ConvertUTF8ToJavaString;
17 19
18 namespace { 20 namespace remoting {
19 21
20 const int kBytesPerPixel = 4; 22 JniClient::JniClient(ChromotingJniRuntime* runtime,
23 base::android::ScopedJavaGlobalRef<jobject> java_client)
24 : runtime_(runtime),
25 java_client_(java_client),
26 weak_factory_(this) {}
27
28 JniClient::~JniClient() {
29 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
30 // The session must be shut down first, since it depends on our other
Lambros 2016/05/28 00:43:05 Blank line before comment.
31 // components' still being alive.
32 DisconnectFromHost();
21 } 33 }
22 34
23 namespace remoting { 35 void JniClient::ConnectToHost(base::WeakPtr<JniDisplayHandler> display_handler,
24 36 const std::string& username,
25 JniClient::JniClient(jobject java_client)
26 : java_client_(java_client), weak_factory_(this) {}
27
28 JniClient::~JniClient() {
29 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread());
30 }
31
32 void JniClient::ConnectToHost(const std::string& username,
33 const std::string& auth_token, 37 const std::string& auth_token,
34 const std::string& host_jid, 38 const std::string& host_jid,
35 const std::string& host_id, 39 const std::string& host_id,
36 const std::string& host_pubkey, 40 const std::string& host_pubkey,
37 const std::string& pairing_id, 41 const std::string& pairing_id,
38 const std::string& pairing_secret, 42 const std::string& pairing_secret,
39 const std::string& capabilities, 43 const std::string& capabilities,
40 const std::string& flags) { 44 const std::string& flags) {
41 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); 45 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
42 DCHECK(!session_); 46 DCHECK(!session_);
43 session_ = new ChromotingJniInstance( 47 DCHECK(!secret_fetcher_);
44 runtime(), this, username, auth_token, host_jid, host_id, host_pubkey, 48 secret_fetcher_.reset(new JniSecretFetcher(runtime_, GetWeakPtr(), host_id));
45 pairing_id, pairing_secret, capabilities, flags); 49
50 display_handler_ = display_handler;
51 session_.reset(new ChromotingJniInstance(
52 runtime_, GetWeakPtr(), display_handler_,
53 secret_fetcher_->GetWeakPtr(), username, auth_token, host_jid, host_id,
54 host_pubkey, pairing_id, pairing_secret, capabilities, flags));
46 } 55 }
47 56
48 void JniClient::DisconnectFromHost() { 57 void JniClient::DisconnectFromHost() {
49 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); 58 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
59 display_handler_ = nullptr;
50 if (session_) { 60 if (session_) {
51 session_->Disconnect(); 61 session_->Disconnect();
52 session_ = nullptr; 62 runtime_->network_task_runner()->DeleteSoon(FROM_HERE,
63 session_.release());
53 } 64 }
54 } 65 }
55 66
56 void JniClient::OnConnectionState(protocol::ConnectionToHost::State state, 67 void JniClient::OnConnectionState(protocol::ConnectionToHost::State state,
57 protocol::ErrorCode error) { 68 protocol::ErrorCode error) {
58 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); 69 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
59 70
60 JNIEnv* env = base::android::AttachCurrentThread(); 71 JNIEnv* env = base::android::AttachCurrentThread();
61 Java_Client_onConnectionState(env, java_client_, state, error); 72 Java_Client_onConnectionState(env, java_client_.obj(), state, error);
62 } 73 }
63 74
64 void JniClient::DisplayAuthenticationPrompt(bool pairing_supported) { 75 void JniClient::DisplayAuthenticationPrompt(bool pairing_supported) {
65 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); 76 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
66 77
67 JNIEnv* env = base::android::AttachCurrentThread(); 78 JNIEnv* env = base::android::AttachCurrentThread();
68 Java_Client_displayAuthenticationPrompt(env, java_client_, pairing_supported); 79 Java_Client_displayAuthenticationPrompt(env, java_client_.obj(),
80 pairing_supported);
69 } 81 }
70 82
71 void JniClient::CommitPairingCredentials(const std::string& host, 83 void JniClient::CommitPairingCredentials(const std::string& host,
72 const std::string& id, 84 const std::string& id,
73 const std::string& secret) { 85 const std::string& secret) {
74 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); 86 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
75 87
76 JNIEnv* env = base::android::AttachCurrentThread(); 88 JNIEnv* env = base::android::AttachCurrentThread();
77 ScopedJavaLocalRef<jstring> j_host = ConvertUTF8ToJavaString(env, host); 89 ScopedJavaLocalRef<jstring> j_host = ConvertUTF8ToJavaString(env, host);
78 ScopedJavaLocalRef<jstring> j_id = ConvertUTF8ToJavaString(env, id); 90 ScopedJavaLocalRef<jstring> j_id = ConvertUTF8ToJavaString(env, id);
79 ScopedJavaLocalRef<jstring> j_secret = ConvertUTF8ToJavaString(env, secret); 91 ScopedJavaLocalRef<jstring> j_secret = ConvertUTF8ToJavaString(env, secret);
80 92
81 Java_Client_commitPairingCredentials(env, java_client_, j_host.obj(), 93 Java_Client_commitPairingCredentials(env, java_client_.obj(), j_host.obj(),
82 j_id.obj(), j_secret.obj()); 94 j_id.obj(), j_secret.obj());
83 } 95 }
84 96
85 void JniClient::FetchThirdPartyToken(const std::string& token_url, 97 void JniClient::FetchThirdPartyToken(const std::string& token_url,
86 const std::string& client_id, 98 const std::string& client_id,
87 const std::string& scope) { 99 const std::string& scope) {
88 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); 100 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
89 JNIEnv* env = base::android::AttachCurrentThread(); 101 JNIEnv* env = base::android::AttachCurrentThread();
90 102
91 ScopedJavaLocalRef<jstring> j_url = ConvertUTF8ToJavaString(env, token_url); 103 ScopedJavaLocalRef<jstring> j_url = ConvertUTF8ToJavaString(env, token_url);
92 ScopedJavaLocalRef<jstring> j_client_id = 104 ScopedJavaLocalRef<jstring> j_client_id =
93 ConvertUTF8ToJavaString(env, client_id); 105 ConvertUTF8ToJavaString(env, client_id);
94 ScopedJavaLocalRef<jstring> j_scope = ConvertUTF8ToJavaString(env, scope); 106 ScopedJavaLocalRef<jstring> j_scope = ConvertUTF8ToJavaString(env, scope);
95 107
96 Java_Client_fetchThirdPartyToken(env, java_client_, j_url.obj(), 108 Java_Client_fetchThirdPartyToken(env, java_client_.obj(), j_url.obj(),
97 j_client_id.obj(), j_scope.obj()); 109 j_client_id.obj(), j_scope.obj());
98 } 110 }
99 111
100 void JniClient::SetCapabilities(const std::string& capabilities) { 112 void JniClient::SetCapabilities(const std::string& capabilities) {
101 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); 113 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
102 JNIEnv* env = base::android::AttachCurrentThread(); 114 JNIEnv* env = base::android::AttachCurrentThread();
103 115
104 ScopedJavaLocalRef<jstring> j_cap = 116 ScopedJavaLocalRef<jstring> j_cap =
105 ConvertUTF8ToJavaString(env, capabilities); 117 ConvertUTF8ToJavaString(env, capabilities);
106 118
107 Java_Client_setCapabilities(env, java_client_, j_cap.obj()); 119 Java_Client_setCapabilities(env, java_client_.obj(), j_cap.obj());
108 } 120 }
109 121
110 void JniClient::HandleExtensionMessage(const std::string& type, 122 void JniClient::HandleExtensionMessage(const std::string& type,
111 const std::string& message) { 123 const std::string& message) {
112 DCHECK(runtime()->ui_task_runner()->BelongsToCurrentThread()); 124 DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
113 JNIEnv* env = base::android::AttachCurrentThread(); 125 JNIEnv* env = base::android::AttachCurrentThread();
114 126
115 ScopedJavaLocalRef<jstring> j_type = ConvertUTF8ToJavaString(env, type); 127 ScopedJavaLocalRef<jstring> j_type = ConvertUTF8ToJavaString(env, type);
116 ScopedJavaLocalRef<jstring> j_message = ConvertUTF8ToJavaString(env, message); 128 ScopedJavaLocalRef<jstring> j_message = ConvertUTF8ToJavaString(env, message);
117 129
118 Java_Client_handleExtensionMessage(env, java_client_, j_type.obj(), 130 Java_Client_handleExtensionMessage(env, java_client_.obj(), j_type.obj(),
119 j_message.obj()); 131 j_message.obj());
120 } 132 }
121 133
122 base::android::ScopedJavaLocalRef<jobject> JniClient::NewBitmap(int width,
123 int height) {
124 JNIEnv* env = base::android::AttachCurrentThread();
125 return Java_Client_newBitmap(env, width, height);
126 }
127
128 void JniClient::UpdateFrameBitmap(jobject bitmap) {
129 DCHECK(runtime()->display_task_runner()->BelongsToCurrentThread());
130
131 JNIEnv* env = base::android::AttachCurrentThread();
132 Java_Client_setVideoFrame(env, java_client_, bitmap);
133 }
134
135 void JniClient::UpdateCursorShape(
136 const protocol::CursorShapeInfo& cursor_shape) {
137 DCHECK(runtime()->display_task_runner()->BelongsToCurrentThread());
138
139 // const_cast<> is safe as long as the Java updateCursorShape() method copies
140 // the data out of the buffer without mutating it, and doesn't keep any
141 // reference to the buffer afterwards. Unfortunately, there seems to be no way
142 // to create a read-only ByteBuffer from a pointer-to-const.
143 char* data = string_as_array(const_cast<std::string*>(&cursor_shape.data()));
144 int cursor_total_bytes =
145 cursor_shape.width() * cursor_shape.height() * kBytesPerPixel;
146
147 JNIEnv* env = base::android::AttachCurrentThread();
148 base::android::ScopedJavaLocalRef<jobject> buffer(
149 env, env->NewDirectByteBuffer(data, cursor_total_bytes));
150 Java_Client_updateCursorShape(env, java_client_, cursor_shape.width(),
151 cursor_shape.height(), cursor_shape.hotspot_x(),
152 cursor_shape.hotspot_y(), buffer.obj());
153 }
154
155 void JniClient::RedrawCanvas() {
156 DCHECK(runtime()->display_task_runner()->BelongsToCurrentThread());
157
158 JNIEnv* env = base::android::AttachCurrentThread();
159 Java_Client_redrawGraphicsInternal(env, java_client_);
160 }
161
162 // static 134 // static
163 bool JniClient::RegisterJni(JNIEnv* env) { 135 bool JniClient::RegisterJni(JNIEnv* env) {
164 return RegisterNativesImpl(env); 136 return RegisterNativesImpl(env);
165 } 137 }
166 138
167 void JniClient::Connect( 139 void JniClient::Connect(
168 JNIEnv* env, 140 JNIEnv* env,
169 const base::android::JavaParamRef<jobject>& caller, 141 const base::android::JavaParamRef<jobject>& caller,
142 jlong display_handler,
170 const base::android::JavaParamRef<jstring>& username, 143 const base::android::JavaParamRef<jstring>& username,
171 const base::android::JavaParamRef<jstring>& authToken, 144 const base::android::JavaParamRef<jstring>& authToken,
172 const base::android::JavaParamRef<jstring>& hostJid, 145 const base::android::JavaParamRef<jstring>& hostJid,
173 const base::android::JavaParamRef<jstring>& hostId, 146 const base::android::JavaParamRef<jstring>& hostId,
174 const base::android::JavaParamRef<jstring>& hostPubkey, 147 const base::android::JavaParamRef<jstring>& hostPubkey,
175 const base::android::JavaParamRef<jstring>& pairId, 148 const base::android::JavaParamRef<jstring>& pairId,
176 const base::android::JavaParamRef<jstring>& pairSecret, 149 const base::android::JavaParamRef<jstring>& pairSecret,
177 const base::android::JavaParamRef<jstring>& capabilities, 150 const base::android::JavaParamRef<jstring>& capabilities,
178 const base::android::JavaParamRef<jstring>& flags) { 151 const base::android::JavaParamRef<jstring>& flags) {
179 ConnectToHost(ConvertJavaStringToUTF8(env, username), 152 JniDisplayHandler* raw_handler = reinterpret_cast<JniDisplayHandler*>(
153 display_handler);
154 DCHECK(raw_handler);
155 ConnectToHost(raw_handler->GetWeakPtr(),
156 ConvertJavaStringToUTF8(env, username),
180 ConvertJavaStringToUTF8(env, authToken), 157 ConvertJavaStringToUTF8(env, authToken),
181 ConvertJavaStringToUTF8(env, hostJid), 158 ConvertJavaStringToUTF8(env, hostJid),
182 ConvertJavaStringToUTF8(env, hostId), 159 ConvertJavaStringToUTF8(env, hostId),
183 ConvertJavaStringToUTF8(env, hostPubkey), 160 ConvertJavaStringToUTF8(env, hostPubkey),
184 ConvertJavaStringToUTF8(env, pairId), 161 ConvertJavaStringToUTF8(env, pairId),
185 ConvertJavaStringToUTF8(env, pairSecret), 162 ConvertJavaStringToUTF8(env, pairSecret),
186 ConvertJavaStringToUTF8(env, capabilities), 163 ConvertJavaStringToUTF8(env, capabilities),
187 ConvertJavaStringToUTF8(env, flags)); 164 ConvertJavaStringToUTF8(env, flags));
188 } 165 }
189 166
190 void JniClient::Disconnect(JNIEnv* env, 167 void JniClient::Disconnect(JNIEnv* env,
191 const base::android::JavaParamRef<jobject>& caller) { 168 const base::android::JavaParamRef<jobject>& caller) {
192 DisconnectFromHost(); 169 DisconnectFromHost();
193 } 170 }
194 171
195 void JniClient::AuthenticationResponse( 172 void JniClient::AuthenticationResponse(
196 JNIEnv* env, 173 JNIEnv* env,
197 const JavaParamRef<jobject>& caller, 174 const JavaParamRef<jobject>& caller,
198 const JavaParamRef<jstring>& pin, 175 const JavaParamRef<jstring>& pin,
199 jboolean createPair, 176 jboolean createPair,
200 const JavaParamRef<jstring>& deviceName) { 177 const JavaParamRef<jstring>& deviceName) {
201 session_->ProvideSecret(ConvertJavaStringToUTF8(env, pin).c_str(), createPair, 178 session_->ProvideSecret(ConvertJavaStringToUTF8(env, pin).c_str(), createPair,
202 ConvertJavaStringToUTF8(env, deviceName)); 179 ConvertJavaStringToUTF8(env, deviceName));
203 } 180 }
204 181
205 void JniClient::ScheduleRedraw(
206 JNIEnv* env,
207 const base::android::JavaParamRef<jobject>& caller) {
208 session_->RedrawDesktop();
209 }
210
211 void JniClient::SendMouseEvent( 182 void JniClient::SendMouseEvent(
212 JNIEnv* env, 183 JNIEnv* env,
213 const base::android::JavaParamRef<jobject>& caller, 184 const base::android::JavaParamRef<jobject>& caller,
214 jint x, 185 jint x,
215 jint y, 186 jint y,
216 jint whichButton, 187 jint whichButton,
217 jboolean buttonDown) { 188 jboolean buttonDown) {
218 // Button must be within the bounds of the MouseEvent_MouseButton enum. 189 // Button must be within the bounds of the MouseEvent_MouseButton enum.
219 DCHECK(whichButton >= 0 && whichButton < 5); 190 DCHECK(whichButton >= 0 && whichButton < 5);
220 191
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 const base::android::JavaParamRef<jobject>& caller, 249 const base::android::JavaParamRef<jobject>& caller,
279 jboolean enable) { 250 jboolean enable) {
280 session_->EnableVideoChannel(enable); 251 session_->EnableVideoChannel(enable);
281 } 252 }
282 253
283 void JniClient::OnThirdPartyTokenFetched( 254 void JniClient::OnThirdPartyTokenFetched(
284 JNIEnv* env, 255 JNIEnv* env,
285 const base::android::JavaParamRef<jobject>& caller, 256 const base::android::JavaParamRef<jobject>& caller,
286 const JavaParamRef<jstring>& token, 257 const JavaParamRef<jstring>& token,
287 const JavaParamRef<jstring>& shared_secret) { 258 const JavaParamRef<jstring>& shared_secret) {
288 runtime()->network_task_runner()->PostTask( 259 runtime_->network_task_runner()->PostTask(
289 FROM_HERE, 260 FROM_HERE,
290 base::Bind(&ChromotingJniInstance::HandleOnThirdPartyTokenFetched, 261 base::Bind(&ChromotingJniInstance::HandleOnThirdPartyTokenFetched,
291 session_, ConvertJavaStringToUTF8(env, token), 262 session_->GetWeakPtr(), ConvertJavaStringToUTF8(env, token),
292 ConvertJavaStringToUTF8(env, shared_secret))); 263 ConvertJavaStringToUTF8(env, shared_secret)));
293 } 264 }
294 265
295 void JniClient::SendExtensionMessage( 266 void JniClient::SendExtensionMessage(
296 JNIEnv* env, 267 JNIEnv* env,
297 const base::android::JavaParamRef<jobject>& caller, 268 const base::android::JavaParamRef<jobject>& caller,
298 const JavaParamRef<jstring>& type, 269 const JavaParamRef<jstring>& type,
299 const JavaParamRef<jstring>& data) { 270 const JavaParamRef<jstring>& data) {
300 session_->SendClientMessage(ConvertJavaStringToUTF8(env, type), 271 session_->SendClientMessage(ConvertJavaStringToUTF8(env, type),
301 ConvertJavaStringToUTF8(env, data)); 272 ConvertJavaStringToUTF8(env, data));
302 } 273 }
303 274
304 void JniClient::Destroy(JNIEnv* env, const JavaParamRef<jobject>& caller) { 275 void JniClient::Destroy(JNIEnv* env, const JavaParamRef<jobject>& caller) {
305 // The session must be shut down first, since it depends on our other
306 // components' still being alive.
307 DisconnectFromHost();
Yuwei 2016/05/27 19:14:13 Moved into the dtor.
308
309 env->DeleteGlobalRef(java_client_);
310 delete this; 276 delete this;
311 } 277 }
312 278
313 base::WeakPtr<JniClient> JniClient::GetWeakPtr() { 279 base::WeakPtr<JniClient> JniClient::GetWeakPtr() {
314 return weak_factory_.GetWeakPtr(); 280 return weak_factory_.GetWeakPtr();
315 } 281 }
316 282
317 // static
318 ChromotingJniRuntime* JniClient::runtime() {
319 return ChromotingJniRuntime::GetInstance();
320 }
321
322 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& caller) { 283 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& caller) {
323 jobject caller_ref = env->NewGlobalRef(caller); 284 return reinterpret_cast<intptr_t>(
324 return reinterpret_cast<intptr_t>(new JniClient(caller_ref)); 285 new JniClient(ChromotingJniRuntime::GetInstance(),
286 base::android::ScopedJavaGlobalRef<jobject>(env, caller)));
325 } 287 }
326 288
327 } // namespace remoting 289 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698