aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerActivity.java43
-rw-r--r--tools/viewer/sk_app/Window.h2
-rw-r--r--tools/viewer/sk_app/android/Window_android.cpp12
-rw-r--r--tools/viewer/sk_app/android/Window_android.h2
-rw-r--r--tools/viewer/sk_app/android/surface_glue_android.cpp26
-rw-r--r--tools/viewer/sk_app/android/surface_glue_android.h4
6 files changed, 82 insertions, 7 deletions
diff --git a/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerActivity.java b/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerActivity.java
index 48cec39f48..e115de65b3 100644
--- a/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerActivity.java
+++ b/platform_tools/android/apps/viewer/src/main/java/org/skia/viewer/ViewerActivity.java
@@ -9,17 +9,50 @@ package org.skia.viewer;
import android.app.Activity;
import android.os.Bundle;
+import android.util.Log;
+import android.view.GestureDetector;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
+import android.view.View;
+
+public class ViewerActivity
+ extends Activity implements SurfaceHolder.Callback, View.OnTouchListener {
+ private static final float FLING_VELOCITY_THRESHOLD = 1000;
-public class ViewerActivity extends Activity implements SurfaceHolder.Callback {
private SurfaceView mView;
private ViewerApplication mApplication;
+ private GestureDetector mGestureDetector;
private native void onSurfaceCreated(long handle, Surface surface);
private native void onSurfaceChanged(long handle, Surface surface);
private native void onSurfaceDestroyed(long handle);
+ private native void onKeyPressed(long handle, int keycode);
+
+ private class GestureListener extends GestureDetector.SimpleOnGestureListener {
+ @Override
+ public boolean onDown(MotionEvent e) {
+ return true;
+ }
+
+ @Override
+ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
+ if (Math.abs(velocityX) > Math.abs(velocityY)
+ && Math.abs(velocityX) > FLING_VELOCITY_THRESHOLD) {
+ if (velocityX > 0) {
+ // Fling right
+ onKeyPressed(mApplication.getNativeHandle(), KeyEvent.KEYCODE_SOFT_RIGHT);
+ } else {
+ // Fling left
+ onKeyPressed(mApplication.getNativeHandle(), KeyEvent.KEYCODE_SOFT_LEFT);
+ }
+ return true;
+ }
+ return false;
+ }
+ }
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -29,6 +62,9 @@ public class ViewerActivity extends Activity implements SurfaceHolder.Callback {
mApplication = (ViewerApplication) getApplication();
mView = (SurfaceView) findViewById(R.id.surfaceView);
mView.getHolder().addCallback(this);
+
+ mGestureDetector = new GestureDetector(getApplicationContext(), new GestureListener());
+ mView.setOnTouchListener(this);
}
@Override
@@ -51,4 +87,9 @@ public class ViewerActivity extends Activity implements SurfaceHolder.Callback {
onSurfaceDestroyed(mApplication.getNativeHandle());
}
}
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ return mGestureDetector.onTouchEvent(event);
+ }
}
diff --git a/tools/viewer/sk_app/Window.h b/tools/viewer/sk_app/Window.h
index 5a7c9b8360..f233f131a5 100644
--- a/tools/viewer/sk_app/Window.h
+++ b/tools/viewer/sk_app/Window.h
@@ -130,7 +130,7 @@ public:
uint32_t width() { return fWidth; }
uint32_t height() { return fHeight; }
- const DisplayParams& getDisplayParams();
+ virtual const DisplayParams& getDisplayParams();
void setDisplayParams(const DisplayParams& params);
protected:
diff --git a/tools/viewer/sk_app/android/Window_android.cpp b/tools/viewer/sk_app/android/Window_android.cpp
index 09e7ef14a7..0156ea123e 100644
--- a/tools/viewer/sk_app/android/Window_android.cpp
+++ b/tools/viewer/sk_app/android/Window_android.cpp
@@ -27,6 +27,16 @@ bool Window_android::init(SkiaAndroidApp* skiaAndroidApp) {
return true;
}
+const DisplayParams& Window_android::getDisplayParams() {
+ if (fWindowContext) {
+ return fWindowContext->getDisplayParams();
+ } else {
+ // fWindowContext doesn't exist because we haven't
+ // initDisplay yet.
+ return fDisplayParams;
+ }
+}
+
void Window_android::setTitle(const char* title) {
//todo
SkDebugf("Title: %s", title);
@@ -49,11 +59,9 @@ void Window_android::initDisplay(ANativeWindow* window) {
ContextPlatformData_android platformData;
platformData.fNativeWindow = window;
fWindowContext = VulkanWindowContext::Create((void*)&platformData, fDisplayParams);
- fNativeWindowInitialized = true;
}
void Window_android::onDisplayDestroyed() {
- fNativeWindowInitialized = false;
detach();
}
diff --git a/tools/viewer/sk_app/android/Window_android.h b/tools/viewer/sk_app/android/Window_android.h
index 45e5bbe744..2bf7bfeaba 100644
--- a/tools/viewer/sk_app/android/Window_android.h
+++ b/tools/viewer/sk_app/android/Window_android.h
@@ -22,6 +22,7 @@ public:
void initDisplay(ANativeWindow* window);
void onDisplayDestroyed();
+ const DisplayParams& getDisplayParams() override;
void setTitle(const char*) override;
void show() override {}
@@ -37,7 +38,6 @@ private:
SkiaAndroidApp* fSkiaAndroidApp = nullptr;
SkRect fContentRect;
DisplayParams fDisplayParams;
- bool fNativeWindowInitialized = false;
};
} // namespace sk_app
diff --git a/tools/viewer/sk_app/android/surface_glue_android.cpp b/tools/viewer/sk_app/android/surface_glue_android.cpp
index b1d0029a10..acee839a30 100644
--- a/tools/viewer/sk_app/android/surface_glue_android.cpp
+++ b/tools/viewer/sk_app/android/surface_glue_android.cpp
@@ -11,7 +11,9 @@
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
+#include <unordered_map>
+#include <android/keycodes.h>
#include <android/looper.h>
#include <android/native_window_jni.h>
@@ -24,6 +26,11 @@ namespace sk_app {
static const int LOOPER_ID_MESSAGEPIPE = 1;
+static const std::unordered_map<int, Window::Key> ANDROID_TO_WINDOW_KEYMAP({
+ {AKEYCODE_SOFT_LEFT, Window::Key::kLeft},
+ {AKEYCODE_SOFT_RIGHT, Window::Key::kRight}
+});
+
void* pthread_main(void* arg);
SkiaAndroidApp::SkiaAndroidApp() {
@@ -90,7 +97,6 @@ static int message_callback(int fd, int events, void* data) {
message.fNativeWindow);
int width = ANativeWindow_getWidth(skiaAndroidApp->fNativeWindow);
int height = ANativeWindow_getHeight(skiaAndroidApp->fNativeWindow);
- skiaAndroidApp->fWindow->onResize(width, height);
auto window_android = (Window_android*)skiaAndroidApp->fWindow;
window_android->setContentRect(0, 0, width, height);
skiaAndroidApp->paintIfNeeded();
@@ -105,6 +111,14 @@ static int message_callback(int fd, int events, void* data) {
}
break;
}
+ case kKeyPressed: {
+ auto it = ANDROID_TO_WINDOW_KEYMAP.find(message.keycode);
+ 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;
+ }
default: {
// do nothing
}
@@ -171,4 +185,14 @@ extern "C" JNIEXPORT void JNICALL Java_org_skia_viewer_ViewerActivity_onSurfaceD
skiaAndroidApp->postMessage(Message(kSurfaceDestroyed));
}
+extern "C" JNIEXPORT void JNICALL Java_org_skia_viewer_ViewerActivity_onKeyPressed(JNIEnv* env,
+ jobject activity,
+ jlong handle,
+ jint keycode) {
+ auto skiaAndroidApp = (SkiaAndroidApp*)handle;
+ Message message(kKeyPressed);
+ message.keycode = keycode;
+ skiaAndroidApp->postMessage(message);
+}
+
} // namespace sk_app
diff --git a/tools/viewer/sk_app/android/surface_glue_android.h b/tools/viewer/sk_app/android/surface_glue_android.h
index aefe46208d..296112258e 100644
--- a/tools/viewer/sk_app/android/surface_glue_android.h
+++ b/tools/viewer/sk_app/android/surface_glue_android.h
@@ -23,12 +23,14 @@ enum MessageType {
kSurfaceChanged,
kSurfaceDestroyed,
kDestroyApp,
- kContentInvalidated
+ kContentInvalidated,
+ kKeyPressed
};
struct Message {
MessageType fType = kUndefined;
ANativeWindow* fNativeWindow = nullptr;
+ int keycode = 0;
Message() {}
Message(MessageType t) : fType(t) {}