diff --git a/android-project/app/src/main/java/io/github/gopher64/gopher64/N64Activity.kt b/android-project/app/src/main/java/io/github/gopher64/gopher64/N64Activity.kt index f0231eb..dff3c9f 100644 --- a/android-project/app/src/main/java/io/github/gopher64/gopher64/N64Activity.kt +++ b/android-project/app/src/main/java/io/github/gopher64/gopher64/N64Activity.kt @@ -20,55 +20,18 @@ class N64Activity : SDLActivity() { override fun getArguments(): Array { val intent = intent ?: return super.getArguments() - val request_code = intent.getIntExtra("request_code", 0) - if (request_code == CONFIGURE_INPUT_PROFILE) { - val profile = intent.getStringExtra("profile_name") ?: return super.getArguments() - val deadzone = intent.getIntExtra("deadzone", -1) - val args = mutableListOf( - "--configure-input-profile", - profile, - ) - if (intent.getBooleanExtra("dinput", false)) { - args.add("--use-dinput") - } - if (deadzone != -1) { - args.add("--deadzone") - args.add(deadzone.toString()) - } - setResult(RESULT_OK) // so that the profiles are updated in the GUI - return args.toTypedArray() - } else if (request_code == RUN_ROM) { - val file_path = intent.getStringExtra("file_path") ?: return super.getArguments() - val overclock = intent.getBooleanExtra("overclock", false) - val disable_expansion_pak = intent.getBooleanExtra("disable_expansion_pak", false) - val args = mutableListOf( - file_path, - "--fullscreen", - "--overclock", - overclock.toString(), - "--disable-expansion-pak", - disable_expansion_pak.toString()) - - val dataIntent = Intent() - - val netplay_peer_addr = intent.getStringExtra("netplay_peer_addr") - val cheats = intent.getStringExtra("cheats") - if (netplay_peer_addr != null && cheats != null) { - args.add("--netplay-peer-addr") - args.add(netplay_peer_addr) - args.add("--netplay-player-number") - args.add(intent.getIntExtra("netplay_player_number", 4).toString()) - args.add("--cheats") - args.add(cheats) - dataIntent.putExtra("cheats_path", cheats) - } + val args = intent.getStringArrayExtra("args") ?: return super.getArguments() + val dataIntent = Intent() + val file_path = intent.getStringExtra("file_path") + if (file_path != null) { dataIntent.putExtra("file_path", file_path) - - setResult(RESULT_OK, dataIntent) - return args.toTypedArray() - } else { - return super.getArguments() } + val cheats_path = intent.getStringExtra("cheats_path") + if (cheats_path != null) { + dataIntent.putExtra("cheats_path", cheats_path) + } + setResult(RESULT_OK, dataIntent) + return args } } diff --git a/src/ui/android.rs b/src/ui/android.rs index 943432a..5151889 100644 --- a/src/ui/android.rs +++ b/src/ui/android.rs @@ -2,7 +2,7 @@ use crate::Args; use crate::run; use crate::ui; use clap::Parser; -use jni::objects::{JClass, JObject, JString}; +use jni::objects::{JClass, JObject, JObjectArray, JString}; use jni::refs::Global; use jni::sys::jint; use jni::{Env, EnvUnowned, JavaVM, bind_java_type}; @@ -77,12 +77,8 @@ bind_java_type! { sig = (extra: JString, value: JString) -> AndroidIntent, name = "putExtra", }, - fn put_extra_boolean { - sig = (extra: JString, value: jboolean) -> AndroidIntent, - name = "putExtra", - }, - fn put_extra_int { - sig = (extra: JString, value: jint) -> AndroidIntent, + fn put_extra_string_array { + sig = (extra: JString, value: JString[]) -> AndroidIntent, name = "putExtra", }, fn get_string_extra(name: JString) -> JString, @@ -206,17 +202,24 @@ fn start_configure_input_profile_on_jvm( let package_name = JString::from_str(env, "io.github.gopher64.gopher64")?; let class_name = JString::from_str(env, "io.github.gopher64.gopher64.N64Activity")?; - let request_code_key = JString::from_str(env, "request_code")?; - let profile_name_key = JString::from_str(env, "profile_name")?; - let profile_name_value = JString::from_str(env, profile_name)?; - let dinput_key = JString::from_str(env, "dinput")?; - let deadzone_key = JString::from_str(env, "deadzone")?; + let args_key = JString::from_str(env, "args")?; + let mut args = vec![ + JString::from_str(env, "--configure-input-profile")?, + JString::from_str(env, &profile_name)?, + JString::from_str(env, "--deadzone")?, + JString::from_str(env, &deadzone.to_string())?, + ]; + if dinput { + args.push(JString::from_str(env, "--use-dinput")?); + } + let empty_arg = JString::from_str(env, "")?; + let j_args = JObjectArray::::new(env, args.len(), empty_arg)?; + for (i, arg) in args.iter().enumerate() { + j_args.set_element(env, i, arg)?; + } let intent = AndroidIntent::new(env)? .set_class_name(env, &package_name, &class_name)? - .put_extra_string(env, &profile_name_key, &profile_name_value)? - .put_extra_boolean(env, &dinput_key, dinput)? - .put_extra_int(env, &deadzone_key, deadzone)? - .put_extra_int(env, &request_code_key, CONFIGURE_INPUT_PROFILE)?; + .put_extra_string_array(env, &args_key, &j_args)?; activity .as_ref() @@ -259,42 +262,50 @@ fn start_run_rom_on_jvm( let class_name = JString::from_str(env, "io.github.gopher64.gopher64.N64Activity")?; let file_path_key = JString::from_str(env, "file_path")?; - let file_path_value = JString::from_str(env, file_path.to_str().unwrap())?; - let overclock_key = JString::from_str(env, "overclock")?; - let disable_expansion_pak_key = JString::from_str(env, "disable_expansion_pak")?; - let request_code_key = JString::from_str(env, "request_code")?; - let mut intent = AndroidIntent::new(env)? - .set_class_name(env, &package_name, &class_name)? - .put_extra_int(env, &request_code_key, RUN_ROM)? - .put_extra_string(env, &file_path_key, &file_path_value)? - .put_extra_boolean(env, &overclock_key, game_settings.overclock)? - .put_extra_boolean( - env, - &disable_expansion_pak_key, - game_settings.disable_expansion_pak, - )?; + let file_path = file_path.to_str().unwrap(); + let cheats_path_key = JString::from_str(env, "cheats_path")?; + let cheats_path = app + .internal_data_path() + .unwrap() + .join("cache") + .join("cheats.json"); + + let args_key = JString::from_str(env, "args")?; + let mut args = vec![ + JString::from_str(env, file_path)?, + JString::from_str(env, "--fullscreen")?, + JString::from_str(env, "--overclock")?, + JString::from_str(env, &game_settings.overclock.to_string())?, + JString::from_str(env, "--disable-expansion-pak")?, + JString::from_str(env, &game_settings.disable_expansion_pak.to_string())?, + ]; if let Some(netplay) = netplay { - let netplay_peer_addr_key = JString::from_str(env, "netplay_peer_addr")?; - let netplay_player_number_key = JString::from_str(env, "netplay_player_number")?; - let netplay_peer_addr_value = JString::from_str(env, &netplay.peer_addr.to_string())?; - let cheats_key = JString::from_str(env, "cheats")?; - let cheats_path = ui::get_dirs().cache_dir.join("cheats.json"); - let cheats_value = JString::from_str(env, cheats_path.to_str().unwrap())?; + args.push(JString::from_str(env, "--netplay-peer-addr")?); + args.push(JString::from_str(env, &netplay.peer_addr.to_string())?); + args.push(JString::from_str(env, "--netplay-player-number")?); + args.push(JString::from_str(env, &netplay.player_number.to_string())?); + args.push(JString::from_str(env, "--cheats")?); + args.push(JString::from_str(env, cheats_path.to_str().unwrap())?); - let f = std::fs::File::create(cheats_path).unwrap(); + let f = std::fs::File::create(&cheats_path).unwrap(); serde_json::to_writer_pretty(f, &game_settings.cheats).unwrap(); - - intent = intent - .put_extra_string(env, &netplay_peer_addr_key, &netplay_peer_addr_value)? - .put_extra_int( - env, - &netplay_player_number_key, - netplay.player_number as jint, - )? - .put_extra_string(env, &cheats_key, &cheats_value)?; } + let empty_arg = JString::from_str(env, "")?; + let j_args = JObjectArray::::new(env, args.len(), empty_arg)?; + for (i, arg) in args.iter().enumerate() { + j_args.set_element(env, i, arg)?; + } + + let file_path_string = JString::from_str(env, file_path)?; + let cheats_path_string = JString::from_str(env, cheats_path.to_str().unwrap())?; + let intent = AndroidIntent::new(env)? + .set_class_name(env, &package_name, &class_name)? + .put_extra_string(env, &file_path_key, &file_path_string)? + .put_extra_string(env, &cheats_path_key, &cheats_path_string)? + .put_extra_string_array(env, &args_key, &j_args)?; + weak.upgrade_in_event_loop(move |handle| handle.set_game_running(true)) .unwrap();