Chromium Code Reviews| Index: tools/viewer/sk_app/android/surface_glue_android.cpp |
| diff --git a/tools/viewer/sk_app/android/surface_glue_android.cpp b/tools/viewer/sk_app/android/surface_glue_android.cpp |
| index 3d8617f0aa4ab8854991fbeb37151ff60894c840..541b7f0053ad84392e65b8c2fdcca11971e453a0 100644 |
| --- a/tools/viewer/sk_app/android/surface_glue_android.cpp |
| +++ b/tools/viewer/sk_app/android/surface_glue_android.cpp |
| @@ -13,6 +13,7 @@ |
| #include <unistd.h> |
| #include <unordered_map> |
| +#include <android/input.h> |
| #include <android/keycodes.h> |
| #include <android/looper.h> |
| #include <android/native_window_jni.h> |
| @@ -31,12 +32,22 @@ static const std::unordered_map<int, Window::Key> ANDROID_TO_WINDOW_KEYMAP({ |
| {AKEYCODE_SOFT_RIGHT, Window::Key::kRight} |
| }); |
| +static const std::unordered_map<int, Window::InputState> ANDROID_TO_WINDOW_STATEMAP({ |
| + {AMOTION_EVENT_ACTION_DOWN, Window::kDown_InputState}, |
| + {AMOTION_EVENT_ACTION_POINTER_DOWN, Window::kDown_InputState}, |
| + {AMOTION_EVENT_ACTION_UP, Window::kUp_InputState}, |
| + {AMOTION_EVENT_ACTION_POINTER_UP, Window::kUp_InputState}, |
| + {AMOTION_EVENT_ACTION_MOVE, Window::kMove_InputState}, |
| + {AMOTION_EVENT_ACTION_CANCEL, Window::kUp_InputState}, |
| +}); |
| + |
| SkiaAndroidApp::SkiaAndroidApp(JNIEnv* env, jobject androidApp) { |
| env->GetJavaVM(&fJavaVM); |
| fAndroidApp = env->NewGlobalRef(androidApp); |
| jclass cls = env->GetObjectClass(fAndroidApp); |
| fSetTitleMethodID = env->GetMethodID(cls, "setTitle", "(Ljava/lang/String;)V"); |
| fNativeWindow = nullptr; |
| + pthread_mutex_init(&fMutex, nullptr); |
| pthread_create(&fThread, nullptr, pthread_main, this); |
| } |
| @@ -52,6 +63,7 @@ SkiaAndroidApp::~SkiaAndroidApp() { |
| if (fApp) { |
| delete fApp; |
| } |
| + pthread_mutex_destroy(&fMutex); |
| } |
| void SkiaAndroidApp::setTitle(const char* title) const { |
| @@ -76,6 +88,15 @@ void SkiaAndroidApp::readMessage(Message* message) const { |
| SkASSERT(readSize == sizeof(Message)); |
| } |
| +void SkiaAndroidApp::inval() { |
| + pthread_mutex_lock(&fMutex); |
|
djsollen
2016/05/17 18:48:02
use SkAutoTAcquire
liyuqian
2016/05/17 19:06:35
Done.
|
| + if (!fIsContentInvalidated) { |
| + postMessage(Message(kContentInvalidated)); |
| + fIsContentInvalidated = true; |
| + } |
| + pthread_mutex_unlock(&fMutex); |
| +} |
| + |
| int SkiaAndroidApp::message_callback(int fd, int events, void* data) { |
| auto skiaAndroidApp = (SkiaAndroidApp*)data; |
| Message message; |
| @@ -90,7 +111,10 @@ int SkiaAndroidApp::message_callback(int fd, int events, void* data) { |
| return 0; |
| } |
| case kContentInvalidated: { |
| + pthread_mutex_lock(&skiaAndroidApp->fMutex); |
|
djsollen
2016/05/17 18:48:02
use SkAutoTAcquire
liyuqian
2016/05/17 19:06:34
Done.
|
| + skiaAndroidApp->fIsContentInvalidated = false; |
| skiaAndroidApp->paintIfNeeded(); |
| + pthread_mutex_unlock(&skiaAndroidApp->fMutex); |
| break; |
| } |
| case kSurfaceCreated: { |
| @@ -121,13 +145,20 @@ int SkiaAndroidApp::message_callback(int fd, int events, void* data) { |
| break; |
| } |
| case kKeyPressed: { |
| - auto it = ANDROID_TO_WINDOW_KEYMAP.find(message.keycode); |
| + auto it = ANDROID_TO_WINDOW_KEYMAP.find(message.fKeycode); |
| SkASSERT(it != ANDROID_TO_WINDOW_KEYMAP.end()); |
| // No modifier is supported so far |
| skiaAndroidApp->fWindow->onKey(it->second, Window::kDown_InputState, 0); |
| skiaAndroidApp->fWindow->onKey(it->second, Window::kUp_InputState, 0); |
| break; |
| } |
| + case kTouched: { |
| + auto it = ANDROID_TO_WINDOW_STATEMAP.find(message.fTouchState); |
| + SkASSERT(it != ANDROID_TO_WINDOW_STATEMAP.end()); |
| + skiaAndroidApp->fWindow->onTouch(message.fTouchOwner, it->second, message.fTouchX, |
| + message.fTouchY); |
| + break; |
| + } |
| default: { |
| // do nothing |
| } |
| @@ -203,7 +234,18 @@ extern "C" JNIEXPORT void JNICALL Java_org_skia_viewer_ViewerActivity_onKeyPress |
| jint keycode) { |
| auto skiaAndroidApp = (SkiaAndroidApp*)handle; |
| Message message(kKeyPressed); |
| - message.keycode = keycode; |
| + message.fKeycode = keycode; |
| + skiaAndroidApp->postMessage(message); |
| +} |
| + |
| +extern "C" JNIEXPORT void JNICALL Java_org_skia_viewer_ViewerActivity_onTouched( |
| + JNIEnv* env, jobject activity, jlong handle, jint owner, jfloat x, jfloat y, jint state) { |
| + auto skiaAndroidApp = (SkiaAndroidApp*)handle; |
| + Message message(kTouched); |
| + message.fTouchOwner = owner; |
| + message.fTouchState = state; |
| + message.fTouchX = x; |
| + message.fTouchY = y; |
| skiaAndroidApp->postMessage(message); |
| } |