diff --git a/app/internal/window/Gio.java b/app/internal/window/Gio.java index db57bff5..a3802755 100644 --- a/app/internal/window/Gio.java +++ b/app/internal/window/Gio.java @@ -2,6 +2,8 @@ package org.gioui; +import android.content.ClipboardManager; +import android.content.ClipData; import android.content.Context; import java.io.UnsupportedEncodingException; @@ -36,4 +38,19 @@ public final class Gio { } static private native void runGoMain(byte[] dataDir, Context context); + + static void writeClipboard(Context ctx, String s) { + ClipboardManager m = (ClipboardManager)ctx.getSystemService(Context.CLIPBOARD_SERVICE); + m.setPrimaryClip(ClipData.newPlainText(null, s)); + } + + static String readClipboard(Context ctx) { + ClipboardManager m = (ClipboardManager)ctx.getSystemService(Context.CLIPBOARD_SERVICE); + ClipData c = m.getPrimaryClip(); + if (c == null || c.getItemCount() < 1) { + return null; + } + return c.getItemAt(0).coerceToText(ctx).toString(); + } + } diff --git a/app/internal/window/GioView.java b/app/internal/window/GioView.java index bf051ad3..1ea96445 100644 --- a/app/internal/window/GioView.java +++ b/app/internal/window/GioView.java @@ -11,8 +11,6 @@ import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; -import android.content.ClipboardManager; -import android.content.ClipData; import android.content.Context; import android.graphics.Rect; import android.os.Build; @@ -229,20 +227,6 @@ public final class GioView extends SurfaceView implements Choreographer.FrameCal ft.commitNow(); } - void writeClipboard(String s) { - ClipboardManager m = (ClipboardManager)getContext().getSystemService(Context.CLIPBOARD_SERVICE); - m.setPrimaryClip(ClipData.newPlainText(null, s)); - } - - String readClipboard() { - ClipboardManager m = (ClipboardManager)getContext().getSystemService(Context.CLIPBOARD_SERVICE); - ClipData c = m.getPrimaryClip(); - if (c == null || c.getItemCount() < 1) { - return null; - } - return c.getItemAt(0).coerceToText(getContext()).toString(); - } - static private native long onCreateView(GioView view); static private native void onDestroyView(long handle); static private native void onStartView(long handle); diff --git a/app/internal/window/os_android.go b/app/internal/window/os_android.go index ceda756a..c4a3fbfe 100644 --- a/app/internal/window/os_android.go +++ b/app/internal/window/os_android.go @@ -82,8 +82,6 @@ type window struct { 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. @@ -97,8 +95,13 @@ var android struct { mu sync.Mutex jvm *C.JavaVM - // The global Android App context. + // appCtx is the global Android App context. appCtx C.jobject + // gioCls is the class of the Gio class. + gioCls C.jclass + + mwriteClipboard C.jmethodID + mreadClipboard C.jmethodID } var views = make(map[C.jlong]*window) @@ -153,6 +156,9 @@ func initJVM(env *C.JNIEnv, gio C.jclass, ctx C.jobject) { panic("gio: GetJavaVM failed") } android.appCtx = C.gio_jni_NewGlobalRef(env, ctx) + android.gioCls = C.jclass(C.gio_jni_NewGlobalRef(env, C.jobject(gio))) + android.mwriteClipboard = getStaticMethodID(env, gio, "writeClipboard", "(Landroid/content/Context;Ljava/lang/String;)V") + android.mreadClipboard = getStaticMethodID(env, gio, "readClipboard", "(Landroid/content/Context;)Ljava/lang/String;") } func JavaVM() uintptr { @@ -188,8 +194,6 @@ func Java_org_gioui_GioView_onCreateView(env *C.JNIEnv, class C.jclass, view C.j 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 @@ -624,13 +628,15 @@ func NewWindow(window Callbacks, opts *Options) error { func (w *window) WriteClipboard(s string) { w.runOnMain(func(env *C.JNIEnv) { jstr := javaString(env, s) - callVoidMethod(env, w.view, w.mwriteClipboard, jvalue(jstr)) + callStaticVoidMethod(env, android.gioCls, android.mwriteClipboard, + jvalue(android.appCtx), jvalue(jstr)) }) } func (w *window) ReadClipboard() { w.runOnMain(func(env *C.JNIEnv) { - c, err := callObjectMethod(env, w.view, w.mreadClipboard) + c, err := callStaticObjectMethod(env, android.gioCls, android.mreadClipboard, + jvalue(android.appCtx)) if err != nil { return }