From d796a9bb88c948867f83765bbeed2eaeed8ee4ec Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Fri, 10 Sep 2021 13:51:01 +0100 Subject: [PATCH] Use intent API to open links - it is more robust Fixes #1514 --- app/app_mobile_and.c | 26 ++++++++++++++++++++++++++ app/app_mobile_and.go | 13 +++++++++---- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/app/app_mobile_and.c b/app/app_mobile_and.c index 3420b1a86f..0486c6d5d7 100644 --- a/app/app_mobile_and.c +++ b/app/app_mobile_and.c @@ -59,6 +59,32 @@ bool isOreoOrLater(JNIEnv *env) { return sdkVersion >= 26; // O = Oreo, will not be defined for older builds } +jobject parseURL(uintptr_t jni_env, uintptr_t ctx, char* uriCstr) { + JNIEnv *env = (JNIEnv*)jni_env; + + jstring uriStr = (*env)->NewStringUTF(env, uriCstr); + jclass uriClass = find_class(env, "android/net/Uri"); + jmethodID parse = find_static_method(env, uriClass, "parse", "(Ljava/lang/String;)Landroid/net/Uri;"); + + return (jobject)(*env)->CallStaticObjectMethod(env, uriClass, parse, uriStr); +} + +void openURL(uintptr_t java_vm, uintptr_t jni_env, uintptr_t ctx, char *url) { + JNIEnv *env = (JNIEnv*)jni_env; + jobject uri = parseURL(jni_env, ctx, url); + + jclass intentClass = find_class(env, "android/content/Intent"); + jfieldID viewFieldID = (*env)->GetStaticFieldID(env, intentClass, "ACTION_VIEW", "Ljava/lang/String;" ); + jstring view = (*env)->GetStaticObjectField(env, intentClass, viewFieldID); + + jmethodID constructor = find_method(env, intentClass, "", "(Ljava/lang/String;Landroid/net/Uri;)V"); + jobject intent = (*env)->NewObject(env, intentClass, constructor, view, uri); + + jclass contextClass = find_class(env, "android/content/Context"); + jmethodID start = find_method(env, contextClass, "startActivity", "(Landroid/content/Intent;)V"); + (*env)->CallVoidMethod(env, ctx, start, intent); +} + void sendNotification(uintptr_t java_vm, uintptr_t jni_env, uintptr_t ctx, char *title, char *body) { JNIEnv *env = (JNIEnv*)jni_env; jstring titleStr = (*env)->NewStringUTF(env, title); diff --git a/app/app_mobile_and.go b/app/app_mobile_and.go index 8066f6edfc..f032660f8a 100644 --- a/app/app_mobile_and.go +++ b/app/app_mobile_and.go @@ -9,6 +9,7 @@ package app #include +void openURL(uintptr_t java_vm, uintptr_t jni_env, uintptr_t ctx, char *url); void sendNotification(uintptr_t java_vm, uintptr_t jni_env, uintptr_t ctx, char *title, char *content); */ import "C" @@ -24,10 +25,14 @@ import ( ) func (a *fyneApp) OpenURL(url *url.URL) error { - cmd := a.exec("/system/bin/am", "start", "-a", "android.intent.action.VIEW", "--user", "0", - "-d", url.String()) - cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr - return cmd.Run() + urlStr := C.CString(url.String()) + defer C.free(unsafe.Pointer(urlStr)) + + app.RunOnJVM(func(vm, env, ctx uintptr) error { + C.openURL(C.uintptr_t(vm), C.uintptr_t(env), C.uintptr_t(ctx), urlStr) + return nil + }) + return nil } func (a *fyneApp) SendNotification(n *fyne.Notification) {