Skip to content

Commit

Permalink
Use intent API to open links - it is more robust
Browse files Browse the repository at this point in the history
Fixes #1514
  • Loading branch information
andydotxyz committed Sep 10, 2021
1 parent e43240f commit d796a9b
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 4 deletions.
26 changes: 26 additions & 0 deletions app/app_mobile_and.c
Expand Up @@ -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, "<init>", "(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);
Expand Down
13 changes: 9 additions & 4 deletions app/app_mobile_and.go
Expand Up @@ -9,6 +9,7 @@ package app
#include <stdlib.h>
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"
Expand All @@ -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) {
Expand Down

0 comments on commit d796a9b

Please sign in to comment.