From 503534e84e5943ad5981d644fa61228e11d88294 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 17 May 2020 15:46:17 +0200 Subject: [PATCH] app/internal/window: [Android] move main thread dispatching to Go Signed-off-by: Elias Naur --- app/internal/window/GioView.java | 50 ++++++++++++------------------- app/internal/window/os_android.go | 46 ++++++++++++++-------------- 2 files changed, 41 insertions(+), 55 deletions(-) diff --git a/app/internal/window/GioView.java b/app/internal/window/GioView.java index 6c2f2184..c7106a1e 100644 --- a/app/internal/window/GioView.java +++ b/app/internal/window/GioView.java @@ -145,14 +145,6 @@ public final class GioView extends SurfaceView implements Choreographer.FrameCal }); } - void postFrameCallbackOnMainThread() { - handler.post(new Runnable() { - @Override public void run() { - postFrameCallback(); - } - }); - } - @Override protected boolean fitSystemWindows(Rect insets) { onWindowInsets(nhandle, insets.top, insets.right, insets.bottom, insets.left); return true; @@ -201,7 +193,7 @@ public final class GioView extends SurfaceView implements Choreographer.FrameCal return onBack(nhandle); } - protected void wakeupMainThread() { + void wakeupMainThread() { handler.post(new Runnable() { @Override public void run() { scheduleMainFuncs(); @@ -209,7 +201,7 @@ public final class GioView extends SurfaceView implements Choreographer.FrameCal }); } - protected void registerFragment(String del) { + void registerFragment(String del) { final Class cls; try { cls = getContext().getClassLoader().loadClass(del); @@ -217,33 +209,29 @@ public final class GioView extends SurfaceView implements Choreographer.FrameCal throw new RuntimeException("RegisterFragment: fragment class not found: " + e.getMessage()); } - handler.post(new Runnable() { - public void run() { - final Fragment frag; - try { - frag = (Fragment)cls.newInstance(); - } catch (IllegalAccessException | InstantiationException | ExceptionInInitializerError | SecurityException | ClassCastException e) { - throw new RuntimeException("RegisterFragment: error instantiating fragment: " + e.getMessage()); - } - final FragmentManager fm; - try { - fm = ((Activity)getContext()).getFragmentManager(); - } catch (ClassCastException e) { - throw new RuntimeException("RegisterFragment: cannot get fragment manager from View Context: " + e.getMessage()); - } - FragmentTransaction ft = fm.beginTransaction(); - ft.add(frag, del); - ft.commitNow(); - } - }); + final Fragment frag; + try { + frag = (Fragment)cls.newInstance(); + } catch (IllegalAccessException | InstantiationException | ExceptionInInitializerError | SecurityException | ClassCastException e) { + throw new RuntimeException("RegisterFragment: error instantiating fragment: " + e.getMessage()); + } + final FragmentManager fm; + try { + fm = ((Activity)getContext()).getFragmentManager(); + } catch (ClassCastException e) { + throw new RuntimeException("RegisterFragment: cannot get fragment manager from View Context: " + e.getMessage()); + } + FragmentTransaction ft = fm.beginTransaction(); + ft.add(frag, del); + ft.commitNow(); } - protected void writeClipboard(String s) { + void writeClipboard(String s) { ClipboardManager m = (ClipboardManager)getContext().getSystemService(Context.CLIPBOARD_SERVICE); m.setPrimaryClip(ClipData.newPlainText(null, s)); } - protected String readClipboard() { + String readClipboard() { ClipboardManager m = (ClipboardManager)getContext().getSystemService(Context.CLIPBOARD_SERVICE); ClipData c = m.getPrimaryClip(); if (c == null || c.getItemCount() < 1) { diff --git a/app/internal/window/os_android.go b/app/internal/window/os_android.go index b5aa687e..bae34586 100644 --- a/app/internal/window/os_android.go +++ b/app/internal/window/os_android.go @@ -75,16 +75,15 @@ type window struct { animating bool // Cached Java methods. - mgetDensity C.jmethodID - mgetFontScale C.jmethodID - mshowTextInput C.jmethodID - mhideTextInput C.jmethodID - mpostFrameCallback C.jmethodID - mpostFrameCallbackOnMainThread C.jmethodID - mRegisterFragment C.jmethodID - mwakeupMainThread C.jmethodID - mwriteClipboard C.jmethodID - mreadClipboard C.jmethodID + mgetDensity C.jmethodID + mgetFontScale C.jmethodID + mshowTextInput C.jmethodID + mhideTextInput C.jmethodID + mpostFrameCallback C.jmethodID + mRegisterFragment C.jmethodID + mwakeupMainThread C.jmethodID + mwriteClipboard C.jmethodID + mreadClipboard C.jmethodID } type jvalue uint64 // The largest JNI type fits in 64 bits. @@ -181,17 +180,16 @@ func GetDataDir() string { func Java_org_gioui_GioView_onCreateView(env *C.JNIEnv, class C.jclass, view C.jobject) C.jlong { view = C.gio_jni_NewGlobalRef(env, view) w := &window{ - view: view, - mgetDensity: getMethodID(env, class, "getDensity", "()I"), - mgetFontScale: getMethodID(env, class, "getFontScale", "()F"), - mshowTextInput: getMethodID(env, class, "showTextInput", "()V"), - mhideTextInput: getMethodID(env, class, "hideTextInput", "()V"), - mpostFrameCallback: getMethodID(env, class, "postFrameCallback", "()V"), - mpostFrameCallbackOnMainThread: getMethodID(env, class, "postFrameCallbackOnMainThread", "()V"), - mRegisterFragment: getMethodID(env, class, "registerFragment", "(Ljava/lang/String;)V"), - mwakeupMainThread: getMethodID(env, class, "wakeupMainThread", "()V"), - mwriteClipboard: getMethodID(env, class, "writeClipboard", "(Ljava/lang/String;)V"), - mreadClipboard: getMethodID(env, class, "readClipboard", "()Ljava/lang/String;"), + view: view, + mgetDensity: getMethodID(env, class, "getDensity", "()I"), + mgetFontScale: getMethodID(env, class, "getFontScale", "()F"), + mshowTextInput: getMethodID(env, class, "showTextInput", "()V"), + mhideTextInput: getMethodID(env, class, "hideTextInput", "()V"), + mpostFrameCallback: getMethodID(env, class, "postFrameCallback", "()V"), + mRegisterFragment: getMethodID(env, class, "registerFragment", "(Ljava/lang/String;)V"), + mwakeupMainThread: getMethodID(env, class, "wakeupMainThread", "()V"), + mwriteClipboard: getMethodID(env, class, "writeClipboard", "(Ljava/lang/String;)V"), + mreadClipboard: getMethodID(env, class, "readClipboard", "()Ljava/lang/String;"), } wopts := <-mainWindow.out w.callbacks = wopts.window @@ -370,8 +368,8 @@ func (w *window) SetAnimating(anim bool) { w.animating = anim w.mu.Unlock() if anim { - runInJVM(javaVM(), func(env *C.JNIEnv) { - callVoidMethod(env, w.view, w.mpostFrameCallbackOnMainThread) + w.runOnMain(func(env *C.JNIEnv) { + callVoidMethod(env, w.view, w.mpostFrameCallback) }) } } @@ -532,7 +530,7 @@ func javaString(env *C.JNIEnv, str string) C.jstring { } func (w *window) RegisterFragment(del string) { - runInJVM(javaVM(), func(env *C.JNIEnv) { + w.runOnMain(func(env *C.JNIEnv) { jstr := javaString(env, del) callVoidMethod(env, w.view, w.mRegisterFragment, jvalue(jstr)) })