| Index: remoting/client/jni/jni_gl_display_handler.cc
|
| diff --git a/remoting/client/jni/jni_gl_display_handler.cc b/remoting/client/jni/jni_gl_display_handler.cc
|
| index 7ab77ebcbd9db5cec9501431e831bc6536991461..a267b2e5621c637f9e5da31d854e1a869c4af577 100644
|
| --- a/remoting/client/jni/jni_gl_display_handler.cc
|
| +++ b/remoting/client/jni/jni_gl_display_handler.cc
|
| @@ -33,9 +33,7 @@ JniGlDisplayHandler::JniGlDisplayHandler(ChromotingJniRuntime* runtime)
|
|
|
| JniGlDisplayHandler::~JniGlDisplayHandler() {
|
| DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
|
| - Java_GlDisplay_invalidate(base::android::AttachCurrentThread(),
|
| - java_display_);
|
| - runtime_->ui_task_runner()->DeleteSoon(FROM_HERE, ui_task_poster_.release());
|
| + DCHECK(!ui_task_poster_) << "Destroy() has not been called.";
|
| }
|
|
|
| void JniGlDisplayHandler::InitializeClient(
|
| @@ -63,6 +61,16 @@ JniGlDisplayHandler::CreateVideoRenderer() {
|
| return base::MakeUnique<SoftwareVideoRenderer>(std::move(consumer));
|
| }
|
|
|
| +void JniGlDisplayHandler::Destroy() {
|
| + DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
|
| + Java_GlDisplay_invalidate(base::android::AttachCurrentThread(),
|
| + java_display_);
|
| + ui_task_poster_.reset();
|
| + runtime_->display_task_runner()->PostTask(
|
| + FROM_HERE, base::Bind(&JniGlDisplayHandler::DeleteOnDisplayThread,
|
| + weak_ptr_));
|
| +}
|
| +
|
| // static
|
| bool JniGlDisplayHandler::RegisterJni(JNIEnv* env) {
|
| return RegisterNativesImpl(env);
|
| @@ -108,7 +116,7 @@ void JniGlDisplayHandler::OnPixelTransformationChanged(
|
| DCHECK(env->GetArrayLength(jmatrix.obj()) == 9);
|
| std::array<float, 9> matrix;
|
| env->GetFloatArrayRegion(jmatrix.obj(), 0, 9, matrix.data());
|
| - ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnPixelTransformationChanged,
|
| + QueueTaskOnDisplayThread(base::Bind(&GlRenderer::OnPixelTransformationChanged,
|
| renderer_.GetWeakPtr(), matrix));
|
| }
|
|
|
| @@ -118,7 +126,7 @@ void JniGlDisplayHandler::OnCursorPixelPositionChanged(
|
| float x,
|
| float y) {
|
| DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
|
| - ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnCursorMoved,
|
| + QueueTaskOnDisplayThread(base::Bind(&GlRenderer::OnCursorMoved,
|
| renderer_.GetWeakPtr(), x, y));
|
| }
|
|
|
| @@ -127,7 +135,7 @@ void JniGlDisplayHandler::OnCursorVisibilityChanged(
|
| const base::android::JavaParamRef<jobject>& caller,
|
| bool visible) {
|
| DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
|
| - ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnCursorVisibilityChanged,
|
| + QueueTaskOnDisplayThread(base::Bind(&GlRenderer::OnCursorVisibilityChanged,
|
| renderer_.GetWeakPtr(), visible));
|
| }
|
|
|
| @@ -138,10 +146,21 @@ void JniGlDisplayHandler::OnCursorInputFeedback(
|
| float y,
|
| float diameter) {
|
| DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread());
|
| - ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnCursorInputFeedback,
|
| + QueueTaskOnDisplayThread(base::Bind(&GlRenderer::OnCursorInputFeedback,
|
| renderer_.GetWeakPtr(), x, y, diameter));
|
| }
|
|
|
| +void JniGlDisplayHandler::QueueTaskOnDisplayThread(const base::Closure& task) {
|
| + if (!ui_task_poster_) {
|
| + return;
|
| + }
|
| + ui_task_poster_->AddTask(task);
|
| +}
|
| +
|
| +void JniGlDisplayHandler::DeleteOnDisplayThread() {
|
| + delete this;
|
| +}
|
| +
|
| bool JniGlDisplayHandler::CanRenderFrame() {
|
| DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread());
|
| return egl_context_ && egl_context_->IsWindowBound();
|
|
|