lento 0.1.1

Cross platform ui framework
use std::sync::OnceLock;
use jni::JNIEnv;
use jni::objects::{JClass, JString, JValue};
use jni::sys::{jboolean, jfloat, jint, jlong};
use winit::platform::android::activity::AndroidApp;
use crate::app::AppEvent;
use crate::event_loop::{create_event_loop_proxy};
use crate::send_app_event;

pub static ANDROID_APP: OnceLock<AndroidApp> = OnceLock::new();

pub fn init_android_app(app: &AndroidApp) {
    let app = app.clone();
    ANDROID_APP.get_or_init(move || app);
}

#[no_mangle]
pub extern "system" fn Java_fun_kason_lento_InputChannel_send<'local>(mut env: JNIEnv<'local>,
                                                                     class: JClass<'local>,
                                                                     window_id: jlong,
                                                                     input: JString<'local>)
{
    let input: String =
        env.get_string(&input).expect("Couldn't get java string!").into();
    println!("receive input:{}", input);
    if let Err(e) = send_app_event(AppEvent::CommitInput(window_id as i32, input)) {
        println!("send app event error: {:?}", e);
    }
}

#[no_mangle]
pub extern "system" fn Java_fun_kason_lento_InputChannel_sendKey0<'local>(mut env: JNIEnv<'local>,
                                                                      class: JClass<'local>,
                                                                      window_id: jlong,
                                                                      input: JString<'local>,
                                                                      pressed: jboolean)
{
    let input: String =
        env.get_string(&input).expect("Couldn't get java string!").into();
    println!("receive key input:{}", input);
    if let Err(e) = send_app_event(AppEvent::NamedKeyInput(window_id as i32, input, pressed != 0)) {
        println!("send app event error: {:?}", e);
    }
}

#[no_mangle]
pub extern "system" fn Java_fun_kason_lento_InputChannel_imeResize0<'local>(mut env: JNIEnv<'local>,
                                                                            class: JClass<'local>,
                                                                            window_id: jlong,
                                                                            height: jfloat)
{
    match send_app_event(AppEvent::ImeResize(window_id as i32, height as f32)) {
        Err(e) => {
            println!("send app event error: {:?}", e);
        }
        Ok(r) => {r.wait()}
    }
}

pub fn clipboard_write_text(content: &str) -> Result<(), jni::errors::Error> {
    use jni::JavaVM;
    use jni::objects::JObject;
    let app = ANDROID_APP.get().unwrap();
    let vm = unsafe { JavaVM::from_raw(app.vm_as_ptr() as _)? };
    let activity = unsafe { JObject::from_raw(app.activity_as_ptr() as _) };
    let mut env = vm.attach_current_thread()?;
    let content = env.new_string(content)?;
    env.call_method(&activity, "setClipboardText", "(Ljava/lang/String;)V", &[
        JValue::Object(&content)
    ])?.v()?;
    Ok(())
}