From 29097c4f57f60ca542b4d961d5971fe1cb39cadd Mon Sep 17 00:00:00 2001 From: Jamie Date: Mon, 20 Nov 2023 21:18:24 -0500 Subject: [PATCH] Implement URL handler for markdown on Android --- android/app/src/main/java/MainActivity.kt | 5 ++++ android/main.cpp | 13 ++++----- src-core/common/widgets/markdown_helper.cpp | 31 ++++++++++++++++++++- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/android/app/src/main/java/MainActivity.kt b/android/app/src/main/java/MainActivity.kt index b854edd75..3987b0614 100644 --- a/android/app/src/main/java/MainActivity.kt +++ b/android/app/src/main/java/MainActivity.kt @@ -304,6 +304,11 @@ class MainActivity : NativeActivity(), TextWatcher { return tmp; } + public fun openURL(url: String) { + val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url)); + startActivity(browserIntent); + } + // Receive results of the above override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data); diff --git a/android/main.cpp b/android/main.cpp index c693eeb16..37a0cc94d 100644 --- a/android/main.cpp +++ b/android/main.cpp @@ -23,8 +23,7 @@ static int ShowSoftKeyboardInput(); static int HideSoftKeyboardInput(); static int PollUnicodeChars(); static int GetAssetData(const char *filename, void **out_data); - -float get_dpi(struct android_app* app); +static float get_dpi(); #include "logger.h" #include "init.h" @@ -99,7 +98,7 @@ void init(struct android_app *app) // ImGui::StyleColorsDark(); // ImGui::StyleColorsClassic(); - float display_scale = get_dpi(app); + float display_scale = get_dpi(); initLogger(); style::setFonts(display_scale); HideSoftKeyboardInput(); @@ -457,9 +456,9 @@ static int PollUnicodeChars() return 0; } -float get_dpi(struct android_app* app) +static float get_dpi() { - JavaVM* java_vm = app->activity->vm; + JavaVM* java_vm = g_App->activity->vm; JNIEnv* java_env = NULL; jint jni_return = java_vm->GetEnv((void**)&java_env, JNI_VERSION_1_6); @@ -470,7 +469,7 @@ float get_dpi(struct android_app* app) if (jni_return != JNI_OK) throw std::runtime_error("Could not attach to thread"); - jclass native_activity_clazz = java_env->GetObjectClass(app->activity->clazz); + jclass native_activity_clazz = java_env->GetObjectClass(g_App->activity->clazz); if (native_activity_clazz == NULL) throw std::runtime_error("Could not get MainActivity class"); @@ -478,7 +477,7 @@ float get_dpi(struct android_app* app) if (method_id == NULL) throw std::runtime_error("Could not get methode ID"); - jfloat jflt = java_env->CallFloatMethod(app->activity->clazz, method_id); + jfloat jflt = java_env->CallFloatMethod(g_App->activity->clazz, method_id); jni_return = java_vm->DetachCurrentThread(); if (jni_return != JNI_OK) diff --git a/src-core/common/widgets/markdown_helper.cpp b/src-core/common/widgets/markdown_helper.cpp index c75d573b2..adf513ad9 100644 --- a/src-core/common/widgets/markdown_helper.cpp +++ b/src-core/common/widgets/markdown_helper.cpp @@ -8,6 +8,9 @@ #if defined(_WIN32) #include +#elif defined(__ANDROID__) +#include +extern struct android_app *android_app_ptr; #endif namespace widgets @@ -23,6 +26,32 @@ namespace widgets ShellExecuteA(0, 0, url.c_str(), 0, 0, SW_SHOW); #elif defined(__APPLE__) system(std::string("open " + url).c_str()); +#elif defined(__ANDROID__) + JavaVM *java_vm = android_app_ptr->activity->vm; + JNIEnv *java_env = NULL; + + jint jni_return = java_vm->GetEnv((void **)&java_env, JNI_VERSION_1_6); + if (jni_return == JNI_ERR) + throw std::runtime_error("Could not get JNI environement"); + + jni_return = java_vm->AttachCurrentThread(&java_env, NULL); + if (jni_return != JNI_OK) + throw std::runtime_error("Could not attach to thread"); + + jclass native_activity_clazz = java_env->GetObjectClass(android_app_ptr->activity->clazz); + if (native_activity_clazz == NULL) + throw std::runtime_error("Could not get MainActivity class"); + + jmethodID method_id = java_env->GetMethodID(native_activity_clazz, "openURL", "(Ljava/lang/String;)V"); + if (method_id == NULL) + throw std::runtime_error("Could not get methode ID"); + + jstring jurl = java_env->NewStringUTF(url.c_str()); + java_env->CallVoidMethod(android_app_ptr->activity->clazz, method_id, jurl); + + jni_return = java_vm->DetachCurrentThread(); + if (jni_return != JNI_OK) + throw std::runtime_error("Could not detach from thread"); #else system(std::string("xdg-open " + url).c_str()); #endif @@ -99,4 +128,4 @@ namespace widgets markdown_ = md; texture_buffer.clear(); } -} \ No newline at end of file +}