| 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..e8715582c096c02c3c1e0ad0b77cc90095c14150 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,6 +32,15 @@ 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);
|
| @@ -76,6 +86,14 @@ void SkiaAndroidApp::readMessage(Message* message) const {
|
| SkASSERT(readSize == sizeof(Message));
|
| }
|
|
|
| +void SkiaAndroidApp::inval() {
|
| + SkAutoMutexAcquire ama(fMutex);
|
| + if (!fIsContentInvalidated) {
|
| + postMessage(Message(kContentInvalidated));
|
| + fIsContentInvalidated = true;
|
| + }
|
| +}
|
| +
|
| int SkiaAndroidApp::message_callback(int fd, int events, void* data) {
|
| auto skiaAndroidApp = (SkiaAndroidApp*)data;
|
| Message message;
|
| @@ -90,6 +108,8 @@ int SkiaAndroidApp::message_callback(int fd, int events, void* data) {
|
| return 0;
|
| }
|
| case kContentInvalidated: {
|
| + SkAutoMutexAcquire ama(skiaAndroidApp->fMutex);
|
| + skiaAndroidApp->fIsContentInvalidated = false;
|
| skiaAndroidApp->paintIfNeeded();
|
| break;
|
| }
|
| @@ -121,13 +141,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 +230,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);
|
| }
|
|
|
|
|