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

Unified Diff: remoting/client/jni/chromoting_jni_instance.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, 7 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 side-by-side diff with in-line comments
Download patch
Index: remoting/client/jni/chromoting_jni_instance.cc
diff --git a/remoting/client/jni/chromoting_jni_instance.cc b/remoting/client/jni/chromoting_jni_instance.cc
index 6c8c1cb77874910385fb546e2d29df6ae1c04fb9..0d77fcb41fc518794d1869025cd901302f363d1a 100644
--- a/remoting/client/jni/chromoting_jni_instance.cc
+++ b/remoting/client/jni/chromoting_jni_instance.cc
@@ -7,8 +7,6 @@
#include <android/log.h>
#include <stdint.h>
-#include <utility>
-
#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/format_macros.h"
@@ -22,6 +20,7 @@
#include "remoting/client/jni/android_keymap.h"
#include "remoting/client/jni/chromoting_jni_runtime.h"
#include "remoting/client/jni/jni_client.h"
+#include "remoting/client/jni/jni_display_handler.h"
#include "remoting/client/jni/jni_frame_consumer.h"
#include "remoting/client/software_video_renderer.h"
#include "remoting/protocol/chromium_port_allocator_factory.h"
@@ -48,19 +47,24 @@ const int kPerfStatsIntervalMs = 60000;
}
-ChromotingJniInstance::ChromotingJniInstance(ChromotingJniRuntime* jni_runtime,
- JniClient* jni_client,
- const std::string& username,
- const std::string& auth_token,
- const std::string& host_jid,
- const std::string& host_id,
- const std::string& host_pubkey,
- const std::string& pairing_id,
- const std::string& pairing_secret,
- const std::string& capabilities,
- const std::string& flags)
+ChromotingJniInstance::ChromotingJniInstance(
+ ChromotingJniRuntime* jni_runtime,
+ base::WeakPtr<JniClient> jni_client,
+ base::WeakPtr<JniDisplayHandler> display,
+ base::WeakPtr<JniSecretFetcher> secret_fetcher,
+ const std::string& username,
+ const std::string& auth_token,
+ const std::string& host_jid,
+ const std::string& host_id,
+ const std::string& host_pubkey,
+ const std::string& pairing_id,
+ const std::string& pairing_secret,
+ const std::string& capabilities,
+ const std::string& flags)
: jni_runtime_(jni_runtime),
jni_client_(jni_client),
+ display_handler_(display),
+ secret_fetcher_(secret_fetcher),
host_jid_(host_jid),
flags_(flags),
capabilities_(capabilities),
@@ -77,34 +81,30 @@ ChromotingJniInstance::ChromotingJniInstance(ChromotingJniRuntime* jni_runtime,
client_auth_config_.host_id = host_id;
client_auth_config_.pairing_client_id = pairing_id;
client_auth_config_.pairing_secret = pairing_secret;
- client_auth_config_.fetch_secret_callback = base::Bind(
- &ChromotingJniInstance::FetchSecret, weak_factory_.GetWeakPtr());
- client_auth_config_.fetch_third_party_token_callback =
- base::Bind(&ChromotingJniInstance::FetchThirdPartyToken,
- weak_factory_.GetWeakPtr(), host_pubkey);
+ client_auth_config_.fetch_secret_callback =
+ base::Bind(&ChromotingJniInstance::FetchSecret, GetWeakPtr());
+ client_auth_config_.fetch_third_party_token_callback = base::Bind(
+ &ChromotingJniInstance::FetchThirdPartyToken, GetWeakPtr(), host_pubkey);
// Post a task to start connection
jni_runtime_->network_task_runner()->PostTask(
FROM_HERE,
- base::Bind(&ChromotingJniInstance::ConnectToHostOnNetworkThread, this));
+ base::Bind(&ChromotingJniInstance::ConnectToHostOnNetworkThread,
+ GetWeakPtr()));
}
ChromotingJniInstance::~ChromotingJniInstance() {
- // This object is ref-counted, so this dtor can execute on any thread.
- // Ensure that all these objects have been freed already, so they are not
- // destroyed on some random thread.
- DCHECK(!view_);
- DCHECK(!client_context_);
- DCHECK(!video_renderer_);
- DCHECK(!client_);
- DCHECK(!signaling_);
+ DCHECK(jni_runtime_->network_task_runner()->BelongsToCurrentThread());
+ if (client_) {
+ Destroy();
+ }
}
void ChromotingJniInstance::Disconnect() {
if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) {
jni_runtime_->network_task_runner()->PostTask(
FROM_HERE,
- base::Bind(&ChromotingJniInstance::Disconnect, this));
+ base::Bind(&ChromotingJniInstance::Disconnect, GetWeakPtr()));
return;
}
@@ -120,15 +120,7 @@ void ChromotingJniInstance::Disconnect() {
connected_ = false;
}
- // |client_| must be torn down before |signaling_|.
- client_.reset();
- video_renderer_.reset();
- view_.reset();
- signaling_.reset();
- perf_tracker_.reset();
- client_context_.reset();
-
- weak_factory_.InvalidateWeakPtrs();
+ Destroy();
}
void ChromotingJniInstance::FetchThirdPartyToken(
@@ -145,9 +137,8 @@ void ChromotingJniInstance::FetchThirdPartyToken(
third_party_token_fetched_callback_ = token_fetched_callback;
jni_runtime_->ui_task_runner()->PostTask(
- FROM_HERE, base::Bind(&JniClient::FetchThirdPartyToken,
- jni_client_->GetWeakPtr(), token_url,
- host_public_key, scope));
+ FROM_HERE, base::Bind(&JniClient::FetchThirdPartyToken, jni_client_,
+ token_url, host_public_key, scope));
}
void ChromotingJniInstance::HandleOnThirdPartyTokenFetched(
@@ -173,26 +164,17 @@ void ChromotingJniInstance::ProvideSecret(const std::string& pin,
bool create_pairing,
const std::string& device_name) {
DCHECK(jni_runtime_->ui_task_runner()->BelongsToCurrentThread());
- DCHECK(!pin_callback_.is_null());
+
+ if (!secret_fetcher_) {
+ return;
+ }
create_pairing_ = create_pairing;
if (create_pairing)
SetDeviceName(device_name);
- jni_runtime_->network_task_runner()->PostTask(FROM_HERE,
- base::Bind(pin_callback_, pin));
-}
-
-void ChromotingJniInstance::RedrawDesktop() {
- if (!jni_runtime_->display_task_runner()->BelongsToCurrentThread()) {
- jni_runtime_->display_task_runner()->PostTask(
- FROM_HERE,
- base::Bind(&ChromotingJniInstance::RedrawDesktop, this));
- return;
- }
-
- jni_client_->RedrawCanvas();
+ secret_fetcher_->ProvideSecret(pin);
}
void ChromotingJniInstance::SendMouseEvent(
@@ -202,7 +184,7 @@ void ChromotingJniInstance::SendMouseEvent(
if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) {
jni_runtime_->network_task_runner()->PostTask(
FROM_HERE, base::Bind(&ChromotingJniInstance::SendMouseEvent,
- this, x, y, button, button_down));
+ GetWeakPtr(), x, y, button, button_down));
return;
}
@@ -219,9 +201,8 @@ void ChromotingJniInstance::SendMouseEvent(
void ChromotingJniInstance::SendMouseWheelEvent(int delta_x, int delta_y) {
if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) {
jni_runtime_->network_task_runner()->PostTask(
- FROM_HERE,
- base::Bind(&ChromotingJniInstance::SendMouseWheelEvent, this,
- delta_x, delta_y));
+ FROM_HERE, base::Bind(&ChromotingJniInstance::SendMouseWheelEvent,
+ GetWeakPtr(), delta_x, delta_y));
return;
}
@@ -253,7 +234,7 @@ void ChromotingJniInstance::SendTextEvent(const std::string& text) {
if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) {
jni_runtime_->network_task_runner()->PostTask(
FROM_HERE,
- base::Bind(&ChromotingJniInstance::SendTextEvent, this, text));
+ base::Bind(&ChromotingJniInstance::SendTextEvent, GetWeakPtr(), text));
return;
}
@@ -266,8 +247,8 @@ void ChromotingJniInstance::SendTouchEvent(
const protocol::TouchEvent& touch_event) {
if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) {
jni_runtime_->network_task_runner()->PostTask(
- FROM_HERE,
- base::Bind(&ChromotingJniInstance::SendTouchEvent, this, touch_event));
+ FROM_HERE, base::Bind(&ChromotingJniInstance::SendTouchEvent,
+ GetWeakPtr(), touch_event));
return;
}
@@ -277,8 +258,8 @@ void ChromotingJniInstance::SendTouchEvent(
void ChromotingJniInstance::EnableVideoChannel(bool enable) {
if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) {
jni_runtime_->network_task_runner()->PostTask(
- FROM_HERE,
- base::Bind(&ChromotingJniInstance::EnableVideoChannel, this, enable));
+ FROM_HERE, base::Bind(&ChromotingJniInstance::EnableVideoChannel,
+ GetWeakPtr(), enable));
return;
}
@@ -291,9 +272,8 @@ void ChromotingJniInstance::SendClientMessage(const std::string& type,
const std::string& data) {
if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) {
jni_runtime_->network_task_runner()->PostTask(
- FROM_HERE,
- base::Bind(
- &ChromotingJniInstance::SendClientMessage, this, type, data));
+ FROM_HERE, base::Bind(&ChromotingJniInstance::SendClientMessage,
+ GetWeakPtr(), type, data));
return;
}
@@ -326,10 +306,7 @@ void ChromotingJniInstance::OnConnectionState(
jni_runtime_->ui_task_runner()->PostTask(
FROM_HERE,
- base::Bind(&JniClient::OnConnectionState,
- jni_client_->GetWeakPtr(),
- state,
- error));
+ base::Bind(&JniClient::OnConnectionState, jni_client_, state, error));
}
void ChromotingJniInstance::OnConnectionReady(bool ready) {
@@ -346,25 +323,23 @@ void ChromotingJniInstance::OnRouteChanged(
void ChromotingJniInstance::SetCapabilities(const std::string& capabilities) {
jni_runtime_->ui_task_runner()->PostTask(
- FROM_HERE, base::Bind(&JniClient::SetCapabilities,
- jni_client_->GetWeakPtr(), capabilities));
+ FROM_HERE,
+ base::Bind(&JniClient::SetCapabilities, jni_client_, capabilities));
}
void ChromotingJniInstance::SetPairingResponse(
const protocol::PairingResponse& response) {
jni_runtime_->ui_task_runner()->PostTask(
- FROM_HERE,
- base::Bind(&JniClient::CommitPairingCredentials,
- jni_client_->GetWeakPtr(), client_auth_config_.host_id,
- response.client_id(), response.shared_secret()));
+ FROM_HERE, base::Bind(&JniClient::CommitPairingCredentials, jni_client_,
+ client_auth_config_.host_id, response.client_id(),
+ response.shared_secret()));
}
void ChromotingJniInstance::DeliverHostMessage(
const protocol::ExtensionMessage& message) {
jni_runtime_->ui_task_runner()->PostTask(
- FROM_HERE, base::Bind(&JniClient::HandleExtensionMessage,
- jni_client_->GetWeakPtr(), message.type(),
- message.data()));
+ FROM_HERE, base::Bind(&JniClient::HandleExtensionMessage, jni_client_,
+ message.type(), message.data()));
}
void ChromotingJniInstance::SetDesktopSize(const webrtc::DesktopSize& size,
@@ -390,12 +365,15 @@ void ChromotingJniInstance::SetCursorShape(
const protocol::CursorShapeInfo& shape) {
if (!jni_runtime_->display_task_runner()->BelongsToCurrentThread()) {
jni_runtime_->display_task_runner()->PostTask(
- FROM_HERE,
- base::Bind(&ChromotingJniInstance::SetCursorShape, this, shape));
- return;
+ FROM_HERE, base::Bind(&JniDisplayHandler::UpdateCursorShape,
+ display_handler_, shape));
+ } else if (display_handler_) {
+ display_handler_->UpdateCursorShape(shape);
}
+}
- jni_client_->UpdateCursorShape(shape);
+base::WeakPtr<ChromotingJniInstance> ChromotingJniInstance::GetWeakPtr() {
+ return weak_factory_.GetWeakPtr();
}
void ChromotingJniInstance::ConnectToHostOnNetworkThread() {
@@ -408,7 +386,7 @@ void ChromotingJniInstance::ConnectToHostOnNetworkThread() {
perf_tracker_.reset(new protocol::PerformanceTracker());
- view_.reset(new JniFrameConsumer(jni_runtime_, jni_client_));
+ view_.reset(new JniFrameConsumer(jni_runtime_, display_handler_));
video_renderer_.reset(new SoftwareVideoRenderer(
client_context_->decode_task_runner(), view_.get(), perf_tracker_.get()));
@@ -449,23 +427,18 @@ void ChromotingJniInstance::FetchSecret(
const protocol::SecretFetchedCallback& callback) {
if (!jni_runtime_->ui_task_runner()->BelongsToCurrentThread()) {
jni_runtime_->ui_task_runner()->PostTask(
- FROM_HERE, base::Bind(&ChromotingJniInstance::FetchSecret,
- this, pairable, callback));
- return;
+ FROM_HERE, base::Bind(&JniSecretFetcher::FetchSecret, secret_fetcher_,
+ pairable, callback));
+ } else if (secret_fetcher_) {
+ secret_fetcher_->FetchSecret(pairable, callback);
}
-
- // Delete pairing credentials if they exist.
- jni_client_->CommitPairingCredentials(client_auth_config_.host_id, "", "");
-
- pin_callback_ = callback;
- jni_client_->DisplayAuthenticationPrompt(pairable);
}
void ChromotingJniInstance::SetDeviceName(const std::string& device_name) {
if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) {
jni_runtime_->network_task_runner()->PostTask(
- FROM_HERE, base::Bind(&ChromotingJniInstance::SetDeviceName, this,
- device_name));
+ FROM_HERE, base::Bind(&ChromotingJniInstance::SetDeviceName,
+ GetWeakPtr(), device_name));
return;
}
@@ -477,7 +450,7 @@ void ChromotingJniInstance::SendKeyEventInternal(int usb_key_code,
if (!jni_runtime_->network_task_runner()->BelongsToCurrentThread()) {
jni_runtime_->network_task_runner()->PostTask(
FROM_HERE, base::Bind(&ChromotingJniInstance::SendKeyEventInternal,
- this, usb_key_code, key_down));
+ GetWeakPtr(), usb_key_code, key_down));
return;
}
@@ -492,7 +465,8 @@ void ChromotingJniInstance::EnableStatsLogging(bool enabled) {
if (enabled && !stats_logging_enabled_) {
jni_runtime_->network_task_runner()->PostDelayedTask(
- FROM_HERE, base::Bind(&ChromotingJniInstance::LogPerfStats, this),
+ FROM_HERE,
+ base::Bind(&ChromotingJniInstance::LogPerfStats, GetWeakPtr()),
base::TimeDelta::FromMilliseconds(kPerfStatsIntervalMs));
}
stats_logging_enabled_ = enabled;
@@ -524,8 +498,18 @@ void ChromotingJniInstance::LogPerfStats() {
jni_runtime_->logger()->LogStatistics(perf_tracker_.get());
jni_runtime_->network_task_runner()->PostDelayedTask(
- FROM_HERE, base::Bind(&ChromotingJniInstance::LogPerfStats, this),
+ FROM_HERE, base::Bind(&ChromotingJniInstance::LogPerfStats, GetWeakPtr()),
base::TimeDelta::FromMilliseconds(kPerfStatsIntervalMs));
}
+void ChromotingJniInstance::Destroy() {
+ // |client_| must be torn down before |signaling_|.
+ client_.reset();
+ video_renderer_.reset();
+ view_.reset();
+ signaling_.reset();
+ perf_tracker_.reset();
+ client_context_.reset();
Lambros 2016/05/28 00:43:05 Should we invalidate weak_factory_ here?
Yuwei 2016/06/01 21:30:10 Done.
+}
+
} // namespace remoting

Powered by Google App Engine
This is Rietveld 408576698