use jni::objects::{JObject, JString};
use jni::{JNIEnv, JavaVM};
use winit::platform::android::activity::AndroidApp;
pub(crate) fn launch_link(app: &AndroidApp) -> Option<String> {
let vm = unsafe { JavaVM::from_raw(app.vm_as_ptr() as *mut jni::sys::JavaVM) }.ok()?;
let mut env = vm.attach_current_thread_permanently().ok()?;
match read(&mut env, app) {
Ok(link) => link,
Err(err) => {
log::warn!("the launch intent could not be read ({err}); starting at the root");
if env.exception_check().unwrap_or(false) {
let _ = env.exception_clear();
}
None
}
}
}
fn read(env: &mut JNIEnv, app: &AndroidApp) -> Result<Option<String>, jni::errors::Error> {
let activity = unsafe { JObject::from_raw(app.activity_as_ptr() as jni::sys::jobject) };
let intent = env
.call_method(&activity, "getIntent", "()Landroid/content/Intent;", &[])?
.l()?;
if intent.is_null() {
return Ok(None);
}
let data = env
.call_method(&intent, "getDataString", "()Ljava/lang/String;", &[])?
.l()?;
if data.is_null() {
return Ok(None);
}
let data = JString::from(data);
let link: String = env.get_string(&data)?.into();
Ok(Some(link))
}