diff --git a/src/api-impl-jni/util.c b/src/api-impl-jni/util.c index f4b30293..8e5ce482 100644 --- a/src/api-impl-jni/util.c +++ b/src/api-impl-jni/util.c @@ -157,6 +157,9 @@ void set_up_handle_cache(JNIEnv *env) handle_cache.drawable.class = _REF((*env)->FindClass(env, "android/graphics/drawable/Drawable")); handle_cache.drawable.draw = _METHOD(handle_cache.drawable.class, "draw", "(Landroid/graphics/Canvas;)V"); handle_cache.drawable.setBounds = _METHOD(handle_cache.drawable.class, "setBounds", "(IIII)V"); + + handle_cache.intent.class = _REF((*env)->FindClass(env, "android/content/Intent")); + handle_cache.intent.putExtraCharSequence = _METHOD(handle_cache.intent.class, "putExtra", "(Ljava/lang/String;Ljava/lang/CharSequence;)Landroid/content/Intent;"); } void extract_from_apk(const char *path, const char *target) { diff --git a/src/api-impl-jni/util.h b/src/api-impl-jni/util.h index 5243d0f4..986cf9a1 100644 --- a/src/api-impl-jni/util.h +++ b/src/api-impl-jni/util.h @@ -106,6 +106,10 @@ struct handle_cache { jmethodID draw; jmethodID setBounds; } drawable; + struct { + jclass class; + jmethodID putExtraCharSequence; + } intent; }; extern struct handle_cache handle_cache; diff --git a/src/main-executable/main.c b/src/main-executable/main.c index f8f31812..94b1e8d5 100644 --- a/src/main-executable/main.c +++ b/src/main-executable/main.c @@ -191,6 +191,7 @@ struct jni_callback_data { gboolean install; char *prgname; char **extra_jvm_options; + char **extra_string_keys; }; static void open(GtkApplication *app, GFile** files, gint nfiles, const gchar* hint, struct jni_callback_data *d) @@ -425,8 +426,30 @@ static void open(GtkApplication *app, GFile** files, gint nfiles, const gchar* h if((*env)->ExceptionCheck(env)) (*env)->ExceptionDescribe(env); + if(d->extra_string_keys) { + GError *error = NULL; + GRegex *regex = g_regex_new("(?message); + exit(1); + } - /* -- set the window title and (FIXME) app icon -- */ + jobject intent = _GET_OBJ_FIELD(activity_object, "intent", "Landroid/content/Intent;"); + + for(char **arg = d->extra_string_keys; *arg; arg++) { + gchar **keyval = g_regex_split_full(regex, *arg, -1, 0, 0, 2, NULL); + if(!keyval || !keyval[0] || !keyval[1]) { + fprintf(stderr, "extra string arg not in 'key=value' format: '%s'\n", *arg); + exit(1); + } + (*env)->CallObjectMethod(env, intent, handle_cache.intent.putExtraCharSequence, _JSTRING(keyval[0]), _JSTRING(keyval[1])); + g_strfreev(keyval); + } + g_regex_unref(regex); + g_strfreev(d->extra_string_keys); + } + + /* -- set the window title and app icon -- */ package_name = _CSTRING((*env)->CallObjectMethod(env, activity_object, handle_cache.context.get_package_name)); if((*env)->ExceptionCheck(env)) @@ -590,6 +613,14 @@ void init_cmd_parameters(GApplication *app, struct jni_callback_data *d) .arg_data = &d->extra_jvm_options, .description = "install .desktop file for the given apk", }, + { + .long_name = "extra-string-key", + .short_name = 'e', + .flags = 0, + .arg = G_OPTION_ARG_STRING_ARRAY, + .arg_data = &d->extra_string_keys, + .description = "pass a string extra (-e key=value)", + }, {NULL} }; @@ -618,6 +649,7 @@ int main(int argc, char **argv) callback_data->install = FALSE; callback_data->prgname = argv[0]; callback_data->extra_jvm_options = NULL; + callback_data->extra_string_keys = NULL; app = gtk_application_new("com.example.demo_application", G_APPLICATION_NON_UNIQUE | G_APPLICATION_HANDLES_OPEN | G_APPLICATION_CAN_OVERRIDE_APP_ID);