Chromium Code Reviews| 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..78111899b18b18169029456a308148993802e5fe 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); |
| @@ -105,6 +113,9 @@ void JniGlDisplayHandler::OnPixelTransformationChanged( |
| const base::android::JavaParamRef<jobject>& caller, |
| const base::android::JavaParamRef<jfloatArray>& jmatrix) { |
| DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); |
| + if (!ui_task_poster_) { |
| + return; |
|
Hzj_jie
2016/09/13 17:56:29
Suggest to add a PostTaskToDisplayThread(const bas
Yuwei
2016/09/13 19:06:18
Done. Slightly different name.
|
| + } |
| DCHECK(env->GetArrayLength(jmatrix.obj()) == 9); |
| std::array<float, 9> matrix; |
| env->GetFloatArrayRegion(jmatrix.obj(), 0, 9, matrix.data()); |
| @@ -118,6 +129,9 @@ void JniGlDisplayHandler::OnCursorPixelPositionChanged( |
| float x, |
| float y) { |
| DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); |
| + if (!ui_task_poster_) { |
| + return; |
| + } |
| ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnCursorMoved, |
| renderer_.GetWeakPtr(), x, y)); |
| } |
| @@ -127,6 +141,9 @@ void JniGlDisplayHandler::OnCursorVisibilityChanged( |
| const base::android::JavaParamRef<jobject>& caller, |
| bool visible) { |
| DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); |
| + if (!ui_task_poster_) { |
| + return; |
| + } |
| ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnCursorVisibilityChanged, |
| renderer_.GetWeakPtr(), visible)); |
| } |
| @@ -138,10 +155,17 @@ void JniGlDisplayHandler::OnCursorInputFeedback( |
| float y, |
| float diameter) { |
| DCHECK(runtime_->ui_task_runner()->BelongsToCurrentThread()); |
| + if (!ui_task_poster_) { |
| + return; |
| + } |
| ui_task_poster_->AddTask(base::Bind(&GlRenderer::OnCursorInputFeedback, |
| renderer_.GetWeakPtr(), x, y, diameter)); |
| } |
| +void JniGlDisplayHandler::DeleteOnDisplayThread() { |
| + delete this; |
| +} |
| + |
| bool JniGlDisplayHandler::CanRenderFrame() { |
| DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
| return egl_context_ && egl_context_->IsWindowBound(); |